今天还是挺顺利的,这周的工作两天就搞定了,其实有点小简单。确实,我们都需要信心。总觉得,网线是个可恶的东西,老是懒懒的刷着网页也不干点实事,让自己进步也慢了好几拍。所以还是把网线直接接到开发板上去了,哈哈,那样就可以不上网,好好玩小o了。
前几天终于把以前留下的tftp下载内核和nfs挂载文件系统给搞定了,接下来开始直接拿linux2.6.28那个内核玩了,公司里所有的寄存器啊,platform啊什么的放在哪里都有同事告诉我了,而这个板子的那些个东东在哪里还不是很清楚,那就找找吧,用grep小搜了一把,终于找到了,下面贴一下,以后学习就可以不忘记了。
对于小o的platform的c文件是放在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目录下面
好多吧,从gpio的a口—gpio的q口,还有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 <ben@simtec.co.uk> * 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 */
好了这里什么都定义了,其中的PA(physical address)就是物理地址,而VA(virtual 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!