基于ARM_contexA9 led驱动编程


于友善之臂出的这款contexA9开发板,目前在网络上的资源较少,特别是内核的,非常之少,鉴于这种情况,我将会写一个系列的驱动来做关于tiny4412这款板子开发的总结。

     简单介绍一下:

Tiny4412是一款高性能的四核Cortex-A9核心板,由广州友善之臂设计、生产和发行销售。它采用三星Exynos4412作为主处理器,运行主频可高达1.5GHz,Exynos4412内部集成了Mali-400 MP高性能图形引擎,支持3D图形流畅运行,并可播放1080P大尺寸高清视频。三星旗舰智能手机Galaxy S3即是采用此CPU设计。

我用的是普通版.也就是只有一个串口的.但是核心板是一样的。

 

好了,介绍完毕,前面的文章我们已经说过了如何编写一个字符设备的驱动程序,这里就不再继续扯字符驱动怎么写,非常简单了,看看就懂了。

我们进入整题,今天,我们需要实现一个LED的驱动程序。在友善之臂的核心板上,有4颗LED灯,如何编写一个驱动程序,让它亮起来,首先我们来看看核心板:

 

 

LED灯就位于右上角,第一个和第二个都是电源指示灯,我们不需要管它,我们只管后面那4个LED灯。

如何编写?

1、首先找到板子的原理图,找到对应的引脚。

2、接着打开数据手册,找到对应的寄存器。

3、开始编写LED驱动程序

4、编写makefile

5、插入模块insmod xxx.ko

6、查询主设备号 cat /proc/devices

7、创建设备节点 mknod /dev/xxx c x x

8、执行应用程序app

对应的原理图:

 

 

从这里我们可以得出一个结论,LED灯是低电平点亮的,也就是往对应的端口里写0,LED灯就亮了。从最下面一幅图可以知道,我们要找的寄存器是GPIO的GPM4开头的这个寄存器,现在我们进入查数据手册的阶段.

查手册:

我们找到手册的第288页GPIO章节的GPMCON这里:

 

 

 

这是我们要配置端口的模式的IO口,端口有以上的一些状态,在这里我们只考虑输出,也就是只要配置Output那一项就可以了。

我们要配的寄存器有GPM4CON[0],GPM4CON[1],GPM4CON[2],GPM4CON[3],这四位,分别配置成output输出模式.

接下来再看一个GPM4DAT,这个是端口的状态寄存器,对状态寄存器就是写0或者写1,那么LED就被驱动了,我们来看看:

 

好了,寄存器我们已经找到了,接下来,可以进入写代码的阶段了:

首先编写LED驱动程序:

 

[cpp] view plain copy print?

1. 

#include <linux/init.h>  

2. 

3. 

#include <linux/module.h>  

4. 

5. 

#include <linux/kernel.h>  

6. 

7. 

#include <linux/fs.h>  

8. 

9. 

#include <linux/io.h>  

10. 

11. 

#include <asm/uaccess.h>  

12. 

13. 

#include <asm/irq.h>  

14. 

15. 

#include <asm/io.h>  

16. 

17. 

//这个是设备的名称,也就是对应在/dev/test-dev  

18. 

19. 

#define DEV_NAME    "test-dev"  

20. 

21. 

//LED灯IO口的地址,也就是刚刚我们在上面的芯片手册看到的Address  

22. 

23. 

#define GPM4COM     0x110002E0  

24. 

25. 

//定义配置模式的指针变量  

26. 

27. 

volatile unsigned long *led_config = NULL ;   

28. 

29. 

//定义配置状态的指针变量  

30. 

31. 

volatile unsigned long *led_dat = NULL ;   

32.