和菜鸟一起学OK6410之熟悉内核源码

       今天还是挺顺利的,这周的工作两天就搞定了,其实有点小简单。确实,我们都需要信心。总觉得,网线是个可恶的东西,老是懒懒的刷着网页也不干点实事,让自己进步也慢了好几拍。所以还是把网线直接接到开发板上去了,哈哈,那样就可以不上网,好好玩小o了。

       前几天终于把以前留下的tftp下载内核和nfs挂载文件系统给搞定了,接下来开始直接拿linux2.6.28那个内核玩了,公司里所有的寄存器啊,platform啊什么的放在哪里都有同事告诉我了,而这个板子的那些个东东在哪里还不是很清楚,那就找找吧,用grep小搜了一把,终于找到了,下面贴一下,以后学习就可以不忘记了。

       对于小oplatformc文件是放在arch/arm/mach-s3c6410/mach-smdk6410.c

代码600多行,就只拿些主要的注册device的代码了。

 

static struct platform_device *smdk6410_devices[] __initdata = {

#ifdef CONFIG_SMDK6410_SD_CH0

       &s3c_device_hsmmc0,

#endif

#ifdef CONFIG_SMDK6410_SD_CH1

       &s3c_device_hsmmc1,

#endif

#ifdef CONFIG_SMDK6410_SD_CH2

       &s3c_device_hsmmc2,

#endif

       &s3c_device_wdt,

       &s3c_device_rtc,

       &s3c_device_i2c0,

       //&s3c_device_i2c1,

       &s3c_device_spi0,

       &s3c_device_spi1,

       &s3c_device_keypad,

       &s3c_device_ts,

       //&s3c_device_smc911x,

       &s3c_device_dm9000_cs1,

       &s3c_device_lcd,

       &s3c_device_vpp,

       &s3c_device_mfc,

       &s3c_device_tvenc,

       &s3c_device_tvscaler,

       &s3c_device_rotator,

       &s3c_device_jpeg,

       &s3c_device_nand,

       &s3c_device_onenand,

       &s3c_device_usb,

       &s3c_device_usbgadget,

       &s3c_device_usb_otghcd,

       &s3c_device_fimc0,

       &s3c_device_fimc1,

       &s3c_device_g2d,

       &s3c_device_g3d,

 

#ifdef CONFIG_S3C64XX_ADC

       &s3c_device_adc,

#endif

 

#ifdef CONFIG_HAVE_PWM

       &s3c_device_timer[0],

       &s3c_device_timer[1],

#endif

 

       &gpio_button_device,

       //&s3c_device_can,

};

 

static struct i2c_board_info i2c_devs0[] __initdata = {

       { I2C_BOARD_INFO("24c08", 0x50), },

/*    { I2C_BOARD_INFO("WM8580", 0x1b), },       */

};

 

static struct i2c_board_info i2c_devs1[] __initdata = {

       { I2C_BOARD_INFO("24c128", 0x57), },   /* Samsung S524AD0XD1 */

       { I2C_BOARD_INFO("WM8580", 0x1b), },

};

 

 

static void __init smdk6410_machine_init(void)

{

       s3c_device_nand.dev.platform_data = &s3c_nand_mtd_part_info;

       s3c_device_onenand.dev.platform_data = &s3c_onenand_data;

 

       smdk6410_smc911x_set();

 

       s3c_i2c0_set_platdata(NULL);

       //s3c_i2c1_set_platdata(NULL);

 

       s3c_ts_set_platdata(&s3c_ts_platform);

       s3c_adc_set_platdata(&s3c_adc_platform);

 

       i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));

       i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));

 

//     spi_register_board_info(sam_spi_devs, ARRAY_SIZE(sam_spi_devs));

       spi_register_board_info(spi_board_info, ARRAY_SIZE(spi_board_info));

 

 

       s3c_fimc0_set_platdata(NULL);

       s3c_fimc1_set_platdata(NULL);

 

#ifdef CONFIG_VIDEO_FIMC

       //s3c_fimc_reset_camera();

