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

本篇目的:移植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 
#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的配置,并保存退出

 

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的亮与灭等。

你可能感兴趣的:(Linux-4.9.2内核在mini2440上的移植(十二)——LED驱动移植)