字符设备驱动开发
应用程序和驱动扮演的是什么角色
- 用户态:应用程序
玩策略: 怎么去做
1.一闪一闪
2.10s闪一次,也可以1s闪一次
3.一直亮
4.跑马灯
控制权是在应用程序(程序员)
- 内核态:驱动
玩机制: 能做什么
led: 和灭
1.驱动层运行在内核复制操作硬件实现硬件提供的功能,2.用户层调用驱动层的接口实现具体产品上的功能。3.如果一个驱动存在与内核但没有用户层去调用它,写的再好的驱动也没发挥它的作用。
内核驱动编写步骤和规范
- 驱动和应用的makefile
1 | ROOTES_DIR =/opt/4412/rootfs |
- 驱动编写步骤
1.实现模块加载和卸载入口函数
1 | modeule_init(chr_dev_init) |
MKDEV(主设备号, 次设备号): 主设备好h_bit12,次设备号l_bit20,MKDEV()返回一个32bit的总设备号。
- 面向对象编程思想
1.设计一个对象,描述一个设备的信息
1 | struct led_desc |
2.声明一个全局的设备对象句柄
1 | struct led_desc *led_dev; // 声明指针不实例化对象 |
3.实例化全局的设备对象
1 | // GFP_KERNEL表示如果当前内存不够用,该进程会被阻塞 |
4.初始化设备对象
1 | led_dev->meb = ... |
- 做出错处理1
1 | .... |
- 做出错处理2
1 | led_dev->c1s = class_create (THIS_MODULE, "led_cls"); |
IS_ERR()是内核定义的一个宏,专门用来判断指针是否合法,PTR_ERR()是内核定义的宏,用来将指针出错的原因转换成一个出错码。
当程序出错时,不能立马结束函数退出,要跳转到统一的错误退出口执行在本函数申请的资源释放等处理。
- 操作寄存器地址的方式
- 本文作者: 龙兄嵌入式
- 本文链接: https://hexo.880755.xyz/1970/01/01/zblog/download/70.字符设备驱动开发/