关于驱动程序框架,请参考:
嵌入式Linux驱动开发(一)——字符设备驱动框架入门
同时,在这篇文章里面留下了两个问题,现在先来解决其中的第一个问题,就是如何用驱动程序来操作需要操作的硬件。
关于开发板点亮LED的问题,在这里简单介绍一下,也可以参考之前我写的文章:
嵌入式Linux开发——裸板程序点亮开发板上的LED灯
首先为了操作硬件,看接线原理图是必不可少的一步,这几个LED的原理图相对来说比较简单,在这里说一下,如果需要看懂稍微复杂一点的原理图,可以参见:
Linux嵌入式开发入门(二)——看懂原理图
以下是LED的接线原理图:
看到上面的是开发板上面的三盏LED,在图上的左边,他们统一接到了3.3V的一个高电平上,那么如果在LED右侧为地(低电平),那么从左到右就可以形成电压差,因此,也就可以形成电流来点亮LED。
那么在LED右侧,引出三条线,这三条线根据接线原理图可以看出来接入到了下图的芯片中。
我们根据上面的两幅接线的原理图可以看出来,三盏LED都接在了这个芯片上,那么接下来就是需要我们来阅读一下这个芯片的手册了,看看如何来操作这些引脚。而我们需要的该引脚的状态应该是: 输出低电平点亮LED,输出高电平熄灭LED。
查看芯片手册:1. 对应引脚配置为输出引脚 2. 对应引脚输出低电平
根据芯片手册,找到对应引脚的部分,发现操作该引脚实际需要操作三个寄存器:GPFCON
、GPFDAT
和GPFUP
。
其中配置输出引脚需要配置的是GPFCON寄存器,让寄存器中的数据的对应位保存01,即可设置为输出引脚;而操作GPFDAT寄存器中的对应位的数据为1/0,既可让该引脚输出高/低电平。
所以我们控制对应的LED,实际上就是来控制2440芯片中的GPFCON和GPFDAT两个寄存器中的值。
根据手册可以看到,这个两个寄存器的地址分别是0x5600 0050
和0x5600 0054
。我们是不是像单片机程序一样,直接来操作这个两个地址呢?
实际不是的,在驱动程序的开发过程中,并不直接操纵这两个地址,而是操作这两个地址的映射。具体操作稍后详见代码。
PS: 写一个关于点亮LED的驱动,需要遵循一下结果步骤:
- 搭建驱动的框架
- 完善硬件操作的部分
- 看懂原理图,确定引脚
- 看芯片手册来确定如何操作引脚
- 写代码(和单片机程序的区别为,驱动程序操作的是ioremap映射的虚拟地址,而非物理地址)
我们现在已经知道了驱动框架如何编写,同时根据硬件的原理图和芯片手册知道了该如何操作我们希望操作的硬件。那么接下来就是编写代码了。
我们驱动等下来完成,先确定我们希望如何来操作硬件&#