dm365.c、devices.c等文件的总结
来源:互联网 发布:微商城 源码 开源 编辑:程序博客网 时间:2024/05/24 00:56
总的来讲,主要是这几个文件(有关于I2C部分的):
board-dm365-evm.c、dm365.c、devices.c、i2c.h、i2c-davinci.c、davinci.h、i2c-core.h
这里分析带红色的三个文件
1、davinci.h(arch\arm\mach-davinci):
Davinci.h位于arch\arm\mach-davinci中:
#define DAVINCI_SYSTEM_MODULE_BASE 0x01c40000
定义davinci系统模块system module基址
#define SYSMOD_VIDCLKCTL 0x38
#define SYSMOD_VPSS_CLKCTL 0x44
#define SYSMOD_VDD3P3VPWDN 0x48
#define SYSMOD_VSCLKDIS 0x6c
#define SYSMOD_PUPDCTL1 0x7c
这里是定义了几个掩码,是与system module相关的一些寄存器。用基址加上这些掩码即可得到相应的寄存器。可参考datasheet:
如:0x01c40038是MISC控制寄存器(混杂控制)
0x01c40044是VPSS_CLK_CTL:VPSS Clock Mux Control
0x01c40048是PERI_CLKCTL:Peripheral Clock Control
0x01c4006c是DEBOUNCE7:Debounce for GIO7 input
0x01c4007c是PUPDCTL1:IO cell pullup/down on/off control#1
extern void __iomem *davinci_sysmod_base;
这句话在devices.c中也做了声明,定义了一个全局变量
#define DAVINCI_SYSMOD_VIRT(x)(davinci_sysmod_base + (x))
这个宏定义主要是获得寄存器的虚拟地址
/* DM365 base addresses */
#define DM365_ASYNC_EMIF_CONTROL_BASE 0x01d10000
ASYNC EMIF Control的基址:size 4K
#define DM365_ASYNC_EMIF_DATA_CE0_BASE 0x02000000
ASYNC EMIF Data(CE0)的基址:size 32M
#define DM365_ASYNC_EMIF_DATA_CE1_BASE 0x04000000
ASYNC EMIF Data(CE1)的基址:size 32M
/* DM365 function declarations */
void __init dm365_init(void);
void __init dm365_init_asp(struct snd_platform_data *pdata);
void __init dm365_init_vc(struct snd_platform_data *pdata);
void __init dm365_init_ks(struct davinci_ks_platform_data *pdata);
void __init dm365_init_rtc(void);
void dm365_init_spi0(unsigned chipselect_mask,
const struct spi_board_info *info, unsigned len);
void dm365_set_vpfe_config(struct vpfe_config *cfg);
这几个函数的声明都是在DM365.c中
2、dm365.c(arch\arm\mach-davinci\):
在这个文件的注释中写道:TI DaVinci DM365 chip specific setup。这个文件主要是一些函数的定义,像之前davinci.c文件中关于dm365的部分就是在这里实现的。
#define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
这个定义了dm365的参考频率,参照datasheet,dm365可选频率为:19.2M、24M、27M、36MHz等几种。参照原理图,我们这里使用的也是24M。
#define DM365_KEYSCAN_BASE 0x01c69400
#define DM365_RTC_BASE 0x01c69000
#define DAVINCI_DM365_VC_BASE 0x01d0c000
这里定义了几个基址,Key Scan、RTC、Video Codec。
#define DM365_EMAC_BASE 0x01d07000
这个定义了EMAC Control Register的基址。
#define DM365_EMAC_MDIO_BASE (DM365_EMAC_BASE + 0x4000)
EMAC MDIO Control Register的基址
#define DM365_EMAC_CNTRL_OFFSET 0x0000
EMAC控制寄存器的偏移。
#define DM365_EMAC_CNTRL_MOD_OFFSET 0x3000
EMAC模式寄存器的偏移。用DM_365_EMAC_BASE+0x3000正好得到EMAC Control Module Register的基址。
#define DM365_EMAC_CNTRL_RAM_OFFSET 0x1000
EMAC Control Module RAM的偏移,用DM_365_EMAC_BASE+0x1000正好得到这个的基址。
#define DM365_EMAC_CNTRL_RAM_SIZE 0x2000
这个0x2000正好是8K,而DM365 Control Module RAM的size正好是8K。
在arch\arm\mach-davinci\clock.h中定义了PLL的偏移地址:
#define DAVINCI_PLL1_BASE 0x01c40800
#define DAVINCI_PLL2_BASE 0x01c40c00
这里的基址可以参考datasheet。
剩下的定义了一系列的结构体struct clk。这个dm365.c中定义了各种时钟。
这尼玛还能写下去?我这搞的紧张死了啊!求老师请虐啊,求老师放低要求啊。阿弥陀佛!
中间搞了一大堆关于时钟的东西,看的不懂,一拉到底,从spi开始分析吧。
与I2C类似,这里spi也是定义了dm365_spi0_resources[]资源,然后定义一个platform device。
函数dm365_init_spi0初始化spi0。
下面是定义EMAC资源,定义MDIO资源,EDMA、McBSP、Video Codec、RTC、Key Scan、UART等等。
然后调用一系列带有后缀init的初始化函数。
3、devices.c(arch\arm\mach-davinci\):
这个文件至于davinci系列有关:dm355、dm365等等都是通用的。
Devices.c文件作用,在文件注释中:DaVinci platform device setup/initialization主要是关于平台设备的初始化以及设置等等。
#define DAVINCI_I2C_BASE 0x01C21000
#define DAVINCI_ATA_BASE 0x01C66000
#define DAVINCI_MMCSD0_BASE 0x01E10000
#define DM365_MMCSD0_BASE 0x01D11000
#define DM365_MMCSD1_BASE 0x01D00000
这里定义了davinci几个基址,如I2C基址,MMC卡基址等
DAVINCI_ATA_BASE这个基址在datasheet中是定义的SPI0,这里写了ATA,不知道是为什么。
void __iomem *davinci_sysmod_base;
这句在davinci.h中声明了extern,定义了一个全局变量
davinci_map_sysmod函数:
这个函数里面调用了ioremap_nocache函数和BUG_ON宏。
ioremap_nocache函数的作用是:把内存映射到CPU空间,返回值为线性地址,函数原型:
void __iomem *ioremap_nocache(unsigned long phys_addr, unsigned long size);
phys_addr 是要映射的物理地址,size是要映射的资源的大小。
参考文档:http://www.cnblogs.com/dodo-bear/archive/2011/05/04/dodo.html
函数中有这句:
davinci_sysmod_base = ioremap_nocache(DAVINCI_SYSTEM_MODULE_BASE, 0x800);
这里size是0x800,即为2K,查阅datasheet可知:system module为2K。
BUG_ON是作为内核调试用的,方便标记bug,具体参阅文档:
http://hi.baidu.com/weizhiyuan420/item/a75aef3fb50176fedf2221de这个这里不用管。
static struct resource i2c_resources[] = {
{
.start = DAVINCI_I2C_BASE,
.end = DAVINCI_I2C_BASE + 0x40,
.flags = IORESOURCE_MEM,
},
{
.start = IRQ_I2C,
.flags = IORESOURCE_IRQ,
},
};
这里定义了资源,至于为什么end是加上0x40,这里我不是很清楚。
IORESOURCE_MEM和IORESOURCE_IRQ的定义在include\linux\ioport.h中,分别为:
#define IORESOURCE_MEM 0x00000200
#define IORESOURCE_IRQ 0x00000400
参考文档:http://linux.chinaunix.net/techdoc/net/2008/08/24/1027504.shtml
当flags为IORESOURCE_MEM时,start、end分别表示该platform_device占据的内存的开始地址和结束地址;当flags为IORESOURCE_IRQ时,start、end分别表示该platform_device使用的中断号的开始值和结束值,如果只使用了1个中断号,开始和结束值相同
参考文档:http://www.linuxidc.com/Linux/2011-01/31291.htm
IRQ_I2C是I2C IRQ中断号,是一个数字,在arch\arm\mach-davinci\include\mach\irqs.h文件中,将其定义为39。
static struct platform_device davinci_i2c_device = {
.name = "i2c_davinci",
.id = 1,
.num_resources = ARRAY_SIZE(i2c_resources),
.resource = i2c_resources,
};
这里定义了名为i2c-davinci的platform_device。
davinci_init_i2c函数,这个函数是在board-dm365-evm.c中调用的,评估板初始化I2C时调用这个函数,具体分析可参见:i2c总结.doc,主要是注册platform-device。
其他还有一部分带有ide后缀的是硬盘ide驱动,davinci_init_ide函数是注册ide平台设备。而带有mmc后缀的话是MMC卡驱动,davinci_setup_mmc函数是设置mmc。
wdt_resources资源是看门狗资源,davinci_restart是复位看门狗,内部区调用了davinci_watchdog_reset函数,davinci_init_wdt是初始化看门狗,注册为平台设备。
davinci_init_pcm是初始化pcm,好像是与audio有关。
davinci_timer_instance[2]是定义定时器,其中有些基址是定义在arch\arm\mach-davinci\ include\mach\time.h头文件中。
davinci_init_devices函数是在内部调用了pcm初始化和看门狗初始化函数。
最后调用arch_initcall这个函数,跟subsys_initcall好像有点像,不是很懂,有文档参考:
http://blog.csdn.net/thl789/article/details/6581146
- dm365.c、devices.c等文件的总结
- C语言文件总结
- C语言的数组、字符串等一些知识总结
- C++builder的文件读写操作总结
- C语言的文件读取操作总结
- 【归纳总结】标C的文件操作
- C/C++文件编辑的总结
- c++/c的文件读入和字符串读入总结
- c语言第一天 终端的使用 .c .o .out 文件的解释 快捷键等
- 《Effective C++》关于const,define等总结
- C/C++/Python等 使用二进制模式打开文件与不使用二进制模式的区别
- 文件操作总结-- 基于C的文件操作
- C++`构造函数 `头文件`等
- C#_WinForm_打开一个进程、文件等.
- (英文)关于Unity3d c#和.a\.o\.so等native库文件的交互,库文件可以由c\c++\object-c等编译
- C++。。等我的蜕变。。
- 【C】strtok等的使用方法
- C#文件路径操作总结
- ubuntu搭建LAMP环境
- 查找进程pid号,然后将该进程关闭
- sed、awk使用
- linux 中警告:文件未以空白行结束
- C语言相关
- dm365.c、devices.c等文件的总结
- thttpd的文件上传
- oralce逗号分割变多行
- 浅谈工作中使用过的几种C++界面库
- 编程基础(1)
- 三极管的主要参数
- c语言变量定义
- Ubuntu APT常用命令参数
- Android中各种动画的使用