|  | 
 
| 写了一个TQ2440的led驱动,四个led灯与引脚GPB5~GPB8连接,引脚输出低电平是点亮led灯; 想用led_driv_open函数配置引脚为输出并设初始值为低电平,但是只能将GPB5对应的led灯点亮,求大神看看
  这是驱动代码,测试程序代码在下面
 
 复制代码#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/device.h>       //for udev
#include <mach/regs-gpio.h>  //gpio
MODULE_LICENSE("GPL");                
static struct class *led_driv_class;                //定义一个类
static unsigned int led_table[]=
{
        S3C2410_GPB5,
        S3C2410_GPB6,
        S3C2410_GPB7,
        S3C2410_GPB8
};
static int led_driv_open(struct inode *inode,struct file *file)
{
        int i;
        
        //配置GPB5,6,7,8为输出,且输出0,低电平
        for(i=0; i<4; i++)
        {
                s3c2410_gpio_cfgpin(led_table[i], S3C2410_GPB5_OUTP);
                s3c2410_gpio_setpin(led_table[i], 0);
        }
        
        return 0;
}
static int led_driv_write(struct file *file,const char __user *buf,size_t count,loff_t *ppos)
{
        int val,i;
        copy_from_user(&val, buf, count);    //从用户空间拷贝数据
        if(val==1)
        {
                //点灯
                for(i=0;i<4;i++)
                {
                        s3c2410_gpio_setpin(led_table[i], 0);
                }
        }
        else
        {
                //灭灯
                for(i=0;i<4;i++)
                {
                        s3c2410_gpio_setpin(led_table[i], 1);
                }
        }
        
        return 0;
}
static struct file_operations led_driv_fops={
        .owner = THIS_MODULE,
        .open = led_driv_open,
        .write = led_driv_write,
};
int major;
static int __init led_driv_init(void)
{
    printk("<1>\n     Hello,Led drive!\n");
    major=register_chrdev(0, "led_dev", &led_driv_fops);
        
    //新建类
    led_driv_class = class_create(THIS_MODULE, "led_dev");
    if(IS_ERR(led_driv_class))
                return PTR_ERR(led_driv_class);
    //创建设备
   device_create(led_driv_class,NULL,MKDEV(major, 0),NULL,"led_dev");
    return 0;
}
static void __exit led_driv_exit(void)
{
    printk("<1>\n     Exit!\n");
    //删除设备结点
    device_destroy(led_driv_class,MKDEV(major, 0));
    class_destroy(led_driv_class);
        
    unregister_chrdev(major, "led_dev");
}                                    
module_init(led_driv_init);
module_exit(led_driv_exit);
MODULE_LICENSE("GPL");
 
 测试程序代码
 
 复制代码#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main()
{
        int fd,val;
        if((fd=open("/dev/led_dev",O_RDWR))<0)
        {
                 printf("open device failed");
        }
        printf("type 1 to turn on the led,0 to turn of it!");
        scanf("%d",&val);
        write(fd,&val,4);
        return 0;
}
 
 
 | 
 |