DAVINCI DM365-DM368開發(fā)攻略-linux-2.6.32的移植_第1頁
DAVINCI DM365-DM368開發(fā)攻略-linux-2.6.32的移植_第2頁
DAVINCI DM365-DM368開發(fā)攻略-linux-2.6.32的移植_第3頁
DAVINCI DM365-DM368開發(fā)攻略-linux-2.6.32的移植_第4頁
DAVINCI DM365-DM368開發(fā)攻略-linux-2.6.32的移植_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

在這里也順便紀(jì)念一下去年故去的C語言之父——丹尼斯·里奇,也是操作系統(tǒng)Unix之父,是他讓嵌入式發(fā)展如此迅猛,科技發(fā)展如此飛速,C語言是如此美麗,簡潔,大大提高軟件跨主芯片平臺(tái)的移植,他勞苦功高,本人決定本篇文章不使用“?!保苯邮褂谩?;”,和很多網(wǎng)友一樣,用“;”代表C語言的一行指令的結(jié)束,以表達(dá)對(duì)他的緬懷;

一、介紹linux-2.6.32:

Linux-2.6.32的網(wǎng)上介紹:增添了虛擬化內(nèi)存de-duplicacion、重寫了writeback代碼、改進(jìn)了Btrfs文件系統(tǒng)、添加了ATIR600/R7003D和KMS支持、CFQ低傳輸延遲時(shí)間模式、perftimechart工具、內(nèi)存控制器支持softlimits、支持S+Core架構(gòu)、支持IntelMoorestown及其新的固件接口、支持運(yùn)行時(shí)電源管理、以及新的驅(qū)動(dòng);這些本人不懂,但是本人只注意到常用的LINUX操作系統(tǒng)RADHATEnterprise6,ubuntu-10.04,debian6.0穩(wěn)定版本,這些都是使用linux-2.6.32這個(gè)版本,智能手機(jī)就更多了,android手機(jī)(經(jīng)典版本HTC-G7手機(jī)使用linux-5和android2.2版本結(jié)合),因?yàn)橹挥袕膌inux-2.6.32以后,才能發(fā)揮android系統(tǒng)的優(yōu)勢;不過單核的DM368無論是432MHz還是新出的500多MHz,跑android系統(tǒng)非常困難,只能跑QT,這里不討論;

本人寫內(nèi)核的環(huán)境和路徑都是基于前兩篇文章的基礎(chǔ)上進(jìn)行的,先從dvsdk_dm368_4_02_00_06\下的Rules.make和Makefile開始,見Rules.make第45行,LINUXKERNEL_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/psp/linux-7很明顯我們把內(nèi)核名字改成linux-7,原來解壓安裝出來的名字太長了,所以要在Rules.make第45行改一下;Makefile是編譯的腳本,TI把整個(gè)DVSDK4.02的開發(fā)環(huán)境統(tǒng)一整合在一起,體現(xiàn)在這個(gè)Makefile,看完這個(gè)Makefile,就應(yīng)該知道如何編譯整個(gè)DVSDK里所有的軟件包,內(nèi)核編譯的命令見143行開始;在dvsdk_dm368_4_02_00_06\目錄下使用makelinux,makelinux_config,makelinux_clean等命令編譯內(nèi)核;或在dvsdk_dm368_4_02_00_06/psp/linux-7目錄下使用命令:makeARCH=armCROSS_COMPILE=arm-none-linux-gnueabi-或修改makefile:#ARCH

?=$(SUBARCH)

ARCH=arm

#CROSS_COMPILE?=

CROSS_COMPILE=arm-none-linux-gnueabi-

二、開始移植:從刪除多余的文件夾和文件開始:1、dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm/configs只保留davinci_dm365_defconfig

圖-1然后按上圖-1,先使用默認(rèn)的config文件進(jìn)行內(nèi)核配置,cparch/arm/configs/davinci_dm365_defconfig.config注意路徑;

2、刪除非ARM芯片平臺(tái)的處理器

