i.MX6ULL终结者Linux内核定时器实验实验程序编写

本文介绍了如何在i.MX6ULL平台上编写Linux内核定时器驱动程序,包括驱动的初始化、open和ioctl函数的实现,以及如何响应CLOSE_CMD、OPEN_CMD和SETPERIOD_CMD命令。同时,详细阐述了应用测试程序的编写,让用户通过输入命令控制定时器的开关和周期设置,实现LED灯闪烁效果。
摘要由CSDN通过智能技术生成

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 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值