diff --git a/src/board_sky9x.cpp b/src/board_sky9x.cpp index 5b70cac89..678501f90 100644 --- a/src/board_sky9x.cpp +++ b/src/board_sky9x.cpp @@ -183,50 +183,6 @@ inline void setup_switches() #define sam_boot() #else -/** - * Configures a UART peripheral with the specified parameters. - * - * baudrate Baudrate at which the UART should operate (in Hz). - * masterClock Frequency of the system master clock (in Hz). - * uses PA9 and PA10, RXD2 and TXD2 - */ -inline void UART_Configure( uint32_t baudrate, uint32_t masterClock) -{ -// const Pin pPins[] = CONSOLE_PINS; - register Uart *pUart = CONSOLE_USART; - - /* Configure PIO */ - configure_pins( (PIO_PA9 | PIO_PA10), PIN_PERIPHERAL | PIN_INPUT | PIN_PER_A | PIN_PORTA | PIN_NO_PULLUP ) ; - - /* Configure PMC */ - PMC->PMC_PCER0 = 1 << CONSOLE_ID; - - /* Reset and disable receiver & transmitter */ - pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX - | UART_CR_RXDIS | UART_CR_TXDIS; - - /* Configure mode */ - pUart->UART_MR = 0x800 ; // NORMAL, No Parity - - /* Configure baudrate */ - /* Asynchronous, no oversampling */ - pUart->UART_BRGR = (masterClock / baudrate) / 16; - - /* Disable PDC channel */ - pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; - - /* Enable receiver and transmitter */ - pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; - pUart->UART_IER = UART_IER_RXRDY ; - NVIC_EnableIRQ(UART0_IRQn) ; -} - -void UART_Stop() -{ - CONSOLE_USART->UART_IDR = UART_IDR_RXRDY ; - NVIC_DisableIRQ(UART0_IRQn) ; -} - inline void UART3_Configure( uint32_t baudrate, uint32_t masterClock) { // const Pin pPins[] = CONSOLE_PINS; @@ -777,7 +733,7 @@ void board_init() PMC->PMC_SCER |= 0x0400 ; // PCK2 enabled PMC->PMC_PCK[2] = 2 ; // PCK2 is PLLA - UART_Configure( 9600, Master_frequency ) ; + DEBUG_UART_Configure( 9600, Master_frequency ) ; UART2_Configure( 9600, Master_frequency ) ; // Testing UART3_Configure( 9600, Master_frequency ) ; // TODO not needed, done after ... @@ -1203,7 +1159,7 @@ void usb_mode() // NVIC_DisableIRQ(PWM_IRQn) ; disable_ssc() ; - UART_Stop(); + DEBUG_UART_Stop(); UART3_Stop(); sam_boot() ; diff --git a/src/lcd.cpp b/src/lcd.cpp index e09d407d7..1efaf7668 100644 --- a/src/lcd.cpp +++ b/src/lcd.cpp @@ -394,8 +394,40 @@ void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, uint8_t att) lcd_hlineStip(x, y, w, 0xff, att); } -#if 0 -// allows the att parameter... perhaps will be needed later! +#if defined(PCBSTD) +void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat) +{ + if (x >= DISPLAY_W) return; + if (h<0) { y+=h; h=-h; } + if (y<0) { h+=y; y=0; } + if (y+h > DISPLAY_H) { h = DISPLAY_H - y; } + + if (pat==DOTTED && !(y%2)) + pat = ~pat; + + uint8_t *p = &displayBuf[ y / 8 * DISPLAY_W + x ]; + y = y % 8; + if (y) { + ASSERT_IN_DISPLAY(p); + *p ^= ~(BITMASK(y)-1) & pat; + p += DISPLAY_W; + h -= 8-y; + } + while (h>0) { + ASSERT_IN_DISPLAY(p); + *p ^= pat; + p += DISPLAY_W; + h -= 8; + } + if (h < 0) h += 8; + if (h) { + p -= DISPLAY_W; + ASSERT_IN_DISPLAY(p); + *p ^= ~(BITMASK(h)-1) & pat; + } +} +#else +// allows the att parameter... void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, uint8_t att) { if (x >= DISPLAY_W) return; @@ -428,38 +460,6 @@ void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, uint8_t att) lcd_mask(p, (BITMASK(h)-1) & pat, att); } } -#else -void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat) -{ - if (x >= DISPLAY_W) return; - if (h<0) { y+=h; h=-h; } - if (y<0) { h+=y; y=0; } - if (y+h > DISPLAY_H) { h = DISPLAY_H - y; } - - if (pat==DOTTED && !(y%2)) - pat = ~pat; - - uint8_t *p = &displayBuf[ y / 8 * DISPLAY_W + x ]; - y = y % 8; - if (y) { - ASSERT_IN_DISPLAY(p); - *p ^= ~(BITMASK(y)-1) & pat; - p += DISPLAY_W; - h -= 8-y; - } - while (h>0) { - ASSERT_IN_DISPLAY(p); - *p ^= pat; - p += DISPLAY_W; - h -= 8; - } - if (h < 0) h += 8; - if (h) { - p -= DISPLAY_W; - ASSERT_IN_DISPLAY(p); - *p ^= ~(BITMASK(h)-1) & pat; - } -} #endif void lcd_vline(xcoord_t x, int8_t y, int8_t h) diff --git a/src/lcd.h b/src/lcd.h index 01a19bf3a..d54a87457 100644 --- a/src/lcd.h +++ b/src/lcd.h @@ -160,7 +160,11 @@ extern void lcd_plot(xcoord_t x, uint8_t y, uint8_t att=0); extern void lcd_hline(xcoord_t x, uint8_t y, xcoord_t w, uint8_t att=0); extern void lcd_hlineStip(xcoord_t x, uint8_t y, xcoord_t w, uint8_t pat, uint8_t att=0); extern void lcd_vline(xcoord_t x, int8_t y, int8_t h); +#if defined(PCBSTD) extern void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat); +#else +extern void lcd_vlineStip(xcoord_t x, int8_t y, int8_t h, uint8_t pat, uint8_t att=0); +#endif extern void lcd_rect(xcoord_t x, uint8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, uint8_t att=0); extern void lcd_filled_rect(xcoord_t x, int8_t y, xcoord_t w, uint8_t h, uint8_t pat=SOLID, uint8_t att=0); diff --git a/src/menus.cpp b/src/menus.cpp index 9cf141c7b..7c7e5f4b0 100644 --- a/src/menus.cpp +++ b/src/menus.cpp @@ -606,16 +606,15 @@ int8_t switchMenuItem(uint8_t x, uint8_t y, int8_t value, uint8_t attr, uint8_t #if defined(SDCARD) const char *s_menu[MENU_MAX_LINES]; -char s_bss_menu[MENU_MAX_LINES][MENU_LINE_LENGTH]; // TODO in reusable buffer? uint8_t s_menu_item = 0; -uint8_t s_menu_count = 0; +uint16_t s_menu_count = 0; uint8_t s_menu_flags = 0; -uint8_t s_menu_offset = 0; +uint16_t s_menu_offset = 0; const char * displayMenu(uint8_t event) { const char * result = NULL; - uint8_t display_count = min(s_menu_count, (uint8_t)MENU_MAX_LINES); + uint8_t display_count = min(s_menu_count, (uint16_t)MENU_MAX_LINES); lcd_filled_rect(10, 16, DISPLAY_W-20, display_count * (FH+1) + 2, SOLID, WHITE); lcd_rect(10, 16, DISPLAY_W-20, display_count * (FH+1) + 2); @@ -625,6 +624,17 @@ const char * displayMenu(uint8_t event) if (i == s_menu_item) lcd_filled_rect(11, i*(FH+1) + 2*FH + 1, DISPLAY_W-22, 9); } + if (s_menu_count > display_count) { + // scroll bar + lcd_vlineStip(DISPLAY_W-11, 16, MENU_MAX_LINES * (FH+1) + 2, SOLID, WHITE); + lcd_vlineStip(DISPLAY_W-11, 16, MENU_MAX_LINES * (FH+1) + 2, DOTTED); + uint8_t ofs = (MENU_MAX_LINES * (FH+1) * s_menu_offset) / s_menu_count; + uint8_t hgt = (MENU_MAX_LINES * (FH+1) * MENU_MAX_LINES) / s_menu_count; + if (hgt + ofs > MENU_MAX_LINES * (FH+1)) + hgt = MENU_MAX_LINES * (FH+1) - ofs; + lcd_vlineStip(DISPLAY_W-11, 16 + ofs, 2 + hgt, SOLID, BLACK); + } + switch(event) { case EVT_KEY_FIRST(KEY_UP): if (s_menu_item > 0) @@ -635,7 +645,7 @@ const char * displayMenu(uint8_t event) } break; case EVT_KEY_FIRST(KEY_DOWN): - if (s_menu_item < display_count - 1) + if (s_menu_item < display_count - 1 && s_menu_offset + s_menu_item + 1 < s_menu_count) s_menu_item++; else if (s_menu_count > s_menu_offset + display_count) { s_menu_offset++; diff --git a/src/menus.h b/src/menus.h index 5a933b611..417d18af4 100644 --- a/src/menus.h +++ b/src/menus.h @@ -224,17 +224,11 @@ void displayWarning(uint8_t event); #if defined(SDCARD) #define MENU_MAX_LINES 4 -#include "FatFs/ffconf.h" -#ifdef _USE_LFN -# define MENU_LINE_LENGTH (16+1) -#else -# define MENU_LINE_LENGTH (8+1) -#endif +#define MENU_LINE_LENGTH (LEN_MODEL_NAME+1) extern const char *s_menu[MENU_MAX_LINES]; -extern char s_bss_menu[MENU_MAX_LINES][MENU_LINE_LENGTH]; -extern uint8_t s_menu_count; +extern uint16_t s_menu_count; extern uint8_t s_menu_flags; -extern uint8_t s_menu_offset; +extern uint16_t s_menu_offset; const char * displayMenu(uint8_t event); #define STATUS_LINE_LENGTH 32 diff --git a/src/model_menus.cpp b/src/model_menus.cpp index 5b65e3e4b..597bf10a3 100644 --- a/src/model_menus.cpp +++ b/src/model_menus.cpp @@ -107,7 +107,7 @@ inline uint8_t eeFindEmptyModel(uint8_t id, bool down) } #if defined(SDCARD) -bool listSdFiles(const char *path, const char *extension) +bool listSdFiles(const char *path, const char *extension, const uint8_t maxlen, const char *selection) { FILINFO fno; DIR dir; @@ -118,23 +118,40 @@ bool listSdFiles(const char *path, const char *extension) fno.lfsize = sizeof(lfn); #endif + static uint16_t s_last_menu_offset = 0; + +#if defined(PCBSKY9X) + if (selection) { + memset(reusableBuffer.models.menu_bss, 0, sizeof(reusableBuffer.models.menu_bss)); + strcpy(reusableBuffer.models.menu_bss[0], path); + strcat(reusableBuffer.models.menu_bss[0], "/"); + strncat(reusableBuffer.models.menu_bss[0], selection, maxlen); + strcat(reusableBuffer.models.menu_bss[0], SOUNDS_EXT); + if (f_stat(reusableBuffer.models.menu_bss[0], &fno) != FR_OK) { + selection = NULL; + } + } +#endif + + if (s_menu_offset == 0) { + s_last_menu_offset = 0; + memset(reusableBuffer.models.menu_bss, 0, sizeof(reusableBuffer.models.menu_bss)); + } + else if (s_menu_offset == s_last_menu_offset) { + return true; // should not happen, only there because of Murphy's law + } + else if (s_menu_offset > s_last_menu_offset) { + memmove(reusableBuffer.models.menu_bss[0], reusableBuffer.models.menu_bss[1], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH); + memset(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], 0xff, MENU_LINE_LENGTH); + } + else { + memmove(reusableBuffer.models.menu_bss[1], reusableBuffer.models.menu_bss[0], (MENU_MAX_LINES-1)*MENU_LINE_LENGTH); + memset(reusableBuffer.models.menu_bss[0], 0, MENU_LINE_LENGTH); + } + s_menu_count = 0; s_menu_flags = BSS; - static uint16_t s_last_menu_offset = 65535; - char hidden_line[MENU_LINE_LENGTH] = ""; - - if (s_menu_offset == 0) - s_last_menu_offset = 0; -/* else if (s_menu_offset >= s_menu_count-MENU_MAX_LINES) - s_last_menu_offset = s_menu_offset+1; */ - else if (s_menu_offset > s_last_menu_offset) - memcpy(hidden_line, s_bss_menu[0], MENU_LINE_LENGTH); - else - memcpy(hidden_line, s_bss_menu[MENU_MAX_LINES-1], MENU_LINE_LENGTH); - - memset(s_bss_menu, 0, sizeof(s_bss_menu)); - FRESULT res = f_opendir(&dir, path); /* Open the directory */ if (res == FR_OK) { for (;;) { @@ -148,39 +165,48 @@ bool listSdFiles(const char *path, const char *extension) #endif uint8_t len = strlen(fn); - if (len < 5 || strcmp(fn+len-4, extension) || (fno.fattrib & AM_DIR)) continue; + if (len < 5 || len > maxlen+4 || strcmp(fn+len-4, extension) || (fno.fattrib & AM_DIR)) continue; - fn[len-4] = '\0'; s_menu_count++; + fn[len-4] = '\0'; - for (uint8_t i=0; i= s_last_menu_offset) { - line = s_bss_menu[i]; - if ((!hidden_line[0] || (strcmp(hidden_line, fn) < 0)) && (line[0] == '\0' || strcmp(fn, line) < 0)) { - if (i < MENU_MAX_LINES-1) - memmove(s_bss_menu[i+1], line, sizeof(s_bss_menu[i]) * (MENU_MAX_LINES-1-i)); - strcpy(line, fn); - break; - } + if (s_menu_offset == 0) { + if (selection && strncmp(fn, selection, maxlen) < 0) { + s_last_menu_offset++; } else { - line = s_bss_menu[MENU_MAX_LINES-1-i]; - if ((!hidden_line[0] || (strcmp(hidden_line, fn) > 0)) && (line[0] == '\0' || strcmp(fn, line) > 0)) { - if (i < MENU_MAX_LINES-1) - memmove(s_bss_menu, s_bss_menu[1], sizeof(s_bss_menu[0]) * (MENU_MAX_LINES-1-i)); - strcpy(line, fn); - break; + for (uint8_t i=0; i s_last_menu_offset) { + if (strcmp(fn, reusableBuffer.models.menu_bss[MENU_MAX_LINES-2]) > 0 && strcmp(fn, reusableBuffer.models.menu_bss[MENU_MAX_LINES-1]) < 0) { + memset(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], 0, MENU_LINE_LENGTH); + strcpy(reusableBuffer.models.menu_bss[MENU_MAX_LINES-1], fn); + } + } + else { + if (strcmp(fn, reusableBuffer.models.menu_bss[1]) < 0 && strcmp(fn, reusableBuffer.models.menu_bss[0]) > 0) { + memset(reusableBuffer.models.menu_bss[0], 0, MENU_LINE_LENGTH); + strcpy(reusableBuffer.models.menu_bss[0], fn); + } } } - - for (uint8_t i=0; i 0) + s_last_menu_offset = s_menu_offset; + else + s_menu_offset = s_last_menu_offset; return s_menu_count; } @@ -473,7 +499,7 @@ void menuModelSelect(uint8_t event) s_warning = eeBackupModel(sub); } else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { - if (!listSdFiles(MODELS_PATH, MODELS_EXT)) { + if (!listSdFiles(MODELS_PATH, MODELS_EXT, 10, NULL)) { s_warning = STR_NO_MODELS_ON_SD; s_menu_flags = 0; } @@ -2603,7 +2629,7 @@ void menuModelFunctionSwitches(uint8_t event) lcd_putsiAtt(15*FW, y, STR_VCSWFUNC, 0, attr); if (active && event==EVT_KEY_BREAK(KEY_MENU)) { s_editMode = 0; - if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT)) { + if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, 6, sd->param)) { s_warning = STR_NO_SOUNDS_ON_SD; s_menu_flags = 0; } @@ -2685,7 +2711,7 @@ void menuModelFunctionSwitches(uint8_t event) const char * result = displayMenu(_event); if (result) { if (result == STR_UPDATE_LIST) { - if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT)) { + if (!listSdFiles(SOUNDS_PATH, SOUNDS_EXT, 6, NULL)) { s_warning = STR_NO_SOUNDS_ON_SD; s_menu_flags = 0; } diff --git a/src/myeeprom.h b/src/myeeprom.h index 5e8f40a46..7517a2d99 100644 --- a/src/myeeprom.h +++ b/src/myeeprom.h @@ -174,6 +174,8 @@ PACK(typedef struct t_EEGeneral { // eeprom modelspec +#define LEN_MODEL_NAME 10 + #if defined(PCBX9D) #define LEN_EXPOMIX_NAME 10 #define LEN_FP_NAME 10 @@ -718,7 +720,7 @@ PACK(typedef struct t_TimerDataExtra { #endif PACK(typedef struct t_ModelData { - char name[10]; // must be first for eeLoadModelName + char name[LEN_MODEL_NAME]; // must be first for eeLoadModelName TimerData timers[MAX_TIMERS]; uint8_t protocol:3; uint8_t thrTrim:1; // Enable Throttle Trim diff --git a/src/open9x.cpp b/src/open9x.cpp index 9e4b6ee4a..3d497788e 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -1564,7 +1564,11 @@ void resetTimer(uint8_t idx) void resetAll() { - AUDIO_RESET(); + static bool firstReset = true; + if (firstReset) + firstReset = false; + else + AUDIO_RESET(); resetTimer(0); resetTimer(1); @@ -1745,6 +1749,8 @@ void testFunc() #ifdef SIMU printf("testFunc\n"); fflush(stdout); #endif + + while (1); } #endif diff --git a/src/open9x.h b/src/open9x.h index 1bdcb70d6..ac3952b6a 100644 --- a/src/open9x.h +++ b/src/open9x.h @@ -154,8 +154,8 @@ typedef const int8_t pm_int8_t; #define pgm_read_adr(x) *(x) #define cli() #define sei() -#define wdt_disable() WDT->WDT_MR = WDT_MR_WDDIS; -#define wdt_enable(x) WDT->WDT_MR = 0x3FFF2FFF +#define wdt_disable() +#define wdt_enable(x) WDT->WDT_MR = 0x3FFF217F; #define wdt_reset() WDT->WDT_CR = 0xA5000001 extern void board_init(); #else @@ -1166,23 +1166,28 @@ union ReusableBuffer /* 128 bytes on stock */ #if !defined(PCBSKY9X) - uint8_t eefs_buffer[BLOCKS]; // used by EeFsck + uint8_t eefs_buffer[BLOCKS]; // 128bytes used by EeFsck #endif struct { - char mainname[42]; // used by menuModelSelect and for SD card archive / restore - char listnames[7][10]; + char mainname[42]; + char listnames[7][LEN_MODEL_NAME]; uint16_t listsizes[7]; uint16_t eepromfree; - } models; + +#if defined(SDCARD) + char menu_bss[MENU_MAX_LINES][MENU_LINE_LENGTH]; +#endif + + } models; // 128bytes used by menuModelSelect (mainname reused for SD card archive / restore) struct { int16_t midVals[7]; int16_t loVals[7]; int16_t hiVals[7]; - } calib; // used by menuGeneralCalib + } calib; // 42 bytes used by menuGeneralCalib #if defined(SDCARD) struct diff --git a/src/simpgmspace.cpp b/src/simpgmspace.cpp index 226bae3d6..dfee0b2e0 100644 --- a/src/simpgmspace.cpp +++ b/src/simpgmspace.cpp @@ -35,6 +35,7 @@ #include #include #include +#include volatile uint8_t pinb=0xff, pinc=0xff, pind, pine=0xff, ping=0xff, pinh=0xff, pinj=0xff, pinl=0; uint8_t portb, portc, porth=0, dummyport; @@ -294,9 +295,11 @@ namespace simu { FATFS g_FATFS_Obj; #endif -FRESULT f_stat (const TCHAR*, FILINFO*) +FRESULT f_stat (const TCHAR * path, FILINFO *) { - return FR_OK; + struct stat tmp; + // printf("f_stat(%s)\n", path); fflush(stdout); + return stat(path, &tmp) ? FR_INVALID_NAME : FR_OK; } FRESULT f_mount (BYTE, FATFS*) @@ -312,7 +315,6 @@ FRESULT f_open (FIL * fil, const TCHAR *name, BYTE) FRESULT f_read (FIL*, void*, UINT, UINT*) { - return FR_OK; } diff --git a/src/sky9x/debug.cpp b/src/sky9x/debug.cpp index 97bbd4d91..029f9ee36 100644 --- a/src/sky9x/debug.cpp +++ b/src/sky9x/debug.cpp @@ -82,6 +82,49 @@ void dump(unsigned char *data, unsigned int size) debugPuts("\n\r"); } +/** + * Configures a UART peripheral with the specified parameters. + * + * baudrate Baudrate at which the UART should operate (in Hz). + * masterClock Frequency of the system master clock (in Hz). + * uses PA9 and PA10, RXD2 and TXD2 + */ +void DEBUG_UART_Configure( uint32_t baudrate, uint32_t masterClock) +{ + register Uart *pUart = CONSOLE_USART; + + /* Configure PIO */ + configure_pins( (PIO_PA9 | PIO_PA10), PIN_PERIPHERAL | PIN_INPUT | PIN_PER_A | PIN_PORTA | PIN_NO_PULLUP ) ; + + /* Configure PMC */ + PMC->PMC_PCER0 = 1 << CONSOLE_ID; + + /* Reset and disable receiver & transmitter */ + pUart->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX + | UART_CR_RXDIS | UART_CR_TXDIS; + + /* Configure mode */ + pUart->UART_MR = 0x800 ; // NORMAL, No Parity + + /* Configure baudrate */ + /* Asynchronous, no oversampling */ + pUart->UART_BRGR = (masterClock / baudrate) / 16; + + /* Disable PDC channel */ + pUart->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + /* Enable receiver and transmitter */ + pUart->UART_CR = UART_CR_RXEN | UART_CR_TXEN; + pUart->UART_IER = UART_IER_RXRDY ; + NVIC_EnableIRQ(UART0_IRQn) ; +} + +void DEBUG_UART_Stop() +{ + CONSOLE_USART->UART_IDR = UART_IDR_RXRDY ; + NVIC_DisableIRQ(UART0_IRQn) ; +} + Fifo32 debugFifo; extern "C" void UART0_IRQHandler() @@ -89,7 +132,6 @@ extern "C" void UART0_IRQHandler() debugFifo.push(CONSOLE_USART->UART_RHR); } - void debugTask(void* pdata) { uint8_t rxchar ; diff --git a/src/sky9x/debug.h b/src/sky9x/debug.h index 37191c853..404fee4fb 100644 --- a/src/sky9x/debug.h +++ b/src/sky9x/debug.h @@ -34,6 +34,8 @@ #ifndef debug_h #define debug_h +#include + #if defined(DEBUG) #ifdef __cplusplus @@ -57,6 +59,9 @@ void dump(unsigned char *data, unsigned int size); #define TRACE_ERROR(...) debugPuts("-E- " __VA_ARGS__) #define DUMP(data, size) dump(data, size) +void DEBUG_UART_Configure( uint32_t baudrate, uint32_t masterClock); +void DEBUG_UART_Stop(); + void debugTask(void* pdata); #else @@ -70,6 +75,9 @@ void debugTask(void* pdata); #define TRACE_ERROR(...) { } #define DUMP(...) { } +#define DEBUG_UART_Configure(...) +#define DEBUG_UART_Stop(...) + #endif #endif diff --git a/src/sky9x/diskio.cpp b/src/sky9x/diskio.cpp index d3f99908f..a3e9ca3b4 100644 --- a/src/sky9x/diskio.cpp +++ b/src/sky9x/diskio.cpp @@ -86,9 +86,7 @@ uint32_t Card_SCR[2] ; uint32_t Card_CSD[4] ; int32_t Card_state = SD_ST_STARTUP ; volatile uint32_t Card_initialized = 0; -uint32_t Sd_128_resp[4] ; uint32_t Sd_rca ; -uint32_t Cmd_8_resp ; uint32_t Cmd_A41_resp ; uint8_t cardType; uint32_t transSpeed; @@ -1102,8 +1100,6 @@ uint32_t sd_card_mounted( void ) uint32_t sd_read_block(uint32_t block_no, uint32_t *data) { - uint32_t result = 0; -// int32_t retry; unsigned int status = 0; // TRACE_ERROR("read block %d", block_no); @@ -1132,24 +1128,24 @@ uint32_t sd_read_block(uint32_t block_no, uint32_t *data) while (1) { if ((HSMCI->HSMCI_SR & (HSMCI_SR_ENDRX|HSMCI_SR_XFRDONE)) == (HSMCI_SR_ENDRX|HSMCI_SR_XFRDONE)) { - result = 1; break; } } - } - /* Disable PDC */ - HSMCI->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; - HSMCI->HSMCI_PTCR = HSMCI_PTCR_RXTDIS | HSMCI_PTCR_TXTDIS; + /* Disable PDC */ + HSMCI->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; + HSMCI->HSMCI_PTCR = HSMCI_PTCR_RXTDIS | HSMCI_PTCR_TXTDIS; + + return 1; + } // TRACE_ERROR("ok %.2X %.4Xd\n\r", HSMCI->HSMCI_SR, HSMCI->HSMCI_RSPR[0]); - return result; + return 0; } uint32_t sd_write_block( uint32_t block_no, uint32_t *data ) { - uint32_t result = 0; unsigned int status = 0; if (sd_card_ready()) { @@ -1167,7 +1163,6 @@ uint32_t sd_write_block( uint32_t block_no, uint32_t *data ) HSMCI->HSMCI_ARGR = (Cmd_A41_resp & OCR_SD_CCS ? block_no : (block_no << 9)); HSMCI->HSMCI_TPR = (uint32_t)data; HSMCI->HSMCI_TCR = 512 / 4; - // HSMCI->HSMCI_PTCR = HSMCI_PTCR_TXTEN; HSMCI->HSMCI_CMDR = SD_WRITE_SINGLE_BLOCK; while (!(HSMCI->HSMCI_SR & HSMCI_SR_CMDRDY)); @@ -1178,17 +1173,18 @@ uint32_t sd_write_block( uint32_t block_no, uint32_t *data ) while (1) { if ((HSMCI->HSMCI_SR & (HSMCI_SR_NOTBUSY|HSMCI_SR_XFRDONE)) == (HSMCI_SR_NOTBUSY|HSMCI_SR_XFRDONE)) { - result = 1; break; } } + + /* Disable PDC */ + HSMCI->HSMCI_PTCR = HSMCI_PTCR_RXTDIS | HSMCI_PTCR_TXTDIS; + HSMCI->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; + + return 1; } - /* Disable PDC */ - HSMCI->HSMCI_PTCR = HSMCI_PTCR_RXTDIS | HSMCI_PTCR_TXTDIS; - HSMCI->HSMCI_MR &= ~(uint32_t)HSMCI_MR_PDCMODE; - - return result; + return 0; } /* @@ -1237,54 +1233,6 @@ DSTATUS disk_initialize ( if (drv) return STA_NOINIT; /* Supports only single drive */ if ( sd_card_ready() == 0 ) return RES_NOTRDY; return RES_OK; - -#if 0 - BYTE n, cmd, ty, ocr[4]; - - - if (drv) return STA_NOINIT; /* Supports only single drive */ - - if (Stat & STA_NODISK) return Stat; /* No card in the socket */ - - power_on(); /* Force socket power on */ - FCLK_SLOW(); - for (n = 10; n; n--) rcvr_spi(); /* 80 dummy clocks */ - - ty = 0; - if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ - Timer1 = 100; /* Initialization timeout of 1000 msec */ - if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */ - for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); /* Get trailing return value of R7 resp */ - if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ - while (Timer1 && send_cmd(ACMD41, 1UL << 30)); /* Wait for leaving idle state (ACMD41 with HCS bit) */ - if (Timer1 && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ - for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); - ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* SDv2 */ - } - } - } else { /* SDv1 or MMCv3 */ - if (send_cmd(ACMD41, 0) <= 1) { - ty = CT_SD1; cmd = ACMD41; /* SDv1 */ - } else { - ty = CT_MMC; cmd = CMD1; /* MMCv3 */ - } - while (Timer1 && send_cmd(cmd, 0)); /* Wait for leaving idle state */ - if (!Timer1 || send_cmd(CMD16, 512) != 0) /* Set R/W block length to 512 */ - ty = 0; - } - } - CardType = ty; - deselect(); - - if (ty) { /* Initialization succeded */ - Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ - FCLK_FAST(); - } else { /* Initialization failed */ - power_off(); - } - - return Stat; -#endif } /*-----------------------------------------------------------------------*/