i.MX6DL学习记录---kernel移植

来源:互联网 发布:unity3d网络游戏实战 编辑:程序博客网 时间:2024/05/22 08:02

软件版本:uboot-2013-04 + kernel-3.10.35

硬件版本:i.MX6DL-Sabreasd


准备工作

移植kernel和uboot差不多,由于这里下载的是freescale官网维护的kernel版本,所以工作量不是很大,找到对应的config文件,参照自己的硬件修改对应的源码即可,在arch/arm/configs中可以找到这里需要的配置文件,因为imx6dl是一款ARMv7框架的芯片,所以这里的配置文件是imx_v7_config。以前接触的kernel都是使用传统的ATAGS方式传递内核参数,这次使用的kernel-3.10.35引进了一个新的概念DeviceTree,据说是从kernel3.x之后就开始实行了,有兴趣的可以去了解下。


在实行新的DTB方式传递内核参数后驱动源码的结构就更加清晰了,省去了设备注册这部分重复的代码,代替以前的设备注册,改成了arch/arm/boot/dts目录下的.dts文件了。在这个目录下找到对应板子的.dts文件imx6dl-sabresd.dts,在这个文件中就实现了一个i2c设备注册,但包含了一系列.dtsi文件,类似于include “xxx.h”一样

/dts-v1/;#include "imx6dl.dtsi"#include "imx6qdl-sabresd.dtsi"#include "imx6dl-sabresd-common.dtsi"/ {    model = "Freescale i.MX6 DualLite SABRE Smart Device Board(PFUZE100)";    compatible = "fsl,imx6dl-sabresd", "fsl,imx6dl";};
需要修改设备注册文件imx6qdl-sabresd.dtsi  和引脚定义文件imx6qdl.dtsi,在后面各个设备驱动的移植添加会大量修改这两个文件


内核移植

既然是freescale维护的内核,而且这里使用的board也和官网demo板差不多,所以即使不做任何修改也能在机器上跑起来。这里修改下SD3引脚以支持SD卡存储,为后面挂载文件系统做准备。

1》修改CD引脚