進(jìn)入dvsdk_dm368_4_02_00_06/psp/linux-7/arch,保留arm,um,x86三個(gè)文件夾,其他文件刪除掉;然后進(jìn)入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/um文件夾,只保留scripts文件夾,其他刪除掉,包括那幾個(gè)文件Kconfig等文件也刪除掉;繼續(xù)進(jìn)入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/x86文件夾,只保留include和mm文件夾,和幾個(gè)文件,其他文件夾刪除掉見下圖-2:圖-2繼續(xù)進(jìn)入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm文件夾,保留mach-davinci文件夾和保留下圖的文件夾和文件,其他帶mach-刪除吧,占空間,又占備份時(shí)壓縮的時(shí)間,圖-3

上圖-3就是dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm目錄下刪除后的結(jié)果顯示;

3、修改dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm/Makefile,從第120行開始,#machine-$(CONFIG_ARCH_AAEC2000)

:=aaec2000一直到172行,#machine-$(CONFIG_ARCH_MXC91231)

:=mxc91231只保留machine-$(CONFIG_ARCH_DAVINCI)

:=davinci,其他全部使用”#”給屏蔽掉,我們只要machine-$(CONFIG_ARCH_DAVINCI)

:=davinci第176行到第184統(tǒng)統(tǒng)使用”#”給屏蔽掉,不要這些芯片平臺(tái);

4、修改dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm/Kconfig

從第707行開始,一直到793行,這些全部使用“#”給屏蔽掉,保留第795行的source"arch/arm/mach-davinci/Kconfig",然后繼續(xù)把第797到805行使用“#”給屏蔽掉;經(jīng)過上面的刪除,使用tarjcf或tarzcf壓縮的linux-7降到51M,比沒有刪除的減小近一半的大?。晃覀冏非蠛啙?,思路清晰;其實(shí)還有很多地方可以刪除的,大家慢慢體會(huì),包括include,driver里邊的老掉牙的設(shè)備,這里就不啰嗦了;刪除后記得把對(duì)應(yīng)的Kconfig和Makefile給屏蔽掉;

三、開始從內(nèi)核配置

圖-4

因?yàn)榍懊嬉呀?jīng)做了cparch/arm/configs/davinci_dm365_defconfig.config我們按上圖指定的路徑使用makelinux_config,這樣就看到熟悉的內(nèi)核配置界面,見下圖-5:圖-5我們按順序一個(gè)一個(gè)配置,當(dāng)然,很多配置選項(xiàng)都是使用TIdavinci_dm365_defconfig配置好的,我們對(duì)它們進(jìn)行分析、裁剪、修改,進(jìn)入“Generalsetup”配置圖-6上圖是我們多選了RAMdisk文件系統(tǒng)支持的壓縮方式,默認(rèn)是使用gzip生產(chǎn)RAMDISK文件系統(tǒng),你也可以使用bzip2和LZMA(壓縮率比前面兩個(gè)高);

圖-7進(jìn)入“SystemType”配置,上面按TI原來的配置,圖-8然后直接進(jìn)入“TIDavinciImplementations”,按上面的選擇,最后面的27000000表示你的主芯片晶振是27MHz還是24MHz,本公司的是24MHz晶振,我們就把27000000改成24000000;

圖-9返回圖-5,進(jìn)入“Networkingsupport”,你的系統(tǒng)如果沒有WIFI等無線模塊,這個(gè)無線的“wireless”協(xié)議可以不選;圖-10主要對(duì)“Networkingoptions”進(jìn)行配置,這里基本上就是IPV4和IPV6的協(xié)議配置,我們按TI原來的選擇,帶“M”選項(xiàng)也可以使用“*”編譯進(jìn)內(nèi)核,而不是模塊;圖-11

圖-12返回圖-5進(jìn)入“DeviceDrivers”,這是配置內(nèi)核的重點(diǎn),見圖-11和圖-12,

圖-13按順序先對(duì)NANDFLASH分區(qū)MTD進(jìn)行配置,直接參考TI默認(rèn)的配置;圖-14圖-14RAM/ROM/FLASH及下面3個(gè)使用TI默認(rèn)的配置,

