前篇文章已经在tqimx6q上成功跑起了新版BSP的uboot,本文来配置下新版BSP的kernel,使kernel能在tqimx6q上正常启动。
准备工作
每次移植kernel的时候都会做的工作就是找到与当前开发板接近的config,其实uboot移植的时候也是一样的。由于tqimx6q的芯片是imx6q的,所以,还是以mx6q_sabresd为例。另外,自己动手移植BSP时应该充分使用官方文档,本人以为,以下文档是非常有用的:
(1) i.MX 6 BSP Porting Guide: 该文档详细的记载了BSP移植的流程。
(2) i.MX 6 SABRE-SD Linux User's Guide: 该文档详细的记载了各种启动介质的制作方法。
在第二份文章中搜索defconfig,就可以找到imx6q使用的config文件是:imx_v7_defconfig,如果直接在arch/arm/configs目录下grep搜索MX6Q的话,可以搜到三个文件,其实也是可以确认使用哪个配置文件比较合适的。
内核移植
确定好了配置文件,接下看就开始内核移植。本文的目前不是移植好所有的驱动,而是先让内核能够在tqimx6q开发板上跑起来,接下来再去慢慢各个击破驱动。
Step1. 定制DTS
[cpp]
view plain
copy
- cp imx6q-sabresd.dts imx6q-tqimx6q.dts
- cp imx6qdl-sabresd.dtsi tqimx6q.dtsi
Step2. 修改include文件
用自己熟悉的文本编辑器打开文件mx6q-tqimx6q.dts,然后将imx6qdl-sabresd.dtsi改为tqimx6q.dtsi。
Step3. 定制pinctrl
移植uboot的时候就知道,sabresd开发板的系统uart端子与tqimx6q的是不一致的,而且SD3的端子与tqimx6q的uart端子冲突,因此配置这几个端子的pinctrl即可。其实,我认为freescale维护这个版本的DTB结构不是太好,imx6qdl.dtsi应该是imx6qdl共通的配置,不应该将uart这些pinctrl添加在这里,如果添加在这里的话应该将各种配置情况都罗列出来。本文没有尝试改变这种结构,在现有结构的基础上,尽可能少的修改了DTS文件,具体步骤如下:
打开imx6qdl.dtsi,然后做如下修改:
(1) 打开imx6qdl.dtsi,添加tqimx6q的uart pinctrl配置。
[cpp]
view plain
copy
- uart1 {
- ...
- pinctrl_uart1_2: uart1grp-2 {
- fsl,pins = <
- MX6QDL_PAD_SD3_DAT7__UART1_TX_DATA 0x1b0b1
- MX6QDL_PAD_SD3_DAT6__UART1_RX_DATA 0x1b0b1
- >;
- };
- };
实际上就是在原有uart pinctrl配置的基础上又添加了另外一种配置方式。
(2) 打开tqimx6q.dtsi,将uart1的pinctrl指定为pinctrl_uart1_2。
[cpp]
view plain
copy
- &uart1 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_uart1_2>;
- status = "okay";
- };
(3) 板载SD卡配置修改
[cpp]
view plain
copy
- &usdhc2 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usdhc2_2>;
- cd-gpios = <&gpio1 4 0>;
- wp-gpios = <&gpio1 2 0>;
- no-1-8-v;
- keep-power-in-suspend;
- enable-sdio-wakeup;
- status = "okay";
- };
重新指定了pinctrl、cd(card detect)和wp(write protection)端子。
(4) 板载SD WIFI接口赞改
由于tqimx6q的SD3用户SDIO WIFI,且SD3_DAT7和SD3_DAT6端子用作uart,故需要修改其pinctrl,不至于与uart冲突。我们将SD3的pinctrl暂作如下修改:
[cpp]
view plain
copy
- &usdhc3 {
- pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_usdhc3_2>;
- cd-gpios = <&gpio2 0 0>;
- wp-gpios = <&gpio2 1 0>;
- no-1-8-v;
- keep-power-in-suspend;
- enable-sdio-wakeup;
- status = "okay";
- };
Step4. 设置环境变量
[cpp]
view plain
copy
- export ARCH=arm
- export CROSS_COMPILE=arm-linux-gnueabi-
Step5. 配置内核
[cpp]
view plain
copy
- make imx_v7_defconfig
由于官方默认方式是使用传统的ATAGS方式传递内核参数的,但为了提高开发效率,本文还是使用了新的DTB方式传递内核参数。为此,需要配置内核,关闭老式ATAGS方式内核参数传递的支持:
[cpp]
view plain
copy
- make menuconfig
然后将如下配置项取消:
[cpp]
view plain
copy
- Boot options --->
- [*] Support for the traditional ATAGS boot data passing (NEW)
Step6. 编译内核及DTB
修改并保存内核配置项之后就可以尝试编译内核了:
[cpp]
view plain
copy
- make uImage LOADADDR=0x12000000
内核编译时间比较长,需耐心等待。内核编译完成后编译DTB:
[cpp]
view plain
copy
- make imx6q-tqimx6q.dtb
烧写镜像
内核编译完成后可以得到内核镜像zImage和DTB文件tqimx6q.dtb,接下来我们将这两个文件烧写到SD卡并尝试启动开发板。
(1) 烧写内核镜像
[cpp]
view plain
copy
- sudo dd if=uImage of=/dev/sdb bs=512 seek=2048 conv=fsync
(2) 烧写DTB文件
[cpp]
view plain
copy
- sudo dd if=tqimx6q.dtb of=/dev/sdb bs=512 seek=20480 conv=fsync
通过以上指令,将zImage烧写到SD卡偏移1M的位置上,将tqimx6q.dtb烧写到了SD卡偏移10M的位置上。
启动内核
将SD卡插到开发板后给开发板上电,按任意键打断uboot启动,并按如下内容配置uboot环境变量。
[cpp]
view plain
copy
- setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/mmcblk0p1 rw init=/linuxrc'
- setenv bootcmd 'mmc dev 0; mmc read 0x11ffffc0 0x800 0x3000; mmc read 0x18000000 0x5000 0x800; bootm 0x11ffffc0 - 0x18000000'
- saveenv
然后重启开发板即成功启动内核。
效果展示
内核启动Log如下:
[cpp]
view plain
copy
- U-Boot 2013.04-04987-g98fdbdc-dirty (May 03 2015 - 11:46:24)
-
- CPU: Freescale i.MX6Q rev1.2 at 792 MHz
- CPU: Temperature 39 C, calibration data: 0x54e4bb69
- Reset cause: POR
- Board: MX6Q/SDL-SabreSD
- I2C: ready
- DRAM: 1 GiB
- MMC: FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2
- No panel detected: default to Hannstar-XGA
- Display: Hannstar-XGA (1024x768)
- In: serial
- Out: serial
- Err: serial
- mmc0 is current device
- Net: Phy not found
- PHY reset timed out
- FEC [PRIME]
- Warning: failed to set MAC address
-
- Normal Boot
- Hit any key to stop autoboot: 0
- mmc0 is current device
-
- MMC read: dev # 0, block # 2048, count 12288 ... 12288 blocks read: OK
-
- MMC read: dev # 0, block # 20480, count 2048 ... 2048 blocks read: OK
- ## Booting kernel from Legacy Image at 11ffffc0 ...
- Image Name: Linux-3.10.17-80739-g33597e3-dir
- Image Type: ARM Linux Kernel Image (uncompressed)
- Data Size: 5289224 Bytes = 5 MiB
- Load Address: 12000000
- Entry Point: 12000000
- Verifying Checksum ... OK
- ## Flattened Device Tree blob at 18000000
- Booting using the fdt blob at 0x18000000
- XIP Kernel Image ... OK
- OK
- Read SW1AB error!
- Using Device Tree in place at 18000000, end 1800e8e7
-
- Starting kernel ...
-
- Booting Linux on physical CPU 0x0
- Linux version 3.10.17-80739-g33597e3-dirty (lilianrong@lenovo) (gcc version 4.7.3 (Ubuntu/Linaro 4.7.3-12ubuntu1) ) #1 SMP PREEMPT Sun May 3 11:31:37 CST 2015
- CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
- CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
- Machine: Freescale i.MX6 Quad/DualLite (Device Tree), model: Freescale i.MX6 Quad SABRE Smart Device Board
- cma: CMA: reserved 320 MiB at 3c000000
- Memory policy: ECC disabled, Data cache writealloc
- PERCPU: Embedded 8 pages/cpu @814fd000 s8896 r8192 d15680 u32768
- Built 1 zonelists in Zone order, mobility grouping on. Total pages: 260096
- 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: 1024MB = 1024MB total
- Memory: 697768k/697768k available, 350808k reserved, 0K highmem
- Virtual kernel memory layout:
- vector : 0xffff0000 - 0xffff1000 ( 4 kB)
- fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
- vmalloc : 0xc0800000 - 0xff000000 (1000 MB)
- lowmem : 0x80000000 - 0xc0000000 (1024 MB)
- pkmap : 0x7fe00000 - 0x80000000 ( 2 MB)
- modules : 0x7f000000 - 0x7fe00000 ( 14 MB)
- .text : 0x80008000 - 0x80be704c (12157 kB)
- .init : 0x80be8000 - 0x80c2a2c0 ( 265 kB)
- .data : 0x80c2c000 - 0x80c7c260 ( 321 kB)
- .bss : 0x80c7c260 - 0x80ce5434 ( 421 kB)
- SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
- Preemptible hierarchical RCU implementation.
- NR_IRQS:16 nr_irqs:16 16
- L310 cache controller enabled
- l2x0: 16 ways, CACHE_ID 0x410000c7, AUX_CTRL 0x32070000, Cache size: 1048576 B
- sched_clock: 32 bits at 3000kHz, resolution 333ns, wraps every 1431655ms
- CPU identified as i.MX6Q, silicon rev 1.2
- 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
- CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
- Setting up static identity map for 0x80610608 - 0x80610660
- CPU1: Booted secondary processor
- CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
- CPU2: Booted secondary processor
- CPU2: thread -1, cpu 2, socket 0, mpidr 80000002
- CPU3: Booted secondary processor
- CPU3: thread -1, cpu 3, socket 0, mpidr 80000003
- Brought up 4 CPUs
- SMP: Total of 4 processors activated (6324.22 BogoMIPS).
- CPU: All CPU(s) started in SVC mode.
- devtmpfs: initialized
- pinctrl core: initialized pinctrl subsystem
- regulator-dummy: no parameters
- NET: Registered protocol family 16
- DMA: preallocated 256 KiB pool for atomic coherent allocations
- Use WDOG2 as reset source
- syscon 20c8000.anatop: regmap [mem 0x020c8000-0x020c8fff] registered
- vdd1p1: 800 <--> 1375 mV at 1125 mV
- vdd3p0: 2800 <--> 3150 mV at 3000 mV
- vdd2p5: 2000 <--> 2750 mV at 2425 mV
- cpu: 725 <--> 1450 mV at 1150 mV
- vddpu: 725 <--> 1450 mV
- vddsoc: 725 <--> 1450 mV at 1200 mV
- syscon 20e0000.iomuxc-gpr: regmap [mem 0x020e0000-0x020e0037] registered
- syscon 21bc000.ocotp-ctrl: regmap [mem 0x021bc000-0x021bffff] registered
- hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
- hw-breakpoint: maximum watchpoint size is 4 bytes.
- imx6q-pinctrl 20e0000.iomuxc: initialized IMX pinctrl driver
- bio: create slab at 0
- mxs-dma 110000.dma-apbh: initialized
- usb_otg_vbus: 5000 mV
- usb_h1_vbus: 5000 mV
- wm8962-supply: no parameters
- mipi_dsi_pwr_on: no parameters
- sensor-supply: 3300 mV
- i2c-core: driver [max17135] using legacy suspend method
- i2c-core: driver [max17135] using legacy resume method
- SCSI subsystem initialized
- usbcore: registered new interface driver usbfs
- usbcore: registered new interface driver hub
- usbcore: registered new device driver usb
- i2c i2c-0: IMX I2C adapter registered
- i2c i2c-1: IMX I2C adapter registered
- i2c i2c-2: IMX I2C adapter registered
- Linux video capture interface: v2.00
- pps_core: LinuxPPS API ver. 1 registered
- pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti
- PTP clock support registered
- imx-ipuv3 2400000.ipu: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)
- imx-ipuv3 2800000.ipu: IPU DMFC NORMAL mode: 1(0~1), 5B(4,5), 5F(6,7)
- mxc_mipi_csi2 21dc000.mipi_csi: i.MX MIPI CSI2 driver probed
- mxc_mipi_csi2 21dc000.mipi_csi: i.MX MIPI CSI2 dphy version is 0x3130302a
- MIPI CSI2 driver module loaded
- Advanced Linux Sound Architecture Driver Initialized.
- cfg80211: Calling CRDA to update world regulatory domain
- Switching to clocksource mxc_timer1
- NET: Registered protocol family 2
- TCP established hash table entries: 8192 (order: 4, 65536 bytes)
- TCP bind hash table entries: 8192 (order: 4, 65536 bytes)
- TCP: Hash tables configured (established 8192 bind 8192)
- TCP: reno registered
- UDP hash table entries: 512 (order: 2, 16384 bytes)
- UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
- NET: Registered protocol family 1
- RPC: Registered named UNIX socket transport module.
- RPC: Registered udp transport module.
- RPC: Registered tcp transport module.
- RPC: Registered tcp NFSv4.1 backchannel transport module.
- hw perfevents: enabled with ARMv7 Cortex-A9 PMU driver, 7 counters available
- pureg-dummy: no parameters
- imx6_busfreq busfreq.15: DDR medium rate not supported.
- Bus freq driver module loaded
- VFS: Disk quotas dquot_6.5.2
- Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
- NFS: Registering the id_resolver key type
- Key type id_resolver registered
- Key type id_legacy registered
- jffs2: version 2.2. (NAND) 漏 2001-2006 Red Hat, Inc.
- fuse init (API version 7.22)
- msgmni has been set to 2002
- io scheduler noop registered
- io scheduler deadline registered
- io scheduler cfq registered (default)
- imx-weim 21b8000.weim: WEIM driver registered.
- mxc_mipi_dsi 21e0000.mipi: i.MX MIPI DSI driver probed
- MIPI DSI driver module loaded
- mxc_sdc_fb fb.30: register mxc display driver ldb
- imx-ipuv3 2800000.ipu: IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5), 5F(6,7)
- Console: switching to colour frame buffer device 128x48
- mxc_sdc_fb fb.31: register mxc display driver hdmi
- mxc_hdmi 20e0000.hdmi_video: Detected HDMI controller 0x13:0xa:0xa0:0xc1
- fbcvt: 1920x1080@60: CVT Name - 2.073M9
- mxc_sdc_fb fb.32: register mxc display driver lcd
- mxc_sdc_fb fb.32: ipu0-di0 already in use
- mxc_sdc_fb: probe of fb.32 failed with error -16
- mxc_sdc_fb fb.33: register mxc display driver ldb
- imx-sdma 20ec000.sdma: no iram assigned, using external mem
- imx-sdma 20ec000.sdma: loaded firmware 1.1
- imx-sdma 20ec000.sdma: initialized
- pfuze100-regulator 1-0008: unrecognized pfuze chip ID!
- pfuze100-regulator: probe of 1-0008 failed with error -5
- Serial: IMX driver
- 2020000.serial: ttymxc0 at MMIO 0x2020000 (irq = 58) is a IMX
- console [ttymxc0] enabled
- serial: Freescale lpuart driver
- [drm] Initialized drm 1.1.0 20060810
- [drm] Initialized vivante 1.0.0 20120216 on minor 0
- brd: module loaded
- loop: module loaded
- Wait for CR ACK error!
- sata phy RX_PLL is stable!
- ahci: SSS flag set, parallel bus scan disabled
- ahci ahci: AHCI 0001.0300 32 slots 1 ports 3 Gbps 0x1 impl platform mode
- ahci ahci: flags: ncq sntf stag pm led clo only pmp pio slum part ccc apst
- scsi0 : ahci_platform
- ata1: SATA max UDMA/133 mmio [mem 0x02200000-0x02203fff] port 0x100 irq 71
- m25p80 spi32766.0: found mr25h256, expected m25p32
- m25p80 spi32766.0: mr25h256 (32 Kbytes)
- spi_imx 2008000.ecspi: probed
- CAN device driver interface
- fec 2188000.ethernet (unregistered net_device): Invalid MAC address: 00:00:00:00:00:00
- fec 2188000.ethernet (unregistered net_device): Using random MAC address: 1a:54:2d:73:ce:bf
- libphy: fec_enet_mii_bus: probed
- fec 2188000.ethernet eth0: registered PHC device 0
- ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
- usbcore: registered new interface driver usb-storage
- ci_hdrc ci_hdrc.1: doesn't support gadget
- ci_hdrc ci_hdrc.1: EHCI Host Controller
- ci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 1
- ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00
- hub 1-0:1.0: USB hub found
- hub 1-0:1.0: 1 port detected
- mousedev: PS/2 mouse device common for all mice
- elan-touch 2-0010: elan - Read Hello Packet Failed
- elan-touch: probe of 2-0010 failed with error -22
- egalax_ts 1-0004: Failed to read firmware version
- egalax_ts: probe of 1-0004 failed with error -5
- egalax_ts 2-0004: Failed to read firmware version
- egalax_ts: probe of 2-0004 failed with error -5
- input: max11801_ts as /devices/soc0/soc.1/2100000.aips-bus/21a4000.i2c/i2c-1/1-0048/input/input0
- i2c-core: driver [isl29023] using legacy suspend method
- i2c-core: driver [isl29023] using legacy resume method
- snvs_rtc 20cc034.snvs-rtc-lp: rtc core: registered 20cc034.snvs-rtc-lp as rtc0
- i2c /dev entries driver
- mxc_v4l2_output v4l2_out.38: V4L2 device registered as video16
- mxc_v4l2_output v4l2_out.38: V4L2 device registered as video17
- mxc_v4l2_output v4l2_out.38: V4L2 device registered as video18
- mxc_v4l2_output v4l2_out.38: V4L2 device registered as video19
- mxc_v4l2_output v4l2_out.38: V4L2 device registered as video20
- ata1: SATA link down (SStatus 0 SControl 300)
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- max11801_ts 1-0048: FIFO_RD_AUX_MSB read fails
- usb 1-1: new high-speed USB device number 2 using ci_hdrc
- mag3110 2-000e: check mag3110 chip ID
- mag3110 2-000e: read chip ID 0xfffffffb is not equal to 0xc4!
- mag3110: probe of 2-000e failed with error -22
- i2c-core: driver [mag3110] using legacy suspend method
- i2c-core: driver [mag3110] using legacy resume method
- mma8451 0-001c: read chip ID 0x1 is not equal to 0x1a or 0x2a!
- mma8451: probe of 0-001c failed with error -22
- imx2-wdt 20bc000.wdog: IMX2+ Watchdog Timer enabled. timeout=60s (nowayout=0)
- cpuidle: using governor ladder
- cpuidle: using governor menu
- sdhci: Secure Digital Host Controller Interface driver
- sdhci: Copyright(c) Pierre Ossman
- sdhci-pltfm: SDHCI platform and OF driver helper
- mmc0: no vqmmc regulator found
- mmc0: no vmmc regulator found
- mmc0: SDHCI controller on 2194000.usdhc [2194000.usdhc] using ADMA
- mmc1: no vqmmc regulator found
- mmc1: no vmmc regulator found
- hub 1-1:1.0: USB hub found
- hub 1-1:1.0: 4 ports detected
- mmc1: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMA
- mmc2: no vqmmc regulator found
- mmc2: no vmmc regulator found
- mmc0: new high speed SDHC card at address e624
- mmcblk0: mmc0:e624 SS08G 7.40 GiB
- mmcblk0: unknown partition table
- mmc2: SDHCI controller on 219c000.usdhc [219c000.usdhc] using ADMA
- mmc2: BKOPS_EN bit is not set
- mmc2: new high speed DDR MMC card at address 0001
- mmcblk1: mmc2:0001 008G92 7.28 GiB
- mmcblk1boot0: mmc2:0001 008G92 partition 1 4.00 MiB
- mmcblk1boot1: mmc2:0001 008G92 partition 2 4.00 MiB
- mmcblk1rpmb: mmc2:0001 008G92 partition 3 512 KiB
- mmcblk1: p1 p2 p3 < p5 p6 p7 > p4
- mmcblk1boot1: unknown partition table
- mmcblk1boot0: unknown partition table
- Galcore version 4.6.9.9754
总结
通过以上修改,内核已经可以在开发板上成功启动了。从Log上可以清楚的看到,kernel已经识别到了SD卡,但是不识别分区,后面的文章将讲述如何挂载根文件系统。如有错误,请帮忙指出;有疑问可以留言讨论。