]> git.zerfleddert.de Git - raggedstone/blobdiff - xps/raggedstone.c
EDK project
[raggedstone] / xps / raggedstone.c
diff --git a/xps/raggedstone.c b/xps/raggedstone.c
new file mode 100644 (file)
index 0000000..01d0c10
--- /dev/null
@@ -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;
+}
Impressum, Datenschutz