1. 程式人生 > >圖像識別DM8127開發攻略——KERNEL的移植說明

圖像識別DM8127開發攻略——KERNEL的移植說明

DM8127開發攻略 內核kernel移植 圖像識別

圖像識別DM8127開發攻略——KERNEL的移植說明

接上一篇《圖像識別DM8127開發攻略——UBOOT的移植說明》的步伐,DM8127開發攻略最後一篇文章是有關Kernel的裁剪移植。基於APPRO RDK3.8.0的基礎上,我們對/ti_tools/ipnc_psp_arago/kernel進行裁剪和移植,這個kernel是linux-2.6.37版本:
一、第一步還是做裁剪工作,刪除多余的文件夾和文件,方便程序在每個階段備份保存。
1、先在kernel/fs/hostf/Makefile裏,打開Makefile文件,屏蔽#include arch/um/scripts/Makefile.rules,見下圖路徑,

技術分享圖片
然後刪除kernel/arch/um文件夾,只保留下圖的內容:
技術分享圖片
2、刪除kernel/arch/x86裏面的文件,只保留下圖的內容:
技術分享圖片
3、刪除kernel/arch/arm/裏面的內容,只保留下圖內容:
技術分享圖片

4、刪除kernel/arch/arm/mach-omap2/裏面的內容以board-開頭一些的文件,只保留下圖幾個board-xxx.c
技術分享圖片
Board-ti8148ipnc.c就是重點要修改的平臺文件,其他不相關的平臺C文件都去掉。
5、刪除arch/arm/configs多余平臺配置文件:
技術分享圖片
只保留ti8148_ipnc_ubifs_defconfig文件

6、刪除上面提到的文件夾和文件,那麽有關的腳本文件需要同步修改,
A、arch/arm/Makefile修改

