DAVINCI DM365-DM368开发攻略-linux-2.6.32的移植_第1页
DAVINCI DM365-DM368开发攻略-linux-2.6.32的移植_第2页
DAVINCI DM365-DM368开发攻略-linux-2.6.32的移植_第3页
DAVINCI DM365-DM368开发攻略-linux-2.6.32的移植_第4页
DAVINCI DM365-DM368开发攻略-linux-2.6.32的移植_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在这里也顺便纪念一下去年故去的C语言之父——丹尼斯·里奇,也是操作系统Unix之父,是他让嵌入式发展如此迅猛,科技发展如此飞速,C语言是如此美丽,简洁,大大提高软件跨主芯片平台的移植,他劳苦功高,本人决定本篇文章不使用“。”,直接使用“;”,和很多网友一样,用“;”代表C语言的一行指令的结束,以表达对他的缅怀;

一、介绍linux-2.6.32:

Linux-2.6.32的网上介绍:增添了虚拟化内存de-duplicacion、重写了writeback代码、改进了Btrfs文件系统、添加了ATIR600/R7003D和KMS支持、CFQ低传输延迟时间模式、perftimechart工具、内存控制器支持softlimits、支持S+Core架构、支持IntelMoorestown及其新的固件接口、支持运行时电源管理、以及新的驱动;这些本人不懂,但是本人只注意到常用的LINUX操作系统RADHATEnterprise6,ubuntu-10.04,debian6.0稳定版本,这些都是使用linux-2.6.32这个版本,智能手机就更多了,android手机(经典版本HTC-G7手机使用linux-5和android2.2版本结合),因为只有从linux-2.6.32以后,才能发挥android系统的优势;不过单核的DM368无论是432MHz还是新出的500多MHz,跑android系统非常困难,只能跑QT,这里不讨论;

本人写内核的环境和路径都是基于前两篇文章的基础上进行的,先从dvsdk_dm368_4_02_00_06\下的Rules.make和Makefile开始,见Rules.make第45行,LINUXKERNEL_INSTALL_DIR=$(DVSDK_INSTALL_DIR)/psp/linux-7很明显我们把内核名字改成linux-7,原来解压安装出来的名字太长了,所以要在Rules.make第45行改一下;Makefile是编译的脚本,TI把整个DVSDK4.02的开发环境统一整合在一起,体现在这个Makefile,看完这个Makefile,就应该知道如何编译整个DVSDK里所有的软件包,内核编译的命令见143行开始;在dvsdk_dm368_4_02_00_06\目录下使用makelinux,makelinux_config,makelinux_clean等命令编译内核;或在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,先使用默认的config文件进行内核配置,cparch/arm/configs/davinci_dm365_defconfig.config注意路径;

2、删除非ARM芯片平台的处理器

进入dvsdk_dm368_4_02_00_06/psp/linux-7/arch,保留arm,um,x86三个文件夹,其他文件删除掉;然后进入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/um文件夹,只保留scripts文件夹,其他删除掉,包括那几个文件Kconfig等文件也删除掉;继续进入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/x86文件夹,只保留include和mm文件夹,和几个文件,其他文件夹删除掉见下图-2:图-2继续进入dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm文件夹,保留mach-davinci文件夹和保留下图的文件夹和文件,其他带mach-删除吧,占空间,又占备份时压缩的时间,图-3

上图-3就是dvsdk_dm368_4_02_00_06/psp/linux-7/arch/arm目录下删除后的结果显示;

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统统使用”#”给屏蔽掉,不要这些芯片平台;

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

从第707行开始,一直到793行,这些全部使用“#”给屏蔽掉,保留第795行的source"arch/arm/mach-davinci/Kconfig",然后继续把第797到805行使用“#”给屏蔽掉;经过上面的删除,使用tarjcf或tarzcf压缩的linux-7降到51M,比没有删除的减小近一半的大小;我们追求简洁,思路清晰;其实还有很多地方可以删除的,大家慢慢体会,包括include,driver里边的老掉牙的设备,这里就不啰嗦了;删除后记得把对应的Kconfig和Makefile给屏蔽掉;

三、开始从内核配置

图-4

因为前面已经做了cparch/arm/configs/davinci_dm365_defconfig.config我们按上图指定的路径使用makelinux_config,这样就看到熟悉的内核配置界面,见下图-5:图-5我们按顺序一个一个配置,当然,很多配置选项都是使用TIdavinci_dm365_defconfig配置好的,我们对它们进行分析、裁剪、修改,进入“Generalsetup”配置图-6上图是我们多选了RAMdisk文件系统支持的压缩方式,默认是使用gzip生产RAMDISK文件系统,你也可以使用bzip2和LZMA(压缩率比前面两个高);

