基于设备树的led驱动程序

发布者:cannon928最新更新时间:2023-06-07 来源: elecfans关键字:设备树  led  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

  1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6 #include

  7 #include

  8 #include

  9 #include

 10 #include

 11 #include

 12 #include

 13 #include

 14 #include

 15 

 16 static volatile unsigned long *ledcon;

 17 static volatile unsigned long *leddat;

 18 static struct class *led_class;

 19 static unsigned int pin_th;

 20 dev_t led_dev;

 21 struct cdev *cdev;

 22 

 23 

 24 /* 打开led灯 */

 25 static int led_open(struct inode *inode, struct file *file)

 26 {

 27      *ledcon &= ~(0x3 << (pin_th * 2));

 28      *ledcon |= (0x1 << (pin_th * 2));

 29      *leddat &= ~(1 << pin_th);

 30      return 0;

 31 }

 32 

 33 static struct file_operations led_fops = {

 34                .owner = THIS_MODULE,

 35                .open = led_open,

 36 };

 37 

 38 static int led_probe(struct platform_device *pdev)

 39 {

 40    int pin_info;

 41    int phy_addr;

 42    int io_base;

 43    of_property_read_s32(pdev->dev.of_node, "pin", &pin_info); 

 44    printk("pin_info = 0x%xn", pin_info);

 45    of_property_read_s32(pdev->dev.of_node, "iobase", &io_base); 

 46    printk("io_base = 0x%xn", io_base);

 47    pin_th = pin_info & (0xffff);

 48    phy_addr = (io_base | ((pin_info>>16)<<4));

 49    ledcon = ioremap(phy_addr, 2);

 50    leddat = ledcon + 1;

 51    

 52    if (alloc_chrdev_region(&led_dev, MINOR(led_dev), 1, "led"))

 53           return -1;

 54    cdev = cdev_alloc();

 55    if (!cdev)

 56           return -1;

 57    cdev_init(cdev, &led_fops);

 58    cdev_add(cdev, led_dev, 1);

 59 

 60    led_class = class_create(THIS_MODULE, "led");

 61    device_create(led_class,NULL,led_dev,NULL,"led0");   // is /dev/led0

 62 

 63    return 0;

 64    

 65 }

 66 

 67 int led_remove(struct platform_device *pdev)

 68 {

 69     device_destroy(led_class, led_dev);

 70     class_destroy(led_class);

 71     cdev_del(cdev);

 72     unregister_chrdev_region(led_dev, 1);

 73     iounmap(ledcon);

 74     return 0;

 75 }

 76 

 77 static struct of_device_id led_id[] = {

 78               {.compatible = "jz2440_led"},

 79               {},

 80 };

 81 

 82 static struct platform_driver led_drv = {

 83     .probe = led_probe,

 84     .remove = led_remove,   

 85      .driver = {

 86         .name  = "jz2440_led",

 87         .of_match_table = led_id,

 88     },

 89 };

 90 

 91 static int led_init(void)

 92 {

 93     platform_driver_register(&led_drv);

 94     return 0;

 95 }

 96 

 97 static void led_exit(void)

 98 {

 99      platform_driver_unregister(&led_drv);

100 }

101 

102 module_init(led_init);

103 module_exit(led_exit);

104 

105 MODULE_LICENSE("GPL");

以上是驱动程序,下面是设备树dts文件:

 1 #define S3C2440_GPA(_nr)    ((0<<16) + (_nr))

 2 #define S3C2440_GPB(_nr)    ((1<<16) + (_nr))

 3 #define S3C2440_GPC(_nr)    ((2<<16) + (_nr))

 4 #define S3C2440_GPD(_nr)    ((3<<16) + (_nr))

 5 #define S3C2440_GPE(_nr)    ((4<<16) + (_nr))

 6 #define S3C2440_GPF(_nr)    ((5<<16) + (_nr))

 7 #define S3C2440_GPG(_nr)    ((6<<16) + (_nr))

 8 #define S3C2440_GPH(_nr)    ((7<<16) + (_nr))

 9 #define S3C2440_GPJ(_nr)    ((8<<16) + (_nr))

