diff options
author | Vencislav Atanasov <user890104@freemyipod.org> | 2024-11-26 00:22:44 +0200 |
---|---|---|
committer | Solomon Peachy <pizza@shaftnet.org> | 2024-11-26 19:04:12 -0500 |
commit | 88a1d902360cf2401ad40a3c27cafff2e991a3cf (patch) | |
tree | 2a4fbb0cbc436ddc871b71ec61797f86163dd313 | |
parent | 6231407df702a9d29d255d5dc889e5e59e6f060c (diff) | |
download | rockbox-88a1d90236.tar.gz rockbox-88a1d90236.zip |
s5l87xx: Add S5L8720 registers
This adds some confirmed and some to-be-confirmed (TBC) registers for Samsung S5L8720, which is used in iPod Nano 4G, iPod Touch 2G and the 920-0614-03 development/prototype board.
All credit goes to Cástor Muñoz <cmvidal@gmail.com>
Change-Id: I9fe5052fe9f05cd33f34de4e228cdb291944aa11
-rw-r--r-- | apps/plugins/crypt_firmware.c | 12 | ||||
-rw-r--r-- | firmware/export/s5l87xx.h | 336 |
2 files changed, 274 insertions, 74 deletions
diff --git a/apps/plugins/crypt_firmware.c b/apps/plugins/crypt_firmware.c index 14e9c2be96..dd8dcf3605 100644 --- a/apps/plugins/crypt_firmware.c +++ b/apps/plugins/crypt_firmware.c @@ -103,18 +103,18 @@ static void aes_decrypt(void* data, uint32_t size) static void calc_hash(uint32_t* data, uint32_t size, uint32_t* result) { uint32_t ptr, i; - uint32_t ctrl = 2; + uint32_t config = 2; PWRCONEXT &= ~0x4; for (ptr = 0; ptr < (size >> 2); ptr += 0x10) { - for (i = 0; i < 0x10; i++) HASHDATAIN[i] = data[ptr + i]; - HASHCTRL = ctrl; - ctrl = 0xA; - while ((HASHCTRL & 1) != 0); + for (i = 0; i < 0x10; i++) SHA1DATAIN[i] = data[ptr + i]; + SHA1CONFIG = ctrl; + config = 0xA; + while ((SHA1CONFIG & 1) != 0); } - for (i = 0; i < 5; i ++) result[i] = HASHRESULT[i]; + for (i = 0; i < 5; i ++) result[i] = SHA1RESULT[i]; PWRCONEXT |= 0x4; } diff --git a/firmware/export/s5l87xx.h b/firmware/export/s5l87xx.h index 7dc2d692ea..dea25f9c02 100644 --- a/firmware/export/s5l87xx.h +++ b/firmware/export/s5l87xx.h @@ -33,24 +33,29 @@ #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define CACHEALIGN_BITS (4) /* 2^4 = 16 bytes */ -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define CACHEALIGN_BITS (5) /* 2^5 = 32 bytes */ #endif -#if CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define DRAM_ORIG 0x08000000 #define IRAM_ORIG 0x22000000 -#define DRAM_SIZE (MEMORYSIZE * 0x100000) -#define IRAM_SIZE 0x40000 +#define IRAM0_ORIG IRAM_ORIG +#define IRAM0_SIZE 0x20000 +#define IRAM1_ORIG (IRAM0_ORIG + IRAM0_SIZE) + +#if CONFIG_CPU==S5L8702 +#define IRAM1_SIZE 0x20000 +#elif CONFIG_CPU==S5L8720 +#define IRAM1_SIZE 0x10000 +#endif + +#define DRAM_SIZE (MEMORYSIZE * 0x100000) +#define IRAM_SIZE (IRAM0_SIZE + IRAM1_SIZE) #define TTB_SIZE 0x4000 #define TTB_BASE_ADDR (DRAM_ORIG + DRAM_SIZE - TTB_SIZE) - -#define IRAM0_ORIG 0x22000000 -#define IRAM0_SIZE 0x20000 -#define IRAM1_ORIG 0x22020000 -#define IRAM1_SIZE 0x20000 #endif /* 04. CALMADM2E */ @@ -155,7 +160,7 @@ #define DSPCLKMD (*(REG32_PTR_T)(CLK_BASE + 0x38)) /* DSP clock mode register */ #define CLKCON2 (*(REG32_PTR_T)(CLK_BASE + 0x3C)) /* Clock control register 2 */ #define PWRCONEXT (*(REG32_PTR_T)(CLK_BASE + 0x40)) /* Clock power control register 2 */ -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define CLKCON0 (*((REG32_PTR_T)(CLK_BASE))) #define CLKCON1 (*((REG32_PTR_T)(CLK_BASE + 0x04))) #define CLKCON2 (*((REG32_PTR_T)(CLK_BASE + 0x08))) @@ -170,6 +175,7 @@ #define PLL2LCNT (*((REG32_PTR_T)(CLK_BASE + 0x38))) #define PLLLOCK (*((REG32_PTR_T)(CLK_BASE + 0x40))) #define PLLMODE (*((REG32_PTR_T)(CLK_BASE + 0x44))) +/* s5l8702 only uses PWRCON0 and PWRCON1 */ #define PWRCON(i) (*((REG32_PTR_T)(CLK_BASE \ + ((i) == 4 ? 0x6C : \ ((i) == 3 ? 0x68 : \ @@ -183,6 +189,10 @@ #define RSTSR_WDR_BIT (1 << 2) #define RSTSR_SWR_BIT (1 << 1) #define RSTSR_HWR_BIT (1 << 0) + +#if CONFIG_CPU==S5L8720 +#define CLKCON6 (*((volatile uint32_t*)(CLK_BASE + 0x70))) +#endif #endif #if CONFIG_CPU==S5L8700 @@ -198,8 +208,10 @@ #define CLOCKGATE_SMx 3 #define CLOCKGATE_SM1 4 #define CLOCKGATE_ATA 5 +#define CLOCKGATE_NAND 8 #define CLOCKGATE_SDCI 9 #define CLOCKGATE_AES 10 +#define CLOCKGATE_NANDECC 12 #define CLOCKGATE_DMAC0 25 #define CLOCKGATE_DMAC1 26 #define CLOCKGATE_ROM 30 @@ -219,6 +231,111 @@ #define CLOCKGATE_CHIPID 46 #define CLOCKGATE_I2S2 47 #define CLOCKGATE_SPI2 48 +#elif CONFIG_CPU==S5L8720 +/* PWRCON0 - 18 gates (0..17) */ +#define CLOCKGATE_SHA 0 +#define CLOCKGATE_LCD 1 // TBC +#define CLOCKGATE_USBOTG 2 +#define CLOCKGATE_SMx 3 // TBC +#define CLOCKGATE_SM1 4 // TBC +#define CLOCKGATE_NAND 5 +#define CLOCKGATE_AES 7 +#define CLOCKGATE_NANDECC 9 +#define CLOCKGATE_DMAC0 11 // TBC +#define CLOCKGATE_DMAC1 12 // TBC +#define CLOCKGATE_ROM 13 + +#define CLOCKGATE_UNK14 14 // this could also be DMAC0 +// #define CLOCKGATE_UNK15 15 +// #define CLOCKGATE_UNK16 16 +// #define CLOCKGATE_UNK17 17 + +/* PWRCON1 - 32 gates (32..63)*/ +// #define CLOCKGATE_RTC 32 +#define CLOCKGATE_CWHEEL 33 // TBC +#define CLOCKGATE_SPI0 34 +#define CLOCKGATE_USBPHY 35 +#define CLOCKGATE_I2C0 36 +#define CLOCKGATE_TIMERA 37 + +#define CLOCKGATE_I2C1 38 // TBC +// #define CLOCKGATE_I2S0 39 +#define CLOCKGATE_UARTC 41 // TBC +// #define CLOCKGATE_I2S1 42 +#define CLOCKGATE_SPI1 43 +#define CLOCKGATE_GPIO 44 // TBC +#define CLOCKGATE_UNK45 45 // it is used in peicore, also in s5l8702, it is related to 0x3d00_0000 (secure boot ???) +#define CLOCKGATE_CHIPID 46 + +#define CLOCKGATE_SPI2 47 +// // #define CLOCKGATE_I2S2 47 +// // #define CLOCKGATE_SPI2 48 + +// #define CLOCKGATE_UNK50 50 +// #define CLOCKGATE_UNK52 52 +// #define CLOCKGATE_UNK54 54 + +#define CLOCKGATE_TIMERB 55 +#define CLOCKGATE_TIMERE 56 +#define CLOCKGATE_TIMERF 57 +#define CLOCKGATE_TIMERG 58 +#define CLOCKGATE_TIMERH 59 +#define CLOCKGATE_TIMERI 60 + +#define CLOCKGATE_UNK61 61 +#define CLOCKGATE_UNK62 62 +#define CLOCKGATE_UNK63 63 + + +/* PWRCON2 - 7 gates (64..70) */ +#define CLOCKGATE_SPI3 65 // TBC +#define CLOCKGATE_UNK66 66 +// #define CLOCKGATE_UNK67 67 +#define CLOCKGATE_SPI4 68 // TBC +#define CLOCKGATE_TIMERC 69 +#define CLOCKGATE_TIMERD 70 + + +/* PWRCON3 - 15 gates (96..110) */ +#define CLOCKGATE_UNK104 104 // it is used by peicore, related to 0x3880_0000 +#define CLOCKGATE_UNK14_2 107 + +// #define CLOCKGATE_UNK109 109 // it hangs if we disable it + + +/* PWRCON4 - 24 gates (128..151) */ +#define CLOCKGATE_TIMERA_2 128 +#define CLOCKGATE_TIMERB_2 129 +#define CLOCKGATE_TIMERE_2 130 +#define CLOCKGATE_TIMERF_2 131 +#define CLOCKGATE_TIMERG_2 132 +#define CLOCKGATE_TIMERH_2 133 +#define CLOCKGATE_TIMERI_2 134 + +#define CLOCKGATE_UARTC_2 135 // TBC + +#define CLOCKGATE_UNK61_2 136 +#define CLOCKGATE_UNK62_2 137 +#define CLOCKGATE_UNK63_2 138 + +#define CLOCKGATE_I2C0_2 139 +#define CLOCKGATE_I2C1_2 140 + +#define CLOCKGATE_SPI0_2 141 +#define CLOCKGATE_SPI1_2 142 +#define CLOCKGATE_SPI2_2 143 + +#define CLOCKGATE_LCD_2 144 // TBC + +// #define CLOCKGATE_UNK145 145 + +#define CLOCKGATE_SPI3_2 147 // TBC +#define CLOCKGATE_SPI4_2 148 // TBC + +#define CLOCKGATE_UNK66_2 149 + +#define CLOCKGATE_TIMERC_2 150 +#define CLOCKGATE_TIMERD_2 151 #endif /* 06. INTERRUPT CONTROLLER UNIT */ @@ -286,16 +403,25 @@ #define MIU_BASE 0x38200000 #elif CONFIG_CPU==S5L8702 #define MIU_BASE 0x38100000 +#elif CONFIG_CPU==S5L8720 +#define MIU_BASE 0x3d700000 #endif #define MIU_REG(off) (*((REG32_PTR_T)(MIU_BASE + (off)))) /* SDRAM */ +#if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 #define MIUCON (*(REG32_PTR_T)(MIU_BASE)) /* External Memory configuration register */ #define MIUCOM (*(REG32_PTR_T)(MIU_BASE + 0x04)) /* Command and status register */ #define MIUAREF (*(REG32_PTR_T)(MIU_BASE + 0x08)) /* Auto-refresh control register */ #define MIUMRS (*(REG32_PTR_T)(MIU_BASE + 0x0C)) /* SDRAM Mode Register Set Value Register */ #define MIUSDPARA (*(REG32_PTR_T)(MIU_BASE + 0x10)) /* SDRAM parameter register */ +#elif CONFIG_CPU==S5L8720 +#define MIUCOM (*(REG32_PTR_T)(MIU_BASE + 0x104)) /* Command and status register */ +#define MIUMRS (*(REG32_PTR_T)(MIU_BASE + 0x110)) /* SDRAM Mode Register Set Value Register */ + +#define UNK3E000008 (*(REG32_PTR_T)(0x3e000008)) +#endif /* DDR */ #define MEMCONF (*(REG32_PTR_T)(MIU_BASE + 0x20)) /* External Memory configuration register */ @@ -320,6 +446,16 @@ /* 08. IODMA CONTROLLER */ #define DMA_BASE 0x38400000 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 +#define DMA0_BASE 0x38200000 +#endif + +#if CONFIG_CPU==S5L8702 +#define DMA1_BASE 0x39900000 +#elif CONFIG_CPU==S5L8720 +#define DMA1_BASE 0x38700000 +#endif + #define DMABASE0 (*(REG32_PTR_T)(DMA_BASE)) /* Base address register for channel 0 */ #define DMACON0 (*(REG32_PTR_T)(DMA_BASE + 0x04)) /* Configuration register for channel 0 */ #define DMATCNT0 (*(REG32_PTR_T)(DMA_BASE + 0x08)) /* Transfer count register for channel 0 */ @@ -462,16 +598,23 @@ #define TDDATA1 (*(REG32_PTR_T)(TIMER_BASE + 0x6C)) /* Data1 Register */ #define TDPRE (*(REG32_PTR_T)(TIMER_BASE + 0x70)) /* Pre-scale register */ #define TDCNT (*(REG32_PTR_T)(TIMER_BASE + 0x74)) /* Counter register */ +/* Timer I: 64-bit 5usec timer */ +#define TICNTH (*(REG32_PTR_T)(TIMER_BASE + 0x80)) +#define TICNTL (*(REG32_PTR_T)(TIMER_BASE + 0x84)) +#define TIUNK08 (*(REG32_PTR_T)(TIMER_BASE + 0x88)) +#define TIUNK0C (*(REG32_PTR_T)(TIMER_BASE + 0x8C)) // TBC: DATA0H +#define TIUNK10 (*(REG32_PTR_T)(TIMER_BASE + 0x90)) // DATA0L +#define TIUNK14 (*(REG32_PTR_T)(TIMER_BASE + 0x94)) // DATA1H +#define TIUNK18 (*(REG32_PTR_T)(TIMER_BASE + 0x98)) // DATA1L #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define TIMER_FREQ (1843200 * 4 * 26 / 1 / 4) /* 47923200 Hz */ -#define TREG_80 (*(REG32_PTR_T)(TIMER_BASE + 0x80)) -#define TREG_84 (*(REG32_PTR_T)(TIMER_BASE + 0x84)) -#define FIVE_USEC_TIMER (((uint64_t)TREG_80 << 32) | TREG_84) /* 64bit 5usec timer */ -#define USEC_TIMER (FIVE_USEC_TIMER * 5) /* usecs */ -#elif CONFIG_CPU==S5L8702 -/* 16/32-bit timers: +#define FIVE_USEC_TIMER (((uint64_t)TICNTH << 32) | TICNTL) +#define USEC_TIMER (FIVE_USEC_TIMER * 5) +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 +/* + * 16/32-bit timers: * * - Timers A..D: 16-bit counter, very similar to 16-bit timers described * in S5L8700 DS, it seems that the timers C and D are disabled or not @@ -480,6 +623,20 @@ * - Timers E..H: 32-bit counter, they are like 16-bit timers, but the * interrupt status for all 32-bit timers is located in TSTAT register. * + * TSTAT: + * [26]: TIMERE INTOVF + * [25]: TIMERE INT1 + * [24]: TIMERE INT0 + * [18]: TIMERF INTOVF + * [17]: TIMERF INT1 + * [16]: TIMERF INT0 + * [10]: TIMERG INTOVF + * [9]: TIMERG INT1 + * [8]: TIMERG INT0 + * [2]: TIMERH INTOVF + * [1]: TIMERH INT1 + * [0]: TIMERH INT0 + * * - Clock source configuration: * * TCON[10:8] (Tx_CS) TCON[6]=0 TCON[6]=1 @@ -493,9 +650,9 @@ * 11x Ext. Clock 1 Ext. Clock 1 * * On Classic: - * - Ext. Clock 0: not connected or disabled - * - Ext. Clock 1: 32768 Hz, external OSC1?, PMU? - * - ECLK: 12 MHz, external OSC0? + * Ext. Clock 0: not connected or disabled + * Ext. Clock 1: 32768 Hz, external OSC1 + * ECLK: 12 MHz, external OSC0 */ #define TIMER_FREQ 12000000 /* ECLK */ @@ -607,7 +764,7 @@ /* 13. SECURE DIGITAL CARD INTERFACE (SDCI) */ #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define SDCI_BASE 0x3C300000 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define SDCI_BASE 0x38b00000 #endif @@ -628,7 +785,7 @@ #define SDCI_IRQ (*(REG32_PTR_T)(SDCI_BASE + 0x38)) /* Interrupt Source Register */ #define SDCI_IRQ_MASK (*(REG32_PTR_T)(SDCI_BASE + 0x3c)) -#if CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define SDCI_DATA (*(REG32_PTR_T)(SDCI_BASE + 0x40)) #define SDCI_DMAADDR (*(VOID_PTR_PTR_T)(SDCI_BASE + 0x44)) #define SDCI_DMASIZE (*(REG32_PTR_T)(SDCI_BASE + 0x48)) @@ -853,7 +1010,7 @@ #define I2SRXDB (*(REG32_PTR_T)(I2S_BASE + 0x38)) /* Rx data buffer */ #define I2SSTATUS (*(REG32_PTR_T)(I2S_BASE + 0x3C)) /* status register */ -#if CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define I2SCLKDIV (*(REG32_PTR_T)(I2S_BASE + 0x40)) #define I2SCLKGATE(i) ((i) == 2 ? CLOCKGATE_I2S2 : \ @@ -869,20 +1026,21 @@ #define IICSTAT (*(REG32_PTR_T)(IIC_BASE + 0x04)) /* Control/Status Register */ #define IICADD (*(REG32_PTR_T)(IIC_BASE + 0x08)) /* Bus Address Register */ #define IICDS (*(REG32_PTR_T)(IIC_BASE + 0x0C)) -#elif CONFIG_CPU==S5L8702 -/* s5l8702 I2C controller is similar to s5l8700, known differences are: - - * IICCON[5] is not used in s5l8702. - * IICCON[13:8] are used to enable interrupts. - IICSTA2[13:8] are used to read the status and write-clear interrupts. - Known interrupts: - [13] STOP on bus (TBC) - [12] START on bus (TBC) - [8] byte transmited or received in Master mode (not tested in Slave) - * IICCON[4] does not clear interrupts, it is enabled when a byte is - transmited or received, in Master mode the tx/rx of the next byte - starts when it is written as "1". -*/ +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 +/* + * s5l8702 I2C controller is similar to s5l8700, known differences are: + * + * - IICCON[5] is not used in s5l8702. + * - IICCON[13:8] are used to enable interrupts. + * IICSTA2[13:8] are used to read the status and write-clear interrupts. + * Known interrupts: + * [13] STOP on bus (TBC) + * [12] START on bus (TBC) + * [8] byte transmited or received in Master mode (not tested in Slave) + * - IICCON[4] does not clear interrupts, it is enabled when a byte is + * transmited or received, in Master mode the tx/rx of the next byte + * starts when it is written as "1". + */ #define IIC_BASE 0x3C600000 #define IICCON(bus) (*((REG32_PTR_T)(IIC_BASE + 0x300000 * (bus)))) @@ -898,6 +1056,11 @@ CLOCKGATE_I2C0) #endif +#if CONFIG_CPU == S5L8720 +#define I2CCLKGATE_2(i) ((i) == 1 ? CLOCKGATE_I2C1_2 : \ + CLOCKGATE_I2C0_2) +#endif + /* 19. SPI (SERIAL PERHIPERAL INTERFACE) */ #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define SPI_BASE 0x3CD00000 @@ -909,7 +1072,7 @@ #define SPTDAT (*(REG32_PTR_T)(SPI_BASE + 0x10)) /* Tx Data Register */ #define SPRDAT (*(REG32_PTR_T)(SPI_BASE + 0x14)) /* Rx Data Register */ #define SPPRE (*(REG32_PTR_T)(SPI_BASE + 0x18)) /* Baud Rate Prescaler Register */ -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU == S5L8720 #define SPIBASE(i) ((i) == 2 ? 0x3d200000 : \ (i) == 1 ? 0x3ce00000 : \ 0x3c300000) @@ -930,6 +1093,16 @@ #define SPIDD(i) (*((REG32_PTR_T)(SPIBASE(i) + 0x38))) /* TBC */ #endif +#if CONFIG_CPU == S5L8720 +#define SPIUNK3C(i) (*((REG32_PTR_T)(SPIBASE(i) + 0x3c))) +#define SPIUNK40(i) (*((REG32_PTR_T)(SPIBASE(i) + 0x40))) +#define SPIUNK4C(i) (*((REG32_PTR_T)(SPIBASE(i) + 0x4c))) + +#define SPICLKGATE_2(i) ((i) == 2 ? CLOCKGATE_SPI2_2 : \ + (i) == 1 ? CLOCKGATE_SPI1_2 : \ + CLOCKGATE_SPI0_2) +#endif + /* 20. ADC CONTROLLER */ #define ADC_BASE 0x3CE00000 @@ -1016,7 +1189,7 @@ #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define GPIO_OFFSET_BITS 4 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define GPIO_OFFSET_BITS 5 #endif @@ -1025,7 +1198,7 @@ #define PUNA(i) (*((REG32_PTR_T)(GPIO_BASE + 0x08 + ((i) << GPIO_OFFSET_BITS)))) #define PUNB(i) (*((REG32_PTR_T)(GPIO_BASE + 0x0c + ((i) << GPIO_OFFSET_BITS)))) -#if CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define PUNC(i) (*((REG32_PTR_T)(GPIO_BASE + 0x10 + ((i) << GPIO_OFFSET_BITS)))) #endif @@ -1056,14 +1229,23 @@ #define PDAT13 PDAT(13) /* The data register for port 13 */ #define PCON14 PCON(14) /* Configures the pins of port 14 */ #define PDAT14 PDAT(14) /* The data register for port 14 */ +#if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 #define PCON15 PCON(15) /* Configures the pins of port 15 */ +#define PDAT15 PDAT(15) /* Configures the pins of port 15 */ #define PUNK15 PUNB(15) /* Unknown thing for port 15 */ +#endif #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define PCON_ASRAM PCON15 /* Configures the pins of port nor flash */ #define PCON_SDRAM PDAT15 /* Configures the pins of port sdram */ #elif CONFIG_CPU==S5L8702 +#define GPIO_N_GROUPS 16 #define GPIOCMD (*((REG32_PTR_T)(GPIO_BASE + 0x200))) +#elif CONFIG_CPU==S5L8720 +#define GPIO_N_GROUPS 15 +#define GPIOCMD (*((REG32_PTR_T)(GPIO_BASE + 0x1e0))) +#define GPIOUNK388 (*((REG32_PTR_T)(GPIO_BASE + 0x388))) +#define GPIOUNK384 (*((REG32_PTR_T)(GPIO_BASE + 0x384))) #endif /* 25. UART */ @@ -1087,8 +1269,8 @@ #define UARTC2_BASE_ADDR 0x3CC0C000 #define UARTC2_N_PORTS 1 #define UARTC2_PORT_OFFSET 0x0 -#elif CONFIG_CPU==S5L8702 -/* s5l8702 UC87XX HW: 1 UARTC, 4 ports */ +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 +/* s5l8702/s5l8720 UC87XX HW: 1 UARTC, 4 ports */ #define UARTC_BASE_ADDR 0x3CC00000 #define UARTC_N_PORTS 4 #define UARTC_PORT_OFFSET 0x4000 @@ -1099,7 +1281,7 @@ #define LCD_BASE 0x3C100000 #elif CONFIG_CPU==S5L8701 #define LCD_BASE 0x38600000 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define LCD_BASE 0x38300000 #endif @@ -1148,7 +1330,7 @@ /* 28. ATA CONTROLLER */ #if CONFIG_CPU==S5L8700 || CONFIG_CPU==S5L8701 #define ATA_BASE 0x38E00000 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define ATA_BASE 0x38700000 #endif @@ -1186,9 +1368,14 @@ #define ATA_DMA_ADDR (*(VOID_PTR_PTR_T)(ATA_BASE + 0x88)) /* 29. CHIP ID */ -#define CHIP_ID_BASE 0x3D100000 -#define REG_ONE (*(REG32_PTR_T)(CHIP_ID_BASE)) /* Receive the first 32 bits from a fuse box */ -#define REG_TWO (*(REG32_PTR_T)(CHIP_ID_BASE + 0x04)) /* Receive the other 8 bits from a fuse box */ +#define CHIPID_BASE 0x3D100000 + +#define CHIPID_REG_ONE (*(REG32_PTR_T)(CHIPID_BASE)) /* Receive the first 32 bits from a fuse box */ +#define CHIPID_REG_TWO (*(REG32_PTR_T)(CHIPID_BASE + 0x04)) /* Receive the other 8 bits from a fuse box */ + +#if CONFIG_CPU == S5L8720 +#define CHIPID_INFO (*(REG32_PTR_T)(CHIPID_BASE + 0x08)) +#endif /* The following peripherals are not present in the Samsung S5L8700 datasheet. @@ -1198,11 +1385,11 @@ Information for them was gathered solely by reverse-engineering Apple's firmware /* Hardware AES crypto unit - S5L8701+ */ #if CONFIG_CPU==S5L8701 #define AES_BASE 0x39800000 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define AES_BASE 0x38c00000 #endif -#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define AESCONTROL (*((REG32_PTR_T)(AES_BASE))) #define AESGO (*((REG32_PTR_T)(AES_BASE + 0x04))) #define AESUNKREG0 (*((REG32_PTR_T)(AES_BASE + 0x08))) @@ -1220,7 +1407,7 @@ Information for them was gathered solely by reverse-engineering Apple's firmware #define AESOUTADDR (*((REG32_PTR_T)(AES_BASE + 0x20))) #define AESINADDR (*((REG32_PTR_T)(AES_BASE + 0x28))) #define AESAUXADDR (*((REG32_PTR_T)(AES_BASE + 0x30))) -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define AESOUTADDR (*((VOID_PTR_PTR_T)(AES_BASE + 0x20))) #define AESINADDR (*((CONST_VOID_PTR_PTR_T)(AES_BASE + 0x28))) #define AESAUXADDR (*((VOID_PTR_PTR_T)(AES_BASE + 0x30))) @@ -1232,22 +1419,27 @@ Information for them was gathered solely by reverse-engineering Apple's firmware /* SHA-1 unit - S5L8701+ */ #if CONFIG_CPU==S5L8701 -#define HASH_BASE 0x3C600000 - -#define HASHCTRL (*(REG32_PTR_T)(HASH_BASE)) -#define HASHRESULT ((REG32_PTR_T)(HASH_BASE + 0x20)) -#define HASHDATAIN ((REG32_PTR_T)(HASH_BASE + 0x40)) -#elif CONFIG_CPU==S5L8702 +#define SHA1_BASE 0x3C600000 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU == S5L8720 #define SHA1_BASE 0x38000000 +#endif #define SHA1CONFIG (*((REG32_PTR_T)(SHA1_BASE))) #define SHA1RESET (*((REG32_PTR_T)(SHA1_BASE + 0x04))) + +#if CONFIG_CPU == S5L8720 +#define SHA1UNK10 (*((REG32_PTR_T)(SHA1_BASE + 0x10))) +#endif + #define SHA1RESULT ((REG32_PTR_T)(SHA1_BASE + 0x20)) #define SHA1DATAIN ((REG32_PTR_T)(SHA1_BASE + 0x40)) + +#if CONFIG_CPU == S5L8720 +#define SHA1UNK80 (*((REG32_PTR_T)(SHA1_BASE + 0x80))) #endif /* Clickwheel controller - S5L8701+ */ -#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define WHEEL_BASE 0x3C200000 #define WHEEL00 (*((REG32_PTR_T)(WHEEL_BASE))) @@ -1263,26 +1455,26 @@ Information for them was gathered solely by reverse-engineering Apple's firmware /* Synopsys OTG - S5L8701 only */ #if CONFIG_CPU==S5L8701 #define OTGBASE 0x38800000 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define OTGBASE 0x38400000 #endif -#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 #define PHYBASE 0x3C400000 /* OTG PHY control registers */ -#define OPHYPWR (*((REG32_PTR_T)(PHYBASE + 0x000))) -#define OPHYCLK (*((REG32_PTR_T)(PHYBASE + 0x004))) -#define ORSTCON (*((REG32_PTR_T)(PHYBASE + 0x008))) -#define OPHYUNK3 (*((REG32_PTR_T)(PHYBASE + 0x018))) -#define OPHYUNK1 (*((REG32_PTR_T)(PHYBASE + 0x01c))) -#define OPHYUNK2 (*((REG32_PTR_T)(PHYBASE + 0x044))) +#define OPHYPWR (*((REG32_PTR_T)(PHYBASE + 0x00))) +#define OPHYCLK (*((REG32_PTR_T)(PHYBASE + 0x04))) +#define ORSTCON (*((REG32_PTR_T)(PHYBASE + 0x08))) +#define OPHYUNK3 (*((REG32_PTR_T)(PHYBASE + 0x18))) +#define OPHYUNK1 (*((REG32_PTR_T)(PHYBASE + 0x1c))) +#define OPHYUNK2 (*((REG32_PTR_T)(PHYBASE + 0x44))) #endif #if CONFIG_CPU==S5L8701 /* 7 available EPs (0b00000000011101010000000001101011), 6 used */ #define USB_NUM_ENDPOINTS 6 -#elif CONFIG_CPU==S5L8702 +#elif CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 /* 9 available EPs (0b00000001111101010000000111101011), 6 used */ #define USB_NUM_ENDPOINTS 6 #endif @@ -1293,13 +1485,13 @@ Information for them was gathered solely by reverse-engineering Apple's firmware #define USB_DW_SHARED_FIFO #endif -#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8701 || CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 /* Define this if the DWC implemented on this SoC does not support DMA or you want to disable it. */ // #define USB_DW_ARCH_SLAVE #endif -#if CONFIG_CPU==S5L8702 +#if CONFIG_CPU==S5L8702 || CONFIG_CPU==S5L8720 /////INTERRUPT CONTROLLERS///// #define VIC_BASE 0x38E00000 #define VIC_OFFSET 0x1000 @@ -1485,7 +1677,13 @@ Information for them was gathered solely by reverse-engineering Apple's firmware #define VIC1ADDRESS VICADDRESS(1) +#define VIC0EDGE0 (*((REG32_PTR_T)(VICBASE(2)))) // TBC: INTENABLE +#define VIC1EDGE0 (*((REG32_PTR_T)(VICBASE(2) + 0x04))) +#define VIC0EDGE1 (*((REG32_PTR_T)(VICBASE(2) + 0x08))) // TBC: INTENCLEAR +#define VIC1EDGE1 (*((REG32_PTR_T)(VICBASE(2) + 0x0C))) + /////INTERRUPTS///// +// #define IRQ_UNK5 5 #define IRQ_TIMER32 7 #define IRQ_TIMER 8 #define IRQ_SPI(i) (9+(i)) /* TBC */ @@ -1497,6 +1695,7 @@ Information for them was gathered solely by reverse-engineering Apple's firmware #define IRQ_DMAC0 IRQ_DMAC(0) #define IRQ_DMAC1 IRQ_DMAC(1) #define IRQ_USB_FUNC 19 +#define IRQ_NAND 20 // TBC: it is so in s5l8900 #define IRQ_I2C(i) (21+(i)) #define IRQ_I2C0 IRQ_I2C(0) #define IRQ_I2C1 IRQ_I2C(1) @@ -1508,9 +1707,10 @@ Information for them was gathered solely by reverse-engineering Apple's firmware #define IRQ_UART3 IRQ_UART(3) #define IRQ_UART4 IRQ_UART(4) /* obsolete/not implemented on s5l8702 ??? */ #define IRQ_ATA 29 -#define IRQ_SBOOT 36 +#define IRQ_SECBOOT 36 #define IRQ_AES 39 #define IRQ_SHA 40 +#define IRQ_NANDECC 43 // TBC: it is so in s5l8900 #define IRQ_MMC 44 #define IRQ_EXT0 0 |