AM4378 uboot lcd pin初始化

本文介绍了如何在U-Boot 2013版本中通过配置AM43XX平台的LCD背光引脚来实现LCD关闭功能。主要涉及对mux.c文件中lcd_bl_mux结构的修改,以及board.c中添加初始化函数lcd_bl_init来设置LCD背光引脚为低电平。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. uboot中要把LCD关闭,lcd的 EN引脚默认配置为low即可。 

uboot-2013版本

./board/ti/am43xx/mux.c

static struct module_pin_mux lcd_bl_mux[] = {
    //{0x800 + 0x164, (MODE(7))}, /* LCD backlight control */
    {0x800 + 0x164, (MODE(0))}, /* LCD backlight control */
    {0x800 + 0x1d4, (MODE(7))}, /* EN BACKLIGHT */
    {-1},

};


void enable_lcdbl_pin_mux(void)
{
configure_module_pin_mux(lcd_bl_mux);

}

2. ./board/ti/am43xx/board.c

在int board_init(void) 最后加上

lcd_bl_init();

static void lcd_bl_init(void)
{
#define GPIO0_BASE 0x44E07000
#define GPIO0_CTRL (GPIO0_BASE + 0x130)
#define GPIO0_OE (GPIO0_BASE + 0x134)
#define GPIO0_CLRDATAOUT (GPIO0_BASE + 0x190)
#define GPIO0_SETDATAOUT (GPIO0_BASE + 0x194)


#define GPIO4_BASE 0x48320000
#define GPIO4_CTRL (GPIO4_BASE + 0x130)
#define GPIO4_OE (GPIO4_BASE + 0x134)
#define GPIO4_CLRDATAOUT (GPIO4_BASE + 0x190)
#define GPIO4_SETDATAOUT (GPIO4_BASE + 0x194)
enable_lcdbl_pin_mux();

/* Enable module */
writel(readl(GPIO0_CTRL)&~(0x1), GPIO0_CTRL);
/* Set output LOW */
//writel(0x1<<7, GPIO0_CLRDATAOUT);

writel(0x1<<7, GPIO0_SETDATAOUT);

/* Set output enable */
writel(readl(GPIO0_OE)&~(0x1<<7), GPIO0_OE);
/* Set output LOW again */
//writel(0x1<<7, GPIO0_CLRDATAOUT);
writel(0x1<<7, GPIO0_SETDATAOUT);

printf("James lcd off %s\n", __func__);
}


