zoukankan      html  css  js  c++  java
  • 初探linux子系统集之led子系统(三)

     

            世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了。也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁。就像什么考试,比赛,第一永远会被人们所记住,所以我们都想去追寻第一,渴望第一,在一次次的追寻中,成者为王败者为寇。而处在第一的位置,永远担心下面的会超越自己,从而活得很累,而第二永远想争取第一,也活得很累,有时候,想想,人一生当中,成功真的就那么重要吗?富有真的那么重要吗?采菊东篱下,悠然见南山不是也很有诗意吗?说了好多,还是继续写led子系统吧。

            前面写了很多关于led子系统的相关知识,现在终于可以开始分析leds-gpio.c这个驱动了。

            注册了platform驱动。

             platform_driver_register(&gpio_led_driver);

            platform总线就不多说了,在自己的平台下添加platform device就可以了。

             当device和dirver匹配后,就会调用driver的probe函数,这里调用的是下面这个函数。

    static int __devinit gpio_led_probe(struct platform_device *pdev)
    {
             structgpio_led_platform_data *pdata = pdev->dev.platform_data;
             struct gpio_leds_priv*priv;
             int i, ret = 0;
     
             if (pdata &&pdata->num_leds) {
                       priv =kzalloc(sizeof_gpio_leds_priv(pdata->num_leds),
                                         GFP_KERNEL);
                       if (!priv)
                                return-ENOMEM;
     
                       priv->num_leds= pdata->num_leds;
                       for (i = 0;i < priv->num_leds; i++) {
                                ret= create_gpio_led(&pdata->leds[i],
                                                         &priv->leds[i],
                                                         &pdev->dev,pdata->gpio_blink_set);
                                if(ret < 0) {
                                         /*On failure: unwind the led creations */
                                         for(i = i - 1; i >= 0; i--)
                                                   delete_gpio_led(&priv->leds[i]);
                                         kfree(priv);
                                         returnret;
                                }
                       }
             } else {
                       priv =gpio_leds_create_of(pdev);
                       if (!priv)
                                return-ENODEV;
             }
     
             platform_set_drvdata(pdev,priv);
     
             return 0;
    }


     

    获取platform里的device的数据,然后create_gpio_led,这里可以注册很多歌led,具体的leds-gpio的platform数据可以参考

    http://blog.csdn.net/eastmoon502136/article/details/37569789

     

    接着看一下create_gpio_led这个函数。

    static int __devinit create_gpio_led(const struct gpio_led*template,
             struct gpio_led_data*led_dat, struct device *parent,
             int (*blink_set)(unsigned,int, unsigned long *, unsigned long *))
    {
             int ret, state;
     
             led_dat->gpio = -1;
     
             /* skip leds thataren't available */
             if(!gpio_is_valid(template->gpio)) {
                       printk(KERN_INFO"Skipping unavailable LED gpio %d (%s)
    ",
                                         template->gpio,template->name);
                       return 0;
             }
     
             ret =gpio_request(template->gpio, template->name);
             if (ret < 0)
                       return ret;
     
             led_dat->cdev.name= template->name;
             led_dat->cdev.default_trigger= template->default_trigger;
             led_dat->gpio =template->gpio;
             led_dat->can_sleep= gpio_cansleep(template->gpio);
             led_dat->active_low= template->active_low;
             led_dat->blinking =0;
             if (blink_set) {
                       led_dat->platform_gpio_blink_set= blink_set;
                       led_dat->cdev.blink_set= gpio_blink_set;
             }
             led_dat->cdev.brightness_set= gpio_led_set;
             if(template->default_state == LEDS_GPIO_DEFSTATE_KEEP)
                       state =!!gpio_get_value(led_dat->gpio) ^ led_dat->active_low;
             else
                       state =(template->default_state == LEDS_GPIO_DEFSTATE_ON);
             led_dat->cdev.brightness= state ? LED_FULL : LED_OFF;
             if(!template->retain_state_suspended)
                       led_dat->cdev.flags|= LED_CORE_SUSPENDRESUME;
     
             ret =gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state);
             if (ret < 0)
                       goto err;
                      
             INIT_WORK(&led_dat->work,gpio_led_work);
     
             ret =led_classdev_register(parent, &led_dat->cdev);
             if (ret < 0)
                       goto err;
     
             return 0;
    err:
             gpio_free(led_dat->gpio);
             return ret;
    }


     
    struct gpio_led_data {
             struct led_classdevcdev;
             unsigned gpio;
             struct work_structwork;
             u8 new_level;
             u8 can_sleep;
             u8 active_low;
             u8 blinking;
             int(*platform_gpio_blink_set)(unsigned gpio, int state,
                                unsignedlong *delay_on, unsigned long *delay_off);
    };
     


    申请gpio,以及对于一些变量和函数指针的赋值,最后注册led设备。

     

    关于应用层的调用:

    比如我们在platform设备中注册了

    Static struct gpio_led gpio_leds[] = {
             {
                       .name=”my-led”,
                       .default_trigger= “timer”,
                       .gpio= 30,
                       .active_low= 1,
                       .default_state= LEDS_GPIO_DEFSTATE_OFF,
    }
    };


     

    那么在/sys/class/leds/下会有my-led目录,在目录下面会创建两个文件delay_on和delay_off。

    可以通过

    echo 100 > /sys/class/leds/my-led/delay_on

    echo 100 > /sys/class/leds/my-led/delay_off

    来控制闪烁的时间。

             cat /sys/class/leds/my-led/delay_on

    cat  /sys/class/leds/my-led/delay_off

    来获取当前的delay_on和delay_off的值

     

    对于led子系统就简单的介绍到这里了。

     

     

  • 相关阅读:
    Spring总结(一)
    Java中NumberUtil工具类(持续更新中)
    Java中DateUtil工具类(持续更新中)
    解决poi导出报4000最大样式错误:java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook错误
    MySQL 5.7 zip 安装
    Java中String类方法
    Error creating bean with name 'org.mybatis.spring.mapper.MapperScannerConfigurer#0' defined in class path resource [applicationContext-common.xml]: Cannot resolve reference to bean 'sqlSessionFactory'
    Ajax中async与cache参数
    打印类对象自动调用toString方法
    JSP基本语法小结
  • 原文地址:https://www.cnblogs.com/wuyida/p/6299983.html
Copyright © 2011-2022 走看看