飞凌 imx6q-C 的 LED驱动

很奇怪,飞凌的imx6q-c的核心板和对应的底板上没有出现直接用GPIO控制的LED,不够对于我这种刚开始接触这类高级货的新手来说,还是老老实实的拿GPIO来练练手吧。 

一 实验目的
利用imx6q-c底板上的IO引脚,输出高低变换的电平。
二 参考文章
    1 IMX6Q学习笔记———编写LED驱动和测试程序以及相关管脚配置 http://blog.csdn.net/zsqforprogram/article/details/77140974?locationNum=8&fps=1
三  过程 
1  找到能够使用的GPIO口 

![这里写图片描述](https://img-blog.csdn.net/20180131093324525?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFuZ2Rvbmc4NzY1/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
此引脚对应核心板上的KEY_COL2  
2  在board-mx6q_sabresd.h中将第一步中的KEY_COL2引脚的属性改为GPIO属性  
MX6Q_PAD_KEY_COL2__GPIO_4_10 
3  编写GPIO的驱动  

led.c

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define DEVICE_NAME "leds"
#define my_led IMX_GPIO_NR(4,10)

static long leds_ioctl(struct file *flip, unsigned int cmd, unsigned long arg)
{
        switch(cmd)
        {
                case 0:
                case 1:
                        if(arg>5)
                        {
                                return 0;
                        }
                        gpio_set_value(my_led,!cmd);
                        break;
                default:
                        return 0;
        }
}

static struct file_operations led_dev_fops=
{
        .owner=THIS_MODULE,
        .unlocked_ioctl=leds_ioctl,
};

static struct miscdevice led_dev=
{
        .minor= MISC_DYNAMIC_MINOR,
        .name=DEVICE_NAME,
        .fops=&led_dev_fops
};

static int __init led_dev_init(void)
{
    int ret;
    gpio_free(my_led);
    ret=gpio_request(my_led,"LED");
    if(ret)
    {
            return ret;
    }

    gpio_direction_output(my_led,1);
    gpio_set_value(my_led,1);

    ret=misc_register(&led_dev);
    printk("\t led  initialized \n");
    return ret;
}

static void __exit led_dev_exit(void)
{
    gpio_free(my_led);
    misc_deregister(&led_dev);

}

module_init(led_dev_init);
module_exit(led_dev_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("dongdong");

4 怎么简单怎么来,将该驱动源文件放在 源码的 /drivers/misc 文件夹,同时在该文件夹下的Makefile文件末尾,添加 obj-y +=led.o
5 编译内核,下载内核
6 应用程序并验证
应用程序中,使用unlock_ioctl函数实现GPIO的高低电平转换,然后使用示波器查看电平的变换情况。

#include  
#include 
#include 
#include 
#include 
#include   
void  main(void)
{
        int fd;

        fd=open("/dev/leds",O_RDWR);
        if(fd<0)
        {
                printf("Can not open the requested device \n");

        }
        while(1)
        {
                ioctl(fd,0,0);
                sleep(1);
                ioctl(fd,1,0);
                sleep(1);
        }



}

波形图飞凌 imx6q-C 的 LED驱动_第1张图片

你可能感兴趣的:(linux)