Add some code to dump most registers. It's a good way to find in what state the bootloader or Windows has left the device. Index: linux-2.6.14/arch/arm/mach-s3c2410/regdump.c =================================================================== --- /dev/null +++ linux-2.6.14/arch/arm/mach-s3c2410/regdump.c @@ -0,0 +1,261 @@ +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define REGV(reg) { #reg, (reg) } +#define REGI(va, reg) { #reg, (va) + (reg) } + +static struct reginfo { + const char *name; + void *va; +} reginfo[] = { + /* ADC */ + REGI(S3C24XX_VA_ADC, S3C2410_ADCCON), + REGI(S3C24XX_VA_ADC, S3C2410_ADCTSC), + REGI(S3C24XX_VA_ADC, S3C2410_ADCDLY), + REGI(S3C24XX_VA_ADC, S3C2410_ADCDAT0), + REGI(S3C24XX_VA_ADC, S3C2410_ADCDAT1), + + /* Clocks */ + REGV(S3C2410_LOCKTIME), + REGV(S3C2410_MPLLCON), + REGV(S3C2410_UPLLCON), + REGV(S3C2410_CLKCON), + REGV(S3C2410_CLKSLOW), + REGV(S3C2410_CLKDIVN), + + /* GPIO */ + REGV(S3C2410_GPACON), + REGV(S3C2410_GPADAT), + REGV(S3C2410_GPBCON), + REGV(S3C2410_GPBDAT), + REGV(S3C2410_GPBUP), + REGV(S3C2410_GPCCON), + REGV(S3C2410_GPCDAT), + REGV(S3C2410_GPCUP), + REGV(S3C2410_GPDCON), + REGV(S3C2410_GPDDAT), + REGV(S3C2410_GPDUP), + REGV(S3C2410_GPECON), + REGV(S3C2410_GPEDAT), + REGV(S3C2410_GPEUP), + REGV(S3C2410_GPFCON), + REGV(S3C2410_GPFDAT), + REGV(S3C2410_GPFUP), + REGV(S3C2410_GPGCON), + REGV(S3C2410_GPGDAT), + REGV(S3C2410_GPGUP), + REGV(S3C2410_GPHCON), + REGV(S3C2410_GPHDAT), + REGV(S3C2410_GPHUP), + REGV(S3C2410_MISCCR), + REGV(S3C2410_DCLKCON), + REGV(S3C2410_EXTINT0), + REGV(S3C2410_EXTINT1), + REGV(S3C2410_EXTINT2), + REGV(S3C2410_EINFLT0), + REGV(S3C2410_EINFLT1), + REGV(S3C2410_EINFLT2), + REGV(S3C2410_EINFLT3), + REGV(S3C2410_GSTATUS0), + REGV(S3C2410_GSTATUS1), + REGV(S3C2410_GSTATUS2), + REGV(S3C2410_GSTATUS3), + REGV(S3C2410_GSTATUS4), + +#if 0 + /* IIC */ + REGI(S3C24XX_VA_IIC, S3C2410_IICCON), + REGI(S3C24XX_VA_IIC, S3C2410_IICSTAT), + REGI(S3C24XX_VA_IIC, S3C2410_IICADD), + REGI(S3C24XX_VA_IIC, S3C2410_IICDS), + + /* IIS */ + REGI(S3C24XX_VA_IIS, S3C2410_IISCON), + REGI(S3C24XX_VA_IIS, S3C2410_IISMOD), + REGI(S3C24XX_VA_IIS, S3C2410_IISPSR), + REGI(S3C24XX_VA_IIS, S3C2410_IISFCON), + REGI(S3C24XX_VA_IIS, S3C2410_IISFIFO), +#endif + + /* IRQ */ + REGV(S3C2410_SRCPND), + REGV(S3C2410_INTMOD), + REGV(S3C2410_INTMSK), + REGV(S3C2410_PRIORITY), + REGV(S3C2410_INTPND), + REGV(S3C2410_INTOFFSET), + REGV(S3C2410_SUBSRCPND), + REGV(S3C2410_INTSUBMSK), + REGV(S3C2410_EINTMASK), + REGV(S3C2410_EINTPEND), + + /* LCD */ + REGV(S3C2410_LCDCON1), + REGV(S3C2410_LCDCON2), + REGV(S3C2410_LCDCON3), + REGV(S3C2410_LCDCON4), + REGV(S3C2410_LCDCON5), + REGV(S3C2410_LCDSADDR1), + REGV(S3C2410_LCDSADDR2), + REGV(S3C2410_LCDSADDR3), + REGV(S3C2410_REDLUT), + REGV(S3C2410_GREENLUT), + REGV(S3C2410_BLUELUT), + REGV(S3C2410_DITHMODE), + REGV(S3C2410_TPAL), + REGV(S3C2410_LCDINTPND), + REGV(S3C2410_LCDSRCPND), + REGV(S3C2410_LCDINTMSK), + REGV(S3C2410_LPCSEL), + + // REGV(S3C2410_TFTPAL(x)), + +#if 0 + /* Memory controller */ + REGV(S3C2410_BWSCON), + REGV(S3C2410_BANKCON0), + REGV(S3C2410_BANKCON1), + REGV(S3C2410_BANKCON2), + REGV(S3C2410_BANKCON3), + REGV(S3C2410_BANKCON4), + REGV(S3C2410_BANKCON5), + REGV(S3C2410_BANKCON6), + REGV(S3C2410_BANKCON7), + REGV(S3C2410_REFRESH), + REGV(S3C2410_BANKSIZE), + REGV(S3C2410_MRSRB6), + REGV(S3C2410_MRSRB7), + + /* Nand flash */ + REGI(S3C24XX_VA_NAND, S3C2410_NFCONF), + REGI(S3C24XX_VA_NAND, S3C2410_NFCMD), + REGI(S3C24XX_VA_NAND, S3C2410_NFADDR), + REGI(S3C24XX_VA_NAND, S3C2410_NFDATA), + REGI(S3C24XX_VA_NAND, S3C2410_NFSTAT), + REGI(S3C24XX_VA_NAND, S3C2410_NFECC), + + /* RTC */ + REGV(S3C2410_RTCCON), + REGV(S3C2410_TICNT), + REGV(S3C2410_RTCALM), + REGV(S3C2410_ALMSEC), + REGV(S3C2410_ALMMIN), + REGV(S3C2410_ALMHOUR), + REGV(S3C2410_ALMDATE), + REGV(S3C2410_ALMMON), + REGV(S3C2410_ALMYEAR), + REGV(S3C2410_RTCRST), + REGV(S3C2410_RTCSEC), + REGV(S3C2410_RTCMIN), + REGV(S3C2410_RTCHOUR), + REGV(S3C2410_RTCDATE), + REGV(S3C2410_RTCDAY), + REGV(S3C2410_RTCMON), + REGV(S3C2410_RTCYEAR), +#endif + + /* Timer */ + REGV(S3C2410_TCFG0), + REGV(S3C2410_TCFG1), + REGV(S3C2410_TCON), + + /* USB Device */ + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_FUNC_ADDR_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_PWR_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP_INT_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_USB_INT_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP_INT_EN_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_USB_INT_EN_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_FRAME_NUM1_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_FRAME_NUM2_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP0_FIFO_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_FIFO_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_FIFO_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_FIFO_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_FIFO_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_CON), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_UNIT), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_FIFO), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_TTC_L), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_TTC_M), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP1_DMA_TTC_H), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_CON), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_UNIT), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_FIFO), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_TTC_L), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_TTC_M), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP2_DMA_TTC_H), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_CON), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_UNIT), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_FIFO), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_TTC_L), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_TTC_M), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP3_DMA_TTC_H), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_CON), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_UNIT), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_FIFO), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_TTC_L), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_TTC_M), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP4_DMA_TTC_H), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_INDEX_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_MAXP_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_EP0_CSR_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_IN_CSR1_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_IN_CSR2_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_OUT_CSR1_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_OUT_CSR2_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_OUT_FIFO_CNT1_REG), + REGI(S3C24XX_VA_USBDEV, S3C2410_UDC_OUT_FIFO_CNT2_REG), + + /* Watchdog */ + REGV(S3C2410_WTCON), + REGV(S3C2410_WTDAT), + REGV(S3C2410_WTCNT), +}; + +static u32 regval[ARRAY_SIZE(reginfo)]; + +void s3c2410_capture_regs(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(reginfo); i++) + regval[i] = readl(reginfo[i].va); +} + +void s3c2410_dump_regs(void) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(reginfo); i++) + printk("%-20s = 0x%08x\n", reginfo[i].name, regval[i]); +} + +/* + Local variables: + compile-command: "make -k -C ../../../.. linux " + c-basic-offset: 8 + End: +*/ Index: linux-2.6.14/arch/arm/mach-s3c2410/Makefile =================================================================== --- linux-2.6.14.orig/arch/arm/mach-s3c2410/Makefile +++ linux-2.6.14/arch/arm/mach-s3c2410/Makefile @@ -44,3 +44,5 @@ obj-$(CONFIG_MACH_OTOM) += mach-otom.o obj-$(CONFIG_MACH_NEXCODER_2440) += mach-nexcoder.o obj-y += gpio-sysfs.o +obj-y += regdump.o +