圖-15進(jìn)入“NANDdeviceSupport”的配置,一定要選擇“SupportNANDonDavinciSoC”,圖-16這是2.6.32新的特性,開始支持UBI文件系統(tǒng),UBI文件系統(tǒng)的出現(xiàn),可以讓JFFS2,YAFFS2退出市場,跑android系統(tǒng),必須用到,這里我們可以不選,也可以選,根據(jù)你的板子要使用什么樣的文件系統(tǒng);

圖-17返回圖-11進(jìn)入“Blockdevices”配置,我們直接使用TI的配置,

圖-18返回圖-11進(jìn)入“SCSIdevicesupport”的配置,選擇這個(gè)來支持U盤,否則你的U盤無法被DM368板子識(shí)別,我們一般把DM368USB設(shè)置HOST模式;圖-19返回圖-11進(jìn)入“Networkdevicesupport”的配置,一般的RJ45網(wǎng)口選擇“10Mor100Mbit”,DM368不支持1000Mbit,無線“WirelessLAN”你不需要的話可以不選;“PPP”這個(gè)可以不選,而有時(shí)要支持3G的模塊的時(shí)候,PPP協(xié)議(見圖-10的配置)和設(shè)備支持要選擇;圖-20進(jìn)入“10Mor100Mbit”,選擇“TIDavinciEMACSupport;圖-21返回圖-11進(jìn)入“Inputdevicesupport”,這選擇是否支持鼠標(biāo)鍵盤觸摸屏等輸入,我們這邊用不上,直接不選;

圖-22返回圖-11進(jìn)入“Chardevice”,一定要選擇DM365IPIPE,IMPPreviewer,IMPResizer,這個(gè)到時(shí)候調(diào)試視頻采集程序需要用到Previewer、Resizer等DAVINCI技術(shù);

圖-23在圖-22中,選擇進(jìn)入“Serialdriver”,這里就是DM368的串口配置了,DM368支持UART0和UART1,UART1和其他GPIO復(fù)用,小心分配使用硬件資源,和DM6446一樣,都是8250的驅(qū)動(dòng),而DM6446可以配置3個(gè)UART;圖-24返回圖-11進(jìn)入“I2CSupport”,這個(gè)沒得說,肯定使用選上的,圖-25

