Merge branch 'master' of git://www.denx.de/git/u-boot-arm

This commit is contained in:
Wolfgang Denk 2007-10-13 18:48:23 +02:00
commit 2885634d64
7 changed files with 222 additions and 314 deletions

View File

@ -66,7 +66,7 @@ void red_LED_off(void)
} }
void LED_init (void) void coloured_LED_init (void)
{ {
AT91PS_PIO PIOB = AT91C_BASE_PIOB; AT91PS_PIO PIOB = AT91C_BASE_PIOB;
AT91PS_PMC PMC = AT91C_BASE_PMC; AT91PS_PMC PMC = AT91C_BASE_PMC;

View File

@ -27,9 +27,7 @@
#include <config.h> #include <config.h>
#include <version.h> #include <version.h>
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF) #include <status_led.h>
#include <led.h>
#endif
/* /*
************************************************************************* *************************************************************************
@ -41,7 +39,7 @@
.globl _start .globl _start
_start: b reset _start: b start_code
ldr pc, _undefined_instruction ldr pc, _undefined_instruction
ldr pc, _software_interrupt ldr pc, _software_interrupt
ldr pc, _prefetch_abort ldr pc, _prefetch_abort
@ -64,7 +62,7 @@ _fiq: .word fiq
/* /*
************************************************************************* *************************************************************************
* *
* Startup Code (reset vector) * Startup Code (called from the ARM reset exception vector)
* *
* do important init only if we don't start from memory! * do important init only if we don't start from memory!
* relocate armboot to ram * relocate armboot to ram
@ -106,10 +104,10 @@ FIQ_STACK_START:
/* /*
* the actual reset code * the actual start code
*/ */
reset: start_code:
/* /*
* set the cpu to SVC32 mode * set the cpu to SVC32 mode
*/ */
@ -118,58 +116,12 @@ reset:
orr r0,r0,#0xd3 orr r0,r0,#0xd3
msr cpsr,r0 msr cpsr,r0
#if CONFIG_AT91RM9200 bl coloured_LED_init
#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
bl LED_init
bl red_LED_on bl red_LED_on
#endif
#ifdef CONFIG_BOOTBINFUNC #if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK) || defined(CONFIG_AT91RM9200DF)
/* code based on entry.S from ATMEL */
#define AT91C_BASE_CKGR 0xFFFFFC20
#define CKGR_MOR 0
/* Get the CKGR Base Address */
ldr r1, =AT91C_BASE_CKGR
/* Main oscillator Enable register APMC_MOR : Enable main oscillator , OSCOUNT = 0xFF */
/* ldr r0, = AT91C_CKGR_MOSCEN:OR:AT91C_CKGR_OSCOUNT */
ldr r0, =0x0000FF01
str r0, [r1, #CKGR_MOR]
/* Add loop to compensate Main Oscillator startup time */
ldr r0, =0x00000010
LoopOsc:
subs r0, r0, #1
bhi LoopOsc
/* scratch stack */
ldr r1, =0x00204000
/* Insure word alignment */
bic r1, r1, #3
/* Init stack SYS */
mov sp, r1
/* /*
* This does a lot more than just set up the memory, which * relocate exception table
* is why it's called lowlevelinit
*/
bl lowlevelinit /* in memsetup.S */
bl icache_enable;
/* ------------------------------------
* Read/modify/write CP15 control register
* -------------------------------------
* read cp15 control register (cp15 r1) in r0
* ------------------------------------
*/
mrc p15, 0, r0, c1, c0, 0
/* Reset bit :Little Endian end fast bus mode */
ldr r3, =0xC0000080
/* Set bit :Asynchronous clock mode, Not Fast Bus */
ldr r4, =0xC0000000
bic r0, r0, r3
orr r0, r0, r4
/* write r0 in cp15 control register (cp15 r1) */
mcr p15, 0, r0, c1, c0, 0
#endif /* CONFIG_BOOTBINFUNC */
/*
* relocate exeception table
*/ */
ldr r0, =_start ldr r0, =_start
ldr r1, =0x0 ldr r1, =0x0
@ -181,19 +133,20 @@ copyex:
bne copyex bne copyex
#endif #endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
/* turn off the watchdog */ /* turn off the watchdog */
# if defined(CONFIG_S3C2400) # if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000 # define pWTCON 0x15300000
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */ # define INTMSK 0x14400008 /* Interupt-Controller base addresses */
# define CLKDIVN 0x14800014 /* clock divisor register */ # define CLKDIVN 0x14800014 /* clock divisor register */
#elif defined(CONFIG_S3C2410) #else
# define pWTCON 0x53000000 # define pWTCON 0x53000000
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ # define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
# define INTSUBMSK 0x4A00001C # define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014 /* clock divisor register */ # define CLKDIVN 0x4C000014 /* clock divisor register */
# endif # endif
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
ldr r0, =pWTCON ldr r0, =pWTCON
mov r1, #0x0 mov r1, #0x0
str r1, [r0] str r1, [r0]
@ -226,25 +179,7 @@ copyex:
#endif #endif
#ifdef CONFIG_AT91RM9200 #ifdef CONFIG_AT91RM9200
#ifdef CONFIG_BOOTBINFUNC
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r3-r10} /* copy from source address [r0] */
stmia r1!, {r3-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end addreee [r2] */
ble copy_loop
#endif /* CONFIG_BOOTBINFUNC */
#else
#ifndef CONFIG_SKIP_RELOCATE_UBOOT #ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */ relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */ adr r0, _start /* r0 <- current position of code */
@ -284,27 +219,6 @@ clbss_l:str r2, [r0] /* clear loop... */
cmp r0, r1 cmp r0, r1
ble clbss_l ble clbss_l
#if 0
/* try doing this stuff after the relocation */
ldr r0, =pWTCON
mov r1, #0x0
str r1, [r0]
/*
* mask all IRQs by setting all bits in the INTMR - default
*/
mov r1, #0xffffffff
ldr r0, =INTMR
str r1, [r0]
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
/* END stuff after relocation */
#endif
ldr pc, _start_armboot ldr pc, _start_armboot
_start_armboot: .word start_armboot _start_armboot: .word start_armboot

116
drivers/at45.c Executable file → Normal file
View File

@ -32,13 +32,11 @@ extern void AT91F_SpiEnable(int cs);
#define AT91C_TIMEOUT_WRDY 200000 #define AT91C_TIMEOUT_WRDY 200000
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
/* \fn AT91F_DataFlashSendCommand */ /* \fn AT91F_DataFlashSendCommand */
/* \brief Generic function to send a command to the dataflash */ /* \brief Generic function to send a command to the dataflash */
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashSendCommand( AT91S_DataFlashStatus AT91F_DataFlashSendCommand(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash,
unsigned char OpCode, unsigned char OpCode,
unsigned int CmdSize, unsigned int CmdSize,
unsigned int DataflashAddress) unsigned int DataflashAddress)
@ -50,8 +48,8 @@ AT91S_DataFlashStatus AT91F_DataFlashSendCommand(
/* process the address to obtain page address and byte address */ /* process the address to obtain page address and byte address */
adr = ((DataflashAddress / (pDataFlash->pDevice->pages_size)) << adr = ((DataflashAddress / (pDataFlash->pDevice->pages_size)) <<
pDataFlash->pDevice->page_offset) + (DataflashAddress % pDataFlash->pDevice->page_offset) +
(pDataFlash->pDevice->pages_size)); (DataflashAddress % (pDataFlash->pDevice->pages_size));
/* fill the command buffer */ /* fill the command buffer */
pDataFlash->pDataFlashDesc->command[0] = OpCode; pDataFlash->pDataFlashDesc->command[0] = OpCode;
@ -86,8 +84,8 @@ AT91S_DataFlashStatus AT91F_DataFlashSendCommand(
pDataFlash->pDataFlashDesc->rx_cmd_size = CmdSize; pDataFlash->pDataFlashDesc->rx_cmd_size = CmdSize;
/* send the command and read the data */ /* send the command and read the data */
return AT91F_SpiWrite (pDataFlash->pDataFlashDesc); } return AT91F_SpiWrite(pDataFlash->pDataFlashDesc);
}
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
/* \fn AT91F_DataFlashGetStatus */ /* \fn AT91F_DataFlashGetStatus */
@ -119,13 +117,13 @@ AT91S_DataFlashStatus AT91F_DataFlashGetStatus(AT91PS_DataflashDesc pDesc)
return status; return status;
} }
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
/* \fn AT91F_DataFlashWaitReady */ /* \fn AT91F_DataFlashWaitReady */
/* \brief wait for dataflash ready (bit7 of the status register == 1) */ /* \brief wait for dataflash ready (bit7 of the status register == 1) */
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashWaitReady(AT91PS_DataflashDesc AT91S_DataFlashStatus AT91F_DataFlashWaitReady(AT91PS_DataflashDesc
pDataFlashDesc, unsigned int timeout) pDataFlashDesc,
unsigned int timeout)
{ {
pDataFlashDesc->DataFlash_state = IDLE; pDataFlashDesc->DataFlash_state = IDLE;
@ -141,7 +139,6 @@ pDataFlashDesc, unsigned int timeout)
return DATAFLASH_OK; return DATAFLASH_OK;
} }
/*--------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------*/
/* Function Name : AT91F_DataFlashContinuousRead */ /* Function Name : AT91F_DataFlashContinuousRead */
/* Object : Continuous stream Read */ /* Object : Continuous stream Read */
@ -169,13 +166,12 @@ AT91S_DataFlashStatus AT91F_DataFlashContinuousRead (
pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer; pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer;
pDataFlash->pDataFlashDesc->tx_data_size = sizeToRead; pDataFlash->pDataFlashDesc->tx_data_size = sizeToRead;
status = AT91F_DataFlashSendCommand status = AT91F_DataFlashSendCommand(
(pDataFlash, DB_CONTINUOUS_ARRAY_READ, 8, src); pDataFlash, DB_CONTINUOUS_ARRAY_READ, 8, src);
/* Send the command to the dataflash */ /* Send the command to the dataflash */
return (status); return (status);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Function Name : AT91F_DataFlashPagePgmBuf */ /* Function Name : AT91F_DataFlashPagePgmBuf */
/* Object : Main memory page program thru buffer 1 or buffer 2 */ /* Object : Main memory page program thru buffer 1 or buffer 2 */
@ -185,8 +181,7 @@ AT91S_DataFlashStatus AT91F_DataFlashContinuousRead (
/* : <SizeToWrite> = data buffer size */ /* : <SizeToWrite> = data buffer size */
/* Return value : State of the dataflash */ /* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf( AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash,
unsigned char *src, unsigned char *src,
unsigned int dest, unsigned int dest,
unsigned int SizeToWrite) unsigned int SizeToWrite)
@ -201,9 +196,9 @@ AT91S_DataFlashStatus AT91F_DataFlashPagePgmBuf(
/* Send the command to the dataflash */ /* Send the command to the dataflash */
if (pDataFlash->pDevice->pages_number >= 16384) if (pDataFlash->pDevice->pages_number >= 16384)
cmdsize = 5; cmdsize = 5;
return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_PGM_BUF1, return (AT91F_DataFlashSendCommand(
cmdsize, dest)); } pDataFlash, DB_PAGE_PGM_BUF1, cmdsize, dest));
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Function Name : AT91F_MainMemoryToBufferTransfert */ /* Function Name : AT91F_MainMemoryToBufferTransfert */
@ -214,14 +209,16 @@ cmdsize, dest)); }
/* Return value : State of the dataflash */ /* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert( AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert(
AT91PS_DataFlash pDataFlash, AT91PS_DataFlash
unsigned char BufferCommand, pDataFlash,
unsigned char
BufferCommand,
unsigned int page) unsigned int page)
{ {
int cmdsize; int cmdsize;
/* Test if the buffer command is legal */ /* Test if the buffer command is legal */
if ((BufferCommand != DB_PAGE_2_BUF1_TRF) if ((BufferCommand != DB_PAGE_2_BUF1_TRF)&&
&& (BufferCommand != DB_PAGE_2_BUF2_TRF)) (BufferCommand != DB_PAGE_2_BUF2_TRF))
return DATAFLASH_BAD_COMMAND; return DATAFLASH_BAD_COMMAND;
/* no data to transmit or receive */ /* no data to transmit or receive */
@ -229,11 +226,11 @@ AT91S_DataFlashStatus AT91F_MainMemoryToBufferTransfert(
cmdsize = 4; cmdsize = 4;
if (pDataFlash->pDevice->pages_number >= 16384) if (pDataFlash->pDevice->pages_number >= 16384)
cmdsize = 5; cmdsize = 5;
return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, return (AT91F_DataFlashSendCommand(
pDataFlash, BufferCommand, cmdsize,
page * pDataFlash->pDevice->pages_size)); page * pDataFlash->pDevice->pages_size));
} }
/*-------------------------------------------------------------------------- */ /*-------------------------------------------------------------------------- */
/* Function Name : AT91F_DataFlashWriteBuffer */ /* Function Name : AT91F_DataFlashWriteBuffer */
/* Object : Write data to the internal sram buffer 1 or 2 */ /* Object : Write data to the internal sram buffer 1 or 2 */
@ -253,8 +250,8 @@ AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (
{ {
int cmdsize; int cmdsize;
/* Test if the buffer command is legal */ /* Test if the buffer command is legal */
if ((BufferCommand != DB_BUF1_WRITE) if ((BufferCommand != DB_BUF1_WRITE) &&
&& (BufferCommand != DB_BUF2_WRITE)) (BufferCommand != DB_BUF2_WRITE))
return DATAFLASH_BAD_COMMAND; return DATAFLASH_BAD_COMMAND;
/* buffer address must be lower than page size */ /* buffer address must be lower than page size */
@ -271,14 +268,16 @@ AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (
pDataFlash->pDataFlashDesc->command[2] = 0; pDataFlash->pDataFlashDesc->command[2] = 0;
pDataFlash->pDataFlashDesc->command[3] = pDataFlash->pDataFlashDesc->command[3] =
(unsigned char)(((unsigned int)(bufferAddress & (unsigned char)(((unsigned int)(bufferAddress &
pDataFlash->pDevice->byte_mask)) >> 8); pDataFlash->pDevice->
byte_mask)) >> 8);
pDataFlash->pDataFlashDesc->command[4] = pDataFlash->pDataFlashDesc->command[4] =
(unsigned char)((unsigned int)bufferAddress & 0x00FF); (unsigned char)((unsigned int)bufferAddress & 0x00FF);
cmdsize = 5; cmdsize = 5;
} else { } else {
pDataFlash->pDataFlashDesc->command[2] = pDataFlash->pDataFlashDesc->command[2] =
(unsigned char)(((unsigned int)(bufferAddress & (unsigned char)(((unsigned int)(bufferAddress &
pDataFlash->pDevice->byte_mask)) >> 8); pDataFlash->pDevice->
byte_mask)) >> 8);
pDataFlash->pDataFlashDesc->command[3] = pDataFlash->pDataFlashDesc->command[3] =
(unsigned char)((unsigned int)bufferAddress & 0x00FF); (unsigned char)((unsigned int)bufferAddress & 0x00FF);
pDataFlash->pDataFlashDesc->command[4] = 0; pDataFlash->pDataFlashDesc->command[4] = 0;
@ -320,11 +319,11 @@ AT91S_DataFlashStatus AT91F_PageErase(
cmdsize = 4; cmdsize = 4;
if (pDataFlash->pDevice->pages_number >= 16384) if (pDataFlash->pDevice->pages_number >= 16384)
cmdsize = 5; cmdsize = 5;
return(AT91F_DataFlashSendCommand (pDataFlash, DB_PAGE_ERASE, cmdsize, return (AT91F_DataFlashSendCommand(pDataFlash,
DB_PAGE_ERASE, cmdsize,
page * pDataFlash->pDevice->pages_size)); page * pDataFlash->pDevice->pages_size));
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Function Name : AT91F_BlockErase */ /* Function Name : AT91F_BlockErase */
/* Object : Erase a Block */ /* Object : Erase a Block */
@ -345,7 +344,8 @@ AT91S_DataFlashStatus AT91F_BlockErase(
if (pDataFlash->pDevice->pages_number >= 16384) if (pDataFlash->pDevice->pages_number >= 16384)
cmdsize = 5; cmdsize = 5;
return (AT91F_DataFlashSendCommand(pDataFlash, DB_BLOCK_ERASE, cmdsize, return (AT91F_DataFlashSendCommand(pDataFlash, DB_BLOCK_ERASE, cmdsize,
block*8*pDataFlash->pDevice->pages_size)); block * 8 *
pDataFlash->pDevice->pages_size));
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -356,8 +356,7 @@ block*8*pDataFlash->pDevice->pages_size));
/* : <dest> = main memory address */ /* : <dest> = main memory address */
/* Return value : State of the dataflash */ /* Return value : State of the dataflash */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_WriteBufferToMain ( AT91S_DataFlashStatus AT91F_WriteBufferToMain(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash,
unsigned char BufferCommand, unsigned char BufferCommand,
unsigned int dest) unsigned int dest)
{ {
@ -376,9 +375,9 @@ AT91S_DataFlashStatus AT91F_WriteBufferToMain (
if (pDataFlash->pDevice->pages_number >= 16384) if (pDataFlash->pDevice->pages_number >= 16384)
cmdsize = 5; cmdsize = 5;
/* Send the command to the dataflash */ /* Send the command to the dataflash */
return(AT91F_DataFlashSendCommand (pDataFlash, BufferCommand, cmdsize, return (AT91F_DataFlashSendCommand(pDataFlash, BufferCommand,
dest)); } cmdsize, dest));
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Function Name : AT91F_PartialPageWrite */ /* Function Name : AT91F_PartialPageWrite */
@ -387,8 +386,7 @@ AT91S_DataFlashStatus AT91F_WriteBufferToMain (
/* : <AdrInpage> = adr to begin the fading */ /* : <AdrInpage> = adr to begin the fading */
/* : <length> = Number of bytes to erase */ /* : <length> = Number of bytes to erase */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_PartialPageWrite ( AT91S_DataFlashStatus AT91F_PartialPageWrite(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash,
unsigned char *src, unsigned char *src,
unsigned int dest, unsigned int dest,
unsigned int size) unsigned int size)
@ -400,8 +398,7 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite (
AdrInPage = dest % (pDataFlash->pDevice->pages_size); AdrInPage = dest % (pDataFlash->pDevice->pages_size);
/* Read the contents of the page in the Sram Buffer */ /* Read the contents of the page in the Sram Buffer */
AT91F_MainMemoryToBufferTransfert(pDataFlash, AT91F_MainMemoryToBufferTransfert(pDataFlash, DB_PAGE_2_BUF1_TRF, page);
DB_PAGE_2_BUF1_TRF, page);
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
AT91C_TIMEOUT_WRDY); AT91C_TIMEOUT_WRDY);
/*Update the SRAM buffer */ /*Update the SRAM buffer */
@ -421,7 +418,8 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite (
/* Rewrite the modified Sram Buffer in the main memory */ /* Rewrite the modified Sram Buffer in the main memory */
return (AT91F_WriteBufferToMain(pDataFlash, DB_BUF1_PAGE_ERASE_PGM, return (AT91F_WriteBufferToMain(pDataFlash, DB_BUF1_PAGE_ERASE_PGM,
(page*pDataFlash->pDevice->pages_size))); (page *
pDataFlash->pDevice->pages_size)));
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
@ -431,11 +429,9 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite (
/* : <dest> = dataflash adress */ /* : <dest> = dataflash adress */
/* : <size> = data buffer size */ /* : <size> = data buffer size */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
AT91S_DataFlashStatus AT91F_DataFlashWrite( AT91S_DataFlashStatus AT91F_DataFlashWrite(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash,
unsigned char *src, unsigned char *src,
int dest, int dest, int size)
int size )
{ {
unsigned int length; unsigned int length;
unsigned int page; unsigned int page;
@ -448,12 +444,10 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(
return DATAFLASH_MEMORY_OVERFLOW; return DATAFLASH_MEMORY_OVERFLOW;
/* If destination does not fit a page start address */ /* If destination does not fit a page start address */
if ((dest % ((unsigned int)(pDataFlash->pDevice->pages_size))) != 0 ) if ((dest % ((unsigned int)(pDataFlash->pDevice->pages_size))) != 0) {
{ length =
length = pDataFlash->pDevice->pages_size - pDataFlash->pDevice->pages_size -
(dest % (dest % ((unsigned int)(pDataFlash->pDevice->pages_size)));
((unsigned int)
(pDataFlash->pDevice->pages_size)));
if (size < length) if (size < length)
length = size; length = size;
@ -476,7 +470,8 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(
status = AT91F_DataFlashWriteBuffer(pDataFlash, status = AT91F_DataFlashWriteBuffer(pDataFlash,
DB_BUF1_WRITE, src, 0, DB_BUF1_WRITE, src, 0,
pDataFlash->pDevice->pages_size); pDataFlash->pDevice->
pages_size);
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
AT91C_TIMEOUT_WRDY); AT91C_TIMEOUT_WRDY);
@ -512,18 +507,14 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(
return DATAFLASH_OK; return DATAFLASH_OK;
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/* Function Name : AT91F_DataFlashRead */ /* Function Name : AT91F_DataFlashRead */
/* Object : Read a block in dataflash */ /* Object : Read a block in dataflash */
/* Input Parameters : */ /* Input Parameters : */
/* Return value : */ /* Return value : */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int AT91F_DataFlashRead( int AT91F_DataFlashRead(AT91PS_DataFlash pDataFlash,
AT91PS_DataFlash pDataFlash, unsigned long addr, unsigned long size, char *buffer)
unsigned long addr,
unsigned long size,
char *buffer)
{ {
unsigned long SizeToRead; unsigned long SizeToRead;
@ -537,11 +528,13 @@ int AT91F_DataFlashRead(
SizeToRead = (size < 0x8000) ? size : 0x8000; SizeToRead = (size < 0x8000) ? size : 0x8000;
if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc, if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
AT91C_TIMEOUT_WRDY) != DATAFLASH_OK) AT91C_TIMEOUT_WRDY) !=
DATAFLASH_OK)
return -1; return -1;
if (AT91F_DataFlashContinuousRead(pDataFlash, addr, if (AT91F_DataFlashContinuousRead(pDataFlash, addr,
(uchar *) buffer, SizeToRead) != DATAFLASH_OK) (uchar *) buffer,
SizeToRead) != DATAFLASH_OK)
return -1; return -1;
size -= SizeToRead; size -= SizeToRead;
@ -558,7 +551,8 @@ int AT91F_DataFlashRead(
/* Input Parameters : */ /* Input Parameters : */
/* Return value : Dataflash status register */ /* Return value : Dataflash status register */
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
int AT91F_DataflashProbe(int cs, AT91PS_DataflashDesc pDesc) { int AT91F_DataflashProbe(int cs, AT91PS_DataflashDesc pDesc)
{
AT91F_SpiEnable(cs); AT91F_SpiEnable(cs);
AT91F_DataFlashGetStatus(pDesc); AT91F_DataFlashGetStatus(pDesc);
return ((pDesc->command[1] == 0xFF) ? 0 : pDesc->command[1] & 0x3C); return ((pDesc->command[1] == 0xFF) ? 0 : pDesc->command[1] & 0x3C);

View File

@ -76,6 +76,6 @@
#define CONFIG_CMD_USB /* USB Support */ #define CONFIG_CMD_USB /* USB Support */
#define CONFIG_CMD_VFD /* VFD support (TRAB) */ #define CONFIG_CMD_VFD /* VFD support (TRAB) */
#define CONFIG_CMD_XIMG /* Load part of Multi Image */ #define CONFIG_CMD_XIMG /* Load part of Multi Image */
#define CONFIG_CMD_MUX /* AT91 MMC/SPI Mux Support */ #define CONFIG_CMD_AT91_SPIMUX /* AT91 MMC/SPI Mux Support */
#endif /* _CONFIG_CMD_ALL_H */ #endif /* _CONFIG_CMD_ALL_H */

View File

@ -1,45 +0,0 @@
/*
* (C) Copyright 2006
* Atmel Nordic AB <www.atmel.com>
* Ulf Samuelsson <ulf@atmel.com>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef __LED_H
#define __LED_H
#ifndef __ASSEMBLY__
extern void LED_init (void);
extern void red_LED_on(void);
extern void red_LED_off(void);
extern void green_LED_on(void);
extern void green_LED_off(void);
extern void yellow_LED_on(void);
extern void yellow_LED_off(void);
#else
.extern LED_init
.extern red_LED_on
.extern red_LED_off
.extern yellow_LED_on
.extern yellow_LED_off
.extern green_LED_on
.extern green_LED_off
#endif
#endif

View File

@ -383,6 +383,27 @@ extern void __led_set (led_id_t mask, int state);
# include <asm/status_led.h> # include <asm/status_led.h>
#endif #endif
/*
* Coloured LEDs API
*/
#ifndef __ASSEMBLY__
extern void coloured_LED_init (void);
extern void red_LED_on(void);
extern void red_LED_off(void);
extern void green_LED_on(void);
extern void green_LED_off(void);
extern void yellow_LED_on(void);
extern void yellow_LED_off(void);
#else
.extern LED_init
.extern red_LED_on
.extern red_LED_off
.extern yellow_LED_on
.extern yellow_LED_off
.extern green_LED_on
.extern green_LED_off
#endif
#endif /* CONFIG_STATUS_LED */ #endif /* CONFIG_STATUS_LED */
#endif /* _STATUS_LED_H_ */ #endif /* _STATUS_LED_H_ */

View File

@ -111,6 +111,30 @@ void *sbrk (ptrdiff_t increment)
return ((void *) old); return ((void *) old);
} }
/************************************************************************
* Coloured LED functionality
************************************************************************
* May be supplied by boards if desired
*/
void inline __coloured_LED_init (void) {}
void inline coloured_LED_init (void) __attribute__((weak, alias("__coloured_LED_init")));
void inline __red_LED_on (void) {}
void inline red_LED_on (void) __attribute__((weak, alias("__red_LED_on")));
void inline __red_LED_off(void) {}
void inline red_LED_off(void) __attribute__((weak, alias("__red_LED_off")));
void inline __green_LED_on(void) {}
void inline green_LED_on(void) __attribute__((weak, alias("__green_LED_on")));
void inline __green_LED_off(void) {}
void inline green_LED_off(void)__attribute__((weak, alias("__green_LED_off")));
void inline __yellow_LED_on(void) {}
void inline yellow_LED_on(void)__attribute__((weak, alias("__yellow_LED_on")));
void inline __yellow_LED_off(void) {}
void inline yellow_LED_off(void)__attribute__((weak, alias("__yellow_LED_off")));
/************************************************************************ /************************************************************************
* Init Utilities * * Init Utilities *
************************************************************************ ************************************************************************