From e9cdb6216e12a3a196d2053a4020358a2c68e468 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Sat, 16 Jun 2012 19:34:39 +0000 Subject: [PATCH] PATA should work now --- .../P8000_WDC_Emulator/Debug/Makefile | 12 +- .../P8000_WDC_Emulator/Debug/makedep.mk | 2 +- .../Hardware/P8000_WDC_Emulator.pdf | Bin 35794 -> 35794 bytes .../Hardware/P8000_WDC_Emulator.sch | 10 +- .../P8000_WDC_Emulator/Makefile | 3 +- .../P8000_WDC_Emulator.cproj | 8 +- .../P8000_WDC_Emulator/wdc_config.h | 10 +- .../P8000_WDC_Emulator/wdc_drv_pata.c | 127 +++++++++++++----- .../P8000_WDC_Emulator/wdc_drv_pata.h | 4 +- .../P8000_WDC_Emulator/wdc_if_disk_perf.c | 4 +- .../P8000_WDC_Emulator/wdc_main.c | 8 +- 11 files changed, 124 insertions(+), 64 deletions(-) diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile index 7437ee3..ad3c0c9 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/Makefile @@ -39,7 +39,7 @@ C_SRCS += \ ../wdc_drv_pata.c \ ../wdc_main.c \ ../wdc_drv_mmc.c \ -../wdc_drv_mmc_perf.c \ +../wdc_if_disk_perf.c \ ../uart.c \ ../wdc_if_p8000.c \ ../wdc_if_disk.c \ @@ -58,7 +58,7 @@ wdc_avr.o \ wdc_drv_pata.o \ wdc_main.o \ wdc_drv_mmc.o \ -wdc_drv_mmc_perf.o \ +wdc_if_disk_perf.o \ uart.o \ wdc_if_p8000.o \ wdc_if_disk.o \ @@ -71,7 +71,7 @@ wdc_avr.o \ wdc_drv_pata.o \ wdc_main.o \ wdc_drv_mmc.o \ -wdc_drv_mmc_perf.o \ +wdc_if_disk_perf.o \ uart.o \ wdc_if_p8000.o \ wdc_if_disk.o \ @@ -84,7 +84,7 @@ wdc_avr.d \ wdc_drv_pata.d \ wdc_main.d \ wdc_drv_mmc.d \ -wdc_drv_mmc_perf.d \ +wdc_if_disk_perf.d \ uart.d \ wdc_if_p8000.d \ wdc_if_disk.d \ @@ -97,7 +97,7 @@ wdc_avr.d \ wdc_drv_pata.d \ wdc_main.d \ wdc_drv_mmc.d \ -wdc_drv_mmc_perf.d \ +wdc_if_disk_perf.d \ uart.d \ wdc_if_p8000.d \ wdc_if_disk.d \ @@ -138,7 +138,7 @@ OUTPUT_FILE_DEP:= ./makedep.mk ./%.o: .././%.c @echo Building file: $< @echo Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2 - $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -O1 -ffunction-sections -fpack-struct -fshort-enums -Wall -Wundef -Werror -pedantic -pedantic-errors -c -std=c99 -save-temps -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mmcu=atmega1284p -o"$@" "$<" + $(QUOTE)C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe$(QUOTE) -funsigned-char -funsigned-bitfields -O1 -ffunction-sections -fpack-struct -fshort-enums -c -std=gnu99 -save-temps -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -mmcu=atmega1284p -o"$@" "$<" @echo Finished building: $< diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk index 879e2b8..6a3775d 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Debug/makedep.mk @@ -10,7 +10,7 @@ wdc_main.c wdc_drv_mmc.c -wdc_drv_mmc_perf.c +wdc_if_disk_perf.c uart.c diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.pdf b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.pdf index ebd1b871623895433628b29b23b7fdaf941a1d98..f0df6ee4ab8f1159e913e3f949d514d90e185c08 100644 GIT binary patch delta 16622 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 delta 16622 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 JQF$?h{{tdtDoy|Z diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch index 98660f2..ee95129 100755 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Hardware/P8000_WDC_Emulator.sch @@ -174,7 +174,7 @@ T 67100 33100 9 8 1 0 0 0 1 T 68500 33100 9 8 1 0 0 0 1 1 T 71000 33400 9 7 1 0 0 0 1 -$Revision: 1.16 $ / $Date: 2012/06/16 10:49:19 $ +$Revision: 1.17 $ / $Date: 2012/06/16 19:34:40 $ T 71000 33100 9 8 1 0 0 0 1 Oliver Lehmann N 50600 59400 51200 59400 4 @@ -930,14 +930,14 @@ C 45100 50300 1 0 1 busripper-1.sym T 45100 50700 5 8 0 0 0 6 1 device=none T 45200 50400 5 10 1 1 0 0 1 -pinlabel=DA1 +pinlabel=DA2 } C 45100 50000 1 0 1 busripper-1.sym { T 45100 50400 5 8 0 0 0 6 1 device=none T 45200 50100 5 10 1 1 0 0 1 -pinlabel=DA2 +pinlabel=DA1 } C 45100 56300 1 0 1 busripper-1.sym { @@ -1179,7 +1179,7 @@ pinlabel=DA0 N 66000 39600 69800 39600 4 { T 66000 39700 5 10 1 1 0 0 1 -pinlabel=DA2 +pinlabel=DA1 } N 67500 41200 66000 41200 4 { @@ -1204,7 +1204,7 @@ pinlabel=\_CS1\_ N 62700 39200 64600 39200 4 { T 64600 39300 5 10 1 1 0 6 1 -pinlabel=DA1 +pinlabel=DA2 } N 64600 40400 63500 40400 4 { diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/Makefile b/P8000_WDC_Emulator/P8000_WDC_Emulator/Makefile index 79f8fb7..46363c9 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/Makefile +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/Makefile @@ -15,10 +15,11 @@ OBJS += \ wdc_avr.o \ wdc_main.o \ wdc_drv_mmc.o \ -wdc_drv_mmc_perf.o \ +wdc_drv_pata.o \ uart.o \ wdc_if_p8000.o \ wdc_if_disk.o \ +wdc_if_disk_perf.o \ wdc_par.o \ wdc_ram.o diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj index 1bd8594..31527f4 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/P8000_WDC_Emulator.cproj @@ -54,12 +54,6 @@ True True True - True - True - True - True - True - -std=c99 True @@ -98,7 +92,7 @@ compile - + compile diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_config.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_config.h index 735f975..aabab43 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_config.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_config.h @@ -26,7 +26,7 @@ */ /* - * $Id: wdc_config.h,v 1.16 2012/06/14 20:24:24 olivleh1 Exp $ + * $Id: wdc_config.h,v 1.17 2012/06/16 19:34:39 olivleh1 Exp $ */ @@ -107,8 +107,8 @@ #define PIN_ATACS_CS0 PINB0 #define PIN_ATACS_CS1 PINB1 #define PIN_ATADA_DA0 PIND2 -#define PIN_ATADA_DA1 PIND3 -#define PIN_ATADA_DA2 PIND4 +#define PIN_ATADA_DA1 PIND4 +#define PIN_ATADA_DA2 PIND3 /* * maximum performance with both turned off @@ -120,8 +120,8 @@ #define MMC_MULTIBLOCK 1 -#define MEASURE_SDCARD_TIME 1 -#undef MEASURE_SDCARD_TIME +#define MEASURE_DISK_PERFORMANCE 1 +#undef MEASURE_DISK_PERFORMANCE #define DEBUG 1 diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.c index b0ca22e..3d9f1b9 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.c @@ -26,7 +26,7 @@ */ /* - * $Id: wdc_drv_pata.c,v 1.6 2012/06/16 08:39:01 olivleh1 Exp $ + * $Id: wdc_drv_pata.c,v 1.7 2012/06/16 19:34:39 olivleh1 Exp $ */ #include "wdc_config.h" @@ -56,11 +56,17 @@ void pata_read_bytes ( uint8_t *buffer, uint16_t bytes ); * ||+--- DA0 * |||+-- DA1 * ||||+- DA2 - * |||||*/ -#define PATA_RD_STATUS_REGISTER 0x0F /* 0b01111*/ -#define PATA_WR_COMMAND_REGISTER 0x0F /* 0b01111*/ -#define PATA_WR_DEVICE_CONTROL_REGISTER 0x0B /* 0b01011*/ -#define PATA_RD_DATA_REGISTER 0x08 /* 0b01000*/ + * ||||| */ +#define PATA_R_STATUS_REGISTER 0x0F /* 0b01111 */ +#define PATA_W_COMMAND_REGISTER 0x0F /* 0b01111 */ +#define PATA_W_DEVICE_CONTROL_REGISTER 0x0B /* 0b01011 */ + +#define PATA_RW_DATA_REGISTER 0x08 /* 0b01000 */ +#define PATA_RW_SECTOR_COUNT_REGISTER 0b00001010 +#define PATA_RW_SECTOR_NUMBER_REGISTER 0b00001110 +#define PATA_RW_CYLINDER_LOW_REGISTER 0b00001001 +#define PATA_RW_CYLINDER_HIGH_REGISTER 0b00001101 +#define PATA_RW_DEVICE_HEAD_REGISTER 0b00001011 #define ata_ctl_high() ata_cs0_disable();ata_cs1_disable();ata_da0_disable();ata_da1_disable();ata_da2_disable(); @@ -72,17 +78,17 @@ void pata_read_bytes ( uint8_t *buffer, uint16_t bytes ); uint8_t pata_rdy() { - return ( read_io_register ( PATA_RD_STATUS_REGISTER ) & ATA_STAT_RDY ) ? 1 : 0; + return ( read_io_register ( PATA_R_STATUS_REGISTER ) & ATA_STAT_RDY ) ? 1 : 0; } uint8_t pata_bsy() { - return ( read_io_register ( PATA_RD_STATUS_REGISTER ) & ATA_STAT_BSY ) ? 1 : 0; + return ( read_io_register ( PATA_R_STATUS_REGISTER ) & ATA_STAT_BSY ) ? 1 : 0; } uint8_t pata_drq() { - return ( read_io_register ( PATA_RD_STATUS_REGISTER ) & ATA_STAT_DRQ ) ? 1 : 0; + return ( read_io_register ( PATA_R_STATUS_REGISTER ) & ATA_STAT_DRQ ) ? 1 : 0; } void set_io_register ( uint8_t ioreg ) @@ -115,6 +121,7 @@ void pata_set_highbyte ( uint8_t byte ) enable_atalatch(); nop(); nop(); + nop(); disable_atalatch(); } @@ -172,21 +179,55 @@ void write_io_register ( uint8_t ioreg, uint8_t byte ) void pata_read_bytes ( uint8_t *buffer, uint16_t bytes ) { - uint8_t byte_l, byte_h; uint16_t i; + uint8_t blocks; configure_port_data_read(); - set_io_register ( PATA_RD_DATA_REGISTER ); - ata_rd_enable(); - for ( i = 0; i < bytes / 2; i++ ) { - byte_l = pata_get_lowbyte(); - byte_h = pata_get_highbyte(); - *buffer++ = byte_h; - *buffer++ = byte_l; + for ( blocks = bytes / PATA_BLOCKLEN ; blocks ; blocks-- ) { + /* Wait for BSY goes low and DRQ goes high */ + while ( pata_bsy() & !pata_drq() ); + + set_io_register ( PATA_RW_DATA_REGISTER ); + ata_rd_enable(); + + for ( i = 0; i < PATA_BLOCKLEN / 2; i++ ) { + *buffer++ = pata_get_lowbyte(); + *buffer++ = pata_get_highbyte(); + } + + ata_rd_disable(); + ata_ctl_high(); + } +} + + +void pata_write_bytes ( uint8_t *buffer, uint16_t bytes ) +{ + uint16_t i, a; + uint8_t blocks; + + a = 0; + for ( blocks = bytes / PATA_BLOCKLEN ; blocks ; blocks-- ) { + /* Wait for BSY goes low and DRQ goes high */ + while ( pata_bsy() & !pata_drq() ); + + configure_port_data_write(); + + set_io_register ( PATA_RW_DATA_REGISTER ); + ata_wr_enable(); + + for ( i = 0; i < PATA_BLOCKLEN / 2; i++ ) { + pata_set_highbyte ( buffer[a + 1] ); + pata_set_lowbyte ( buffer[a] ); + a += 2; + } + ata_wr_disable(); + ata_ctl_high(); + + configure_port_data_read(); + } - ata_rd_disable(); - ata_ctl_high(); } void ata_identify() @@ -195,16 +236,13 @@ void ata_identify() uint16_t word[256], n; while ( pata_bsy() ); - write_io_register ( PATA_WR_COMMAND_REGISTER, CMD_IDENTIFY_DEVICE ); - - /* Wait for BSY goes low and DRQ goes high */ - while ( pata_bsy() & !pata_drq() ); + write_io_register ( PATA_W_COMMAND_REGISTER, CMD_IDENTIFY_DEVICE ); pata_read_bytes ( buffer, 512 ); i = 0; for ( n = 0; n < 512; n += 2 ) { - word[i] = ( ( buffer[n] << 8 ) | buffer[n + 1] ); + word[i] = ( ( buffer[n + 1] << 8 ) | buffer[n] ); i++; } @@ -231,6 +269,8 @@ void ata_identify() uart_putc ( '\n' ); uart_puts_p ( PSTR ( "Model number: " ) ); for ( uint8_t i = 27; i <= 46; i++ ) { + uart_putc ( word[i] >> 8 ); + uart_putc ( word[i] & 0x00FF ); } uart_putc ( '\n' ); uart_puts_p ( PSTR ( "Number of current logical cylinders: " ) ); @@ -256,6 +296,7 @@ void ata_identify() * Public functions */ +uint8_t data2_buffer[4096]; uint8_t pata_init () { @@ -266,36 +307,58 @@ uint8_t pata_init () while ( ( !pata_rdy() ) & pata_bsy() ); /*set drive 0 to LBA mode*/ - write_io_register ( PATA_WR_DEVICE_CONTROL_REGISTER, ATA_LBA_DRIVE_0 ); + write_io_register ( PATA_W_DEVICE_CONTROL_REGISTER, ATA_LBA_DRIVE_0 ); while ( ( !pata_rdy() ) & pata_bsy() ); /*recalibrate*/ - write_io_register ( PATA_WR_COMMAND_REGISTER, CMD_RECALIBRATE ); + write_io_register ( PATA_W_COMMAND_REGISTER, CMD_RECALIBRATE ); while ( pata_bsy() ); uart_puts_p ( PSTR ( "disk is now ready\n" ) ); ata_identify(); - return 1; + return 0; } uint8_t pata_read_block ( uint32_t addr, uint8_t *buffer ) { - return 1; + return pata_read_multiblock ( addr, buffer, 1 ); } uint8_t pata_write_block ( uint32_t addr, uint8_t *buffer ) { - return 1; + return pata_write_multiblock ( addr, buffer, 1 ); } uint8_t pata_read_multiblock ( uint32_t addr, uint8_t *buffer, uint8_t numblocks ) { - return 1; + write_io_register ( PATA_RW_SECTOR_COUNT_REGISTER, numblocks ); + + write_io_register ( PATA_RW_SECTOR_NUMBER_REGISTER, ( uint8_t ) addr ); + write_io_register ( PATA_RW_CYLINDER_LOW_REGISTER, ( uint8_t ) ( addr >> 8 ) ); + write_io_register ( PATA_RW_CYLINDER_HIGH_REGISTER, ( uint8_t ) ( addr >> 16 ) ); + write_io_register ( PATA_RW_DEVICE_HEAD_REGISTER, ( ( uint8_t ) ( addr >> 24 ) & 0x0F ) | ATA_LBA_DRIVE_0 ); + + write_io_register ( PATA_W_COMMAND_REGISTER, CMD_READ_SECTORS ); + + pata_read_bytes ( buffer, numblocks * PATA_BLOCKLEN ); + + return 0; } uint8_t pata_write_multiblock ( uint32_t addr, uint8_t *buffer, uint8_t numblocks ) { - return 1; -} + write_io_register ( PATA_RW_SECTOR_COUNT_REGISTER, numblocks ); + + write_io_register ( PATA_RW_SECTOR_NUMBER_REGISTER, ( uint8_t ) addr ); + write_io_register ( PATA_RW_CYLINDER_LOW_REGISTER, ( uint8_t ) ( addr >> 8 ) ); + write_io_register ( PATA_RW_CYLINDER_HIGH_REGISTER, ( uint8_t ) ( addr >> 16 ) ); + write_io_register ( PATA_RW_DEVICE_HEAD_REGISTER, ( ( uint8_t ) ( addr >> 24 ) & 0x0F ) | ATA_LBA_DRIVE_0 ); + + write_io_register ( PATA_W_COMMAND_REGISTER, CMD_WRITE_SECTORS ); + + pata_write_bytes ( buffer, numblocks * PATA_BLOCKLEN ); + + return 0; +} \ No newline at end of file diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.h b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.h index a927a20..2bf3ac2 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.h +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_drv_pata.h @@ -26,7 +26,7 @@ */ /* - * $Id: wdc_drv_pata.h,v 1.5 2012/06/16 00:33:26 olivleh1 Exp $ + * $Id: wdc_drv_pata.h,v 1.6 2012/06/16 19:34:39 olivleh1 Exp $ */ #ifndef WDC_DRV_PATA_H_ @@ -99,6 +99,8 @@ extern uint8_t pata_write_multiblock ( uint32_t addr, uint8_t *buffer, uint8_t n #define CMD_WRITE_SECTORS 0x30 #define CMD_WRITE_VERIFY 0x3C +#define PATA_BLOCKLEN 512 + // CB_DH bits 7-4 OF THE DEVICE/HEAD REGISTER #define ATA_DH_DEV0 0xE0 // select device 0 LBA MODE #define ATA_DH_DEV1 0xF0 // select device 1 LBA MODE diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c index 7d72f10..2aa7c8a 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_if_disk_perf.c @@ -26,7 +26,7 @@ */ /* - * $Id: wdc_if_disk_perf.c,v 1.5 2012/06/12 17:34:14 olivleh1 Exp $ + * $Id: wdc_if_disk_perf.c,v 1.6 2012/06/16 19:34:39 olivleh1 Exp $ */ #include @@ -41,7 +41,7 @@ #include "wdc_ram.h" #include "uart.h" -#ifdef MEASURE_SDCARD_TIME +#ifdef MEASURE_DISK_PERFORMANCE #define BLOCKNO 300000 extern uint32_t overflow; diff --git a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c index 7ba394a..e78a0cd 100644 --- a/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c +++ b/P8000_WDC_Emulator/P8000_WDC_Emulator/wdc_main.c @@ -29,7 +29,7 @@ /* * P8000 WDC Emulator * - * $Id: wdc_main.c,v 1.28 2012/06/13 20:17:45 olivleh1 Exp $ + * $Id: wdc_main.c,v 1.29 2012/06/16 19:34:39 olivleh1 Exp $ * * TODO: - right now, BTT entries are not taken into account */ @@ -54,7 +54,7 @@ void atmega_setup ( void ); -#ifdef MEASURE_SDCARD_TIME +#ifdef MEASURE_DISK_PERFORMANCE extern void measure_performance(); volatile uint32_t overflow = 0; ISR ( TIMER0_OVF_vect ) @@ -74,7 +74,7 @@ extern uint8_t valid_disk; int __attribute__ ( ( OS_main ) ) main ( void ) { -#ifndef MEASURE_SDCARD_TIME +#ifndef MEASURE_DISK_PERFORMANCE uint16_t cmd_counter = 9; uint16_t data_counter; uint32_t blockno; @@ -85,7 +85,7 @@ main ( void ) uart_puts_p ( PSTR ( "P8000 WDC Emulator 0.90\n" ) ); -#ifdef MEASURE_SDCARD_TIME +#ifdef MEASURE_DISK_PERFORMANCE measure_performance(); #else