图-7进入“SystemType”配置,上面按TI原来的配置,图-8然后直接进入“TIDavinciImplementations”,按上面的选择,最后面的27000000表示你的主芯片晶振是27MHz还是24MHz,本公司的是24MHz晶振,我们就把27000000改成24000000;

图-9返回图-5,进入“Networkingsupport”,你的系统如果没有WIFI等无线模块,这个无线的“wireless”协议可以不选;图-10主要对“Networkingoptions”进行配置,这里基本上就是IPV4和IPV6的协议配置,我们按TI原来的选择,带“M”选项也可以使用“*”编译进内核,而不是模块;图-11

图-12返回图-5进入“DeviceDrivers”,这是配置内核的重点,见图-11和图-12,

图-13按顺序先对NANDFLASH分区MTD进行配置,直接参考TI默认的配置;图-14图-14RAM/ROM/FLASH及下面3个使用TI默认的配置,

图-15进入“NANDdeviceSupport”的配置,一定要选择“SupportNANDonDavinciSoC”,图-16这是2.6.32新的特性,开始支持UBI文件系统,UBI文件系统的出现,可以让JFFS2,YAFFS2退出市场,跑android系统,必须用到,这里我们可以不选,也可以选,根据你的板子要使用什么样的文件系统;

图-17返回图-11进入“Blockdevices”配置,我们直接使用TI的配置,

图-18返回图-11进入“SCSIdevicesupport”的配置,选择这个来支持U盘,否则你的U盘无法被DM368板子识别,我们一般把DM368USB设置HOST模式;图-19返回图-11进入“Networkdevicesupport”的配置,一般的RJ45网口选择“10Mor100Mbit”,DM368不支持1000Mbit,无线“WirelessLAN”你不需要的话可以不选;“PPP”这个可以不选,而有时要支持3G的模块的时候,PPP协议(见图-10的配置)和设备支持要选择;图-20进入“10Mor100Mbit”,选择“TIDavinciEMACSupport;图-21返回图-11进入“Inputdevicesupport”,这选择是否支持鼠标键盘触摸屏等输入,我们这边用不上,直接不选;

图-22返回图-11进入“Chardevice”,一定要选择DM365IPIPE,IMPPreviewer,IMPResizer,这个到时候调试视频采集程序需要用到Previewer、Resizer等DAVINCI技术;

图-23在图-22中,选择进入“Serialdriver”,这里就是DM368的串口配置了,DM368支持UART0和UART1,UART1和其他GPIO复用,小心分配使用硬件资源,和DM6446一样,都是8250的驱动,而DM6446可以配置3个UART;图-24返回图-11进入“I2CSupport”,这个没得说,肯定使用选上的,图-25

TI开发板使用的I2C扩展芯片,我们不需要,所以External就不要了,只选上“DavinciI2Cdriver”;图-26返回图-11进入“SPISupport”,如果你的板子没有外接SPI接口的芯片,这里可以不选;图-27返回图-11进入“GPIOSupport”,TI使用芯片扩展更多的GPIO脚,我们不需要,可以不选;图-28返回图-11进入“WatchdogTimerSupport”,凡是使用软件看门狗的,都需要选上这个,DM368和DM6446这些芯片都支持软件看门狗,注意选择是“Davinciwatchdog”;图-29返回图-11进入“Multimediasupport”,多媒体支持,这个就是Davinci的重点,图-30按TI默认的选择,MT9P031500万像素的SERSEOR可以选上,你有其他公司的SENSOR,也可以参考MT9P031的方法加入你SENSOR的驱动,然后修改linux-7\drivers\media\video里边的Makefile和Kconfig文件就OK了;图-31然后从图-30的“encoders/decodersandxxxx”进去选择TVP5146,高清Ypbpr输出THS7303,TH7353芯片的选择支持,我们公司使用TVP5158,本人把它加入内核编译,所以这里显示TVP5158,TVP7002我们没有使用,所以不用选;图-32返回图-11进入“GraphicsSuppor”,这个就是选择支持TFT3.5,TFT4.3寸LCD屏的驱动,也就是通过RGB接口支持屏的输出,我板子不支持,可以选择也可以按TI默认的设置;图-33返回图-11进入“SoundcardSuppor”,声卡选择,图-34DM368主芯片上带有音频功能的模块,直接按TI的设置,图-35返回图-11进入“USBSuppor”,我们把DM368跑的LINUX系统当作HOST来使用,“HIDSupport”是支持鼠标键盘之类的东西,可以选也可以不要;基本上采用TI的默认配置图-36这里选择支持U盘,这个和前面说过的SCSISpport是对应的;图-37返回图-11进入“MMC/SD/SDIOSuppor”,linux-2.6.32的SD卡驱动完全支持32G的容量,DM368支持两个SD卡接口0和1,使用SD0基本不需要什么移植,使用SD1内核驱动注意使用SD1卡时,复用的GPIO脚就不需要了;图-38返回图-11进入“RealTimeClock”,DM368支持片上的RTC时钟,即“TIDavinciRTC”,我们自己的板子支持外部RTC时钟芯片PCF8563,根据外设选择;图-39返回图-5进入“Filesystems”,对需要支持的文件系统进行选择,选择EXT2/EXT3/EXT4文件系统是在断电对存储设备保护和日志恢复的情况下,比FAT32好多了,比如把SD卡格式化成EXT3/EXT4比FAT32更好用;图-40其他保留TI的配置,图-41进入“DOS/FAT/NT”文件系统的支持,按上面的选择,NTFS没有用过,不知在嵌入式是否好用,这里选择的目的是能够使用U盘等等存储设备;图-42进入“Pseudofilesystems”,保留TI的默认配置;图-43图-44进入“Miscellaneousfilesystems”,配置NANDFLASH支持的文件系统,YAFFS2的文件系统是本人下载然后按patch就行移植的,TI原来没有,选择YAFF2,JFFS2,还有cramfs,SquashFS,UBI文件系统目前没有验证,有时间再试试,刚才提到的都是最常用的嵌入式NAND文件系统,就是要烧进NANDFLASH的;图-45图-45就是NFS文件系统的设置,我们在板子上运行的是NFSclient模式,即客户端,而开发环境是NFSSERVER端;里边的SMB(SAMBA)在板子上不需要支持,我们去掉不选;图-46图-46就是选择内核支持的语言;

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

