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);
+}