TI開發(fā)板使用的I2C擴(kuò)展芯片,我們不需要,所以External就不要了,只選上“DavinciI2Cdriver”;圖-26返回圖-11進(jìn)入“SPISupport”,如果你的板子沒有外接SPI接口的芯片,這里可以不選;圖-27返回圖-11進(jìn)入“GPIOSupport”,TI使用芯片擴(kuò)展更多的GPIO腳,我們不需要,可以不選;圖-28返回圖-11進(jìn)入“WatchdogTimerSupport”,凡是使用軟件看門狗的,都需要選上這個(gè),DM368和DM6446這些芯片都支持軟件看門狗,注意選擇是“Davinciwatchdog”;圖-29返回圖-11進(jìn)入“Multimediasupport”,多媒體支持,這個(gè)就是Davinci的重點(diǎn),圖-30按TI默認(rèn)的選擇,MT9P031500萬像素的SERSEOR可以選上,你有其他公司的SENSOR,也可以參考MT9P031的方法加入你SENSOR的驅(qū)動(dòng),然后修改linux-7\drivers\media\video里邊的Makefile和Kconfig文件就OK了;圖-31然后從圖-30的“encoders/decodersandxxxx”進(jìn)去選擇TVP5146,高清Ypbpr輸出THS7303,TH7353芯片的選擇支持,我們公司使用TVP5158,本人把它加入內(nèi)核編譯,所以這里顯示TVP5158,TVP7002我們沒有使用,所以不用選;圖-32返回圖-11進(jìn)入“GraphicsSuppor”,這個(gè)就是選擇支持TFT3.5,TFT4.3寸LCD屏的驅(qū)動(dòng),也就是通過RGB接口支持屏的輸出,我板子不支持,可以選擇也可以按TI默認(rèn)的設(shè)置;圖-33返回圖-11進(jìn)入“SoundcardSuppor”,聲卡選擇,圖-34DM368主芯片上帶有音頻功能的模塊,直接按TI的設(shè)置,圖-35返回圖-11進(jìn)入“USBSuppor”,我們把DM368跑的LINUX系統(tǒng)當(dāng)作HOST來使用,“HIDSupport”是支持鼠標(biāo)鍵盤之類的東西,可以選也可以不要;基本上采用TI的默認(rèn)配置圖-36這里選擇支持U盤,這個(gè)和前面說過的SCSISpport是對(duì)應(yīng)的;圖-37返回圖-11進(jìn)入“MMC/SD/SDIOSuppor”,linux-2.6.32的SD卡驅(qū)動(dòng)完全支持32G的容量,DM368支持兩個(gè)SD卡接口0和1,使用SD0基本不需要什么移植,使用SD1內(nèi)核驅(qū)動(dòng)注意使用SD1卡時(shí),復(fù)用的GPIO腳就不需要了;圖-38返回圖-11進(jìn)入“RealTimeClock”,DM368支持片上的RTC時(shí)鐘,即“TIDavinciRTC”,我們自己的板子支持外部RTC時(shí)鐘芯片PCF8563,根據(jù)外設(shè)選擇;圖-39返回圖-5進(jìn)入“Filesystems”,對(duì)需要支持的文件系統(tǒng)進(jìn)行選擇,選擇EXT2/EXT3/EXT4文件系統(tǒng)是在斷電對(duì)存儲(chǔ)設(shè)備保護(hù)和日志恢復(fù)的情況下,比FAT32好多了,比如把SD卡格式化成EXT3/EXT4比FAT32更好用;圖-40其他保留TI的配置,圖-41進(jìn)入“DOS/FAT/NT”文件系統(tǒng)的支持,按上面的選擇,NTFS沒有用過,不知在嵌入式是否好用,這里選擇的目的是能夠使用U盤等等存儲(chǔ)設(shè)備;圖-42進(jìn)入“Pseudofilesystems”,保留TI的默認(rèn)配置;圖-43圖-44進(jìn)入“Miscellaneousfilesystems”,配置NANDFLASH支持的文件系統(tǒng),YAFFS2的文件系統(tǒng)是本人下載然后按patch就行移植的,TI原來沒有,選擇YAFF2,JFFS2,還有cramfs,SquashFS,UBI文件系統(tǒng)目前沒有驗(yàn)證,有時(shí)間再試試,剛才提到的都是最常用的嵌入式NAND文件系統(tǒng),就是要燒進(jìn)NANDFLASH的;圖-45圖-45就是NFS文件系統(tǒng)的設(shè)置,我們在板子上運(yùn)行的是NFSclient模式,即客戶端,而開發(fā)環(huán)境是NFSSERVER端;里邊的SMB(SAMBA)在板子上不需要支持,我們?nèi)サ舨贿x;圖-46圖-46就是選擇內(nèi)核支持的語言;

然后備份配置:在dvsdk_dm368_4_02_00_06目錄下#cppsp/linux-7/.config

psp/linux-7/dm368_20111227.config注意路徑,凡是使用makedistclean和makelinux_clean命令后,.config不存在,這時(shí)我們就必須使用:#cppsp/linux-7/dm368_20111227.configpsp/linux-7/.config注意.config的“.”,這樣整個(gè)內(nèi)核配置基本結(jié)束;

四、分析和修改代碼:

1、mach-davinci\board-dm365-evm.c這個(gè)是DM368內(nèi)核移植重點(diǎn)的地方,系統(tǒng)初始化函數(shù)都在這里,而外部設(shè)備初始化在各自的驅(qū)動(dòng)文件里;打開第156行#defineNAND_BLOCK_SIZE

SZ_128K同時(shí)屏蔽/*#defineNAND_BLOCK_SIZE

SZ_512K*/這個(gè)是4KNANDFLASH因?yàn)槲覀児镜陌遄佣际鞘褂?K的NAND

FLASH,512字節(jié)的NAND不適合新的文件系統(tǒng),慢慢會(huì)被淘汰;