psp/linux-7/dm368_20111227.config注意路径,凡是使用makedistclean和makelinux_clean命令后,.config不存在,这时我们就必须使用:#cppsp/linux-7/dm368_20111227.configpsp/linux-7/.config注意.config的“.”,这样整个内核配置基本结束;

四、分析和修改代码:

1、mach-davinci\board-dm365-evm.c这个是DM368内核移植重点的地方,系统初始化函数都在这里,而外部设备初始化在各自的驱动文件里;打开第156行#defineNAND_BLOCK_SIZE

SZ_128K同时屏蔽/*#defineNAND_BLOCK_SIZE

SZ_512K*/这个是4KNANDFLASH因为我们公司的板子都是使用2K的NAND

FLASH,512字节的NAND不适合新的文件系统,慢慢会被淘汰;

修改NANDFLASH的分区,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个BLOCK出现坏块的几率非常小,在产品中一般很少去维护更新UBL,所以没有把UBL单独分一个分区;而其他空间出现坏块的几率比较大,所以给U-BOOT分3~4个BLOCK够用了,内核分5M-BYTE也够用,而U-BOOT参数分1~2个BLOCK,本公司直接放到0x60000~0x80000的空间也可以,没有规定;后面的文件系统分区就根据你裁剪的文件系统、文件系统的类型进行大小分区;

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),

},};上面这个结构就是看看你的I2C总线带什么样的设备,根据你的I2C设备地址,添加到这里,这样才能调用到设备初始化函数;从上面的修改看出,我们的板子不需要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}上面的函数修改:我们不需要CPLD,所以屏蔽掉,我们直接使用GPIO控制MT9P031SENSOR的复位和STANDBY信号;

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开发板同时支持TVP5146、TVP7002、MT9P031;TVP5146代表标清复合视频输入采集芯片(D1格式),TVP7002代表复合视频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;}上面的函数去掉CPLD的东西,这个视频采集芯片的选择是和U-BOOT的参数一一对应的,在U-BOOTbootargs的参数里,加入davinci_capture.device_type=0表示使用TVP5146采集,davinci_capture.device_type=1表示使用MT9P031采集,davinci_capture.device_type=2表示使用TVP7002采集,内核读取U-BOOT的参数,会在初始化确定是否调用什么样的采集芯片驱动;所以我们在内核配置的时候,可以同时选上三种芯片;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));}这个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*/}上面的函数很重要,除去掉CPLD的东西外,一定要把

platform_add_devices(dm365_evm_nand_devices,

ARRAY_SIZE(dm365_evm_nand_devices));保留,否则你的内核启动的时候,根本没有NAND的驱动和分区显示;dm365evm_emac_configure();也肯定要的,否则没有网络驱动叫LINUX吗?TI就是通过CPLD来控制一些外设,CPLD比较贵,不适合低成本大批量生产,所以我们去掉了;

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();}这个函数就是对MMC/SD、USB、等接口进行初始化了,tsc2004这个是触摸屏的芯片,dm365evm_gpio_configure()里边我们添加了很多GPIO的初始值定义;

2、修改mach-davinci\dm365.c

这个要和arch\arm\mach-davinci\include\mach\mux.h配合看,好好看看structmux_configdm365_pins这个定义,这个DM368的管脚复用非常复杂,使能某个功能,那么对应的另外的功能就不能用了,因此要非常小心对待,特别是和GPIO复用;

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

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

重点介绍:drivers\media\video\里有V4L2的接口

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论