I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之u-boot移植

来源:互联网 发布:java spring框架 编辑:程序博客网 时间:2024/04/28 17:09

前段时间就开始学习I.MX6Q了,但是最近工作实在是忙,间断了一些时间了。为了提高移植效率,还是考虑移植Freescale维护的3.10版本的内核。

源码获取

Freescale维护的3.10的内核是使用git管理的,但是直接使用git下载代码会比较慢,下面是我下载好的uboot和kernel:

I.MX6Q BSP源码(Freescale官方维护)

代码下载好后,先将u-boot解压到工作目录,然后在终端下切换到uboot根目录。由于这个版本的bsp是使用git管理的,因此,需要切换到指定分支。执行指令:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. git branch -a  
可以查看freescale维护的uboot的各个分支,我们checkout的分支是“remotes/origin/imx_v2013.04_3.10.17_1.0.0_ga”,执行指令:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. git checkout -b tqimx6q imx_v2013.04_3.10.17_1.0.0_ga  
这样,就在本地创建的分支tqimx6q并将远程分支imx_v2013.04_3.10.17_1.0.0_ga上的代码checkout到这个本地分支。我们之后的修改在tqimx6q分支进行即可。

U-Boot移植

新版U-Boot移植也不麻烦,主要是freescale给出了详细的官方手册"i.MX 6 BSP Porting Guide",具体的移植步骤如下:

Step1. 创建board目录。由于imx6q的很多代码是共通的,跟之前的移植一样,可以参考mx6qsabresd进行的,执行指令:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. cp board/freescale/mx6qsabresd/ board/freescale/mx6q_tqimx6q -r  

Step2. 修改board相关文件的名称:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. cp board/freescale/mx6q_tqimx6q/mx6qsabresd.c board/freescale/mx6q_tqimx6q/mx6q_tqimx6q.c  
Step3. 修改Makefile中的文件名。打开board/freescale/Makefile,将mx6qsabresd替换为mx6q_tqimx6q.c。
Step4. 创建board配置文件。同样参考mx6qsabresd,执行如下指令:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. cp include/configs/mx6qsabresd.h include/configs/mx6q_tqimx6q.h  
Step5. 添加编译选项。打开文件boards.cfg,找到配置项"mx6qsabresd"(如果没有改动的话,在277行),复制该行配置并添加在下面,然后修改为如下内容:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. mx6q_tqimx6q                 arm         armv7       mx6q_tqimx6q        freescale      mx6             mx6qsabresd:IMX_CONFIG=board/freescale/mx6q_tqimx6q/mx6q_tqimx6q_ddr.cfg,MX6Q,DEFAULT_FDT_FILE="imx6q-tqimx6q.dtb",DDR_MB=1024,SYS_USE_SPINOR  

Step6. 定制DDR配置。其实DDR相关的参数在之前的移植文章中已经有了。

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. cp board/freescale/imx/ddr/mx6q_4x_mt41j128.cfg board/freescale/mx6q_tqimx6q/mx6q_tqimx6q_ddr.cfg  

