PERFORCE change 98876 for review
Warner Losh
imp at FreeBSD.org
Fri Jun 9 18:31:21 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=98876
Change 98876 by imp at imp_Speedy on 2006/06/09 18:28:29
[FAST] is bootverbose fodder
Affected files ...
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/Makefile#11 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#11 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/bootspi/main.c#10 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#14 edit
.. //depot/projects/arm/src/sys/boot/arm/at91/ramMonitor/spi_flash.c#3 edit
.. //depot/projects/arm/src/sys/kern/subr_bus.c#7 edit
Differences ...
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/Makefile#11 (text+ko) ====
@@ -2,7 +2,7 @@
P=bootspi
FILES=${P}
-SRCS=arm_init.S main.c loader_prompt.c env_vars.c \
+SRCS=arm_init.S main.c loader_prompt.c env_vars.c
#SRCS+=ints.c mci_device.c sd-card.c stormy16-lib2.c
NO_MAN=
LDFLAGS=-e 0 -T ${.CURDIR}/../linker.cfg
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/loader_prompt.c#11 (text+ko) ====
@@ -47,7 +47,7 @@
#define FPGA_OFFSET (15 * FLASH_PAGE_SIZE)
#define FPGA_LEN (212608)
#define KERNEL_OFFSET (220 * FLASH_PAGE_SIZE)
-#define KERNEL_LEN (3 * 1024 * FLASH_PAGE_SIZE)
+#define KERNEL_LEN (6 * 1024 * FLASH_PAGE_SIZE)
static const char *backspaceString = "\010 \010";
static const command_entry_t CommandTable[] = {
==== //depot/projects/arm/src/sys/boot/arm/at91/bootspi/main.c#10 (text+ko) ====
@@ -48,7 +48,11 @@
printf("\r\nBoot\r\n");
SPI_InitFlash();
#ifdef TSC_FPGA
+ AT91C_BASE_PIOC->PIO_PER = AT91C_PIO_PC7;
+ AT91C_BASE_PIOC->PIO_OER = AT91C_PIO_PC7;
+ AT91C_BASE_PIOC->PIO_CODR = AT91C_PIO_PC7;
fpga_load();
+ AT91C_BASE_PIOC->PIO_SODR = AT91C_PIO_PC7;
#endif
EMAC_Init();
LoadBootCommands();
==== //depot/projects/arm/src/sys/boot/arm/at91/libat91/emac.c#14 (text+ko) ====
@@ -355,7 +355,26 @@
return (pEmac->EMAC_MAN & 0x0000ffff);
}
+#if 0
+/*
+ * .KB_C_FN_DEFINITION_START
+ * unsigned short AT91F_MII_ReadPhy (AT91PS_EMAC pEmac, unsigned char addr)
+ * This private function reads the PHY device.
+ * .KB_C_FN_DEFINITION_END
+ */
+static unsigned short
+AT91F_MII_WritePhy (AT91PS_EMAC pEmac, unsigned char addr, unsigned short s)
+{
+ unsigned value = 0x50020000 | (addr << 18) | s;
+ pEmac->EMAC_CTL |= AT91C_EMAC_MPE;
+ pEmac->EMAC_MAN = value;
+ while(!((pEmac->EMAC_SR) & AT91C_EMAC_IDLE));
+ pEmac->EMAC_CTL &= ~AT91C_EMAC_MPE;
+ return (pEmac->EMAC_MAN & 0x0000ffff);
+}
+#endif
+
/*
* .KB_C_FN_DEFINITION_START
* void MII_GetLinkSpeed(AT91PS_EMAC pEmac)
@@ -367,7 +386,22 @@
{
unsigned short stat2;
unsigned update;
-
+#if 0
+ unsigned sec;
+ int i;
+
+// AT91F_MII_WritePhy(pEmac, 20, 0x70);
+ AT91F_MII_WritePhy(pEmac, 0x0, 0x3300);
+// while (AT91F_MII_ReadPhy(pEmac, 0x0) & (1 << 9));
+ sec = GetSeconds();
+ while (1) {
+ for (i = 0; i <= 0x18; i++)
+ printf("%x ", AT91F_MII_ReadPhy(pEmac, i));
+ printf("\r\n");
+ while (GetSeconds() <= sec + 2) continue;
+ sec = GetSeconds();
+ }
+#endif
stat2 = AT91F_MII_ReadPhy(pEmac, MII_STS2_REG);
if (!(stat2 & 0x400))
return ;
@@ -406,11 +440,10 @@
pEmac->EMAC_CTL = 0;
pEmac->EMAC_CFG = (pEmac->EMAC_CFG & ~(AT91C_EMAC_CLK)) |
- AT91C_EMAC_CLK_HCLK_32 | AT91C_EMAC_CAF
#ifdef BOOT_TSC
- | AT91C_EMAC_RMII
+ AT91C_EMAC_RMII |
#endif
- ;
+ AT91C_EMAC_CLK_HCLK_32 | AT91C_EMAC_CAF;
if (!(pEmac->EMAC_SR & AT91C_EMAC_LINK))
MII_GetLinkSpeed(pEmac);
==== //depot/projects/arm/src/sys/boot/arm/at91/ramMonitor/spi_flash.c#3 (text+ko) ====
@@ -1,359 +1,359 @@
-/*******************************************************************************
- *
- * Filename: spi_flash.c
- *
- * Instantiation of SPI flash control routines supporting AT45DB161B
- *
- * Revision information:
- *
- * 17JAN2005 kb_admin initial creation
- * adapted from external sources
- * tested for basic operation only!!!
- *
- * BEGIN_KBDD_BLOCK
- * No warranty, expressed or implied, is included with this software. It is
- * provided "AS IS" and no warranty of any kind including statutory or aspects
- * relating to merchantability or fitness for any purpose is provided. All
- * intellectual property rights of others is maintained with the respective
- * owners. This software is not copyrighted and is intended for reference
- * only.
- * END_BLOCK
- ******************************************************************************/
-
-#include "AT91RM9200.h"
-
-#include "spi_flash.h"
-#include "prompt.h"
-
-/* ********************** PRIVATE FUNCTIONS/DATA ******************************/
-
-
-static spiCommand_t spi_command;
-static char tx_commandBuffer[8], rx_commandBuffer[8];
-static parse_function_t spiread_function, spiwrite_function;
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void SendCommand(spiCommand_t *pCommand)
- * Private function sends 8-bit value to the device and returns the 8-bit
- * value in response.
- * .KB_C_FN_DEFINITION_END
- */
-static void SendCommand(spiCommand_t *pCommand) {
-
- unsigned value;
-
- AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_TXTDIS + AT91C_PDC_RXTDIS;
-
- AT91C_BASE_SPI->SPI_RPR = (unsigned)pCommand->rx_cmd;
- AT91C_BASE_SPI->SPI_TPR = (unsigned)pCommand->tx_cmd;
-
- AT91C_BASE_SPI->SPI_RCR = pCommand->rx_cmd_size;
- AT91C_BASE_SPI->SPI_TCR = pCommand->tx_cmd_size;
-
- if (pCommand->tx_data_size != 0) {
-
- AT91C_BASE_SPI->SPI_TNPR = (unsigned)pCommand->tx_data;
- AT91C_BASE_SPI->SPI_TNCR = pCommand->tx_data_size;
- AT91C_BASE_SPI->SPI_RNPR = (unsigned)pCommand->rx_data;
- AT91C_BASE_SPI->SPI_RNCR = pCommand->rx_data_size;
- }
-
- AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_TXTEN + AT91C_PDC_RXTEN;
-
- // wait for completion
- while (!((value = AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_SPENDRX)) ;
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * char GetFlashStatus(void)
- * Private function to return device status.
- * .KB_C_FN_DEFINITION_END
- */
-static char GetFlashStatus(void) {
-
- p_memset(tx_commandBuffer, 0, 8);
- tx_commandBuffer[0] = STATUS_REGISTER_READ;
- p_memset(rx_commandBuffer, 0, 8);
- spi_command.tx_data_size = 0;
- spi_command.rx_data_size = 0;
- spi_command.tx_cmd = tx_commandBuffer;
- spi_command.rx_cmd = rx_commandBuffer;
- spi_command.rx_cmd_size = 2;
- spi_command.tx_cmd_size = 2;
- SendCommand(&spi_command);
-
- return (rx_commandBuffer[1]);
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void WaitForDeviceReady(void)
- * Private function to poll until the device is ready for next operation.
- * .KB_C_FN_DEFINITION_END
- */
-static void WaitForDeviceReady(void) {
- while (!(GetFlashStatus() & 0x80)) ;
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void ProgramBuffer(unsigned pageAddress, unsigned byteAddress,
- * unsigned src_addr, unsigned size);
- * Private function to program Flash through the buffer. Note this
- * will corrupt any data on the same page not intended for modification.
- * To preserve this data, read it first, modify it in RAM, then write back
- * data in FLASH_PAGE_SIZE intervals. This also corrupts the data in RAM.
- * .KB_C_FN_DEFINITION_END
- */
-static void ProgramBuffer(unsigned pageAddress, unsigned byteAddress,
- unsigned src_addr, unsigned size) {
-
- p_memset(tx_commandBuffer, 0, 8);
- tx_commandBuffer[0] = PROGRAM_THROUGH_BUFFER;
- tx_commandBuffer[1] = ((pageAddress >> 6) & 0x3F);
- tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) |
- ((byteAddress >> 8) & 0x3);
- tx_commandBuffer[3] = (byteAddress & 0xFF);
-
- p_memset(rx_commandBuffer, 0, 8);
-
- spi_command.tx_cmd = tx_commandBuffer;
- spi_command.rx_cmd = rx_commandBuffer;
- spi_command.rx_cmd_size = 4;
- spi_command.tx_cmd_size = 4;
-
- spi_command.tx_data_size = size;
- spi_command.tx_data = (char*)src_addr;
- spi_command.rx_data_size = size;
- spi_command.rx_data = (char*)src_addr;
-
- SendCommand(&spi_command);
-
- WaitForDeviceReady();
-}
-
-
-/* ************************** GLOBAL FUNCTIONS ********************************/
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void SPI_ReadFlash(unsigned flash_addr, unsigned dest_addr, unsigned size)
- * Global function to read the SPI flash device using the continuous read
- * array command.
- * .KB_C_FN_DEFINITION_END
- */
-void SPI_ReadFlash(unsigned flash_addr, unsigned dest_addr, unsigned size) {
-
- unsigned pageAddress, byteAddress;
-
- // determine page address
- pageAddress = flash_addr / FLASH_PAGE_SIZE;
-
- // determine byte address
- byteAddress = flash_addr % FLASH_PAGE_SIZE;
-
- p_memset(tx_commandBuffer, 0, 8);
- tx_commandBuffer[0] = CONTINUOUS_ARRAY_READ;
- tx_commandBuffer[1] = (pageAddress >> 6) & 0x3F;
- tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) |
- ((byteAddress >> 8) & 0x3);
- tx_commandBuffer[3] = (byteAddress & 0xFF);
-
- p_memset(rx_commandBuffer, 0, 8);
-
- spi_command.tx_cmd = tx_commandBuffer;
- spi_command.rx_cmd = rx_commandBuffer;
- spi_command.rx_cmd_size = 8;
- spi_command.tx_cmd_size = 8;
-
- spi_command.tx_data_size = size;
- spi_command.tx_data = (char*)dest_addr;
- spi_command.rx_data_size = size;
- spi_command.rx_data = (char*)dest_addr;
-
- SendCommand(&spi_command);
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void SPI_WriteFlash(unsigned flash_addr, unsigned src_addr, unsigned size)
- * Global function to program the SPI flash device. Notice the warning
- * provided in lower-level functions regarding corruption of data in non-
- * page aligned write operations.
- * .KB_C_FN_DEFINITION_END
- */
-void SPI_WriteFlash(unsigned flash_addr, unsigned src_addr, unsigned size) {
-
- unsigned pageAddress, byteAddress, this_size;
-
- // determine page address
- pageAddress = flash_addr / FLASH_PAGE_SIZE;
-
- // determine byte address
- byteAddress = flash_addr % FLASH_PAGE_SIZE;
-
- while (size) {
-
- this_size = FLASH_PAGE_SIZE - byteAddress;
- if (this_size > size)
- this_size = size;
-
- // write through buffer to flash
- ProgramBuffer(pageAddress, byteAddress, src_addr, this_size);
-
- size -= this_size;
- src_addr += this_size;
- byteAddress = 0;
- ++pageAddress;
- }
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * int spiread_function_parse(int argc, char *argv[])
- * This global function parses text from the command line.
- * .KB_C_FN_DEFINITION_END
- */
-int spiread_function_parse(int argc, char *argv[]) {
-
- unsigned flash_addr, dest_addr, size;
-
- if (argc < 4) {
- DebugPrint("Missing parameter");
- return (1);
- }
-
- p_ASCIIToHex(argv[1], &flash_addr);
- p_ASCIIToHex(argv[2], &dest_addr);
- p_ASCIIToHex(argv[3], &size);
- SPI_ReadFlash(flash_addr, dest_addr, size);
-
- return (0);
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void spiread_function_help(void)
- * This global displays help info for the corresponding command.
- * .KB_C_FN_DEFINITION_END
- */
-void spiread_function_help(void) {
- DebugPrint("\tRead SPI Flash to memory\n\r");
- DebugPrint("\t\tspi_read <flash_addr> <dest_addr> <size>\n\r");
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * int spiwrite_function_parse(int argc, char *argv[])
- * This global function parses text from the command line.
- * .KB_C_FN_DEFINITION_END
- */
-int spiwrite_function_parse(int argc, char *argv[]) {
-
- unsigned flash_addr, src_addr, size;
-
- if (argc < 4) {
- DebugPrint("Missing parameter");
- return (1);
- }
-
- p_ASCIIToHex(argv[1], &flash_addr);
- p_ASCIIToHex(argv[2], &src_addr);
- p_ASCIIToHex(argv[3], &size);
- SPI_WriteFlash(flash_addr, src_addr, size);
-
- return (0);
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void spiwrite_function_help(void)
- * This global displays help info for the corresponding command.
- * .KB_C_FN_DEFINITION_END
- */
-void spiwrite_function_help(void) {
- DebugPrint("\tWrite memory to SPI Flash\n\r");
- DebugPrint("\t\tspi_read <flash_addr> <src_addr> <size>\n\r");
-}
-
-
-/*
- * .KB_C_FN_DEFINITION_START
- * void SPI_InitFlash(void)
- * Global function to initialize the SPI flash device/accessor functions.
- * .KB_C_FN_DEFINITION_END
- */
-void SPI_InitFlash(void) {
-
- AT91PS_PIO pPio;
- AT91PS_SPI pSPI = AT91C_BASE_SPI;
- unsigned value;
- char initStatus;
-
- // enable CS0, CLK, MOSI, MISO
- pPio = (AT91PS_PIO)AT91C_BASE_PIOA;
- pPio->PIO_ASR = (((unsigned)AT91C_PA3_NPCS0) |
- ((unsigned)AT91C_PA1_MOSI) |
- ((unsigned)AT91C_PA0_MISO) |
- ((unsigned)AT91C_PA2_SPCK));
- pPio->PIO_BSR = 0;
- pPio->PIO_PDR = (((unsigned)AT91C_PA3_NPCS0) |
- ((unsigned)AT91C_PA1_MOSI) |
- ((unsigned)AT91C_PA0_MISO) |
- ((unsigned)AT91C_PA2_SPCK));
-
- // enable clocks to SPI
- AT91C_BASE_PMC->PMC_PCER = ((unsigned) 1 << AT91C_ID_SPI);
-
- // reset the SPI
- pSPI->SPI_CR = AT91C_SPI_SWRST;
-
- pSPI->SPI_MR = ((0xf << 24) | AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | (0xE << 16));
-
- pSPI->SPI_CSR[0] = (AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & (0x4 <<16 )) | (3 << 8));
- pSPI->SPI_CR = AT91C_SPI_SPIEN;
-
- pSPI->SPI_PTCR = AT91C_PDC_TXTDIS;
- pSPI->SPI_PTCR = AT91C_PDC_RXTDIS;
- pSPI->SPI_RNPR = 0;
- pSPI->SPI_RNCR = 0;
- pSPI->SPI_TNPR = 0;
- pSPI->SPI_TNCR = 0;
- pSPI->SPI_RPR = 0;
- pSPI->SPI_RCR = 0;
- pSPI->SPI_TPR = 0;
- pSPI->SPI_TCR = 0;
- pSPI->SPI_PTCR = AT91C_PDC_RXTEN;
- pSPI->SPI_PTCR = AT91C_PDC_TXTEN;
-
- value = pSPI->SPI_RDR;
- value = pSPI->SPI_SR;
-
- if (((initStatus = GetFlashStatus()) & 0xFC) != 0xAC) {
- DebugPrint(" Unexpected SPI flash status: ");
- DebugPrintHex(2, initStatus);
- DebugPrint("\n\r");
- }
-
- spiread_function.f_string = "spi_read";
- spiread_function.parse_function = spiread_function_parse;
- spiread_function.help_function = spiread_function_help;
- RegisterFunction(&spiread_function);
-
- spiwrite_function.f_string = "spi_write";
- spiwrite_function.parse_function = spiwrite_function_parse;
- spiwrite_function.help_function = spiwrite_function_help;
- RegisterFunction(&spiwrite_function);
-}
+/*******************************************************************************
+ *
+ * Filename: spi_flash.c
+ *
+ * Instantiation of SPI flash control routines supporting AT45DB161B
+ *
+ * Revision information:
+ *
+ * 17JAN2005 kb_admin initial creation
+ * adapted from external sources
+ * tested for basic operation only!!!
+ *
+ * BEGIN_KBDD_BLOCK
+ * No warranty, expressed or implied, is included with this software. It is
+ * provided "AS IS" and no warranty of any kind including statutory or aspects
+ * relating to merchantability or fitness for any purpose is provided. All
+ * intellectual property rights of others is maintained with the respective
+ * owners. This software is not copyrighted and is intended for reference
+ * only.
+ * END_BLOCK
+ ******************************************************************************/
+
+#include "AT91RM9200.h"
+
+#include "spi_flash.h"
+#include "prompt.h"
+
+/* ********************** PRIVATE FUNCTIONS/DATA ******************************/
+
+
+static spiCommand_t spi_command;
+static char tx_commandBuffer[8], rx_commandBuffer[8];
+static parse_function_t spiread_function, spiwrite_function;
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void SendCommand(spiCommand_t *pCommand)
+ * Private function sends 8-bit value to the device and returns the 8-bit
+ * value in response.
+ * .KB_C_FN_DEFINITION_END
+ */
+static void SendCommand(spiCommand_t *pCommand) {
+
+ unsigned value;
+
+ AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_TXTDIS + AT91C_PDC_RXTDIS;
+
+ AT91C_BASE_SPI->SPI_RPR = (unsigned)pCommand->rx_cmd;
+ AT91C_BASE_SPI->SPI_TPR = (unsigned)pCommand->tx_cmd;
+
+ AT91C_BASE_SPI->SPI_RCR = pCommand->rx_cmd_size;
+ AT91C_BASE_SPI->SPI_TCR = pCommand->tx_cmd_size;
+
+ if (pCommand->tx_data_size != 0) {
+
+ AT91C_BASE_SPI->SPI_TNPR = (unsigned)pCommand->tx_data;
+ AT91C_BASE_SPI->SPI_TNCR = pCommand->tx_data_size;
+ AT91C_BASE_SPI->SPI_RNPR = (unsigned)pCommand->rx_data;
+ AT91C_BASE_SPI->SPI_RNCR = pCommand->rx_data_size;
+ }
+
+ AT91C_BASE_SPI->SPI_PTCR = AT91C_PDC_TXTEN + AT91C_PDC_RXTEN;
+
+ // wait for completion
+ while (!((value = AT91C_BASE_SPI->SPI_SR) & AT91C_SPI_SPENDRX)) ;
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * char GetFlashStatus(void)
+ * Private function to return device status.
+ * .KB_C_FN_DEFINITION_END
+ */
+static char GetFlashStatus(void) {
+
+ p_memset(tx_commandBuffer, 0, 8);
+ tx_commandBuffer[0] = STATUS_REGISTER_READ;
+ p_memset(rx_commandBuffer, 0, 8);
+ spi_command.tx_data_size = 0;
+ spi_command.rx_data_size = 0;
+ spi_command.tx_cmd = tx_commandBuffer;
+ spi_command.rx_cmd = rx_commandBuffer;
+ spi_command.rx_cmd_size = 2;
+ spi_command.tx_cmd_size = 2;
+ SendCommand(&spi_command);
+
+ return (rx_commandBuffer[1]);
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void WaitForDeviceReady(void)
+ * Private function to poll until the device is ready for next operation.
+ * .KB_C_FN_DEFINITION_END
+ */
+static void WaitForDeviceReady(void) {
+ while (!(GetFlashStatus() & 0x80)) ;
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void ProgramBuffer(unsigned pageAddress, unsigned byteAddress,
+ * unsigned src_addr, unsigned size);
+ * Private function to program Flash through the buffer. Note this
+ * will corrupt any data on the same page not intended for modification.
+ * To preserve this data, read it first, modify it in RAM, then write back
+ * data in FLASH_PAGE_SIZE intervals. This also corrupts the data in RAM.
+ * .KB_C_FN_DEFINITION_END
+ */
+static void ProgramBuffer(unsigned pageAddress, unsigned byteAddress,
+ unsigned src_addr, unsigned size) {
+
+ p_memset(tx_commandBuffer, 0, 8);
+ tx_commandBuffer[0] = PROGRAM_THROUGH_BUFFER;
+ tx_commandBuffer[1] = ((pageAddress >> 6) & 0x3F);
+ tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) |
+ ((byteAddress >> 8) & 0x3);
+ tx_commandBuffer[3] = (byteAddress & 0xFF);
+
+ p_memset(rx_commandBuffer, 0, 8);
+
+ spi_command.tx_cmd = tx_commandBuffer;
+ spi_command.rx_cmd = rx_commandBuffer;
+ spi_command.rx_cmd_size = 4;
+ spi_command.tx_cmd_size = 4;
+
+ spi_command.tx_data_size = size;
+ spi_command.tx_data = (char*)src_addr;
+ spi_command.rx_data_size = size;
+ spi_command.rx_data = (char*)src_addr;
+
+ SendCommand(&spi_command);
+
+ WaitForDeviceReady();
+}
+
+
+/* ************************** GLOBAL FUNCTIONS ********************************/
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void SPI_ReadFlash(unsigned flash_addr, unsigned dest_addr, unsigned size)
+ * Global function to read the SPI flash device using the continuous read
+ * array command.
+ * .KB_C_FN_DEFINITION_END
+ */
+void SPI_ReadFlash(unsigned flash_addr, unsigned dest_addr, unsigned size) {
+
+ unsigned pageAddress, byteAddress;
+
+ // determine page address
+ pageAddress = flash_addr / FLASH_PAGE_SIZE;
+
+ // determine byte address
+ byteAddress = flash_addr % FLASH_PAGE_SIZE;
+
+ p_memset(tx_commandBuffer, 0, 8);
+ tx_commandBuffer[0] = CONTINUOUS_ARRAY_READ;
+ tx_commandBuffer[1] = (pageAddress >> 6) & 0x3F;
+ tx_commandBuffer[2] = ((pageAddress << 2) & 0xFC) |
+ ((byteAddress >> 8) & 0x3);
+ tx_commandBuffer[3] = (byteAddress & 0xFF);
+
+ p_memset(rx_commandBuffer, 0, 8);
+
+ spi_command.tx_cmd = tx_commandBuffer;
+ spi_command.rx_cmd = rx_commandBuffer;
+ spi_command.rx_cmd_size = 8;
+ spi_command.tx_cmd_size = 8;
+
+ spi_command.tx_data_size = size;
+ spi_command.tx_data = (char*)dest_addr;
+ spi_command.rx_data_size = size;
+ spi_command.rx_data = (char*)dest_addr;
+
+ SendCommand(&spi_command);
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void SPI_WriteFlash(unsigned flash_addr, unsigned src_addr, unsigned size)
+ * Global function to program the SPI flash device. Notice the warning
+ * provided in lower-level functions regarding corruption of data in non-
+ * page aligned write operations.
+ * .KB_C_FN_DEFINITION_END
+ */
+void SPI_WriteFlash(unsigned flash_addr, unsigned src_addr, unsigned size) {
+
+ unsigned pageAddress, byteAddress, this_size;
+
+ // determine page address
+ pageAddress = flash_addr / FLASH_PAGE_SIZE;
+
+ // determine byte address
+ byteAddress = flash_addr % FLASH_PAGE_SIZE;
+
+ while (size) {
+
+ this_size = FLASH_PAGE_SIZE - byteAddress;
+ if (this_size > size)
+ this_size = size;
+
+ // write through buffer to flash
+ ProgramBuffer(pageAddress, byteAddress, src_addr, this_size);
+
+ size -= this_size;
+ src_addr += this_size;
+ byteAddress = 0;
+ ++pageAddress;
+ }
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * int spiread_function_parse(int argc, char *argv[])
+ * This global function parses text from the command line.
+ * .KB_C_FN_DEFINITION_END
+ */
+int spiread_function_parse(int argc, char *argv[]) {
+
+ unsigned flash_addr, dest_addr, size;
+
+ if (argc < 4) {
+ DebugPrint("Missing parameter");
+ return (1);
+ }
+
+ p_ASCIIToHex(argv[1], &flash_addr);
+ p_ASCIIToHex(argv[2], &dest_addr);
+ p_ASCIIToHex(argv[3], &size);
+ SPI_ReadFlash(flash_addr, dest_addr, size);
+
+ return (0);
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void spiread_function_help(void)
+ * This global displays help info for the corresponding command.
+ * .KB_C_FN_DEFINITION_END
+ */
+void spiread_function_help(void) {
+ DebugPrint("\tRead SPI Flash to memory\n\r");
+ DebugPrint("\t\tspi_read <flash_addr> <dest_addr> <size>\n\r");
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * int spiwrite_function_parse(int argc, char *argv[])
+ * This global function parses text from the command line.
+ * .KB_C_FN_DEFINITION_END
+ */
+int spiwrite_function_parse(int argc, char *argv[]) {
+
+ unsigned flash_addr, src_addr, size;
+
+ if (argc < 4) {
+ DebugPrint("Missing parameter");
+ return (1);
+ }
+
+ p_ASCIIToHex(argv[1], &flash_addr);
+ p_ASCIIToHex(argv[2], &src_addr);
+ p_ASCIIToHex(argv[3], &size);
+ SPI_WriteFlash(flash_addr, src_addr, size);
+
+ return (0);
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void spiwrite_function_help(void)
+ * This global displays help info for the corresponding command.
+ * .KB_C_FN_DEFINITION_END
+ */
+void spiwrite_function_help(void) {
+ DebugPrint("\tWrite memory to SPI Flash\n\r");
+ DebugPrint("\t\tspi_read <flash_addr> <src_addr> <size>\n\r");
+}
+
+
+/*
+ * .KB_C_FN_DEFINITION_START
+ * void SPI_InitFlash(void)
+ * Global function to initialize the SPI flash device/accessor functions.
+ * .KB_C_FN_DEFINITION_END
+ */
+void SPI_InitFlash(void) {
+
+ AT91PS_PIO pPio;
+ AT91PS_SPI pSPI = AT91C_BASE_SPI;
+ unsigned value;
+ char initStatus;
+
+ // enable CS0, CLK, MOSI, MISO
+ pPio = (AT91PS_PIO)AT91C_BASE_PIOA;
+ pPio->PIO_ASR = (((unsigned)AT91C_PA3_NPCS0) |
+ ((unsigned)AT91C_PA1_MOSI) |
+ ((unsigned)AT91C_PA0_MISO) |
+ ((unsigned)AT91C_PA2_SPCK));
+ pPio->PIO_BSR = 0;
+ pPio->PIO_PDR = (((unsigned)AT91C_PA3_NPCS0) |
+ ((unsigned)AT91C_PA1_MOSI) |
+ ((unsigned)AT91C_PA0_MISO) |
+ ((unsigned)AT91C_PA2_SPCK));
+
+ // enable clocks to SPI
+ AT91C_BASE_PMC->PMC_PCER = ((unsigned) 1 << AT91C_ID_SPI);
+
+ // reset the SPI
+ pSPI->SPI_CR = AT91C_SPI_SWRST;
+
+ pSPI->SPI_MR = ((0xf << 24) | AT91C_SPI_MSTR | AT91C_SPI_MODFDIS | (0xE << 16));
+
+ pSPI->SPI_CSR[0] = (AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & (0x4 <<16 )) | (3 << 8));
+ pSPI->SPI_CR = AT91C_SPI_SPIEN;
+
+ pSPI->SPI_PTCR = AT91C_PDC_TXTDIS;
+ pSPI->SPI_PTCR = AT91C_PDC_RXTDIS;
+ pSPI->SPI_RNPR = 0;
+ pSPI->SPI_RNCR = 0;
+ pSPI->SPI_TNPR = 0;
+ pSPI->SPI_TNCR = 0;
+ pSPI->SPI_RPR = 0;
+ pSPI->SPI_RCR = 0;
+ pSPI->SPI_TPR = 0;
+ pSPI->SPI_TCR = 0;
+ pSPI->SPI_PTCR = AT91C_PDC_RXTEN;
+ pSPI->SPI_PTCR = AT91C_PDC_TXTEN;
+
+ value = pSPI->SPI_RDR;
+ value = pSPI->SPI_SR;
+
+ if (((initStatus = GetFlashStatus()) & 0xFC) != 0xAC) {
+ DebugPrint(" Unexpected SPI flash status: ");
+ DebugPrintHex(2, initStatus);
+ DebugPrint("\n\r");
+ }
+
+ spiread_function.f_string = "spi_read";
+ spiread_function.parse_function = spiread_function_parse;
+ spiread_function.help_function = spiread_function_help;
+ RegisterFunction(&spiread_function);
+
+ spiwrite_function.f_string = "spi_write";
+ spiwrite_function.parse_function = spiwrite_function_parse;
+ spiwrite_function.help_function = spiwrite_function_help;
+ RegisterFunction(&spiwrite_function);
+}
==== //depot/projects/arm/src/sys/kern/subr_bus.c#7 (text+ko) ====
@@ -3448,7 +3448,7 @@
device_printf(dev, "[GIANT-LOCKED]\n");
if (bootverbose && (flags & INTR_MPSAFE))
device_printf(dev, "[MPSAFE]\n");
- if (flags & INTR_FAST)
+ if (bootverbose && (flags & INTR_FAST))
device_printf(dev, "[FAST]\n");
}
} else
More information about the p4-projects
mailing list