由于linux核心已經很好的支援itop4412開發闆,移植起來也相對容易
開發環境
Ubuntu 19.04
CROSS_COMPILE arm-linux-gcc
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLykzNzITOwATMzIDMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1. 第一步 下載下傳linux核心
2.第二步 修改Makefile 指定交叉編譯器
371 ARCH ?= arm
372 CROSS_COMPILE ?= arm-linux-gnueabi-
第三步、生成.config配置檔案,直接使用linux官方的預設配置即可
配置檔案在 arch/arm/configs
make exynos_defconfig
第四步、選配相關配置
make menuconfig
-
選擇晶片類型,我們進入下面的路徑:
System Type >
Samsung Exynos >
iTop 4412 移植linux-5.8.6 -
配置調試序列槽,我們傳回到menuconfig第一級目錄,從第一級目錄進入到以下路徑:
Kernel hacking >
Arm Debugging >
iTop 4412 移植linux-5.8.6 iTop 4412 移植linux-5.8.6 -
傳回到menuconfig第一級目錄,從第一級目錄進入到以下路徑:
Device Drives >
Character devices>
Serial drivers >
-
關閉DMA 否則會出現
dma-pl330 12680000.pdma: Reset Channel-1 CS-20000fFTC-20000 Device Drivers
iTop 4412 移植linux-5.8.6 - 完成設定後,儲存退出。
第五步 編譯核心
make uImage LOADADDR=0x40007000 -j4
LOADADDR=0X40007000 表示指定核心的加載位址
第六步、修改裝置樹檔案
修改exynos4412-itop-scp-core.dtsi
因為沒有events這個屬性,将events修改為event即可
配置核心闆電源晶片
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>
編譯核心
這次的大小為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、核心和裝置樹
成功啟動!!!
移植網卡驅動
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網卡
而DM9621網卡是連在USB HUB上的
配置核心
Device Drivers >
Network device support >
USB Network Adapters>
選擇DM96XX網卡驅動
重新編譯核心 移植
結束!