00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "global.h"
00023 #include "timer.h"
00024 #include "rprintf.h"
00025 #include "membus.h"
00026
00027 #include "atadev.h"
00028
00029
00030 const DevBlock_t DevBlockAta =
00031 {
00032 atadevInit,
00033 atadevReset,
00034 atadevReadReg,
00035 atadevWriteReg,
00036 atadevReadData,
00037 atadevWriteData
00038 };
00039
00040
00041
00042
00043 int atadevInit(void)
00044 {
00045 membusInit();
00046 return 0;
00047 }
00048
00049
00050 int atadevReset(void)
00051 {
00052 return 0;
00053 }
00054
00055
00056 u08 atadevReadReg(u16 reg)
00057 {
00058 if(reg < 0x08)
00059 return membusRead(ATA_REG_BASE_CS1+reg);
00060 else
00061 return membusRead(ATA_REG_BASE_CS2+reg-0x08);
00062 }
00063
00064
00065 void atadevWriteReg(u16 reg, u08 data)
00066 {
00067 if(reg < 0x08)
00068 membusWrite(ATA_REG_BASE_CS1+reg, data);
00069 else
00070 membusWrite(ATA_REG_BASE_CS2+reg-0x08, data);
00071 }
00072
00073
00074 int atadevReadData(u08 *buffer, int numBytes)
00075 {
00076 register unsigned int i;
00077
00078 uint16_t* buf = (uint16_t*)buffer;
00079
00080
00081 for (i=0; i<(numBytes/16); i++)
00082 {
00083
00084 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00085 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00086 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00087 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00088 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00089 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00090 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00091 *buf++ = membusRead(ATA_REG_BASE_CS1+ATA_REG_DATA);
00092 }
00093 return numBytes;
00094 }
00095
00096
00097 int atadevWriteData(u08 *buffer, int numBytes)
00098 {
00099 register unsigned int i;
00100
00101 uint16_t* buf = (uint16_t*)buffer;
00102
00103
00104 for (i=0; i<(numBytes/16); i++)
00105 {
00106
00107 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00108 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00109 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00110 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00111 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00112 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00113 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00114 membusWrite(ATA_REG_BASE_CS1+ATA_REG_DATA, *buf++);
00115 }
00116 return numBytes;
00117 }