optixx 15 anni fa
parent
commit
d58d3439ec
2 ha cambiato i file con 143 aggiunte e 16 eliminazioni
  1. 79 16
      poc/avr_sdcard/main.c
  2. 64 0
      scripts/crc_xmodem.py

+ 79 - 16
poc/avr_sdcard/main.c

@@ -44,7 +44,7 @@ extern FILE uart_stdout;
 //#define FILENAME	"rom.smc"    //ok
 //#define FILENAME	"supert.smc"
 //#define FILENAME	"vortex.smc"
-//#define FILENAME	"mrdo.smc"
+#define FILENAME	"mrdo.smc"
 //#define FILENAME	"spacei.smc"
 //#define FILENAME	"bank01.smc" //ok
 //#define FILENAME	"bank02.smc" //ok
@@ -55,7 +55,7 @@ extern FILE uart_stdout;
 //#define FILENAME	"bank07.smc" //ok
 //#define FILENAME	"banklo.smc" //ok
 //#define FILENAME	"bankhi.smc" //ok
-#define FILENAME	"vram2.smc"  //ok
+//#define FILENAME	"vram2.smc"  //ok
 
 #define DUMPNAME	"dump256.smc"
 #define BUFFER_SIZE 512
@@ -65,6 +65,42 @@ extern FILE uart_stdout;
 uint8_t read_buffer[BUFFER_SIZE];
 
 
+uint16_t crc_xmodem_update (uint16_t crc, uint8_t data)
+{
+    int i;
+    crc = crc ^ ((uint16_t)data << 8);
+    for (i=0; i<8; i++)
+    {
+        if (crc & 0x8000)
+            crc = (crc << 1) ^ 0x1021;
+        else
+            crc <<= 1;
+    }
+
+    return crc;
+}
+
+uint16_t do_crc(uint8_t * data,uint16_t size)
+{
+	uint16_t crc =0;
+	uint16_t i;
+	for (i=0; i<size; i++){
+		crc = crc_xmodem_update(crc,data[i]);
+		//printf("%x : %x\n",crc,data[i]);	
+	}
+  	return crc;
+}
+
+
+uint16_t do_crc_update(uint16_t crc,uint8_t * data,uint16_t size)
+{
+  uint16_t i;
+  for (i=0; i<size; i++)
+	crc = crc_xmodem_update(crc,data[i]);
+  return crc;
+}
+
+
 void dump_packet(uint32_t addr,uint32_t len,uint8_t *packet){
 	uint16_t i,j;
 	uint16_t sum = 0;
@@ -246,9 +282,9 @@ int main(void)
     uint8_t 	fat_attrib = 0;
     uint32_t 	fat_size = 0;
     uint32_t 	rom_addr = 0;
-    uint32_t 	skip_block = 0;
     uint8_t 	bank_cnt = 0;
- 
+ 	uint16_t 	crc = 0;
+	uint16_t 	block_cnt;
     uart_init();
     stdout = &uart_stdout;
 	
@@ -258,14 +294,24 @@ int main(void)
 	spi_init();
 	printf("SPI Init\n");
 
+#if 0                 
+    uint8_t t[] = "david";
+	printf("Test CRC %x\n",do_crc(t,5));
+	while(1);
+#endif
+
+
 #if 0                 
 	sram_clear(0x000000, 0x80000);
 	printf("sram_clear\n");
 #endif
-	//printf("read 0x0f0f\n");
-	//sram_read(0x0f0f);
-	//printf("write 0x0f0f\n");
-	//sram_write(0x0f0f,0xaa);
+
+#if 0                 
+	printf("read 0x0f0f\n");
+	sram_read(0x0f0f);
+	printf("write 0x0f0f\n");
+	sram_write(0x0f0f,0xaa);
+#endif
 	
 #if 0	
 	rom_addr = 0x4aaaa;
@@ -291,20 +337,19 @@ int main(void)
 						read_buffer) == 1) {
 	   
 
-        for (uint16_t block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
+        for (block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
         	fat_read_file (fat_cluster,read_buffer,block_cnt);
+			
 			if (block_cnt && block_cnt % 64 == 0){
-				printf("Write Ram Bank: 0x%x Addr: 0x%lx Skipped: %li\n",bank_cnt,rom_addr,skip_block);
 				bank_cnt++;
-				skip_block=0;
+				printf("Write Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
+				crc = 0;
 			}
-			//if (sram_check(read_buffer,512))
-				sram_copy(rom_addr,read_buffer,512);
-			//else
-			//	skip_block +=1;
+			crc = do_crc_update(crc,read_buffer,512);
+			sram_copy(rom_addr,read_buffer,512);
 			rom_addr += 512;
         }
-		printf("Write Ram Bank: 0x%x Addr: 0x%lx Skipped: %li\n",bank_cnt,rom_addr,skip_block);
+		printf("Write Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
 		printf("Done\n");
 	}
 
@@ -325,6 +370,24 @@ int main(void)
 	printf("\nDone 0x%lx\n",rom_addr);
 #endif	
 
+#if 1
+	block_cnt = 0;
+	crc = 0;
+	rom_addr = 0x000000;
+    for (block_cnt=0; block_cnt<BLOCKS; block_cnt++) {
+    	sram_read_buffer(rom_addr,read_buffer,512);
+		if (block_cnt && block_cnt % 64 == 0){
+			bank_cnt++;
+			printf("Read Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
+			crc = 0;
+		}
+		crc = do_crc_update(crc,read_buffer,512);
+		rom_addr += 512;
+    }
+	printf("Read Ram Bank: 0x%x Addr: 0x%lx Block: %x CRC: %x\n",bank_cnt,rom_addr,block_cnt,crc);
+#endif	
+
+
 #if 0
 	
     printf("Look for %s\n",DUMPNAME);

+ 64 - 0
scripts/crc_xmodem.py

@@ -0,0 +1,64 @@
+
+import ctypes
+import sys
+import os
+
+def crc_xmodem_update(crc,data):
+    crc =  ctypes.c_uint16(crc.value ^ data.value << 8)
+    for i in range(0,8):
+        if crc.value & 0x8000:
+            crc = ctypes.c_uint16((crc.value << 1) ^ 0x1021);
+        else:
+            crc = ctypes.c_uint16(crc.value << 1);
+    return crc
+
+
+def do_crc(data):
+    crc = ctypes.c_uint16(0)
+    for idx,char in enumerate(data):
+        crc = crc_xmodem_update(crc,ctypes.c_uint8(ord(char)))
+    return crc.value
+
+
+def test_performance():
+    data=str()
+    fd = open("/dev/urandom")
+    for i in range(0,256):
+        data+= fd.read(1024)
+        sys.stdout.write("*")
+        sys.stdout.flush()
+    print
+    fd.close()    
+    print "%s" % do_crc(data)
+
+
+def test_algo():
+    data='david'
+    print "%x" % do_crc(data)
+  
+
+def main():
+    #import cProfile
+    #cProfile.run('test_performance()')
+
+    size = os.stat(sys.argv[1])[6]
+    fd = open(sys.argv[1])
+    addr = 0x0000
+    step = 2**15
+    result = []
+    while addr < size:
+        try:
+            block = fd.read(step)
+            addr += step 
+        except:
+            print "Done"
+            break
+        crc = do_crc(block)
+        print "Bank: 0x%02x Addr: 0x%06x Block: 0x%04x CRC 0x%04x" % (addr/(2**15),addr,addr/512, ctypes.c_uint16(crc).value)
+        result.append(hex(ctypes.c_uint16(crc).value))
+    #print result
+
+if __name__ == '__main__':
+    main()
+
+