NanoPC-T2製作刷機包

来源:https://www.cnblogs.com/yddeboke/archive/2019/04/21/10743606.html
-Advertisement-
Play Games

anoPC-T2製作刷機包 前提:到友善的wiki中,仔細看編譯uboot、內核、製作刷機包的教程。 準備工作: 1、 虛擬機Ubuntu安裝,並安裝n多軟體可以支撐編譯內核等等。 2、 安裝交叉編譯器,參考wiki-8.1。 3、 下載友善修改好的uboot、內核源代碼,debian_nanopi ...


anoPC-T2製作刷機包

前提:到友善的wiki中,仔細看編譯uboot、內核、製作刷機包的教程。

準備工作:

1、 虛擬機Ubuntu安裝,並安裝n多軟體可以支撐編譯內核等等。

2、  安裝交叉編譯器,參考wiki-8.1。

3、 下載友善修改好的uboot、內核源代碼,debian_nanopi2、sd-fuse_nanopi2等製作刷機包的腳本,友善有兩套代碼:

Uboot2014,和linux-3.4.y是配套使用,沒有使用設備樹.

Uboot2016和linux-4.4.y是配套使用,使用設備樹.

4、 下載友善已經製作好的刷機包,也可以使用sd-fuse_nanopi2自己製作(最好使用這種方法,裡面有東西後面用到)。

我使用的源碼版本是uboot2014和linux-3.4.y,文件系統是busybox-1.30.0,具體分析就不多說了,直接來操作:

第一步-編譯:

到友善的git上去下載對應得源碼包(最好使用git拉取,直接下載好像會出錯,選好分支不然編譯會失敗)

 

以上只用到了部分,全是用git拉取後,壓縮的包,備份起來,下載是真的慢。

解壓出來(具體命令自己百度)

 

分別是文件系統,kernel,刷機包工具、uboot

進入uboot_nanopi2目錄下,直接編譯,大概不到一分鐘,就ok了,具體命令wiki上有,

 

進入linux-3.4.y目錄下,直接編譯,時間大概5分鐘,具體命令wiki上有,

make nanopi2_linux_defconfig

make uImage -j12   (PC機cpu多核可以使用jn 的命令)

 

進入busybox目錄下,直接編譯,時間大概10分鐘,可以百度下具體做法。

make menuconfig

 

設置完交叉工具鏈的首碼後,保存退出,直接make,

 

執行make install

 

至於剩下的拷貝庫文件,創建各種文件等等,就自行百度就可以解決, 或者直接看韋東山老師的教程,寫的很詳細。其中一點:腳本裡面的串口設備名稱是ttyAMA0,不要寫錯了,要不然會出錯。

 

第二步-分析官方的二進位文件分佈

進入sd-fuse_s5p4418目錄下,文件和文件夾如下:

fusing.sh  mkimage.sh  prebuilt  README.md  tools,最好先看下readme,先瞭解下。

首先執行腳本mkimage.sh,跟一個參數android(也可以是其他的,分析下腳本就知道了)

./mkimage.sh android

虛擬機必須聯網,因為需要下載一些東西,我提前下載好了,也可以把腳本中的鏈接複製到迅雷中下載,然後再拷到虛擬機解壓在當前目錄下,也是可以的。android-lollipop-images.tgz,解壓在當前文件夾。

進入文件夾,可以看到很多文件:

2ndboot.bin  bootloader  env.conf   partmap.txt  userdata.img

boot.img     cache.img   info.conf  system.img

其中2ndboot.bin是s5p4418官方的,看不到源碼,猜測就是一個自舉文件。

bootloader 就是uboot生成的文件

boot.img 是kernel和類似於ramdisk的小文件系統。

Cache.img system.img userdata.img是安卓的文件,我暫時沒有去管它。

剩下兩個.conf文件是一些環境變數,最後一個文件partmap.txt對我們有很大的參考價值

# sd0 partition map

# flash= <device>.<dev no>:<partition>:<fstype>:<start>,<length>

#   support device : eeprom, nand, mmc

#   support fstype : 2nd, boot, raw, fat, ext4, ubi

#

flash=mmc,0:2ndboot:2nd:0x200,0x7e00:2ndboot.bin;

flash=mmc,0:bootloader:boot:0x8000,0x77000:bootloader;

flash=mmc,0:boot:fat:0x000100000,0x004000000:boot.img;

flash=mmc,0:system:ext4:0x04100000,0x2F200000:system.img;

flash=mmc,0:cache:ext4:0x33300000,0x1AC00000:cache.img;

flash=mmc,0:misc:emmc:0x4E000000,0x00800000;

flash=mmc,0:recovery:emmc:0x4E900000,0x01600000;

flash=mmc,0:userdata:ext4:0x50000000,0x0:userdata.img;

文件直接把刷機包的分區和地址寫好了,但是我們不知道bootloader是否和我們編譯好的完全一樣,其中的boot.img又是由那些文件組成的?我們就需要分析這些。

腳本執行完畢後,會生成一個s5p4418-android-lollipop-20190420.img文件,我們需要分析這個文件,看下官方是怎麼做的。

