=================================================================== RCS file: /cvs/funnyos/arch/sam7s64/config.c,v retrieving revision 1.5 retrieving revision 1.15 diff -u -r1.5 -r1.15 --- funnyos/arch/sam7s64/config.c 2007/11/13 22:40:33 1.5 +++ funnyos/arch/sam7s64/config.c 2007/12/20 15:38:46 1.15 @@ -1,14 +1,11 @@ /* - * $Id: config.c,v 1.5 2007/11/13 22:40:33 nbrk Exp $ + * $Id: config.c,v 1.15 2007/12/20 15:38:46 nbrk Exp $ */ #include #include -/* devices' regs that we will touch in config_machineinit() */ -#include -#include -#include -#include +#include +#include /* * Configuration file for platform (AT91SAM7S64). @@ -18,10 +15,16 @@ extern struct driver root_dr; extern struct driver cpu_dr; extern struct driver saapbus_dr; +extern struct driver sapio_dr; +extern struct driver gpioled_dr; +extern struct driver saaic_dr; +extern struct driver sartt_dr; +extern struct driver gpiobtn_dr; +extern struct driver saspi_dr; -extern void(*putchar)(char); -void sauart_early_putc(char ch); +extern void (*putchar)(char); +extern void sausart_early_putchar(char ch); /* amount of physical memory, in Bytes */ uint32_t physmem = 16384 /* 16KB :) */; @@ -31,9 +34,17 @@ */ struct attachinfo config_attachinfo[] = { /* child, parent, pminor, loc, intrno, flags */ - { "cpu" , "root", 0, 0, 0, 0 }, - { "saapbus","root", 0, 0, 0, 0 }, - { NULL, NULL, 0, 0, 0, 0 } + { "cpu" , "root", 0, 0, -1, 0 }, + { "saapbus","root", 0, 0, -1, 0 }, + { "sapio", "saapbus", 0, 0, -1, 0 }, + { "gpioled","sapio", 0, 17, -1, 0 }, + { "gpioled","sapio", 0, 18, -1, 0 }, + { "gpiobtn","sapio", 0, 19, 0, 0 /*controls gpioled/0*/}, + { "gpiobtn","sapio", 0, 20, 30, 0 /*controls gpioled/1*/}, +// { "sartt", "saapbus", 0, 0, 1, 0 }, + { "saspi", "saapbus", 0, 0, 0, 0 }, +// { "saaic", "saapbus", 0, 0, -1, 0 }, + { NULL, NULL, 0, 0, -1, 0 } }; @@ -45,6 +56,12 @@ { "root", &root_dr, -1 }, { "cpu" , &cpu_dr, -1 }, { "saapbus" , &saapbus_dr, -1 }, + { "sapio", &sapio_dr, -1 }, + { "gpioled", &gpioled_dr, -1 }, + { "saaic", &saaic_dr, -1 }, + { "sartt", &sartt_dr, -1 }, + { "gpiobtn", &gpiobtn_dr, -1 }, + { "saspi", &saspi_dr, -1 }, { NULL, NULL, 0 } }; @@ -59,56 +76,88 @@ /* * Initialize critical devices at startup. */ + __cpu_disable_irq(); - /* XXX kill all magic here */ - /* disable watchdog */ - *(uint32_t)(SAWDT_BASE + SAWDT_WDT_MR) |= 0x00001000 /* WDDIS */; + *AT91C_WDTC_WDMR = AT91C_WDTC_WDDIS; - /* "Start up time = 8 * OSCOUNT / SLCK" (slow clock cycles) */ - (uint32_t)(SAPMC_BASE + SAPMC_CKGR_MOR) = 0x00000701; - /* wait main osc. to stabilize.. */ - while (! *(uint32_t)(SAPMC_BASE + SAPMC_PMC_SR) & 0x00000001 ) + /* set FLASH to high-speed */ + *AT91C_MC_FMR = AT91C_MC_FWS_0FWS; + + /* enable user RESET (magic button on board) */ + *AT91C_RSTC_RMR = AT91C_RSTC_URSTEN | AT91C_RSTC_KEY; + + /* + * Initialize oscillators. + * Taken from Atmel's examples. + */ + /* Set MCK at 48 054 850 */ + + /* 1 Enabling the Main Oscillator */ + /* SCK = 1/32768 = 30.51 uSecond + * Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms + */ + *AT91C_PMC_MOR = ( (AT91C_CKGR_OSCOUNT & (0x06 <<8)) | AT91C_CKGR_MOSCEN); + + /* Wait the startup time */ + while(!(*AT91C_PMC_SR & AT91C_PMC_MOSCS)) ; - /* set PLL */ - *(uint32_t)(SAPMC_BASE + SAPMC_CKGR_PLLR) = 0x00040805; - /* wait.. */ - while(! *(uint32_t)(SAPMC_BASE + SAPMC_PMC_SR) & 0x00000004) + /* 2 Checking the Main Oscillator Frequency (Optional) */ + /* TODO */ + + /* 3 Setting PLL and divider: */ + /* - div by 14 Fin = 1.3165 =(18,432 / 14) + * - Mul 72+1: Fout = 96.1097 =(3,6864 *73) + * for 96 MHz the erroe is 0.11% + * Field out NOT USED = 0 + * PLLCOUNT pll startup time estimate at : 0.844 ms + * PLLCOUNT 28 = 0.000844 /(1/32768) + */ + *AT91C_PMC_PLLR = ( (AT91C_CKGR_DIV & 14 ) | + (AT91C_CKGR_PLLCOUNT & (28<<8)) | + (AT91C_CKGR_MUL & (72<<16)) ); + + /* Wait the startup time */ + while(!(*AT91C_PMC_SR & AT91C_PMC_LOCK)) ; - while(! *(uint32_t)(SAPMC_BASE + SAPMC_PMC_SR) & 0x00000008 /* MCKRDY */) + while(!(*AT91C_PMC_SR & AT91C_PMC_MCKRDY)) ; - /* select Master Clock and Processor Clock; select (PLL clock / 2) */ - *(uint32_t)(SAPMC_BASE + SAPMC_PMC_MCKR) = 0x00000003 /* PLL in CSS */ | 0x00000004 /* presc. = 2 */; - /* wait.. */ - while(! *(uint32_t)(SAPMC_BASE + SAPMC_PMC_SR) & 0x00000008) + /* 4. Selection of Master Clock and Processor Clock */ + /* select the PLL clock divided by 2: */ + *AT91C_PMC_MCKR = AT91C_PMC_PRES_CLK_2; + while(!(*AT91C_PMC_SR & AT91C_PMC_MCKRDY)) ; - /* - * Initialize USART0. - */ - /* disable PIO from controlling RXD0/TXD0 pins (USART0 at Periph. A) */ - *(uint32_t)(SAPIO_BASE + SAPIO_PIO_PDR) = 0x00000030 /* PIN5 | PIN6 */ - /* select this pins in Peripheral A */ - *(uint32_t)(SAPIO_BASE + SAPIO_PIO_ASR) = 0x00000030 /* now, RXD0 | TXD0 */ + *AT91C_PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; + while(!(*AT91C_PMC_SR & AT91C_PMC_MCKRDY)) + ; - /* enable clock to USART0 */ - *(uint32_t)(SAPMC_BASE + SAPMC_PMC_PCER) = 0x00000006 /* 6 is ID of USART0 */ + /* enable clock to all modules */ + *AT91C_PMC_PCER = AT91C_ALL_INT; + + /* initialize USART0 (we clock it in PMC above) */ - /* set baud rate */ - *(uint32_t)(SAUSART_0_BASE + SAUSART_US_BRGR) = 313 /* XXX (48000000 / 9600 * 16) */ + *AT91C_PIOA_PDR = AT91C_PA5_RXD0 | /* Enable RxD0 Pin */ + AT91C_PA6_TXD0; /* Enalbe TxD0 Pin */ - /* select usart mode */ - *(uint32_t)(SAUSART_0_BASE + SAUSART_US_MR) = 0x000008c0 /* XXX eleminate magic */ + *AT91C_US0_MR = AT91C_US_USMODE_NORMAL | /* Normal Mode */ + AT91C_US_CLKS_CLOCK | /* Clock = MCK */ + AT91C_US_CHRL_8_BITS | /* 8-bit Data */ + AT91C_US_PAR_NONE | /* No Parity */ + AT91C_US_NBSTOP_1_BIT; /* 1 Stop Bit */ - /* TODO enable DMA transfers for TX/RX in PDC */ + *AT91C_US0_BRGR = 48054857 / 16 / 9600; /* Baud Rate Divisor */ - /* enable transmitter/receiver */ - *(uint32_t)(SAUSART_0_BASE + SAUSART_US_CR) = 0x00000050 /* TXEN | RXEN */ + /* enable DMA transfers on USART0 */ + *AT91C_US0_PTCR = AT91C_PDC_TXTEN | AT91C_PDC_RXTEN; - /* TODO redefine putchar */ - //putchar = sausart_0_putchar; + *AT91C_US0_CR = AT91C_US_RXEN | /* Receiver Enable */ + AT91C_US_TXEN; /* Transmitter Enable */ + + /* redefine putchar */ + putchar = sausart_early_putchar; }