从uboot传参数给linux驱动

来源:互联网 发布:ios 阿里百川的云推送 编辑:程序博客网 时间:2024/05/20 23:56

android电视上有个hotel模式,要求有个开关控制开机时是否闪灯,开机闪灯是用linux led驱动做的,控制开关是在hotel模式的菜单中做的,要想用菜单的开关控制开机时是否闪灯,首先想到的做法是:在uboot中添加一个环境变量,因为我们是mstar方案,他们已经做好了一个供java层使用的接口,可以用来设置uboot的环境变量,然后开机在uboot中检测这个环境变量的值,如果存在就把它添加到bootargs参数里面,如果不存在就添加一个这样的变量,这样就可以通过bootargs把自己想要的环境变量传给内核了,驱动中再用__setup函数来处理具体操作,具体代码如下:

uboot部分代码:

char *pInfo = getenv("ledflash");//添加一个环境变量,如果不存在就默认设置它if(pInfo == NULL) {    UBOOT_DEBUG("No env 'ledflash'\n");    setenv("ledflash","1");    saveenv();    pInfo = getenv("ledflash");}//根据环境变量的值,在bootargs参数中添加相应的值if(strcmp(pInfo,"1") == 0) {    set_bootargs_cfg("ledflash","ledflash=1",0);}else if(strcmp(pInfo,"0") == 0) {    set_bootargs_cfg("ledflash","ledflash=0",0);}

led驱动部分代码:

#define LED_GPIO 22extern void MDrv_GPIO_Pull_Low(U8 u8IndexGPIO);extern void MDrv_GPIO_Pull_High(U8 u8IndexGPIO);static bool led_flash_enabled;//判断环境变量值的函数static int __init set_led_flash(char *str) {    if (strcmp(str,"1") == 0) {                led_flash_enabled = true;        return 1;    }    else if (strcmp(str,"0") == 0) {        led_flash_enabled = false;        return 0;    }   }//添加setup函数来获取bootargs传递的参数__setup("ledflash=", set_led_flash);static void mstar_led_brightness_set(struct led_classdev *cdev,                          enum led_brightness brightness) {    if (brightness) {        //根据led_flash_enabled的值来决定是否闪灯        if (led_flash_enabled) {            MDrv_GPIO_Pull_High(LED_GPIO);        }        else {            MDrv_GPIO_Pull_Low(LED_GPIO);        }    }    else        MDrv_GPIO_Pull_Low(LED_GPIO);}static struct led_classdev mstar_led = {    .name = "mstarled",    .brightness_set = mstar_led_brightness_set,    .default_trigger = "heartbeat",};static int __devinit mstar_led_probe(struct platform_device *pdev) {    int ret = led_classdev_register(&pdev->dev, &mstar_led);    if (ret < 0) {        dev_err(&pdev->dev, "led_classdev_register failed\n");        return ret;    }    return 0;}static int __devexit mstar_led_remove(struct platform_device *pdev) {    led_classdev_unregister(&mstar_led);    return 0;}static struct platform_driver mstar_led_driver = {    .probe = mstar_led_probe,    .remove = __devexit_p(mstar_led_remove),    .driver = {        .name = "Mstar-leds",        .owner = THIS_MODULE,    },};static int __init mstar_led_init(void) {    pr_info("mstar led driver init\n");    return platform_driver_register(&mstar_led_driver);}static void __exit mstar_led_exit(void) {    platform_driver_unregister(&mstar_led_driver);}module_init(mstar_led_init);module_exit(mstar_led_exit);MODULE_ALIAS("platform:mstar_device_led");MODULE_LICENSE("GPL");MODULE_DESCRIPTION("User LED support for mstar");MODULE_AUTHOR("RockLee");

剩下就是在菜单中根据开关选项调用接口来设置ledflash这个环境变量了

1 0
原创粉丝点击