dm365.c、devices.c等文件的总结

来源:互联网 发布:微商城 源码 开源 编辑:程序博客网 时间:2024/05/24 00:56

总的来讲,主要是这几个文件(有关于I2C部分的):

board-dm365-evm.cdm365.cdevices.ci2c.hi2c-davinci.cdavinci.hi2c-core.h

这里分析带红色的三个文件

 

1davinci.harch\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

如:0x01c40038MISC控制寄存器(混杂控制)

0x01c40044VPSS_CLK_CTLVPSS Clock Mux Control

0x01c40048PERI_CLKCTLPeripheral Clock Control

0x01c4006cDEBOUNCE7Debounce for GIO7 input

0x01c4007cPUPDCTL1IO 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 DataCE0)的基址:size 32M

#define DM365_ASYNC_EMIF_DATA_CE1_BASE   0x04000000

ASYNC EMIF DataCE1)的基址: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

 

 

2dm365.carch\arm\mach-davinci\:

在这个文件的注释中写道:TI DaVinci DM365 chip specific setup。这个文件主要是一些函数的定义,像之前davinci.c文件中关于dm365的部分就是在这里实现的。

 

#define DM365_REF_FREQ        24000000       /* 24 MHz on the DM365 EVM */

这个定义了dm365的参考频率,参照datasheetdm365可选频率为:19.2M24M27M36MHz等几种。参照原理图,我们这里使用的也是24M

 

#define DM365_KEYSCAN_BASE             0x01c69400

#define DM365_RTC_BASE               0x01c69000

#define DAVINCI_DM365_VC_BASE        0x01d0c000

这里定义了几个基址,Key ScanRTCVideo 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 RAMsize正好是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资源,EDMAMcBSPVideo CodecRTCKey ScanUART等等。

然后调用一系列带有后缀init的初始化函数。

 

 

3devices.carch\arm\mach-davinci\):

这个文件至于davinci系列有关:dm355dm365等等都是通用的。

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

这里size0x800,即为2K,查阅datasheet可知:system module2K

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_MEMIORESOURCE_IRQ的定义在include\linux\ioport.h中,分别为:

#define IORESOURCE_MEM              0x00000200

#define IORESOURCE_IRQ         0x00000400

 

参考文档:http://linux.chinaunix.net/techdoc/net/2008/08/24/1027504.shtml

flagsIORESOURCE_MEM时,startend分别表示该platform_device占据的内存的开始地址和结束地址;当flagsIORESOURCE_IRQ时,startend分别表示该platform_device使用的中断号的开始值和结束值,如果只使用了1个中断号,开始和结束值相同

参考文档:http://www.linuxidc.com/Linux/2011-01/31291.htm

 

IRQ_I2CI2C 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-davinciplatform_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

 

 

 

原创粉丝点击