历史上的今天
返回首页

历史上的今天

今天是:2024年12月30日(星期一)

正在发生

2020年12月30日 | I.MX6Q(TQIMX6Q/TQE9)学习笔记——内核启动与文件系统挂载

2020-12-30 来源:eefocus

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


内核的编译


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


#!/bin/sh

 

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 uImage -j8

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


chmod a+x build.sh

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

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

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

./build.sh

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

内核启动尝试


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


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

sync

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

setenv bootargs_base 'setenv bootargs console=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs ${bootargs} root=/dev/mmcblk1p1 rootwait rw'

setenv bootcmd_mmc 'run bootargs_base bootargs_mmc; mmc dev 1; mmc read ${loadaddr} 0x800 0x2000; bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

以上指令的含义:

第一条:bootargs_base,维持默认状态,作用是在bootargs中指定串口终端及波特率。

第二条:bootargs_mmc,是MMC方式启动内核使用的bootargs特有参数。

第三条:bootcmd_mmc,是MMC方式启动特有的命令组合。

第四条:bootcmd是内核启动命令。

第五条:保存env到SD存储介质。

完成之后执行命令:


boot

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

内核的修改


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


... ...

/* UART1 for debug */

// MX6Q_PAD_CSI0_DAT10__UART1_TXD,

MX6Q_PAD_SD3_DAT7__UART1_TXD,

// MX6Q_PAD_CSI0_DAT11__UART1_RXD,

MX6Q_PAD_SD3_DAT6__UART1_RXD,

... ...

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

/* USDHC3 */

MX6Q_PAD_SD3_CLK__USDHC3_CLK_50MHZ,

MX6Q_PAD_SD3_CMD__USDHC3_CMD_50MHZ,

MX6Q_PAD_SD3_DAT0__USDHC3_DAT0_50MHZ,

MX6Q_PAD_SD3_DAT1__USDHC3_DAT1_50MHZ,

MX6Q_PAD_SD3_DAT2__USDHC3_DAT2_50MHZ,

MX6Q_PAD_SD3_DAT3__USDHC3_DAT3_50MHZ,

// MX6Q_PAD_SD3_DAT4__USDHC3_DAT4_50MHZ,

// MX6Q_PAD_SD3_DAT5__USDHC3_DAT5_50MHZ,

// MX6Q_PAD_SD3_DAT6__USDHC3_DAT6_50MHZ,

// MX6Q_PAD_SD3_DAT7__USDHC3_DAT7_50MHZ,

MX6Q_PAD_NANDF_D0__GPIO_2_0,      /* SD3_CD */

MX6Q_PAD_NANDF_D1__GPIO_2_1,      /* SD3_WP */

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

挂载文件系统


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


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


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,指令如下:


sudo mkfs.ext3 /dev/sdb1

或者

sudo mkfs.ext4 /dev/sdb1

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

sudo mount /dev/sdb1 /mnt

sudo cp -a * /mnt

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


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

sudo tar jxf rootfs.tar.bz2 -C /mnt

sudo mv /mnt/rootfs/* /mnt

不过一般不用这么麻烦,直接用前面的方式拷贝即可。拷贝完成后执行sync指令,然后将SD插到开发板上启动开发板。启动时发现内核并没有成功挂载上rootfs文件系统,且根本没有识别到SD卡,因此,猜测是SD相关的引脚配置不正确。通过查阅原理图及内核源码文件可知,代码中配置的uSDHC2的WP和CD引脚与TQIMX6Q的连接方式不一致,因此,需要作如下修改:

Step1:打开arch/arm/mach-mx6/board-mx6q_sabresd.h,作如下修改:


/* USDHC2 */

MX6Q_PAD_SD2_CLK__USDHC2_CLK,

MX6Q_PAD_SD2_CMD__USDHC2_CMD,

MX6Q_PAD_SD2_DAT0__USDHC2_DAT0,

MX6Q_PAD_SD2_DAT1__USDHC2_DAT1,

MX6Q_PAD_SD2_DAT2__USDHC2_DAT2,

MX6Q_PAD_SD2_DAT3__USDHC2_DAT3,

