X-Git-Url: https://git.zerfleddert.de/cgi-bin/gitweb.cgi/raggedstone/blobdiff_plain/de64fba0107b84e71ed24fe891a1e0582ac773c9..7fb867f8a0428b650acbff9b2d6c623a7cf8c00a:/xps/raggedstone.c diff --git a/xps/raggedstone.c b/xps/raggedstone.c new file mode 100644 index 0000000..01d0c10 --- /dev/null +++ b/xps/raggedstone.c @@ -0,0 +1,156 @@ +#include "xparameters.h" +#include "xgpio_l.h" + +#include "stdio.h" + +#include "xutil.h" + +#define DISP7(a,b,c,d,e,f,g) (0|((~(a|b<<1|c<<2|d<<3|e<<4|f<<5|g<<6))&0xff)) + +void display_num(unsigned short num) { + unsigned int val = 0x00; + int i; + unsigned short digit; + + XGpio_mSetDataDirection(XPAR_SEVENSEG_BASEADDR, 1, 0x00000000); + + for (i=0; i<5; i++) { + digit = ((num>>(4*i)) & 0xf); + switch(digit) { + case 0x0: + val = DISP7(1,1,1,1,1,1,0); + break; + case 0x1: + val = DISP7(0,1,1,0,0,0,0); + break; + case 0x2: + val = DISP7(1,1,0,1,1,0,1); + break; + case 0x3: + val = DISP7(1,1,1,1,0,0,1); + break; + case 0x4: + val = DISP7(0,1,1,0,0,1,1); + break; + case 0x5: + val = DISP7(1,0,1,1,0,1,1); + break; + case 0x6: + val = DISP7(1,0,1,1,1,1,1); + break; + case 0x7: + val = DISP7(1,1,1,0,0,0,0); + break; + case 0x8: + val = DISP7(1,1,1,1,1,1,1); + break; + case 0x9: + val = DISP7(1,1,1,1,0,1,1); + break; + case 0xa: + val = DISP7(1,1,1,0,1,1,1); + break; + case 0xb: + val = DISP7(0,0,1,1,1,1,1); + break; + case 0xc: + val = DISP7(1,0,0,1,1,1,0); + break; + case 0xd: + val = DISP7(0,1,1,1,1,0,1); + break; + case 0xe: + val = DISP7(1,0,0,1,1,1,1); + break; + case 0xf: + val = DISP7(1,0,0,0,1,1,1); + break; + } + + val |= 1 << (8+(3-i)); + + if (i == 4) + val = 0x00; + + XGpio_mSetDataReg(XPAR_SEVENSEG_BASEADDR, 1, val); + if (i != 4) + for (val = 0; val < 100000; val++); + } +} + +void flash_chip_erase() { + volatile unsigned char *flash = (volatile unsigned char*)XPAR_FLASH_MEM0_BASEADDR; + + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[0x555] = 0x80; + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[0x555] = 0x10; +} + +void flash_erase_sector(unsigned int addr) { + volatile unsigned char *flash = (volatile unsigned char*)XPAR_FLASH_MEM0_BASEADDR; + + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[0x555] = 0x80; + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[addr] = 0x30; +} + +void flash_program_byte(unsigned int addr, unsigned char value) { + volatile unsigned char *flash = (volatile unsigned char*)XPAR_FLASH_MEM0_BASEADDR; + unsigned int count = 0xffffffff; + + if (flash[addr] != 0xff) + return; + + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[0x555] = 0xA0; + flash[addr] = value; + + while (flash[addr] != value && count) { count--; } +} + +void flash_identify(int enable) { + volatile unsigned char *flash = (volatile unsigned char*)XPAR_FLASH_MEM0_BASEADDR; + + flash[0x555] = 0xAA; + flash[0xAAA] = 0x55; + flash[0x555] = enable?0x90:0xF0; +} + +int main (void) { + int i,a; + volatile unsigned char *flash = (volatile unsigned char*)XPAR_FLASH_MEM0_BASEADDR; + + XGpio_mSetDataDirection(XPAR_LEDS_BASEADDR, 1, 0x00000000); + XGpio_mSetDataReg(XPAR_LEDS_BASEADDR, 1, 0x00); + print("\r\nHallo Raggedstone!\r\n"); + for (i = 0; i < 1500000000; i++); + + flash_identify(1); + putnum(flash[0]|flash[1]<<8|flash[2]<<16|flash[3]<<24); + print("\r\n"); + flash_identify(0); + putnum(flash[0]|flash[1]<<8|flash[2]<<16|flash[3]<<24); + print("\r\n"); + + for (i = 0; i < 1500000000; i++); + i = 0; + while(1) { + print("Hallo Raggedstone "); + display_num(i>>8); + putnum(i); + XGpio_mSetDataReg(XPAR_LEDS_BASEADDR, 1, (i & 0xf00)>>8); + print("\r\n"); + if (i == 0x7ffff) + i = 0; + else + i++; + } + return 0; +}