[sky9x] Issue 142 fixed

[sky9x] Tada was cut
[sky9x] Issue 99 fixed
[sky9x / gruvin9x] Menu popup has now a scrollbar on the right
[sky9x] WDT was not working at all
This commit is contained in:
bsongis
2012-10-08 21:16:00 +00:00
parent acb7822712
commit e02dd7a751
13 changed files with 216 additions and 213 deletions
+2 -46
View File
@@ -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() ;
+34 -34
View File
@@ -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)
+4
View File
@@ -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);
+15 -5
View File
@@ -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++;
+3 -9
View File
@@ -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
+66 -40
View File
@@ -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<MENU_MAX_LINES; i++) {
char *line;
if (s_menu_offset >= 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<MENU_MAX_LINES; i++) {
char *line = reusableBuffer.models.menu_bss[i];
if (line[0] == '\0' || strcmp(fn, line) < 0) {
if (i < MENU_MAX_LINES-1) memmove(reusableBuffer.models.menu_bss[i+1], line, sizeof(reusableBuffer.models.menu_bss[i]) * (MENU_MAX_LINES-1-i));
memset(line, 0, MENU_LINE_LENGTH);
strcpy(line, fn);
break;
}
}
}
for (uint8_t i=0; i<min(s_menu_count, (uint16_t)MENU_MAX_LINES); i++)
s_menu[i] = reusableBuffer.models.menu_bss[i];
}
else if (s_menu_offset > 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<min(s_menu_count, (uint8_t)MENU_MAX_LINES); i++)
s_menu[i] = s_bss_menu[i];
}
s_last_menu_offset = s_menu_offset;
if (s_menu_offset > 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;
}
+3 -1
View File
@@ -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
+7 -1
View File
@@ -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
+12 -7
View File
@@ -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
+5 -3
View File
@@ -35,6 +35,7 @@
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <sys/stat.h>
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;
}
+43 -1
View File
@@ -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 ;
+8
View File
@@ -34,6 +34,8 @@
#ifndef debug_h
#define debug_h
#include <inttypes.h>
#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
+14 -66
View File
@@ -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
}
/*-----------------------------------------------------------------------*/