第129行開始:
ifeq ($(CONFIG_TY_KERNEL),y) (本人用這種方式屏蔽裏面的內容,不編譯)
machine-$(CONFIG_ARCH_AAEC2000) := aaec2000
machine-$(CONFIG_ARCH_AT91) := at91
machine-$(CONFIG_ARCH_BCMRING) := bcmring
machine-$(CONFIG_ARCH_CLPS711X) := clps711x
machine-$(CONFIG_ARCH_CNS3XXX) := cns3xxx
machine-$(CONFIG_ARCH_DAVINCI) := davinci
machine-$(CONFIG_ARCH_DOVE) := dove
machine-$(CONFIG_ARCH_EBSA110) := ebsa110
machine-$(CONFIG_ARCH_EP93XX) := ep93xx
machine-$(CONFIG_ARCH_GEMINI) := gemini
machine-$(CONFIG_ARCH_H720X) := h720x
machine-$(CONFIG_ARCH_INTEGRATOR) := integrator
machine-$(CONFIG_ARCH_IOP13XX) := iop13xx
machine-$(CONFIG_ARCH_IOP32X) := iop32x
machine-$(CONFIG_ARCH_IOP33X) := iop33x
machine-$(CONFIG_ARCH_IXP2000) := ixp2000
machine-$(CONFIG_ARCH_IXP23XX) := ixp23xx
machine-$(CONFIG_ARCH_IXP4XX) := ixp4xx
machine-$(CONFIG_ARCH_KIRKWOOD) := kirkwood
machine-$(CONFIG_ARCH_KS8695) := ks8695
machine-$(CONFIG_ARCH_LH7A40X) := lh7a40x
machine-$(CONFIG_ARCH_LOKI) := loki
machine-$(CONFIG_ARCH_LPC32XX) := lpc32xx
machine-$(CONFIG_ARCH_MMP) := mmp
machine-$(CONFIG_ARCH_MSM) := msm
machine-$(CONFIG_ARCH_MV78XX0) := mv78xx0
machine-$(CONFIG_ARCH_MX1) := imx
machine-$(CONFIG_ARCH_MX2) := imx
machine-$(CONFIG_ARCH_MX25) := mx25
machine-$(CONFIG_ARCH_MX3) := mx3
machine-$(CONFIG_ARCH_MX5) := mx5
machine-$(CONFIG_ARCH_MXC91231) := mxc91231
machine-$(CONFIG_ARCH_NETX) := netx
machine-$(CONFIG_ARCH_NOMADIK) := nomadik
machine-$(CONFIG_ARCH_NS9XXX) := ns9xxx
machine-$(CONFIG_ARCH_OMAP1) := omap1
machine-$(CONFIG_ARCH_OMAP2) := omap2
machine-$(CONFIG_ARCH_OMAP3) := omap2
machine-$(CONFIG_ARCH_OMAP4) := omap2
machine-$(CONFIG_ARCH_ORION5X) := orion5x
machine-$(CONFIG_ARCH_PNX4008) := pnx4008
machine-$(CONFIG_ARCH_PXA) := pxa
machine-$(CONFIG_ARCH_REALVIEW) := realview
machine-$(CONFIG_ARCH_RPC) := rpc
machine-$(CONFIG_ARCH_S3C2410) := s3c2410 s3c2400 s3c2412 s3c2416 s3c2440 s3c2443
machine-$(CONFIG_ARCH_S3C24A0) := s3c24a0
machine-$(CONFIG_ARCH_S3C64XX) := s3c64xx
machine-$(CONFIG_ARCH_S5P64X0) := s5p64x0
machine-$(CONFIG_ARCH_S5P6442) := s5p6442
machine-$(CONFIG_ARCH_S5PC100) := s5pc100
machine-$(CONFIG_ARCH_S5PV210) := s5pv210
machine-$(CONFIG_ARCH_S5PV310) := s5pv310
machine-$(CONFIG_ARCH_SA1100) := sa1100
machine-$(CONFIG_ARCH_SHARK) := shark
machine-$(CONFIG_ARCH_SHMOBILE) := shmobile
machine-$(CONFIG_ARCH_STMP378X) := stmp378x
machine-$(CONFIG_ARCH_STMP37XX) := stmp37xx
machine-$(CONFIG_ARCH_TCC8K) := tcc8k
machine-$(CONFIG_ARCH_TEGRA) := tegra
machine-$(CONFIG_ARCH_U300) := u300
machine-$(CONFIG_ARCH_U8500) := ux500
machine-$(CONFIG_ARCH_VERSATILE) := versatile
machine-$(CONFIG_ARCH_VEXPRESS) := vexpress
machine-$(CONFIG_ARCH_W90X900) := w90x900
machine-$(CONFIG_ARCH_NUC93X) := nuc93x
machine-$(CONFIG_FOOTBRIDGE) := footbridge
machine-$(CONFIG_MACH_SPEAR300) := spear3xx
machine-$(CONFIG_MACH_SPEAR310) := spear3xx
machine-$(CONFIG_MACH_SPEAR320) := spear3xx
machine-$(CONFIG_MACH_SPEAR600) := spear6xx
endif

