【实例】如何编写嵌入式Linux设备驱动程序?
关注、星标公众号,直达精彩内容
来源:技术让梦想更伟大
整理:李肖遥
struct file_operations {int (*seek) (struct inode * ,struct file *, off_t ,int);int (*read) (struct inode * ,struct file *, char ,int);int (*write) (struct inode * ,struct file *, off_t ,int);int (*readdir) (struct inode * ,struct file *, struct dirent * ,int);int (*select) (struct inode * ,struct file *, int ,select_table *);int (*ioctl) (struct inode * ,struct file *, unsined int ,unsigned long);int (*mmap) (struct inode * ,struct file *, struct vm_area_struct *);int (*open) (struct inode * ,struct file *);int (*release) (struct inode * ,struct file *);int (*fsync) (struct inode * ,struct file *);int (*fasync) (struct inode * ,struct file *,int);int (*check_media_change) (struct inode * ,struct file *);int (*revalidate) (dev_t dev);}
这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。
unsigned int test_major = 0;static int read_test(struct inode *inode,struct file *file,char *buf,int count){int left; 用户空间和内核空间if (verify_area(VERIFY_WRITE,buf,count) == -EFAULT )return -EFAULT;for(left = count ; left > 0 ; left--){__put_user(1,buf,1);buf++;}return count;}
static int write_test(struct inode *inode,struct file *file,const char *buf,int count){return count;}static int open_test(struct inode *inode,struct file *file ){MOD_INC_USE_COUNT; 模块计数加以,表示当前内核有个设备加载内核当中去return 0;}static void release_test(struct inode *inode,struct file *file ){MOD_DEC_USE_COUNT;}
struct file_operations test_fops = {?read_test,write_test,open_test,release_test,};
int init_module(void){int result;result = register_chrdev(0, "test", &test_fops); 对设备操作的整个接口if (result < 0) {printk(KERN_INFO "test: can't get major number\n");return result;}if (test_major == 0) test_major = result; /* dynamic */return 0;}
void cleanup_module(void){unregister_chrdev(test_major,"test");}
main(){int testdev;int i;char buf[10];testdev = open("/dev/test",O_RDWR);if ( testdev == -1 ){printf("Cann't open file \n");exit(0);}read(testdev,buf,10);for (i = 0; i < 10;i++)printf("%d\n",buf[i]);close(testdev);}
编译运行,看看是不是打印出全1 ?
扫描下方微信,加作者微信进技术交流群,请先自我介绍喔。
嵌入式编程专辑 Linux 学习专辑 C/C++编程专辑 Qt进阶学习专辑 关注微信公众号『技术让梦想更伟大』,后台回复“m”查看更多内容。 长按前往图中包含的公众号关注
评论