修改NANDFLASH的分區(qū),staticstructmtd_partitiondavinci_nand_partitions[]={

{

/*UBL(afewcopies)plusU-Boot*/

.name

="bootloader",

.offset

=0x80000,

.size

=3*NAND_BLOCK_SIZE,

.mask_flags

=0,

/*tongye:.mask_flags

=MTD_WRITEABLE,*//*forceread-only*/

},{

/*U-Bootenvironment*/

.name

="params",

.offset

=0xe0000,

.size

=1*NAND_BLOCK_SIZE,

.mask_flags

=0,

},{

.name

="kernel",

.offset

=0x100000,

.size

=SZ_4M+SZ_512K,

.mask_flags

=0,

},{

.name

="basefs",

.offset

=0x100000+SZ_4M+SZ_512K,

.size

=SZ_32M-SZ_4M,

.mask_flags

=0,

/*tongye:28M-byteforramdisk,cramfs,squashfsrootfs*/

},{

.name

="userfs",

.offset

=0x100000+SZ_32M+SZ_512K,

.size

=SZ_64M+SZ_16M,

.mask_flags

=0,

/*tongye:80M-byteforjffs2,yaffs2rootfs*/

},{

.name

="userdata",

.offset

=SZ_64M+SZ_32M+SZ_16M+SZ_1M+SZ_512K,

.size

=0x8000000-SZ_64M-SZ_32M-SZ_16M-SZ_1M-SZ_512K,

.mask_flags

=0,

}

/*twoblockswithbadblocktable(andmirror)attheend*/};

UBL的代碼放在0x20000~0x40000的位置,一般NANDFLASH前面5個(gè)BLOCK出現(xiàn)壞塊的幾率非常小,在產(chǎn)品中一般很少去維護(hù)更新UBL,所以沒有把UBL單獨(dú)分一個(gè)分區(qū);而其他空間出現(xiàn)壞塊的幾率比較大,所以給U-BOOT分3~4個(gè)BLOCK夠用了,內(nèi)核分5M-BYTE也夠用,而U-BOOT參數(shù)分1~2個(gè)BLOCK,本公司直接放到0x60000~0x80000的空間也可以,沒有規(guī)定;后面的文件系統(tǒng)分區(qū)就根據(jù)你裁剪的文件系統(tǒng)、文件系統(tǒng)的類型進(jìn)行大小分區(qū);

staticstructi2c_board_infoi2c_info[]={/*

{

I2C_BOARD_INFO("dm365evm_keys",0x25),

},

{

I2C_BOARD_INFO("24c256",0x50),

.platform_data

=&eeprom_info,

},*/

{

I2C_BOARD_INFO("tlv320aic3x",0x18),

},

{

I2C_BOARD_INFO("ths7303",0x2c),

},

/*{

I2C_BOARD_INFO("PCA9543A",0x73),

},*/

{

I2C_BOARD_INFO("pcf8563",0x51),

},};上面這個(gè)結(jié)構(gòu)就是看看你的I2C總線帶什么樣的設(shè)備,根據(jù)你的I2C設(shè)備地址,添加到這里,這樣才能調(diào)用到設(shè)備初始化函數(shù);從上面的修改看出,我們的板子不需要AT24C256這些EEPROM芯片,可以干掉;

