2416开发记录三:简单LED驱动及应用程序

发布者:MoonlightStar最新更新时间:2019-01-17 来源: eefocus关键字:LED驱动 手机看文章 扫描二维码
随时随地手机看文章

写过了helloworld驱动,来点真格的驱动吧,最简单的就是led驱动了。 


参考mini2440的led驱动写法。写一个混合驱动(对于第一个简单的驱动来说好处多多)


驱动源码

驱动的源码如下:


#include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include

 #include


#define DEVICE_NAME "my2416leds"


#define LED_ON 0 //根据原理图,0点亮led,1熄灭led

#define LED_OFF 1

 //定义GPIO管脚

 static unsigned long led_table [] =

  {

      S3C2410_GPB(1),  //为什么是2410?,使用芯片是2416啊,原来他们的定义几乎是一致的。我在arch/arm/palt-s3c24xx/common-smdk.c文件中发现的。

      //S3C2410_GPF(1),

      //S3C2410_GPF(2),

      //S3C2410_GPF(3),

 };

 //设置管脚模式

 static unsigned int led_cfg_table [] =

  {

      S3C2410_GPIO_OUTPUT, //随内核版本中定义类型的变化,在arch/arm/mach-sc2410/include/mach/Regs-gpio.h文件中定义

      //S3C2410_GPIO_OUTPUT,

      //S3C2410_GPIO_OUTPUT,

      //S3C2410_GPIO_OUTPUT,

 };

 //unlocked_ioctl函数实现,注意,这里的函数参数和ioctl是不一样的,否则不会起作用。

//这里虽然是unlocked_ioctl函数,但是在应用程序中依然是调用ioctl函数来控制。

 static int my2416_leds_ioctl(struct file* filp, unsigned int cmd,unsigned long arg)

 {

   switch(cmd)

   {

      case LED_ON:

         s3c2410_gpio_setpin(S3C2410_GPB(1), LED_ON);

         break;

      case LED_OFF:

         //s3c2410_gpio_setpin(led_table[arg], !cmd);

         s3c2410_gpio_setpin(S3C2410_GPB(1), LED_OFF);

         break;

      default:

         printk("LED control:no cmd\n");

         printk("LED control are LED_ON or LED_OFF\n");

         return(-EINVAL);

   }

   return 0;

 }

 //dev_fops操作指令集

 static struct file_operations my2416Led_fops =

 {

      .owner =THIS_MODULE,

      .unlocked_ioctl =my2416_leds_ioctl,//这里必须是unlocked_ioctl而不是ioctl。

 };

 //第三步:混杂设备定义

 static struct miscdevice my2416Ledmisc =

  {

      .minor = MISC_DYNAMIC_MINOR,

      .name = DEVICE_NAME,

      .fops = &my2416Led_fops,

 };

 //第二步:gpio模式选择,设定管脚

 //  注册混杂设备

 static int __init dev_init(void)

 {

      int ret;


     int i;

      ////这里只定义了一个io口GPB1

      for (i = 0; i < 1; i++)

      {

          s3c2410_gpio_cfgpin(led_table[i], led_cfg_table[i]);

          s3c2410_gpio_setpin(led_table[i], 0);

      }


     ret = misc_register(&my2416Ledmisc);


     printk (DEVICE_NAME"\tinitialized\n");


     return ret;

 }


