linux驱动模块组成及其它


针对S3C2440的GPG进行驱动程序设计
驱动程序框架
file_operations结构体设计
file_operations结构体中的接口函数实现
驱动程序初始化函数
驱动程序退出函数


file_operations结构体设计
GPIO驱动程序需要实现以下几个接口函数
open:用于支持应用程序的open操作
release:用于支持应用程序的close操作
read:用于通过GPIO输入数据
write:用于通过GPIO输出数据
ioctl:用于控制GPIO的输入输出等属性


最简单的模块程序一般包括两个函数跟四个宏:

static int  __init   myModule_init (void)
/*模块加载函数*/
static void  __exit  myModule_exit (void)
/*模块卸载函数*/
module_init(myModule_init);
/*注册模块加载函数*/
module_exit(myModule_exit);
/*注册模块卸载函数*/
MODULE_AUTHOR(“xiuhai”); /*声明模块作者*/
MODULE_LICENSE("GPL"); 

/*模块许可证明,描述内核模块的许可权限*/


加载:
insmod XXX.ko  加载指定模块
lsmod   列举当前系统中的所有模块
rmmod  XXX     卸载指定模块
dmesg          当打印等级低于默认输出等级      时,采用此命令查看系统日志


模块加载函数:
执行insmod命令时被执行,用于初始化模块所必需资源,比如内存空间、硬件设备等
返回整形值,若初始化成功,返回0,失败返回负数
模块加载函数必须以“module_init(函数名)”的形式被指定


卸载模块函数:
若加载函数申请了内存空间,则卸载函数应当释放相应的内存空间
若加载函数申请了某些硬件资源(中断、DMA、I/0端口等),则卸载函数应当释放相应的硬件资源
模块卸载函数在模块卸载的时候执行,不返回任何值,需用”module_exit(函数名)”的形式被指定


模块间符号的相互引用:
在模块编程或内核编程中经常会遇到需要调用其它模块中符号的情况,在内核中专门有一张表来管理这些符号,可以通过 cat/proc/kallsyms查看该内核符号表
我们也可以自己编写一个模块,并导出其符号供其它模块使用

模块参数:
在模块编程中会遇到在插入模块的同时传递参数的情况
采用宏MODULE_PARAM(num_test, int,S_IRUGO)可以给模块传递合适的参数,num_test为参数名,int为参数类型, S_IRUGO为访问权限
参数类型包括:
byte,short,ushort,int,uint,long,ulong,charp,bool
权限:定义在linux/stat.h中,控制存取权限,S_IRUGO表示所有用户只读
在装载内核模块时,采用以下格式向模块传递参数
insmod hello_param.ko num_test=value 
若用户未指定参数,var将使用模块内定义的缺省值



用户态与内核态数据的交互
用户应用程序与驱动程序分属于不同的进程空间,因此二者之间的数据应当采用以下函数进行交换

copy_to_user(user_buffer, kernel_buffer, n)
//从内核空间拷贝n字节数据到用户空间
copy_from_user(kernel_buffer, user_buffer, n)
//从用户空间拷贝n字节数据到内核空间
put_user(kernel_value, user_buffer)
//从内核空间拷贝一数据变量到用户空间
get_user(kernel_value, user_buffer)
//从用户空间拷贝一数据变量到内核空间
(内核空间数据可是任意类型)


Linux2.4内核支持devfs文件系统方式自动创建设备节点
Linux2.6内核支持udev,可以在使用insmod 插入模块时自动创建设备节点,同时在使用rmmod 卸载模块时删除设备节点
首先定义和创建设备类:
struct class *my_class;
my_class = class_create(THIS_MODULE,"udev_test");
根据类创建设备节点:
device_create(my_class,NULL, MKDEV(MAJOR_NR, MINOR_NR), NULL,DRIVER_NAME);


在卸载模块函数中,将创建的设备节点删除即可:
if(MAJOR_NR > 0)
{
unregister_chrdev(MAJOR_NR, DRIVER_NAME);
device_destroy(my_class,MKDEV(MAJOR_NR, MINOR_NR));
class_destroy(my_class);
PRINTK("myModule_exit ok\n");
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值