#endif

 

       platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices));

       s3c6410_pm_init();

 

       smdk_backlight_register();

       

}


        上面的注册了很多的platform的设备,而对于i2c等也注册了对应的设备。至于platform的实现,这里就不多讲了,只是为了以后学习熟悉下,在哪个地方。

        知道了platform了,那么相关的一些寄存器是在哪里定义的呢?还是grep一把吧。

        找了好久,终于找到了,在\arch\arm\plat-s3c64xx\include\plat目录下面

        好多吧,从gpioa—gpioq口,还有media的啊,pm的,clock的,iis的等等,具体可以看看代码,还是先看下reg-gpio.h这个文件吧

 

/

* linux/arch/arm/plat-s3c64xx/include/plat/regs-gpio.h

 *

 * Copyright 2008 Openmoko, Inc.

 * Copyright 2008 Simtec Electronics

 *      Ben Dooks <[email protected]>

 *      http://armlinux.simtec.co.uk/

 *

 * S3C64XX - GPIO register definitions

 */

 

#ifndef __ASM_PLAT_S3C64XX_REGS_GPIO_H

#define __ASM_PLAT_S3C64XX_REGS_GPIO_H __FILE__

 

#include <plat/gpio-bank-a.h>

#include <plat/gpio-bank-b.h>

#include <plat/gpio-bank-c.h>

#include <plat/gpio-bank-d.h>

#include <plat/gpio-bank-e.h>

#include <plat/gpio-bank-f.h>

#include <plat/gpio-bank-g.h>

#include <plat/gpio-bank-h.h>

#include <plat/gpio-bank-i.h>

#include <plat/gpio-bank-j.h>

#include <plat/gpio-bank-k.h>

#include <plat/gpio-bank-l.h>

#include <plat/gpio-bank-n.h>

#include <plat/gpio-bank-m.h>

#include <plat/gpio-bank-o.h>

#include <plat/gpio-bank-p.h>

#include <plat/gpio-bank-q.h>

#include <mach/map.h>

 

/* Base addresses for each of the banks */

 

#define S3C64XX_GPA_BASE     (S3C64XX_VA_GPIO + 0x0000)

#define S3C64XX_GPB_BASE     (S3C64XX_VA_GPIO + 0x0020)

#define S3C64XX_GPC_BASE     (S3C64XX_VA_GPIO + 0x0040)

#define S3C64XX_GPD_BASE     (S3C64XX_VA_GPIO + 0x0060)

#define S3C64XX_GPE_BASE     (S3C64XX_VA_GPIO + 0x0080)

#define S3C64XX_GPF_BASE     (S3C64XX_VA_GPIO + 0x00A0)

#define S3C64XX_GPG_BASE     (S3C64XX_VA_GPIO + 0x00C0)

#define S3C64XX_GPH_BASE     (S3C64XX_VA_GPIO + 0x00E0)

#define S3C64XX_GPI_BASE      (S3C64XX_VA_GPIO + 0x0100)

#define S3C64XX_GPJ_BASE      (S3C64XX_VA_GPIO + 0x0120)

#define S3C64XX_GPK_BASE     (S3C64XX_VA_GPIO + 0x0800)

#define S3C64XX_GPL_BASE     (S3C64XX_VA_GPIO + 0x0810)

#define S3C64XX_GPM_BASE    (S3C64XX_VA_GPIO + 0x0820)

#define S3C64XX_GPN_BASE     (S3C64XX_VA_GPIO + 0x0830)

#define S3C64XX_GPO_BASE     (S3C64XX_VA_GPIO + 0x0140)

#define S3C64XX_GPP_BASE     (S3C64XX_VA_GPIO + 0x0160)

#define S3C64XX_GPQ_BASE     (S3C64XX_VA_GPIO + 0x0180)

#define S3C64XX_SPC_BASE     (S3C64XX_VA_GPIO + 0x01A0)

#define S3C64XX_MEM0CONSTOP   (S3C64XX_VA_GPIO + 0x01B0)

#define S3C64XX_MEM1CONSTOP   (S3C64XX_VA_GPIO + 0x01B4)

