很奇怪,飛凌的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);
}
}
波形圖