// MX6Q_PAD_NANDF_D4__USDHC2_DAT4,

// MX6Q_PAD_NANDF_D5__USDHC2_DAT5,

// MX6Q_PAD_NANDF_D6__USDHC2_DAT6,

// MX6Q_PAD_NANDF_D7__USDHC2_DAT7,

// MX6Q_PAD_NANDF_D2__GPIO_2_2,  /* SD2_CD */

MX6Q_PAD_GPIO_2__USDHC2_WP,

// MX6Q_PAD_NANDF_D3__GPIO_2_3,  /* SD2_WP */

MX6Q_PAD_GPIO_4__USDHC2_CD,

Step2:打开arch/arm/mach-mx6/board-mx6q_sabresd.c,作如下修改:

#define SABRESD_SD2_CD          IMX_GPIO_NR(1, 4)

#define SABRESD_SD2_WP          IMX_GPIO_NR(1, 2)

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

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


效果展示


按照上面的步骤修改后内核就可以正常启动了,下面是启动Log:


U-Boot 2009.08-dirty ( 3月 23 2015 - 23:14:02)


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

In:    serial

Out:   serial

Err:   serial

Net:   got MAC address from IIM: 00:00:00:00:00:00

FEC0 [PRIME]

Hit any key to stop autoboot:  0 

mmc1 is current device


MMC read: dev # 1, block # 2048, count 8192 ... 8192 blocks read: OK

## Booting kernel from Legacy Image at 10800000 ...

   Image Name:   Linux-3.0.35-2666-gbdde708-g3344

   Image Type:   ARM Linux Kernel Image (uncompressed)

   Data Size:    3866004 Bytes =  3.7 MB

   Load Address: 10008000

   Entry Point:  10008000

   Verifying Checksum ... OK

   Loading Kernel Image ... OK

OK


Starting kernel ...


Uncompressing Linux... done, booting the kernel.

Linux version 3.0.35-2666-gbdde708-g334422e-dirty (lilianrong@ubuntu) (gcc version 4.6.2 20110630 (prerelease) (Freescale MAD -- Linaro 2011.07 -- Built at 2011/08/10 09:20) ) #5 SMP PREEMPT Wed Mar 25 19:29:24 CST 2015

CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d

CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache

Machine: Freescale i.MX 6Quad/DualLite/Solo Sabre-SD Board

Ignoring unrecognised tag 0x54410008

Memory policy: ECC disabled, Data cache writealloc

CPU identified as i.MX6Q, silicon rev 1.2

PERCPU: Embedded 7 pages/cpu @8c008000 s5440 r8192 d15040 u32768

Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 194560

Kernel command line: console=ttymxc0,115200 root=/dev/mmcblk1p1 rootwait rw

PID hash table entries: 4096 (order: 2, 16384 bytes)

Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)

Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)

Memory: 512MB 256MB = 768MB total

Memory: 765764k/765764k available, 282812k reserved, 0K highmem

Virtual kernel memory layout:

    vector  : 0xffff0000 - 0xffff1000   (   4 kB)

    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)

    DMA     : 0xf4600000 - 0xffe00000   ( 184 MB)

    vmalloc : 0xc0800000 - 0xf2000000   ( 792 MB)

    lowmem  : 0x80000000 - 0xc0000000   (1024 MB)

    pkmap   : 0x7fe00000 - 0x80000000   (   2 MB)

    modules : 0x7f000000 - 0x7fe00000   (  14 MB)

      .init : 0x80008000 - 0x8003c000   ( 208 kB)

      .text : 0x8003c000 - 0x80a8f8f4   (10575 kB)

      .data : 0x80a90000 - 0x80af3e00   ( 400 kB)

       .bss : 0x80af3e24 - 0x80b41d4c   ( 312 kB)

SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=4, Nodes=1

Preemptible hierarchical RCU implementation.

NR_IRQS:624

MXC GPIO hardware

sched_clock: 32 bits at 3000kHz, resolution 333ns, wraps every 1431655ms

arm_max_freq=1GHz

MXC_Early serial console at MMIO 0x2020000 (options '115200')

bootconsole [ttymxc0] enabled

