// write default blackfin void flash_write_ldr(void) { #if 1 #else // flashc_memset32((void*)&(flash_nvram_data.ldrSize), bfinLdrSize, 4, true); // flashc_memcpy((void*)&(flash_nvram_data.ldrData), (const void*)bfinLdrData, bfinLdrSize, true); // seeing some missing pages, so try writing one page at a time u32 i; u32 nPages = bfinLdrSize / 0x200; u32 rem; const u8* pSrc; u8* pDst; // write size flashc_memset32((void*)&(flash_nvram_data.ldrSize), bfinLdrSize, 4, true); // write data pSrc = (const void*)bfinLdrData; pDst = (void*)&(flash_nvram_data.ldrData); for(i=0; i<nPages; i++) { flashc_memcpy((void*)pDst, (const void*)pSrc, 0x200, true); pDst += 0x200; pSrc += 0x200; delay_ms(1); } // remaining bytes rem = bfinLdrSize - (nPages * 0x200); flashc_memcpy((void*)pDst, (const void*)pSrc, rem, true); #endif }
// intiailize (alloc mem, check/set firstrun bytes) u8 init_flash() { #if 1 #else u32 i; print_dbg("\r\n init flash... "); // allocate bfin loader buf //////////////////// /////////// TESTING #if 0 bfinLdrData = alloc_mem(BFIN_LDR_MAX_BYTES); #else bfinLdrData = alloc_mem(BFIN_LDR_MAX_BYTES * 4); #endif for(i=0; i<BFIN_LDR_MAX_BYTES; i++) { bfinLdrData[i] = 0; } if(flash_nvram_data.firstRun != FIRSTRUN_MAGIC) { // set size=0 so we won't attempt unitialized bfin load on next start bfinLdrSize = 0; flashc_memset32((void*)&(flash_nvram_data.ldrSize), 0x00000000, 4, true); // do this only after succesful app launch // flashc_memset32((void*)&(flash_nvram_data.firstRun), FIRSTRUN_MAGIC, 4, true); return 1; } else { // firstrun already happened return 0; } #endif }
// intiailize (alloc mem, check/set firstrun bytes) u8 init_flash() { u32 i; // allocate .elf buffer fwBinData = alloc_mem(FIRMWARE_MAX_BYTES); bfinLdrData = alloc_mem(BFIN_LDR_MAX_BYTES); for(i=0; i<BFIN_LDR_MAX_BYTES; i++) { bfinLdrData[i] = 0; } for(i=0; i<FIRMWARE_MAX_BYTES; i++) { fwBinData[i] = 0; } if(flash_nvram_data.firstRun != FIRSTRUN_INIT) { // print_dbg("\r\n writing firstrun, no bfin load"); bfinLdrSize = 0; flashc_memset32((void*)&flash_nvram_data.firstRun, FIRSTRUN_INIT, 4, true); return 1; } return 0; }
volatile void *flashc_memset16(volatile void *dst, uint16_t src, size_t nbytes, bool erase) { return flashc_memset32(dst, src | (uint32_t)src << 16, nbytes, erase); }
volatile void* flashc_memset16 (volatile void* dst, U16 src, size_t nbytes, Bool erase) { return flashc_memset32 (dst, src | (U32) src << 16, nbytes, erase); }
// clear firstrun status void flash_clear_firstrun(void) { #if 1 #else flashc_memset32((void*)&(flash_nvram_data.firstRun), 0x00000000, 4, true); #endif }
// write firstrun status void flash_write_firstrun(void) { #if 1 #else flashc_memset32((void*)&(flash_nvram_data.firstRun), FIRSTRUN_MAGIC, 4, true); #endif }
// clear firstrun status void flash_clear_firstrun(void) { flashc_memset32((void*)&(flash_nvram_data.firstRun), 0x00000000, 4, true); }
int main(void) { u8 i1; sysclk_init(); init_dbg_rs232(FMCK_HZ); init_gpio(); assign_main_event_handlers(); init_events(); init_tc(); init_spi(); init_adc(); irq_initialize_vectors(); register_interrupts(); cpu_irq_enable(); init_usb_host(); init_monome(); init_i2c_slave(0x30); print_dbg("\r\n\n// meadowphysics //////////////////////////////// "); print_dbg_ulong(sizeof(flashy)); print_dbg(" "); print_dbg_ulong(sizeof(m)); if(flash_is_fresh()) { print_dbg("\r\nfirst run."); flash_unfresh(); flashc_memset32((void*)&(flashy.preset_select), 0, 4, true); // clear out some reasonable defaults for(i1=0;i1<8;i1++) { m.positions[i1] = i1; m.points[i1] = i1; m.points_save[i1] = i1; m.triggers[i1] = 0; m.trig_dests[i1] = 0; m.rules[i1] = 0; m.rule_dests[i1] = i1; } m.positions[0] = m.points[0] = 3; m.trig_dests[0] = 254; // save all presets, clear glyphs for(i1=0;i1<8;i1++) { flashc_memcpy((void *)&flashy.m[i1], &m, sizeof(m), true); glyph[i1] = (1<<i1); flashc_memcpy((void *)&flashy.glyph[i1], &glyph, sizeof(glyph), true); } } else { // load from flash at startup preset_select = flashy.preset_select; flash_read(); for(i1=0;i1<8;i1++) glyph[i1] = flashy.glyph[preset_select][i1]; } LENGTH = 15; SIZE = 16; re = &refresh; process_ii = &mp_process_ii; clock_pulse = &clock; clock_external = !gpio_get_pin_value(B09); timer_add(&clockTimer,120,&clockTimer_callback, NULL); timer_add(&keyTimer,50,&keyTimer_callback, NULL); timer_add(&adcTimer,100,&adcTimer_callback, NULL); clock_temp = 10000; // out of ADC range to force tempo while (true) { check_events(); } }