LED灯驱动之直接操作寄存器下

目录

一、完善led.c驱动文件

1、添加控制与模块化的开关灯 

 2、写入操作函数

二、编写应用程序

1、编写ledAPP.c

2、编译测试

 ①编译

②加载驱动 

③创建节点 

④关灯 

⑤开灯  

⑥测试错误 

⑦卸载驱动 


一、完善led.c驱动文件

1、添加控制与模块化的开关灯 

定义1、0控制开关,编写开关灯模块

LED灯驱动之直接操作寄存器下_第1张图片

#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 
#include 
#include 
#include 
#include 
#include 
#include 

/*
    argc:应用程序参数个数(argv数组元素个数)
    argv:具体参数,也可以写作char **argv
    ./ledAPP  <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/下LED灯驱动之直接操作寄存器下_第2张图片

②加载驱动 

加载驱动,并查看设备号200存在,在加载驱动的时候灯就默认亮了

LED灯驱动之直接操作寄存器下_第3张图片

③创建节点 

创建设备节点

④关灯 

运行APP关灯

 

⑤开灯  

运行APP开灯

 

⑥测试错误 

进行错误输入测试

输错开关命令

LED灯驱动之直接操作寄存器下_第4张图片

 命令行多输或少输

LED灯驱动之直接操作寄存器下_第5张图片

⑦卸载驱动 

卸载驱动

LED灯驱动之直接操作寄存器下_第6张图片

 到此,用驱动直接操作寄存器开关led灯完成了

你可能感兴趣的:(#,IMX6ULL驱动,linux,arm开发,arm,ubuntu,驱动开发)