高通lk阶段设置gpio

一、前言

高通平台,硬件同事让我在lk阶段去控制一个gpio模拟时序,通过查询,发现可通过gpio_tlmm_config()函数实现初始化,gpio_set_dir()设置高低电平。但是其中有两个地方折磨了我整整一天,记录一下,如果有错误,请指正

二、函数介绍

gpio_tlmm_config(uint32_t gpio,uint8_t func, uint8_t dir, uint8_t pull, uint8_t drvstr, uint32_t enable)函数在platform目录下,这个函数一定要注意!!:

设置gpio为普通Io时,输出或者输入的设置参数不是第三个 dir,而是最后一个 enable,DISABLE为输出,ENABLE为输入。dir函数在函数中根本没有调用,他就是个无效的参数,怎么设置都不影响。

剩下的就是正常参数,第一个为gpio号,比如gpio50,就为50(这个编号好像不一定,自己根据自己的平台确认一下);

第二个参数时设置IO的功能,0就为普通IO,也可以设置SPI、IIC之类的。

第四个参数为上下拉,输出为不拉(no pull),输入时上下拉要根据硬件写。

第五个参数为驱动强度,这个一般会有相应的文档描述,不同的gpio驱动强度不同。比如我这个平台。gpio50的驱动强度就是8mA

第六个参数,设置使能,或者输入输出。

void gpio_tlmm_config(uint32_t gpio,uint8_t func,
                     uint8_t dir, uint8_t pull,
                     uint8_t drvstr, uint32_t enable)
{
       uint32_tval = 0;
 
       val|= pull;
       val|= func << 2;
       val|= drvstr << 6;
       val|= enable << 9;//如果func=0,enable=1为输出,enable=0为输出
 
       writel(val,(uint32_t *)GPIO_CONFIG_ADDR(gpio));
       return;
}

设置高低电平函数 ,gpio_set_dir()函数,看函数名字,以为是设置方向的,但是没想到是设置高低电平的,唉,让我自我怀疑了很久。也有很多平台的设置高低电平函数为gpio_set(),函数参数和内容都是一样的,只有名字不一样。

第一个参数时gpio编号,

第二个参数为2时输出高,0时输出低。之所以这样设置,是因为GPIO_IN_OUT寄存器的两位,0位为GPIO_OUT,控制输出状态设置,1位为GPIO_IN使能当前IO是否可读。当设置输出高电平时,寄存器的值为二进制10,等于十进制2,低电平为00,等于十进制0。

void gpio_set_dir(uint32_t gpio, uint32_t dir)
{
	writel(dir, (uint32_t *)GPIO_IN_OUT_ADDR(gpio));

	return;
}

三、使用例子

gpio_tlmm_config(50, 0, GPIO_OUTPUT, GPIO_NO_PULL,

    GPIO_8MA, GPIO_DISABLE);//设置GPIO50为输出模式

gpio_set_dir(50, 2);//设置输出高电平
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是高通 MSM8953 SoC 上使用 DTS(Device Tree Source)描述的 GPIO 驱动实例: ``` &tlmm { gpio_keys: gpio-keys { compatible = "gpio-keys"; #address-cells = <1>; #size-cells = <0>; pinctrl-names = "default"; pinctrl-0 = <&button_pins>; status = "okay"; button@4 { label = "power"; gpios = <&tlmm 4 GPIO_ACTIVE_LOW>; linux,code = <KEY_POWER>; debounce-interval = <50>; gpio-key,wakeup; gpio-key,wakeup-source; }; button@3 { label = "volume_up"; gpios = <&tlmm 3 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEUP>; debounce-interval = <50>; }; button@2 { label = "volume_down"; gpios = <&tlmm 2 GPIO_ACTIVE_LOW>; linux,code = <KEY_VOLUMEDOWN>; debounce-interval = <50>; }; }; button_pins: button_pins { pins = "gpio4", "gpio3", "gpio2"; function = "gpio_in"; drive-strength = <2>; bias-disable; }; }; ``` 在上面的示例中,我们定义了一个名为“gpio_keys”的节点,它表示一个 GPIO 按键设备。在该节点下,我们定义了三个名为“button@*”(*表示数字)的子节点,它们分别表示三个按键。每个按键节点都指定了其使用的 GPIO 引脚编号,所以我们需要在该文件中定义一个名为“button_pins”的节点,它表示我们将使用哪些 GPIO 引脚。在“button_pins”节点中,我们指定了使用 GPIO 引脚 2、3 和 4,它们的功能为“gpio_in”,表示我们将使用它们作为输入引脚,而不是输出引脚。最后,我们指定了每个按键的 Linux 按键代码(即在 Linux 内核中定义的按键码)、抖动时间和唤醒源等属性。 当系统启动时,内核会根据设备树中的 GPIO 配置自动加载相应的 GPIO 驱动程序。在本例中,内核将加载“gpio-keys”驱动程序,并将其绑定到我们定义的“gpio_keys”节点上。这样,我们就可以在 Linux 系统中使用这三个按键了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值