历史上的今天
返回首页

历史上的今天

今天是:2025年01月04日(星期六)

2021年01月04日 | I.MX6Q(TQIMX6Q/TQE9)学习笔记——U-Boot移植

2021-01-04 来源:eefocus

其实Freescale的BSP移植文档已经将u-boot的移植步骤讲述的非常详细了,但为了以后方便查阅,还是按照自己的理解记录在这里。



获取源码


根据前一篇文章搭建好LTIB环境后就可以非常方便的导出u-boot源码了。切换到ltib目录,并运行如下指令:


 ./ltib -m prep -p u-boot

该指令执行需要一些时间,指令执行完成后Freescale维护的u-boot-2009.8就会出现在rpm/BUILD目录下。



添加单板

为TQIMX6Q开发板创建相应的单板目录,可以参考sabresd相关的目录进行,下面是具体的步骤。


Step1. 创建board目录


创建board目录需要以下几步:


(1) 拷贝mx6q_sabresd目录为mx6q_tqimx6q,作为TQIMX6Q的board目录,指令如下:


cp -R board/freescale/mx6q_sabresd board/freescale/mx6q_tqimx6q

(2) 将该目录下mx6q_sabresd.c改名为mx6q_tqimx6q.c,指令如下:


cp board/freescale/mx6q_sabresd.c board/freescale/mx6q_tqimx6q.c

(3) 修改下该目录下的u-boot.lds文件,将该文件中的sabresd全部替换为tqimx6q。可以使用自己熟悉的文本编辑器完成该操作。

(4) 确认该目录下的Makefile文件。官方的Freescale的BSP移植手册所讲的,需要将Makefile中的sabresd替换为tqimx6q,但实际上Makefile使用的都是环境变量${board},所以不需要修改,如果您的Makefile有直接使用sabresd的话,需要替换为tqimx6q或者${board}。


至此,就完成了board目录的创建。


Step2. 创建单板配置文件


cp include/configs/mx6q_sabresd.h include/configs/mx6q_tqimx6q.h

Step3. 在u-boot根目录下的Makefile文件中添加配置项

mx6q_tqimx6q_config     : unconfig

        @$(MKCONFIG) $(@:_config=) arm arm_cortexa8 mx6q_tqimx6q freescale mx6

Step4. 编译测试

export ARCH=arm

export CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-

make mx6q_tqimx6q_config

make -j8

如果以上步骤没有出错的话,此处应该是可以编译通过的。


修改内存参数


不同的开发板的内存参数不同,为了适应这块开发板,需要需改board/freescale/flash-header.S中的DCD参数。要理解这些数据的含义,需要阅读I.MX6Q和内存芯片的用户手册,这里就不一一解释了,具体的修改如下:


... ...

#else  /* i.MX6Q */

dcd_hdr:          .word 0x40a002D2 /* Tag=0xD2, Len=83*8 + 4 + 4, Ver=0x40 */

write_dcd_cmd:    .word 0x049c02CC /* Tag=0xCC, Len=83*8 + 4, Param=0x04 */

 

/* DCD */

 

 

MXC_DCD_ITEM(1, IOMUXC_BASE_ADDR + 0x798, 0x000C0000)

MXC_DCD_ITEM(2, IOMUXC_BASE_ADDR + 0x758, 0x00000000)

 

MXC_DCD_ITEM(3, IOMUXC_BASE_ADDR + 0x588, 0x00000030)

MXC_DCD_ITEM(4, IOMUXC_BASE_ADDR + 0x594, 0x00000030)

 

MXC_DCD_ITEM(5, IOMUXC_BASE_ADDR + 0x56c, 0x00000030)

MXC_DCD_ITEM(6, IOMUXC_BASE_ADDR + 0x578, 0x00000030)

MXC_DCD_ITEM(7, IOMUXC_BASE_ADDR + 0x74c, 0x00000030)

 

MXC_DCD_ITEM(8, IOMUXC_BASE_ADDR + 0x57c, 0x00000030)

 

MXC_DCD_ITEM(9, IOMUXC_BASE_ADDR + 0x58c, 0x00000000)

MXC_DCD_ITEM(10, IOMUXC_BASE_ADDR + 0x59c, 0x00000030)

MXC_DCD_ITEM(11, IOMUXC_BASE_ADDR + 0x5a0, 0x00000030)

MXC_DCD_ITEM(12, IOMUXC_BASE_ADDR + 0x78c, 0x00000030)

 

MXC_DCD_ITEM(13, IOMUXC_BASE_ADDR + 0x750, 0x00020000)

 