把剛做好的刷機包、android-lollipop-images.tgz解壓出來的文件、我們編譯好的uboot和uImage拷貝到PC上,對比文件,看下有那些差異。

首先看刷機包,使用分區助手看下分區情況:

Boot分區,有uImage,root.img.gz,ramdisk-recovery.img等等文件

 

System分區和其他分區是安卓文件系統,對我們沒什麼價值,就不看了。

分析分區,我們知道第一個分區放的是kernel和ramdisk這樣的文件系統,第二個分區放的是文件系統。可以對比下boot分區下的uImage和我們編譯的有什麼大的差異(其實官方僅僅把它放在裡面而已)

接下來對比uboot,發現BootLoader就是uboot,沒有什麼大的差異。

 

從上面的分析,可以得出友善官方規劃的刷機包分區其實和partmap.txt中的分區是一一對應的,那麼我們是不是可以測試下,看是否可以成功做出最小的刷機包512M(可以參考下韋東山老師關於友善neo的視頻(免費),裡面講的比較好)。

截取partmap.txt中和我們相關的分區部分,我規划了一個分區,沒裝visio,不能畫圖,只有寫下來

flash=mmc,0:2ndboot:2nd:0x200,0x7e00:2ndboot.bin;

flash=mmc,0:bootloader:boot:0x8000,0x77000:bootloader;

flash=mmc,0:boot:fat:0x000100000,0x004000000:boot.img;

flash=mmc,0:system:ext4:0x04100000,0x2F200000:system.img;

SD卡的一個小知識:SD卡的分區信息放在前512B中,而一般SD卡的最小擦除單元剛好是512B=0x200=1 sector;(也可能不是sector)

2ndboot.bin  0x200    = 1 sector

Bootloader   0x8000    =64 sector

boot.img        第一個分區-格式fat 20M

文件系統       第二個分區-格式ext4 256-20M(我們暫時先分區,等內核可以跑起來再說)

進入我們的linux目錄下,新建build目錄,把2ndboot.bin,我們自己編譯的u-boot.bin,uImage拷貝到build目錄下。

一下操作可以百度下它的意思,我就不細說了,註意空格:

dd if=/dev/zero of=fs_nanopc_256M.img bs=1M count=256

losetup /dev/loop0 fs_nanopc_256M.img

 

fdisk /dev/loop0  //參看分區表,直接按回車代表預設屬性,+20M代表第一個分區是20M,第二個分區直接回車代表剩餘空間全部分配給第二個分區,最好w,代表寫入分區表,

 

可以輸入p查看分區情況

 

分區完後,寫入分區文件系統格式:

partprobe /dev/loop0

mkfs.fat /dev/loop0p1

mkfs.ext4 /dev/loop0p2

 

拷貝文件到img文件中:

dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1

dd if=u-boot.bin  of=/dev/loop0 bs=512 seek=64

 

現在我們的uboot已經放入到刷機包中,我們可以把這個刷機包燒寫到SD卡中測試了,文件只有512M,燒寫不超過1分鐘,預計uboot可以啟動。然而我們發現,串口輸出可以預估的不一樣,如下:

 

串口列印出這些信息,說明2ndboot.bin已經執行了,但是uboot沒啟動。

分析可能:

我們下載的android目錄下的bootloader和我們編譯的一樣,是不是腳本執行過程中往裡面添加了一些東西???

看下腳本,但是感覺友善這個腳本寫的有點亂,也沒看出什麼來,所以我接直接粗暴的方式對比文件:到0x8000的位置,看使用官方的腳本製作的刷機包s5p4418-android-lollipop-xxx.img,和我們的uboot有什麼不一樣

 

發現uboot並不是放在0x8000的地址上,而是放在0x8200的地址上,而且0x8000-0x8200之間還有一些數據,暫時不知道具體含義。

使用粗暴的做法,直接創建一個bin文件,把0x8000-0x8200的內容放到裡面,

 

再次修改我們的分區信息:

2ndboot.bin  0x200    = 1 sector

head.bin        0x8000   = 64 sector

Bootloader   0x8200    =65 sector

boot.img        第一個分區-格式fat 20M

文件系統       第二個分區-格式ext4 256-20M(我們暫時先分區,等內核可以跑起來再說)

修改我們的刷機包:

dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1

dd if=head.bin  of=/dev/loop0 bs=512 seek=64

dd if=u-boot.bin  of=/dev/loop0 bs=512 seek=65

 

順便把內核也放到裡面:

mount /dev/loop0p1 /mnt

cp uImage /mnt

umount /mnt

 

重新燒寫SD卡,啟動:

 

Uboot正常啟動,但是內核沒有載入,看下預設的環境變數,有很多設置不符合我們現在的情況,修改如下

setenv bootdelay 5

setenv kernel uImage

setenv bootargs console=ttyAMA0,115200n8 root=/dev/mmcblk1p2 rootfstype=ext4 rootwait init=/sbin/init loglevel=7 printk.time=1 consoleblank=0  bootdev=2