#define S3C64XX_MEM0CONSLP0    (S3C64XX_VA_GPIO + 0x01C0)

#define S3C64XX_MEM0CONSLP1    (S3C64XX_VA_GPIO + 0x01C4)

#define S3C64XX_MEM1CONSLP      (S3C64XX_VA_GPIO + 0x01C8)

#define S3C64XX_MEM0DRVCON     (S3C64XX_VA_GPIO + 0x01D0)

#define S3C64XX_MEM1DRVCON     (S3C64XX_VA_GPIO + 0x01D4)

#define S3C64XX_EINT0CON0   (S3C64XX_VA_GPIO + 0x0900)

#define S3C64XX_EINT0CON1   (S3C64XX_VA_GPIO + 0x0904)

#define S3C64XX_EINT0FLTCON0    (S3C64XX_VA_GPIO + 0x0910)

#define S3C64XX_EINT0FLTCON1    (S3C64XX_VA_GPIO + 0x0914)

#define S3C64XX_EINT0FLTCON2    (S3C64XX_VA_GPIO + 0x0918)

#define S3C64XX_EINT0FLTCON3    (S3C64XX_VA_GPIO + 0x091C)

#define S3C64XX_EINT0MASK  (S3C64XX_VA_GPIO + 0x0920)

#define S3C64XX_EINT0PEND   (S3C64XX_VA_GPIO + 0x0924)

#define S3C64XX_SPCONSLP    (S3C64XX_VA_GPIO + 0x0880)

#define S3C64XX_SLPEN           (S3C64XX_VA_GPIO + 0x0930)

#define S3C64XX_EINT12CON   (S3C64XX_VA_GPIO + 0x0200)

#define S3C64XX_EINT34CON   (S3C64XX_VA_GPIO + 0x0204)

#define S3C64XX_EINT56CON   (S3C64XX_VA_GPIO + 0x0208)

#define S3C64XX_EINT78CON   (S3C64XX_VA_GPIO + 0x020C)

#define S3C64XX_EINT9CON     (S3C64XX_VA_GPIO + 0x0210)

#define S3C64XX_EINT12FLTCON    (S3C64XX_VA_GPIO + 0x0220)

#define S3C64XX_EINT34FLTCON    (S3C64XX_VA_GPIO + 0x0224)

#define S3C64XX_EINT56FLTCON    (S3C64XX_VA_GPIO + 0x0228)

#define S3C64XX_EINT78FLTCON    (S3C64XX_VA_GPIO + 0x022C)

#define S3C64XX_EINT9FLTCON      (S3C64XX_VA_GPIO + 0x0230)

#define S3C64XX_EINT12MASK (S3C64XX_VA_GPIO + 0x0240)

#define S3C64XX_EINT34MASK (S3C64XX_VA_GPIO + 0x0244)

#define S3C64XX_EINT56MASK (S3C64XX_VA_GPIO + 0x0248)

#define S3C64XX_EINT78MASK (S3C64XX_VA_GPIO + 0x024C)

#define S3C64XX_EINT9MASK  (S3C64XX_VA_GPIO + 0x0250)

#define S3C64XX_EINT12PEND (S3C64XX_VA_GPIO + 0x0260)

#define S3C64XX_EINT34PEND (S3C64XX_VA_GPIO + 0x0264)

#define S3C64XX_EINT56PEND (S3C64XX_VA_GPIO + 0x0268)

#define S3C64XX_EINT78PEND (S3C64XX_VA_GPIO + 0x026C)

#define S3C64XX_EINT9PEND   (S3C64XX_VA_GPIO + 0x0270)

#define S3C64XX_PRIORITY      (S3C64XX_VA_GPIO + 0x0280)

#define S3C64XX_SERVICE        (S3C64XX_VA_GPIO + 0x0284)

#define S3C64XX_SERVICEPEND      (S3C64XX_VA_GPIO + 0x0288)

 

/* values for S3C_EXTINT0 */

#define S3C64XX_EXTINT_LOWLEV       (0x00)

#define S3C64XX_EXTINT_HILEV    (0x01)

