u-boot移植之mmc,网卡配置

本文介绍了在MX6系列CPU(如MX6q、MX6d、MX6s、MX6ul)上进行u-boot移植的过程,特别是针对MX6s的定制。通过freescale的git获取源码,无需修改即可初步启动。然而,mmc和net设备识别存在问题。文章详细阐述了如何配置mmc设备,包括识别两个mmc设备(uSDHC1和uSDHC2),以及针对emmc缺少检测管脚的解决方法。此外,还涉及了网卡(ATHEROS8031)的配置,确保其在RGMII模式下工作,并配置了网络参数以实现自动加载boot。经过这些步骤,成功实现了u-boot在目标平台上的正常运行。

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

最近做的一个产品是用的mx6系列cpu,包括6q、6d、6s、6ul,有已经移植好的成品6q的u-boot,但是只兼容6d,并不兼容6s,所以需要为6s量身打造一个u-boot。


首先,需要下载u-boot:

    笔者尝试过Yocto,LTIB,以及手动打补丁的方式全部以失败告终,还顺手写了一篇Yocto的安装说明。

    最后笔者是通过fresscale的git下载的最新的u-boot源码,竟然不用修改就能起了,而且mx6dl和mx6s是兼容的,不得不说fresscale的git还是靠谱啊!!

    这里会给出所用的u-boot源码的下载方法:

#git clone http://git.freescale.com/git/cgit.cgi/imx/uboot-imx.git -b imx_v2015.04_3.14.52_1.1.0_ga

配置及编译:

#make mx6solosabreauto_defconfig
#make

这里采用的是mx6solosabreauto_defconfig配置u-boot,根据顶层Makefile,以及配置文件内容可以知道其实这个配置文件用的还是mx6qsabreauto.c和mx6qsabreauto.h。所以后文修改的便是这两个文件。


烧写u-boot到sd卡:

#dd if=u-boot.imx of=/dev/sdb bs=512 seek=2 conv=fsync

下载的源码编译后直接烧写到sd卡,能够启动,但是mmc和net设备识别出错,这也是这篇文章重点要讲的地方。


MMC:

    先是有关于mmc的内容。根据原理图可以知道一共采用了一块emmc,加上sd卡,便是两个mmc设备。

笔者所用的板子支持最多3块mmc设备,本文中只用到了两个,uSDHC1为SD卡,uSDHC2没有被使用,uSDHC3是板子上的emmc。

根据原理图,寻找mmc设备的检测管脚:

    在原理图中寻找SDx_CDn的管脚,其中x代表1.2.3。最后之发现了一个SD1_CDn,再找到引出的GPIO口,笔者的SD卡检测口为GPIO1_IO0,emmc并没有检测管脚。

了解了管脚的使用之后开始配置管脚。

mx6qsabreauto.c
#define USDHC1_CD_GPIO	IMX_GPIO_NR(1, 0)
//#define USDHC3_CD_GPIO	IMX_GPIO_NR(6, 15)

找到这两行,第一行改为(1,0),第二行并没有用到,直接注释掉。


由于emmc没有检测管脚,所以需要更改检测检测管脚的函数使emmc能顺利被初始化(有点拗口):

int board_mmc_getcd(struct mmc *mmc)
{
	struct fsl_esdhc_cfg *cfg = (struct fsl_esdhc_cfg *)mmc->priv;
	int ret = 0;

	switch (cfg->esdhc_base) {
	case USDHC1_BASE_ADDR:
		gpio_direction_input(USDHC1_CD_GPIO);
		ret = !gpio_get_value(USDHC1_CD_GPIO);
		break;
	case USDHC3_BASE_ADDR:
//		gpio_direction_input(USDHC3_CD_GPIO);
//		ret = !gpio_get_value(USDHC3_CD_GPIO);
		ret = 1 ;
		break;
	}

	return ret;
}

注释掉原来的两行代码,直接将ret赋值为1,表示强制认为该设备已经存在。


到此处时再编译下载已经能够识别mmc设备了,u-boot下mmc dev [port]切换设备,mmcinfo查看设备信息。


NET:

    接下来就是网卡的配置,先看好网卡的型号,笔者所用的是ATHEROS8031的网卡,根据原理图知道默认是RGMII模式。

mx6qsabreauto.h
#define CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_CMD_NET
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_PHYLIB
#define CONFIG_PHY_ATHEROS
#define IMX_FEC_BASE          			ENET_BASE_ADDR
#define CONFIG_FEC_XCV_TYPE       		RGMII
#define CONFIG_ETHPRIME           		"FEC"
#define CONFIG_FEC_MXC_PHYADDR    		1
#define CONFIG_ETHADDR 				CONFIG_ENET_ETHADDR
#define CONFIG_NETMASK 				CONFIG_ENET_NETMASK
#define CONFIG_IPADDR 				CONFIG_ENET_IPADDR
#define CONFIG_SERVERIP 			CONFIG_ENET_SERVERIP
#define CONFIG_GATEWAYIP			CONFIG_EMMC_GATEWAYIP