setenv bootcmd $bloader 0x48000000 $bootfile

set bloader ext4load mmc 0:1

 

但是我們發現設置後,無法載入ext2文件系統,我們在分區時,boot的文件系統是fat的,但是uboot並沒有支持fat文件系統,我們在分區助手裡面看到boot分區也是ext4的,所以我們應該修改boot分區的文件系統為ext4

 

再次製作:

losetup -d /dev/loop0 //首先卸載設備

rm fs_nanopc_256M.img      //刪除未完善的刷機包

重覆剛纔的步驟:

dd if=/dev/zero of=fs_nanopc_256M.img bs=1M count=256

losetup /dev/loop0 fs_nanopc_256M.img

fdisk /dev/loop0

 

partprobe /dev/loop0

mkfs.ext4 /dev/loop0p1

mkfs.ext4 /dev/loop0p2

 

把所有需要的文件全部寫入到刷機包中

dd if=2ndboot.bin of=/dev/loop0 bs=512 seek=1

dd if=head.bin  of=/dev/loop0 bs=512 seek=64

dd if=u-boot.bin  of=/dev/loop0 bs=512 seek=65

mount /dev/loop0p1 /mnt  //掛載第一個分區到

cp uImage /mnt

umount /mnt

mount /dev/loop0p2 /mnt         //掛載第二個分區

cp ../imgForNanopi2/fs_nanopi2/* -rfd /mnt/   //複製文件系統到第二個分區,使用rfd的參數

umount /mnt

losetup -d /dev/loop0

 

重新燒寫測試:

 

設置環境變數:

setenv bootdelay 5

setenv kernel uImage

setenv bootargs console=ttyAMA0,115200n8 root=/dev/mmcblk1p2 rootfstype=ext4 rootwait init=/sbin/init loglevel=7 printk.time=1 consoleblank=0  bootdev=2

setenv bootcmd $bloader 0x48000000 $bootfile

set bloader ext4load mmc 0:1

因為控制台設置環境變數不能有分號,所以,現在不能自動啟動內核,需要我們手動

run bootcmd

bootm

 

進入了熟悉的界面,說明我們只做刷機包已經成功了。關於uboot環境變數的設置,最好修改uboot源碼,修改巨集定義。

但是實際操作中,並沒有這麼順利,還是有很多問題:

1、 uboot的環境變數,有些官方寫死了,就算是我們修改了,重啟就恢復了

2、 boot分區下的ramdisK文件系統,有什麼用?我暫時沒去管它

3、 官方代碼更新了,相應的腳本等等一些文件並沒有及時更新,

已經很晚了,就不寫了!有事不要找我,沒事更不要找我!!!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看電子病歷系統演示 醫院醫療信息管理系統,EMR電子病歷系統,功能模塊如下所示: 1.住院醫生站 2.住院護士站 3.病案瀏覽工作站 4.質量控制工作站 5.系統維護工作站 本店出售系統全套源碼,包含介面平臺和報表平臺源碼。軟體開發語言是.net c#,開發工具vs2010,資料庫oracle11 ...
  • 一. 概述 本篇探討使用"基於瀏覽器的JavaScript客戶端應用程式"。與上篇實現功能一樣,只不過這篇使用JavaScript作為客戶端程式,而非core mvc的後臺代碼HttpClient實現。 功能一樣:用戶首先要登錄IdentityServer站點,再使用IdentityServer發出 ...
  • ListView 控制項和 DataGridView 控制項 ListView 是跟 Winform 中 DataGridView 用法以及顯示效果差不多的一個 WPF 控制項,可以通過列表的方式方便的顯示數據; 在 ListView 控制項中 DataSource 屬性在這裡是 ;單條數據載入的方法是 , ...
  • C# 獲取當前伺服器運行程式的根目錄,獲取當前運行程式物理路徑 ...
  • WinCE從1995年誕生至今,已有20多年的發展歷史,行業成熟方案覆蓋範圍廣,從車載、工控、手持機都有涉及,且方案成熟。近些年,Android以後來居上的態勢,逐漸滲透至各行業領域,硬體手持大廠也把產品線重心向Android手持遷移,基於Android的行業解決方案越來越成熟,WinCE的開發人才... ...
  • 一、簡要說明 本篇文章主要分析 Abp vNext 當中的模塊系統,從類型構造層面上來看,Abp vNext 當中不再只是單純的通過 來管理其他的模塊,它現在則是 和 來協同工作,其他的代碼邏輯並無太大變化。 Abp vNext 規定每個模塊必須繼承自 介面,這樣 vNext 系統在啟動的時候才會掃 ...
  • 方法二:根據路徑下載圖片 方法三 根據路徑下載圖片 ...
  • grpe 及正則表達式 文本查找的需要:grep,egrep,fgrepgrep: 根據模式,搜索文本,並將符合模式的文本行顯示出來。Pattern : 文本字元以及正則表達式的元字元組合而成的匹配條件 grep [OPTIONS] PATTERN [FILE...] -i :忽略大小寫 --col ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...