Embedsky007的个人空间 https://www.eechina.com/space-uid-114045.html [收藏] [复制] [RSS]

博客

TQIMX6Q教程--内核启动与文件系统挂载之一

已有 1315 次阅读2015-7-27 15:14 |个人分类:技术文章| IMX6Q, 内核, 文件系统

  经过前面的移植,u-boot已经有能力启动内核了,本文主要来看下如何通过之前移植的u-boot来启动内核。如果按照前面的文章完成了LTIB的编译,那么,Linux的内核应该就会出现rpm/BUILD/目录下,接下来,我们就开始移植这个3.0.35版本的内核到TQIMX6Q

  内核的编译

  为了简化内核编译的过程,可以在内核目录下创建编译脚本,命名为build.sh,内容如下:

  1. #!/bin/sh  
  2.   
  3. export ARCH=arm  
  4. 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-  
  5. make uImage -j8  

  为该脚本添加可执行权限:

  1. chmod a+x build.sh  

  由于本文使用的内核镜像格式是uImage,因此会依赖u-boot编译时生成的工具——mkimage。该工具为u-boot目录的tools子目录下,可以将mkimage拷贝到/usr/bin或者/usr/local/bin目录下,当然也可以是用环境变量PATH,方法如下:

  1. export PATH=$PATH:~/Projects/imx6/L3.0.35_4.1.0/ltib/rpm/BUILD/u-boot-2009.8/tools  

  安装路径需要根据自己的实际情况填写。完成以上操作之后就可以编译内核了,执行脚本程序:

  1. ./build.sh  

  内核的编译时间较长,需耐心等待,也与机器的配置有关。


  内核启动尝试

  内核编译完成后,uImage会出现在arch/arm/boot/目录下,将该镜像烧写到SD卡:

  1. sudo dd if=arch/arm/boot/uImage of=/dev/sdb bs=512 seek=2048  
  2. sync  

  然后用SD卡启动开发板,按任意键打断u-boot启动,进入命令行,修改u-boot环境变量:

  1. setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'  
  2. setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk1p1 rootwait rw'  
  3. setenv bootcmd_mmc 'run bootargs_base bootargs_mmc; mmc dev 1; mmc read ${loadaddr} 0x800 0x2000; bootm'  
  4. setenv bootcmd 'run bootcmd_mmc'  
  5. saveenv  

  以上指令的含义:

  1. 第一条:bootargs_base,维持默认状态,作用是在bootargs中指定串口终端及波特率。  
  2. 第二条:bootargs_mmc,是MMC方式启动内核使用的bootargs特有参数。  
  3. 第三条:bootcmd_mmc,是MMC方式启动特有的命令组合。  
  4. 第四条:bootcmd是内核启动命令。  
  5. 第五条:保存env到SD存储介质。  

  完成之后执行命令:

  1. boot  

  或者重新上电开发板就可以启动内核了。


  内核的修改

  通过上面的设置,u-boot已经可以引导内核启动了,但是,内核启动后仅打印了一部分log,猜测是内核中UART的GPIO管脚配置不正确,开始一段log能打印出来是因为u-boot阶段配置好了UART,而内核中又将这两个引脚配置为其它用途了。首先来解决串口log问题,打开文件arch/arm/mach-mx6/board-mx6q_sabresd.h并作如下修改:

  1. ... ...  
  2.   
  3. // MX6Q_PAD_CSI0_DAT10__UART1_TXD,  
  4. MX6Q_PAD_SD3_DAT7__UART1_TXD,  
  5. // MX6Q_PAD_CSI0_DAT11__UART1_RXD,  
  6. MX6Q_PAD_SD3_DAT6__UART1_RXD,  
  7. ... ...  

  其实,u-boot已经作过相应的修改,修改UART1相关的配置信息,除了以上修改之外,还需要将SD3与串口冲突的两个引脚:

  1.   
  2. MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,  
  3. MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ,  
  4. MX6Q_PAD_SD3_DAT0__USDHC3_DAT0_50MHZ,  
  5. MX6Q_PAD_SD3_DAT1__USDHC3_DAT1_50MHZ,  
  6. MX6Q_PAD_SD3_DAT2__USDHC3_DAT2_50MHZ,  
  7. MX6Q_PAD_SD3_DAT3__USDHC3_DAT3_50MHZ,  
  8. // MX6Q_PAD_SD3_DAT4__USDHC3_DAT4_50MHZ,  
  9. // MX6Q_PAD_SD3_DAT5__USDHC3_DAT5_50MHZ,  
  10. // MX6Q_PAD_SD3_DAT6__USDHC3_DAT6_50MHZ,  
  11. // MX6Q_PAD_SD3_DAT7__USDHC3_DAT7_50MHZ,  
  12. MX6Q_PAD_NANDF_D0__GPIO_2_0,        
  13. MX6Q_PAD_NANDF_D1__GPIO_2_1,        

  注释掉以上四行。保存后重新编译内核并烧写到SD卡,重新启动开发板会发现内核已经可以正常打印启动Log了。接下来将LTIB编译生成的rootfs烧写到开发板,并使用编译好的内核挂载该文件系统。


  挂载文件系统

  文件系统的构建方式都差不多,这里就不再自己构建了,直接使用LTIB编译时生成的文件系统。

  将SD卡插ubunut上,对该SD卡进行分区:

  1. sudo fdisk /dev/sdb  
