ARM&Linux 下驱动开发第二节
驱动文件:qudong.c,make生成qudong.ko文件,烧录到ARM板上
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<linux/init.h> #include<linux/module.h> #include<linux/kernel.h> #include <linux/poll.h> /* COPY_TO_USER */ #include<linux/errno.h> #define DEV_NAME "rwtest" static int major=0; static int MAX_BUF_LEN=1024; static char drv_buf[1024]; static int WRI_LENGTH=0; /************************************写入*************************************************/ static ssize_t dx_write(struct file *file, const char __user *buffer, size_t count, loff_t * ppos) { if(count > MAX_BUF_LEN)count = MAX_BUF_LEN; copy_from_user(drv_buf , buffer, count); WRI_LENGTH = count; printk("write data to driver\n"); return count; } /**************************************读取***********************************************/ static ssize_t dx_read(struct file *filp, char __user *buffer, size_t count, loff_t *ppos) { int i=0,j=0; if(count > MAX_BUF_LEN) count=MAX_BUF_LEN; for(i=strlen(drv_buf);i>0;i--) { buffer[j]=drv_buf[i-1]; j++; } //copy_to_user(buffer,drv_buf,count); printk("read data from driver\n"); return count; } //===========================打开========================================= static int dx_open(struct inode *inode, struct file *filp) { printk("device open sucess!\n"); return 0; } /**********************************release***************************************************/ static int dx_release(struct inode *inode, struct file *filp) { printk("device release\n"); return 0; } //======================结构体,驱动各属性================================================== static struct file_operations file_opt = { owner: THIS_MODULE, write: dx_write, read: dx_read, open: dx_open, release:dx_release, }; //---------------------------------------------------------------------- static int __init qudong_init(void) { int ret; ret = register_chrdev(0, DEV_NAME, &file_opt); if(ret<0) { printk(DEV_NAME " can't get major number\n"); return 0; } major=ret; printk("dx module major number is %d\n", ret); return 0; } //----------------------------------------------------------------------- static void __exit qudong_exit(void) { unregister_chrdev(major,DEV_NAME); printk("exit\n"); } module_init(qudong_init); module_exit(qudong_exit); MODULE_LICENSE("GPL");
Makefile文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
## Makefile template. obj-m := qudong.o UNAME := $(shell uname -r) PWD := $(shell pwd) ADVMOD := qudong defualt: @make -C /lib/modules/$(UNAME)/build SUBDIRS=$(PWD) modules clean: @rm -f *.o @rm -f *.ko @rm -f *.mod.c @rm -f .*.cmd @rm -rf .tmp_versions #endif
或者ARM下的Makefile文件:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
ifneq ($(KERNELRELEASE),) obj-m := hello.o else KDIR := /usr/src/linux2.6.28 all: make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- clean: rm -f *.ko *.o *.mod.o *.mod.c *.symvers modul* endif
测试程序如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include<string.h> int main() { int fd=0; int ret=0; char bufw[100]={'\0'}; char bufr[100]={'\0'}; fd=open("/dev/rwtest",O_RDWR); if(fd<0) { perror("open error\n"); return 0; } printf("Please input string:\n"); scanf("%s",bufw); ret=write(fd,bufw,strlen(bufw)); if(ret<0) { perror("write error\n"); return 0; } printf("burw====%s\n",bufw); ret=read(fd,bufr,99); if(ret<0) { perror("read error\n"); return 0; } printf("bufr====%s\n",bufr); close(fd); return 0; }
夕阳的进步与发展,靠各位同仁的支持与鼓励!谢谢!!!!