remove dynamic memory allocation
This commit is contained in:
parent
b47910465f
commit
ff85359a85
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* P8000 WDC Emulator
|
* P8000 WDC Emulator
|
||||||
*
|
*
|
||||||
* $Id: wdc_main.c,v 1.8 2012/06/03 13:38:03 olivleh1 Exp $
|
* $Id: wdc_main.c,v 1.9 2012/06/03 13:51:43 olivleh1 Exp $
|
||||||
*
|
*
|
||||||
* TODO: - Different Errorcodes in the MMC layer (use defines)
|
* TODO: - Different Errorcodes in the MMC layer (use defines)
|
||||||
* - errorchecking in several places
|
* - errorchecking in several places
|
||||||
|
|
@ -29,11 +29,11 @@
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 1
|
||||||
#undef MEASURE_SDCARD_TIME
|
#undef MEASURE_SDCARD_TIME
|
||||||
#undef USE_ALLOC
|
|
||||||
|
|
||||||
void atmega_setup ( void );
|
void atmega_setup ( void );
|
||||||
|
|
||||||
#ifdef MEASURE_SDCARD_TIME
|
#ifdef MEASURE_SDCARD_TIME
|
||||||
|
void measure_performance();
|
||||||
volatile uint32_t overflow = 0;
|
volatile uint32_t overflow = 0;
|
||||||
ISR ( TIMER0_OVF_vect )
|
ISR ( TIMER0_OVF_vect )
|
||||||
{
|
{
|
||||||
|
|
@ -48,13 +48,8 @@ main ( void )
|
||||||
uint16_t data_counter;
|
uint16_t data_counter;
|
||||||
uint32_t blockno;
|
uint32_t blockno;
|
||||||
uint8_t errorcode;
|
uint8_t errorcode;
|
||||||
#ifdef USE_ALLOC
|
|
||||||
uint8_t *data_buffer = NULL;
|
|
||||||
uint8_t *cmd_buffer = NULL;
|
|
||||||
#else
|
|
||||||
uint8_t data_buffer[4096];
|
uint8_t data_buffer[4096];
|
||||||
uint8_t cmd_buffer[9];
|
uint8_t cmd_buffer[9];
|
||||||
#endif
|
|
||||||
uint8_t i8;
|
uint8_t i8;
|
||||||
uint16_t i16;
|
uint16_t i16;
|
||||||
|
|
||||||
|
|
@ -63,7 +58,282 @@ main ( void )
|
||||||
uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.01\n" ) );
|
uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.01\n" ) );
|
||||||
|
|
||||||
#ifdef MEASURE_SDCARD_TIME
|
#ifdef MEASURE_SDCARD_TIME
|
||||||
|
measure_performance();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* load Parameter Table into RAM if valid */
|
||||||
|
blockno = 0;
|
||||||
|
data_counter = 512;
|
||||||
|
while ( wdc_read_sector ( blockno, data_buffer ) ) {
|
||||||
|
#if DEBUG >= 1
|
||||||
|
uart_puts_p ( PSTR ( "Block 0 of SD-Card not readable" ) );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( data_buffer[0] == 'W' &&
|
||||||
|
data_buffer[1] == 'D' &&
|
||||||
|
data_buffer[2] == 'C' ) {
|
||||||
|
wdc_write_par_table ( data_buffer, data_counter );
|
||||||
|
};
|
||||||
|
|
||||||
|
while ( 1 ) {
|
||||||
|
|
||||||
|
wdc_wait_for_reset();
|
||||||
|
|
||||||
|
wdc_receive_cmd ( cmd_buffer
|
||||||
|
, cmd_counter
|
||||||
|
);
|
||||||
|
|
||||||
|
#if DEBUG == 2
|
||||||
|
uart_puts_p ( PSTR ( " CMD:" ) );
|
||||||
|
uart_putc_hex ( cmd_buffer[0] );
|
||||||
|
uart_putc_hex ( cmd_buffer[1] );
|
||||||
|
uart_putc_hex ( cmd_buffer[2] );
|
||||||
|
uart_putc_hex ( cmd_buffer[3] );
|
||||||
|
uart_putc_hex ( cmd_buffer[4] );
|
||||||
|
uart_putc_hex ( cmd_buffer[5] );
|
||||||
|
uart_putc_hex ( cmd_buffer[6] );
|
||||||
|
uart_putc_hex ( cmd_buffer[7] );
|
||||||
|
uart_putc_hex ( cmd_buffer[8] );
|
||||||
|
uart_putc ( '\n' );
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch ( cmd_buffer[0] ) {
|
||||||
|
case CMD_WR_BLOCK:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] );
|
||||||
|
wdc_receive_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
errorcode = 1;
|
||||||
|
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
||||||
|
errorcode = wdc_write_sector ( blockno, &data_buffer[i16] );
|
||||||
|
if ( errorcode ) break;
|
||||||
|
blockno++;
|
||||||
|
}
|
||||||
|
if ( errorcode )
|
||||||
|
wdc_send_error();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_BLOCK:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] );
|
||||||
|
errorcode = 1;
|
||||||
|
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
||||||
|
errorcode = wdc_read_sector ( blockno, &data_buffer[i16] );
|
||||||
|
if ( errorcode ) break;
|
||||||
|
blockno++;
|
||||||
|
}
|
||||||
|
if ( errorcode )
|
||||||
|
wdc_send_error();
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_WR_WDC_RAM:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_receive_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
|
||||||
|
wdc_write_data_to_ram ( data_buffer
|
||||||
|
, convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] )
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_WDC_RAM:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_read_data_from_ram ( data_buffer
|
||||||
|
, convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] )
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_PARTAB:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_read_par_table ( data_buffer
|
||||||
|
, data_counter );
|
||||||
|
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_WR_PARTAB:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_receive_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
|
||||||
|
wdc_write_wdc_par ( data_buffer
|
||||||
|
, data_counter );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_DL_BTTAB:
|
||||||
|
wdc_del_wdc_btt();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_BTTAB:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_read_wdc_btt ( data_buffer
|
||||||
|
, data_counter );
|
||||||
|
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_WR_BTTAB:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
wdc_receive_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
|
||||||
|
wdc_write_wdc_btt ( data_buffer
|
||||||
|
, data_counter );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_FMTBTT_TRACK:
|
||||||
|
data_counter = 512;
|
||||||
|
|
||||||
|
memset ( &data_buffer[0], 0x00, data_counter );
|
||||||
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
|
, cmd_buffer[4]
|
||||||
|
, cmd_buffer[5]
|
||||||
|
);
|
||||||
|
|
||||||
|
errorcode = 1;
|
||||||
|
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
||||||
|
errorcode = wdc_write_sector ( blockno, data_buffer );
|
||||||
|
if ( errorcode ) break;
|
||||||
|
blockno++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( errorcode ) {
|
||||||
|
if ( wdc_add_btt_entry ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ), cmd_buffer[4] ) ) {
|
||||||
|
wdc_send_error();
|
||||||
|
} else {
|
||||||
|
data_buffer[0] = cmd_buffer[2]; // Track Low
|
||||||
|
data_buffer[1] = cmd_buffer[3]; // Track High
|
||||||
|
data_buffer[2] = cmd_buffer[4]; // Head
|
||||||
|
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, 3
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_ST_PARBTT:
|
||||||
|
data_counter = 512;
|
||||||
|
|
||||||
|
blockno = 0;
|
||||||
|
wdc_read_par_table ( data_buffer
|
||||||
|
, data_counter );
|
||||||
|
|
||||||
|
errorcode = wdc_write_sector ( blockno, data_buffer );
|
||||||
|
if ( errorcode )
|
||||||
|
wdc_send_error();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_WDCERR:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
memset ( &data_buffer[0], 0x00, data_counter );
|
||||||
|
wdc_send_data ( data_buffer
|
||||||
|
, data_counter
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_VER_TRACK:
|
||||||
|
data_counter = 512;
|
||||||
|
|
||||||
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
|
, cmd_buffer[4]
|
||||||
|
, cmd_buffer[5]
|
||||||
|
);
|
||||||
|
errorcode = 1;
|
||||||
|
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
||||||
|
errorcode = wdc_read_sector ( blockno, data_buffer );
|
||||||
|
if ( errorcode ) break;
|
||||||
|
blockno++;
|
||||||
|
}
|
||||||
|
if ( errorcode )
|
||||||
|
wdc_send_error();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CMD_RD_SECTOR:
|
||||||
|
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
||||||
|
|
||||||
|
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
||||||
|
, cmd_buffer[4]
|
||||||
|
, cmd_buffer[5]
|
||||||
|
);
|
||||||
|
errorcode = 1;
|
||||||
|
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
||||||
|
errorcode = wdc_read_sector ( blockno, &data_buffer[i16] );
|
||||||
|
if ( errorcode ) break;
|
||||||
|
blockno++;
|
||||||
|
}
|
||||||
|
if ( errorcode )
|
||||||
|
wdc_send_error();
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
#if DEBUG >= 1
|
||||||
|
uart_puts_p ( PSTR ( " Unknown command:" ) );
|
||||||
|
uart_putc_hex ( cmd_buffer[0] );
|
||||||
|
uart_putc_hex ( cmd_buffer[1] );
|
||||||
|
uart_putc_hex ( cmd_buffer[2] );
|
||||||
|
uart_putc_hex ( cmd_buffer[3] );
|
||||||
|
uart_putc_hex ( cmd_buffer[4] );
|
||||||
|
uart_putc_hex ( cmd_buffer[5] );
|
||||||
|
uart_putc_hex ( cmd_buffer[6] );
|
||||||
|
uart_putc_hex ( cmd_buffer[7] );
|
||||||
|
uart_putc_hex ( cmd_buffer[8] );
|
||||||
|
uart_putc ( '\n' );
|
||||||
|
#endif
|
||||||
|
wdc_send_error();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void atmega_setup ( void )
|
||||||
|
{
|
||||||
|
// set_sleep_mode ( SLEEP_MODE_IDLE );
|
||||||
|
uart_init();
|
||||||
|
wdc_init_ports();
|
||||||
|
while ( wdc_init_sdcard() ) {
|
||||||
|
#if DEBUG >= 1
|
||||||
|
uart_puts_p ( PSTR ( "SDCard initialisation failed!" ) );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef MEASURE_SDCARD_TIME
|
||||||
|
void measure_performance()
|
||||||
|
{
|
||||||
uint32_t starttime;
|
uint32_t starttime;
|
||||||
|
uint8_t *data_buffer;
|
||||||
|
uint32_t blockno;
|
||||||
|
|
||||||
sei();
|
sei();
|
||||||
TIMSK0 |= ( 0x01 << TOIE0 );
|
TIMSK0 |= ( 0x01 << TOIE0 );
|
||||||
|
|
@ -95,438 +365,5 @@ main ( void )
|
||||||
uart_putc ( '\n' );
|
uart_putc ( '\n' );
|
||||||
|
|
||||||
free ( data_buffer );
|
free ( data_buffer );
|
||||||
#endif
|
|
||||||
|
|
||||||
/* load Parameter Table into RAM if valid */
|
|
||||||
blockno = 0;
|
|
||||||
data_counter = 512;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
while ( wdc_read_sector ( blockno, data_buffer ) ) {
|
|
||||||
#if DEBUG >= 1
|
|
||||||
uart_puts_p ( PSTR ( "Block 0 of SD-Card not readable" ) );
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( data_buffer[0] == 'W' &&
|
|
||||||
data_buffer[1] == 'D' &&
|
|
||||||
data_buffer[2] == 'C' ) {
|
|
||||||
wdc_write_par_table ( data_buffer, data_counter );
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while ( 1 ) {
|
|
||||||
|
|
||||||
wdc_wait_for_reset();
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
cmd_buffer = malloc ( cmd_counter * sizeof ( *cmd_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_receive_cmd ( cmd_buffer
|
|
||||||
, cmd_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#if DEBUG == 2
|
|
||||||
uart_puts_p ( PSTR ( " CMD:" ) );
|
|
||||||
uart_putc_hex ( cmd_buffer[0] );
|
|
||||||
uart_putc_hex ( cmd_buffer[1] );
|
|
||||||
uart_putc_hex ( cmd_buffer[2] );
|
|
||||||
uart_putc_hex ( cmd_buffer[3] );
|
|
||||||
uart_putc_hex ( cmd_buffer[4] );
|
|
||||||
uart_putc_hex ( cmd_buffer[5] );
|
|
||||||
uart_putc_hex ( cmd_buffer[6] );
|
|
||||||
uart_putc_hex ( cmd_buffer[7] );
|
|
||||||
uart_putc_hex ( cmd_buffer[8] );
|
|
||||||
uart_putc ( '\n' );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
switch ( cmd_buffer[0] ) {
|
|
||||||
case CMD_WR_BLOCK:
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
if ( data_counter % 512 > 0 )
|
|
||||||
data_buffer = malloc ( ( data_counter + 512 - ( data_counter % 512 ) ) * sizeof ( *data_buffer ) );
|
|
||||||
else
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] );
|
|
||||||
|
|
||||||
wdc_receive_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8 = 0;
|
|
||||||
#endif
|
|
||||||
errorcode = 1;
|
|
||||||
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
errorcode = wdc_write_sector ( blockno, data_buffer );
|
|
||||||
#else
|
|
||||||
errorcode = wdc_write_sector ( blockno, &data_buffer[i16] );
|
|
||||||
#endif
|
|
||||||
if ( errorcode ) break;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8++;
|
|
||||||
data_buffer += 512;
|
|
||||||
#endif
|
|
||||||
blockno++;
|
|
||||||
}
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer -= ( 512 * i8 );
|
|
||||||
#endif
|
|
||||||
if ( errorcode )
|
|
||||||
wdc_send_error();
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_BLOCK:
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
if ( data_counter % 512 > 0 )
|
|
||||||
data_buffer = malloc ( ( data_counter + 512 - ( data_counter % 512 ) ) * sizeof ( *data_buffer ) );
|
|
||||||
else
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
blockno = wdc_p8kblock2sdblock ( ( ( uint32_t ) cmd_buffer[5] << 24 ) | ( ( uint32_t ) cmd_buffer[4] << 16 ) | ( ( uint16_t ) cmd_buffer[3] << 8 ) | cmd_buffer[2] );
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8 = 0;
|
|
||||||
#endif
|
|
||||||
errorcode = 1;
|
|
||||||
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
errorcode = wdc_read_sector ( blockno, data_buffer );
|
|
||||||
#else
|
|
||||||
errorcode = wdc_read_sector ( blockno, &data_buffer[i16] );
|
|
||||||
#endif
|
|
||||||
if ( errorcode ) break;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8++;
|
|
||||||
data_buffer += 512;
|
|
||||||
#endif
|
|
||||||
blockno++;
|
|
||||||
}
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer -= ( 512 * i8 );
|
|
||||||
#endif
|
|
||||||
if ( errorcode )
|
|
||||||
wdc_send_error();
|
|
||||||
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_WR_WDC_RAM:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_receive_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
wdc_write_data_to_ram ( data_buffer
|
|
||||||
, convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] )
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_WDC_RAM:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_read_data_from_ram ( data_buffer
|
|
||||||
, convert_ram_address ( ( cmd_buffer[2] << 8 ) | cmd_buffer[1] )
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_PARTAB:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_read_par_table ( data_buffer
|
|
||||||
, data_counter );
|
|
||||||
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_WR_PARTAB:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_receive_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
wdc_write_wdc_par ( data_buffer
|
|
||||||
, data_counter );
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_DL_BTTAB:
|
|
||||||
|
|
||||||
wdc_del_wdc_btt();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_BTTAB:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_read_wdc_btt ( data_buffer
|
|
||||||
, data_counter );
|
|
||||||
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_WR_BTTAB:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_receive_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
wdc_write_wdc_btt ( data_buffer
|
|
||||||
, data_counter );
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_FMTBTT_TRACK:
|
|
||||||
|
|
||||||
data_counter = 512;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
|
||||||
#else
|
|
||||||
memset ( &data_buffer[0], 0x00, 512 );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
|
||||||
, cmd_buffer[4]
|
|
||||||
, cmd_buffer[5]
|
|
||||||
);
|
|
||||||
|
|
||||||
errorcode = 1;
|
|
||||||
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
|
||||||
errorcode = wdc_write_sector ( blockno, data_buffer );
|
|
||||||
if ( errorcode ) break;
|
|
||||||
blockno++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( errorcode ) {
|
|
||||||
if ( wdc_add_btt_entry ( cmd_buffer[2] | ( cmd_buffer[3] << 8 ), cmd_buffer[4] ) ) {
|
|
||||||
wdc_send_error();
|
|
||||||
} else {
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
data_buffer = malloc ( 3 * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
data_buffer[0] = cmd_buffer[2]; // Track Low
|
|
||||||
data_buffer[1] = cmd_buffer[3]; // Track High
|
|
||||||
data_buffer[2] = cmd_buffer[4]; // Head
|
|
||||||
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, 3
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_ST_PARBTT:
|
|
||||||
|
|
||||||
blockno = 0;
|
|
||||||
|
|
||||||
data_counter = 512;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
wdc_read_par_table ( data_buffer
|
|
||||||
, data_counter );
|
|
||||||
|
|
||||||
errorcode = wdc_write_sector ( blockno, data_buffer );
|
|
||||||
if ( errorcode )
|
|
||||||
wdc_send_error();
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_WDCERR:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = calloc ( data_counter, sizeof ( *data_buffer ) );
|
|
||||||
#else
|
|
||||||
memset ( &data_buffer[0], 0x00, 512 );
|
|
||||||
#endif
|
|
||||||
wdc_send_data ( data_buffer
|
|
||||||
, data_counter
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_VER_TRACK:
|
|
||||||
|
|
||||||
data_counter = 512;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
|
||||||
, cmd_buffer[4]
|
|
||||||
, cmd_buffer[5]
|
|
||||||
);
|
|
||||||
|
|
||||||
errorcode = 1;
|
|
||||||
for ( i8 = 0; i8 < wdc_get_hdd_sectors(); i8++ ) {
|
|
||||||
errorcode = wdc_read_sector ( blockno, data_buffer );
|
|
||||||
if ( errorcode ) break;
|
|
||||||
blockno++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( errorcode )
|
|
||||||
wdc_send_error();
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_RD_SECTOR:
|
|
||||||
|
|
||||||
data_counter = ( cmd_buffer[7] << 8 ) | cmd_buffer[6];
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
if ( data_counter % 512 > 0 )
|
|
||||||
data_buffer = malloc ( ( data_counter + 512 - ( data_counter % 512 ) ) * sizeof ( *data_buffer ) );
|
|
||||||
else
|
|
||||||
data_buffer = malloc ( data_counter * sizeof ( *data_buffer ) );
|
|
||||||
#endif
|
|
||||||
blockno = wdc_sector2sdblock ( cmd_buffer[2] | ( cmd_buffer[3] << 8 )
|
|
||||||
, cmd_buffer[4]
|
|
||||||
, cmd_buffer[5]
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8 = 0;
|
|
||||||
#endif
|
|
||||||
errorcode = 1;
|
|
||||||
for ( i16 = 0; i16 < data_counter; i16 += 512 ) {
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
errorcode = wdc_read_sector ( blockno, data_buffer );
|
|
||||||
#else
|
|
||||||
errorcode = wdc_read_sector ( blockno, &data_buffer[i16] );
|
|
||||||
#endif
|
|
||||||
if ( errorcode ) break;
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
i8++;
|
|
||||||
data_buffer += 512;
|
|
||||||
#endif
|
|
||||||
blockno++;
|
|
||||||
}
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
data_buffer -= ( 512 * i8 );
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ( errorcode )
|
|
||||||
wdc_send_error();
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( data_buffer );
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
#if DEBUG >= 1
|
|
||||||
uart_puts_p ( PSTR ( " Unknown command:" ) );
|
|
||||||
uart_putc_hex ( cmd_buffer[0] );
|
|
||||||
uart_putc_hex ( cmd_buffer[1] );
|
|
||||||
uart_putc_hex ( cmd_buffer[2] );
|
|
||||||
uart_putc_hex ( cmd_buffer[3] );
|
|
||||||
uart_putc_hex ( cmd_buffer[4] );
|
|
||||||
uart_putc_hex ( cmd_buffer[5] );
|
|
||||||
uart_putc_hex ( cmd_buffer[6] );
|
|
||||||
uart_putc_hex ( cmd_buffer[7] );
|
|
||||||
uart_putc_hex ( cmd_buffer[8] );
|
|
||||||
uart_putc ( '\n' );
|
|
||||||
#endif
|
|
||||||
wdc_send_error();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef USE_ALLOC
|
|
||||||
free ( cmd_buffer );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void atmega_setup ( void )
|
|
||||||
{
|
|
||||||
// set_sleep_mode ( SLEEP_MODE_IDLE );
|
|
||||||
uart_init();
|
|
||||||
wdc_init_ports();
|
|
||||||
while ( wdc_init_sdcard() ) {
|
|
||||||
#if DEBUG >= 1
|
|
||||||
uart_puts_p ( PSTR ( "SDCard initialisation failed!" ) );
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue