资源描述:
《编写gpio驱动程序说明书》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实用标准文案Linux下GPIO驱动程序Linux提供了一种全新的“模块”机制,可根据需要在不必对内核进行重新编译的情况下;将可加载模块动态地插入运行中的内核,成为内核的一个有机组成部分;也可以动态地卸载已加载的模块。Linux下设备驱动程序的编写要点是为相应的设备编写完成相应功能的基本函数,然向虚拟文件系统(VFS)注册。当应用程序需要对设备进行操作时,可以访问该设备对应的文件节点,利用VFS调用该设备的相关处理函数即可。驱动程序是指一组子程序,它屏蔽了底层硬件处理细节,同时向上层软件提供与硬件无关的接口,在Linux内核中占据极
2、其重要的地位,是用来完成对物理设备控制操作的功能模块,设备驱动程序控制操作系统和硬件设备访问的交互操作。图为设备驱动模块动态挂载、卸载和系统调用的全过程:内核和模块的关系一、入口函数初始化设备驱动在加载时首先需要调用入口函数__initgpio_init(void),该函数完成设备驱动的初始化工作,比如寄存器置位、结构体赋值等一系列工作,其中最重要的一个工作就是向内核注册该设备,字符设备调用函数register_chrdev()完成注册。注册成功后,该设备获得了系统分配或向系统申请的主设备号、自定义的次设备号,并建立起与设备文件的关
3、联。int__initgpio_init(void){intresult;result=register_chrdev(MAJOR_NR,DEVICE_NAME,&gpio_fops);//注册if(result<0){printk(KERN_ERRDEVICE_NAME":Unabletogetmajor%d",MAJOR_NR);//返回值小于0,注册不成功return(result);}if(MAJOR_NR==0){MAJOR_NR=result;/*dynamic*/}printk(KERN_INFODEVICE_NA
4、ME":initOK");//初始化成功精彩文档实用标准文案return(0);}二、注销模块注销模块是和注册模块对应的操作,当卸载模块时,系统将注销模块对应的设备,并释放主设备号,这一操作可以在模块的清除函数中调用unregister_chrdev()函数来完成。unregister_chrdev()函数用于注销设备、释放主设备号和设备文件名。参数包括要释放的主设备号和对应的设备名。void__exitgpio_cleanup(void){unregister_chrdev(MAJOR_NR,DEVICE_NAME);}三、结
5、构体每个设备驱动程序都对应一个file_operations数据结构,file_operations是定义在中的函数指针数组。对于字符设备而言,file_operations{}就是唯一的函数接口。一个数据结构包括两个元素:一个登记的设备驱动程序的名称的指针和一个指向一组文件操作的指针。用户是通过设备文件同硬件打交道,以系统调用的方式对设备文件进行操作,并通过完成file_operations中的函数指针来把系统调用和驱动程序关联起来。staticstructfile_operationsgpio_fops=
6、/*driverinfo*/{owner:THIS_MODULE,ioctl:gpio_ioctl,open:gpio_open,release:gpio_release,};四、全局变量staticintmajor=GPIO_MAJOR_NR;//主设备号五、打开设备输入有两个,一个是inode,表示设备信息,一个是filp,表示指向的文件。输出返回值为0时,设备正常打开,否则打开失败。staticintgpio_open(structinode*inode,structfile*filp){outl(((inl(REG_MFSE
7、L))&0xfffffbff),REG_MFSEL);//使能outl(((inl(GPIOG_DIR))
8、(1u<<6)),GPIOG_DIR);outl(((inl(GPIOG_DATAOUT))
9、(1u<<6)),GPIOG_DATAOUT);return0;/*success*/}六、GPIO释放staticintgpio_release(structinode*inode,structfile*filp)精彩文档实用标准文案{return(0);}七、IO控制函数IO控制函数有4个参数,inode是设备信息,filp是指向
10、的文件指针,cmd是命令,arg是额外参数,返回值为0时控制有效。staticintgpio_ioctl(structinode*inode,structfile*filp,unsignedintcmd,unsignedlongarg