字符设备驱动-利用次设备号实现多路LED控制

发布者:csZhou最新更新时间:2016-04-05 来源: eefocus关键字:字符设  次设备号  LED控制 手机看文章 扫描二维码
随时随地手机看文章
驱动源码:
#include
.
.
#include
 
 
int major;
int minor = 0;
 
static struct class *leddrv_class;
static struct class_device *leddrv_class_devs[4];
 
 
volatile unsigned long *gpfcon = NULL;
volatile unsigned long *gpfdat = NULL;
 
static int led_drv_open(struct inode *inode, struct file *file)
{
    int minor = MINOR(inode->i_rdev); //MINOR(inode->i_cdev);
    switch(minor)
    {
        case 0:
        {
            // 配置3引脚为输出
            //s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
            *gpfcon &= ~(0x3<<(4*2));
            *gpfcon |= (1<<(4*2));
            
            //s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
            *gpfcon &= ~(0x3<<(5*2));
            *gpfcon |= (1<<(5*2));
 
            //s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);
            *gpfcon &= ~(0x3<<(6*2));
            *gpfcon |= (1<<(6*2));
 
            // 都输出0
            //s3c2410_gpio_setpin(S3C2410_GPF4, 0);
            *gpfdat &= ~(1<<4);
            
            //s3c2410_gpio_setpin(S3C2410_GPF5, 0);
            *gpfdat &= ~(1<<5);
            //s3c2410_gpio_setpin(S3C2410_GPF6, 0);
            *gpfdat &= ~(1<<6);
 
            break;
        }
 
        case 1:
        {
            s3c2410_gpio_cfgpin(S3C2410_GPF4, S3C2410_GPF4_OUTP);
            s3c2410_gpio_setpin(S3C2410_GPF4, 0);
            break;
        }
 
        case 2:
        {
            s3c2410_gpio_cfgpin(S3C2410_GPF5, S3C2410_GPF5_OUTP);
            s3c2410_gpio_setpin(S3C2410_GPF5, 0);
            break;
        }
 
        case 3:
        {
            s3c2410_gpio_cfgpin(S3C2410_GPF6, S3C2410_GPF6_OUTP);
            s3c2410_gpio_setpin(S3C2410_GPF6, 0);            
            break;
        }    
    }
    return 0;
}
 
static ssize_t led_drv_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)
{
    char val;
    int minor = MINOR(file->f_dentry->d_inode->i_rdev);
 
    copy_from_user(&val, buf, 1);
 
    switch (minor)
    {
        case 0:
        {            
            s3c2410_gpio_setpin(S3C2410_GPF4, (val & 0x1));
            s3c2410_gpio_setpin(S3C2410_GPF5, (val & 0x1));
            s3c2410_gpio_setpin(S3C2410_GPF6, (val & 0x1));
            break;
        }
 
        case 1:
        {
            s3c2410_gpio_setpin(S3C2410_GPF4, val);
            break;
        }
 
        case 2:
        {
            s3c2410_gpio_setpin(S3C2410_GPF5, val);
            break;
        }
 
        case 3:
        {
            s3c2410_gpio_setpin(S3C2410_GPF6, val);
            break;
        }
        
    }
 
    return 0;
}
 
static struct file_operations led_drv_fops = {
    .owner  =   THIS_MODULE,    
    .open   =   led_drv_open,     
    .write  = led_drv_write,   
};
 
static int led_drv_init(void)
{
    major = register_chrdev(0, "led_drv", &led_drv_fops); // 注册字符驱动, 告诉内核
 
    leddrv_class = class_create(THIS_MODULE, "leddrv");   //创建设备节点
 
    leddrv_class_devs[0] = class_device_create(leddrv_class, NULL, MKDEV(major, 0), NULL, "leddrv");
    for (minor = 1; minor < 4; minor++)
    {
        leddrv_class_devs[minor] = class_device_create(leddrv_class, NULL, MKDEV(major, minor), NULL, "leddrv%d", minor);
        if (unlikely(IS_ERR(leddrv_class_devs[minor])))
            return PTR_ERR(leddrv_class_devs[minor]);
    }
    gpfcon = (volatile unsigned long *)ioremap(0x56000050, 16);
    gpfdat = gpfcon + 1;
        
    return 0;
}
 
static void led_drv_exit(void)
{
    unregister_chrdev(major, "led_drv"); // 卸载
    for (minor = 0; minor < 4; minor++)
    {
        class_device_unregister(leddrv_class_devs[minor]);
    }
    class_destroy(leddrv_class);
    iounmap(gpfcon);
}
module_init(led_drv_init);
module_exit(led_drv_exit);
 
