您的位置:首页 > 运维架构 > Linux

Linux-4.9.2内核在mini2440上的移植(十二)——LED驱动移植

2017-10-04 22:47 573 查看
本篇目的:移植LED驱动,并测试。

本篇参考:http://singleboy.blog.163.com/blog/static/54900194201152811472442/

12.1 LED源码添加

(1)添加源码drivers/misc/mini2440_leds.c

root@ubuntu:~/linux-4.9.2# vim drivers/misc/mini2440_leds.c

加入如下源码,本源码已为linux4.9.2做了修改适配:

#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <mach/regs-gpio.h>
#include <mach/hardware.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/fs.h>
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/ioctl.h>
#include <linux/cdev.h>
#include <linux/string.h>
#include <linux/list.h>
#include <linux/pci.h>
#include <linux/gpio.h>
#include <asm/uaccess.h>
#include <asm/atomic.h>
#include <asm/unistd.h>
#include <mach/gpio-samsung.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-cfg.h>
#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的配置,并保存退出

12.2 编译、测试

(1)编译

root@ubuntu:~/linux-4.9.2# make -j8

root@ubuntu:~/linux-4.9.2# ./mkuImage.sh

(2)测试

重启开发板,等LCD显示QT界面之后,可以看到LED在进行流水灯闪烁。在QT界面的“友善之臂”选项卡,打开LEDs应用,可以使用应用内的选项操作LED的亮与灭等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