然后如下操作:

 

Step1: 通过指令u切换到sectors模式。输入u后回车,fdisk会在sectors模式和cylinders模式间切换,这里切换到sectors模式。

Step2:通过d指令删除原来的分区。重复的输入d并回车,可以删除SD卡原有的分区,知道没有任何分区为止。

Step3:通过n指令新建分区。输入n并回车。

Step4:输入分区编号。这里输入数字1。

Step5:输入分区的起始位置。该位置是sectors为单位的,每个sector的大小为512B,这里偏移8M,给内核留下足够的存储空间,输入16384并回车。

Step6:输入分区的结束为止。直接使用默认值,即到达SD卡的末尾,故直接回车即可。

Step7:保存分区信息。输入指令w并回车。

这样就完成了SD卡的分区,接下来需要将该分区格式化为ext3或者ext4,指令如下:

  1. sudo mkfs.ext3 /dev/sdb1  
  2. 或者  
  3. sudo mkfs.ext4 /dev/sdb1  

  最后,将文件系统拷贝到该分区,进入ltib目录下的rootfs文件夹,然后执行如下指令:

  1. sudo mount /dev/sdb1 /mnt  
  2. sudo cp -a * /mnt 

  也可以重新拔插SD卡,将rootfs内的文件拷贝到ubunut挂载的分区。

  如果rootfs是压缩包,则可以解压到SD卡分区,比如bzip的压缩包,可以如下处理:

  1. sudo tar jxf rootfs.tar.bz2 -C /mnt  
  2. sudo mv /mnt/rootfs  
  3. MX6Q_PAD_SD2_CLK__USDHC2_CLK,  
  4. MX6Q_PAD_SD2_CMD__USDHC2_CMD,  
  5. MX6Q_PAD_SD2_DAT0__USDHC2_DAT0,  
  6. MX6Q_PAD_SD2_DAT1__USDHC2_DAT1,  
  7. MX6Q_PAD_SD2_DAT2__USDHC2_DAT2,  
  8. MX6Q_PAD_SD2_DAT3__USDHC2_DAT3,  
  9. // MX6Q_PAD_NANDF_D4__USDHC2_DAT4,  
  10. // MX6Q_PAD_NANDF_D5__USDHC2_DAT5,  
  11. // MX6Q_PAD_NANDF_D6__USDHC2_DAT6,  
  12. // MX6Q_PAD_NANDF_D7__USDHC2_DAT7,  
  13. // MX6Q_PAD_NANDF_D2__GPIO_2_2,    
  14. MX6Q_PAD_GPIO_2__USDHC2_WP,  
  15. // MX6Q_PAD_NANDF_D3__GPIO_2_3,    
  16. MX6Q_PAD_GPIO_4__USDHC2_CD,  
Step2:打开arch/arm/mach-mx6/board-mx6q_sabresd.c,作如下修改:
  1. #define SABRESD_SD2_CD          IMX_GPIO_NR(1, 4)  
  2. #define SABRESD_SD2_WP          IMX_GPIO_NR(1, 2)  

  即将SD2_CD的引脚号修改为GPIO1_4和GPIO1_2。

  按照以上步骤修改内核后重新编译并烧写到SD卡,然后使用SD卡启动开发板。


相关产品:

http://www.embedsky.com/index.php?s=/Product/show/id/83.html

http://www.embedsky.com/index.php?s=/Product/show/id/57.html


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部