machine-$(CONFIG_ARCHTI81XX) := omap2 (這裏把需要編譯的TI81XX 對應的omap2提取出來)
(還有下面的使用#號屏蔽不需要的平臺)
#Platform directory name. This list is sorted alphanumerically
#by CONFIG
* macro name.
#plat-$(CONFIG_ARCH_MXC) := mxc
plat-$(CONFIG_ARCH_OMAP) := omap (這裏需要編譯,不能屏蔽)
#plat-$(CONFIG_ARCH_S3C64XX) := samsung
#plat-$(CONFIG_ARCH_STMP3XXX) := stmp3xxx
#plat-$(CONFIG_ARCH_TCC_926) := tcc
#plat-$(CONFIG_PLAT_IOP) := iop
#plat-$(CONFIG_PLAT_NOMADIK) := nomadik
#plat-$(CONFIG_PLAT_ORION) := orion
#plat-$(CONFIG_PLAT_PXA) := pxa
#plat-$(CONFIG_PLAT_S3C24XX) := s3c24xx samsung
#plat-$(CONFIG_PLAT_S5P) := s5p samsung
#plat-$(CONFIG_PLAT_SPEAR) := spear
#plat-$(CONFIG_PLAT_VERSATILE) := versatile

B、arch/arm/Kconfig修改
從第869行開始:
(使用#號屏蔽不相關的平臺Kconfig文件,讓它們不參與編譯)
#source "arch/arm/mach-aaec2000/Kconfig"

#source "arch/arm/mach-at91/Kconfig"

#source "arch/arm/mach-bcmring/Kconfig"

#source "arch/arm/mach-clps711x/Kconfig"

#source "arch/arm/mach-cns3xxx/Kconfig"

#source "arch/arm/mach-davinci/Kconfig"

#source "arch/arm/mach-dove/Kconfig"

#source "arch/arm/mach-ep93xx/Kconfig"

#source "arch/arm/mach-footbridge/Kconfig"

#source "arch/arm/mach-gemini/Kconfig"

#source "arch/arm/mach-h720x/Kconfig"

#source "arch/arm/mach-integrator/Kconfig"

#source "arch/arm/mach-iop32x/Kconfig"

#source "arch/arm/mach-iop33x/Kconfig"

#source "arch/arm/mach-iop13xx/Kconfig"

#source "arch/arm/mach-ixp4xx/Kconfig"

#source "arch/arm/mach-ixp2000/Kconfig"

#source "arch/arm/mach-ixp23xx/Kconfig"

#source "arch/arm/mach-kirkwood/Kconfig"

#source "arch/arm/mach-ks8695/Kconfig"

#source "arch/arm/mach-lh7a40x/Kconfig"

#source "arch/arm/mach-loki/Kconfig"

#source "arch/arm/mach-lpc32xx/Kconfig"

#source "arch/arm/mach-msm/Kconfig"

#source "arch/arm/mach-mv78xx0/Kconfig"

#source "arch/arm/plat-mxc/Kconfig"

#source "arch/arm/mach-netx/Kconfig"

#source "arch/arm/mach-nomadik/Kconfig"
#source "arch/arm/plat-nomadik/Kconfig"

#source "arch/arm/mach-ns9xxx/Kconfig"

#source "arch/arm/mach-nuc93x/Kconfig"

source "arch/arm/plat-omap/Kconfig"

#source "arch/arm/mach-omap1/Kconfig"

source "arch/arm/mach-omap2/Kconfig" (這個是DM8127平臺的,不能屏蔽)

#source "arch/arm/mach-orion5x/Kconfig"

#source "arch/arm/mach-pxa/Kconfig"
#source "arch/arm/plat-pxa/Kconfig"

#source "arch/arm/mach-mmp/Kconfig"

#source "arch/arm/mach-realview/Kconfig"

#source "arch/arm/mach-sa1100/Kconfig"

#source "arch/arm/plat-samsung/Kconfig"
#source "arch/arm/plat-s3c24xx/Kconfig"
#source "arch/arm/plat-s5p/Kconfig"

#source "arch/arm/plat-spear/Kconfig"

#source "arch/arm/plat-tcc/Kconfig"

#if ARCH_S3C2410
#source "arch/arm/mach-s3c2400/Kconfig"
#source "arch/arm/mach-s3c2410/Kconfig"
#source "arch/arm/mach-s3c2412/Kconfig"
#source "arch/arm/mach-s3c2416/Kconfig"
#source "arch/arm/mach-s3c2440/Kconfig"
#source "arch/arm/mach-s3c2443/Kconfig"
#endif

#if ARCH_S3C64XX
#source "arch/arm/mach-s3c64xx/Kconfig"
#endif

#source "arch/arm/mach-s5p64x0/Kconfig"

#source "arch/arm/mach-s5p6442/Kconfig"

#source "arch/arm/mach-s5pc100/Kconfig"

#source "arch/arm/mach-s5pv210/Kconfig"

#source "arch/arm/mach-s5pv310/Kconfig"

#source "arch/arm/mach-shmobile/Kconfig"

#source "arch/arm/plat-stmp3xxx/Kconfig"

#source "arch/arm/mach-tegra/Kconfig"

#source "arch/arm/mach-u300/Kconfig"

#source "arch/arm/mach-ux500/Kconfig"

#source "arch/arm/mach-versatile/Kconfig"

#source "arch/arm/mach-vexpress/Kconfig"

#source "arch/arm/mach-w90x900/Kconfig"

上面對arch/arm/Kconfig的修改,基本保證不相關平臺從內核刪除掉。

7、還有兩個提到的編譯需要註意的地方:
在ubuntu16.04版本的虛擬機環境下,除了在《圖像識別DM8127開發攻略——開發環境搭建》提到的#apt-get install libncurses (註意號要帶上)安裝外,還有個地方需要修改:
在內核源碼kernel/kernel/timeconst.pl
第373行需要修改:
#if (!defined(@val)) { #Jingbo (這裏需要屏蔽)
if ((!@val)) { (改成這個樣子)
否則無法在我們的ubuntu16.04正常編譯linux-2.6.37。

8、內核編譯還需要u-boot的mkimage工具
這裏要提到一點,在RDK開發包中,編譯kernel的時候,必須要先編譯前面提到u-boot,即正常的ubootbin,而且不能使用ubootclean,否則這裏編譯kernel會編譯不通過,因為編譯kernel得到uImage二進制BIN文件的時候,需要用到uboot裏面的工具,比如: mkimage工具。

二、編譯工作
本人在《圖像識別DM8127開發攻略 ——RDK軟件架構淺析及編譯》裏面提到SDK的編譯過程,我們看到裏面有3個編譯腳本是和kernel相關的。

build_3_kernel-menuconfig.sh、build_3_kernel-all.sh、build_3_kernel-tmp.sh
這裏就不累贅介紹了,見鏈接文章:
http://blog.51cto.com/zjbintsystem/2043380
那裏面有詳細介紹這三個.sh腳本功能。

三、DM8127平臺軟件修改

涉及到平臺的有三個重要的文件,arch/arm/mach-omap2/board-ti8148ipnc.c、devices.c和mux814x.c還是管腳復用問題,DM8127有些PIN腳用來接CMOS,就不能配置成GPIO模式,有些PIN腳用作HDMI視頻輸出,也不能配置成GPIO,MMC有兩組,我們只需要MMC1第一組做SD卡信號接口,這裏也不能配置成GPIO,而第2組MMC2我們不想支持兩路SD卡信號,就可以配置成GPIO模式,還有gpmc_ad就得配置成接NAND FLASH的接口,等等。這些功能定義首先在這三個文件先去做,註意mux814x.c那個數組struct omap_mux __initdata ti814x_muxmodes[],裏面涉及到其他DM385,TI811X平臺等等,源碼有提示哪一行定義用不上。
這裏舉個例子:
在mux814x.c裏,ti814x_muxmodes[]後面添加
_TI814X_MUXENTRY(MMC2_DAT3, 0,
"MMC2_DAT3", NULL, NULL, NULL, NULL, NULL, NULL, "GP2_5_work_state",
NULL, NULL, NULL, NULL), (我們想使用GP2_5用做GPIO進行LED燈控制)
/manual reset/
_TI814X_MUXENTRY(OSC_WAKE, 0,
"osc_wake", "spi1_cs1", NULL, NULL, NULL, NULL,
"timer5_mux1", "GP1_7_manual_reset", NULL, NULL, NULL, NULL),
(GP1_7我們用做按鍵輸入)
_TI814X_MUXENTRY這個格式我們在後面添加,其實在前面已經有定義的,可以通過查找MMC2_DAT3和OSC_WAKE就能找到,我們這裏再次添加,只是不想破壞TI 的軟件架構,同時加上我們的信息:GP2_5_work_state和GP1_7_manual_reset。那麽把這兩句添加到ti814x_muxmodes[]後面,就必須在board-ti8148ipnc.c ti8148_ipnc_init()函數後面對應添加
/work state/
omap_mux_init_signal("GP2_5_work_state", TI814X_PIN_OUTPUT_PULL_DIS);

error = gpio_request(GP2_5_WORK_STATE, "WORK_STATE");
if (error < 0) {
    printk(KERN_ERR "%s: failed to request GP2_5_WORK_STATE for WORK_STATE"
        ": %d\n", __func__, error);
    return;
}

/*manual reset*/
omap_mux_init_signal("GP1_7_manual_reset", TI814X_PIN_INPUT_PULL_UP);

error = gpio_request(GP1_7_MANUAL_RESET, "MANUAL_RESET");
if (error < 0) {
    printk(KERN_ERR "%s: failed to request GP1_7_MANUAL_RESET for MANUAL_RESET"
        ": %d\n", __func__, error);
    return;
}

/work state/
gpio_direction_output(GP2_5_WORK_STATE, 1);(這裏必須配置成輸出模式)
/manual reset/
gpio_direction_input(GP1_7_MANUAL_RESET);(這裏必須配制成輸入模式)

其中:
#define GP2_5_WORK_STATE (69) //GP2_5 work state
#define GP1_7_MANUAL_RESET (39) //GP1_7 manual reset

首先omap_mux_init_signal()調用ti814x_muxmodes[],那麽GP2_5這個管腳就配置成GPIO輸出模式,GP1_7就配置成GPIO輸入模式,同時必須調用gpio_request函數,先申請,才能使用。
這裏提到一點,TI DM8127 4組GPIO index是這樣管理:第一組GPIO0是0-31,第二組GPIO1是32-63,第三組GPIO2是64-95,第四組GPIO3是96-127。所以上面GP2_5的宏定義值是69(69-32-32=5), GP1_7宏定義是39(39-32=7),本人這樣寫應該看得明白。
同樣,arch/arm/mach-omap2/devices.c就是對各個功能模塊做類似的管腳配置工作,比如DM8127支持CAN總線,則在:
static void ti814x_d_can_init(unsigned int instance)
{
omap_mux_init_signal("dcan0_tx.dcan0_tx", 0);
omap_mux_init_signal("dcan0_rx.dcan0_rx", TI814X_INPUT_EN |
TI814X_PULL_UP);
d_can_hw_raminit(instance);
platform_device_register(&ti814x_d_can0_device);
}
進行配置,同時在omap2_init_devices()函數調用ti814x_d_can_init()初始化,內核運行最先去做arch/arm/mach-omap2/board-ti8148ipnc.c 裏的ti8148_ipnc_init()和arch/arm/mach-omap2/devices.c裏的omap2_init_devices()函數的初始化。做完DM8127管腳的功能配置,內核才開始去做對應外設芯片的初始化工作(驅動程序)。
除了在CORTEX-A8 核可以對管腳復用寄存器配置,另外兩個M3核(M3-ISS和M3-HDVPSS)也可以對管腳復用寄存器進行配置,這一點要註意,也很討厭,有時我們在內核配置好的寄存器,結果在運行APP的時候,發現一些管腳根本不是我們想要功能,後來才發現兩個CORTEX-M3核也在對某些寄存器配置。源碼裏M3-ISS對應ti_tools/iss_03_80_00_00/packages/ti/psp,M3-HDVPSS對應的是ti_tools/hdvpss_01_00_01_37/packages/ti/psp。

內核裏除了上面的平臺配置工作,還有很多外設的初始化工作,這裏就沒必要詳細去寫了,這些外設初始化網上都有文章參考。內核運行起來,一種以NFS文件系統方式去掛載虛擬機主機/home/davinci/dm8127/v3.8.0/Soure/ipnc_rdk/target/filesys:
技術分享圖片
然後進行linux 應用程序調試。另一種是使用build_7_ubifs.sh制作ubifs文件系統的BIN文件dm8127_ubifs.bin(見本人http://blog.51cto.com/zjbintsystem/2043380文章介紹),
燒寫到NAND FLASH去運行產品級的程序。

整個DM8127開發攻略到這篇就可以紮口了,本公司開發任務重點在新平臺的研發,新平臺是否成功,也只能放手一搏,現在的經濟形勢對做產品設計的實體企業非常非常不好,特別是稅、人工和電子物料瘋狂漲價,現在都2018年3月份了,還一直沒看到降價的勢頭,其實最根本原因就是核動力印鈔機(網友打比方)太可怕了,這種對底層民眾瘋狂的打劫,怎麽說好呢?企業要生存,原材料就必須漲價,否則就無法給這些辛辛苦苦做事的員工增加工資,他們也要生活,什麽都瘋狂漲價,連鎖反應。而另一方面,虛擬的產品、金融傳銷,普天蓋地鼓吹,目的就是找韭菜接盤。還有就是打著技術的口號,瘋狂欺騙融資,象AI,到現在還沒有一個很好的嵌入式平臺能夠在不同環境下準確(100%)的快速的去識別人臉,特征行為,車牌等等。因為源頭的嵌入式芯片功耗和性能就擺在那裏,欺騙不了我們。不過AI的熱度又快到頭了,AI這兩年飛在天上的豬,很快又被另外一個區塊鏈(在中國就是一種變種金融傳銷,肯定會變種的)取代。其實這些實體經濟蕭條和亂象還沒有另外一種現象更讓人擔憂,科技的進步和覺醒的國人不知是否能防止這種現象再一次重演。

圖像識別DM8127開發攻略——KERNEL的移植說明