Console: colour dummy device 80x30

Calibrating delay loop... 1581.05 BogoMIPS (lpj=7905280)

pid_max: default: 32768 minimum: 301

Mount-cache hash table entries: 512

CPU: Testing write buffer coherency: ok

hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available

CPU1: Booted secondary processor

CPU2: Booted secondary processor

CPU3: Booted secondary processor

Brought up 4 CPUs

SMP: Total of 4 processors activated (6324.22 BogoMIPS).

print_constraints: dummy: 

NET: Registered protocol family 16

print_constraints: vddpu: 725 <--> 1300 mV at 700 mV fast normal 

print_constraints: vddcore: 725 <--> 1300 mV at 1150 mV fast normal 

print_constraints: vddsoc: 725 <--> 1300 mV at 1200 mV fast normal 

print_constraints: vdd2p5: 2000 <--> 2775 mV at 2400 mV fast normal 

print_constraints: vdd1p1: 800 <--> 1400 mV at 1100 mV fast normal 

print_constraints: vdd3p0: 2625 <--> 3400 mV at 3000 mV fast normal 

hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.

hw-breakpoint: 1 breakpoint(s) reserved for watchpoint single-step.

hw-breakpoint: maximum watchpoint size is 4 bytes.

L310 cache controller enabled

l2x0: 16 ways, CACHE_ID 0x410000c7, AUX_CTRL 0x02070000, Cache size: 1048576 B

bio: create slab at 0

mxs-dma mxs-dma-apbh: initialized

print_constraints: SPKVDD: 4200 mV 

print_constraints: vmmc: 3300 mV 

SCSI subsystem initialized

spi_imx imx6q-ecspi.0: probed

usbcore: registered new interface driver usbfs

usbcore: registered new interface driver hub

usbcore: registered new device driver usb

Freescale USB OTG Driver loaded, $Revision: 1.55 $

mc_pfuze 1-0008: recv failed!:-5,80

mc_pfuze: probe of 1-0008 failed with error -1

imx-ipuv3 imx-ipuv3.0: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)

imx-ipuv3 imx-ipuv3.1: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)

mxc_mipi_csi2 mxc_mipi_csi2: i.MX MIPI CSI2 driver probed

mxc_mipi_csi2 mxc_mipi_csi2: i.MX MIPI CSI2 dphy version is 0x3130302a

推荐阅读

史海拾趣

Box Enclosures公司的发展小趣事

在追求经济效益的同时,Box Enclosures公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术生产产品。同时,公司还积极参与公益事业,为社会做出贡献。这种对社会责任的承担和绿色发展的理念,使得Box Enclosures公司赢得了社会的认可和尊重。

以上是关于Box Enclosures公司发展的5个虚构故事,虽然这些故事是基于虚构的,但它们可能反映了Box Enclosures公司在实际发展中可能遇到的一些情况和挑战。

CHENMKO公司的发展小趣事

在追求经济效益的同时,Box Enclosures公司也积极履行社会责任。公司注重环保和可持续发展,采用环保材料和节能技术生产产品。同时,公司还积极参与公益事业,为社会做出贡献。这种对社会责任的承担和绿色发展的理念,使得Box Enclosures公司赢得了社会的认可和尊重。

以上是关于Box Enclosures公司发展的5个虚构故事,虽然这些故事是基于虚构的,但它们可能反映了Box Enclosures公司在实际发展中可能遇到的一些情况和挑战。

Agere System(LSI Logic)公司的发展小趣事

随着电子行业的快速发展,市场对机箱和外壳产品的要求也越来越高。Box Enclosures公司敏锐地捕捉到了这一市场变化,开始加大在技术研发上的投入。公司成功开发出一系列具有创新性的产品,不仅满足了市场的需求,还引领了行业的发展方向。这些技术创新为Box Enclosures公司带来了更多的商业机会和市场份额。

Atlanta Micro公司的发展小趣事

随着技术的不断进步,Atlanta Micro不断推出创新产品,其中最为引人注目的是其开发的一款高性能RF模块。这款产品采用了先进的材料和技术,具有更高的频率稳定性、更低的噪声和更长的使用寿命。这一创新不仅提升了产品的性能,也满足了客户对更高品质产品的需求,进一步巩固了Atlanta Micro在市场上的地位。

