高通lk阶段设置gpio

本文详细介绍了在高通平台上如何使用gpio_tlmm_config()函数进行GPIO初始化,并通过gpio_set_dir()函数设置高低电平。特别指出gpio_tlmm_config()函数中enable参数用于设置输入输出模式,而非通常认为的dir参数。

一、前言

高通平台,硬件同事让我在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);//设置输出高电平
<think>我们正在讨论MTK平台的LK阶段GPIO初始化的函数。根据引用内容,特别是引用[2]中提到的,MTK的LK阶段GPIO初始化涉及两个地方:DWS配置文件和LK代码中的初始化函数。 首先,引用[2]提到: - DWS文件(DesignWare Script)用于配置GPIO的初始状态(如上拉/下拉、方向等),在preloader、LK和kernel中都会使用。 - 在LK中,具体的GPIO初始化代码位于`init.c`(针对特定工程)和`mt_gpio.c`(平台通用GPIO驱动)中。 其次,引用[3]虽然是针对高通平台的,但它展示了在LK配置GPIO的典型函数调用: - `gpio_tlmm_config()`用于配置GPIO的模式、上下拉、驱动能力等。 - `gpio_set_dir()`用于设置GPIO的方向和输出电平。 对于MTK平台,根据引用[2]的描述,LKGPIO的初始化函数应该在`mt_gpio.c`中定义。常见的函数可能是: - `mt_set_gpio_mode(gpio_no, mode)`: 设置GPIO的模式(GPIO模式或其他功能模式) - `mt_set_gpio_dir(gpio_no, dir)`: 设置方向(0为输入,1为输出) - `mt_set_gpio_pull_enable(gpio_no, enable)`: 使能上拉/下拉 - `mt_set_gpio_pull_select(gpio_no, pull_type)`: 选择上拉或下拉(上拉为GPIO_PULL_UP,下拉为GPIO_PULL_DOWN) - `mt_set_gpio_out(gpio_no, level)`: 设置输出电平(0为低,1为高) 同时,在特定工程的`init.c`文件中,通常在`target_early_init()`或`target_init()`函数中会进行GPIO的初始化。 因此,在MTK的LK阶段初始化GPIO的主要函数包括: 1. `mt_set_gpio_mode()`: 设置GPIO模式 2. `mt_set_gpio_dir()`: 设置方向 3. 设置上下拉和输出电平的函数。 注意:函数的具体名称可能因平台和LK版本略有不同,但基本功能相似。 下面是一个在MTK LK中初始化GPIO的示例代码(通常放在`target/项目名/init.c`的`target_init()`或`target_early_init()`函数中): ```c #include <mt_gpio.h> #include <platform/mt_gpio_core.h> // 可能需要包含的头文件 void target_early_init(void) { // 配置GPIO10为输出模式,初始输出高电平 mt_set_gpio_mode(10, GPIO_MODE_00); // 设置GPIO模式 mt_set_gpio_dir(10, GPIO_DIR_OUT); // 输出方向 mt_set_gpio_pull_enable(10, GPIO_PULL_DISABLE); // 禁用上下拉 mt_set_gpio_out(10, GPIO_OUT_ONE); // 输出高电平 } ``` 另外,引用[2]强调,除了LK代码中的设置,还要检查DWS文件配置,因为DWS配置会在更早阶段(如preloader)设置GPIO,可能会被LK重新配置。 综上所述,在MTK平台的LK阶段,初始化GPIO的主要函数是`mt_set_gpio_*`系列函数,定义在`mt_gpio.c`中。 现在我们可以生成相关问题: </think>在MTK平台的LK(Little Kernel)阶段GPIO初始化主要通过以下核心函数实现: ### 一、GPIO初始化关键函数 1. **基本配置函数** 位于`vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mtXXXX/mt_gpio.c`: ```c /* 设置GPIO工作模式 */ void mt_set_gpio_mode(UINT32 pin, GPIO_MODE mode); /* 设置GPIO方向 */ void mt_set_gpio_dir(UINT32 pin, GPIO_DIR dir); /* 设置GPIO输出电平 */ void mt_set_gpio_out(UINT32 pin, GPIO_OUT out); ``` 示例配置: ```c mt_set_gpio_mode(15, GPIO_MODE_00); // 设置GPIO15为基本IO模式 mt_set_gpio_dir(15, GPIO_DIR_OUT); // 设置为输出 mt_set_gpio_out(15, GPIO_OUT_ONE); // 输出高电平 ``` 2. **上拉/下拉配置** 用于控制内部电阻状态: ```c void mt_set_gpio_pull_enable(UINT32 pin, BOOL enable); void mt_set_gpio_pull_select(UINT32 pin, GPIO_PULL pull); ``` 示例: ```c mt_set_gpio_pull_enable(15, TRUE); // 启用上拉 mt_set_gpio_pull_select(15, GPIO_PULL_UP); // 选择上拉模式 ``` ### 二、初始化执行位置 在工程目录的初始化文件中调用(路径示例): ```c // vendor/mediatek/proprietary/bootable/bootloader/lk/target/<project>/init.c void target_early_init(void) { // GPIO初始化代码 mt_set_gpio_mode(15, GPIO_MODE_00); mt_set_gpio_dir(15, GPIO_DIR_OUT); ... } ``` ### 三、配置优先级说明 1. **HW DWS配置** 硬件描述文件(.dws)中的默认配置会首先加载,定义: ```plaintext defmod = 0 // GPIO模式 pull_en = 1 // 上拉使能 pull_sel = 1 // 上拉方向(1=上拉,0=下拉) dataout = 0 // 初始输出电平 ``` 2. **LK代码覆盖** LK阶段的`mt_set_gpio_*`函数会覆盖DWS配置[^2] ### 四、调试建议 添加调试日志验证配置: ```c dprintf(INFO, "GPIO%d Mode:%d Dir:%d Out:%d\n", pin, mt_get_gpio_mode(pin), mt_get_gpio_dir(pin), mt_get_gpio_out(pin)); ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值