本篇目的:移植LED驱动,并测试。
本篇参考:http://singleboy.blog.163.com/blog/static/54900194201152811472442/
(1)添加源码drivers/misc/mini2440_leds.c
root@ubuntu:~/linux-4.9.2# vim drivers/misc/mini2440_leds.c
加入如下源码,本源码已为linux4.9.2做了修改适配:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define DEVICE_NAME "leds" /*设备名(/dev/leds)*/
/*LED 对应的GPIO 端口列表*/
static unsigned long led_table [] = {
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
/*LED 对应端口将要输出的状态列表*/
static unsigned int led_cfg_table [] = {
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
S3C2410_GPIO_OUTPUT,
};
/*ioctl 函数的实现
* 在应用/用户层将通过ioctl 函数向内核传递参数,以控制LED 的输出状态
*/
static long leds_ioctl(
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return-EINVAL;
}
/*根据应用/用户层传递来的参数(取反),通过s3c2410_gpio_setpin函数设置LED 对应的端口寄存器*/
gpio_set_value(led_table[arg],!cmd);
return 0;
default:
return -EINVAL;
}
}
/*
* 设备函数操作集,在此只有ioctl 函数,通常还有read, write, open, close 等,因为本LED 驱动在下面已经
* 注册为misc 设备,因此也可以不用open/close
*/
static struct file_operations dev_fops = {
.owner = THIS_MODULE,
.unlocked_ioctl =leds_ioctl,
};
/*
* 把LED 驱动注册为MISC 设备
*/
static struct miscdevice misc = {
.minor =MISC_DYNAMIC_MINOR, /*动态设备号*/
.name = DEVICE_NAME,
.fops = &dev_fops,
};
/*
* 设备初始化
*/
static int __init dev_init(void)
{
int ret;
int i;
for (i = 0; i < 4;i++) {
/*设置LED 对应的端口寄存器为输出(OUTPUT)*/
s3c_gpio_cfgpin(led_table[i],led_cfg_table[i]);
/*设置LED 对应的端口寄存器为低电平输出,在模块加载结束后,四个LED 应该是全部都是发光状态*/
gpio_set_value(led_table[i],0);
}
ret = misc_register(&misc);/*注册设备*/
if(ret < 0)
{
printk(DEVICE_NAME"register falid!\n");
return ret;
}
printk (DEVICE_NAME"\tinitialized\n"); /*打印初始化信息*/
return 0;
}
static void __exit dev_exit(void)
{
misc_deregister(&misc);
}
/*模块初始化,仅当使用insmod/podprobe 命令加载时有用,如果设备不是通过模块方式加载,此处将不会被调用*/
module_init(dev_init);
/*卸载模块,当该设备通过模块方式加载后,可以通过rmmod 命令卸载,将调用此函数*/
module_exit(dev_exit);
MODULE_LICENSE("GPL"); /*版权信息*/
MODULE_AUTHOR("ubuntu."); /*开发者信息*/
(2)修改Kconfig
root@ubuntu:~/linux-4.9.2# vim drivers/misc/Kconfig
在95行附近添加红色内容
config MINI2440_ADC
bool "ADC driver forFriendlyARM Mini2440 development boards"
depends on MACH_MINI2440
default y if MACH_MINI2440
help
this is ADC driver forFriendlyARM Mini2440 development boards
Notes: thetouch-screen-driver required this option
config LEDS_MINI2440
tristate"LED Support for Mini2440 GPIO LEDs"
depends onMACH_MINI2440
default yif MACH_MINI2440
help
Thisoption enables support for LEDs connected to GPIO lines
on Mini2440boards.
config DUMMY_IRQ
(3)修改Makefile
root@ubuntu:~/linux-4.9.2# vim drivers/misc/Makefile
在36行添加红色内容
obj-$(CONFIG_C2PORT) += c2port/
obj-$(CONFIG_MINI2440_ADC) += mini2440_adc.o
obj-$(CONFIG_LEDS_MINI2440) += mini2440_leds.o
obj-$(CONFIG_HMC6352) += hmc6352.o
obj-y += eeprom/
完成后,使用如下指令
root@ubuntu:~/linux-4.9.2# make menuconfig
查看一下
Device Drivers --->
[*] Misc devices --->
LED的配置,并保存退出
(1)编译
root@ubuntu:~/linux-4.9.2# make -j8
root@ubuntu:~/linux-4.9.2# ./mkuImage.sh
(2)测试
重启开发板,等LCD显示QT界面之后,可以看到LED在进行流水灯闪烁。在QT界面的“友善之臂”选项卡,打开LEDs应用,可以使用应用内的选项操作LED的亮与灭等。