DAVINCI DM365-DM368开发攻略——linux-2.6.32的移植推荐

2012年的春节就这样过了,假期期间,在接到的大项目没有进展的情况下(团队的人都回家过年了),利用这三天深圳最冷的时间(5 C):1月25~27号,赶紧完成这篇文章的稿子,毕竟很长时间没有更新博客了,后面一上班就得忙几个客户的大项目;在这里也顺便纪念一下去年故去的C语言之父 丹尼斯 里奇,也是操作系统Unix之父,是他让嵌入式发展如此迅猛,科技发展如此飞速,C语言是如此美丽,简洁,大大提高软件跨主芯片平台的移植,他劳苦功高,本人决定本篇文章不使用 。 ,直接使用 ; ,和很多网友一样,用 ; 代表C语言的一行指令的结束,以表达对他的缅怀;一、介绍linux-2.6.32: Linux-2.6.32的网上介绍:增添了虚拟化内存 de-duplicacion、重写了 writeback 代码、改进了 Btrfs 文件系统、添加了 ATI R600/R700 3D 和 KMS 支持、CFQ 低传输延迟时间模式、perf timechart 工具、内存控制器支持 soft limits、支持 S+Core 架构、支持 Intel Moorestown 及其新的固件接口、支持运行时电源管理、以及新的驱动;这些本人不懂,但是本人只注意到常用的LINUX操作系统RADHAT Enterprise 6,ubuntu-10.04,debian 6.0稳定版本,这些都是使用linux-2.6.32这个版本,智能手机就更多了,android手机(经典版本HTC-G7手机使用linux-2.6.32.15和android 2.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-2.6.32.17很明显我们把内核名字改成linux-2.6.32.17,原来解压安装出来的名字太长了,所以要在Rules.make第45行改一下;Makefile是编译的脚本,TI把整个DVSDK4.02的开发环境统一整合在一起,体现在这个Makefile,看完这个Makefile,就应该知道如何编译整个DVSDK里所有的软件包,内核编译的命令见143行开始;在dvsdk_dm368_4_02_00_06\目录下使用make linux,make linux_config, make linux_clean等命令编译内核;二、开始移植:从删除多余的文件夹和文件开始:1、dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm/configs只保留davinci_dm365_defconfig

然后按上图-1,先使用默认的config文件进行内核配置,cp arch/arm/configs/davinci_dm365_defconfig .config注意路径;2、删除非ARM芯片平台的处理器 进入dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch,保留arm,um,x86三个文件夹,其他文件删除掉;然后进入dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/um文件夹,只保留scripts文件夹,其他删除掉,包括那几个文件Kconfig等文件也删除掉;继续进入dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/x86文件夹,只保留include和mm文件夹,和几个文件,其他文件夹删除掉见下图-2:

继续进入dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm文件夹,保留mach-davinci文件夹和保留下图的文件夹和文件,其他带mach-删除吧,占空间,又占备份时压缩的时间,

上图-3就是dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm目录下删除后的结果显示;3、修改dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/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-2.6.32.17/arch/arm/Kconfig 从第707行开始,一直到793行,这些全部使用 # 给屏蔽掉,保留第795行的source arch/arm/mach-davinci/Kconfig ,然后继续把第797到805行使用 # 给屏蔽掉;经过上面的删除,使用tar jcf 或 tar zcf压缩的linux-2.6.32.17降到51M,比没有删除的减小近一半的大小;我们追求简洁,思路清晰;其实还有很多地方可以删除的,大家慢慢体会,包括include,driver里边的老掉牙的设备,这里就不啰嗦了;删除后记得把对应的Kconfig和Makefile给屏蔽掉;三、开始从内核配置

因为前面已经做了cp arch/arm/configs/davinci_dm365_defconfig .config我们按上图指定的路径使用make linux_config,这样就看到熟悉的内核配置界面,见下图-5:

我们按顺序一个一个配置,当然,很多配置选项都是使用TI davinci_dm365_defconfig配置好的,我们对它们进行分析、裁剪、修改,进入 General setup 配置

上图是我们多选了RAM disk文件系统支持的压缩方式,默认是使用gzip生产RAM DISK文件系统,你也可以使用bzip2和LZMA(压缩率比前面两个高);

进入 System Type 配置,上面按TI 原来的配置,

然后直接进入 TI Davinci Implementations ,按上面的选择,最后面的27000000表示你的主芯片晶振是27MHz还是24MHz,本公司的是24MHz晶振,我们就把27000000改成24000000;

返回图-5,进入 Networking support ,你的系统如果没有WIFI等无线模块,这个无线的 wireless 协议可以不选;

主要对 Networking options 进行配置,这里基本上就是IPV4和IPV6的协议配置,我们按TI原来的选择,带 M 选项也可以使用 * 编译进内核,而不是模块;

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

按顺序先对NAND FLASH分区MTD进行配置,直接参考TI 默认的配置;

图-14 RAM/ROM/FLASH及下面3个使用TI默认的配置,

进入 NAND device Support 的配置,一定要选择 Support NAND on Davinci SoC ,

这是2.6.32新的特性,开始支持UBI文件系统,UBI文件系统的出现,可以让JFFS2,YAFFS2退出市场,跑android系统,必须用到,这里我们可以不选,也可以选,根据你的板子要使用什么样的文件系统;

返回图-11进入 Block devices 配置,我们直接使用TI的配置,

返回图-11进入 SCSI device support 的配置,选择这个来支持U盘,否则你的U盘无法被DM368板子识别,我们一般把DM368 USB设置HOST模式;

返回图-11进入 Network device support 的配置,一般的RJ45网口选择 10M or 100Mbit ,DM368不支持1000Mbit,无线 Wireless LAN 你不需要的话可以不选; PPP 这个可以不选,而有时要支持3G的模块的时候,PPP协议(见图-10的配置)和设备支持要选择;

进入 10M or 100Mbit ,选择 TI Davinci EMAC Support;

返回图-11进入 Input device support ,这选择是否支持鼠标键盘触摸屏等输入,我们这边用不上,直接不选;

返回图-11进入 Char device ,一定要选择DM365 IPIPE,IMP Previewer,IMP Resizer,这个到时候调试视频采集程序需要用到Previewer、Resizer等DAVINCI技术;

在图-22中,选择进入 Serial driver ,这里就是DM368的串口配置了,DM368支持UART0 和UART1,UART1和其他GPIO复用,小心分配使用硬件资源,和DM6446一样,都是8250的驱动,而DM6446可以配置3个UART;

返回图-11进入 I2C Support ,这个没得说,肯定使用选上的,

TI开发板使用的I2C扩展芯片,我们不需要,所以External就不要了,只选上 Davinci I2C driver ;

返回图-11进入 SPI Support ,如果你的板子没有外接SPI接口的芯片,这里可以不选;

返回图-11进入 GPIO Support ,TI使用芯片扩展更多的GPIO脚,我们不需要,可以不选;

返回图-11进入 Watchdog Timer Support ,凡是使用软件看门狗的,都需要选上这个,DM368和DM6446这些芯片都支持软件看门狗,注意选择是 Davinci watchdog ;

返回图-11进入 Multimedia support ,多媒体支持,这个就是Davinci的重点,

按TI默认的选择,MT9P031 500万像素的SERSEOR可以选上,你有其他公司的SENSOR,也可以参考MT9P031的方法加入你SENSOR的驱动,然后修改linux-2.6.32.17\drivers\media\video里边的Makefile和Kconfig文件就OK了;

然后从图-30的 encoders/decoders and xxxx 进去选择TVP5146,高清Ypbpr输出THS7303,TH7353芯片的选择支持,我们公司使用TVP5158,本人把它加入内核编译,所以这里显示TVP5158,TVP7002我们没有使用,所以不用选;

返回图-11进入 Graphics Suppor ,这个就是选择支持TFT3.5, TFT4.3寸LCD屏的驱动,也就是通过RGB接口支持屏的输出,我板子不支持,可以选择也可以按TI默认的设置;

返回图-11进入 Sound card Suppor ,声卡选择,

DM368主芯片上带有音频功能的模块,直接按TI的设置,

返回图-11进入 USB Suppor ,我们把DM368跑的LINUX系统当作HOST来使用, HID Support 是支持鼠标键盘之类的东西,可以选也可以不要;基本上采用TI的默认配置

这里选择支持U盘,这个和前面说过的SCSI Spport是对应的;

返回图-11进入 MMC/SD/SDIO Suppor ,linux-2.6.32的SD卡驱动完全支持32G的容量,DM368支持两个SD卡接口0和1,使用SD0基本不需要什么移植,使用SD1内核驱动注意使用SD1卡时,复用的GPIO脚就不需要了;

返回图-11进入 Real Time Clock ,DM368支持片上的RTC时钟,即 TI Davinci RTC ,我们自己的板子支持外部RTC时钟芯片PCF8563,根据外设选择;

返回图-5进入 File systems ,对需要支持的文件系统进行选择,选择EXT2/EXT3/EXT4文件系统是在断电对存储设备保护和日志恢复的情况下,比FAT32好多了,比如把SD卡格式化成EXT3/EXT4比FAT32更好用;

其他保留TI的配置,

进入 DOS/FAT/NT 文件系统的支持,按上面的选择,NTFS没有用过,不知在嵌入式是否好用,这里选择的目的是能够使用U盘等等存储设备;

进入 Pseudo filesystems ,保留TI的默认配置;

进入 Miscellaneous filesystems ,配置NAND FLASH支持的文件系统,YAFFS2的文件系统是本人下载然后按patch就行移植的,TI原来没有,选择YAFF2,JFFS2,还有cramfs,SquashFS,UBI文件系统目前没有验证,有时间再试试,刚才提到的都是最常用的嵌入式NAND文件系统,就是要烧进NAND FLASH的;

图-45就是NFS文件系统的设置,我们在板子上运行的是NFS client模式,即客户端,而开发环境是NFS SERVER端;里边的SMB(SAMBA)在板子上不需要支持,我们去掉不选;

图-46就是选择内核支持的语言;然后备份配置:在dvsdk_dm368_4_02_00_06目录下#cp psp/linux-2.6.32.17/.config psp/linux-2.6.32.17/dm368_20111227.config注意路径,凡是使用make distclean和make linux_clean命令后,.config不存在,这时我们就必须使用:#cp psp/linux-2.6.32.17/dm368_20111227.config psp/linux-2.6.32.17/.config注意.config的 . ,这样整个内核配置基本结束;四、分析和修改代码:1、mach-davinci\board-dm365-evm.c这个是DM368内核移植重点的地方,系统初始化函数都在这里,而外部设备初始化在各自的驱动文件里;打开第156行 #define NAND_BLOCK_SIZE SZ_128K同时屏蔽/*#define NAND_BLOCK_SIZE SZ_512K*/ 这个是4K-PAGE NAND FLASH因为我们公司的板子都是使用2K-PAGE的NANDFLASH,512字节的NAND不适合新的文件系统,慢慢会被淘汰;修改NAND FLASH的分区,static struct mtd_partition davinci_nand_partitions[] = { { /* UBL (a few copies) plus U-Boot */ .name = bootloader , .offset = 0x80000, .size = 3 * NAND_BLOCK_SIZE, .mask_flags =0, /* tongye:.mask_flags = MTD_WRITEABLE, *//* force read-only */ }, { /* U-Boot environment */ .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-byte for ramdisk,cramfs,squashfs rootfs*/ }, { .name = userfs , .offset = 0x100000+SZ_32M+SZ_512K, .size = SZ_64M+SZ_16M, .mask_flags = 0, /*tongye:80M-byte for jffs2,yaffs2 rootfs*/ }, { .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, } /* two blocks with bad block table (and mirror) at the end */UBL的代码放在0x20000~0x40000的位置,一般NAND FLASH前面5个BLOCK出现坏块的几率非常小,在产品中一般很少去维护更新UBL,所以没有把UBL单独分一个分区;而其他空间出现坏块的几率比较大,所以给U-BOOT分3~4个BLOCK够用了,内核分5M-BYTE也够用,而U-BOOT参数分1~2个BLOCK,本公司直接放到0x60000~0x80000的空间也可以,没有规定;后面的文件系统分区就根据你裁剪的文件系统、文件系统的类型进行大小分区;static struct i2c_board_info i2c_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芯片,可以干掉;static void dm365evm_reset_imager(int rst) u8 val;//tongye#if 0 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)); /* Reset bit6 of CPLD_IMG_DIR2 */ val = __raw_readb(cpld + CPLD_IMG_DIR2) ~BIT(6); __raw_writeb(val, (cpld + CPLD_IMG_DIR2)); /* Set bit5 of CPLD_IMG_MUX5 */ val = __raw_readb(cpld + CPLD_IMG_MUX5) | BIT(5); __raw_writeb(val, (cpld + CPLD_IMG_MUX5)); /* Reset bit 0 of CPLD_IMG_MUX5 */ val = __raw_readb(cpld + CPLD_IMG_MUX5) ~BIT(0); __raw_writeb(val, (cpld + CPLD_IMG_MUX5)); #endif /** * Configure GPIO40 to be output and high. This has dependency on MMC1 */#if 1 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控制MT9P031 SENSOR的复位和STANDBY信号;static struct vpfe_subdev_info vpfe_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), /* this is for PCLK rising edge */ .platform_data = (void *)1, }, }TI的DM368开发板同时支持TVP5146、TVP7002、MT9P031;TVP5146代表标清复合视频输入采集芯片(D1格式),TVP7002代表复合视频YPbPr的高清输入采集芯片,MT9P031代表500万像素的SENSOR采集;/* Set the input mux for TVP7002/TVP5146/MTxxxx sensors */static int dm365evm_setup_video_input(enum vpfe_subdev_id id) const char *label; u8 mux, resets;//Jingbo /////mux = __raw_readb(cpld + CPLD_MUX); ////mux = ~CPLD_VIDEO_INPUT_MUX_MASK; ////resets = __raw_readb(cpld + CPLD_RESETS); switch (id) { case VPFE_SUBDEV_TVP5146: mux |= CPLD_VIDEO_INPUT_MUX_TVP5146; resets = ~BIT(0); label = tvp5158 SD dm365evm_reset_imager(0); break; case VPFE_SUBDEV_MT9P031: mux |= CPLD_VIDEO_INPUT_MUX_IMAGER; resets |= BIT(0); /* Put TVP5146 in reset */ label = HD imager dm365evm_reset_imager(1); /* Switch on pca9543a i2c switch */ ////if (have_imager()) ////dm365evm_enable_pca9543a(1); break; case VPFE_SUBDEV_TVP7002: resets = ~BIT(2); mux |= CPLD_VIDEO_INPUT_MUX_TVP7002; label = tvp7002 HD break; default: return 0; } ////__raw_writeb(mux, cpld + CPLD_MUX); ////__raw_writeb(resets, cpld + CPLD_RESETS); pr_info( EVM: switch to %s video input\n , label); return 0;上面的函数去掉CPLD的东西,这个视频采集芯片的选择是和U-BOOT的参数一一对应的,在U-BOOT bootargs的参数里,加入davinci_capture.device_type=0表示使用TVP5146采集,davinci_capture.device_type=1表示使用MT9P031采集,davinci_capture.device_type=2表示使用TVP7002采集,内核读取U-BOOT的参数,会在初始化确定是否调用什么样的采集芯片驱动;所以我们在内核配置的时候,可以同时选上三种芯片;static void __init evm_init_i2c(void) davinci_init_i2c( i2c_pdata);#if 0 if (have_imager()) i2c_add_driver( pca9543a_driver);#endif i2c_register_board_info(1, i2c_info, ARRAY_SIZE(i2c_info));这个pca9543a I2C切换芯片我们不需要;static void __init evm_init_cpld(void) u8 mux, resets; const char *label; struct clk *aemif_clk; struct davinci_soc_info *soc_info = davinci_soc_info; /* Make sure we can configure the CPLD through CS1.Then * leave it on for later access to MMC and LED registers. */ aemif_clk = clk_get(NULL, aemif if (IS_ERR(aemif_clk)) return; clk_enable(aemif_clk);#if 0 if (request_mem_region(DM365_ASYNC_EMIF_DATA_CE1_BASE, SECTION_SIZE, cpld ) == NULL) goto fail; 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’t map CPLD\n clk_disable(aemif_clk); return; } /* External muxing for some signals */ mux = 0; /* Read CPLD version number */ soc_info- cpld_version = __raw_readb(cpld + CPLD_VERSION); /* Read SW5 to set up NAND + keypad _or_ OneNAND (sync read). * NOTE:SW4 bus width setting must match! */ if ((__raw_readb(cpld + CPLD_SWITCH) BIT(5)) == 0) { /* external keypad mux */ mux |= BIT(7); platform_add_devices(dm365_evm_nand_devices, ARRAY_SIZE(dm365_evm_nand_devices)); } else { /* no OneNAND support yet */ } /* Leave external chips in reset when unused. */ resets = BIT(3) | BIT(2) | BIT(1) | BIT(0); /* … and ENET … */ 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); /* … and AIC33 */ resets = ~BIT(1); /* Static video input config with SN74CBT16214 1-of-3 mux: *- port b1 == tvp7002 (mux lowbits == 1 or 6) *- port b2 == imager (mux lowbits == 2 or 7) *- port b3 == tvp5146 (mux lowbits == 5) * * Runtime switching could work too, with limitations. */ if (have_imager()) { label = HD imager mux |= CPLD_VIDEO_INPUT_MUX_IMAGER; /* externally mux MMC1 to imager */ mux |= BIT(6); dm365evm_reset_imager(1); } else { /* we can use MMC1 … */ dm365evm_mmc_configure(); davinci_setup_mmc(1, dm365evm_mmc_config); if (have_tvp7002()) { mux |= CPLD_VIDEO_INPUT_MUX_TVP7002; resets = ~BIT(2); label = tvp7002 HD } else { /* default to tvp5146 */ mux |= CPLD_VIDEO_INPUT_MUX_TVP5146; resets = ~BIT(0); label = tvp5158 SD 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)); /* … and ENET … */ 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: reset mt9p031 imager\n } //pr_info( EVM: %s video input\n , label);#endif /* REVISIT export switches: 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 __init void dm365_evm_init(void) dm365evm_gpio_configure(); //tongye:copy it here evm_init_i2c(); davinci_serial_init( uart_config); dm365evm_emac_configure(); dm365evm_usb_configure(); davinci_setup_mmc(0, dm365evm_mmc_config); /* maybe setup mmc1/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配合看,好好看看mux_config dm365_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的接口驱动;drivers\media\video\mt9p031.c,tvp514x.c,tvp7002.c;drivers\media\video\davinci\里东西就很多了,dm365_ccdc.c、vpfe_capture.cdrivers\net\里有davinci_emac.cdrivers\usb\musb\里davinci.cGPIO的使用,一直没有搞清楚这个新内核为什么老是隔段时间对U盘复位,和2.6.18不一样,搞得U盘一直成功列举设备,然后用重新复位分配新USB DEVIDE 地址;drivers\watchdog\里有davinci_wdt.c第32行#define DEFAULT_HEARTBEAT 2 //tongye removed 60s应用程序只有一使用open打开设备,WDG就生效,2秒钟不喂狗就软件复位;linux-2.6.32.17\sound\soc\codecs有tlv320aicxx.c等音频芯片驱动;linux-2.6.32.17sound\soc\davinci里有PCM、I2S等驱动;接显示屏drivers\video\davincifb.c,这个要和drivers\media\video\davinci\的vpbe_encoder.c、davinci_display.c、davinci_osd.c啊等等VPBE接口的文件对应;最后在dvsdk_dm368_4_02_00_06目录下加个编译脚本build_linux.sh:#!/bin/shmake linuxchmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm/boot/uImagecp -f /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm/boot/uImage /tftpboot/dm368_kernel.bin直接./ build_linux.sh,就可以在/tftpboot的目录下得到dm368_kernel.bin,在板子上,通过U-BOOT烧写内核,先调试通NFS,在上篇U-BOOT的移植文章介绍到U-BOOT的NFS参数定义,这里不啰嗦; 好了,linux-2.6.32移植就到此结束,基本上本人目前只调试通TVP5158 单路D1(720*576)图像采集和压缩,验证我们的核心板OK就行了,等软件工程师调试通1080p才发布新的开发板,因为DM368方案不是我们的开发重点;现在内核版本更新非常快,我们只需要挑稳定的版本来做产品,不要疯狂跟风,虽然TI已经推出linux-2.6.37的版本,但是做产品还是选定一个稳定而又比较新的版本;Linux-2.6.18有些落后了,但在中国,目前绝大部分公司还是使用dvsdk_2_10_01_18的版本,这里边使用的就是Linux-2.6.18的内核;这种局面是中国的通病,因为我们国家没有自己的主芯片(没错,说严重一点,空壳,跟那些空置率超过%70的房地产一样;将来过段时间,没有做为的话,估计连粮食的BT基因片段(转基因)都是人家控制的),很多东西都是被人家拖着鼻子走,人家技术发展很快,觉得这种升级很自然,而我们却觉得这种升级是跳跃,很多公司没精力去更新技术;就比如DM642,这个2005年就已经出来的大功耗+低扩展功能芯片,现在竟然还是TI在中国最多出货的图像处理芯片,很多公司根本不理你什么双核DM6446,OMAP3730,DM6467T,DM8168,CA8168,多核的C667X,他们觉得一个CCS3.X的版本就满足开发做产品了,懒得更新技术,哪怕DM6446性价比更高;时间不等人,不单单软件版本更新快,主芯片更新的速度也非常快,现在流行ARM Cortex-A8和ARM Cortex-A9,然后TI 推出ARM Cortex-A8+浮点DSP,高通公司QCOM推出更低功耗的ARM Cortex-A9+DSP(华为,中兴,HTC的新智能手机使用的主芯片)等等,三星也推出ARM Cortex-A9的主芯片,低功耗+丰富功能是主流; 前面说过DM368不是我们的开发重点,我们更关心那些更强大功能的ARM+DSP的芯片,因为那些芯片才适合做出创新的产品;现在国内高级一点的公司就是自己做ARM+FPGA的方案,因为FPGA无外乎就是Xilinx(赛灵思,或赛玲丝,搞笑一点)为代表的SoPC;更高级的公司比如华为海思(华为是母公司,台湾海思被收购),做自己ARM方案芯片,在海思流片,现在满大街的中低端安防产品(DVR,IP-CAMERA,DVS等等)都是华为海思Hi35XX芯片,由于这种芯片做不了智能图像分析,机器视觉产品,所以我们也没有去开发,等有机会和资本再去玩玩,毕竟华为海思的芯片也在不断升级;龙芯的MIPS架构就不要提了,直接让意法半导体流片了(本来想说流X的,算了,我们反正都被忽悠和被折腾麻木了),人家意法半导体那%5专利的MIPS指令是无法逾越的,还有,我们根本没有高精度的机床,高级的半导体加工技术; 2012注定是不平凡的一年,因为大经济环境更恶劣了,欧洲最先出大问题,中国的危机来了,危机时期最好用来做内功,而不是挥刀自宫,NB的人把 危 当作 机 ,NC的人注定随波逐流,没有危机意识,没有思想,也不敢想,更不要谈去做了;而好大喜功的折腾,注定跌进深渊;科技在发展,世界在发展,而现在还出现一大批要返回过去时代的人,这真的是无药可救了;还有更搞笑的菜刀实名制,这又是一个荒唐的极端;都是倒退; 啰嗦的话就不多说了,网友觉得linux-2.6.32移植对你有参考价值,就帮忙顶一下;还有那些转载的朋友不要把文章开始的51cto的信息给去掉,本人发觉某个TI中文网站收录的本人的几篇文章放到他们论坛去,就去掉本人的博客信息,太不够职业道德了; 接受失败也等于给了自己从零开始的机会,

DAVINCI DM365-DM368开发攻略——linux-2.6.32的移植推荐

相关文章:

你感兴趣的文章:

标签云: