訊為4412開發板 使用三星2410芯片,基於arm9架構,由於自己電腦硬件的局限,只能跑Android4.0.3系統。
1、Uboot這個直接使用官方鏡像燒寫就可以了,一般情況不用去重復燒寫。
略。
燒寫命令:fastboot.exe flash bootloader u-boot-iTOP-4412.bin
2、linux Kernel
1)設備驅動
--字符設備驅動
--雜項設備驅動
--I2C設備驅動(兩種模式
a,linux內部i2c體系
包括兩部分:i2c設備驅動與i2c總線驅動,總線驅動在kernel里已經存在了,設備驅動請自己寫。
在這里不得不吐槽一下4412開發板,雖然有7個i2c接口,但是只有兩個外接!i2c6與i2c7,i2c7外掛的是觸摸驅動,應該不能繼續外掛其他設備了,因為i2c總線同一時間只能響應一個設備,所以能用的只有i2c6,可惜我使勁了好久,依舊不能request到總線,一直總線忙,return-110 。
b,使用gpio模擬i2c時序
模擬i2c需要注意芯片的i2c時序,否則會得不到ack!!這種方法可以使用雜項設備進行注冊,驅動和雜項設備驅動類似。
2)注冊到kernel中(平台文件:arch/arm/mach-exynos/mach-itop4412.c
--字符類設備
首先聲明設備信息,注意里面的.name變量,這個name變量需要和驅動里的.name相同,這樣才能順利進入probe函數中。
struct platform_device s3c_device_XXX ={ .name = "match-name", .id = -1, };
然后在platform_device *smdk4x12_devices[] __initdata函數中注冊,這樣一個字符類設備就注冊成功了。
&s3c_device_XXX,
補上設備驅動里需要的匹配信息
struct platform_driver XXX_driver = { .probe = XXX_probe, .remove = XXX_remove, .shutdown = XXX_shutdown, .suspend = XXX_suspend, .resume = XXX_resume, .driver = { .name = match-name, //這個.name就是需要匹配的項 .owner = THIS_MODULE, } };
--i2c驅動
首先需要確定沒有其他驅動占用該i2c總線,以i2c7為例:
static struct i2c_board_info i2c_devs7[] __initdata = { #ifdef CONFIG_TOUCHSCREEN_TSC2007 { I2C_BOARD_INFO("tsc2007", 0x48), //匹配項,從設備地址(讀寫addr>>1) .type = "tsc2007", .platform_data = &tsc2007_info, .irq = IRQ_EINT(0), }, #endif };
平台文件已經在init函數里注冊好了,所以就只要添加自己的設備名就ok了。
3)編譯
a,編譯進kernel
打開驅動所在目錄下的Makefile和Kconfig文件,以leds點燈為例
--Makfile
在最后添加obj-$(CONFIG_LEDS_CTL) += itop4412_leds.o,生成itop4412_leds.o文件。
--Kconfig
在最后添加如下信息:
config LEDS_CTL bool "Enable LEDS config" default y help Enable LEDS config
b,以模塊編譯
Makefile文件如上。
Kconfig文件更改如下:
config LEDS_CTL tristate "Enable LEDS config" default y help Enable LEDS config
配置信息編寫完畢,在Ubuntu里使用make menuconfig命令進入內核配置
選中Enable LEDS config選項,則CONFIG_LEDS_CTL=1,否則為0.
同時平台文件中的配置如下:
--編譯進內核
#ifdef CONFIG_LEDS_CTL struct platform_device s3c_device_leds_ctl = { .name = "leds", .id = -1, }; #endif
--以模塊編譯
#if defined(CONFIG_LEDS_CTL) || defined(CONFIG_LEDS_CTL_MODULE) struct platform_device s3c_device_leds_ctl = { .name = "leds", .id = -1, }; #endif
注意這兩個還是有一點區別的。
3)更改linux啟動圖片
使用image2Lcd軟件把一個bmp圖片轉換成一個數組
更改drivers/video/samsung/ iTop-4412.h文件中的第二個數組內容,ok!
如果只要顯示文字,那么圖片的背景請設置為黑色:#ffffff
最后執行make命令就ok了。
會生成一個zImage文件:arch/arm/boot/zImage
燒寫命令:fastboot.exe flash kernel zImage
3、Android系統編譯
1)訪問設備節點的權限
打開device/samsung/smdk4x12/conf/init.smdk4x12.rc
在最后增加chmod 0777 xxx,保存退出。
注意!!這個文件最后會打包到ramdisk_uboot.img中,所以在燒寫system的時候需要同時燒寫,否則更改失敗。
2)APP開機自啟
打開device/samsung/smdk4x12/device.mk,以leds為例
#Install LedTest PRODUCT_COPY_FILES += \ device/samsung/smdk4x12/apk/topeet/ledtest/ledtest.apk:system/app/ledtest.apk PRODUCT_COPY_FILES += \ device/samsung/smdk4x12/apk/topeet/ledtest/libled.so:system/lib/libled.so
注釋:注意路徑問題,並且把文件下載到相應的目錄下,即.apk與.so文件都位於device/samsung/smdk4x12/apk/topeet/ledtest目錄下。
3)更改android啟動時顯示的logo
這里我就有點取巧啦,直接更改圖片資源:frameworks/base/core/res/assets/images
該目錄下有兩個文件,android-logo-mask.png這個就是android的啟動時顯示的圖片。
使用./build_android.sh命令編譯Android
最后會生成system鏡像:位於out/target/product/smdk4x12目錄下的system.img與ramdisk_uboot.img文件。
燒寫命令:fastboot.exe flash system system.img / fastboot.exe flash ramdisk ramdisk-uboot.img
最后重啟:fastboot reboot
---------------------------------------------<完>-------------------------------------------------