编写驱动程序
- 确定主设备号
- 定义自己的file_operations结构体
- 实现open/write/read等函数,填入file_operations结构体
- 把file_operations结构体告诉内核:注册驱动程序register_chrdev(主设备号, 次设备号,&file_operations)
- 注册驱动程序时,需要调用一个入口函数
- 卸载驱动程序,需要调用出口函数
- 其他完善:提供设备信息,自动创建设备节点
编写字符设备驱动程序时可以参考/drivers/char/misc.c
LED硬件知识
看原理图确定控制LED的引脚
[图片]
- 完成以上四步需要读写寄存器,注意不要影响到其他位:
- 在操作GPIO时,应该按照读状态——修改状态——写入状态的步骤(防止影响其他位),但是这样比较低效
- 有些处理器有设置寄存器(set_reg)和清除寄存器(clr_reg),可以直接操作这两个寄存器的位进行GPIO状态的修改(set-and-clear protocol)
看主芯片手册确定如何设置/控制引脚
[图片]
[图片]
CCM
- 设置CCM_CCGRx寄存器中某位使能对应的GPIO模块,默认是使能的
- 以CCGR0为例,CG15的取值如下:
[图片]- 00:在所有的模式下GPIO2都是禁止的
- 01:当CPU处于运行模式时GPIO2是使能的,如果CPU是等待或者停止状态,GPIO2是禁止的
- 10:保留值
- 11(默认值):除了停止状态,其他状态GPIO2都是使能的
IOMUXC
- 使用IOMUXC_SW_MUX_CTL_PAD_
或者IOMUXC_SW_MUX_CTL_GRP_ 来设置一个或一组引脚的功能
- 以IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO00为例,设置其中的MUX_MODE(选择ALT5工作于GPIO模式):
[图片]
- 使用IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>或者IOMUXC_SW_PAD_CTL_GRP_
来设置一个或一组引脚的参数
GPIO
基地址Base address 可以查看芯片手册的Chapter2 - GPIOx_GDIR寄存器:方向寄存器,每一位代表一个引脚
- 0:输入
- 1:输出
- GPIOx_PSR:读引脚的值(GPIOx_GDIR设置为0时)
如果GPIOx_GDIR设置为输入0,对GPIOx_DR读访问会返回GPIOx_PSR的值,所以读GPIOx_DR或者GPIOx_PSR都是可以的 - GPIOx_DR:写引脚的值(GPIOx_GDIR设置为1时)
如果GPIOx_GDIR设置为输出1,读GPIOx_DR的值只是上次设置的值,如果想要读取引脚的真实电平,可以设置该引脚为loopback模式(通过设置IOMUXC_SW_PAD_CTL_PAD_<PAD_NAME>),这样就可以从GPIOx_PSR寄存器读取到真实的电平值了(这个可以用于调试)