天天看點

iTop 4412 移植linux-5.8.6

由于linux核心已經很好的支援itop4412開發闆,移植起來也相對容易

開發環境

Ubuntu 19.04

CROSS_COMPILE arm-linux-gcc

iTop 4412 移植linux-5.8.6

1. 第一步 下載下傳linux核心

iTop 4412 移植linux-5.8.6
iTop 4412 移植linux-5.8.6

2.第二步 修改Makefile 指定交叉編譯器

371 ARCH        ?= arm
 372 CROSS_COMPILE   ?= arm-linux-gnueabi-
           
iTop 4412 移植linux-5.8.6

第三步、生成.config配置檔案,直接使用linux官方的預設配置即可

配置檔案在 arch/arm/configs

iTop 4412 移植linux-5.8.6
make exynos_defconfig
           

第四步、選配相關配置

make menuconfig
           
  1. 選擇晶片類型,我們進入下面的路徑:

    System Type >

    Samsung Exynos >

    iTop 4412 移植linux-5.8.6
  2. 配置調試序列槽,我們傳回到menuconfig第一級目錄,從第一級目錄進入到以下路徑:

    Kernel hacking >

    Arm Debugging >

    iTop 4412 移植linux-5.8.6
    iTop 4412 移植linux-5.8.6
  3. 傳回到menuconfig第一級目錄,從第一級目錄進入到以下路徑:

    Device Drives >

    Character devices>

    Serial drivers >

iTop 4412 移植linux-5.8.6
  1. 關閉DMA 否則會出現

    dma-pl330 12680000.pdma: Reset Channel-1 CS-20000fFTC-20000 Device Drivers

    iTop 4412 移植linux-5.8.6
  2. 完成設定後,儲存退出。

第五步 編譯核心

make uImage LOADADDR=0x40007000 -j4 
           

LOADADDR=0X40007000 表示指定核心的加載位址

iTop 4412 移植linux-5.8.6

第六步、修改裝置樹檔案

iTop 4412 移植linux-5.8.6

修改exynos4412-itop-scp-core.dtsi

iTop 4412 移植linux-5.8.6

因為沒有events這個屬性,将events修改為event即可

iTop 4412 移植linux-5.8.6

配置核心闆電源晶片

177             /* SCP uses 1.5v, POP uses 1.2v */
178             ldo2_reg: LDO2 {
179                 regulator-name = "VDDQ_M12";
180                 regulator-min-microvolt = <1500000>;
181                 regulator-max-microvolt = <1500000>;
182                 regulator-always-on;
183                 regulator-boot-on;
184                 op_mode = <1>; /* Normal Mode */
185             };

231             ldo9_reg: LDO9 {
232                 regulator-name = "VDD33_LCD";
233                 regulator-min-microvolt = <3000000>;
234                 regulator-max-microvolt = <3000000>;
235                 op_mode = <1>; /* Normal Mode */                                                                   
236             };


253             ldo12_reg: LDO12 {
254                 regulator-name = "VDD33_UOTG";
255                 regulator-min-microvolt = <3000000>;
256                 regulator-max-microvolt = <3000000>;
257                 regulator-always-on;
258                 op_mode = <1>; /* Normal Mode */
259             };   

300             /* Used by HSIC */
301             ldo18_reg: LDO18 {
302                 regulator-name = "VDDIOPERI_28";
303                 regulator-min-microvolt = <3000000>;
304                 regulator-max-microvolt = <3000000>;
305                 regulator-always-on;
306                 op_mode = <1>; /* Normal Mode */                                                                   
307             };

314             ldo20_reg: LDO20 {
315                 regulator-name = "VDD28_CAM";
316                 regulator-min-microvolt = <3000000>;
317                 regulator-max-microvolt = <3000000>;
318                 op_mode = <1>; /* Normal Mode */
319             };

321             ldo21_reg: LDO21 {
322                 regulator-name = "VDD28_AF";                                                                       
323                 regulator-min-microvolt = <3000000>;
324                 regulator-max-microvolt = <3000000>;
325                 op_mode = <1>; /* Normal Mode */
326             };
327             

342             ldo24_reg: LDO24 {
343                 regulator-name = "VDD33_A31";                                                                      
344                 regulator-min-microvolt = <3000000>;
345                 regulator-max-microvolt = <3000000>;
346                 op_mode = <1>; /* Normal Mode */
347             };


