天天看點

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的亮滅。

繼續閱讀