LED灯驱动之直接操作寄存器下
目录
1、添加控制与模块化的开关灯
2、写入操作函数
二、编写应用程序
1、编写ledAPP.c
2、编译测试
①编译
②加载驱动
③创建节点
④关灯
⑤开灯
⑥测试错误
⑦卸载驱动
一、完善led.c驱动文件
1、添加控制与模块化的开关灯
定义1、0控制开关,编写开关灯模块
#define LEDOFF 0 /*关闭*/
#define LEDON 1 /*打开*/
/*LED灯打开、关闭*/
void led_switch(u8 sta)
{
u32 val = 0;
if(sta == LEDON)
{
val = readl(GPIO1_DR);
val &= ~(1 << 3);/*bit3清零,打开LED灯*/
writel(val ,GPIO1_DR);
}else if(sta == LEDOFF){
val = readl(GPIO1_DR);
val |= (1 << 3);/*bit3置1,关闭LED灯*/
writel(val ,GPIO1_DR);
}
}
2、写入操作函数
写入操作函数如下
/*写入操作*/
static ssize_t led_write(struct file *file, const char __user *buf,
size_t count, loff_t *pos)
{
unsigned int retvalue;
unsigned char databuf[1];
retvalue = copy_from_user(databuf , buf , count);
if(retvalue < 0)
{
printk("kernel write failed!\r\n");
return -EFAULT;
}
/*判断开灯还是关灯*/
led_switch(databuf[0]);
return 0;
}
二、编写应用程序
1、编写ledAPP.c
ledAPP.c代码如下
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
/*
argc:应用程序参数个数(argv数组元素个数)
argv:具体参数,也可以写作char **argv
./ledAPP <filename> <0:1> 0表示关灯,1表示开灯
./leAPP /dev/led 0 关灯
./ledAPP /dev/led 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];
/*打开文件*/
fd = open(filename , O_RDWR);
if(fd < 0){
printf("file open failed\r\n",filename);
return -1;
}
/*获取控制开关的数字*/
databuf[0] = atoi(argv[2]);/*将字符转换为数字*/
/*如果输入的控制命令不是1或者0直接退出*/
if(((int)databuf[0]) < 0 || ((int)databuf[0]) >1)
{
printf("control parameter error\r\n");
return -1;
}
retvalue = write(fd,databuf,sizeof(databuf));
if(retvalue < 0){
printf("LED control failed\r\n");
close(fd);
return -1;
}
close(fd);/*关闭文件*/
return 0;
}
2、编译测试
①编译
分别编译led.c和ledAPP.c,都复制到开发板根目录/lib/modules/4.1.15/下
②加载驱动
加载驱动,并查看设备号200存在,在加载驱动的时候灯就默认亮了
③创建节点
创建设备节点
④关灯
运行APP关灯
⑤开灯
运行APP开灯
⑥测试错误
进行错误输入测试
输错开关命令
命令行多输或少输
⑦卸载驱动
卸载驱动
到此,用驱动直接操作寄存器开关led灯完成了
小白不想画工图: 20之前的有点难受啊
芯的一天: 是的,剪切板可以复制粘贴了,但是无法拖拽文件
嵌入式小白哈哈: 不用,你有试过用数据库存储吗?不知道为啥我的数据库和服务器连接不上去
Vaooooo1: 麻烦问下,安装open-vm-tools后,退出vmeare17.5全屏模式,会改变ubuntu22的分辨率,你的也是这样吗
The_TOP_: 不用到数据库吗?