diff options
| -rw-r--r-- | CHANGELOG | 5 | ||||
| -rw-r--r-- | board/cmc_pu2/cmc_pu2.c | 78 | ||||
| -rw-r--r-- | include/asm-arm/arch-at91rm9200/AT91RM9200.h | 4 | ||||
| -rw-r--r-- | lib_arm/board.c | 2 | 
4 files changed, 84 insertions, 5 deletions
| @@ -2,8 +2,9 @@  Changes for U-Boot 1.1.3:  ====================================================================== -* Patch by Martin Krause, 01 Apr 2005: -  Fix flash erase timeout on CMC_PU2 +* Patches by Martin Krause, 01 Apr 2005: +  - Fix flash erase timeout on CMC_PU2 +  - Add automatic HW detection for CMC_PU2 and CMC_BASIC  * Patch by Steven Scholz, 13 March 2005:    fix cache enabling for AT91RM9200 diff --git a/board/cmc_pu2/cmc_pu2.c b/board/cmc_pu2/cmc_pu2.c index f914d4252..8e0f6d3b7 100644 --- a/board/cmc_pu2/cmc_pu2.c +++ b/board/cmc_pu2/cmc_pu2.c @@ -6,6 +6,8 @@   * Modified for CMC_PU2 (removed Smart Media support) by Gary Jennejohn   * (2004) garyj@denx.de   * + * Modified for CMC_BASIC by Martin Krause (2005), TQ-Systems GmbH + *   * See file CREDITS for list of people who contributed to this   * project.   * @@ -33,22 +35,67 @@  /*   * Miscelaneous platform dependent initialisations   */ +#define CMC_BASIC	1 +#define CMC_PU2		2 + +int hw_detect (void);  int board_init (void)  {  	DECLARE_GLOBAL_DATA_PTR; +	AT91PS_PIO piob = AT91C_BASE_PIOB; +	AT91PS_PIO pioc = AT91C_BASE_PIOC;  	/* Enable Ctrlc */  	console_init_f ();  	/* Correct IRDA resistor problem */  	/* Set PA23_TXD in Output */ -	(AT91PS_PIO) AT91C_BASE_PIOA->PIO_OER = AT91C_PA23_TXD2; +	/* (AT91PS_PIO) AT91C_BASE_PIOA->PIO_OER = AT91C_PA23_TXD2; */  	/* memory and cpu-speed are setup before relocation */  	/* so we do _nothing_ here */ -	/* arch number of CMC_PU2-Board */ +	/* PIOB and PIOC clock enabling */ +	*AT91C_PMC_PCER = 1 << AT91C_ID_PIOB; +	*AT91C_PMC_PCER = 1 << AT91C_ID_PIOC; + +	/* +	 * configure PC0-PC3 as input without pull ups, so RS485 driver enable +	 * (CMC-PU2) and digital outputs (CMC-BASIC) are deactivated. +	 */ +	pioc->PIO_ODR = AT91C_PIO_PC0 | AT91C_PIO_PC1 | +			AT91C_PIO_PC2 | AT91C_PIO_PC3; +	pioc->PIO_PPUDR = AT91C_PIO_PC0 | AT91C_PIO_PC1 | +			AT91C_PIO_PC2 | AT91C_PIO_PC3; +	pioc->PIO_PER = AT91C_PIO_PC0 | AT91C_PIO_PC1 | +	        	AT91C_PIO_PC2 | AT91C_PIO_PC3; + +	/* +	 * On CMC-PU2 board configure PB3-PB6 to input without pull ups to +	 * clear the duo LEDs (the external pull downs assure a proper +	 * signal). On CMC-BASIC set PB3-PB6 to output and drive it +	 * high, to configure current meassurement on AINx. +	 */ +	if (hw_detect() & CMC_PU2) { +		piob->PIO_ODR = AT91C_PIO_PB3 | AT91C_PIO_PB4 | +				AT91C_PIO_PB5 | AT91C_PIO_PB6; +	} +	else if (hw_detect() & CMC_BASIC) { +		piob->PIO_SODR = AT91C_PIO_PB3 | AT91C_PIO_PB4 | +				AT91C_PIO_PB5 | AT91C_PIO_PB6; +		piob->PIO_OER = AT91C_PIO_PB3 | AT91C_PIO_PB4 | +				AT91C_PIO_PB5 | AT91C_PIO_PB6; +	} +	piob->PIO_PPUDR = AT91C_PIO_PB3 | AT91C_PIO_PB4 | +			AT91C_PIO_PB5 | AT91C_PIO_PB6; +	piob->PIO_PER = AT91C_PIO_PB3 | AT91C_PIO_PB4 | +			AT91C_PIO_PB5 | AT91C_PIO_PB6; + +	/* +	 * arch number of CMC_PU2-Board. MACH_TYPE_CMC_PU2 is not supported in +	 * the linuxarm kernel, yet. +	 */  	/* gd->bd->bi_arch_number = MACH_TYPE_CMC_PU2; */  	gd->bd->bi_arch_number = 251;  	/* adress of boot parameters */ @@ -65,3 +112,30 @@ int dram_init (void)  	gd->bd->bi_dram[0].size = PHYS_SDRAM_SIZE;  	return 0;  } + +int checkboard (void) +{ +	if (hw_detect() & CMC_PU2) +		puts ("Board: CMC-PU2 (Rittal GmbH)\n"); +	else if (hw_detect() & CMC_BASIC) +		puts ("Board: CMC-BASIC (Rittal GmbH)\n"); +	else +		puts ("Board: unknown\n"); +	return 0; +} + +int hw_detect (void) +{ +	AT91PS_PIO pio = AT91C_BASE_PIOB; + +	/* PIOB clock enabling */ +	*AT91C_PMC_PCER = 1 << AT91C_ID_PIOB; + +	/* configure PB12 as input without pull up */ +	pio->PIO_ODR = AT91C_PIO_PB12; +	pio->PIO_PPUDR = AT91C_PIO_PB12; +	pio->PIO_PER = AT91C_PIO_PB12; + +	/* read board identification pin */ +	return ((pio->PIO_PDSR & AT91C_PIO_PB12) ? CMC_PU2 : CMC_BASIC); +} diff --git a/include/asm-arm/arch-at91rm9200/AT91RM9200.h b/include/asm-arm/arch-at91rm9200/AT91RM9200.h index 07ae1123f..f7e6d555d 100644 --- a/include/asm-arm/arch-at91rm9200/AT91RM9200.h +++ b/include/asm-arm/arch-at91rm9200/AT91RM9200.h @@ -665,6 +665,10 @@ typedef struct _AT91S_PDC {  #define AT91C_PIO_PA7        ((unsigned int) 1 <<  7) /* Pin Controlled by PA7 */  #define AT91C_PA7_ETXCK_EREFCK ((unsigned int) AT91C_PIO_PA7) /*  Ethernet MAC Transmit Clock/Reference Clock */ +#define AT91C_PIO_PB3        ((unsigned int) 1 <<  3) /* Pin Controlled by PB7 */ +#define AT91C_PIO_PB4        ((unsigned int) 1 <<  4) /* Pin Controlled by PB7 */ +#define AT91C_PIO_PB5        ((unsigned int) 1 <<  5) /* Pin Controlled by PB7 */ +#define AT91C_PIO_PB6        ((unsigned int) 1 <<  6) /* Pin Controlled by PB7 */  #define AT91C_PIO_PB7        ((unsigned int) 1 <<  7) /* Pin Controlled by PB7 */  #define AT91C_PIO_PB25       ((unsigned int) 1 << 25) /* Pin Controlled by PB25 */  #define AT91C_PB25_DSR1     ((unsigned int) AT91C_PIO_PB25) /*  USART 1 Data Set ready */ diff --git a/lib_arm/board.c b/lib_arm/board.c index a74fee121..ada8cc887 100644 --- a/lib_arm/board.c +++ b/lib_arm/board.c @@ -198,7 +198,7 @@ init_fnc_t *init_sequence[] = {  	display_banner,		/* say that we are here */  	dram_init,		/* configure available RAM banks */  	display_dram_config, -#if defined(CONFIG_VCMA9) +#if defined(CONFIG_VCMA9) || defined (CONFIG_CMC_PU2)  	checkboard,  #endif  	NULL, |