Hi3520 SDK 安裝以及升級使用說明
序
1、先明確文中的幾個概念。
主片: 多片級聯應用中,指PCI主片。
從片: 多片級聯應用中,指PCI從片。
主arm:指雙核中的arm11。
從arm:指雙核中的arm9。
2、第六章 FAQ,新增如何調整主從arm MMZ和os內存,實現16D1編碼 or 16D1解碼。
3、2009-12-15,精簡內存,減少了從arm os內存,調整了16-bit mmz分配。
第一章 Hi3520 SDK V1.x.x.x 版本升級操作說明
如果您是首次安裝本SDK,請直接參看第2章。
第二章 首次安裝SDK
1、Hi3520 SDK包位置
在"Hi3520 DMS V100R001C01/software/board/"目錄下,您可以看到一個 Hi3520_SDK_V1.x.x.x.tgz 的文件,
該文件就是Hi3520的軟件開發包。
2、解壓縮SDK包
在linux服務器上(或者一台裝有linux的PC上,主流的linux發行版本均可以),使用命令:tar -zxf Hi3520_SDK_V1.x.x.x.tgz ,
解壓縮該文件,可以得到一個Hi3520_SDK_V1.x.x.x目錄。
3、在linux服務器上安裝交叉編譯器
1) 進入tools/toolchains,運行chmod +x cross.install,然後運行./cross.install即可,注意,需要有sudo權限或者root權限
2) 執行source /etc/profile, 安裝交叉編譯器的腳本配置的環境變量就可以生效了,或者請重新登陸也可。
4、展開SDK包的其他內容(注意!這一步不可以省略)
返回SDK目錄,運行./sdk.unpack將會展開SDK包打包壓縮存放的其他內容,請按照提示完成操作。這步操作可能需要幾分鐘。
如果您需要通過WINDOWS中轉拷貝SDK包,請先運行./sdk.cleanup,收起SDK包的內容,拷貝到新的目錄後再展開。
5、SDK目錄介紹
Hi3520_SDK_VX.X.X.X 目錄結構如下:
|-- pub
| |-- images # 可供FLASH燒寫的映像文件,如內核、jffs2文件系統
| |-- include # 公共頭文件(該目錄已廢棄)
| |-- kbuild-FULL_REL # 主ARM內核頭文件,內核模塊使用該目錄來進行編譯
| | `-- include # 主ARM應用程序需要的頭文件
| |-- kbuild-FULL_REL_SLAVE # 從ARM內核頭文件,內核模塊使用該目錄來進行編譯
| | `-- include # 從ARM應用程序需要的頭文件
| |-- lib # 應用程序需要的庫文件
| |-- resource # 構成rootfs的各種組件,一般不需要關心
| |-- standee # 各模塊的原始安裝文件,如需要mmz.ko就可以在這裡找到,同時也包含組件所需的調試信息
| `-- tarball # SDK各模塊的打包備份文件
|
|-- extdrv # 板級外圍驅動源碼
|-- rootfs-FULL_REL # 主ARM的根文件系統
|-- rootfs-SLV_FULL_REL # 從ARM的根文件系統
|-- scripts # 存放相關腳本的目錄
|-- sdk.cleanup # SDK清理腳本
|-- sdk.unpack # SDK展開腳本
|-- source # 放置所有源代碼的目錄
| |-- app # 應用程序類源代碼
| |-- drv # 驅動類源代碼
| |-- lib # Lib類源代碼
| `-- os # OS相關源代碼,如內核
|-- tools # 工具類
| |-- bin # 可執行程序,如mkfs.cramfs
| `-- toolchains # 交叉工具鏈,展開SDK時已自動安裝
|
|-- mpp # 媒體處理平台發布的頭文件、庫以及內核模塊,適用於單核
| |-- component # 組件源代碼
| |-- include # 對外頭文件,包括FB,TDE
| |-- ko # 單ARM使用的內核模塊,包括FB,TDE
| |-- lib # 單ARM使用的release版本庫以及音頻庫
| `-- sample # sample代碼,進入各個子目錄,可以直接編譯運行
|
|-- mpp_master # 媒體處理平台發布的頭文件、庫以及內核模塊,適用於雙核主ARM
| |-- component # 組件源代碼
| |-- include # 對外頭文件,包括FB,TDE
| |-- ko # 主ARM使用的內核模塊,包括FB,TDE
| |-- lib # 主ARM使用的release版本庫以及音頻庫
| `-- sample # sample代碼,進入各個子目錄,可以直接編譯運行
|
`-- mpp_slave # 媒體處理平台發布的頭文件、庫以及內核模塊,適用於雙核從ARM
|-- component # 組件源代碼
|-- include # 對外頭文件,包括FB,TDE
|-- ko # 從ARM使用的內核模塊,包括FB,TDE
|-- lib # 從ARM使用的release版本庫以及音頻庫
`-- sample # sample代碼,進入各個子目錄,可以直接編譯運行
第三章、安裝、升級Hi3520DEMO板開發開發環境
# 如果您使用的Hi3520的DEMO板,可以按照以下步驟安裝u-boot,內核以及文件系統,以下步驟均使用網絡來更新。
# 通常,您拿到的單板中已經有u-boot,如果沒有的話,就需要使用仿真器進行燒寫。
# 具體操作步驟,請參見 DMS\software\Doc下的《Hi3520 Linux 開發環境用戶指南》和 DMS\application notes\下的《Hi3520 U-boot移植應用 Application Notes》。
# 以下操作假設您的單板已經有了u-boot。
1、配置tftp服務器
# 可以使用任意的tftp服務器,將pub/images下的文件拷貝到tftp服務器的目錄下。
2、更新u-boot的環境變量
# 單板上電後,敲Ctrl-C,進入u-boot。先設置好serverip(即tftp服務器的ip)、ipaddr(單板ip)和ethaddr(單板的MAC地址)。
setenv serverip xx.xx.xx.xx
setenv ipaddr xx.xx.xx.xx
setenv ethaddr xx:xx:xx:xx:xx:xx
setenv netmask xx.xx.xx.xx
setenv gatewayip xx.xx.xx.xx
ping serverip,確保網絡暢通。
# 具體的使用方法請參見《Hi3520 Linux 開發環境用戶指南》。
3、燒寫並設置主u-boot
(1)燒寫
protect off 0x80000000 +0x80000
erase 0x80000000 +0x80000
tftp 0x80000000 u-boot-hi3520v100_200M.bin;
protect on 0x80000000 +0x80000
(2)設置
# 在u-boot下設置啟動參數:(主ARM操作系統分配72MB的內存,並使用jffs2的文件系統,文件系統的大小為16MB)
set bootargs mem=72M console=ttyAMA0,115200 root=1f01 rootfstype=jffs2 mtdparts=physmap-flash.0:14M(boot),16M(rootfs) pcimod=host pciclksel=1
setenv bootcmd 'bootm 0x80100000'
saveenv
4、燒寫並設置從boot
(1)燒寫
erase 0x80300000 +0x80000;
tftp 0x80300000 u-boot-hi3520v100_slave_200M.img;
(2)設置
set slave_bootargs mem=15M console=ttyAMA0,115200;
saveenv
5、燒寫主內核和文件系統
erase 0x80100000 +0x200000;
tftp 0x80100000 kernel-hi3520v100_full_release.img;
erase 0x80E00000 +0x1000000;
tftp 0x80E00000 rootfs-FULL_REL-Flash.jffs2;
6、燒寫從內核和文件系統(到flash)及啟動
(1)燒寫
erase 0x80400000 +0x200000
tftp 0x80400000 kernel-hi3520v100_full_release_slave.img
erase 0x80600000 +0x800000
tftp 0x80600000 rootfs-SLV_FULL_REL.cramfs.initrd.img
(2)手動啟動從arm
# 在主boot下輸入:
slavestart
(3)設置從ARM自動啟動
# 在主boot下輸入:
set slave_kernel_addr 0x80400000
set slave_initrd_addr 0x80600000
set slave_autostart 1
saveenv
7、啟動新系統
# 重啟單板即可,第一次進入系統時,掛載文件系統的速度可能比較慢,請耐心等待。
8、使用新系統
# 切記,不可隨意在Linux下復位單板或斷電,因為這樣可能會損壞文件系統,導致文件丟失、損壞以致系統無法啟動!
# 每次重啟單板請使用reboot;同理,單板斷電時請先運行halt,待到掛死後再斷電,這樣可以有效地保護FLASH文件系統,也可以避免不必要的麻煩。
第四章、使用SDK和DEMO板進行開發
1、開啟Linux下的網絡
# 執行命令加載網絡驅動:
modprobe h2gether;
# 設置網絡
ifconfig eth0 hw ether xx:xx:xx:xx:xx:xx;
ifconfig eth0 xx.xx.xx.xx netmask xx.xx.xx.xx;
route add default gw xx.xx.xx.xx
# 然後ping一下其他機器,如無意外,網絡將能正常工作。
# 如果收包性能不足,目前確認通過增加協議棧緩存即可,可以按如下操作來調整收包緩存默認值和最大值
echo "1048576" /proc/sys/net/core/rmem_default;
echo "2048576" /proc/sys/net/core/rmem_max;
# 在內存緊張的情況下,如果再進行繁重的網絡訪問,有可能會報出缺頁異常。此時通過限制系統將內存用於文件系統cache的數值,
# 可以提高網絡突發情況下的處理能力。可以使用下面的命令將min_free_kbytes設置為2MB,提高網絡突發情況下的可用內存數量
echo 2000 > /proc/sys/vm/min_free_kbytes
2、使用NFS
# 在開發階段,推薦使用NFS作為開發環境。您開發的代碼都可以放在NFS服務器上,通過NFS可以直接在DEMO板上訪問到NFS服務器。
# 執行命令加載NFS驅動:
modprobe nfs
# 然後掛載NFS文件系統:
mount -t nfs -o nolock,rsize=1024 xx.xx.xx.xx:/your-nfs-path /mnt
# 然後就可以在/mnt目錄下看到你服務器上的文件了,當然,如果你掛載的NFS目錄就是SDK下面的rootfs,那麼你可以:
chroot /mnt
# 然後就可以在新的根目錄下工作了。
3、開啟telnet服務
# 網絡正常後,運行命令 telnetd& 就可以啟動單板telnet服務,然後才能telnet到單板。
4、使用硬盤FAT32
# 按以下順序依次插入ko文件,由於部分模塊已經編入內核了,以下可能有部分命令冗余:
modprobe nls_base
modprobe nls_cp437
modprobe fat
modprobe vfat
modprobe msdos
modprobe nls_iso8859-1
modprobe nls_ascii
modprobe scsi_mod
modprobe sd_mod
modprobe libata
modprobe sata_sil
# 注意: 調試時,如果對部分驅動有改動,重新生成了新模塊,則無法通過modprobe方式插入,需使用insmod插入新模塊。
modprobe as-iosched # 增加IO調度算法,還有loop、cfq_iosched、deadline-iosched選擇
echo "anticipatory" > /sys/block/
/queue/scheduler # 使能as-iosched算法,是在/dev/,如hda
# 然後掛載FAT32文件系統:
mount -t vfat /dev/sda1 /mnt
# 然後就可以在/mnt目錄下看到文件了
# 其他驅動的使用請參考文檔《驅動模塊使用指南.txt》
#! 當然,你也可以把以上操作都放到腳本裡面,並讓它在linux啟動的時候自動執行。
#! OK,到這裡,所有的環境都已經准備好了,你可以開始媒體業務體驗之旅了。
5、運行MPP業務
# 進入mpp ko目錄,加載KO
cd mpp_master/ko
./load_master
# (確保sample已編譯)進入各sample目錄下,執行即可。例:
cd mpp_master/sample/vio
./sample_vio 1
第五章 地址空間分配與使用
1、RAM 內存管理
# DEMO板上共有兩塊DDR內存:
# DDRA 256M,對應物理地址從0xC0000000 到 0xCFFFFFFF;
# DDRB 128M,對應物理地址從0xE0000000 到 0xE7FFFFFF。
# 這些內存,一部分由操作系統管理,稱之為os內存;另一部分則需根據業務進行靈活分配,稱之為mmz內存。
# 為此,SDK提供了一個內核模塊mmz,來管理mmz內存。用戶可以在插入mmz模塊時,指定其管理的內存,例如:
# modprobe mmz mmz=anonymous,0,0xC2000000,32M:ddr16,0,0xE5800000,8M anony=1
# 表示mmz管理兩塊內存。
# 第一塊內存名字為anonymous,起始地址為 0xC2000000,大小為32M。
# 第二塊內存名字為ddr16,起始地址為 0xE5800000,大小為8M。
2、DEMO板RAM內存分配
# DEMO板的內存分配如下圖所示:
圖1 DDRA內存分配 (主從mmz)
-----|-------| 0xC0000000 # Reserved memory. You can use it all for your convience.
1M |rsv |
-----|-------| 0xC0100000 # Name:window. Usage: pci communication. If you have no pci, you can use for your convience.
7M |window |
-----|-------| 0xC0800000 # Name:anonymous. Usage: Frame Buffer.
24M |master |
|mmz |
-----|-------| 0xC2000000 # Name:anonymous. Usage: Video Buffer.
224M |slave |
|mmz |
-----|-------| 0xD0000000 # End of 32-bit ddr.
圖2 DDRB內存分配(主ARM OS + 從ARM OS + 主從mmz)
-----|-------| 0xE0000000 # slave file system. Note: image of slave file system must small than 5M.
15M |slave |
|os |
-----|-------| 0xE0F00000 # Name:ddr16. Usage: arm11 alloc for vdec stream buffer, dcc msg buf, etc.
15M |master |
|mmz |
-----|-------| 0xE1E00000 # Name:ipcm. Usage: communication memory between two arm.
2M |IPCM |
|memory |
-----|-------| 0xE2000000 # master os memory.
72M |master |
|os |
-----|-------| 0xE6800000 # Name:ddr16. Usage: arm9 alloc for venc stream buffer, channel context, etc.
24M |slave |
|mmz |
-----|-------| 0xE8000000 # End of 16-bit ddr
# 主mmz加載在腳本 mpp_master/ko/load_master 中自動執行,無需用戶操作。
# 從mmz加載在腳本 mpp_slave/ko/run_slave 中自動執行,無需用戶操作。
3、flash地址空間
圖3 flash空間分配
-----|-------| 0x80000000
1M |master |
|boot |
-----|-------| 0x80100000
2M |master |
|kernel |
-----|-------| 0x80300000
1M |slave |
|boot |
-----|-------| 0x80400000
2M |slave |
|kernel |
-----|-------| 0x80600000
8M |slave |
|fs |
-----|-------| 0x80E00000
16M |master |
|fs |
-----|-------|
# Flash 擦除需根據分區情況進行
uboot: erase 0x80000000 +0x80000 # 必須從0x80000000開始擦除,建議擦除大小0x80000, 這樣原來保存的環境變量可不被擦除,避免重新設置。
kernel: erase 0x80100000 +0x200000 # 必須擦除足夠的空間,以寫入kernel image文件
rootfs: erase 0x80E00000 +0x1000000 # 必須從分區2起始地址開始擦除,必須擦除分區2全部內容。
# flash的空間分配,要通過bootargs告訴主kernel
set bootargs ......(此處省略):14M(boot),16M(rootfs)
14M(boot) 表示分區1,14M,存放 主boot(1M),主kernel(2M),從boot(1M),從kernel(2M) 和 從fs(8M)。
16M(rootfs) 表示分區2,16M,存放 主fs(16M)。
# 你可以根據實際從armfs、主armfs的大小,自行調整bootargs,並erase相應空間。以兩個例子說明。
從fs大小 主fs起始地址 主fs大小 erase從fs erase主fs bootargs
10M 0x81000000 16M erase 0x80600000 +0xa000000 erase 0x81000000 +0x10000000 :16M(boot),16M(rootfs)
12M 0x81200000 20M erase 0x80600000 +0xc000000 erase 0x81200000 +0x10400000 :18M(boot),20M(rootfs)
第六章 FAQ
Q1: 如何制作從arm文件系統img文件?
A1: # 如下執行:
cd rootfs-SLV_FULL_REL;
./mknod_console; # 必須執行該操作
cp mkimg.rootfs ../;
cd .. ;
./mkimg.rootfs rootfs-SLV_FULL_REL ./ rootfs-SLV_FULL_REL cramfs-initrd-img;
rm mkimg.rootfs;
生成的文件名為: rootfs-SLV_FULL_REL.cramfs.initrd.img
mkimg腳本解釋:
./mkimg.rootfs rootfs-SLV_FULL_REL ./ rootfs-SLV_FULL_REL cramfs-initrd-img;
(1) (2) (3) (4)
(1)要制作的文件系統名
(2)img文件保存路徑
(3)生成的img文件名
(4)使用哪種文件系統
Q2: 什麼時候,需要制作從arm文件系統img文件?
A2: 一般情況下,從arm是不需要您操作它的。
只有當你希望在從arm運行自己的業務,或修改從arm MMZ時,才需要修改從arm文件系統,並重新制作img文件。
1、將你的從arm業務程序放到從arm文件系統中。
2、修改從arm自動啟動腳本。使你的從arm業務程序能自動執行。
rootfs-SLV_FULL_REL/etc/init.d/S20Cfgslave
3、修改從armmmz配置腳本。注意,請僅修改 mmz 加載參數,其他不變。
rootfs-SLV_FULL_REL/root/mpp_slave/ko/run_slave
4、重新制作從arm文件系統img文件。
5、將img文件燒寫到flash中,請依照第三章介紹的燒寫從arm文件系統的方法。
Q3: 更改從arm業務後,每次都燒寫flash,太麻煩,有沒有更好的辦法?
A3: 當然有。
燒寫從kernel和filesystem(到內存)及啟動 ----------- 快速調試從ARM的技巧
(1) 燒寫
tftp 0xE0300000 kernel-hi3520v100_full_release_slave.img
tftp 0xE0A00000 rootfs-SLV_FULL_REL.cramfs.initrd.img
(2) 啟動從arm
# 在主boot下輸入:
slavestart 0xE0300000 0xE0A00000
(3) 自動啟動從arm
#取消自動從FLASH中啟動
setenv slave_autostart
# 在主boot中配置bootcmd,可每次重啟單板時自動從TFTP服務器下載並啟動從kernel和rootfs
setenv bootcmd 'tftp 0xE0300000 kernel-hi3520v100_full_release_slave.img;tftp 0xE0A00000 rootfs-SLV_FULL_REL.cramfs.initrd.img;slavestart 0xE0300000 0xE0A00000;bootm 0x80100000'
Q4: 如何調整內存分配?
A4: 目前SDK提供了參考內存分配,詳見第五章第2節中內存分配圖。
你可以調整它,但一定要小心。
*** 請謹記一個原則:內存分配不能重疊。***
+-----+----------+-----------------------------------------------------------------------------------------+
|序號 | 內存 | 修改示例及說明 |
+-----+----------+-----------------------------------------------------------------------------------------+
|(1) |主arm os | 修改前 set bootargs mem=56M ... 主arm os 管理 56M 內存 | |
| | | 修改後 set bootargs mem=72M ... 主arm os 管理 72M 內存 | |
+-----+----------+-----------------------------------------------------------------------------------------+
|(2) |從arm os | 修改前 set slave_bootargs mem=32M ... 從arm os 管理 32M 內存 |
| | | 修改後 set slave_bootargs mem=24M ... 從arm os 管理 24M 內存 |
+-----+----------+-----------------------------------------------------------------------------------------+
|(3) |主arm mmz | mpp_master/ko/load_master <-- 修改該文件 |
| | | modprobe mmz=anonymous,0,0xC2000000,32M 主arm mmz管理 32M 內存 |
+-----+----------+-----------------------------------------------------------------------------------------+
|(4) |從arm mmz | rootfs-SLV_FULL_REL/root/mpp_slave/run_slave <-- 修改該文件,然後重新制作從片文件系統 |
| | | modprobe mmz=anonymous,0,0xC4000000,192M 從arm mmz管理 192M 內存 |
+-----+----------+-----------------------------------------------------------------------------------------+
Q5: 如何運行 16D1 編解碼業務
請選擇合適的配置,如下:
1、編碼碼流Buffer設置為 寬*高
2、解碼碼流Buffer設置為 寬*高
3、調整公共VB配置,建議:
Block size Block count note
D1 704*576*3/2 16*5 無
CIF 352*288*3/2 16*5 如果編碼CIF小碼流,則需配置。
Q6: 如何制作從arm u-boot image文件
A6: u-bootimage 制作 與 從arm 文件系統一樣,只是入口地址不同,如下:
mkimage -A arm -T ramdisk -C none -a 0xe1000000 -e 0xe1000000 -d u-boot-hi3520v100_slave_200M.bin u-boot-hi3520v100_slave_200M.img
第七章 單核使用
以上內容,講的是如何在雙核上運行mpp業務。本章重點介紹如何在單核上運行mpp業務。
1、mpp業務目錄說明
# 發布包根目錄下,有三個mpp相關目錄。
mpp :單核的工作目錄。在單核上運行mpp業務時,使用此目錄。
mpp_master:雙核的主arm工作目錄。在雙核上運行mpp業務時,使用此目錄。
mpp_slave :雙核的從arm工作目錄。目前不需關注。
2、在單核上運行mpp業務的過程
# 此處將單雙核操作過程放在一起,便於用戶比較。
+-----+---------------------+------------------------+---------------------------------+
|序號 | 操作過程 | 單核 | 雙核 |
+-----+---------------------+------------------------+---------------------------------+
|(1) | 燒寫FLASH與單板啟動 | 單 雙 核 一 致 |
+-----+---------------------+------------------------+---------------------------------+
|(2) | 加載ko | 加載mpp/ko/下的ko | 加載mpp_master/ko/下的ko |
+-----+---------------------+------------------------+---------------------------------+
|(3) | mpi 接口使用 | 單 雙 核 一 致 |
+-----+---------------------+------------------------+---------------------------------+
|(4) | 應用程序編譯 | 使用mpp/lib/下的庫文件 | 使用mpp_master/lib/下的庫文件 |
+-----+--------------------------------------------------------------------------------+
# 從上表可以看出,單雙核操作過程很相似。
# 用戶只需注意操作過程(2)、(4)的區別即可。特別提醒,(4)一定不能出錯,否則會造成奇怪的問題。