static void __exit dev_exit(void)

 {

    misc_deregister(&my2416Ledmisc);

 }

 //第一步:module_init(dev_init);

 //    module_exit(dev_exit);

 module_init(dev_init);

 module_exit(dev_exit);

 MODULE_AUTHOR("Zhao Yidong

MODULE_LICENSE("Dual BSD/GPL");

MODULE_DESCRIPTION("A sample  2416 led dev");

MODULE_ALIAS("2416 led dev");


相应的makefile文件如下

#Makefile for .c

ARCH=arm

CROSS_COMPILE=arm-linux-

ifneq ($(KERNELRELEASE),)

    obj-m := my2416LedDev.o

else

#bbblack kernel

KERNELDIR ?= /home/zyd/soft/s3c2416/20140409_HELPER2416/Helper2416/source/s3c-linux.jyx

PWD := $(shell pwd)

modules:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules

modules_install:

    make -C $(KERNELDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules_install

app: app.c

    $(CROSS_COMPILE)gcc -o app app.c

clean:

    $(MAKE) -C $(KDIR) M=$(PWD) clean

endif


执行命令make modules即可编译出my2416LedDev.ko 

使用minicom将驱动下载到板子上,使用insmod命令加载驱动即可。


测试应用程序编写

下面是相应的测试app文件编写。使用的开发环境是codeblocks


#include

#include

#include

#include

#include

#include

#include



#define DEVICE_NAME "/dev/my2416leds"


#define LED_ON 0

#define LED_OFF 1


int main()

{

    int fd;

    int ret;

    char *i;

    char count=0;


    printf("My2416 led dev test!\n");


    fd=open(DEVICE_NAME,O_RDWR);

    printf("fd=%d\n",fd);

    if(fd==-1)

    {

        printf("open device %s error\n",DEVICE_NAME);

    }

    else

    {

        for(count=0;count<10;count++)

        {

            ioctl(fd,LED_OFF);

            sleep(1);

            ioctl(fd,LED_ON);

            sleep(1);

        }

        ret=close(fd);

        printf("ret =%d\n",ret);

        printf("Close ledapp succeed!\n");

    }

    return 0;

}



编译成功后依然使用minicom下载到板子上。 

执行命令./my2416LedAPP即可看到GPB1控制的LED闪烁了。


关键字:LED驱动 引用地址:2416开发记录三:简单LED驱动及应用程序

上一篇:2416开发记录二:最简单的helloworld驱动
下一篇:2416开发记录四: ioctl与unlocked_ioctl区别

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

浅谈如何实现LLC LED驱动器简化设计
相比过去使用的老式、笨重的阴极射线管(CRT)显示器,现在的平板数字电视和显示器要薄得多。这些新型平板电视对消费者非常有吸引力,因为它们占用的空间更小。   为了帮助满足消费者需求并使这类数字设备变得更薄,一些厂商转向使用LLC 谐振半桥转换器来为这些设备的发光二极管(LED)背光提供驱动。这是因为,利用这种拓扑结构所实现的零电压软开关(ZVS)可带来更高效的高功率密度设计,并且要求的散热部件比硬开关拓扑更少。   这类拓扑设计存在的一个问题是LLC dc/dc传输函数会随负载变化而出现明显变化。但是,这样会使在LED驱动器中建立LLC控制器和补偿电流环路变得更加复杂。为了简化这一设计过程,本文将讨论一种被称作脉宽调制(PWM
[模拟电子]
浅谈如何实现LLC <font color='red'>LED驱动</font>器简化设计
5W LED驱动电源电路图
  在目前的LED的电源驱动器中,必须使用电解电容,小型的电解电容寿命只能达到几千小时。但使用专利IC的驱动器,完全不需要使用电解电容,寿命达到4万小时以上,是原来驱动器的10倍,而且专利IC驱动器的尺寸小,只有原来面积的四分之一,可轻易的放进LED灯泡内,不必改变原来灯泡的形状,让设计更加简单化,也更能让用户接受和喜爱。 5W LED驱动电源电路图
[电源管理]
5W <font color='red'>LED驱动</font>电源电路图
适用于汽车内外部照明的各种LED驱动器方案
  近年来,随着LED在光效及成本等几乎各个方面的持续改进,其应用领域不断拓宽,从传统的便携设备背光向中大尺寸LCD显示器/液晶电视背光、汽车及通用照明等领域不断迈进。本文将专门介绍适合于汽车照明应用的各种LED驱动器方案,并探讨一些典型应用。   LED为汽车照明应用提供众多优势   LED在汽车中的应用领域非常广泛,但可以简单归纳为内部照明及外部照明(参见图1)。外部照明有如前照灯、尾部照明等,内部照明包括内部便利及舒适照明和仪表盘背光等。      图1:多种多样的汽车LED照明应用   推动汽车LED照明应用的因素很多。以前照灯为例,采用LED作为光源拥有众多优势:    利于灵活或新颖的造型设计 ——L
[电源管理]
适用于汽车内外部照明的各种<font color='red'>LED驱动</font>器方案
基于电荷泵的多LED驱动
CPLD(Complex Programmable Logic Device)是一种复杂的用户可编程逻辑器件,由于采用连续连接结构。这种结构易于预测延时,从而电路仿真更加准确。CPLD是标准的大规模集成电路产品,可用于各种数字逻辑系统的设计。近年来,由于采用先进的集成工艺和大批量生产,CPLD器件成本不断下降,集成密度、速度和性能大幅度提高,一个芯片就可以实现一个复杂的数字电路系统;再加上使用方便的开发工具,使用CPLD器件可以极大地缩短产品开发周期,给设计、修改带来很大方便 。本文以 ALTERA公司的MAX7000系列为例,实现MCS51单片机与PC104 ISA总线的并行通信。采用这种通信方式,数据传输准确、高速,在12 M
[电源管理]
基于电荷泵的多<font color='red'>LED驱动</font>器
LED驱动器IC无闪烁调光解决方案
LED亮度高、功耗小、小型化、寿命长等优点推动了该技术的迅速发展,但LED照明技术仍存在成本高、散热器过大、发光率低以及调光等挑战。在设计过程中,工程师进行LED常规调节时往往会遇到启动速度慢、闪烁、光照不均匀等情况,因此如何解决LED闪烁问题成为工程师当务之急。如果能够提供高精度恒流控制(能够分析可控硅控制器的可变相位角输出,对流向LED的恒流进行单向调整),输入EMI滤波器电感和电容非常小,那么进行有效的无闪烁调光是否便能成为可能? 日前,Power Integrations (PI)公司LinkSwitch-PH系列LED驱动器IC很好地解决这一困扰,该产品的初级侧控制技术还省去了隔离反激式电源中常用的光耦器和辅助电路(即
[电源管理]
S3C2440 字符设备驱动程序之LED驱动程序_编写编译(二)
app: open , read , write 驱动: led_open,led_read,led_write 驱动框架: 一、写出:led_open,led_read 二、怎么告诉内核? a、定义一个file_operations b、把这个结构体告诉内核: register_chrdev(major,name,file_operations) c、谁来调用它 (register_chrdev) 驱动的入口函数 first_drv_init d、修饰:module_init(first_drv_init) (怎么知道是哪个入口函数) module_init:(入口函数)定义了
[单片机]
S3C2440 字符设备驱动程序之<font color='red'>LED驱动</font>程序_编写编译(二)
手机白光LED驱动电路解决方案分析
    手机集成视频拍摄、支持视频电话、互联网浏览与电子邮件等功能,增加了白光LED的使用时间,如何降低驱动功率延长电池寿命对驱动电路设计带来很大的挑战性。本文介绍了两种常用驱动电路特点,通过选择恰当的驱动电路和器件可以实现优化的驱动设计。     推动移动电话显示由单色转换为彩色的一个主要趋势是拍摄功能的集成。最初这些成像器件的分辨率相当有限,同时图像质量也不佳。但随着技术的发展,分辨率由30万像素的VGA等级进展到100至200万级像素,并快速朝向300万像素以上的分辨率级迈进。在成像器件、处理器与软件不断得到改进后,消费者现在希望得到更多的数码相机功能,例如低照明情况下需要的闪光灯,甚至是自动对焦等。在这样的分辨率下,良好
[嵌入式]
负电荷泵白光LED驱动器的设计
  概述   当前许多便携式消费类电子产品,例如手机、PDA、MP3播放器、笔记本等都带有显示屏,虽然不同的应用对于显示屏的种类以及大小会有所不同,但对于广大设计人员来说,都需要为其设计背光电路。白光LED被认为是小型手持设备彩色显示器的理想背光源。   驱动白光LED的最简单方法是采用电压源通过一个镇流电阻驱动LED(如图1所示)。这种驱动方式的优点是选择电压源的余地很大,调节器与LED之间只需要一个连接端点。但缺点也同样明显:其一,效率低下,这主要是由于镇流电阻的损耗造成的;其二,LED电流的稳流能力差,控制不精确,由于温漂以及LED的不匹配造成的LED正向电压的变化,将使最终的LED电流产生较大变化,从而影响背光亮度的控
[安防电子]
负电荷泵白光<font color='red'>LED驱动</font>器的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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