上述代码是对网卡型号,模式的定义,原来的mx6qsabreauto.h文件是没有网卡的宏定义的,这里需要都补上。


由于板子是自动从网络加载boot的,所以还需要配置网关等。

mx6qsabreauto.h
#define CONFIG_ENET_ETHADDR		12:34:56:78:9A:BC
#define CONFIG_ENET_IPADDR		192.168.1.180
#define CONFIG_ENET_SERVERIP		192.168.1.178	
#define CONFIG_EMMC_GATEWAYIP		192.168.1.1
#define CONFIG_ENET_NETMASK		255.255.255.0
#define CONFIG_ARP_TIMEOUT     		200UL

到这里,头文件的添加已经完成。


mx6qsabreauto.c
static iomux_v3_cfg_t const enet_pads[] = {
	MX6_PAD_KEY_COL1__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_KEY_COL2__ENET_MDC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TXC__RGMII_TXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD0__RGMII_TD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD1__RGMII_TD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD2__RGMII_TD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD3__RGMII_TD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RXC__RGMII_RXC	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD0__RGMII_RD0	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD1__RGMII_RD1	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD2__RGMII_RD2	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD3__RGMII_RD3	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_GPIO_16__ENET_REF_CLK		| MUX_PAD_CTRL(ENET_PAD_CTRL),
};

这是没改之前的管脚配置,需要根据原理图更改:

mx6qsabreauto.c
static iomux_v3_cfg_t const enet_pads[] = {
	/* Tx */
	MX6_PAD_RGMII_TXC__RGMII_TXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD0__RGMII_TD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD1__RGMII_TD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD2__RGMII_TD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TD3__RGMII_TD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_TX_CTL__RGMII_TX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	/* Rx */
	MX6_PAD_RGMII_RXC__RGMII_RXC		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD0__RGMII_RD0		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD1__RGMII_RD1		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD2__RGMII_RD2		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RD3__RGMII_RD3		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_RGMII_RX_CTL__RGMII_RX_CTL	| MUX_PAD_CTRL(ENET_PAD_CTRL),
	/* Phy */
	MX6_PAD_ENET_MDIO__ENET_MDIO		| MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET_MDC__ENET_MDC			| MUX_PAD_CTRL(ENET_PAD_CTRL),
	/* Ref clock*/
	MX6_PAD_ENET_REF_CLK__ENET_TX_CLK	| MUX_PAD_CTRL(ENET_PAD_CTRL),
};

重点是MDIO和MDC两个管脚的配置,其他都没变。


改完管脚配置之后,网卡也能够识别了。到此,大功告成!