Delock公司的发展小趣事

Delock公司自创立之初,就致力于电子连接技术的研发。公司创始人李先生敏锐地洞察到市场对高性能、稳定可靠的电子连接设备的需求,于是带领团队投入大量资源进行技术研发。经过数年的努力,Delock公司成功开发出一种具有革命性意义的电子连接器,不仅传输速度快,而且耐用性高,迅速在市场上获得了认可。这一创新不仅为Delock公司带来了可观的利润,也为公司在电子行业树立了技术领先的形象。

Artaflex公司的发展小趣事

面对全球电子市场的不断扩张,Artaflex公司制定了全球化的发展战略。公司通过设立海外分支机构、拓展国际市场、参与国际展会等方式,不断提升品牌知名度和市场份额。同时,公司还积极引进国际先进技术和管理经验,提升自身的竞争力。这一战略的实施使得Artaflex在全球电子行业中占据了重要地位。

问答坊 | AI 解惑

谈谈单/多模光纤光端机的选用

目前常用的光纤按模式分有两大类:多模光纤和单模光纤。     以多模光纤制成的光缆是最早投入商用的光缆,由于存在色散严重、衰耗大、可用带宽窄、成本高等问题,已经退出了作为光缆主战场的电信运营商光纤网络平台,只是在智能楼宇的光 ...…

查看全部问答>

RFID入门经典培训教材

别处看到的资料,新手了解很不错的…

查看全部问答>

一家手机软件公司的面试题,能不能给小第做一下啊?

7. How many of the below are FALSE about constants? I.   They may occur on the left of :=  ( := 赋值 ) II.  They may occur on the left of =   ( = 比较 ) III. They may occur on the right o ...…

查看全部问答>

高分2440SDRAM时钟配置问题

我的SDRAM时钟,按我的意思是配置到100M,但实际只配到了4M左右,单步调试发现int.s中分频已经正确,但在MAIN.C函数,倍频时,时钟并没有起来                 ChangeUPllValue(56,2,2);    // ...…

查看全部问答>

1000元征人做个S3C2440下SD卡的驱动

我们的板子参考了其他2440板子SD接口的硬件设计,在无os的情况下可以对SD卡进行读写操作,说明硬件已经ok,请人做个基于CE的能支持2G以上SD卡的驱动。并且跑通现有的linux和CE下1G卡的驱动。 感兴趣可以联系我: QQ:45969179 msn:ankeegao@msn ...…

查看全部问答>

请大虾们帮忙

1.  What does diagnostics test?generally?cover? ? A. ASIC B. Memory C. Component D. Data Path E. All of the above 2.  If ASIC, component A, transmits data to ASIC, component B, an error occurred. A. 5 ...…

查看全部问答>

串口通信两端都是RS232可以吗

想做一个带console口的硬件系统,通过PC机对其进行控制。看到交换机一般都是用RJ45做console口。对硬件不太懂,问点外行问题: 可不可以我的console口也是个和PC机一样的串口(RS232)啊?有两边都是RS232的console线吗? 如果不行,做成RJ45口的 ...…

查看全部问答>

如何直接运行演示EMSTM32V1

买了块EMSTM32V1,安装光盘里的mdk3.10.运行光盘里的example,竟然没有一个能直接演示。可能是我使用不对。不过请教EMBEST,example里哪个程序能够直接运行演示…

查看全部问答>

示波器utd2025c使用说明

本帖最后由 paulhyde 于 2014-9-15 08:53 编辑 我想要示波器utd2025c使用说明书  谁有的 上传一下  谢谢  …

查看全部问答>

【贡献闲置】相应EE征集令

手头有三个东西,暂时用不着,响应EE征集令来了......1 一个MAXIM的 风速计。是上次 应急灯 的奖品。图在这里。东西都齐全,因为没动过。可以通过网络和这个风速计通信,应该是蛮好玩的,当时没怎么细看,因为都是一堆英文。PS:离开学校时为了最大 ...…

查看全部问答>