天天看点

mini2440在linux-2.6.34.2中添加LED驱动,并编写应用程序验证

mini2440的bootloader是官方提供的suppervivi,内核已经移植为linux-2.6.34.2这一版本,这篇文章介绍在linux-2.6.34.2中添加LED驱动。

LED驱动移植步骤:

(1)    创建LED驱动源文件。

进入linux-2.6.34.2内核根目录,再进入driver/char/目录中,新建LED驱动源文件gedit mini2440-leds.c,mini2440-leds.c的内容如下:

#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>

#define DEVICE_NAME "mnonm_leds"//设备名(在/dev/目录的下的设备文件节点,成功后可以看到/dev/ mnonm _leds)

static unsigned long led_table [] = {

   S3C2410_GPB(5),

   S3C2410_GPB(6),

   S3C2410_GPB(7),

   S3C2410_GPB(8),

};

static unsigned int led_cfg_table [] = {

   S3C2410_GPIO_OUTPUT,

   S3C2410_GPIO_OUTPUT,

   S3C2410_GPIO_OUTPUT,

   S3C2410_GPIO_OUTPUT,

};

static int sbc2440_leds_ioctl(

   struct inode *inode,

   struct file *file,

   unsigned int cmd,

   unsigned long arg)

{

   switch(cmd) {

   case 0:

   case 1:

            if (arg > 4) {

                     return-EINVAL;

            }

            s3c2410_gpio_setpin(led_table[arg],!cmd);

            return 0;

   default:

            return -EINVAL;

   }

}

static struct file_operations dev_fops = {

   .owner     =       THIS_MODULE,

   .ioctl         =       sbc2440_leds_ioctl,

};

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++) {

            s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);

            s3c2410_gpio_setpin(led_table[i],0);

   }

   ret =misc_register(&misc);

   printk(DEVICE_NAME"\tinitialized\n");

   return ret;

}

static void __exit dev_exit(void)

{

   misc_deregister(&misc);

}

module_init(dev_init);

module_exit(dev_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("MNONMInc.");

(2)    修改Kconfig文件。

在Kconfig中,添加以下代码:

config EmbedSky_LEDS

       tristate "MNONMLEDs Driver"

       depends on ARCH_S3C2440

       ---help---

   EmbedSky MNONM Userleds.

(3)    修改Makefile文件。

在Makefile中,添加以下代码:

obj-$(CONFIG_EmbedSky_LEDS)    += mini2440_leds.o

(4)    编译LED驱动。回到内核根目录,运行命令make menuconfig,Device Drivers--->Character devices---><*>MNONMLEDs Driver,完成之后,运行命令make,生成内核zImage,下载到mini2440上边,在/dev/目录下可以看到有设备文件节点mnonm_leds。

(5)    在应用层验证LED驱动。编写控制LED的应用程序leds.c,leds.c的内容如下:

#include<stdio.h>

#include <stdlib.h>

#include <unistd.h>

#include <sys/ioctl.h>

intmain(int argc, char **argv)

{

 int on;

 int led_no;

 int fd;

 if (argc != 3 || sscanf(argv[1], "%d", &led_no) != 1 ||sscanf(argv[2],"%d", &on) != 1 ||

     on < 0 || on > 1 || led_no < 0 || led_no >3) {

  fprintf(stderr, "Usage: leds led_no 0|1\n");//这段代码的意思是保证你输入的灯3在(0到3之间),控制灯的亮灭在(0和1之间)否则输出Usage:leds led_no 0|1\n

 exit(1);

 }

 fd = open("/dev/mnonm_leds", 0);打开设备

 if (fd < 0) {

  fd = open("/dev/leds", 0);

 }

 if (fd < 0) {

  perror("open device leds");

  exit(1);

 }

 ioctl(fd, on, led_no);

 close(fd);

 return 0;

}

执行命令arm-linux-gcc–o leds leds.c,生成可执行程序leds.下载到mini2440上边,运行可以看到LED的亮灭。

继续阅读