<think>好的,用户问的是关于U-Boot移植和Linux内核裁剪的面试回答,需要我帮忙整理这方面的知识点。首先,我需要回想一下U-Boot移植的基本流程,可能包括硬件适配、配置编译、调试启动这些步骤。然后内核裁剪的话,应该涉及配置选项、模块化处理、优化启动这些方面。用户可能是在准备嵌入式开发相关的面试,所以需要重点突出实际操作的步骤和常见问题。 接下来,我需要确认自己是否对这两个主题有足够的了解。U-Boot移植部分,硬件适配需要了解目标板的CPU架构、外设驱动,比如时钟、串口、网卡等。然后是修改配置文件,比如板级支持包,可能需要调整链接脚本、初始化代码。编译过程中可能会有交叉编译工具链的问题,需要正确设置环境变量。调试阶段可能会用到串口输出,或者JTAG工具,处理启动失败的问题,比如DDR初始化不正确,时钟配置错误等。 关于Linux内核裁剪,首先要知道配置工具,比如make menuconfig,如何通过图形界面选择需要的驱动和功能。裁剪的核心是去掉不需要的模块和功能,比如不用的文件系统、网络协议、设备驱动。同时要保持系统的基本功能,比如必要的驱动和进程管理。模块化处理可以把一些驱动编译成模块,减少内核体积。优化启动时间可能需要调整初始化顺序,延迟加载某些模块,或者去除冗余的检测步骤。 用户可能需要具体的例子,比如在裁剪内核时如何选择配置选项,或者U-Boot移植中遇到具体问题如何解决。另外,面试中可能会问及实际项目经验,需要准备一些案例,说明自己如何进行移植和裁剪,遇到的问题和解决方法。 还要注意回答的结构,分点说明,让面试官容易抓住重点。比如先介绍U-Boot移植的步骤,再讲内核裁剪的方法,最后总结两者的关联和注意事项。可能还需要对比不同版本之间的差异,比如U-Boot版本升级带来的变化,或者内核配置选项的不同。 需要检查是否有遗漏的关键点,比如U-Boot的环境变量设置,启动参数传递,内核的启动过程,以及根文件系统的配合。另外,裁剪后的测试方法也很重要,比如如何验证系统功能正常,性能是否达标,稳定性测试等。 可能用户还希望了解常用的工具和命令,比如mkimage制作内核镜像,如何配置启动脚本,使用initramfs还是直接挂载根文件系统。在裁剪内核时,如何通过.config文件进行配置,依赖关系如何处理,避免裁剪过度导致系统无法启动。 最后,需要确保回答简洁明了,技术点准确,避免错误。可能还需要提到相关的调试工具,比如printk调试内核,U-Boot中的md命令查看内存,以及如何利用日志信息排查问题。</think>以下是对U-Boot移植和Linux内核裁剪的技术要点总结,适合作为面试回答的参考框架: --- ### 一、U-Boot移植核心步骤 1. **硬件适配** - 确认CPU架构(ARM/MIPS/RISC-V等)及具体型号 - 添加/修改板级支持文件(board/目录下对应板级代码) - 配置时钟、DDR控制器、串口等基础外设驱动 - 示例:为新板添加`board/myboard/myboard.c`及对应Kconfig 2. **编译配置** ```bash make <board_name>_defconfig # 选择最接近的默认配置 make menuconfig # 图形化配置界面 CROSS_COMPILE=arm-linux-gnueabihf- make ``` 3. **启动流程调试** - 通过串口输出定位问题阶段: ``` U-Boot SPL 2023.07 ... # 说明SPL阶段正常 DRAM: 512 MiB # DDR初始化成功 MMC: mmc@48060000: 0 # 存储设备检测 ``` 4. **典型问题处理** - DDR参数错误:表现为启动卡在DRAM初始化阶段 - 时钟配置错误:系统运行频率异常导致外设失效 - 环境变量存储:正确配置`CONFIG_ENV_OFFSET`和存储介质类型 --- ### 二、Linux内核裁剪实践 1. **配置体系** - 配置工具链: ```bash make ARCH=arm menuconfig ``` - 关键配置维度: - 处理器类型(CPU_SUBTYPE) - 设备驱动(仅保留目标硬件所需) - 文件系统支持(ext4/yaffs2等) - 网络协议栈裁剪 2. **裁剪策略** ```bash # 查看当前配置差异 diff .config arch/arm/configs/my_defconfig # 典型精简操作 CONFIG_INPUT_TOUCHSCREEN=n # 移除触摸屏驱动 CONFIG_SOUND=n # 禁用音频子系统 CONFIG_DEBUG_KERNEL=n # 关闭调试信息(生产环境) ``` 3. **模块化处理** ```makefile # 驱动编译为模块示例 CONFIG_USB=m # 编译为USB模块 CONFIG_USB_STORAGE=m # USB存储子模块 ``` 4. **启动优化** - 缩短内核解压时间:使用LZO压缩替代gzip - 减少控制台日志输出级别:`loglevel=3`启动参数 - 延迟初始化:将非关键驱动改为模块按需加载 --- ### 三、关联技术要点 1. **U-Boot与内核的衔接** - 正确传递启动参数(bootargs): ```bash setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2' ``` - 镜像格式验证:确保内核镜像类型(zImage/uImage/fitImage)匹配 2. **系统完整性验证** - 启动时间测量:`bootchart2`工具分析启动过程 - 存储空间对比:原始内核(15MB) vs 裁剪后(3.5MB) - 稳定性测试:连续72小时压力测试(内存/存储/网络) --- ### 四、高频面试问题示例 1. **Q:如何确定某个驱动是否可以裁剪?** A:通过`make menuconfig`查看驱动依赖关系(按"?"键),结合`lsmod`查看运行系统实际加载的模块 2. **Q:U-Boot移植时出现`undefined reference`错误如何处理?** A:检查交叉编译工具链版本一致性,确认链接脚本中段定义与代码匹配 3. **Q:内核裁剪后网络功能异常的可能原因?** A:逐级检查协议栈配置(PHY驱动->MAC驱动->TCP/IP协议->应用层支持--- ### 五、项目经验描述建议 ```markdown 某工业控制器项目(ARM Cortex-A8): 1. 完成U-Boot从v2018.05到v2023.07的升级移植 - 解决新版本移除legacy API的兼容性问题 - 优化SPL阶段从8秒缩短至1.2秒 2. 内核从4.19裁剪至1.8MB - 保留实时调度功能(CONFIG_PREEMPT_RT) - 通过ftrace确认移除非必要的中断处理 3. 最终实现系统冷启动<1.5秒的行业领先指标 ``` --- 以上内容可根据具体面试岗位需求,重点强调硬件适配经验、性能优化成果或稳定性保障方案等不同维度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值