10 #define S3C2440_GPK(_nr)    ((9<<16) + (_nr))

11 #define S3C2440_GPL(_nr)    ((10<<16) + (_nr))

12 #define S3C2440_GPM(_nr)    ((11<<16) + (_nr))

13  

14 /dts-v1/;

15 

16 / {

17     model = "SMDK2440";

18     compatible = "samsung,smdk2440";

19 

20     #address-cells = <1>;

21     #size-cells = <1>;

22         

23     memory@30000000 {

24         device_type = "memory";

25         reg =  <0x30000000 0x4000000>;

26     };

  

34     chosen {

35         bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";

36     };

37 

38     

39     led {

40         compatible = "jz2440_led";

41         pin = ;

42         iobase = <0x56000000>;

43     };

44 };



关键字:设备树  led  驱动程序 引用地址:基于设备树的led驱动程序

上一篇:linux内核中的GPIO系统之(2):pin control subsystem
下一篇:从Linux内核LED驱动来理解字符设备驱动开发流程

推荐阅读最新更新时间:2024-11-10 12:59

DAC0832控制LED亮暗程序
DAC0832 是8分辨率的D/A转换集成芯片。与微处理器完全兼容。这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。 /*D15发光二极管做亮暗显示,指示DAC0832将数字量转换为模拟量的结果*/ #include "reg52.h" #define uchar unsigned char #define uint unsigned int sbit we=P2^7; sbit du=P2^6; sbit csda=P3^2; sbit wr=P3^6; void delay(uchar z) { ui
[电源管理]
stm32笔记:点亮一个led (精简版)
仅包含启动文件 STM32F10x.s C代码 #define GPIOA_CRL (*(volatile unsigned long *)(0x40000000+0x10000+0x0800+0x00)) #define GPIOA_CRH (*(volatile unsigned long *)(0x40000000+0x10000+0x0800+0x04)) #define GPIOA_IDR (*(volatile unsigned long *)(0x40000000+0x10000+0x0800+0x08)) #define GPIOA_ODR (*(volatile unsigned
[单片机]
stm32笔记:点亮一个<font color='red'>led</font> (精简版)
STM32HAL库控制TIM点亮led
参考视频是小熊派的 开发板 : 【STM32单片机学习】白嫖单片机教程——手把手带你学习STM32L系列单片机(HAL库) 首先要知道公式: 定时器时间=1/(时钟频率/预分频/计数周期) 然后了解定时器的时钟由谁供给,以STM32F103ZET6为例,查他的时钟总线资料,发现有APB1、APB2都有了解定时器的: 由图可知,TIM2的时钟由APB1提供。 简单来说 就是APB2提供高级定时器–定时器1和定时器8的时钟。 APB1提供定时器2到7的时钟,看你需要哪一个了,其对应的是CubeMX的这里: 以TIM2为例: 根据公式:定时器时间=1/(时钟频率/预分频/计数周期) 我们要一个一秒钟的定时时间
[单片机]
STM32HAL库控制TIM点亮<font color='red'>led</font>
LED显示屏的选择与显示技术的比较
随着数字化、信息化的发展,大屏幕在各种场合得到了越来越多的应用,而各种显示技术也应运而生。从早期的CRT,到现在的LCD显示屏、PDP、FED、DLP等,平板显示技术呈现出多元化发展的趋势。下面将就LED屏的选择,及其与背投、LCD、PDP的比较展开讨论。 一 led屏是否适合自身运用 以下列出两个简单问题,可以帮你决定LED屏是否适合你的具体应用: 1. 你选择的安装环境的亮度如何? 如果是环境很明亮,则请优先选用LED或背投。 2. 你的显示屏需要多大的尺寸? 如果你想要一个60英寸以上、无缝的大显示屏,那你可以选择前投、背投或LED显示屏。 二 LED视频显示屏可为室外告示和广告市场提供最大的投资回报 现代的广告发布网络系统
[电源管理]
欧司朗在国际消费电子展(CES)上推动汽车技术未来发展
欧司朗先进的LiDAR 技术让自动驾驶变为现实 首次推出使用 LED 和激光光源技术对前方道路提供照明和标识投射 欧司朗为当今很多车辆提高安全性能 在 2018 年CES国际消费电子展上,全球汽车照明领导者欧司朗将展示一系列汽车技术,通过对可见与不可见光的应用,扩展和改善驾驶者、乘客和其他道路使用者的体验。此次展出的技术包括:实现自动驾驶的LiDAR中扮演重要角色的激光技术,能够实现例如车道偏离警告等先进驾驶员辅助系统的红外LED。欧司朗还在研发能够对道路障碍物作出警示的智能头灯,以及可以探测到驾驶员紧急健康状况的生物监测技术。欧司朗还将展示首次推出的使用 LED 和激光光源技术对前方道路提供照明和标识投射。简言之:欧司朗不断致力
[嵌入式]
量子LED 3D打印亮相 隐形眼镜有望集成显示屏
    如果向读者提出一个假设性问题:当你在使用头戴显示屏设备时,你是会选择戴框架眼镜,还是戴隐形眼镜呢? 如果你的答案是隐形眼镜,坏消息就是你可能还得等等。好消息是,全球首款可以打印LED的3D打印机有朝一日可以帮助我们实现这一切。 该项目是由美国普林斯顿大学麦艾尔派恩研究小组负责人迈克·麦艾尔派恩(Michael McAlpine)领导。该团队成功使用其打印机,打印出了量子点LED(简称QLED)。QLED亮度更亮、颜色更纯,但是它的能耗却相对较低,内部使用的是硒化镉纳米晶体。QLED同时也是超级薄、富有柔性,透明,跟隐形眼镜一般。 “传统的微电子工业专注于生产2D电子设备,我们所看到的电视和手机,
