现在的位置: 首页 > 综合 > 正文

LED驱动在MINI2440上的实例

2013年05月06日 ⁄ 综合 ⁄ 共 2974字 ⁄ 字号 评论关闭

 在别人的程序的基础上修改得来的。

开发环境 

• 主 机:virtualBox--Fedora 9 
• 开发板:Mini2440--128MB Nand 
• 编译器:arm-linux-gcc-4.4.3

linux内核代码树版本为2.6.32.2

 

1、LED驱动的源代码

#include <linux/errno.h> 
#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/slab.h> 
#include <linux/input.h> 
#include <linux/init.h> 
#include <linux/serio.h> 
#include <linux/delay.h> 
#include <linux/clk.h> 
#include <linux/miscdevice.h> 
 
#include <asm/io.h> 
#include <asm/irq.h> 
#include <asm/uaccess.h> 
#include <mach/regs-clock.h> 
#include <plat/regs-timer.h> 
#include <mach/regs-gpio.h>
#include <mach/gpio.h>//我用的是友善之臂的内核代码树,可能跟代码树的配置有关,必须要加这个头文件才行
#include <linux/cdev.h> 
 
#define DEVICE_NAME "my2440_leds" //device name
#define DEVICE_MAJOR 211     //device major
 
#define LED_ON     1        //led light status
#define LED_OFF    0        //led black status
 
static unsigned long led_table[] = //LED IO 
    S3C2410_GPB(5), 
    S3C2410_GPB(6), 
    S3C2410_GPB(7), 
    S3C2410_GPB(8), 
};
static unsigned int led_cfg_table[] = //LED IO MODE
    S3C2410_GPIO_OUTPUT, 
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
    S3C2410_GPIO_OUTPUT,
};
static int leds_open(struct inode *inode, struct file *file) 
    return 0; 
}
 
static int leds_ioctl(struct inode *inode,struct file *file, unsigned int cmd, unsigned long arg)
{
    //detect which led 
    if(arg<0||arg>3)
        return -EINVAL;
 
     switch(cmd) 
    { 
        case LED_ON: 
        { 
            s3c2410_gpio_setpin(led_table[arg], !(LED_ON)); //cannot use ~LED_ON
            break; 
        } 
        case LED_OFF: 
        { 
            s3c2410_gpio_setpin(led_table[arg], !(LED_OFF)); //cannot use ~LED_OFF
             break; 
        } 
        default: 
        { 
            return -EINVAL; 
        } 
    } 
 
    return 0; 
}
 
static struct file_operations leds_fops = 
    .owner = THIS_MODULE, 
    .open = leds_open, 
    .ioctl = leds_ioctl, 
};
 
static int __init led_init(void)
{
    int ret,i;
    //initial led and set led status high
    for(i=0;i<4;i++)
    {
        s3c2410_gpio_cfgpin(led_table[i],led_cfg_table[i]);
        s3c2410_gpio_setpin(led_table[i], ~(LED_OFF)); 
    }
 
    ret = register_chrdev(LED_MAJOR, DEVICE_NAME, &leds_fops); 
 
    if(ret < 0) 
    { 
        printk(DEVICE_NAME " register falid!\n"); 
        return ret; 
    }
}
 
static void __exit led_exit(void)
{
    unregister_chrdev(DEVICE_MAJOR, DEVICE_NAME);
}
 
module_init(led_init); 
module_exit(led_exit); 
 
MODULE_LICENSE("GPL"); 
 
 
2、LED驱动的测试程序
测试程序:
#include<stdio.h> 

#include<stdlib.h>
#include<sys/ioctl.h>
#include<fcntl.h>
int main(int argc,char **argv)
{
    int turn,index;
    int fd;
    //test paramter is currest
    if(argc!=3||sscanf(argv[2], "%d", &index) != 1 || index < 1 || index > 4)
    {
        printf("Usage:led_test on|off 1|2|3|4 \n ");
        exit(1);
    }
 
 
 
    //judge the input paramter
    if(strcmp(argv[1],"on")==0)
    {
        turn=1;
    }
    else if(strcmp(argv[1],"off")==0)
    {
        turn=0;
    }
    else 
    {
        printf("Usage:led_test on|off 1|2|3|4 \n "); 
        exit(1); 
    }
    //open blacklight device
    fd=open("/dev/my2440_leds", O_RDWR);
    if(fd<0)
    {
        printf("Open Backlight Device Faild!\n"); 
        exit(1);
    }
    //ioctl
    ioctl(fd,turn,index-1);
 
    close(fd);
 
    return 0;

}

抱歉!评论已关闭.