文章目录
1 驱动程序编写
本实验例程路径:i.MX6UL终结者光盘资料/06_Linux驱动例程/09_gpioled_timer
创建gpioled_timer.c文件,具体内容如下:
1 #include <linux/types.h>
2 #include <linux/kernel.h>
3 #include <linux/delay.h>
4 #include <linux/ide.h>
5 #include <linux/init.h>
6 #include <linux/module.h>
7 #include <linux/errno.h>
8 #include <linux/gpio.h>
9 #include <linux/cdev.h>
10 #include <linux/device.h>
11 #include <linux/of.h>
12 #include <linux/of_address.h>
13 #include <linux/of_gpio.h>
14 #include <linux/semaphore.h>
15 #include <linux/timer.h>
16 #include <asm/mach/map.h>
17 #include <asm/uaccess.h>
18 #include <asm/io.h>
19
20 #define TIMER_CNT 1 /* 设备号个数 */
21 #define TIMER_NAME "timer" /* 名字 */
22 #define CLOSE_CMD (_IO(0XEF, 0x1)) /* 关闭定时器 */
23 #define OPEN_CMD (_IO(0XEF, 0x2)) /* 打开定时器 */
24 #define SETPERIOD_CMD (_IO(0XEF, 0x3)) /* 设置定时器周期命令 */
25
26 #define LEDON 1 /* 开灯 */
27 #define LEDOFF 0 /* 关灯 */
28
29 /* timer 设备结构体 */
30 struct timer_dev{
31 dev_t devid; /* 设备号 */
32 struct cdev cdev; /* cdev */
33 struct class *class; /* 类 */
34 struct device *device; /* 设备 */
35 int major; /* 主设备号 */
36 int minor; /* 次设备号 */
37 struct device_node *nd; /* 设备节点 */
38 int led_gpio; /* key 所使用的 GPIO 编号 */
39 int timeperiod; /* 定时周期,单位为 ms */
40 struct timer_list timer; /* 定义一个定时器 */
41 spinlock_t lock; /* 定义自旋锁 */
42 };
43
44 struct timer_dev timerdev; /* timer 设备 */
45
46 /*
47 * @description : 初始化 LED 灯 IO,open 函数打开驱动的时候
48 * 初始化 LED 灯所使用的 GPIO 引脚。
49 * @param : 无
50 * @return : 无
51 */
52 static int led_init(void)
53 {
54 int ret = 0;
55
56 timerdev.nd = of_find_node_by_path("/gpioled");
57 if (timerdev.nd== NULL) {
58 return -EINVAL;
59 }
60
61 timerdev.led_gpio = of_get_named_gpio(timerdev.nd ,"led-gpio", 0);
62 if (timerdev.led_gpio