staticvoiddm365evm_reset_imager(intrst){

u8val;//tongye#if0

val=__raw_readb(cpld+CPLD_POWER)|BIT(3)|BIT(11)|BIT(19)|BIT(27);

__raw_writeb(val,(cpld+CPLD_POWER));

val=__raw_readb(cpld+CPLD_MUX)|BIT(6)|BIT(14)|BIT(22)|BIT(30);

__raw_writeb(val,(cpld+CPLD_MUX));

/*Resetbit6ofCPLD_IMG_DIR2*/

val=__raw_readb(cpld+CPLD_IMG_DIR2)&~BIT(6);

__raw_writeb(val,(cpld+CPLD_IMG_DIR2));

/*Setbit5ofCPLD_IMG_MUX5*/

val=__raw_readb(cpld+CPLD_IMG_MUX5)|BIT(5);

__raw_writeb(val,(cpld+CPLD_IMG_MUX5));

/*Resetbit0ofCPLD_IMG_MUX5*/

val=__raw_readb(cpld+CPLD_IMG_MUX5)&~BIT(0);

__raw_writeb(val,(cpld+CPLD_IMG_MUX5));

#endif

/**

*ConfigureGPIO40tobeoutputandhigh.ThishasdependencyonMMC1

*/#if1

davinci_cfg_reg(DM365_PWM3_G85);

davinci_cfg_reg(DM365_PWM3_G86);

gpio_request(85,"sensor_reset");

gpio_request(86,"sensor_standby");

gpio_direction_output(85,0);

gpio_direction_output(86,0);

gpio_set_value(85,1);

gpio_set_value(86,1);

mdelay(15);

頭文件要加上#include<linux/delay.h>

gpio_set_value(85,0);

gpio_set_value(86,0);

mdelay(25);

gpio_set_value(85,1);

gpio_set_value(86,1);

mdelay(25);

#else

davinci_cfg_reg(DM365_GPIO40);

gpio_request(40,"sensor_reset");

if(rst)

gpio_direction_output(40,1);

else

gpio_direction_output(40,0);#endif}上面的函數(shù)修改:我們不需要CPLD,所以屏蔽掉,我們直接使用GPIO控制MT9P031SENSOR的復(fù)位和STANDBY信號(hào);

staticstructvpfe_subdev_infovpfe_sub_devs[]={

{

.module_name="tvp5158",

.grp_id=VPFE_SUBDEV_TVP5146,

.num_inputs=ARRAY_SIZE(tvp5158_inputs),

.inputs=tvp5158_inputs,

.routes=tvp5158_routes,

.can_route=1,

.ccdc_if_params={

.if_type=VPFE_BT656,

.hdpol=VPFE_PINPOL_POSITIVE,

.vdpol=VPFE_PINPOL_POSITIVE,

},

.board_info={

I2C_BOARD_INFO("tvp5158",0x5B),

.platform_data=&tvp5158_pdata,

},

},

{

.module_name="tvp7002",

.grp_id=VPFE_SUBDEV_TVP7002,

.num_inputs=ARRAY_SIZE(tvp7002_inputs),

.inputs=tvp7002_inputs,

.ccdc_if_params={

.if_type=VPFE_BT1120,

.hdpol=VPFE_PINPOL_POSITIVE,

.vdpol=VPFE_PINPOL_POSITIVE,

},

.board_info={

I2C_BOARD_INFO("tvp7002",0x5c),

.platform_data=&tvp7002_pdata,

},

},

{

.module_name="ths7353",

.grp_id=VPFE_SUBDEV_TVP7002,

.board_info={

I2C_BOARD_INFO("ths7353",0x2e),

},

},

{

.module_name="mt9p031",

.is_camera=1,

.grp_id=VPFE_SUBDEV_MT9P031,

.num_inputs=ARRAY_SIZE(mt9p031_inputs),

.inputs=mt9p031_inputs,

.ccdc_if_params={

.if_type=VPFE_RAW_BAYER,

.hdpol=VPFE_PINPOL_POSITIVE,

.vdpol=VPFE_PINPOL_POSITIVE,

},

.board_info={

I2C_BOARD_INFO("mt9p031",0x48),

/*thisisforPCLKrisingedge*/

.platform_data=(void*)1,

},

}};TI的DM368開發(fā)板同時(shí)支持TVP5146、TVP7002、MT9P031;TVP5146代表標(biāo)清復(fù)合視頻輸入采集芯片(D1格式),TVP7002代表復(fù)合視頻YPbPr的高清輸入采集芯片,MT9P031代表500萬像素的SENSOR采集;

/*SettheinputmuxforTVP7002/TVP5146/MTxxxxsensors*/staticintdm365evm_setup_video_input(enumvpfe_subdev_idid){

constchar*label;

u8mux,resets;//Jingbo

/////mux=__raw_readb(cpld+CPLD_MUX);

////mux&=~CPLD_VIDEO_INPUT_MUX_MASK;

////resets=__raw_readb(cpld+CPLD_RESETS);

switch(id){

caseVPFE_SUBDEV_TVP5146:

mux|=CPLD_VIDEO_INPUT_MUX_TVP5146;

resets&=~BIT(0);

label="tvp5158SD";

dm365evm_reset_imager(0);

break;

caseVPFE_SUBDEV_MT9P031:

mux|=CPLD_VIDEO_INPUT_MUX_IMAGER;

resets|=BIT(0);/*PutTVP5146inreset*/

label="HDimager";

dm365evm_reset_imager(1);

/*Switchonpca9543ai2cswitch*/

////if(have_imager())

////dm365evm_enable_pca9543a(1);

break;

caseVPFE_SUBDEV_TVP7002:

resets&=~BIT(2);

mux|=CPLD_VIDEO_INPUT_MUX_TVP7002;

label="tvp7002HD";

break;

default:

return0;

}

////__raw_writeb(mux,cpld+CPLD_MUX);

////__raw_writeb(resets,cpld+CPLD_RESETS);

pr_info("EVM:switchto%svideoinput\n",label);

return0;}上面的函數(shù)去掉CPLD的東西,這個(gè)視頻采集芯片的選擇是和U-BOOT的參數(shù)一一對(duì)應(yīng)的,在U-BOOTbootargs的參數(shù)里,加入davinci_capture.device_type=0表示使用TVP5146采集,davinci_capture.device_type=1表示使用MT9P031采集,davinci_capture.device_type=2表示使用TVP7002采集,內(nèi)核讀取U-BOOT的參數(shù),會(huì)在初始化確定是否調(diào)用什么樣的采集芯片驅(qū)動(dòng);所以我們在內(nèi)核配置的時(shí)候,可以同時(shí)選上三種芯片;staticvoid__initevm_init_i2c(void){

davinci_init_i2c(&i2c_pdata);#if0

if(have_imager())

i2c_add_driver(&pca9543a_driver);#endif

i2c_register_board_info(1,i2c_info,ARRAY_SIZE(i2c_info));}這個(gè)pca9543aI2C切換芯片我們不需要;

staticvoid__initevm_init_cpld(void){

u8mux,resets;

constchar*label;

structclk*aemif_clk;

structdavinci_soc_info*soc_info=&davinci_soc_info;

/*MakesurewecanconfiguretheCPLDthroughCS1.

Then

*leaveitonforlateraccesstoMMCandLEDregisters.

*/

aemif_clk=clk_get(NULL,"aemif");

if(IS_ERR(aemif_clk))

return;

clk_enable(aemif_clk);

#if0

if(request_mem_region(DM365_ASYNC_EMIF_DATA_CE1_BASE,SECTION_SIZE,

"cpld")==NULL)

gotofail;

cpld=ioremap(DM365_ASYNC_EMIF_DATA_CE1_BASE,SECTION_SIZE);

if(!cpld){

release_mem_region(DM365_ASYNC_EMIF_DATA_CE1_BASE,

SECTION_SIZE);fail:

pr_err("ERROR:can'tmapCPLD\n");

clk_disable(aemif_clk);

return;

}

/*Externalmuxingforsomesignals*/

mux=0;

/*ReadCPLDversionnumber*/

soc_info->cpld_version=__raw_readb(cpld+CPLD_VERSION);

/*ReadSW5tosetupNAND+keypad_or_OneNAND(syncread).

*NOTE:

SW4buswidthsettingmustmatch!

*/

if((__raw_readb(cpld+CPLD_SWITCH)&BIT(5))==0){

/*externalkeypadmux*/

mux|=BIT(7);

platform_add_devices(dm365_evm_nand_devices,

ARRAY_SIZE(dm365_evm_nand_devices));

}else{

/*noOneNANDsupportyet*/

}

/*Leaveexternalchipsinresetwhenunused.*/

resets=BIT(3)|BIT(2)|BIT(1)|BIT(0);

/*...andENET...*/

dm365evm_emac_configure();

soc_info->emac_pdata->phy_mask=DM365_EVM_PHY_MASK;

soc_info->emac_pdata->mdio_max_freq=DM365_EVM_MDIO_FREQUENCY;

resets&=~BIT(3);

/*...andAIC33*/

resets&=~BIT(1);

/*StaticvideoinputconfigwithSN74CBT162141-of-3mux:

*

-portb1==tvp7002(muxlowbits==1or6)

*

-portb2==imager(muxlowbits==2or7)

*

-portb3==tvp5146(muxlowbits==5)

*

*Runtimeswitchingcouldworktoo,withlimitations.

*/

if(have_imager()){

label="HDimager";

mux|=CPLD_VIDEO_INPUT_MUX_IMAGER;

/*externallymuxMMC1toimager*/

mux|=BIT(6);

dm365evm_reset_imager(1);

}else{

/*wecanuseMMC1...*/

dm365evm_mmc_configure();

davinci_setup_mmc(1,&dm365evm_mmc_config);

if(have_tvp7002()){

mux|=CPLD_VIDEO_INPUT_MUX_TVP7002;

resets&=~BIT(2);

label="tvp7002HD";

}else{

/*defaulttotvp5146*/

mux|=CPLD_VIDEO_INPUT_MUX_TVP5146;

resets&=~BIT(0);

label="tvp5158SD";

dm365evm_reset_imager(0);

}

}

__raw_writeb(mux,cpld+CPLD_MUX);

__raw_writeb(resets,cpld+CPLD_RESETS);

#else

platform_add_devices(dm365_evm_nand_devices,

ARRAY_SIZE(dm365_evm_nand_devices));

/*...andENET...*/

dm365evm_emac_configure();

soc_info->emac_pdata->phy_mask=DM365_EVM_PHY_MASK;

soc_info->emac_pdata->mdio_max_freq=DM365_EVM_MDIO_FREQUENCY;

//if(have_imager())

{

dm365evm_reset_imager(1);

//pr_info("EVM:resetmt9p031imager\n");

}

//pr_info("EVM:%svideoinput\n",label);#endif

/*REVISITexportswitches:NTSC/PAL(SW5.6),EXTRA1(SW5.2),etc*/}上面的函數(shù)很重要,除去掉CPLD的東西外,一定要把

platform_add_devices(dm365_evm_nand_devices,

ARRAY_SIZE(dm365_evm_nand_devices));保留,否則你的內(nèi)核啟動(dòng)的時(shí)候,根本沒有NAND的驅(qū)動(dòng)和分區(qū)顯示;dm365evm_emac_configure();也肯定要的,否則沒有網(wǎng)絡(luò)驅(qū)動(dòng)叫LINUX嗎?TI就是通過CPLD來控制一些外設(shè),CPLD比較貴,不適合低成本大批量生產(chǎn),所以我們?nèi)サ袅耍?/p>

