08.02.19 驱动程序任务就是 1.建立struct file_operations 结构, 2. 完成 struct file_operations 结构中device_seek,device_read等文件操作函数的实现。 3 .register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。 unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。 4.实现挂载卸载驱动程序的两个入口。 int init_module() { ........ } void cleanup_module() { ........ } 模块方式驱动程序制作步骤: 1 . 建立.c文件,例如 dramOp.c 。注意和应用程序结构有所不同。 其中没有头文件。主要有以下几个并行的部分; (1)声明几个文件操作函数 static int device_open(struct inode *,struct file *); static int device_release(struct inode *,struct file *); static ssize_t device_read(struct file *,char *,size_t,loff_t *); static ssize_t device_write(struct file *,const char *,size_t,loff_t *); static loff_t device_seek(struct file *,loff_t,int); (2)建立结构体。作用:《1》生成文件操作函数与应用程序相关函数对应关系。《2》用于驱动程序注册. struct file_operations dram_mem_ops = { llseek: device_seek, read: device_read, write: device_write, open: device_open, release: device_release }; (3) register_chrdev(DRAM_MEM_MAJOR,DEVICE_NAME,&dram_mem_ops);将驱动程序注册到内核。 unregister_chrdev(Major,DEVICE_NAME);驱动程序从内核删除。 (4) 几个函数的具体实现(定义). static int device_open(struct inode * inode,struct file *file) { ... } static int device_release(struct inode * inode,struct file *file) { ... } static ssize_t device_read(struct file *file, char * buffer,size_t length,loff_t * offset) { ... } static ssize_t device_write(struct file *file, const char * buffer,size_t length,loff_t * offset) { ... } static loff_t device_seek(struct file *filp,loff_t off,int whence) { ... } (5)两个函数名绝对不变的函数,与相应shell命令相对应,实现驱动的挂载和卸载。 int init_module()// 申请内存空间,且调用register_chrdev(含参数);实现真正挂载 { } void cleanup_module()//释放相应内存空间,且调用unregister_chrde(含参);实现真正卸载 { } 2.完成上述dramOp.c,将其用驱动编译器编译成中间文件dramOp.o .注意他还不是可执行文件,之用真正与内核结合时(关联),才生成可执行文件dramOp。 3.在 arm板子的 shell 中mnt 本机 并在 dramOp.c 所在目录键入如下命令: #insmod ./dramOp.o //此命令调用init_module()函数,实现驱动注册,将其挂载到内核。 此时只要用以下命令 #mknod /dev/设备名 设备类型 主设备号 次设备号 生成与驱动程序中定义完全一致的文件,用以操作。要确保设备名 设备类型 主设备号与驱动程序中规定的完全一致。 例如 #mknod /dev/name c 30 20 //此命令只要在应用程序操作相应文件之前任何时间执行即可。 4. 就可以用应用程序对设备进行操作拉 5.不用的时候用如下命令将驱动模块卸载 #rmmod dramOp //此时可是可执行文件拉,因为在执行命令#insmod ./dramOp.o 时就将中间文件生成可执行文件拉。 完工: |