历史上的今天
返回首页

历史上的今天

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

正在发生

2020年12月30日 | I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之kernel移植

2020-12-30 来源:eefocus

前篇文章已经在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 (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)

推荐阅读

史海拾趣

台湾美丽微(FMS)公司的发展小趣事

FTDI的历史可以追溯到1992年3月13日,由弗雷德·达特(Fred Dart)创立。公司初期专注于个人电脑市场,推出了针对主板芯片组的解决方案。其中,早期的主要客户之一是IBM,这些芯片被应用于AMBRA和PS/2系列的个人电脑中,为当时的计算机技术发展做出了重要贡献。这一时期的成功不仅奠定了FTDI的技术基础,也为其后续的市场拓展奠定了坚实的客户基础。

Diodes公司的发展小趣事

随着科技的快速发展和市场的不断变化,客户需求也在不断更新。为了满足客户不断变化的需求,Diodes公司始终保持敏锐的市场洞察力和创新力。公司不断推出新产品、新技术和新应用方案,以满足客户在性能、可靠性、成本等方面的需求。同时,Diodes还积极与客户沟通交流,了解客户的实际需求和反馈意见,不断优化产品和服务。这些努力使得Diodes能够紧跟市场步伐、满足客户需求,在激烈的市场竞争中保持领先地位。

Caddell-Burns Manufacturing公司的发展小趣事

在竞争激烈的电子行业中,质量管理是企业生存和发展的关键。Caddell-Burns Manufacturing公司深知这一点,因此他们始终将质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检验、包装等各个环节都进行严格把关。同时,公司还定期对员工进行质量培训,提高他们的质量意识和操作技能。这些措施确保了公司产品的稳定性和可靠性,赢得了客户的信赖。

EDAC公司的发展小趣事

ECS-A公司是一家专注于电子元器件生产的公司。在发展过程中,ECS-A公司意识到全球化是不可避免的趋势。因此,公司决定实施全球化战略,通过在海外设立生产基地、研发中心和销售网络,拓展国际市场。经过多年的努力,ECS-A公司的产品已经出口到全球多个国家和地区,公司也在多个国家和地区建立了分支机构。这一全球化战略不仅使ECS-A公司的销售额持续增长,也提升了公司的国际竞争力。

Axon' Cable公司的发展小趣事

随着科技的不断进步,Axon' Cable公司逐渐将业务拓展至航空航天领域。公司研发出了一系列高性能、高可靠性的数据网络系统和连接器产品,成功应用于众多重要的航空航天项目中。这些产品的成功应用不仅提升了Axon' Cable在航空航天领域的知名度,也为公司带来了丰厚的利润和更广阔的发展空间。

Adamant Co Ltd公司的发展小趣事

Adamant Co Ltd在电子行业的初期,以其独特的技术突破迅速崭露头角。公司研发出一款高效能、低成本的芯片,为智能手机市场带来了革命性的变化。凭借这一技术,Adamant Co Ltd迅速获得了市场份额,并与多家知名手机厂商建立了合作关系。随着产品的广泛应用,公司逐渐在电子行业中稳固了地位。

问答坊 | AI 解惑

用于汽车防盗器的低功耗无匙进入加密收发器技术

本文分析了不断变化的汽车盗窃手段,以及相应的汽车防盗技术的发展,重点介绍了TI最新的汽车防盗解决方案—DST+收发器的加密技术及系统组成,并阐述了与之兼容的新一代射频识别(RFID)技术方案—三维天线模拟前端芯片实现无匙进入的工作原理。 由 ...…

查看全部问答>

sqlce2.0

请问谁有SQLCE 2.0及SP3?小弟特求!…

查看全部问答>

关于ZigBee的问题

我是一个大二的学生,在这个寒假,老师叫我们弄一个两个节点的通信的系统,用pic和ZigBee,只需实现简单的通信,但是我面对ZigBee,不知道怎么入手,要实现这个功能,我应该学ZigBee的哪些内容,还有开发的过程是怎样的,对此我感到很困惑。希望能 ...…

查看全部问答>

i2c读写操作时序

i2c协议中提到有三种可能的传输方式 1 主机(发送器)发送到从机(接收器),传输的方向不会改变   S-->Slave Address-->R/W-->A-->Data-->NA-->P 2 在第一个字节后,主机立即读从机。在第一次响应时,主机(发送器)变成主机(接收器), ...…

查看全部问答>

2010年全国大学生电子设计打赛题目

医院病床呼叫和输液监控系统(G题) 【专科组】 一.任务 设计并制作一套用于医院的病床呼叫和输液监控系统,它由护士站主机、病床监控器等组成,而病床监控器同时具有呼叫和输液监控功能,系统结构如下图H-1所示。        ...…

查看全部问答>

香主,我这样计算有错吗?

我现在TIM3 PWM输出,已经是正确了。我主频在12MHz, APB1是HCLK 2分频的,所以TIM2,3,4的主频会自动倍频2,也就是TIM3,TIM4的主频是12MHz.现在我TIM3要产生1Hz的pwm,我已经实现了。12000000/(ARR+1)/PreScale = 120 ...…

查看全部问答>

求助关于28335+cpld+rtl8019as

您好,我现在用dsp28335+cpld+r8019做网口通讯,r8019的寄存器地址映射到了dsp28335的zone0区,对r8019进行初始化,当对其内部的单个寄存器进行写操作,发现memroy整个zone0全部变为该值。 例如:对reg00写0x21 发现 zone0 0x4000~0x5000 全为0x21 ...…

查看全部问答>

编译错误问题求助

各位请教了,我在学习ZLG的LM3S1138开发板,使用的是ZLG的例程,在编译时,出现这样的错误提示.是什么意思呢 Fatal Error[Pe005]: could not open source file \"hw_adc.h\" D:\\ZLG\\lm3s1138开发板练习\\Led\\User\\includes.h 72 Error while run ...…

查看全部问答>

新手求助

各位有没有PC端软件和PICC编译器软件啊。。若有,请分享一下。谢谢!…

查看全部问答>

最全的晶振讲解

偶然看到了这份资料,是本译文书《石英晶体谐振器和振荡器》 内容很全,不紧有原理还有制造介绍。 方便了解内容,贴个目录: 第一章 应用和要求........................................................... 4 第二章 石英晶体振荡器......... ...…

查看全部问答>