Linux驱动学习-platform平台设备注册(2)-20220408

将驱动模块复制到开发板nfs挂载目录下,insmod beep_device.ko进行安装

报错表示:加载的树外模块污染了内核。从这段描述可以猜到,这是我们没有把此驱动模块加入到Kconfig树导致的,即make menuconfig的配置选项中没有此驱动。此时这个驱动模块仍能正确加载和使用。如果我们只是学习怎么写驱动,不用管他就行;如果我们是正式地写驱动,那么把驱动信息加入到Kconfig树中是必须的,这样我们可以通过配置内核来决定哪些加载驱动,系统也不会再报loading out-of-tree module taints kernel的错误了

然后使用rmmod beep_device.ko进行卸载

虽然正常卸载,但是系统提示该模块缺少release()函数

 

 添加release()函数即可消除警告

编写driver.c文件

1.结构体介绍:

 id_table 参数也是device和driver匹配字符串,优先级比driver结构体中的name优先级高

总结:

1.创建2个模块注册C文件(包含module_init,moudule_exit,GPL申明的C文件)

device.c 设备硬件部分(硬件改变,平台移植后需要修改的部分,具有硬件特性)

driver 设备驱动部分(无关硬件平台,设备的操作逻辑部分)

2.在device.c中需要实现2个结构体和三个函数(平台设备注册+平台设备注销)

(1)platform_device  平台设备结构体:主要是对硬件的资源描述,硬件的名称,硬件的资源数量,设备资源结构体集合数组,硬件的编号等;

(2)resource 上个结构体platform_device 的成员:包含资源的起始,资源的结束,资源的名字,资源的类型,struct device dev;#设备通用属性结构体(包含平台设备模块注销会调用到的release函数)等;

(3)release();函数,platform_device 平台设备结构体成员struct device dev成员的成员;

(4)platform_device_register();平台设备注册函数,一般在设备init函数中实现,有返回值,注册成功返回0,失败返回负数;可以通过返回值查看当前设备有没有注册成功;注册成功会在/sys/devices/platform/目录下生成文件

(5)platform_device_unregister();平台设备注销函数,没有返回值;

3.在driver.c中需要实现1个结构体,4个函数

(1)platform_driver 平台驱动结构体:probe成员函数,remove成员函数,struct device_driver结构体成员一般需要配置.name和owner成员

(2)probe函数:在platform将device和driver文件匹配成功时,会自动执行的函数,他们的匹配是通过platform_device结构体和platform_driver结构体中的name字符串匹配的;一般驱动的功能都在此实现;const struct platform_device_id *id_table;该成员作用与platform_driver结构体中的name成员结构体作用一致,但是该成员的优先级更高,用于匹配

(3)remove函数:driver模块注销时会自动执行,driver的卸载函数

(4)platform_driver_register();驱动注册函数,在驱动init函数中实现

(5)platform_driver_unregister();驱动注销函数,在驱动exit函数中实现


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值