#define S3C64XX_EXTINT_FALLEDGE    (0x02)

#define S3C64XX_EXTINT_RISEEDGE     (0x04)

#define S3C64XX_EXTINT_BOTHEDGE   (0x06)

 

#endif /* __ASM_PLAT_S3C64XX_REGS_GPIO_H */

 


        发现有个头文件#include <mach/map.h>

        应该S3C64XX_VA_GPIO这个地址在那里定义的

 

/* linux/arch/arm/mach-s3c6400/include/mach/map.h

*/

 

#ifndef __ASM_ARCH_MAP_H

#define __ASM_ARCH_MAP_H __FILE__

 

#include <plat/map-base.h>

 

/* HSMMC units */

#define S3C64XX_PA_HSMMC(x)      (0x7C200000 + ((x) * 0x100000))

#define S3C64XX_PA_HSMMC0  S3C64XX_PA_HSMMC(0)

#define S3C64XX_PA_HSMMC1  S3C64XX_PA_HSMMC(1)

#define S3C64XX_PA_HSMMC2  S3C64XX_PA_HSMMC(2)

#define S3C_SZ_HSMMC          SZ_1M

 

#define S3C_PA_UART         (0x7F005000)

#define S3C_PA_UART0              (S3C_PA_UART + 0x00)

#define S3C_PA_UART1              (S3C_PA_UART + 0x400)

#define S3C_PA_UART2              (S3C_PA_UART + 0x800)

#define S3C_PA_UART3              (S3C_PA_UART + 0xC00)

#define S3C_UART_OFFSET              (0x400)

 

/* See notes on UART VA mapping in debug-macro.S */

#define S3C_VA_UARTx(x)          (S3C_VA_UART + (S3C_PA_UART & 0xfffff) + ((x) * S3C_UART_OFFSET))

 

#define S3C_VA_UART0              S3C_VA_UARTx(0)

#define S3C_VA_UART1              S3C_VA_UARTx(1)

#define S3C_VA_UART2              S3C_VA_UARTx(2)

#define S3C_VA_UART3              S3C_VA_UARTx(3)

#define S3C_SZ_UART         SZ_256

 

#define S3C64XX_PA_SYSCON  (0x7E00F000)

#define S3C64XX_PA_TIMER     (0x7F006000)

#define S3C64XX_PA_IIC0         (0x7F004000)

#define S3C64XX_PA_IIC1         (0x7F00F000)

 

#define S3C64XX_PA_GPIO        (0x7F008000)

#define S3C64XX_VA_GPIO        S3C_ADDR(0x00500000)

#define S3C64XX_SZ_GPIO        SZ_4K

 

#define S3C64XX_PA_SDRAM    (0x50000000)

#define S3C64XX_PA_VIC0        (0x71200000)

#define S3C64XX_PA_VIC1        (0x71300000)

 

#define S3C64XX_VA_SROMC    S3C_VA_SROMC

#define S3C64XX_PA_SROMC    (0x70000000)

#define S3C64XX_SZ_SROMC    SZ_1M

 

#define S3C64XX_VA_LCD       S3C_VA_LCD

#define S3C64XX_PA_LCD       (0x77100000)

#define S3C64XX_SZ_LCD         SZ_1M

 

#define S3C64XX_PA_G2D       (0x76100000)

#define S3C64XX_SZ_G2D         SZ_1M

 

#define S3C64XX_PA_G3D       (0x72000000)

#define S3C64XX_SZ_G3D         SZ_16M

 

#define S3C64XX_PA_FIMC              (0x78000000)

#define S3C64XX_SZ_FIMC              SZ_1M

 

#define S3C64XX_PA_ADC         (0x7E00B000)

//#define S3C64XX_PA_SMC9115       (0x18000000)

//#define S3C64XX_SZ_SMC9115       SZ_512M

#define S3C64XX_PA_DM9000   (0x18000000)

#define S3C64XX_SZ_DM9000   SZ_1M

#define S3C64XX_VA_DM9000   S3C_ADDR(0x03b00300)

 

/* AC97 add by lyt */