static__initvoiddm365_evm_init(void){

dm365evm_gpio_configure();//tongye:copyithere

evm_init_i2c();

davinci_serial_init(&uart_config);

dm365evm_emac_configure();

dm365evm_usb_configure();

davinci_setup_mmc(0,&dm365evm_mmc_config);

/*maybesetupmmc1/etc..._after_mmc0*/

evm_init_cpld();

dm365_init_asp(&dm365_evm_snd_data);

//dm365_init_rtc();

//dm365_init_ks(&dm365evm_ks_data);

//dm365_init_spi0(BIT(0),dm365_evm_spi_info,

//ARRAY_SIZE(dm365_evm_spi_info));

//dm365_init_tsc2004();

dm365evm_gpio_configure();}這個(gè)函數(shù)就是對(duì)MMC/SD、USB、等接口進(jìn)行初始化了,tsc2004這個(gè)是觸摸屏的芯片,dm365evm_gpio_configure()里邊我們添加了很多GPIO的初始值定義;

2、修改mach-davinci\dm365.c

這個(gè)要和arch\arm\mach-davinci\include\mach\mux.h配合看,好好看看structmux_configdm365_pins這個(gè)定義,這個(gè)DM368的管腳復(fù)用非常復(fù)雜,使能某個(gè)功能,那么對(duì)應(yīng)的另外的功能就不能用了,因此要非常小心對(duì)待,特別是和GPIO復(fù)用;

后面這些源碼介紹就是提示和分析了:drivers\char\里有dm365_ipipe.c、imp_common.c、imp_previewer.c、imp_resizer.c、等文件;

drivers\i2c\busses\里有i2c-davinci.c

重點(diǎn)介紹:drivers\media\video\里有V4L2的接口

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論