--- a/arch/arm/boot/dts/imx6qdl-sabresd.dtsi+++ b/arch/arm/boot/dts/imx6qdl-sabresd.dtsi@@ -637,9 +637,9 @@  &usdhc3 {        pinctrl-names = "default";-       pinctrl-0 = <&pinctrl_usdhc3_1>;-       cd-gpios = <&gpio2 0 0>;-       wp-gpios = <&gpio2 1 0>;+       pinctrl-0 = <&pinctrl_usdhc3_2>;  /*板载SD3使用的是4PIN数据线,在imx6qdl.dtsi中已经定义好了*/+       cd-gpios = <&gpio1 6 0>;+       bus-width = <4>;        no-1-8-v;        keep-power-in-suspend;        enable-sdio-wakeup;


2》使用DTB

由于官方默认方式是使用传统的ATAGS方式传递内核参数的,但为了提高开发效率,本文还是使用了新的DTB方式传递内核参数。为此,需要配置内核,关闭老式ATAGS方式内核参数传递的支持。

--- a/arch/arm/Kconfig+++ b/arch/arm/Kconfig@@ -1859,7 +1859,7 @@ config USE_OF  config ATAGS        bool "Support for the traditional ATAGS boot data passing" if USE_OF-       default y+       default n        help          This is the traditional way of passing data to the kernel at boot          time. If you are solely relying on the flattened device tree (or
将默认的ATAGS方式失能

3》编译内核

#!/bin/bashexport ARCH=armexport CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-#make distclean;make imx_v7_defconfig                                                                                                                                                  make imx6dl-sabresd.dtbmake uImage LOADADDR=0x12000000


4》烧录镜像

#!/bin/shsudo dd if=uImage of=/dev/sdx bs=512 seek=2048 conv=fsync                                                                                                              sudo dd if=./dts/imx6dl-sabresd.dtb of=/dev/sdx bs=512 seek=20480 conv=fsync

启动内核

将SD卡插到开发板后给开发板上电,按任意键打断uboot启动,并按如下内容配置uboot环境变量。

setenv bootargs 'noinitrd console=ttymxc0,115200 root=/dev/mmcblk2p1 rw init=/linuxrc'setenv bootcmd 'mmc dev 1; mmc read 0x11ffffc0 0x800 0x3000; mmc read 0x18000000 0x5000 0x800; bootm 0x11ffffc0 - 0x18000000'saveenv
run bootcmd


启动log如下:

U-Boot 2013.04-04989-g6bb0820-dirty (Jul 25 2016 - 10:31:08)CPU:   Freescale i.MX6DL rev1.1 at 792 MHzCPU:   Temperature 54 C, calibration data: 0x5aa50e69Reset cause: PORBoard: MX6Q/SDL-SabreSDI2C:   readyDRAM:  1 GiBMMC:   FSL_SDHC: 0, FSL_SDHC: 1, FSL_SDHC: 2No panel detected: default to Hannstar-XGADisplay: Hannstar-XGA (1024x768)In:    serialOut:   serialErr:   serialmmc1 is current deviceNet:   Phy not foundPHY reset timed outFEC [PRIME]Warning: failed to set MAC addressNormal BootHit any key to stop autoboot:  0 mmc1 is current deviceMMC read: dev # 1, block # 2048, count 12288 ... 12288 blocks read: OKMMC read: dev # 1, block # 20480, count 2048 ... 2048 blocks read: OK## Booting kernel from Legacy Image at 11ffffc0 ...   Image Name:   Linux-3.10.53-84330-g1409f05-dir   Image Type:   ARM Linux Kernel Image (uncompressed)   Data Size:    5590960 Bytes = 5.3 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 ... OKOKRead SW1AB error!   Using Device Tree in place at 18000000, end 1800f378Starting kernel ...Booting Linux on physical CPU 0x0Linux version 3.10.53-84330-g1409f05-dirty (robin@Grandtelco) #19 SMP PREEMPT Thu Jul 28 11:52:43 CST 2016CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7dCPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cacheMachine: Freescale i.MX6 Quad/DualLite (Device Tree), model: Freescale i.MX6 DualLite SABRE Smart Device Board(PFUZE100)cma: CMA: reserved 320 MiB at 3c000000Memory policy: ECC disabled, Data cache writeallocPERCPU: Embedded 8 pages/cpu @81593000 s8960 r8192 d15616 u32768Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260096Kernel command line: noinitrd console=ttymxc0,115200 root=/dev/mmcblk0p1 rw init=/linuxrcPID 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 totalMemory: 697228k/697228k available, 351348k reserved, 0K highmemVirtual 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 - 0x80c6e6b4   (12698 kB)      .init : 0x80c6f000 - 0x80cb9300   ( 297 kB)      .data : 0x80cba000 - 0x80d10fc0   ( 348 kB)       .bss : 0x80d10fc0 - 0x80d7a0e4   ( 421 kB)SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=2, Nodes=1Preemptible hierarchical RCU implementation.        RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.NR_IRQS:16 nr_irqs:16 16L310 cache controller enabledl2x0: 16 ways, CACHE_ID 0x410000c8, AUX_CTRL 0x32050000, Cache size: 524288 Bsched_clock: 32 bits at 3000kHz, resolution 333ns, wraps every 1431655msCPU identified as i.MX6DL, silicon rev 1.1Console: colour dummy device 80x30Calibrating delay loop... 1581.05 BogoMIPS (lpj=7905280)pid_max: default: 32768 minimum: 301Mount-cache hash table entries: 512CPU: Testing write buffer coherency: okCPU0: thread -1, cpu 0, socket 0, mpidr 80000000Setting up static identity map for 0x806800e0 - 0x80680138CPU1: Booted secondary processorCPU1: thread -1, cpu 1, socket 0, mpidr 80000001Brought up 2 CPUsSMP: Total of 2 processors activated (3162.11 BogoMIPS).CPU: All CPU(s) started in SVC mode.devtmpfs: initializedpinctrl core: initialized pinctrl subsystemregulator-dummy: no parametersNET: Registered protocol family 16DMA: preallocated 256 KiB pool for atomic coherent allocationsUse WDOG2 as reset sourcesyscon 20c8000.anatop: regmap [mem 0x020c8000-0x020c8fff] registeredvdd1p1: 800 <--> 1375 mV at 1100 mV vdd3p0: 2625 <--> 3400 mV at 3000 mV vdd2p5: 2000 <--> 2750 mV at 2400 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] registeredsyscon 21bc000.ocotp-ctrl: regmap [mem 0x021bc000-0x021bffff] registeredhw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.hw-breakpoint: maximum watchpoint size is 4 bytes.imx6dl-pinctrl 20e0000.iomuxc: initialized IMX pinctrl driverbio: create slab <bio-0> at 0mxs-dma 110000.dma-apbh: initializedusb_otg_vbus: 5000 mV usb_h1_vbus: 5000 mV wm8962-supply: no parametersmipi_dsi_pwr_on: no parameterssensor-supply: 3300 mV i2c-core: driver [max17135] using legacy suspend methodi2c-core: driver [max17135] using legacy resume methodSCSI subsystem initializedusbcore: registered new interface driver usbfsusbcore: registered new interface driver hubusbcore: registered new device driver usbi2c i2c-0: IMX I2C adapter registeredi2c i2c-1: IMX I2C adapter registeredi2c i2c-2: Max17135 PMIC not found!i2c i2c-2: IMX I2C adapter registeredLinux video capture interface: v2.00pps_core: LinuxPPS API ver. 1 registeredpps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>PTP clock support registeredimx-ipuv3 2400000.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 probedmxc_mipi_csi2 21dc000.mipi_csi: i.MX MIPI CSI2 dphy version is 0x3130302aMIPI CSI2 driver module loadedAdvanced Linux Sound Architecture Driver Initialized.Bluetooth: Core ver 2.16NET: Registered protocol family 31Bluetooth: HCI device and connection manager initializedBluetooth: HCI socket layer initializedBluetooth: L2CAP socket layer initializedBluetooth: SCO socket layer initializedcfg80211: Calling CRDA to update world regulatory domainpureg-dummy: no parametersSwitching to clocksource mxc_timer1NET: Registered protocol family 2TCP 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 registeredUDP hash table entries: 512 (order: 2, 16384 bytes)UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)NET: Registered protocol family 1RPC: 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 availableBus freq driver module loadedfutex hash table entries: 512 (order: 3, 32768 bytes)VFS: Disk quotas dquot_6.5.2Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)NFS: Registering the id_resolver key typeKey type id_resolver registeredKey type id_legacy registeredjffs2: version 2.2. (NAND) �© 2001-2006 Red Hat, Inc.fuse init (API version 7.22)msgmni has been set to 2001io scheduler noop registeredio scheduler deadline registeredio scheduler cfq registered (default)imx-weim 21b8000.weim: WEIM driver registered.mxc_mipi_dsi 21e0000.mipi: i.MX MIPI DSI driver probedMIPI DSI driver module loadedmxc_sdc_fb fb.31: registered mxc display driver ldbimx-ipuv3 2400000.ipu: IPU DMFC DP HIGH RESOLUTION: 1(0,1), 5B(2~5), 5F(6,7)Console: switching to colour frame buffer device 128x48mxc_hdmi 20e0000.hdmi_video: Detected HDMI controller 0x13:0x1a:0xa0:0xc1fbcvt: 1920x1080@60: CVT Name - 2.073M9mxc_sdc_fb fb.32: registered mxc display driver hdmiimx_epdc_fb 20f4000.epdc: Unable to get display PMIC regulator.err = 0xfffffdfbimx-sdma 20ec000.sdma: no iram assigned, using external memimx-sdma 20ec000.sdma: loaded firmware 1.1imx-sdma 20ec000.sdma: initializedpfuze100-regulator 1-0008: unrecognized pfuze chip ID!pfuze100-regulator: probe of 1-0008 failed with error -5Serial: IMX driver2020000.serial: ttymxc0 at MMIO 0x2020000 (irq = 58) is a IMXconsole [ttymxc0] enabledserial: Freescale lpuart driverimx sema4 driver is registered.[drm] Initialized drm 1.1.0 20060810[drm] Initialized vivante 1.0.0 20120216 on minor 0brd: module loadedloop: module loadedof_dma_request_slave_channel: dma-names property missing or emptyspi_imx 2008000.ecspi: cannot get the TX DMA channel!spi_imx 2008000.ecspi: dma setup error,use pio insteadm25p80 spi32766.0: found mr25h256, expected m25p32m25p80 spi32766.0: mr25h256 (32 Kbytes)spi_imx 2008000.ecspi: probedCAN device driver interfacefec 2188000.ethernet (unregistered net_device): Invalid MAC address: 00:00:00:00:00:00fec 2188000.ethernet (unregistered net_device): Using random MAC address: 82:30:12:c7:0f:05libphy: fec_enet_mii_bus: probedfec 2188000.ethernet eth0: registered PHC device 0ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driverusbcore: registered new interface driver usb-storageci_hdrc ci_hdrc.1: doesn't support gadgetci_hdrc ci_hdrc.1: EHCI Host Controllerci_hdrc ci_hdrc.1: new USB bus registered, assigned bus number 1ci_hdrc ci_hdrc.1: USB 2.0 started, EHCI 1.00hub 1-0:1.0: USB hub foundhub 1-0:1.0: 1 port detectedmousedev: PS/2 mouse device common for all miceelan-touch 2-0010: elan - Read Hello Packet Failedelan-touch: probe of 2-0010 failed with error -22egalax_ts 1-0004: Failed to read firmware versionegalax_ts: probe of 1-0004 failed with error -5egalax_ts 2-0004: Failed to read firmware versionegalax_ts: probe of 2-0004 failed with error -5input: max11801_ts as /devices/soc0/soc.1/2100000.aips-bus/21a4000.i2c/i2c-1/1-0048/input/input0i2c-core: driver [isl29023] using legacy suspend methodi2c-core: driver [isl29023] using legacy resume methodsnvs_rtc 20cc034.snvs-rtc-lp: rtc core: registered 20cc034.snvs-rtc-lp as rtc0i2c /dev entries drivermxc_v4l2_output v4l2_out.37: V4L2 device registered as video16mxc_v4l2_output v4l2_out.37: V4L2 device registered as video17mxc_v4l2_output v4l2_out.37: V4L2 device registered as video18max11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmax11801_ts 1-0048: FIFO_RD_AUX_MSB read failsmag3110 2-000e: check mag3110 chip IDmag3110 2-000e: read chip ID 0xfffffffb is not equal to 0xc4!mag3110: probe of 2-000e failed with error -22i2c-core: driver [mag3110] using legacy suspend methodi2c-core: driver [mag3110] using legacy resume methodmma8451 0-001c: read chip ID 0x1 is not equal to 0x1a or 0x2a!mma8451: probe of 0-001c failed with error -22imx2-wdt 20c0000.wdog: IMX2+ Watchdog Timer enabled. timeout=60s (nowayout=0)Bluetooth: HCI UART driver ver 2.2Bluetooth: HCI H4 protocol initializedBluetooth: HCI BCSP protocol initializedBluetooth: HCIATH3K protocol initializedusbcore: registered new interface driver bcm203xusbcore: registered new interface driver btusbBluetooth: Generic Bluetooth SDIO driver ver 0.1usbcore: registered new interface driver ath3kcpuidle: using governor laddercpuidle: using governor menusdhci: Secure Digital Host Controller Interface driversdhci: Copyright(c) Pierre Ossmansdhci-pltfm: SDHCI platform and OF driver helpermmc1: no vqmmc regulator foundmmc1: no vmmc regulator foundmmc1: SDHCI controller on 2194000.usdhc [2194000.usdhc] using ADMAmmc2: no vqmmc regulator foundmmc2: no vmmc regulator foundmmc2: SDHCI controller on 2198000.usdhc [2198000.usdhc] using ADMAmmc3: no vqmmc regulator foundmmc3: no vmmc regulator foundmmc3: SDHCI controller on 219c000.usdhc [219c000.usdhc] using ADMAgalcore: clk_get vg clock failed, disable vg!mmc2: host does not support reading read-only switch. assuming write-enable.mmc2: new high speed SDHC card at address aaaammcblk2: mmc2:aaaa SS08G 7.40 GiB Galcore version 5.0.11.25762 mmcblk2: p1 p2

总结:第一次接触DeviceTree,需要了解的还很多,先暂时学会使用,目前只了解如果需要添加device,例如:i2c设备,SDIO设备等,就在.dts或对应的.dtsi文件中添加相应的设备信息,设备驱动对应的驱动程序需要添加对设备信息的识别部分,例如设备名,GPIO等信息



0 0
原创粉丝点击