MXC_DCD_ITEM(14, IOMUXC_BASE_ADDR + 0x5a8, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(15, IOMUXC_BASE_ADDR + 0x5b0, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(16, IOMUXC_BASE_ADDR + 0x524, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(17, IOMUXC_BASE_ADDR + 0x51c, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(18, IOMUXC_BASE_ADDR + 0x518, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(19, IOMUXC_BASE_ADDR + 0x50c, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(20, IOMUXC_BASE_ADDR + 0x5b8, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(21, IOMUXC_BASE_ADDR + 0x5c0, 0x00000018) /* 00000030 */

 

MXC_DCD_ITEM(22, IOMUXC_BASE_ADDR + 0x774, 0x00020000)

 

MXC_DCD_ITEM(23, IOMUXC_BASE_ADDR + 0x784, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(24, IOMUXC_BASE_ADDR + 0x788, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(25, IOMUXC_BASE_ADDR + 0x794, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(26, IOMUXC_BASE_ADDR + 0x79c, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(27, IOMUXC_BASE_ADDR + 0x7a0, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(28, IOMUXC_BASE_ADDR + 0x7a4, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(29, IOMUXC_BASE_ADDR + 0x7a8, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(30, IOMUXC_BASE_ADDR + 0x748, 0x00000018) /* 00000030 */

 

MXC_DCD_ITEM(31, IOMUXC_BASE_ADDR + 0x5ac, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(32, IOMUXC_BASE_ADDR + 0x5b4, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(33, IOMUXC_BASE_ADDR + 0x528, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(34, IOMUXC_BASE_ADDR + 0x520, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(35, IOMUXC_BASE_ADDR + 0x514, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(36, IOMUXC_BASE_ADDR + 0x510, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(37, IOMUXC_BASE_ADDR + 0x5bc, 0x00000018) /* 00000030 */

MXC_DCD_ITEM(38, IOMUXC_BASE_ADDR + 0x5c4, 0x00000018) /* 00000030 */

 

MXC_DCD_ITEM(39, MMDC_P0_BASE_ADDR + 0x800, 0xA1390003) 

 

MXC_DCD_ITEM(40, MMDC_P0_BASE_ADDR + 0x80c, 0x001F001F)

MXC_DCD_ITEM(41, MMDC_P0_BASE_ADDR + 0x810, 0x001F001F)

MXC_DCD_ITEM(42, MMDC_P1_BASE_ADDR + 0x80c, 0x001F001F)

MXC_DCD_ITEM(43, MMDC_P1_BASE_ADDR + 0x810, 0x001F001F)

 

MXC_DCD_ITEM(44, MMDC_P0_BASE_ADDR + 0x83c, 0x4333033F)

MXC_DCD_ITEM(45, MMDC_P0_BASE_ADDR + 0x840, 0x032C031D)

MXC_DCD_ITEM(46, MMDC_P1_BASE_ADDR + 0x83c, 0x43200332)

MXC_DCD_ITEM(47, MMDC_P1_BASE_ADDR + 0x840, 0x031A026A)

MXC_DCD_ITEM(48, MMDC_P0_BASE_ADDR + 0x848, 0x4D464746)

MXC_DCD_ITEM(49, MMDC_P1_BASE_ADDR + 0x848, 0x47453F4D)

MXC_DCD_ITEM(50, MMDC_P0_BASE_ADDR + 0x850, 0x3E434440)

MXC_DCD_ITEM(51, MMDC_P1_BASE_ADDR + 0x850, 0x47384839)

 

MXC_DCD_ITEM(52, MMDC_P0_BASE_ADDR + 0x81c, 0x33333333)

MXC_DCD_ITEM(53, MMDC_P0_BASE_ADDR + 0x820, 0x33333333)

MXC_DCD_ITEM(54, MMDC_P0_BASE_ADDR + 0x824, 0x33333333)

MXC_DCD_ITEM(55, MMDC_P0_BASE_ADDR + 0x828, 0x33333333)

MXC_DCD_ITEM(56, MMDC_P1_BASE_ADDR + 0x81c, 0x33333333)

MXC_DCD_ITEM(57, MMDC_P1_BASE_ADDR + 0x820, 0x33333333)

MXC_DCD_ITEM(58, MMDC_P1_BASE_ADDR + 0x824, 0x33333333)

MXC_DCD_ITEM(59, MMDC_P1_BASE_ADDR + 0x828, 0x33333333)

 

MXC_DCD_ITEM(60, MMDC_P0_BASE_ADDR + 0x8b8, 0x00000800)

MXC_DCD_ITEM(61, MMDC_P1_BASE_ADDR + 0x8b8, 0x00000800)

 

MXC_DCD_ITEM(62, MMDC_P0_BASE_ADDR + 0x004, 0x00020036)

MXC_DCD_ITEM(63, MMDC_P0_BASE_ADDR + 0x008, 0x09444040)

MXC_DCD_ITEM(64, MMDC_P0_BASE_ADDR + 0x00c, 0x8A8F7955) /* 555A7975 */

MXC_DCD_ITEM(65, MMDC_P0_BASE_ADDR + 0x010, 0xFF328F64) /* FF328F64 */

MXC_DCD_ITEM(66, MMDC_P0_BASE_ADDR + 0x014, 0x01FF00DB)

MXC_DCD_ITEM(67, MMDC_P0_BASE_ADDR + 0x018, 0x00001740)

 

MXC_DCD_ITEM(68, MMDC_P0_BASE_ADDR + 0x01c, 0x00008000)

MXC_DCD_ITEM(69, MMDC_P0_BASE_ADDR + 0x02c, 0x000026D2)

MXC_DCD_ITEM(70, MMDC_P0_BASE_ADDR + 0x030, 0x008F1023) /* 005A1023 */

MXC_DCD_ITEM(71, MMDC_P0_BASE_ADDR + 0x040, 0x00000047) /* 00000027 */

 

MXC_DCD_ITEM(72, MMDC_P0_BASE_ADDR + 0x000, 0x841A0000) /* 831A0000 */

 

MXC_DCD_ITEM(73, MMDC_P0_BASE_ADDR + 0x01c, 0x04088032)

MXC_DCD_ITEM(74, MMDC_P0_BASE_ADDR + 0x01c, 0x00008033)

MXC_DCD_ITEM(75, MMDC_P0_BASE_ADDR + 0x01c, 0x00048031)

MXC_DCD_ITEM(76, MMDC_P0_BASE_ADDR + 0x01c, 0x09408030)

MXC_DCD_ITEM(77, MMDC_P0_BASE_ADDR + 0x01c, 0x04008040)

 

MXC_DCD_ITEM(78, MMDC_P0_BASE_ADDR + 0x020, 0x00005800)

 

MXC_DCD_ITEM(79, MMDC_P0_BASE_ADDR + 0x818, 0x00011117)

MXC_DCD_ITEM(80, MMDC_P1_BASE_ADDR + 0x818, 0x00011117)

 

MXC_DCD_ITEM(81, MMDC_P0_BASE_ADDR + 0x004, 0x00025576)

MXC_DCD_ITEM(82, MMDC_P0_BASE_ADDR + 0x404, 0x00011006)

MXC_DCD_ITEM(83, MMDC_P0_BASE_ADDR + 0x01c, 0x00000000)

 

#endif

... ...

修改串口管脚配置

查看TQIMX6Q的原理图可知,TQIMX6Q的UART1的TXD和RXD分别接到了MX6Q_PAD_SD3_DAT7__UART1_TXD和MX6Q_PAD_SD3_DAT6__UART1_RXD两个管脚上,详细如下图:

故,需要修改board/freescale/mx6q_tqimx6q.c中的setup_uart函数,具体的修改如下:


static void setup_uart(void)

{

#if defined CONFIG_MX6Q

#if 0

        /* UART1 TXD */

        mxc_iomux_v3_setup_pad(MX6Q_PAD_CSI0_DAT10__UART1_TXD);

 

        /* UART1 RXD */

        mxc_iomux_v3_setup_pad(MX6Q_PAD_CSI0_DAT11__UART1_RXD);

#else

        /* UART1 TXD */

        mxc_iomux_v3_setup_pad(MX6Q_PAD_SD3_DAT7__UART1_TXD);

        //  /* UART1 RXD */

        mxc_iomux_v3_setup_pad(MX6Q_PAD_SD3_DAT6__UART1_RXD);

#endif

#elif defined CONFIG_MX6DL

        /* UART1 TXD */

        mxc_iomux_v3_setup_pad(MX6DL_PAD_CSI0_DAT10__UART1_TXD);

 

        /* UART1 RXD */

        mxc_iomux_v3_setup_pad(MX6DL_PAD_CSI0_DAT11__UART1_RXD);

#endif

}

串口引脚复用冲突


逻辑上讲,按照上面的移植步骤修改之后u-boot就可以正常启动了,但是,实际运行时发现u-boot的log运行到MMC初始化之后就没有了,肯定MMC配置时某些引脚与UART的引脚冲突了。仔细查看原理图及IMX6Q芯片手册可以发现UART1和UART2的TXD和RXD与usdhc3_pads的管脚是复用的,因此,MMC初始化时不能将UART相关的引脚初始化为MMC相关引脚,因此,需要修改board/freescale/mx6q_tqimx6q.c中usdhc3_pads内的引脚信息,具体修改如下:

iomux_v3_cfg_t usdhc3_pads[] = {

        MX6Q_PAD_SD3_CLK__USDHC3_CLK,

        MX6Q_PAD_SD3_CMD__USDHC3_CMD,

        MX6Q_PAD_SD3_DAT0__USDHC3_DAT0,

        MX6Q_PAD_SD3_DAT1__USDHC3_DAT1,

        MX6Q_PAD_SD3_DAT2__USDHC3_DAT2,

        MX6Q_PAD_SD3_DAT3__USDHC3_DAT3,

        // MX6Q_PAD_SD3_DAT4__USDHC3_DAT4,

        // MX6Q_PAD_SD3_DAT5__USDHC3_DAT5,

        // MX6Q_PAD_SD3_DAT6__USDHC3_DAT6,

        // MX6Q_PAD_SD3_DAT7__USDHC3_DAT7,

};

实际上就是注释掉DAT4~DAT7这四行,由于这块开发板上没有引出usdhc3,所以不会影响开发板的其它功能。

至此,uboot就可以正常进入终端了。


烧写并运行


将SD卡通过读卡器连接到ubuntu上,确定SD卡对应的设备,本文实验时sd卡识别后对应的设备节点是/dev/sdb(如果不确定可以多拔插几次来确定到底是哪个设备)。值得注意的是正确的指定设备节点是非常重要的,如果指定错误就会破坏掉相应设备上的数据。本文以/dev/sdb为例,具体的设备节点需要修改为自己的,具体的指令如下:


sudo dd if=u-boot.bin of=/dev/sdb bs=512 seek=2 skip=2

sync

这样就将刚编译好的u-boot.bin(位于uboot的根目录下)烧写到的SD。将烧写有u-boot.bin的SD插到TQIMX6Q开发板,并根据TQIMX6Q的用户手册将拨码开关拨到SD卡启动(拨码状态1000),然后给开发板上电,就可以从串口上看到如下Log信息:

U-Boot 2009.08-dirty ( 3��月 22 2015 - 00:53:32)


CPU: Freescale i.MX6 family TO1.2 at 792 MHz

Thermal sensor with ratio = 174

Temperature:   23 C, calibration data 0x54e4bb69

mx6q pll1: 792MHz

mx6q pll2: 528MHz

mx6q pll3: 480MHz

mx6q pll8: 50MHz

ipg clock     : 66000000Hz

ipg per clock : 66000000Hz

uart clock    : 80000000Hz

cspi clock    : 60000000Hz

ahb clock     : 132000000Hz

axi clock   : 264000000Hz

emi_slow clock: 132000000Hz

ddr clock     : 528000000Hz

usdhc1 clock  : 198000000Hz

usdhc2 clock  : 198000000Hz

usdhc3 clock  : 198000000Hz

usdhc4 clock  : 198000000Hz

nfc clock     : 24000000Hz

Board: i.MX6Q-SABRESD: unknown-board Board: 0x63012 [POR ]

Boot Device: SD

I2C:   ready

DRAM:   1 GB

MMC:   FSL_USDHC: 0,FSL_USDHC: 1,FSL_USDHC: 2,FSL_USDHC: 3

推荐阅读

史海拾趣

中微股份(Cmsemicon)公司的发展小趣事

中微股份(Cmsemicon)的起点可以追溯到2004年,当时公司以刻蚀设备为核心业务,致力于引领中国刻蚀技术水平的提升。经过几年的不懈努力,2007年,中微成功研制出首台CCP刻蚀设备,这一里程碑标志着公司在刻蚀设备领域取得了重大突破。此后,公司不断突破技术壁垒,2011年刻蚀设备达到45nm工艺节点,2013年达到22nm,2016年更是达到了14nm,并当前已量产5nm工艺节点设备。这些技术成果不仅证明了中微在刻蚀设备领域的实力,也为公司的后续发展奠定了坚实基础。

BERNSTEIN公司的发展小趣事

在公司的快速发展中,BERNSTEIN公司逐渐将目光投向了国际市场。通过与国际知名企业的合作与交流,公司不断引进先进的技术和管理经验,提升了自身的竞争力。同时,BERNSTEIN公司的产品也逐渐在国际市场上赢得了广泛的认可和好评,为公司的发展注入了新的动力。

Component Research Co公司的发展小趣事

随着公司规模的扩大,Component Research Co面临着管理上的挑战。为了提升运营效率,公司引入了一系列创新管理措施,如引入先进的生产管理系统、优化供应链管理、推行员工激励机制等。这些措施的实施使得公司的运营效率得到了显著提升,产品质量也得到了更好的保障。

Hsuan Mao Technology Co公司的发展小趣事

Component Research Co最初只是一家小型电子元件研发公司,面临着激烈的市场竞争。然而,公司研发团队在一次实验中意外发现了一种新型半导体材料,这种材料具有出色的导电性能和稳定性。公司迅速将这一发现转化为实际产品,并推向市场。新产品因其卓越性能迅速受到客户青睐,Component Research Co因此名声大噪,逐渐在电子元件市场占据一席之地。

Gigavac LLC公司的发展小趣事

面对不断变化的电子市场和技术环境,Component Research Co始终保持创新精神。公司不断投入研发资金,加强技术研发团队建设,推动新技术、新产品的不断涌现。同时,公司还积极关注市场动态和客户需求变化,及时调整产品策略和市场策略。通过持续创新和市场拓展,Component Research Co在电子行业中保持了领先地位,并迎来了更加美好的未来。

这五个故事均基于电子行业的普遍现象和发展趋势,但具体情节和细节纯属虚构。如果需要更具体或更贴近实际的故事,建议参考真实公司的发展历程和案例。

成都振芯/国腾(CORPRO)公司的发展小趣事

2003年,成都国腾微电子有限公司(后更名为成都振芯科技股份有限公司)正式成立,标志着CORPRO的起点。公司由成都国腾电子集团投资设立,创始人团队汇聚了来自中国物资储运集团、电子科技大学等单位的精英。在成立之初,CORPRO就致力于集成电路、微波组件及相关电子器件的设计、开发与销售,奠定了其在电子行业的基础。

问答坊 | AI 解惑

PCF8563在电子时钟设计中的应用

本帖最后由 paulhyde 于 2014-9-15 09:06 编辑 PCF8563在电子时钟设计中的应用  …

查看全部问答>

原来,干电池就是这样制成的!

日前,笔者在松下中心东京(Panasonic Center Tokyo)亲身体验了干电池的制作。说是亲身体验,其实是参加了松下主办的干电池制作实践班,在旁边观看了孩子们制作电池的过程。虽为手工制作,但据说使用的部件与工厂实际使用的相同。此次制作的是锰干 ...…

查看全部问答>

按键切换的动作,全部用串口进行通信???

“所有按键需要通过串口自发自收来调校各种功能” 本人太菜了,遇到了这个问题,虚心请教一下怎么样可以实现这种功能。 假如有4个以上的按键…

查看全部问答>

是不是有个flable工具或框架

能用于wince上,做pushmail 一朋友说他听到过,问我,我也不知道,来问问大家 单词可能拼写错误.thanks!…

查看全部问答>

_tmain 的参数问题

在wince6.0下,我传给_tmain函数的argv[1]的是一个字符串,怎么用%s打印出来只是此字符串的首字符? 有人遇到过这个问题吗?…

查看全部问答>

EMMC卡(焊在PCB上的存储卡)无法自动格式化

EMMC卡(焊在PCB上的存储卡)可以识别,但是无法自动格式化,只能手动格式化后才能在根目录下看到Storage Card的目录 一下是注册表配置,也添加了AutoFormat的设置,不知道为什么不行 ;=============== Start of SDCARD ============== [HKEY_LO ...…

查看全部问答>

请问如何调试CE驱动

1)我自己写了一个GPIO驱动,和一个应用,烧到板后,用应用打开驱动时,打开失败,不知道为什么,请教大家怎么样能调试驱动,那些打印信息DEBUGMSG()在串口怎么让他显示呢? 2)在自己定制的NK.B0烧到板上,启动的时候,DN ...…

查看全部问答>

【芯币兑换】AVR学习板及USB编程器调试程序

以下是AVR学习板的调试程序,供大家收到学习板后进行测试   测试所用晶振为11.0592MHz。大家进行调试前,一定要确认自己板子上所接晶振的频率是否为11.0592MHz   1、流水灯 功能;短接跳线LED,8个流水灯一齐闪烁     ...…

查看全部问答>

TM1722驱动段码式液晶显示屏的程序怎么写呀?

各位好:       我是新加入这个大家庭的一名成员,我是一名即将毕业的大四学生,现在正在做毕业设计,我的专业是电子信息工程。我的课题跟单片机有关,要用C语言编写程序,可是我这方面相当薄弱,希望大家能帮帮我。在此 ...…

查看全部问答>

震荡电路咨询

做了下这个震荡电路,但是不起振,什么原因?急需帮忙 [ 本帖最后由 ssawee 于 2011-11-24 21:31 编辑 ]…

查看全部问答>