Module Name: src Committed By: nisimura Date: Wed Feb 22 12:21:24 UTC 2012
Modified Files: src/sys/arch/evbarm/stand/boot2440: entry.S main.c Log Message: - detect SoC chipid value found at 0x5600'00b0. - have brdsetup() to define SoC IOMUX in early startup. Device drivers are still responsible to arrange relevent registers which they use. - some cleanup and clarification. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbarm/stand/boot2440/entry.S \ src/sys/arch/evbarm/stand/boot2440/main.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/evbarm/stand/boot2440/entry.S diff -u src/sys/arch/evbarm/stand/boot2440/entry.S:1.1 src/sys/arch/evbarm/stand/boot2440/entry.S:1.2 --- src/sys/arch/evbarm/stand/boot2440/entry.S:1.1 Mon Jan 30 03:28:34 2012 +++ src/sys/arch/evbarm/stand/boot2440/entry.S Wed Feb 22 12:21:23 2012 @@ -40,7 +40,8 @@ #ifndef SDRAM_START #define SDRAM_START S3C2440_SDRAM_START #endif - + +/* LED1/2/3/4 are manipulated by GPIO B5/6/7/8. */ #define LED1 (1<<5) #define LED2 (1<<6) #define LED3 (1<<7) @@ -50,7 +51,7 @@ .global _start _start: /* Get arguments from boot-loader (stored in r0 and r1) */ - adr r2, bootloader_args + adr r2, Largs stmia r2, {r0, r1} /* Disable interrupt */ @@ -125,7 +126,7 @@ _start: bgt .L1 - adr r2, bootloader_args + adr r2, Largs ldmia r2, {r0, r1} /* Jump to kernel code in TRUE VA */ @@ -134,11 +135,6 @@ _start: Lstart: .word main - .macro clock_data hdivn, pdivn, mdiv, pdiv, sdiv - .word (\hdivn)<<1 | \pdivn - .word (\mdiv)<<PLLCON_MDIV_SHIFT | (\pdiv)<<PLLCON_PDIV_SHIFT | (\sdiv)<<PLLCON_SDIV_SHIFT - .endm - #define MMU_INIT(va,pa,n_sec,attr) \ .word n_sec ; \ .word 4*((va)>>L1_S_SHIFT) ; \ @@ -161,6 +157,5 @@ Lcrtsetup: .word _end /* End of BSS */ .word 0x30A00000 /* Place stack-bottom at load-point of libsa bootloader */ - .global _C_LABEL(bootloader_args) -_C_LABEL(bootloader_args): - .space 8 /* Two registers */ +Largs: + .space 8 /* to save r0/r1 registers */ Index: src/sys/arch/evbarm/stand/boot2440/main.c diff -u src/sys/arch/evbarm/stand/boot2440/main.c:1.1 src/sys/arch/evbarm/stand/boot2440/main.c:1.2 --- src/sys/arch/evbarm/stand/boot2440/main.c:1.1 Mon Jan 30 03:28:34 2012 +++ src/sys/arch/evbarm/stand/boot2440/main.c Wed Feb 22 12:21:23 2012 @@ -84,6 +84,8 @@ static void time_init(uint32_t pclk); static void bi_init(void *addr); static void bi_add(void *new, int type, int size); static void parse_mac_address(const char *str, uint8_t *enaddr); +static void brdsetup(void); +static void iomux(int, const char *); extern void* dm9k_init(unsigned int tag, void *macaddr); @@ -95,6 +97,7 @@ extern void netif_match(unsigned int tag /* extern int sdif_init(unsigned int tag);*/ /* Global variables */ +uint32_t socmodel; int pclk; struct btinfo_rootdevice bi_rdev; @@ -117,6 +120,10 @@ main(int argc, char *argv[]) bool kernel_loaded; uint8_t enaddr[6] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + socmodel = CSR_READ(S3C2440_GPIO_BASE + GPIO_GSTATUS1); + + brdsetup(); + /* Give some indication that main() has been reached */ CLEAR_LEDS(); LED_ON(4); @@ -144,6 +151,14 @@ main(int argc, char *argv[]) /* Let the user know we are alive */ printf("\n"); printf(">> %s boot2440, revision %s\n", bootprog_name, bootprog_rev); + printf("SoC model:"); + switch (socmodel) { + case 0x32440000: + printf(" S3C2440"); break; + case 0x32440001: + printf(" S3C2440A"); break; + } + printf(" (chipid %08x)\n", socmodel); bootinfo = (void*) BOOTINFO_ADDR; bi_init(bootinfo); @@ -156,8 +171,6 @@ main(int argc, char *argv[]) struct btinfo_bootstring ba; int j, i; - printf("Argument count: %d\n", argc); - j = 0; for (i = 0; i < argc; i++) { if (j == MAX_BOOT_STRING-1) { @@ -174,9 +187,6 @@ main(int argc, char *argv[]) j += strlen(argv[i]); } } - - printf("Boot string: %s\n", ba.bootstring); - bi_add(&ba, BTINFO_BOOTSTRING, sizeof(ba)); } @@ -534,3 +544,93 @@ parse_mac_address(const char *str, uint8 } } } + +static void +brdsetup(void) +{ +/* + * MINI2440 pin usage summary + * + * B5 output LED1 control + * B6 output LED2 control + * B7 output LED3 control + * B8 output LED4 control + * G0 EINT8 K1 button + * G3 EINT11 K2 button + * G5 EINT13 K3 button + * G6 EINT14 K4 button + * G7 EINT15 K5 button + * G11 EINT19 K6 button + * F7 EINT7 DM9000 interrupt + * G12 EINT20 camera interrupt + * G8 input SD card presense detect + * H8 input SD write protect sense + * B0 TOUT0 buzzer PWM + * B1 TOUT1 LCD backlight PWM + * B2 output UDA1341 audio L3MODE + * B3 output UDA1341 audio L3DATA + * B4 output UDA1341 audio L3LOCK + * + * A21, A11, G15, G14, G13: not used. + * + * i input sense + * o output control + * 2 function 2 + * 3 function 3 + * 0 output control (A only) + * 1 function 1 (A only) + * ./x no function, not connected or don't-care + * + * A ........ .1x11111 1111x111 11111111 + * B .....22o ooooooo2 + * C 22222222 22222222 + * D 22222222 22222222 + * E 22222222 22222222 + * F ........ 22222222 + * G xxx2222i 22232322 + * H .....22i 22222222 + * J ...22222 22222222 + */ + iomux('A', "........ .1x11111 1111x111 11111111"); + iomux('B', ".....22o ooooooo2"); + iomux('C', "22222222 22222222"); + iomux('D', "22222222 22222222"); + iomux('E', "22222222 22222222"); + iomux('F', "........ 22222222"); + iomux('G', "xxx2222i 22232322"); + iomux('H', ".....22i 22222222"); + iomux('J', "...22222 22222222"); + + /* mask all possible external interrupt source [23:3] */ + CSR_WRITE(S3C2440_GPIO_BASE + GPIO_EINTMASK, ~0); +} + +static void +iomux(int grp, const char *cnf) +{ + uint32_t con; + int sft, i, v; + + con = v = 0; + sft = (grp != 'A') ? 2 : 1; + for (i = 0; cnf[i] != '\0'; i++) { + switch (cnf[i]) { + case 'i': + case '0': + case '.': + case 'x': + v = 0; break; + case 'o': + case '1': + v = 1; break; + case '2': + v = 2; break; + case '3': + v = 3; break; + default: + continue; + } + con = (con << sft) | v; + } + CSR_WRITE(S3C2440_GPIO_BASE + 0x10 * (grp - 'A'), con); +}