Linux设备驱动开发详解

uboot传递参数到内核

一.uboot添加自定义参数number

在uboot命令行下,我通过setenv bootargs以及saveenv命令来在bootargs参数中添加自己的一个参数,例如:

setenv bootargs xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx number=${num}
setenv num 0
saveenv

其中bootargs前面部分省略,number为在原bootargs后添加的参数,它会去取num的值,因此以后只要修改num的值即可(这里先设置为0)

    
二.kernel读取uboot传入的参数number:

在想要取得uboot传入参数的文件中进行如下操作:

1.添加头文件:
#include <linux/init.h>

2.添加如下内容:
static unsigned int number;
static int __init number_setup (char *num)
{
   number = *num - '0';
}
__setup("number=", number_setup);
  
  宏__setup("number=", number_setup)会在bootargs中取得"number="后的值作为函数number_setup的参数num,因此只要在number_setup函数中用全局变量number接收该值即可(此处我将传入的值作为数字处理)。

GPIO子系统

驱动使用

定义设备树

gpioled {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "atkalpha-gpioled";
    pinctrl-names = "default";
    pinctrl-0 = <&pinctrl_led>;
    led-gpio = <&gpio1 3 GPIO_ACTIVE_LOW>;
    status = "okay";
};

驱动使用

of_get_named_gpio(leddev.node, "led-gpio", 0);

gpio_request(leddev.led0, "led0");
gpio_direction_output(leddev.led0, 1);

gpio_set_value(leddev.led0, 0);

 

pinctrl子系统

 

驱动使用

定义设备树

&pinctrl@11000000 {
        led_demo: led{
                samsung,pins = "gpm4-0", "gpm4-1" ,"gpm4-2", "gpm4-3";
                samsung,pin-function = <0x1>;   //1为输出
                samsung,pin-pud = <0x0>;        //没有上拉
                samsung,pin-drv = <0x0>;        //驱动强度?
        };
}; 
led_pin {
    compatible         = "tiny4412,led_demo";
    pinctrl-names = "led_demo";
    pinctrl-0 = <&led_demo>;
    tiny4412,int_gpio1 = <&gpm4 0 GPIO_ACTIVE_HIGH>;
    tiny4412,int_gpio2 = <&gpm4 1 GPIO_ACTIVE_HIGH>;
    tiny4412,int_gpio3 = <&gpm4 2 GPIO_ACTIVE_HIGH>;
    tiny4412,int_gpio4 = <&gpm4 3 GPIO_ACTIVE_HIGH>;
};

驱动使用

如果 pinctrl-names 为 “default”,那么这种功能状态将设置为默认的引脚状态,代码中无需处理。

pctrl = devm_pinctrl_get(dev);

pstate = pinctrl_lookup_state(pctrl, "led_demo");

pinctrl_select_state(pctrl, pstate);//设置为输出模式

printk("enter %s\n",__func__);
led1 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio1", 0);;
led2 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio2", 0);;
led3 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio3", 0);;
led4 = of_get_named_gpio(dev->of_node, "tiny4412,int_gpio4", 0);;

devm_gpio_request_one(dev, led1, GPIOF_OUT_INIT_HIGH, "LED1");
devm_gpio_request_one(dev, led2, GPIOF_OUT_INIT_HIGH, "LED2");
devm_gpio_request_one(dev, led3, GPIOF_OUT_INIT_HIGH, "LED3");
devm_gpio_request_one(dev, led4, GPIOF_OUT_INIT_HIGH, "LED4");

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值