<think>我们正在讨论U-Boot中eMMC卡的初始化流程。根据之前的引用,我们知道U-Boot在启动过程中会涉及到从外部存储介质(如eMMC)加载镜像。现在,用户想了解eMMC卡的初始化流程。根据引用[3]:芯片上电后,ROMCode执行,然后根据启动模式从外部介质(包括eMMC)中加载SPLuboot(16k)到IRAM中运行。之后,SPLuboot初始化更复杂的硬件环境,并加载完整的U-Boot。在U-Boot中,eMMC的初始化通常发生在板级初始化阶段,由特定的驱动完成。eMMC初始化的主要步骤包括:1.初始化eMMC控制器(通常位于SoC内部)2.初始化eMMC设备(包括识别设备、设置工作模式等)3.建立与eMMC设备的通信,读取设备信息(如CID、CSD等)4.设置设备的工作频率、总线宽度等5.如果需要,进行分区设置(如eMMC的硬件分区:boot分区、RPMB分区、用户分区等)具体到U-Boot代码,通常会在板级初始化函数中调用MMC子系统的初始化函数。例如,在U-Boot的启动流程中,会调用`board_init()`函数,其中可能会包含对`mmc_initialize()`的调用。让我们参考U-Boot的代码结构来说明:-在`board_init_f`(U-Boot的第一阶段)之后,进入`board_init_r`(第二阶段),在这个阶段会初始化各种外设,包括MMC。-在`board_init_r`中,会调用`initr_mmc`函数,该函数会进一步调用`mmc_initialize`来初始化MMC控制器和卡。具体步骤:1.`mmc_initialize`函数会遍历当前系统中注册的MMC控制器(如sdhci等),并对每个控制器进行初始化。2.对于每个控制器,它会尝试探测连接的eMMC设备(通过发送CMD0、CMD1等命令进行初始化)。3.在探测过程中,会读取eMMC的OCR(操作条件寄存器)以确认电压范围,然后读取CID、CSD等寄存器获取设备信息。4.设置eMMC的工作频率(通过CMD6切换高速模式)和总线宽度(4位或8位)。5.如果eMMC有多个分区,U-Boot通常只访问用户分区,但也可以配置为访问boot分区(用于引导)。此外,在U-Boot中,eMMC的初始化还涉及到设备树的解析(如果使用设备树的话)。设备树中会描述eMMC控制器的寄存器基址、时钟、总线宽度等属性。下面是一个简化的代码流程示例(基于U-Boot的常见实现):```c/*在initr_mmc函数中*/intinitr_mmc(void){/*初始化MMC子系统*/mmc_initialize(gd->bd);return0;}/*mmc_initialize函数会调用到具体的控制器驱动*/voidmmc_initialize(bd_t*bis){structmmc*mmc;//遍历MMC控制器列表for(inti=0;;i++){mmc=find_mmc_device(i);//获取第i个MMC设备if(!mmc)break;mmc_init(mmc);//初始化这个MMC设备}}/*mmc_init函数负责具体的初始化流程*/intmmc_init(structmmc*mmc){//1.复位设备//2.发送初始化序列(CMD0,CMD1等)//3.获取OCR,验证电压//4.发送CID、CSD命令获取设备信息//5.设置设备为传输状态//6.设置总线宽度和频率//...具体步骤}```注意:不同SoC的驱动实现可能有所不同,但基本流程遵循eMMC规范。另外,在SPL阶段(如果使用的话),eMMC的初始化可能会更简化,因为SPL只需要加载下一阶段(如U-Boot完整版)的镜像。总结:U-Boot中eMMC卡的初始化流程主要包括控制器初始化、设备探测、设备信息获取和设置工作参数等步骤,这些步骤由MMC子系统驱动完成。根据用户提供的引用[1]和[4],我们还可以知道,在eMMC初始化完成后,U-Boot会使用环境变量(如`bootcmd`)来从eMMC中读取内核镜像并启动。§§相关问题§§1.U-Boot中如何配置eMMC的boot分区?2.eMMC初始化失败的可能原因有哪些?3.如何通过U-Boot命令手动初始化eMMC设备?</think>### U-Boot中eMMC卡的初始化流程 在U-Boot中,eMMC卡的初始化是一个多阶段过程,主要涉及硬件控制器初始化、设备识别和配置。以下是关键步骤: #### 1. **硬件控制器初始化** - **控制器驱动加载**:U-Boot首先初始化SoC内部的eMMC控制器(如SDHCI或OMAP_HSMMC),设置时钟频率、电压和总线宽度(4位或8位)。 ```c // 示例:OMAP HSMMC控制器初始化 struct mmc *mmc = find_mmc_device(0); if (mmc) omap_hsmmc_init(mmc); ``` - **引脚复用配置**:通过设备树或硬编码配置eMMC相关的GPIO引脚复用功能。 #### 2. **设备识别与通信建立** - **CMD0(复位)**:发送复位命令使eMMC进入空闲状态。 - **CMD1(初始化)**:发送操作条件(OCR)验证工作电压范围(2.7V-3.6V)。 - **CID/CSD读取**:通过CMD2、CMD3获取设备标识(CID)和卡特定数据(CSD),确定容量和时序参数[^3]。 #### 3. **工作模式配置** - **总线宽度切换**:使用CMD6将总线宽度从默认1位切换到4/8位模式。 - **高速模式切换**:通过CMD6启用HS200/HS400高速模式(需控制器支持)。 - **分区选择**:配置eMMC的硬件分区(BOOT、RPMB、用户分区),通常默认访问用户分区。 #### 4. **数据传输准备** - **设置块长度**:通过CMD16设置读写块大小(通常512字节或4KB)。 - **初始化DMA**:配置控制器DMA引擎以实现高效数据传输。 #### 5. **SPL阶段特殊处理** 在SPL(Secondary Program Loader)阶段: - 仅初始化必要功能(如读取BOOT分区)。 - 从eMMC加载完整U-Boot到DRAM: ```c // SPL加载U-Boot镜像 mmc_init(mmc); mmc_load_image_raw(mmc, CONFIG_SYS_MMC_U_BOOT_OFFSECT); ``` #### 6. **完整U-Boot阶段** - **环境变量读取**:从`mmc dev`设置的设备中加载`uEnv.txt`或环境分区。 - **命令支持**:启用`mmc read`、`mmc write`等命令,为内核启动做准备[^1]。 ```mermaid graph TD A[SoC上电] --> B[ROM Code加载SPL] B --> C[SPL初始化eMMC控制器] C --> D[识别eMMC设备] D --> E[配置总线/高速模式] E --> F[加载完整U-Boot到DRAM] F --> G[完整U-Boot重初始化eMMC] G --> H[准备内核加载] ``` ### 常见问题排查 若初始化失败: 1. 检查电压/时钟配置是否匹配eMMC规范 2. 验证GPIO复用设置是否正确 3. 确认设备树中`mmc`节点与硬件匹配 4. 使用`mmc info`命令查看设备状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值