#define S3C6400_PA_AC97 (0x7F001000)

 

#define S3C64XX_PA_IIS         (0x7F002000)

#define S3C64XX_PA_RTC       (0x7E005000)

#define S3C64XX_PA_IIS_V40   (0x7F00D000)

#define S3C_SZ_IIS             SZ_8K

 

/* DMA controller */

#define S3C64XX_PA_DMA        (0x75000000)

 

/* place VICs close together */

#define S3C_VA_VIC0          (S3C_VA_IRQ + 0x00)

#define S3C_VA_VIC1          (S3C_VA_IRQ + 0x10000)

 

/* Host I/F Indirect & Direct */

#define S3C64XX_VA_HOSTIFA  S3C_ADDR(0x00B00000)

#define S3C64XX_PA_HOSTIFA  (0x74000000)

#define S3C64XX_SZ_HOSTIFA  SZ_1M

 

#define S3C64XX_VA_HOSTIFB  S3C_ADDR(0x00C00000)

#define S3C64XX_PA_HOSTIFB  (0x74100000)

#define S3C64XX_SZ_HOSTIFB  SZ_1M

 

/* TV-ENCODER */

#define S3C6400_PA_TVENC      (0x76200000)

#define S5PC100_PA_TVENC      (0xF0000000)

#define S3C_SZ_TVENC             SZ_1M

 

/* TV-SCALER*/

#define S3C6400_PA_TVSCALER       (0x76300000)

#define S3C_SZ_TVSCALER              SZ_1M

 

/* Rotator */

#define S3C6400_PA_ROTATOR      (0x77200000)

#define S3C_SZ_ROTATOR          SZ_1M

 

/* JPEG */

#define S3C6400_PA_JPEG         (0x78800000)

#define S3C_SZ_JPEG             SZ_4M

 

/* VPP */

#define S3C6400_PA_VPP          (0x77000000)

#define S5PC100_PA_VPP          (0xF0100000)

#define S3C_SZ_VPP              SZ_1M

 

/* MFC */

#define S3C6400_PA_MFC          (0x7E002000)

#define S5PC100_PA_MFC          (0xF1000000)

#define S3C_SZ_MFC          SZ_4K

    

/* NAND flash controller */

#define S3C64XX_PA_NAND           (0x70200000)

#define S3C64XX_SZ_NAND           SZ_1M

 

/* OneNAND */

#define S3C64XX_PA_ONENAND      (0x70100000)

#define    S3C_SZ_ONENAND            SZ_1M

 

/* USB Host */

#define S3C64XX_PA_USBHOST (0x74300000)

#define S3C64XX_SZ_USBHOST SZ_1M

 

/* USB OTG */

#define S3C64XX_VA_OTG         S3C_ADDR(0x03900000)

#define S3C64XX_PA_OTG         (0x7C000000)

#define S3C64XX_SZ_OTG         SZ_1M

 

/* USB OTG SFR */

#define S3C64XX_VA_OTGSFR  S3C_ADDR(0x03a00000)

#define S3C64XX_PA_OTGSFR  (0x7C100000)

#define S3C64XX_SZ_OTGSFR  SZ_1M

 

#define S3C64XX_PA_KEYPAD   (0x7E00A000)

#define S3C64XX_SZ_KEYPAD   SZ_4K

 

/* SPI */

#define S3C64XX_PA_SPI         (0x7F00B000)

#define S3C64XX_PA_SPI0       (0x7F00B000)

#define S3C64XX_PA_SPI1       (0x7F00C000)

#define S3C64XX_SZ_SPI           SZ_8K

#define S3C64XX_SZ_SPI0         SZ_4K

#define S3C64XX_SZ_SPI1         SZ_4K

 

/* Watchdog */

#define S3C64XX_PA_WATCHDOG   (0x7E004000)

#define S3C64XX_SZ_WATCHDOG   SZ_4K

 

/* compatibiltiy defines. */

#define S3C_PA_TIMER              S3C64XX_PA_TIMER

#define S3C_PA_HSMMC0          S3C64XX_PA_HSMMC0