[家用电子]
51单片机PWM控制LED亮灭
设计思路:用定时器中断产生最小时间单位T0,每m个T0组成一个子 周期 T10,其中前n个T0为LED导通时间,即Ton=n*T0,则Toff=(m-n)*T0 ;每X个T10组成一个母周期T20,其中前y个T10为有效控制时间,后续的(x-y)个T10令LED熄灭或者子周期占空比调至最小。 ;适当调节n/m和x/y的比例使显示效果达到最佳。 ;以下是刚刚调试通过的小段程序,显示效果良好。 ;实验过程本人有一种推测,不知是否成立: ;子周期的最小占空比的宽度应大于LED的点亮时间,即点亮LED的时间宽度n/m*T0应足够产生余辉。类似于动态数码管对点亮时间的要求。 ;母周期的宽度应小于1/50s,提高刷新频率以令肉眼察觉不出闪烁。
[单片机]
驱动LED阵列的同步降压开关电源
背景 汽车照明装配供应商正在考虑用LED器件与高强度放电(HID) 照明竞争。首先,LED器件的驱动电路没有HID 灯复杂。HID灯要求高压镇流电路在HID 灯中启动一个电弧,而且在启弧后需要调整其电压输出,以维持对HID灯的恒定功率供应。从电磁兼容(EMC)的观点来看,这些高压电路易于产生噪声,进一步阻碍了这些技术在汽车领域使用。最后,LED器件的成本持续下降,使这种技术对于成本敏感的汽车市场越来越有吸引力。 一个典型的LED前照灯应用要求给LED阵列提供大约25 瓦以上的功率。因为LED元件的一个优点是效率高,所以驱动电子元件也应该提高效率,以充分发挥LED技术的优势。因此考虑采用某种开关电源 (SMPS)来实现这个目标是
[电源管理]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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