飛凌 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 <linux/kernel.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/delay.h>
#include <mach/gpio.h>

#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 <sys/types.h> 
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <sys/time.h>  
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);
        }



}

波形圖這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章