431             buck7_reg: BUCK7 {
432                 regulator-name = "pvdd_buck7";
433                 regulator-min-microvolt = <2050000>;
434                 regulator-max-microvolt = <2050000>;
435                 regulator-boot-on;
436                 regulator-always-on;
437                 op_mode = <1>; /* Normal Mode */                                                                   
438             };
439 

           

第七步、編譯裝置樹

在linux-5.8.6頂級目錄下

make dtbs
           

第八步、燒寫核心、裝置樹

燒寫核心 這裡我使用的是u-boot-2017-11

燒寫裝置樹 exynos4412-itop-elite.dtb

遇到的問題

Verifying Checksum ... Bad Data CRC 
ERROR: can't get kernel image!
           

原因分析

有可能是寫位址和讀位址範圍錯了,代碼重疊了,還有可能是你的核心大于你配置設定的核心空間,重新規劃下核心空間就OK.

二:

nand flash出現了壞塊,換一段位址空間試試

讀寫位址都是正常的,代碼重疊排除

問題定位到核心大于配置設定的核心空間

因為使用的是fastboot燒寫的核心

在燒寫核心時 fastboot 實際使用的指令為

這裡的3000為16進制轉換為十進制為12288 這裡的燒寫機關為block

一個block 的大小為512位元組

12288block 即為6M 而我上面編譯的核心有6.87M 顯然是燒寫不完全導緻的

解決方案一

改變uImage的壓縮模式來減小uImage的體積

make menuconfig
           

General setup>

iTop 4412 移植linux-5.8.6
iTop 4412 移植linux-5.8.6

編譯核心

iTop 4412 移植linux-5.8.6

這次的大小為4.99M 再次燒寫核心 成功啟動!

解決方案二

修改uboot 燒寫核心分區的大小

由于我使用的是fastboot刷寫kernel

修改刷寫kernel分區的大小

uboot-2017-11/driver/usb/gadget/f_fastboot.c

char *argv[2]  = { "md","40000000"};
        char *open_emmc[2]  = { "open","   "};
        char *close_emmc[2]  = { "close","   "};
        char *argv_uboot[5]  = { "mmc","write", "40000000","0","40e"};
        char *argv_kernel[5]  = { "mmc","write", "40000000","460","3000"}; //kernel 6M
        char *argv_dtb[5]  = { "mmc","write", "40000000","3460","a0"};
        char *argv_system[5]  = { "mmc","write", "40000000","aeed","a000"};
           

修改為

char *argv[2]  = { "md","40000000"};
        char *open_emmc[2]  = { "open","   "};
        char *close_emmc[2]  = { "close","   "};
        char *argv_uboot[5]  = { "mmc","write", "40000000","0","40e"};
        char *argv_kernel[5]  = { "mmc","write", "40000000","460","4000"}; //kernel 8M
        char *argv_dtb[5]  = { "mmc","write", "40000000","4460","a0"};
        char *argv_system[5]  = { "mmc","write", "40000000","aeed","a000"};
           

修改includ/configs/itop4412.h

97     "mmc read ${loadaddr} 0x460 0x3000; mmc read ${dtb_addr} 0x3460 0xa0; bootm ${loadaddr    } - ${dtb_addr}" \
           

修改為

97     "mmc read ${loadaddr} 0x460 0x4000; mmc read ${dtb_addr} 0x4460 0xa0; bootm ${loadaddr    } - ${dtb_addr}" \
           

其實也就是将mmc write 的大小 與 mmc read 的大小相對應

重新燒寫uboot、核心和裝置樹

iTop 4412 移植linux-5.8.6

成功啟動!!!

移植網卡驅動

Try to bring eth0 interface up......grep: /etc/mtab: No such file or directory
ifconfig: SIOCGIFFLAGS: No such device
ifconfig: SIOCSIFHWADDR: No such device
ifconfig: SIOCSIFADDR: No such device
route: SIOCADDRT: Network is unreachable
           

加載核心時看到列印資訊顯示無網卡驅動

在核心中添加網卡驅動

itop4421 闆子上使用的是DM9621網卡

iTop 4412 移植linux-5.8.6

而DM9621網卡是連在USB HUB上的

iTop 4412 移植linux-5.8.6

配置核心

Device Drivers >

Network device support >

USB Network Adapters>

選擇DM96XX網卡驅動

iTop 4412 移植linux-5.8.6

重新編譯核心 移植

iTop 4412 移植linux-5.8.6
iTop 4412 移植linux-5.8.6

結束!

繼續閱讀