基于linux2.6.30.4的s3c2440的led字符驱动

本文介绍了一个基于S3C2410处理器的LED控制模块开发过程。通过编写内核驱动程序实现了对四个LED灯的控制,并提供了一个用户空间程序来通过ioctl系统调用控制LED的状态。该模块使用miscdevice注册,简化了设备号管理和文件操作。
摘要由CSDN通过智能技术生成

1 driver


#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 "led0"    
    
static unsigned long led_table [] = {    
    S3C2410_GPB(5),    
    S3C2410_GPB(6),    
    S3C2410_GPB(7),    
    S3C2410_GPB(8),    
};    
/*将I/O口设置为输出功能*/    
static unsigned int led_cfg_table [] = {    
    S3C2410_GPIO_OUTPUT,    
    S3C2410_GPIO_OUTPUT,    
    S3C2410_GPIO_OUTPUT,    
    S3C2410_GPIO_OUTPUT,    
};    
 /*对LED文件操作*/     
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;    
    }    
}    
/*miscdevice*/  
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], 1);//off    
    }    
    
    ret = misc_register(&misc);    
    
    printk (DEVICE_NAME"\tinitialized\n");    
    
    return ret;    
}    
 /*设备注销程序*/   
static void __exit dev_exit(void)    
{    
    misc_deregister(&misc);  
    printk(DEVICE_NAME"\tclose!!\n");  
}    
    
module_init(dev_init);    
module_exit(dev_exit);    
MODULE_LICENSE("GPL");    
MODULE_AUTHOR("FriendlyARM Inc.");


2 test


#include <string.h>  

#include <stdlib.h>  
#include <fcntl.h> // open() close()  
#include <unistd.h> // read() write()  
#define LED_ON 1  
#define LED_OFF 0  
 
int main(void)  
{  
    int fd,i;  
    fd = open("/dev/led0", 0);  
    if (fd < 0)  
    {  
        printf("open device /lib/modulew/2.6.32.2/myled-ioctl error!\n");  
    }  
    else  
    {  
        while(1)  
        {  
            for(i=0;i<4;i++)  
            {  
                printf("led%d is on!\n",i);  
                ioctl(fd,LED_ON,i);  
                 sleep(1);//等待1秒再做下一步操作  
                 printf("led%d is off!\n",i);  
                ioctl(fd,LED_OFF,i);  
                sleep(1);  
             }  
             if(i==4)  
                 i=0;  
        }  
        close(fd);  
    }  
    return 0;  
}  







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值