有没有做卡哇伊的企业网站,北京pk10盘制作网站建设,中文网站建设翻译成英文是什么意思,推广网站的软文一、介绍linux-2.6.32#xff1a; Linux-2.6.32的网上介绍#xff1a;增添了虚拟化内存 de-duplicacion、重写了 writeback 代码、改进了 Btrfs 文件系统、添加了 ATI R600/R700 3D 和 KMS 支持、CFQ 低传输延迟时间模式、perf timechart 工具、内存控制器支持 soft limits、… 一、介绍linux-2.6.32 Linux-2.6.32的网上介绍增添了虚拟化内存 de-duplicacion、重写了 writeback 代码、改进了 Btrfs 文件系统、添加了 ATI R600/R700 3D 和 KMS 支持、CFQ 低传输延迟时间模式、perf timechart 工具、内存控制器支持 soft limits、支持 SCore 架构、支持 Intel Moorestown 及其新的固件接口、支持运行时电源管理、以及新的驱动这些本人不懂但是本人只注意到常用的LINUX操作系统RADHAT Enterprise 6ubuntu-10.04debian 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 linuxmake linux_config make linux_clean等命令编译内核 二、开始移植从删除多余的文件夹和文件开始 先看删除前后的源码大小对比当然还有些可以接着删。 1进入文件夹linux-2.6.32.17-psp03.01.01.39\arch\arm\configs只保留davinci_dm365_defconfig。 2删除非ARM芯片平台的处理器 进入dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch保留armumx86三个文件夹其他文件删除掉 进入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文件夹和几个文件其他文件夹删除掉 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/Makefile 从第120行开始#machine-$(CONFIG_ARCH_AAEC2000) : aaec2000 一直到172行#machine-$(CONFIG_ARCH_MXC91231) : mxc91231 只保留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给屏蔽掉 三、开始从内核配置 使用make linux_config命令这样就看到熟悉的内核配置界面。 图-5 我们按顺序一个一个配置当然很多配置选项都是使用TI davinci_dm365_defconfig配置好的我们对它们进行分析、裁剪、修改 进入“General setup”配置 图-6 上图是我们多选了RAM disk文件系统支持的压缩方式默认是使用gzip生产RAM DISK文件系统你也可以使用bzip2和LZMA压缩率比前面两个高 图-7 进入“System Type”配置上面按TI 原来的配置 图-8 然后直接进入“TI Davinci Implementations”按上面的选择最后面的27000000表示你的主芯片晶振是27MHz还是24MHz本公司的是24MHz晶振我们就把27000000改成24000000 图-9 返回图-5进入“Networking support”你的系统如果没有WIFI等无线模块这个无线的“wireless”协议可以不选 图-10 主要对“Networking options”进行配置这里基本上就是IPV4和IPV6的协议配置我们按TI原来的选择带“M”选项也可以使用“*”编译进内核而不是模块 图-11 图-12 返回图-5进入“Device Drivers”这是配置内核的重点见图-11和图-12 图-13 按顺序先对NAND FLASH分区MTD进行配置直接参考TI 默认的配置 图-14 图-14 RAM/ROM/FLASH及下面3个使用TI默认的配置 图-15 进入“NAND device Support”的配置一定要选择“Support NAND on Davinci SoC” 图-16 这是2.6.32新的特性开始支持UBI文件系统UBI文件系统的出现可以让JFFS2YAFFS2退出市场跑android系统必须用到这里我们可以不选也可以选根据你的板子要使用什么样的文件系统 图-17 返回图-11进入“Block devices”配置我们直接使用TI的配置 图-18 返回图-11进入“SCSI device support”的配置选择这个来支持U盘否则你的U盘无法被DM368板子识别我们一般把DM368 USB设置HOST模式 图-19 返回图-11进入“Network device support”的配置一般的RJ45网口选择“10M or 100Mbit”DM368不支持1000Mbit无线“Wireless LAN”你不需要的话可以不选“PPP”这个可以不选而有时要支持3G的模块的时候PPP协议见图-10的配置和设备支持要选择 图-20 进入“10M or 100Mbit”选择“TI Davinci EMAC Support 图-21 返回图-11进入“Input device support”这选择是否支持鼠标键盘触摸屏等输入我们这边用不上直接不选 图-22 返回图-11进入“Char device”一定要选择DM365 IPIPEIMP PreviewerIMP Resizer这个到时候调试视频采集程序需要用到Previewer、Resizer等DAVINCI技术 图-23 在图-22中选择进入“Serial driver”这里就是DM368的串口配置了DM368支持UART0 和UART1UART1和其他GPIO复用小心分配使用硬件资源和DM6446一样都是8250的驱动,而DM6446可以配置3个UART 图-24 返回图-11进入“I2C Support”这个没得说肯定使用选上的 图-25 TI开发板使用的I2C扩展芯片我们不需要所以External就不要了只选上“Davinci I2C driver” 图-26 返回图-11进入“SPI Support”如果你的板子没有外接SPI接口的芯片这里可以不选 图-27 返回图-11进入“GPIO Support”TI使用芯片扩展更多的GPIO脚我们不需要可以不选 图-28 返回图-11进入“Watchdog Timer Support”凡是使用软件看门狗的都需要选上这个DM368和DM6446这些芯片都支持软件看门狗注意选择是“Davinci watchdog” 图-29 返回图-11进入 “Multimedia support”多媒体支持这个就是Davinci的重点 图-30 按TI默认的选择MT9P031 500万像素的SERSEOR可以选上你有其他公司的SENSOR也可以参考MT9P031的方法加入你SENSOR的驱动然后修改linux-2.6.32.17\drivers\media\video里边的Makefile和Kconfig文件就OK了 图-31 然后从图-30的“encoders/decoders and xxxx”进去选择TVP5146高清Ypbpr输出THS7303,TH7353芯片的选择支持我们公司使用TVP5158本人把它加入内核编译所以这里显示TVP5158TVP7002我们没有使用所以不用选 图-32 返回图-11进入“Graphics Suppor”这个就是选择支持TFT3.5, TFT4.3寸LCD屏的驱动也就是通过RGB接口支持屏的输出我板子不支持可以选择也可以按TI默认的设置 图-33 返回图-11进入“Sound card Suppor”声卡选择 图-34 DM368主芯片上带有音频功能的模块直接按TI的设置 图-35 返回图-11进入“USB Suppor”我们把DM368跑的LINUX系统当作HOST来使用“HID Support”是支持鼠标键盘之类的东西可以选也可以不要基本上采用TI的默认配置 图-36 这里选择支持U盘这个和前面说过的SCSI Spport是对应的 图-37 返回图-11进入“MMC/SD/SDIO Suppor”linux-2.6.32的SD卡驱动完全支持32G的容量DM368支持两个SD卡接口0和1使用SD0基本不需要什么移植使用SD1内核驱动注意使用SD1卡时复用的GPIO脚就不需要了 图-38 返回图-11进入“Real Time Clock”DM368支持片上的RTC时钟即“TI Davinci RTC”我们自己的板子支持外部RTC时钟芯片PCF8563根据外设选择 图-39 返回图-5进入“File systems”对需要支持的文件系统进行选择,选择EXT2/EXT3/EXT4文件系统是在断电对存储设备保护和日志恢复的情况下比FAT32好多了比如把SD卡格式化成EXT3/EXT4比FAT32更好用 图-40 其他保留TI的配置 图-41 进入“DOS/FAT/NT”文件系统的支持按上面的选择NTFS没有用过不知在嵌入式是否好用这里选择的目的是能够使用U盘等等存储设备 图-42 进入“Pseudo filesystems”保留TI的默认配置 图-43 图-44 进入“Miscellaneous filesystems”配置NAND FLASH支持的文件系统YAFFS2的文件系统是本人下载然后按patch就行移植的TI原来没有选择YAFF2JFFS2还有cramfsSquashFSUBI文件系统目前没有验证有时间再试试刚才提到的都是最常用的嵌入式NAND文件系统就是要烧进NAND FLASH的 图-45 图-45就是NFS文件系统的设置我们在板子上运行的是NFS client模式即客户端而开发环境是NFS SERVER端里边的SMBSAMBA在板子上不需要支持我们去掉不选 图-46 图-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的NAND FLASH512字节的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_4MSZ_512K,.mask_flags 0,}, {.name basefs,.offset 0x100000SZ_4MSZ_512K,.size SZ_32M-SZ_4M,.mask_flags 0,/* tongye:28M-byte for ramdisk,cramfs,squashfs rootfs*/}, {.name userfs,.offset 0x100000SZ_32MSZ_512K,.size SZ_64MSZ_16M,.mask_flags 0,/*tongye:80M-byte for jffs2,yaffs2 rootfs*/}, {.name userdata,.offset SZ_64MSZ_32MSZ_16MSZ_1MSZ_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 1davinci_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.hgpio_set_value(85,0);gpio_set_value(86,0);mdelay(25);gpio_set_value(85,1);gpio_set_value(86,1);mdelay(25);#elsedavinci_cfg_reg(DM365_GPIO40);gpio_request(40, sensor_reset);if (rst)gpio_direction_output(40, 1);elsegpio_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、MT9P031TVP5146代表标清复合视频输入采集芯片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_type0表示使用TVP5146采集davinci_capture.device_type1表示使用MT9P031采集davinci_capture.device_type2表示使用TVP7002采集内核读取U-BOOT的参数会在初始化确定是否调用什么样的采集芯片驱动所以我们在内核配置的时候可以同时选上三种芯片 static void __init evm_init_i2c(void)
{davinci_init_i2c(i2c_pdata);
#if 0if (have_imager())i2c_add_driver(pca9543a_driver);
#endifi2c_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 0if (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: cant 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);
#elseplatform_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 hereevm_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.ctvp514x.ctvp7002.c drivers\media\video\davinci\里东西就很多了dm365_ccdc.c、vpfe_capture.c drivers\net\里有davinci_emac.c drivers\usb\musb\里davinci.c GPIO的使用一直没有搞清楚这个新内核为什么老是隔段时间对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/sh make linux chmod 777 /home/davinci/dm368/dvsdk_dm368_4_02_00_06/psp/linux-2.6.32.17/arch/arm/boot/uImage cp -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参数定义这里不啰嗦 大部分转自https://blog.csdn.net/kylin_fire_zeng/article/details/42082343 转载于:https://www.cnblogs.com/xdyixia/p/9250753.html