然后修改文件mx6q_tqimx6q_ddr.cfg,修改后的文件内容如下:

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. DATA 4, 0x020e0798, 0x000C0000  
  2. DATA 4, 0x020e0758, 0x00000000  
  3. DATA 4, 0x020e0588, 0x00000030  
  4. DATA 4, 0x020e0594, 0x00000030  
  5. DATA 4, 0x020e056c, 0x00000030  
  6. DATA 4, 0x020e0578, 0x00000030  
  7. DATA 4, 0x020e074c, 0x00000030  
  8. DATA 4, 0x020e057c, 0x00000030  
  9. DATA 4, 0x020e058c, 0x00000000  
  10. DATA 4, 0x020e059c, 0x00000030  
  11. DATA 4, 0x020e05a0, 0x00000030  
  12. DATA 4, 0x020e078c, 0x00000030  
  13. DATA 4, 0x020e0750, 0x00020000  
  14. DATA 4, 0x020e05a8, 0x00000018  
  15. DATA 4, 0x020e05b0, 0x00000018  
  16. DATA 4, 0x020e0524, 0x00000018  
  17. DATA 4, 0x020e051c, 0x00000018  
  18. DATA 4, 0x020e0518, 0x00000018  
  19. DATA 4, 0x020e050c, 0x00000018  
  20. DATA 4, 0x020e05b8, 0x00000018  
  21. DATA 4, 0x020e05c0, 0x00000018  
  22. DATA 4, 0x020e0774, 0x00020000  
  23. DATA 4, 0x020e0784, 0x00000018  
  24. DATA 4, 0x020e0788, 0x00000018  
  25. DATA 4, 0x020e0794, 0x00000018  
  26. DATA 4, 0x020e079c, 0x00000018  
  27. DATA 4, 0x020e07a0, 0x00000018  
  28. DATA 4, 0x020e07a4, 0x00000018  
  29. DATA 4, 0x020e07a8, 0x00000018  
  30. DATA 4, 0x020e0748, 0x00000018  
  31. DATA 4, 0x020e05ac, 0x00000018  
  32. DATA 4, 0x020e05b4, 0x00000018  
  33. DATA 4, 0x020e0528, 0x00000018  
  34. DATA 4, 0x020e0520, 0x00000018  
  35. DATA 4, 0x020e0514, 0x00000018  
  36. DATA 4, 0x020e0510, 0x00000018  
  37. DATA 4, 0x020e05bc, 0x00000018  
  38. DATA 4, 0x020e05c4, 0x00000018  
  39. DATA 4, 0x021b0800, 0xa1390003  
  40. DATA 4, 0x021b080c, 0x001F001F  
  41. DATA 4, 0x021b0810, 0x001F001F  
  42. DATA 4, 0x021b480c, 0x001F001F  
  43. DATA 4, 0x021b4810, 0x001F001F  
  44. DATA 4, 0x021b083c, 0x43270338  
  45. DATA 4, 0x021b0840, 0x03200314  
  46. DATA 4, 0x021b483c, 0x431A032F  
  47. DATA 4, 0x021b4840, 0x03200263  
  48. DATA 4, 0x021b0848, 0x4B434748  
  49. DATA 4, 0x021b4848, 0x4445404C  
  50. DATA 4, 0x021b0850, 0x38444542  
  51. DATA 4, 0x021b4850, 0x4935493A  
  52. DATA 4, 0x021b081c, 0x33333333  
  53. DATA 4, 0x021b0820, 0x33333333  
  54. DATA 4, 0x021b0824, 0x33333333  
  55. DATA 4, 0x021b0828, 0x33333333  
  56. DATA 4, 0x021b481c, 0x33333333  
  57. DATA 4, 0x021b4820, 0x33333333  
  58. DATA 4, 0x021b4824, 0x33333333  
  59. DATA 4, 0x021b4828, 0x33333333  
  60. DATA 4, 0x021b08b8, 0x00000800  
  61. DATA 4, 0x021b48b8, 0x00000800  
  62. DATA 4, 0x021b0004, 0x00020036  
  63. DATA 4, 0x021b0008, 0x09444040  
  64. DATA 4, 0x021b000c, 0x8A8F7955  
  65. DATA 4, 0x021b0010, 0xFF328F64  
  66. DATA 4, 0x021b0014, 0x01FF00DB  
  67. DATA 4, 0x021b0018, 0x00001740  
  68. DATA 4, 0x021b001c, 0x00008000  
  69. DATA 4, 0x021b002c, 0x000026d2  
  70. DATA 4, 0x021b0030, 0x008F1023  
  71. DATA 4, 0x021b0040, 0x00000047  
  72. DATA 4, 0x021b0000, 0x841A0000  
  73. DATA 4, 0x021b001c, 0x04088032  
  74. DATA 4, 0x021b001c, 0x00008033  
  75. DATA 4, 0x021b001c, 0x00048031  
  76. DATA 4, 0x021b001c, 0x09408030  
  77. DATA 4, 0x021b001c, 0x04008040  
  78. DATA 4, 0x021b0020, 0x00005800  
  79. DATA 4, 0x021b0818, 0x00011117  
  80. DATA 4, 0x021b4818, 0x00011117  
  81. DATA 4, 0x021b0004, 0x00025576  
  82. DATA 4, 0x021b0404, 0x00011006  
  83. DATA 4, 0x021b001c, 0x00000000  
  84.   
  85. /* set the default clock gate to save power */  
  86. DATA 4, 0x020c4068, 0x00C03F3F  
  87. DATA 4, 0x020c406c, 0x0030FC03  
  88. DATA 4, 0x020c4070, 0x0FFFC000  
  89. DATA 4, 0x020c4074, 0x3FF00000  
  90. DATA 4, 0x020c4078, 0x00FFF300  
  91. DATA 4, 0x020c407c, 0x0F0000F3  
  92. DATA 4, 0x020c4080, 0x000003FF  
  93.   
  94. /* enable AXI cache for VDOA/VPU/IPU */  
  95. DATA 4, 0x020e0010, 0xF00000CF  
  96. /* set IPU AXI-id0 Qos=0xf(bypass) AXI-id1 Qos=0x7 */  
  97. DATA 4, 0x020e0018, 0x007F007F  
  98. DATA 4, 0x020e001c, 0x007F007F  

Step7. 定制board端子。其实有影响的端子在移植老版的uboot时已经知道,因此修改起来也是比较容易。

(1) 修改串口端子。具体修改内容如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. iomux_v3_cfg_t const uart1_pads[] = {  
  2.         // MX6_PAD_CSI0_DAT10__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),  
  3.         MX6_PAD_SD3_DAT7__UART1_TXD | MUX_PAD_CTRL(UART_PAD_CTRL),  
  4.         // MX6_PAD_CSI0_DAT11__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),  
  5.         MX6_PAD_SD3_DAT6__UART1_RXD | MUX_PAD_CTRL(UART_PAD_CTRL),  
  6. };  
(2) 修改SD卡端子。具体修改如下:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. iomux_v3_cfg_t const usdhc2_pads[] = {  
  2.         MX6_PAD_SD2_CLK__USDHC2_CLK     | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  3.         MX6_PAD_SD2_CMD__USDHC2_CMD     | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  4.         MX6_PAD_SD2_DAT0__USDHC2_DAT0   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  5.         MX6_PAD_SD2_DAT1__USDHC2_DAT1   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  6.         MX6_PAD_SD2_DAT2__USDHC2_DAT2   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  7.         MX6_PAD_SD2_DAT3__USDHC2_DAT3   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  8.         // MX6_PAD_NANDF_D4__USDHC2_DAT4        | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  9.         // MX6_PAD_NANDF_D5__USDHC2_DAT5        | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  10.         // MX6_PAD_NANDF_D6__USDHC2_DAT6        | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  11.         // MX6_PAD_NANDF_D7__USDHC2_DAT7        | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  12.         // MX6_PAD_NANDF_D2__GPIO_2_2   | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */  
  13. };  
  14.   
  15. iomux_v3_cfg_t const usdhc3_pads[] = {  
  16.         MX6_PAD_SD3_CLK__USDHC3_CLK   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  17.         MX6_PAD_SD3_CMD__USDHC3_CMD   | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  18.         MX6_PAD_SD3_DAT0__USDHC3_DAT0 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  19.         MX6_PAD_SD3_DAT1__USDHC3_DAT1 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  20.         MX6_PAD_SD3_DAT2__USDHC3_DAT2 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  21.         MX6_PAD_SD3_DAT3__USDHC3_DAT3 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  22.         MX6_PAD_SD3_DAT4__USDHC3_DAT4 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  23.         MX6_PAD_SD3_DAT5__USDHC3_DAT5 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  24.         // MX6_PAD_SD3_DAT6__USDHC3_DAT6 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  25.         // MX6_PAD_SD3_DAT7__USDHC3_DAT7 | MUX_PAD_CTRL(USDHC_PAD_CTRL),  
  26.         MX6_PAD_NANDF_D0__GPIO_2_0    | MUX_PAD_CTRL(NO_PAD_CTRL), /* CD */  
  27. };  

定制cd(card detect)端子,否则uboot将检测不到SD卡插入。打开board/freescale/mx6q_tqimx6q/mx6q_tqimx6q.c修改USDHC2_CD_GPIO:

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. #define USDHC2_CD_GPIO  IMX_GPIO_NR(1, 4)  

Step8. 编译uboot。执行如下指令:
[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. export ARCH=arm  
  2. export CROSS_COMPILE=arm-linux-gnueabi-  
  3. make mx6q_tqimx6q  

其中,CROSS_COMPILE是交叉编译工具链的前缀,根据自己的实际情况修改。如果前面的步骤操作正确,uboot就可以顺利编译通过了。

烧写启动

经过前面的移植工作,uboot已经可以正常运行在tqimx6q开发板上了。这个版本的uboot与之前版本的uboot编译出的目标文件不同,具体的烧写指令如下:

[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. sudo dd if=u-boot.imx of=/dev/sdb bs=512 seek=2  
启动Log如下:
[cpp] view plain copy 在CODE上查看代码片派生到我的代码片
  1. U-Boot 2013.04-04987-g98fdbdc-dirty (May 01 2015 - 23:15:34)  
  2.   
  3. CPU:   Freescale i.MX6Q rev1.2 at 792 MHz  
  4. CPU:   Temperature 24 C, calibration data: 0x54e4bb69  
  5. Reset cause: POR  
  6. Board: MX6Q/SDL-SabreSD  
  7. I2C:   ready  
  8. DRAM:  1 GiB  
  9. MMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2  
  10. MMC: no card present  
  11. MMC init failed  
  12. Using default environment  
  13.   
  14. No panel detected: default to Hannstar-XGA  
  15. Display: Hannstar-XGA (1024x768)  
  16. In:    serial  
  17. Out:   serial  
  18. Err:   serial  
  19. MMC: no card present  
  20. mmc0(part 0) is current device  
  21. Net:   Phy not found  
  22. PHY reset timed out  
  23. FEC [PRIME]  
  24. Warning: failed to set MAC address  
  25.   
  26. Normal Boot  
  27. Hit any key to stop autoboot:  0   
  28. MMC: no card present  
  29. mmc0(part 0) is current device  
  30. MMC: no card present  
  31. Booting from net ...  
  32. *** ERROR: `ethaddr' not set  
  33. *** ERROR: `ethaddr' not set  
  34. Wrong Image Format for bootm command  
  35. ERROR: can't get kernel image!  
  36. U-Boot >   
总结
经过上文介绍的移植,u-boot已经可以正常启动了。其实,这个版本的uboot移植与之前版本的uboot移植没有太大区别,思路差不多。有什么问题可以留言。
1 0
原创粉丝点击