add flasher

This commit is contained in:
Mariano Alvira 2010-02-26 14:51:01 -05:00
parent 383a965c21
commit a2b51b0e3c
3 changed files with 24 additions and 95 deletions

View file

@ -6,7 +6,7 @@ MC1322X := ..
COBJS := tests.o put.o COBJS := tests.o put.o
# all of the target programs to build # all of the target programs to build
TARGETS := blink-red blink-green blink-blue blink-white blink-allio uart1-loopback nvm-read nvm-write romimg TARGETS := blink-red blink-green blink-blue blink-white blink-allio uart1-loopback nvm-read nvm-write romimg flasher
include $(MC1322X)/Makefile.include include $(MC1322X)/Makefile.include

View file

@ -23,4 +23,10 @@
#define DUMP_BASE 0x00000000 #define DUMP_BASE 0x00000000
#define DUMP_LEN 0x00014000 #define DUMP_LEN 0x00014000
/* flasher */
/* if both BOOT_OK and BOOT_SECURE are 0 then flash image will not be bootable */
/* if both are 1 then flash image will be secure */
#define BOOT_OK 1
#define BOOT_SECURE 0
#endif #endif

View file

@ -1,29 +1,8 @@
#define GPIO_FUNC_SEL0 0x80000018 /* GPIO 15 - 0; 2 bit blocks */ #include <mc1322x.h>
#include <board.h>
#define BASE_UART1 0x80005000 #include "tests.h"
#define UART1_CON 0x80005000 #include "config.h"
#define UART1_STAT 0x80005004
#define UART1_DATA 0x80005008
#define UR1CON 0x8000500c
#define UT1CON 0x80005010
#define UART1_CTS 0x80005014
#define UART1_BR 0x80005018
#define GPIO_PAD_DIR0 0x80000000
#define GPIO_DATA0 0x80000008
#include "embedded_types.h"
#include "nvm.h"
#include "maca.h"
#define reg(x) (*(volatile uint32_t *)(x))
#define DELAY 400000
/* if both BOOT_OK and BOOT_SECURE are 0 then flash image will not be bootable */
/* if both are 1 then flash image will be secure */
#define BOOT_OK 1
#define BOOT_SECURE 0
#define DEBUG 1 #define DEBUG 1
#if DEBUG #if DEBUG
@ -40,16 +19,9 @@
#define dbg_put_hex32(...) #define dbg_put_hex32(...)
#endif #endif
const uint8_t hex[16]={'0','1','2','3','4','5','6','7',
'8','9','a','b','c','d','e','f'};
uint8_t getc(void); uint8_t getc(void);
void flushrx(void); void flushrx(void);
uint32_t to_u32(char *c); uint32_t to_u32(volatile uint32_t *c);
#include "isr.h"
#define NBYTES 16
enum parse_states { enum parse_states {
SCAN_X, SCAN_X,
@ -58,35 +30,18 @@ enum parse_states {
MAX_STATE, MAX_STATE,
}; };
__attribute__ ((section ("startup")))
void main(void) { void main(void) {
nvmType_t type=0; nvmType_t type=0;
nvmErr_t err; nvmErr_t err;
volatile uint8_t c; volatile uint8_t c;
volatile uint32_t buf[NBYTES/4];
volatile uint32_t i; volatile uint32_t i;
volatile uint32_t buf[4];
volatile uint32_t len=0; volatile uint32_t len=0;
volatile uint32_t state = SCAN_X; volatile uint32_t state = SCAN_X;
volatile uint32_t addr,data; volatile uint32_t addr,data;
*(volatile uint32_t *)GPIO_PAD_DIR0 = 0x00000100;
/* Restore UART regs. to default */
/* in case there is still bootloader state leftover */
reg(UART1_CON) = 0x0000c800; /* mask interrupts, 16 bit sample --- helps explain the baud rate */ uart_init(INC, MOD);
/* INC = 767; MOD = 9999 works: 115200 @ 24 MHz 16 bit sample */
#define INC 767
#define MOD 9999
reg(UART1_BR) = INC<<16 | MOD;
/* see Section 11.5.1.2 Alternate Modes */
/* you must enable the peripheral first BEFORE setting the function in GPIO_FUNC_SEL */
/* From the datasheet: "The peripheral function will control operation of the pad IF */
/* THE PERIPHERAL IS ENABLED. */
reg(UART1_CON) = 0x00000003; /* enable receive and transmit */
reg(GPIO_FUNC_SEL0) = ( (0x01 << (14*2)) | (0x01 << (15*2)) ); /* set GPIO15-14 to UART (UART1 TX and RX)*/
vreg_init(); vreg_init();
@ -155,7 +110,7 @@ void main(void) {
/* for OTAP */ /* for OTAP */
for(i=0; i<len; i++) { for(i=0; i<len; i++) {
c = getc(); c = getc();
err = nvm_write(gNvmInternalInterface_c, type, &c, 8+i, 1); err = nvm_write(gNvmInternalInterface_c, type, (uint8_t *)&c, 8+i, 1);
} }
puts("flasher done\n\r"); puts("flasher done\n\r");
@ -180,10 +135,10 @@ void main(void) {
if(state == PROCESS) { if(state == PROCESS) {
if(addr==0) { if(addr==0) {
/*interpret the string as the starting address */ /*interpret the string as the starting address */
addr = to_u32((uint8_t *)buf); addr = to_u32(buf);
} else { } else {
/* string is data to write */ /* string is data to write */
data = to_u32((uint8_t *)buf); data = to_u32(buf);
puts("writing addr "); puts("writing addr ");
put_hex32(addr); put_hex32(addr);
puts(" data "); puts(" data ");
@ -203,8 +158,8 @@ void main(void) {
void flushrx(void) void flushrx(void)
{ {
volatile uint8_t c; volatile uint8_t c;
while(reg(UR1CON) !=0) { while(*UR1CON !=0) {
c = reg(UART1_DATA); c = *UART1_DATA;
} }
} }
@ -229,16 +184,16 @@ bad:
return 32; return 32;
} }
uint32_t to_u32(char *c) uint32_t to_u32(volatile uint32_t *c)
{ {
volatile uint32_t ret=0; volatile uint32_t ret=0;
volatile uint32_t i,val; volatile uint32_t i,val;
/* c should be /x\d+,/ */ /* c should be /x\d+,/ */
i=1; /* skip x */ i=1; /* skip x */
while(c[i] != ',') { while(((uint8_t *)c)[i] != ',') {
ret = ret<<4; ret = ret<<4;
val = from_hex(c[i++]); val = from_hex(((uint8_t *)c)[i++]);
ret += val; ret += val;
} }
return ret; return ret;
@ -247,41 +202,9 @@ uint32_t to_u32(char *c)
uint8_t getc(void) uint8_t getc(void)
{ {
volatile uint8_t c; volatile uint8_t c;
while(reg(UR1CON) == 0); while(*UR1CON == 0);
c = reg(UART1_DATA); c = *UART1_DATA;
return c; return c;
} }
void putc(uint8_t c) {
while(reg(UT1CON)==31); /* wait for there to be room in the buffer */
reg(UART1_DATA) = c;
}
void puts(uint8_t *s) {
while(s && *s!=0) {
putc(*s++);
}
}
void put_hex(uint8_t x)
{
putc(hex[x >> 4]);
putc(hex[x & 15]);
}
void put_hex16(uint16_t x)
{
put_hex((x >> 8) & 0xFF);
put_hex((x) & 0xFF);
}
void put_hex32(uint32_t x)
{
put_hex((x >> 24) & 0xFF);
put_hex((x >> 16) & 0xFF);
put_hex((x >> 8) & 0xFF);
put_hex((x) & 0xFF);
}