#define S3C_PA_HSMMC1          S3C64XX_PA_HSMMC1

#define S3C_PA_HSMMC2          S3C64XX_PA_HSMMC2

#define S3C_PA_IIC             S3C64XX_PA_IIC0

#define S3C_PA_IIC1           S3C64XX_PA_IIC1

 

#define S3C_PA_RTC           S3C64XX_PA_RTC

 

#define S3C_PA_SPI            S3C64XX_PA_SPI

#define S3C_PA_SPI0          S3C64XX_PA_SPI0

#define S3C_PA_SPI1          S3C64XX_PA_SPI1

#define S3C_SZ_SPI            S3C64XX_SZ_SPI

#define S3C_SZ_SPI0          S3C64XX_SZ_SPI0

#define S3C_SZ_SPI1          S3C64XX_SZ_SPI1

 

#define S3C_PA_IIS             S3C64XX_PA_IIS

#define S3C_PA_ADC          S3C64XX_PA_ADC

#define S3C_PA_DMA          S3C64XX_PA_DMA

 

#define S3C_VA_OTG          S3C64XX_VA_OTG

#define S3C_PA_OTG          S3C64XX_PA_OTG

#define S3C_SZ_OTG          S3C64XX_SZ_OTG

 

#define S3C_VA_OTGSFR           S3C64XX_VA_OTGSFR

#define S3C_PA_OTGSFR           S3C64XX_PA_OTGSFR

#define S3C_SZ_OTGSFR           S3C64XX_SZ_OTGSFR

 

#define S3C_PA_KEYPAD           S3C64XX_PA_KEYPAD

#define S3C_SZ_KEYPAD           S3C64XX_SZ_KEYPAD

 

#endif /* __ASM_ARCH_6400_MAP_H */


 

        好了这里什么都定义了,其中的PAphysical address)就是物理地址,而VAvirtual address)就是虚拟地址了。再看S3C_ADDR这个宏。

 

/* linux/arch/arm/plat-s3c/include/plat/map-base.h

*/

 

#ifndef __ASM_PLAT_MAP_H

#define __ASM_PLAT_MAP_H __FILE__

 

#define S3C_ADDR_BASE    (0xF4000000)

 

#ifndef __ASSEMBLY__

#define S3C_ADDR(x)  ((void __iomem __force *)S3C_ADDR_BASE + (x))

#else

#define S3C_ADDR(x)  (S3C_ADDR_BASE + (x))

#endif

 

#define S3C_VA_IRQ    S3C_ADDR(0x00000000)     /* irq controller(s) */

#define S3C_VA_SYS    S3C_ADDR(0x00100000)     /* system control */

#define S3C_VA_MEM  S3C_ADDR(0x00200000)     /* system control */

#define S3C_VA_TIMER       S3C_ADDR(0x00300000)     /* timer block */

#define S3C_VA_WATCHDOG      S3C_ADDR(0x00400000)     /* watchdog */

#define S3C_VA_LCD    S3C_ADDR(0x00600000)     /* LCD */

#define S3C_VA_UART  S3C_ADDR(0x01000000)     /* UART */

#define S3C_VA_SROMC     S3C_ADDR(0x01100000)     /* SROM SFR */

#define S3C_VA_SYSTIMER       S3C_ADDR(0x01200000)     /* SROM SFR */

#define S3C_VA_NAND     S3C_ADDR(0x01400000)    /* NAND */

 

#endif /* __ASM_PLAT_MAP_H */


 

        OK, 这个基地址就是#define S3C_ADDR_BASE       (0xF4000000)

        Ok,现在也知道了寄存器了的地址了,那么剩下的就是驱动中要配置什么寄存器就用相应的宏就好了,对于以后的开发也方面多了,只要结合芯片的文档加上这些,那么OK6410岂不是在你的手中,牢牢地,想逃也逃不掉了。

         收工,睡觉,下一步,开始对小o现有的驱动,慢慢理解,慢慢分析,慢慢调试。Come on

 

你可能感兴趣的:(c,timer,struct,assembly,mfc,IIS)