Merge branch 'master' of git://www.denx.de/git/u-boot-arm
This commit is contained in:
commit
2885634d64
@ -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;
|
||||||
|
|||||||
@ -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
|
||||||
|
|
||||||
/* turn off the watchdog */
|
|
||||||
#if defined(CONFIG_S3C2400)
|
|
||||||
# define pWTCON 0x15300000
|
|
||||||
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
|
|
||||||
# define CLKDIVN 0x14800014 /* clock divisor register */
|
|
||||||
#elif defined(CONFIG_S3C2410)
|
|
||||||
# define pWTCON 0x53000000
|
|
||||||
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
|
|
||||||
# define INTSUBMSK 0x4A00001C
|
|
||||||
# define CLKDIVN 0x4C000014 /* clock divisor register */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
|
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)
|
||||||
|
/* turn off the watchdog */
|
||||||
|
|
||||||
|
# if defined(CONFIG_S3C2400)
|
||||||
|
# define pWTCON 0x15300000
|
||||||
|
# define INTMSK 0x14400008 /* Interupt-Controller base addresses */
|
||||||
|
# define CLKDIVN 0x14800014 /* clock divisor register */
|
||||||
|
#else
|
||||||
|
# define pWTCON 0x53000000
|
||||||
|
# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */
|
||||||
|
# define INTSUBMSK 0x4A00001C
|
||||||
|
# define CLKDIVN 0x4C000014 /* clock divisor register */
|
||||||
|
# endif
|
||||||
|
|
||||||
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
|
||||||
|
|||||||
314
drivers/at45.c
Executable file → Normal file
314
drivers/at45.c
Executable file → Normal file
@ -27,33 +27,31 @@
|
|||||||
/*
|
/*
|
||||||
* spi.c API
|
* spi.c API
|
||||||
*/
|
*/
|
||||||
extern unsigned int AT91F_SpiWrite (AT91PS_DataflashDesc pDesc);
|
extern unsigned int AT91F_SpiWrite(AT91PS_DataflashDesc pDesc);
|
||||||
extern void AT91F_SpiEnable(int cs);
|
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)
|
|
||||||
{
|
{
|
||||||
unsigned int adr;
|
unsigned int adr;
|
||||||
|
|
||||||
if ( (pDataFlash->pDataFlashDesc->state) != IDLE)
|
if ((pDataFlash->pDataFlashDesc->state) != IDLE)
|
||||||
return DATAFLASH_BUSY;
|
return DATAFLASH_BUSY;
|
||||||
|
|
||||||
/* 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;
|
||||||
if (pDataFlash->pDevice->pages_number >= 16384) {
|
if (pDataFlash->pDevice->pages_number >= 16384) {
|
||||||
pDataFlash->pDataFlashDesc->command[1] =
|
pDataFlash->pDataFlashDesc->command[1] =
|
||||||
@ -78,16 +76,16 @@ AT91S_DataFlashStatus AT91F_DataFlashSendCommand(
|
|||||||
pDataFlash->pDataFlashDesc->command[7] = 0;
|
pDataFlash->pDataFlashDesc->command[7] = 0;
|
||||||
|
|
||||||
/* Initialize the SpiData structure for the spi write fuction */
|
/* Initialize the SpiData structure for the spi write fuction */
|
||||||
pDataFlash->pDataFlashDesc->tx_cmd_pt =
|
pDataFlash->pDataFlashDesc->tx_cmd_pt =
|
||||||
pDataFlash->pDataFlashDesc->command;
|
pDataFlash->pDataFlashDesc->command;
|
||||||
pDataFlash->pDataFlashDesc->tx_cmd_size = CmdSize;
|
pDataFlash->pDataFlashDesc->tx_cmd_size = CmdSize;
|
||||||
pDataFlash->pDataFlashDesc->rx_cmd_pt =
|
pDataFlash->pDataFlashDesc->rx_cmd_pt =
|
||||||
pDataFlash->pDataFlashDesc->command;
|
pDataFlash->pDataFlashDesc->command;
|
||||||
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 */
|
||||||
@ -98,50 +96,49 @@ AT91S_DataFlashStatus AT91F_DataFlashGetStatus(AT91PS_DataflashDesc pDesc)
|
|||||||
AT91S_DataFlashStatus status;
|
AT91S_DataFlashStatus status;
|
||||||
|
|
||||||
/* if a transfert is in progress ==> return 0 */
|
/* if a transfert is in progress ==> return 0 */
|
||||||
if( (pDesc->state) != IDLE)
|
if ((pDesc->state) != IDLE)
|
||||||
return DATAFLASH_BUSY;
|
return DATAFLASH_BUSY;
|
||||||
|
|
||||||
/* first send the read status command (D7H) */
|
/* first send the read status command (D7H) */
|
||||||
pDesc->command[0] = DB_STATUS;
|
pDesc->command[0] = DB_STATUS;
|
||||||
pDesc->command[1] = 0;
|
pDesc->command[1] = 0;
|
||||||
|
|
||||||
pDesc->DataFlash_state = GET_STATUS;
|
pDesc->DataFlash_state = GET_STATUS;
|
||||||
pDesc->tx_data_size = 0; /* Transmit the command */
|
pDesc->tx_data_size = 0; /* Transmit the command */
|
||||||
/* and receive response */
|
/* and receive response */
|
||||||
pDesc->tx_cmd_pt = pDesc->command;
|
pDesc->tx_cmd_pt = pDesc->command;
|
||||||
pDesc->rx_cmd_pt = pDesc->command;
|
pDesc->rx_cmd_pt = pDesc->command;
|
||||||
pDesc->rx_cmd_size = 2;
|
pDesc->rx_cmd_size = 2;
|
||||||
pDesc->tx_cmd_size = 2;
|
pDesc->tx_cmd_size = 2;
|
||||||
status = AT91F_SpiWrite (pDesc);
|
status = AT91F_SpiWrite(pDesc);
|
||||||
|
|
||||||
pDesc->DataFlash_state = *( (unsigned char *) (pDesc->rx_cmd_pt) +1);
|
pDesc->DataFlash_state = *((unsigned char *)(pDesc->rx_cmd_pt) + 1);
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
AT91F_DataFlashGetStatus(pDataFlashDesc);
|
AT91F_DataFlashGetStatus(pDataFlashDesc);
|
||||||
timeout--;
|
timeout--;
|
||||||
} while( ((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) &&
|
} while (((pDataFlashDesc->DataFlash_state & 0x80) != 0x80) &&
|
||||||
(timeout > 0) );
|
(timeout > 0));
|
||||||
|
|
||||||
if((pDataFlashDesc->DataFlash_state & 0x80) != 0x80)
|
if ((pDataFlashDesc->DataFlash_state & 0x80) != 0x80)
|
||||||
return DATAFLASH_ERROR;
|
return DATAFLASH_ERROR;
|
||||||
|
|
||||||
return DATAFLASH_OK;
|
return DATAFLASH_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
/* Function Name : AT91F_DataFlashContinuousRead */
|
/* Function Name : AT91F_DataFlashContinuousRead */
|
||||||
/* Object : Continuous stream Read */
|
/* Object : Continuous stream Read */
|
||||||
@ -151,17 +148,17 @@ pDataFlashDesc, unsigned int timeout)
|
|||||||
/* : <sizeToRead> = data buffer size */
|
/* : <sizeToRead> = data buffer size */
|
||||||
/* Return value : State of the dataflash */
|
/* Return value : State of the dataflash */
|
||||||
/*--------------------------------------------------------------------------*/
|
/*--------------------------------------------------------------------------*/
|
||||||
AT91S_DataFlashStatus AT91F_DataFlashContinuousRead (
|
AT91S_DataFlashStatus AT91F_DataFlashContinuousRead(
|
||||||
AT91PS_DataFlash pDataFlash,
|
AT91PS_DataFlash pDataFlash,
|
||||||
int src,
|
int src,
|
||||||
unsigned char *dataBuffer,
|
unsigned char *dataBuffer,
|
||||||
int sizeToRead )
|
int sizeToRead)
|
||||||
{
|
{
|
||||||
AT91S_DataFlashStatus status;
|
AT91S_DataFlashStatus status;
|
||||||
/* Test the size to read in the device */
|
/* Test the size to read in the device */
|
||||||
if ( (src + sizeToRead) >
|
if ((src + sizeToRead) >
|
||||||
(pDataFlash->pDevice->pages_size *
|
(pDataFlash->pDevice->pages_size *
|
||||||
(pDataFlash->pDevice->pages_number)))
|
(pDataFlash->pDevice->pages_number)))
|
||||||
return DATAFLASH_MEMORY_OVERFLOW;
|
return DATAFLASH_MEMORY_OVERFLOW;
|
||||||
|
|
||||||
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer;
|
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer;
|
||||||
@ -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,11 +181,10 @@ 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)
|
|
||||||
{
|
{
|
||||||
int cmdsize;
|
int cmdsize;
|
||||||
pDataFlash->pDataFlashDesc->tx_data_pt = src;
|
pDataFlash->pDataFlashDesc->tx_data_pt = src;
|
||||||
@ -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 int page)
|
unsigned char
|
||||||
|
BufferCommand,
|
||||||
|
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(
|
||||||
page*pDataFlash->pDevice->pages_size));
|
pDataFlash, BufferCommand, cmdsize,
|
||||||
|
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 */
|
||||||
@ -244,58 +241,60 @@ page*pDataFlash->pDevice->pages_size));
|
|||||||
/* : <SizeToWrite> = data buffer size */
|
/* : <SizeToWrite> = data buffer size */
|
||||||
/* Return value : State of the dataflash */
|
/* Return value : State of the dataflash */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (
|
AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer(
|
||||||
AT91PS_DataFlash pDataFlash,
|
AT91PS_DataFlash pDataFlash,
|
||||||
unsigned char BufferCommand,
|
unsigned char BufferCommand,
|
||||||
unsigned char *dataBuffer,
|
unsigned char *dataBuffer,
|
||||||
unsigned int bufferAddress,
|
unsigned int bufferAddress,
|
||||||
int SizeToWrite )
|
int SizeToWrite)
|
||||||
{
|
{
|
||||||
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 */
|
||||||
if (bufferAddress > pDataFlash->pDevice->pages_size)
|
if (bufferAddress > pDataFlash->pDevice->pages_size)
|
||||||
return DATAFLASH_BAD_ADDRESS;
|
return DATAFLASH_BAD_ADDRESS;
|
||||||
|
|
||||||
if ( (pDataFlash->pDataFlashDesc->state) != IDLE)
|
if ((pDataFlash->pDataFlashDesc->state) != IDLE)
|
||||||
return DATAFLASH_BUSY;
|
return DATAFLASH_BUSY;
|
||||||
|
|
||||||
/* Send first Write Command */
|
/* Send first Write Command */
|
||||||
pDataFlash->pDataFlashDesc->command[0] = BufferCommand;
|
pDataFlash->pDataFlashDesc->command[0] = BufferCommand;
|
||||||
pDataFlash->pDataFlashDesc->command[1] = 0;
|
pDataFlash->pDataFlashDesc->command[1] = 0;
|
||||||
if (pDataFlash->pDevice->pages_number >= 16384) {
|
if (pDataFlash->pDevice->pages_number >= 16384) {
|
||||||
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->
|
||||||
pDataFlash->pDataFlashDesc->command[4] =
|
byte_mask)) >> 8);
|
||||||
(unsigned char)((unsigned int)bufferAddress & 0x00FF);
|
pDataFlash->pDataFlashDesc->command[4] =
|
||||||
|
(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->
|
||||||
pDataFlash->pDataFlashDesc->command[3] =
|
byte_mask)) >> 8);
|
||||||
(unsigned char)((unsigned int)bufferAddress & 0x00FF);
|
pDataFlash->pDataFlashDesc->command[3] =
|
||||||
pDataFlash->pDataFlashDesc->command[4] = 0;
|
(unsigned char)((unsigned int)bufferAddress & 0x00FF);
|
||||||
|
pDataFlash->pDataFlashDesc->command[4] = 0;
|
||||||
cmdsize = 4;
|
cmdsize = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
pDataFlash->pDataFlashDesc->tx_cmd_pt =
|
pDataFlash->pDataFlashDesc->tx_cmd_pt =
|
||||||
pDataFlash->pDataFlashDesc->command;
|
pDataFlash->pDataFlashDesc->command;
|
||||||
pDataFlash->pDataFlashDesc->tx_cmd_size = cmdsize;
|
pDataFlash->pDataFlashDesc->tx_cmd_size = cmdsize;
|
||||||
pDataFlash->pDataFlashDesc->rx_cmd_pt =
|
pDataFlash->pDataFlashDesc->rx_cmd_pt =
|
||||||
pDataFlash->pDataFlashDesc->command;
|
pDataFlash->pDataFlashDesc->command;
|
||||||
pDataFlash->pDataFlashDesc->rx_cmd_size = cmdsize;
|
pDataFlash->pDataFlashDesc->rx_cmd_size = cmdsize;
|
||||||
|
|
||||||
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer;
|
pDataFlash->pDataFlashDesc->rx_data_pt = dataBuffer;
|
||||||
pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer;
|
pDataFlash->pDataFlashDesc->tx_data_pt = dataBuffer;
|
||||||
pDataFlash->pDataFlashDesc->rx_data_size = SizeToWrite;
|
pDataFlash->pDataFlashDesc->rx_data_size = SizeToWrite;
|
||||||
pDataFlash->pDataFlashDesc->tx_data_size = SizeToWrite;
|
pDataFlash->pDataFlashDesc->tx_data_size = SizeToWrite;
|
||||||
|
|
||||||
return AT91F_SpiWrite(pDataFlash->pDataFlashDesc);
|
return AT91F_SpiWrite(pDataFlash->pDataFlashDesc);
|
||||||
}
|
}
|
||||||
@ -309,22 +308,22 @@ AT91S_DataFlashStatus AT91F_DataFlashWriteBuffer (
|
|||||||
/* Return value : State of the dataflash */
|
/* Return value : State of the dataflash */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
AT91S_DataFlashStatus AT91F_PageErase(
|
AT91S_DataFlashStatus AT91F_PageErase(
|
||||||
AT91PS_DataFlash pDataFlash,
|
AT91PS_DataFlash pDataFlash,
|
||||||
unsigned int page)
|
unsigned int page)
|
||||||
{
|
{
|
||||||
int cmdsize;
|
int cmdsize;
|
||||||
/* Test if the buffer command is legal */
|
/* Test if the buffer command is legal */
|
||||||
/* no data to transmit or receive */
|
/* no data to transmit or receive */
|
||||||
pDataFlash->pDataFlashDesc->tx_data_size = 0;
|
pDataFlash->pDataFlashDesc->tx_data_size = 0;
|
||||||
|
|
||||||
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,
|
||||||
page*pDataFlash->pDevice->pages_size));
|
DB_PAGE_ERASE, cmdsize,
|
||||||
|
page * pDataFlash->pDevice->pages_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
/* Function Name : AT91F_BlockErase */
|
/* Function Name : AT91F_BlockErase */
|
||||||
/* Object : Erase a Block */
|
/* Object : Erase a Block */
|
||||||
@ -334,18 +333,19 @@ page*pDataFlash->pDevice->pages_size));
|
|||||||
/* Return value : State of the dataflash */
|
/* Return value : State of the dataflash */
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
AT91S_DataFlashStatus AT91F_BlockErase(
|
AT91S_DataFlashStatus AT91F_BlockErase(
|
||||||
AT91PS_DataFlash pDataFlash,
|
AT91PS_DataFlash pDataFlash,
|
||||||
unsigned int block)
|
unsigned int block)
|
||||||
{
|
{
|
||||||
int cmdsize;
|
int cmdsize;
|
||||||
/* Test if the buffer command is legal */
|
/* Test if the buffer command is legal */
|
||||||
/* no data to transmit or receive */
|
/* no data to transmit or receive */
|
||||||
pDataFlash->pDataFlashDesc->tx_data_size = 0;
|
pDataFlash->pDataFlashDesc->tx_data_size = 0;
|
||||||
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_BLOCK_ERASE,cmdsize,
|
return (AT91F_DataFlashSendCommand(pDataFlash, DB_BLOCK_ERASE, cmdsize,
|
||||||
block*8*pDataFlash->pDevice->pages_size));
|
block * 8 *
|
||||||
|
pDataFlash->pDevice->pages_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------*/
|
||||||
@ -356,17 +356,16 @@ 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 )
|
|
||||||
{
|
{
|
||||||
int cmdsize;
|
int cmdsize;
|
||||||
/* Test if the buffer command is correct */
|
/* Test if the buffer command is correct */
|
||||||
if ((BufferCommand != DB_BUF1_PAGE_PGM) &&
|
if ((BufferCommand != DB_BUF1_PAGE_PGM) &&
|
||||||
(BufferCommand != DB_BUF1_PAGE_ERASE_PGM) &&
|
(BufferCommand != DB_BUF1_PAGE_ERASE_PGM) &&
|
||||||
(BufferCommand != DB_BUF2_PAGE_PGM) &&
|
(BufferCommand != DB_BUF2_PAGE_PGM) &&
|
||||||
(BufferCommand != DB_BUF2_PAGE_ERASE_PGM) )
|
(BufferCommand != DB_BUF2_PAGE_ERASE_PGM))
|
||||||
return DATAFLASH_BAD_COMMAND;
|
return DATAFLASH_BAD_COMMAND;
|
||||||
|
|
||||||
/* no data to transmit or receive */
|
/* no data to transmit or receive */
|
||||||
@ -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,11 +386,10 @@ 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)
|
|
||||||
{
|
{
|
||||||
unsigned int page;
|
unsigned int page;
|
||||||
unsigned int AdrInPage;
|
unsigned int AdrInPage;
|
||||||
@ -400,10 +398,9 @@ 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 */
|
||||||
AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src,
|
AT91F_DataFlashWriteBuffer(pDataFlash, DB_BUF1_WRITE, src,
|
||||||
AdrInPage, size);
|
AdrInPage, size);
|
||||||
@ -416,12 +413,13 @@ AT91S_DataFlashStatus AT91F_PartialPageWrite (
|
|||||||
AT91F_PageErase(pDataFlash, page);
|
AT91F_PageErase(pDataFlash, page);
|
||||||
/* Rewrite the modified Sram Buffer in the main memory */
|
/* Rewrite the modified Sram Buffer in the main memory */
|
||||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY);
|
AT91C_TIMEOUT_WRDY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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 size)
|
||||||
int dest,
|
|
||||||
int size )
|
|
||||||
{
|
{
|
||||||
unsigned int length;
|
unsigned int length;
|
||||||
unsigned int page;
|
unsigned int page;
|
||||||
@ -443,26 +439,24 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(
|
|||||||
|
|
||||||
AT91F_SpiEnable(pDataFlash->pDevice->cs);
|
AT91F_SpiEnable(pDataFlash->pDevice->cs);
|
||||||
|
|
||||||
if ( (dest + size) > (pDataFlash->pDevice->pages_size *
|
if ((dest + size) > (pDataFlash->pDevice->pages_size *
|
||||||
(pDataFlash->pDevice->pages_number)))
|
(pDataFlash->pDevice->pages_number)))
|
||||||
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;
|
||||||
|
|
||||||
if(!AT91F_PartialPageWrite(pDataFlash,src, dest, length))
|
if (!AT91F_PartialPageWrite(pDataFlash, src, dest, length))
|
||||||
return DATAFLASH_ERROR;
|
return DATAFLASH_ERROR;
|
||||||
|
|
||||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY);
|
AT91C_TIMEOUT_WRDY);
|
||||||
|
|
||||||
/* Update size, source and destination pointers */
|
/* Update size, source and destination pointers */
|
||||||
size -= length;
|
size -= length;
|
||||||
@ -470,78 +464,77 @@ AT91S_DataFlashStatus AT91F_DataFlashWrite(
|
|||||||
src += length;
|
src += length;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (( size - pDataFlash->pDevice->pages_size ) >= 0 ) {
|
while ((size - pDataFlash->pDevice->pages_size) >= 0) {
|
||||||
/* program dataflash page */
|
/* program dataflash page */
|
||||||
page = (unsigned int)dest / (pDataFlash->pDevice->pages_size);
|
page = (unsigned int)dest / (pDataFlash->pDevice->pages_size);
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
status = AT91F_PageErase(pDataFlash, page);
|
status = AT91F_PageErase(pDataFlash, page);
|
||||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY);
|
AT91C_TIMEOUT_WRDY);
|
||||||
if (!status)
|
if (!status)
|
||||||
return DATAFLASH_ERROR;
|
return DATAFLASH_ERROR;
|
||||||
|
|
||||||
status = AT91F_WriteBufferToMain (pDataFlash,
|
status = AT91F_WriteBufferToMain(pDataFlash,
|
||||||
DB_BUF1_PAGE_PGM, dest);
|
DB_BUF1_PAGE_PGM, dest);
|
||||||
if(!status)
|
if (!status)
|
||||||
return DATAFLASH_ERROR;
|
return DATAFLASH_ERROR;
|
||||||
|
|
||||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY);
|
AT91C_TIMEOUT_WRDY);
|
||||||
|
|
||||||
/* Update size, source and destination pointers */
|
/* Update size, source and destination pointers */
|
||||||
size -= pDataFlash->pDevice->pages_size;
|
size -= pDataFlash->pDevice->pages_size;
|
||||||
dest += pDataFlash->pDevice->pages_size;
|
dest += pDataFlash->pDevice->pages_size;
|
||||||
src += pDataFlash->pDevice->pages_size;
|
src += pDataFlash->pDevice->pages_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If still some bytes to read */
|
/* If still some bytes to read */
|
||||||
if ( size > 0 ) {
|
if (size > 0) {
|
||||||
/* program dataflash page */
|
/* program dataflash page */
|
||||||
if(!AT91F_PartialPageWrite(pDataFlash, src, dest, size) )
|
if (!AT91F_PartialPageWrite(pDataFlash, src, dest, size))
|
||||||
return DATAFLASH_ERROR;
|
return DATAFLASH_ERROR;
|
||||||
|
|
||||||
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY);
|
AT91C_TIMEOUT_WRDY);
|
||||||
}
|
}
|
||||||
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;
|
||||||
|
|
||||||
AT91F_SpiEnable(pDataFlash->pDevice->cs);
|
AT91F_SpiEnable(pDataFlash->pDevice->cs);
|
||||||
|
|
||||||
if(AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
if (AT91F_DataFlashWaitReady(pDataFlash->pDataFlashDesc,
|
||||||
AT91C_TIMEOUT_WRDY) != DATAFLASH_OK)
|
AT91C_TIMEOUT_WRDY) != DATAFLASH_OK)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (size) {
|
while (size) {
|
||||||
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,9 +551,10 @@ 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);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -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 */
|
||||||
|
|||||||
@ -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
|
|
||||||
@ -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_ */
|
||||||
|
|||||||
@ -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 *
|
||||||
************************************************************************
|
************************************************************************
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user