天天看點

I.MX6Q(TQIMX6Q/TQE9)學習筆記——新版BSP之kernel移植

前篇文章已經在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

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配置。

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。

&uart1 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_uart1_2>;
        status = "okay";
};
           

(3) 闆載SD卡配置修改

&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暫作如下修改:

&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. 設定環境變量

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
           

Step5. 配置核心

make imx_v7_defconfig
           

由于官方預設方式是使用傳統的ATAGS方式傳遞核心參數的,但為了提高開發效率,本文還是使用了新的DTB方式傳遞核心參數。為此,需要配置核心,關閉老式ATAGS方式核心參數傳遞的支援:

make menuconfig
           

然後将如下配置項取消:

Boot options  --->
[*]   Support for the traditional ATAGS boot data passing (NEW)
           

Step6. 編譯核心及DTB

修改并儲存核心配置項之後就可以嘗試編譯核心了:

make uImage LOADADDR=0x12000000
           

核心編譯時間比較長,需耐心等待。核心編譯完成後編譯DTB:

make imx6q-tqimx6q.dtb
           

燒寫鏡像

核心編譯完成後可以得到核心鏡像zImage和DTB檔案tqimx6q.dtb,接下來我們将這兩個檔案燒寫到SD卡并嘗試啟動開發闆。

(1) 燒寫核心鏡像

sudo dd if=uImage of=/dev/sdb bs=512 seek=2048 conv=fsync
           

(2) 燒寫DTB檔案

sudo dd if=tqimx6q.dtb of=/dev/sdb bs=512 seek=20480 conv=fsync
           

通過以上指令,将zImage燒寫到SD卡偏移1M的位置上,講tqimx6q.dtb燒寫到了SD卡偏移10M的位置上。

啟動核心

将SD卡插到開發闆後給開發闆上電,按任意鍵打斷uboot啟動,并按如下内容配置uboot環境變量。

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如下:

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 ([email protected]) (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 <bio-0> 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 <[email protected]>
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: [email protected]: 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卡,但是不識别分區,後面的文章将講述如何挂載根檔案系統。如有錯誤,請幫忙指出;有疑問可以留言讨論。

本文作者:girlkoo

本文連結:http://blog.csdn.net/girlkoo/article/details/45439687

make menuconfig
           

繼續閱讀