基于设备树的led驱动程序

发布时间:2023-06-07  

  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 灯丝灯的设......
    灯一般适用于家庭等类似场所,供照明使用,其在不损坏其结构时是不可拆卸的。它的功率需要保持在60 W以下;电压要保持在大于50 V且小于或等于250 V之间;灯头必须符合IEC 60061-1要求。 自镇流的LED灯需......
    驱动器 最近,配备前照灯高强度LED的汽车数量有所增加。这主要是因为 LED 优于卤素灯和高强度放电 (HID) 灯,因为 LED 结合了高效率、更长的寿命和卓越的设计美学。然而,汽车电子设备......
    一般的主照明产品,包括巴士、汽车、电动摩托车、摩托车等载具用的车用光源,工业厂房、仓库使用的高瓦数天井灯需求也提升,成了区域市场很有未来发展潜力的领域。 台湾大厂亿光在这次展览中是台湾厂商最大的摊位,举凡 LED......
    ,汽车电子设备所需的LED灯需要先进的模拟技术,因为即使在车载电池的宽电压范围内,其强度也必须控制在恒定水平。 MAX16833以恒定电流驱动高强度LED,并包含高边CSA。开关FET由该......
    超级电容器在放电过程中电压会不断降低,因此需要有稳压电路来驱动LED。 本文选用CMOS工艺制造且静态电流极低的VFM开关型DC/DC升压稳压器,该芯片内部包括VFM控制电路、LX开关驱动晶体管、基准电压单元、振荡器、误差......
    发出的光,也就是二次光学),也有少数公司因为散热技术处理得好,而选用了3W甚至更高功率的LED。适合于大型场合投光照明,建筑物等照明。 投光灯还有哪些需要注意的东西呢? 1、高纯度铝反射板、光束......
    前照灯可以拥有超过100万个寻址像素,相比于矩阵式LED的ADB提高了一万倍。为什么车企要推出光幕、光毯、投射斑马线等功能呢,一个重要原因是DLP大灯的像素是远超车灯需要的,那么就需要......
    点灯的核心就是:如何用STM32控制一个二极管电路。 市场上各类LED(直插式/贴片式以及各种颜色的LED,都有点区别)在导通时的压降一般在1.8~3.3V。所以点灯需要先查看电路图,确定驱动LED的方......
    式的尾灯系统是现在的一个热门话题。 实现贯穿式动态尾灯设计并不容易,在传统的尾灯内部,每个灯都是独立控制的,使用模拟驱动型LED Drive可单独驱动每个灯的组件。贯穿式动态尾灯需要整个系统互动起来,要求增加非常多的像素点。LED......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>