Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff --git a/software/main.c b/software/main.c
- index 005a883..09208b9 100644
- --- a/software/main.c
- +++ b/software/main.c
- @@ -7,6 +7,130 @@
- #include <console.h>
- #include <generated/csr.h>
- +#define PAGE_PROGRAM_CMD (0x02)
- +#define WRDI_CMD (0x04)
- +#define RDSR_CMD (0x05)
- +#define WREN_CMD (0x06)
- +#define SE_CMD (0x20)
- +
- +#define BITBANG_CLK (1 << 2)
- +#define BITBANG_CS_N (1 << 3)
- +#define BITBANG_DQ_INPUT (1 << 4)
- +#define BITBANG_ENABLE (1 << 5)
- +
- +#define SR_WIP (1)
- +
- +static inline void _spiflash_bitbang_write(unsigned int val);
- +void flash_write_byte(unsigned char b);
- +void flash_write_addr(unsigned int addr);
- +void write_to_flash(unsigned int addr, char c);
- +void wait_for_device_ready(void);
- +
- +static inline void _spiflash_bitbang_write(unsigned int val)
- +{
- + spiflash_bitbang_write(val | BITBANG_ENABLE);
- +}
- +
- +void flash_write_byte(unsigned char cmd)
- +{
- + int i;
- + _spiflash_bitbang_write(0); // ~CS_N ~CLK
- +
- + for (i = 0 ; i < 8 ; i++, cmd <<= 1)
- + {
- +
- + _spiflash_bitbang_write((cmd & 0x80) >> 7);
- + _spiflash_bitbang_write(((cmd & 0x80) >> 7) | BITBANG_CLK);
- + }
- +
- + _spiflash_bitbang_write(0); // ~CS_N ~CLK
- +
- +}
- +
- +void flash_write_addr(unsigned int addr)
- +{
- + int i;
- + _spiflash_bitbang_write(0);
- +
- + for (i = 0 ; i < 24 ; i++, addr <<= 1)
- + {
- + _spiflash_bitbang_write((addr & 0x800000) >> 23);
- + _spiflash_bitbang_write(((addr & 0x800000) >> 23) | BITBANG_CLK);
- + }
- +
- + _spiflash_bitbang_write(0);
- +}
- +
- +void wait_for_device_ready(void)
- +{
- + unsigned char sr;
- + unsigned char i;
- + do
- + {
- + sr = 0;
- + flash_write_byte(RDSR_CMD);
- + _spiflash_bitbang_write(BITBANG_DQ_INPUT);
- + for (i = 0 ; i < 8 ; i++)
- + {
- + sr <<= 1;
- + _spiflash_bitbang_write(BITBANG_CLK | BITBANG_DQ_INPUT);
- + sr |= spiflash_miso_read();
- + _spiflash_bitbang_write(0 | BITBANG_DQ_INPUT);
- + }
- + _spiflash_bitbang_write(0);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- + printf("sr == %02x\n", sr);
- + } while (sr & SR_WIP);
- +}
- +
- +void erase_flash(unsigned int addr)
- +{
- + unsigned int sector_addr = addr & ~(0xfff);
- + flash_write_byte(WREN_CMD);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- +
- + flash_write_byte(SE_CMD);
- + flash_write_addr(sector_addr);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- +}
- +
- +void write_to_flash(unsigned int addr, char c)
- +{
- + unsigned int i;
- + flash_write_byte(WREN_CMD);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- + flash_write_byte(PAGE_PROGRAM_CMD);
- + flash_write_addr(addr);
- + for (i = 0 ; i < 256 ; i++)
- + flash_write_byte(c);
- +
- + _spiflash_bitbang_write(BITBANG_CS_N);
- + spiflash_bitbang_write(0);
- +}
- +
- +void erase_then_write_to_flash(unsigned int addr, char c)
- +{
- + unsigned int sector_addr = addr & ~(0xfff);
- +
- + flash_write_byte(WREN_CMD);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- +
- + flash_write_byte(SE_CMD);
- + flash_write_addr(sector_addr);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- +
- + wait_for_device_ready();
- +
- + flash_write_byte(WREN_CMD);
- + _spiflash_bitbang_write(BITBANG_CS_N);
- + flash_write_byte(PAGE_PROGRAM_CMD);
- + flash_write_addr(addr);
- + flash_write_byte(c);
- +
- + _spiflash_bitbang_write(BITBANG_CS_N);
- + spiflash_bitbang_write(0);
- +}
- +
- int main(void)
- {
- int c;
- @@ -19,6 +143,12 @@ int main(void)
- while(1) {
- c = readchar();
- + if (c == '0')
- + erase_flash(0x75000);
- + if (c == '1')
- + write_to_flash(0x75000, '@');
- + if (c == '2')
- + erase_then_write_to_flash(0x75000, '%');
- if((c >= '0') && (c <= '9')) {
- printf("Set blink frequency #%c\n", c);
- c -= '0';
Advertisement
Add Comment
Please, Sign In to add comment