MODULE_LICENSE("GPL");
==================================================================================================
测试程序:
#include
#include
#include
#include
 
 
void print_usage(char *file)
{
    printf("Usage:\n");
    printf("%s \n",file);
    printf("eg. \n");
    printf("%s /dev/leds on\n", file);
    printf("%s /dev/leds off\n", file);
    printf("%s /dev/led1 on\n", file);
    printf("%s /dev/led1 off\n", file);
}
 
 
int main(int argc, char **argv)
{
    int fd;
    char* filename;
    char val;
 
 
    if (argc != 3)
    {
        print_usage(argv[0]);
        return 0;
    }
    filename = argv[1];
 
    fd = open(filename, O_RDWR);
    if (fd < 0)
    {
        printf("error, can't open %s\n", filename);
        return 0;
    }
    if (!strcmp("on", argv[2]))
    {
          // 亮灯
          val = 0;
          write(fd, &val, 1);
    }
    else if (!strcmp("off", argv[2]))
    {
          // 灭灯
          val = 1;
          write(fd, &val, 1);
    }
    else
    {
          print_usage(argv[0]);
          return 0;
    }
 
}
=================================================================================================
实验:
         ls -l /dev/leddrv
         ls -l /dev/leddrv1
 
         ./leddrvTest /dev/leddrv on
         ./leddrvTest /dev/leddrv off
         ./leddrvTest /dev/leddrv1 on 
         ./leddrvTest /dev/leddrv2 on
         ./leddrvTest /dev/leddrv2 off
         ./leddrvTest /dev/leddrv3 on
         ./leddrvTest /dev/leddrv3 off
运行程序时输入不同的/dev/leddrv、/dev/leddrv1、/dev/leddrv2、/dev/leddrv3得到的次设备号不同,驱动程序中根据不同的次设备号控制不同的灯,输入不同的on、off命令write时写入的值不同,根据不同的值执行开关动作。

关键字:字符设  次设备号  LED控制 引用地址:字符设备驱动-利用次设备号实现多路LED控制

上一篇:字符设备驱动-按键驱动
下一篇:字符设备驱动-LED实验

推荐阅读最新更新时间:2024-03-16 14:49

MSP430单片机实现PWM控制LED灯的设计
描述:MSP430实现PWM。反映在LED灯上,可以看到LED灯的亮度不断变化 // // ACLK= n/a, MCLK= SMCLK= default DCO ~ 800k // // MSP430F13x // ------------------- // /|| XIN|- // | | | 32kHz // --|RST XOUT|- // | | // | P1.2|--》LED // // // 硬件电路:MSP430F135核心实验板-I型 // 硬件连接: // // 调试器:MSP430FET全系列JTAG仿真器 // 调试软件: IAR Embedded Workbench Version: 3.41A 编译
[单片机]
MSP430单片机实现PWM<font color='red'>控制</font><font color='red'>LED</font>灯的设计
滞流控制实现LED恒流驱动
设计了一款降压型L ED 恒流驱动芯片的滞环控制电路。 该芯片采用高边电流检测方案,运用滞环电流控制方法对驱动电流进行滞环控制,从而获得恒定的平均驱动电流。 设计采用简单的设计理念实现恒流驱动,不需要复杂的电路分析,能实现精确的电流控制,且自身具有稳定性。 芯片采用0. 5μm 5V/ 18V/ 40V CDMOS 工艺研制,电源电压范围为4.5V~28V ,工作温度-40 ℃~125 ℃,可为L ED 提供恒定的350mA 驱动电流,通过调节外部检测电阻,可调节恒定L ED 驱动电流。 外部提供DIM 信号,通过DIM 的占空比来调节L ED 的亮度。 Hspice 仿真结果显示:L ED 驱动电流为滞环变化的三角波,恒流精度小
[电源管理]
滞流<font color='red'>控制</font>实现<font color='red'>LED</font>恒流驱动
构建LED驱动器应实现无闪烁的调光控制
1 LED照明设计带来的挑战 目的,全球照明行业的数字革命正在到来,高效节能的LED灯将取代白炽、M16卤素灯和CFL灯泡。但近段时间LED照明设计人员的工作面又临新的挑战,那就是同时满足既可用针对白炽灯与M16卤素灯的LED驱动器来实现调光控制功能,又要实现高功率因数无任何闪烁的调光控制的的新要求,尤其是要兼容现有的基础架构,其中包括切角调光和电子变压器调光支持无闪烁调光的设计。 应该说,调光是照明系统非常常见的功能,相对于对于白炽灯或M16卤素灯来说,它可以以低成本轻易实现,但对于LED灯的调光而言却存在一定难度,尤其是要实现无任何闪烁的调光控制。通常对建筑与用户来说要将白炽灯或M16转换到用LED照明其最有余悸的是惟恐失去调
[电源管理]
构建<font color='red'>LED</font>驱动器应实现无闪烁的调光<font color='red'>控制</font>
LED智能照明硬件控制系统设计
   LED作为第三代半导体照明光源,具有工作电压低,耗电量小,发光效率高、寿命长等优点。与传统的白炽灯、荧光灯相比,节电达到90%以上。被认为是21世纪的照明光源。   用LED替代白炽灯或荧光灯,环保无污染,使用安全可靠,便于维护。LED是一个非线性器件,当LED导通时,只要LED上的电压稍微变大,电流就会增加很多。因此,即使电压发生微小变化也会大大影响LED器件的工作,使电流过大甚至导致发热损坏。恒流源驱动是最佳的LED驱动方式。采用恒流源驱动,LED上流过的电流将不受电压变化、环境温度变化,以及LED参数离散性的影响,从而能保持电流恒定,充分发挥LED的各种优良特性。 目前广泛采用的恒流源有两种形式:一种是线性电源改
[电源管理]
<font color='red'>LED</font>智能照明硬件<font color='red'>控制</font>系统设计
51单片机:电脑向串口发送数据并控制LED
电脑向串口发送数据后,控制LED灯,并返回发送的数据 程序如下 #include regx52.h #include intrins.h unsigned int num; //建立全局变量 void Delay1000ms() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void UartInit(void) //480
[单片机]
51单片机:电脑向串口发送数据并<font color='red'>控制</font><font color='red'>LED</font>灯
C8051F020在LED显示控制系统中的应用
在单片机系统设计中,LCM(液晶显示模块)人机交互界面的设计往往是很重要的一个环节。LCM可以用于智能仪器上的显示设定参数、状态提示符、检测结果和待输入参数等功能。本文结合电解质分析仪的设计要求,采用深圳市烨新达实业有限公司生产的YXD-12864A2LCM,研究并实现了以C8051F020 为基础的液晶显示的接口电路和程序设计,添加了按键系统,从而达到方便用户使用的目的。 1 电解质分析仪简介 本系统所设计的电解质分析仪(Electrolyte Analyzer)是一种具有高分辨率和高精度的仪器,可以与多种离子选择电极配套使用,可用自动方法测定样品中钾、钠、氯、钙离子的浓度和pH 值。其结构方框图如图1 所示。仪器采用单片机C8
[电源管理]
C8051F020在<font color='red'>LED</font>显示<font color='red'>控制</font>系统中的应用
STM32HAL库控制TIM点亮led
参考视频是小熊派的 开发板 : 【STM32单片机学习】白嫖单片机教程——手把手带你学习STM32L系列单片机(HAL库) 首先要知道公式: 定时器时间=1/(时钟频率/预分频/计数周期) 然后了解定时器的时钟由谁供给,以STM32F103ZET6为例,查他的时钟总线资料,发现有APB1、APB2都有了解定时器的: 由图可知,TIM2的时钟由APB1提供。 简单来说 就是APB2提供高级定时器–定时器1和定时器8的时钟。 APB1提供定时器2到7的时钟,看你需要哪一个了,其对应的是CubeMX的这里: 以TIM2为例: 根据公式:定时器时间=1/(时钟频率/预分频/计数周期) 我们要一个一秒钟的定时时间
[单片机]
STM32HAL库<font color='red'>控制</font>TIM点亮<font color='red'>led</font>
BP2808 LED恒流控制方案
BP2808 是一款驱动LED 的恒流控制芯片,工作范 围从30V 到450V,占空比从0-100%.支持交流 85V-265V 输入,主要应用于非隔离的LED 驱动系统。   BP2808 采用专利技术的恒流控制方法,使得 LED 电流从交流85V-265V 范围内变化小于±5%。   BP2808 采用专利技术的系统结构,使得系统18W 的LED 日光灯方案中,在交流85V-265V 范 围内系统效率高于90%.在交流85V-265V 范围内, BP2808 可以驱动从3W 到36W 的LED 阵列,广泛应 用于E14 / E27 / PAR30 / PAR38 / GU10 等灯杯 和LED 日光灯。   BP2808 具
[电源管理]
BP2808 <font color='red'>LED</font>恒流<font color='red'>控制</font>方案
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved