1、编写测试APP ,led驱动加载成功以后可以手动创建/dev/led节点,应用程序通过/dev/led文件来完成对LED设备的控制
例如:向/dev/led文件中写0 表示关闭LED灯,写1表示打开LED灯。
#include "stdio.h" #include "unistd.h" #include "sys/types.h" #include "sys/stat.h" #include "fcntl.h" #include "stdlib.h" #include "string.h"
//LED测试用的APP
#define LEDOFF 0 #define LEDON 1 int main(int argc,char *argv[]) { int fd,retvalue; char *filename; unsigned char databuf[1]; if(argc != 3){ printf("Error Usage!\r\n"); return -1; } filename = argv[1];
//打开led驱动
fd = open(filename,O_RDWR); if(fd < 0){ printf("file %s open failed!\r\n"); return -1; } databuf[0] = atoi(argv[2]);
//要执行的操作
//向/dev/led文件写入数据
retvalue = write(fd,databuf,sizeof(databuf)); if(retvalue <0) { close(fd); return -1; } retvalue = close(fd); //关闭文件 return 0; }
应用代码和之前的系统编程代码实现功能是一样的。
简化新版的驱动代码的具体实现过程如下:
#include <linux/types.h> #include <linux/kernel.h> #include <linux/delay.h> #include <linux/init.h> #define NEWCHRLED_CNT 1 /* 设备号个数 */ #define NEWCHRLED_NAME "newchrled" /* 名字 */ #define LEDOFF 0 /* 关灯 */ #define LEDON 1 /* 开灯 */
/* 寄存器物理地址 */
#define CCM_CCGR1_BASE (0X020C406C) #define SW_MUX_GPIO1_IO03_BASE (0X020E0068) #define SW_PAD_GPIO1_IO03_BASE (0X020E02F4) #define GPIO1_DR_BASE (0X0209C000) #define GPIO1_GDIR_BASE (0X0209C004)
/* 映射后的寄存器虚拟地址指针 */
static void __iomem *CCM_CCGR1; static void __iomem *SW_MUX_GPIO1_IO03; static void __iomem *SW_PAD_GPIO1_IO03; static void __iomem *GPIO1_DR; static void __iomem *GPIO1_GDIR;
/* newchrled 设备结构体 */
struct newchrled_dev{ dev_t devid; /* 设备号 */ struct cdev cdev; /* cdev */ struct class *class; /* 类 */ struct device *device; /* 设备 */ int major; /* 主设备号 */ int minor; /* 次设备号 */ }; struct newchrled_dev newchrled; /* led 设备 */
总的来说,驱动中核心的结构,来编写对应的驱动程序,重点是使用对应的驱动框架实现。