Eli Hughes
/
COMPACT_FLASH
Compact Flash I/O test
FAT_FS/diskio.c@1:dc171f34db9b, 2011-12-30 (annotated)
- Committer:
- emh203
- Date:
- Fri Dec 30 21:02:16 2011 +0000
- Revision:
- 1:dc171f34db9b
- Parent:
- 0:6b1e6c9e48ba
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
emh203 | 0:6b1e6c9e48ba | 1 | #include "mbed.h" |
emh203 | 0:6b1e6c9e48ba | 2 | #include "LPC17xx.h" |
emh203 | 0:6b1e6c9e48ba | 3 | #include "integer.h" |
emh203 | 0:6b1e6c9e48ba | 4 | #include "diskio.h" |
emh203 | 0:6b1e6c9e48ba | 5 | #include "stdarg.h" |
emh203 | 1:dc171f34db9b | 6 | #include "usbhost_inc.h" |
emh203 | 0:6b1e6c9e48ba | 7 | |
emh203 | 1:dc171f34db9b | 8 | |
emh203 | 1:dc171f34db9b | 9 | /*-------------------------------------------------------------------------- |
emh203 | 1:dc171f34db9b | 10 | |
emh203 | 1:dc171f34db9b | 11 | Module Private Functions |
emh203 | 1:dc171f34db9b | 12 | |
emh203 | 1:dc171f34db9b | 13 | ---------------------------------------------------------------------------*/ |
emh203 | 1:dc171f34db9b | 14 | |
emh203 | 1:dc171f34db9b | 15 | static volatile DSTATUS Stat[3] = {STA_NOINIT | STA_NODISK}; /* Disk status */ |
emh203 | 1:dc171f34db9b | 16 | static volatile BYTE DiskProcTimer[3]={0}; /* 100Hz decrement timer */ |
emh203 | 1:dc171f34db9b | 17 | |
emh203 | 1:dc171f34db9b | 18 | |
emh203 | 1:dc171f34db9b | 19 | BYTE RAM_DISK[512]; |
emh203 | 1:dc171f34db9b | 20 | |
emh203 | 1:dc171f34db9b | 21 | |
emh203 | 1:dc171f34db9b | 22 | //Usb Stuff |
emh203 | 1:dc171f34db9b | 23 | uint32_t _numBlks; |
emh203 | 1:dc171f34db9b | 24 | uint32_t _blkSize; |
emh203 | 1:dc171f34db9b | 25 | USB_INT08U inquiryResult[INQUIRY_LENGTH]; |
emh203 | 1:dc171f34db9b | 26 | |
emh203 | 1:dc171f34db9b | 27 | |
emh203 | 1:dc171f34db9b | 28 | //#define _CF_DEBUG_MESSAGES |
emh203 | 0:6b1e6c9e48ba | 29 | //#define _CF_DEBUG_READ_ATA |
emh203 | 0:6b1e6c9e48ba | 30 | |
emh203 | 0:6b1e6c9e48ba | 31 | #ifdef _CF_DEBUG_MESSAGES |
emh203 | 0:6b1e6c9e48ba | 32 | #define CF_DEBUG(...) printf(__VA_ARGS__) |
emh203 | 0:6b1e6c9e48ba | 33 | #else |
emh203 | 0:6b1e6c9e48ba | 34 | #define CF_DEBUG |
emh203 | 0:6b1e6c9e48ba | 35 | #endif |
emh203 | 0:6b1e6c9e48ba | 36 | |
emh203 | 0:6b1e6c9e48ba | 37 | void disk_timerproc (void); |
emh203 | 0:6b1e6c9e48ba | 38 | |
emh203 | 0:6b1e6c9e48ba | 39 | #define LED1_MASK (uint32_t )(1<<18) |
emh203 | 0:6b1e6c9e48ba | 40 | #define LED2_MASK (uint32_t )(1<<20) |
emh203 | 0:6b1e6c9e48ba | 41 | #define LED3_MASK (uint32_t )(1<<21) |
emh203 | 0:6b1e6c9e48ba | 42 | #define LED4_MASK (uint32_t )(1<<23) |
emh203 | 0:6b1e6c9e48ba | 43 | |
emh203 | 0:6b1e6c9e48ba | 44 | |
emh203 | 0:6b1e6c9e48ba | 45 | #define LED1_ON LPC_GPIO1->FIOSET=LED1_MASK |
emh203 | 0:6b1e6c9e48ba | 46 | #define LED1_OFF LPC_GPIO1->FIOCLR=LED1_MASK |
emh203 | 0:6b1e6c9e48ba | 47 | #define LED1_TOGGLE LPC_GPIO1->FIOPIN^=LED1_MASK |
emh203 | 0:6b1e6c9e48ba | 48 | |
emh203 | 0:6b1e6c9e48ba | 49 | #define LED2_ON LPC_GPIO1->FIOSET=LED2_MASK |
emh203 | 0:6b1e6c9e48ba | 50 | #define LED2_OFF LPC_GPIO1->FIOCLR=LED2_MASK |
emh203 | 0:6b1e6c9e48ba | 51 | #define LED2_TOGGLE LPC_GPIO1->FIOPIN^=LED2_MASK |
emh203 | 0:6b1e6c9e48ba | 52 | |
emh203 | 0:6b1e6c9e48ba | 53 | #define LED3_ON LPC_GPIO1->FIOSET=LED3_MASK |
emh203 | 0:6b1e6c9e48ba | 54 | #define LED3_OFF LPC_GPIO1->FIOCLR=LED3_MASK |
emh203 | 0:6b1e6c9e48ba | 55 | #define LED3_TOGGLE LPC_GPIO1->FIOPIN^=LED3_MASK |
emh203 | 0:6b1e6c9e48ba | 56 | |
emh203 | 0:6b1e6c9e48ba | 57 | #define LED4_ON LPC_GPIO1->FIOSET=LED4_MASK |
emh203 | 0:6b1e6c9e48ba | 58 | #define LED4_OFF LPC_GPIO1->FIOCLR=LED4_MASK |
emh203 | 0:6b1e6c9e48ba | 59 | #define LED4_TOGGLE LPC_GPIO1->FIOPIN^=LED4_MASK |
emh203 | 0:6b1e6c9e48ba | 60 | |
emh203 | 0:6b1e6c9e48ba | 61 | |
emh203 | 0:6b1e6c9e48ba | 62 | |
emh203 | 0:6b1e6c9e48ba | 63 | //8-bit Data Bus is on Pins P0.4 - P0.11 |
emh203 | 0:6b1e6c9e48ba | 64 | #define DATA_BUS_MASK (uint32_t )((0xFF)<<4) |
emh203 | 0:6b1e6c9e48ba | 65 | |
emh203 | 0:6b1e6c9e48ba | 66 | //3 bit address is on Port 2.0 - 2.2 |
emh203 | 0:6b1e6c9e48ba | 67 | #define ADDRESS_BUS_MASK (uint32_t )(0x7) |
emh203 | 0:6b1e6c9e48ba | 68 | |
emh203 | 0:6b1e6c9e48ba | 69 | //ChipSelects are on port 2 |
emh203 | 0:6b1e6c9e48ba | 70 | #define CS0_MASK (uint32_t )(1<<3) |
emh203 | 0:6b1e6c9e48ba | 71 | #define CS1_MASK (uint32_t )(1<<4) |
emh203 | 0:6b1e6c9e48ba | 72 | |
emh203 | 0:6b1e6c9e48ba | 73 | //IORD and IOWR are on port 0 |
emh203 | 0:6b1e6c9e48ba | 74 | #define IORD_MASK (uint32_t )(1<<24) |
emh203 | 0:6b1e6c9e48ba | 75 | #define IOWR_MASK (uint32_t )(1<<23) |
emh203 | 0:6b1e6c9e48ba | 76 | |
emh203 | 0:6b1e6c9e48ba | 77 | |
emh203 | 0:6b1e6c9e48ba | 78 | //Reset and power enable are on port 1 |
emh203 | 0:6b1e6c9e48ba | 79 | #define COMPACT_FLASH_RESET_MASK (uint32_t )(1<<30) |
emh203 | 0:6b1e6c9e48ba | 80 | #define COMPACT_FLASH_POWER_ENABLE_MASK (uint32_t )(0x80000000) |
emh203 | 0:6b1e6c9e48ba | 81 | //Card Detect is on Port 2 |
emh203 | 0:6b1e6c9e48ba | 82 | #define COMPACT_FLASH_CARD_DETECT_MASK (uint32_t )(1<<5) |
emh203 | 0:6b1e6c9e48ba | 83 | |
emh203 | 0:6b1e6c9e48ba | 84 | //Low Level Bus Operation Macros |
emh203 | 0:6b1e6c9e48ba | 85 | //Note: LPC 176x have dedicate set and clear registers |
emh203 | 0:6b1e6c9e48ba | 86 | |
emh203 | 0:6b1e6c9e48ba | 87 | #define SET_DATA_BUS_TO_INPUTS LPC_GPIO0->FIODIR &= ~(DATA_BUS_MASK); |
emh203 | 0:6b1e6c9e48ba | 88 | #define SET_DATA_BUS_TO_OUTPUT LPC_GPIO0->FIODIR |= (DATA_BUS_MASK); |
emh203 | 0:6b1e6c9e48ba | 89 | |
emh203 | 0:6b1e6c9e48ba | 90 | #define CS0_ACTIVE LPC_GPIO2->FIOCLR = CS0_MASK |
emh203 | 0:6b1e6c9e48ba | 91 | #define CS0_INACTIVE LPC_GPIO2->FIOSET = CS0_MASK |
emh203 | 0:6b1e6c9e48ba | 92 | #define CS1_ACTIVE LPC_GPIO2->FIOCLR = CS1_MASK |
emh203 | 0:6b1e6c9e48ba | 93 | #define CS1_INACTIVE LPC_GPIO2->FIOSET = CS1_MASK |
emh203 | 0:6b1e6c9e48ba | 94 | |
emh203 | 0:6b1e6c9e48ba | 95 | #define IORD_ACTIVE LPC_GPIO0->FIOCLR = IORD_MASK |
emh203 | 0:6b1e6c9e48ba | 96 | #define IORD_INACTIVE LPC_GPIO0->FIOSET = IORD_MASK |
emh203 | 0:6b1e6c9e48ba | 97 | |
emh203 | 0:6b1e6c9e48ba | 98 | #define IOWR_ACTIVE LPC_GPIO0->FIOCLR = IOWR_MASK |
emh203 | 0:6b1e6c9e48ba | 99 | #define IOWR_INACTIVE LPC_GPIO0->FIOSET = IOWR_MASK |
emh203 | 0:6b1e6c9e48ba | 100 | |
emh203 | 0:6b1e6c9e48ba | 101 | #define COMPACT_FLASH_RESET_ACTIVE LPC_GPIO1->FIOCLR = COMPACT_FLASH_RESET_MASK |
emh203 | 0:6b1e6c9e48ba | 102 | #define COMPACT_FLASH_RESET_INACTIVE LPC_GPIO1->FIOSET = COMPACT_FLASH_RESET_MASK |
emh203 | 0:6b1e6c9e48ba | 103 | |
emh203 | 0:6b1e6c9e48ba | 104 | #define COMPACT_FLASH_POWER_ENABLE LPC_GPIO1->FIOCLR = COMPACT_FLASH_POWER_ENABLE_MASK |
emh203 | 0:6b1e6c9e48ba | 105 | #define COMPACT_FLASH_POWER_DISABLE LPC_GPIO1->FIOSET = COMPACT_FLASH_POWER_ENABLE_MASK |
emh203 | 0:6b1e6c9e48ba | 106 | |
emh203 | 0:6b1e6c9e48ba | 107 | #define COMPACT_FLASH_CARD_DETECTED (!((LPC_GPIO2->FIOPIN)&COMPACT_FLASH_CARD_DETECT_MASK)) |
emh203 | 0:6b1e6c9e48ba | 108 | |
emh203 | 0:6b1e6c9e48ba | 109 | //To set the Address and Data Bus Lines we will use the convient Mask register in the Port I/O modules |
emh203 | 0:6b1e6c9e48ba | 110 | //The Hardware will mask out pins that are set to 1 in the MASK register |
emh203 | 0:6b1e6c9e48ba | 111 | |
emh203 | 0:6b1e6c9e48ba | 112 | #define SET_CF_ADDRESS(ADDRESS) LPC_GPIO2->FIOMASK=~(ADDRESS_BUS_MASK); \ |
emh203 | 0:6b1e6c9e48ba | 113 | LPC_GPIO2->FIOPIN=ADDRESS; \ |
emh203 | 0:6b1e6c9e48ba | 114 | LPC_GPIO2->FIOMASK=0 //Always remember to reset the mask for other operations to complete correctly |
emh203 | 0:6b1e6c9e48ba | 115 | |
emh203 | 0:6b1e6c9e48ba | 116 | |
emh203 | 0:6b1e6c9e48ba | 117 | #define SET_CF_DATA(DATA) LPC_GPIO0->FIOMASK=~(DATA_BUS_MASK); \ |
emh203 | 0:6b1e6c9e48ba | 118 | LPC_GPIO0->FIOPIN=(((uint32_t)DATA)<<4); \ |
emh203 | 0:6b1e6c9e48ba | 119 | LPC_GPIO0->FIOMASK=0 //Always remember to reset the mask for other operations to complete correctly |
emh203 | 0:6b1e6c9e48ba | 120 | |
emh203 | 0:6b1e6c9e48ba | 121 | #define GET_CF_DATA(DATA) LPC_GPIO0->FIOMASK=~(DATA_BUS_MASK); \ |
emh203 | 0:6b1e6c9e48ba | 122 | (DATA) = (LPC_GPIO0->FIOPIN)>>4; \ |
emh203 | 0:6b1e6c9e48ba | 123 | LPC_GPIO0->FIOMASK=0 //Always remember to reset the mask for other operations to complete correctly |
emh203 | 0:6b1e6c9e48ba | 124 | |
emh203 | 0:6b1e6c9e48ba | 125 | #define SET_DATA_BUS_AS_OUTPUTS LPC_GPIO0->FIODIR|=DATA_BUS_MASK |
emh203 | 0:6b1e6c9e48ba | 126 | #define SET_DATA_BUS_AS_INPUTS LPC_GPIO0->FIODIR&=~DATA_BUS_MASK |
emh203 | 0:6b1e6c9e48ba | 127 | |
emh203 | 0:6b1e6c9e48ba | 128 | /* ATA command */ |
emh203 | 0:6b1e6c9e48ba | 129 | #define CMD_RESET 0x08 /* DEVICE RESET */ |
emh203 | 1:dc171f34db9b | 130 | #define CMD_READ 0x20 /* READ SECTOR(S) */ |
emh203 | 0:6b1e6c9e48ba | 131 | #define CMD_WRITE 0x30 /* WRITE SECTOR(S) */ |
emh203 | 1:dc171f34db9b | 132 | #define CMD_IDENTIFY 0xEC /* DEVICE IDENTIFY */ |
emh203 | 1:dc171f34db9b | 133 | #define CMD_SETFEATURES 0xEF /* SET FEATURES */ |
emh203 | 0:6b1e6c9e48ba | 134 | |
emh203 | 0:6b1e6c9e48ba | 135 | /* ATA register bit definitions */ |
emh203 | 0:6b1e6c9e48ba | 136 | #define LBA 0xE0 |
emh203 | 0:6b1e6c9e48ba | 137 | #define BUSY 0x80 |
emh203 | 0:6b1e6c9e48ba | 138 | #define DRDY 0x40 |
emh203 | 1:dc171f34db9b | 139 | #define DF 0x20 |
emh203 | 1:dc171f34db9b | 140 | #define DRQ 0x08 |
emh203 | 1:dc171f34db9b | 141 | #define ERR 0x01 |
emh203 | 0:6b1e6c9e48ba | 142 | #define SRST 0x40 |
emh203 | 0:6b1e6c9e48ba | 143 | #define nIEN 0x20 |
emh203 | 0:6b1e6c9e48ba | 144 | |
emh203 | 0:6b1e6c9e48ba | 145 | /* Bit definitions for Control Port */ |
emh203 | 0:6b1e6c9e48ba | 146 | #define CTL_READ 0x20 |
emh203 | 1:dc171f34db9b | 147 | #define CTL_WRITE 0x40 |
emh203 | 1:dc171f34db9b | 148 | #define CTL_RESET 0x80 |
emh203 | 0:6b1e6c9e48ba | 149 | #define REG_DATA 0x0 |
emh203 | 1:dc171f34db9b | 150 | #define REG_ERROR 0x1 |
emh203 | 0:6b1e6c9e48ba | 151 | #define REG_FEATURES 0x1 |
emh203 | 1:dc171f34db9b | 152 | #define REG_COUNT 0x2 |
emh203 | 1:dc171f34db9b | 153 | #define REG_SECTOR 0x3 |
emh203 | 0:6b1e6c9e48ba | 154 | #define REG_CYLL 0x4 |
emh203 | 0:6b1e6c9e48ba | 155 | #define REG_CYLH 0x5 |
emh203 | 1:dc171f34db9b | 156 | #define REG_DEV 0x6 |
emh203 | 1:dc171f34db9b | 157 | #define REG_COMMAND 0x7 |
emh203 | 1:dc171f34db9b | 158 | #define REG_STATUS 0x7 |
emh203 | 1:dc171f34db9b | 159 | #define REG_DEVCTRL 0xE |
emh203 | 1:dc171f34db9b | 160 | #define REG_ALTSTAT 0xE |
emh203 | 0:6b1e6c9e48ba | 161 | |
emh203 | 0:6b1e6c9e48ba | 162 | void InitCompactFlashInterface() |
emh203 | 0:6b1e6c9e48ba | 163 | { |
emh203 | 0:6b1e6c9e48ba | 164 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 0:6b1e6c9e48ba | 165 | |
emh203 | 0:6b1e6c9e48ba | 166 | LPC_GPIO2->FIODIR |= ADDRESS_BUS_MASK | CS0_MASK | CS1_MASK; |
emh203 | 0:6b1e6c9e48ba | 167 | LPC_GPIO2->FIODIR &=~(COMPACT_FLASH_CARD_DETECT_MASK); |
emh203 | 0:6b1e6c9e48ba | 168 | LPC_GPIO1->FIODIR |= COMPACT_FLASH_RESET_MASK | COMPACT_FLASH_POWER_ENABLE_MASK | LED1_MASK | LED2_MASK | LED3_MASK | LED4_MASK; |
emh203 | 0:6b1e6c9e48ba | 169 | LPC_GPIO0->FIODIR |= IORD_MASK | IOWR_MASK ; |
emh203 | 0:6b1e6c9e48ba | 170 | |
emh203 | 0:6b1e6c9e48ba | 171 | COMPACT_FLASH_RESET_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 172 | COMPACT_FLASH_POWER_DISABLE; |
emh203 | 0:6b1e6c9e48ba | 173 | CS0_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 174 | CS1_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 175 | |
emh203 | 0:6b1e6c9e48ba | 176 | SysTick_Config(SystemCoreClock/100); |
emh203 | 0:6b1e6c9e48ba | 177 | NVIC_SetVector(SysTick_IRQn, (uint32_t)(&disk_timerproc)); |
emh203 | 0:6b1e6c9e48ba | 178 | } |
emh203 | 0:6b1e6c9e48ba | 179 | |
emh203 | 0:6b1e6c9e48ba | 180 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 181 | /* Read an ATA register */ |
emh203 | 0:6b1e6c9e48ba | 182 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 183 | |
emh203 | 0:6b1e6c9e48ba | 184 | static |
emh203 | 0:6b1e6c9e48ba | 185 | BYTE read_ata ( |
emh203 | 0:6b1e6c9e48ba | 186 | BYTE reg /* Register to be read */ |
emh203 | 0:6b1e6c9e48ba | 187 | ) |
emh203 | 0:6b1e6c9e48ba | 188 | { |
emh203 | 0:6b1e6c9e48ba | 189 | BYTE rd; |
emh203 | 1:dc171f34db9b | 190 | |
emh203 | 0:6b1e6c9e48ba | 191 | CS0_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 192 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 0:6b1e6c9e48ba | 193 | SET_CF_ADDRESS(reg); |
emh203 | 0:6b1e6c9e48ba | 194 | IORD_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 195 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 196 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 197 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 198 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 199 | |
emh203 | 0:6b1e6c9e48ba | 200 | GET_CF_DATA(rd); |
emh203 | 0:6b1e6c9e48ba | 201 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 202 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 203 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 204 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 205 | IORD_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 206 | CS0_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 207 | #ifdef _CF_DEBUG_READ_ATA |
emh203 | 0:6b1e6c9e48ba | 208 | CF_DEBUG("rd 0x%2x\r\n",rd); |
emh203 | 0:6b1e6c9e48ba | 209 | #endif |
emh203 | 0:6b1e6c9e48ba | 210 | return rd; |
emh203 | 0:6b1e6c9e48ba | 211 | } |
emh203 | 0:6b1e6c9e48ba | 212 | |
emh203 | 0:6b1e6c9e48ba | 213 | |
emh203 | 0:6b1e6c9e48ba | 214 | |
emh203 | 0:6b1e6c9e48ba | 215 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 216 | /* Write a byte to an ATA register */ |
emh203 | 0:6b1e6c9e48ba | 217 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 218 | |
emh203 | 0:6b1e6c9e48ba | 219 | static |
emh203 | 0:6b1e6c9e48ba | 220 | void write_ata ( |
emh203 | 0:6b1e6c9e48ba | 221 | BYTE reg, /* Register to be written */ |
emh203 | 0:6b1e6c9e48ba | 222 | BYTE dat /* Data to be written */ |
emh203 | 0:6b1e6c9e48ba | 223 | ) |
emh203 | 0:6b1e6c9e48ba | 224 | { |
emh203 | 1:dc171f34db9b | 225 | |
emh203 | 0:6b1e6c9e48ba | 226 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 227 | CS0_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 228 | SET_DATA_BUS_AS_OUTPUTS; |
emh203 | 0:6b1e6c9e48ba | 229 | SET_CF_ADDRESS(reg); |
emh203 | 0:6b1e6c9e48ba | 230 | SET_CF_DATA(dat); |
emh203 | 0:6b1e6c9e48ba | 231 | IOWR_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 232 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 233 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 234 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 235 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 236 | IOWR_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 237 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 238 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 239 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 240 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 241 | CS0_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 242 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 0:6b1e6c9e48ba | 243 | } |
emh203 | 0:6b1e6c9e48ba | 244 | |
emh203 | 0:6b1e6c9e48ba | 245 | |
emh203 | 0:6b1e6c9e48ba | 246 | |
emh203 | 0:6b1e6c9e48ba | 247 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 248 | /* Read a part of data block */ |
emh203 | 0:6b1e6c9e48ba | 249 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 250 | |
emh203 | 0:6b1e6c9e48ba | 251 | static |
emh203 | 0:6b1e6c9e48ba | 252 | void read_part ( |
emh203 | 0:6b1e6c9e48ba | 253 | BYTE *buff, /* Data buffer to store read data */ |
emh203 | 0:6b1e6c9e48ba | 254 | BYTE ofs, /* Offset of the part of data in unit of word */ |
emh203 | 0:6b1e6c9e48ba | 255 | BYTE count /* Number of word to pick up */ |
emh203 | 0:6b1e6c9e48ba | 256 | ) |
emh203 | 0:6b1e6c9e48ba | 257 | { |
emh203 | 0:6b1e6c9e48ba | 258 | BYTE c = 0, dl, dh; |
emh203 | 0:6b1e6c9e48ba | 259 | |
emh203 | 0:6b1e6c9e48ba | 260 | SET_CF_ADDRESS(REG_DATA); /* Select Data register */ |
emh203 | 0:6b1e6c9e48ba | 261 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 262 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 263 | |
emh203 | 0:6b1e6c9e48ba | 264 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 0:6b1e6c9e48ba | 265 | CS0_ACTIVE; |
emh203 | 0:6b1e6c9e48ba | 266 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 267 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 268 | do { |
emh203 | 0:6b1e6c9e48ba | 269 | IORD_ACTIVE; /* IORD = L */ |
emh203 | 0:6b1e6c9e48ba | 270 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 271 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 272 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 273 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 274 | GET_CF_DATA(dl); /* Read Even data */ |
emh203 | 0:6b1e6c9e48ba | 275 | IORD_INACTIVE; /* IORD = H */ |
emh203 | 0:6b1e6c9e48ba | 276 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 277 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 278 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 279 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 280 | IORD_ACTIVE; /* IORD = L */ |
emh203 | 0:6b1e6c9e48ba | 281 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 282 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 283 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 284 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 285 | GET_CF_DATA(dh); /* Read Odd data */ |
emh203 | 0:6b1e6c9e48ba | 286 | IORD_INACTIVE; /* IORD = H */ |
emh203 | 0:6b1e6c9e48ba | 287 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 288 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 289 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 290 | __nop(); |
emh203 | 0:6b1e6c9e48ba | 291 | if (count && (c >= ofs)) { /* Pick up a part of block */ |
emh203 | 0:6b1e6c9e48ba | 292 | *buff++ = dl; |
emh203 | 0:6b1e6c9e48ba | 293 | *buff++ = dh; |
emh203 | 0:6b1e6c9e48ba | 294 | count--; |
emh203 | 0:6b1e6c9e48ba | 295 | } |
emh203 | 0:6b1e6c9e48ba | 296 | } while (++c); |
emh203 | 0:6b1e6c9e48ba | 297 | CS0_INACTIVE; |
emh203 | 0:6b1e6c9e48ba | 298 | |
emh203 | 0:6b1e6c9e48ba | 299 | read_ata(REG_ALTSTAT); |
emh203 | 0:6b1e6c9e48ba | 300 | read_ata(REG_STATUS); |
emh203 | 0:6b1e6c9e48ba | 301 | } |
emh203 | 0:6b1e6c9e48ba | 302 | |
emh203 | 0:6b1e6c9e48ba | 303 | |
emh203 | 0:6b1e6c9e48ba | 304 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 305 | /* Wait for Data Ready */ |
emh203 | 0:6b1e6c9e48ba | 306 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 307 | |
emh203 | 0:6b1e6c9e48ba | 308 | static |
emh203 | 0:6b1e6c9e48ba | 309 | int wait_data (void) |
emh203 | 0:6b1e6c9e48ba | 310 | { |
emh203 | 0:6b1e6c9e48ba | 311 | BYTE s; |
emh203 | 0:6b1e6c9e48ba | 312 | |
emh203 | 1:dc171f34db9b | 313 | DiskProcTimer[CF] = 100; /* Time out = 1 sec */ |
emh203 | 0:6b1e6c9e48ba | 314 | do { |
emh203 | 1:dc171f34db9b | 315 | if (!DiskProcTimer[CF]) return 0; /* Abort when timeout occured */ |
emh203 | 0:6b1e6c9e48ba | 316 | s = read_ata(REG_STATUS); /* Get status */ |
emh203 | 0:6b1e6c9e48ba | 317 | } while ((s & (BUSY|DRQ)) != DRQ); /* Wait for BUSY goes low and DRQ goes high */ |
emh203 | 0:6b1e6c9e48ba | 318 | |
emh203 | 0:6b1e6c9e48ba | 319 | read_ata(REG_ALTSTAT); |
emh203 | 0:6b1e6c9e48ba | 320 | return 1; |
emh203 | 0:6b1e6c9e48ba | 321 | } |
emh203 | 0:6b1e6c9e48ba | 322 | |
emh203 | 0:6b1e6c9e48ba | 323 | |
emh203 | 0:6b1e6c9e48ba | 324 | |
emh203 | 0:6b1e6c9e48ba | 325 | |
emh203 | 0:6b1e6c9e48ba | 326 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 327 | /* Initialize Disk Drive */ |
emh203 | 0:6b1e6c9e48ba | 328 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 329 | |
emh203 | 0:6b1e6c9e48ba | 330 | DSTATUS disk_initialize ( |
emh203 | 1:dc171f34db9b | 331 | BYTE drv /* Physical drive number (0) */ |
emh203 | 0:6b1e6c9e48ba | 332 | ) |
emh203 | 0:6b1e6c9e48ba | 333 | { |
emh203 | 1:dc171f34db9b | 334 | DSTATUS RetVal; |
emh203 | 1:dc171f34db9b | 335 | USB_INT32S rc; |
emh203 | 1:dc171f34db9b | 336 | |
emh203 | 1:dc171f34db9b | 337 | switch(drv) |
emh203 | 1:dc171f34db9b | 338 | { |
emh203 | 1:dc171f34db9b | 339 | case COMPACT_FLASH: |
emh203 | 1:dc171f34db9b | 340 | |
emh203 | 1:dc171f34db9b | 341 | Stat[CF] |= STA_NOINIT; |
emh203 | 1:dc171f34db9b | 342 | for (DiskProcTimer[CF] = 10; DiskProcTimer[CF]; ); /* 100ms */ |
emh203 | 1:dc171f34db9b | 343 | if (Stat[CF] & STA_NODISK) return Stat[CF]; /* Exit when socket is empty */ |
emh203 | 1:dc171f34db9b | 344 | COMPACT_FLASH_POWER_ENABLE; /* Initialize CFC control port */ |
emh203 | 1:dc171f34db9b | 345 | for (DiskProcTimer[CF] = 1;DiskProcTimer[CF]; ); /* 10ms */ |
emh203 | 1:dc171f34db9b | 346 | |
emh203 | 1:dc171f34db9b | 347 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 1:dc171f34db9b | 348 | for (DiskProcTimer[CF] = 5; DiskProcTimer[CF]; ); /* 50ms */ |
emh203 | 1:dc171f34db9b | 349 | COMPACT_FLASH_RESET_INACTIVE; |
emh203 | 1:dc171f34db9b | 350 | for (DiskProcTimer[CF] = 5; DiskProcTimer[CF]; ); /* 50ms */ |
emh203 | 1:dc171f34db9b | 351 | write_ata(REG_DEV, LBA); /* Select Device 0 */ |
emh203 | 1:dc171f34db9b | 352 | DiskProcTimer[CF] = 200; |
emh203 | 1:dc171f34db9b | 353 | |
emh203 | 1:dc171f34db9b | 354 | do { /* Wait for card goes ready */ |
emh203 | 1:dc171f34db9b | 355 | if (!DiskProcTimer[CF]) |
emh203 | 1:dc171f34db9b | 356 | { |
emh203 | 1:dc171f34db9b | 357 | CF_DEBUG("Timeout waiting for card BUSY to go inactive\r\n"); |
emh203 | 1:dc171f34db9b | 358 | return Stat[CF]; |
emh203 | 1:dc171f34db9b | 359 | } |
emh203 | 1:dc171f34db9b | 360 | } while (read_ata(REG_STATUS) & BUSY); |
emh203 | 1:dc171f34db9b | 361 | |
emh203 | 1:dc171f34db9b | 362 | |
emh203 | 1:dc171f34db9b | 363 | write_ata(REG_DEVCTRL, SRST | nIEN); /* Software reset */ |
emh203 | 1:dc171f34db9b | 364 | for (DiskProcTimer[CF] = 2; DiskProcTimer[CF]; ); /* 20ms */ |
emh203 | 1:dc171f34db9b | 365 | |
emh203 | 1:dc171f34db9b | 366 | write_ata(REG_DEVCTRL, nIEN); /* Release software reset */ |
emh203 | 1:dc171f34db9b | 367 | |
emh203 | 1:dc171f34db9b | 368 | for (DiskProcTimer[CF] = 2; DiskProcTimer[CF]; ); /* 20ms */ |
emh203 | 1:dc171f34db9b | 369 | |
emh203 | 1:dc171f34db9b | 370 | DiskProcTimer[CF] = 200; |
emh203 | 1:dc171f34db9b | 371 | do { /* Wait for card goes ready */ |
emh203 | 1:dc171f34db9b | 372 | if (!DiskProcTimer[CF]) |
emh203 | 1:dc171f34db9b | 373 | { |
emh203 | 1:dc171f34db9b | 374 | CF_DEBUG("Timeout waiting for card DRDY\r\n"); |
emh203 | 1:dc171f34db9b | 375 | return Stat[CF]; |
emh203 | 1:dc171f34db9b | 376 | } |
emh203 | 1:dc171f34db9b | 377 | } while ((read_ata(REG_STATUS) & (DRDY|BUSY)) != DRDY); |
emh203 | 1:dc171f34db9b | 378 | |
emh203 | 1:dc171f34db9b | 379 | CF_DEBUG("Setting to 8-bit PIO MOD\r\n"); |
emh203 | 1:dc171f34db9b | 380 | write_ata(REG_FEATURES, 0x01); /* Select 8-bit PIO transfer mode */ |
emh203 | 1:dc171f34db9b | 381 | write_ata(REG_COMMAND, CMD_SETFEATURES); |
emh203 | 1:dc171f34db9b | 382 | DiskProcTimer[CF] = 200; |
emh203 | 1:dc171f34db9b | 383 | do { |
emh203 | 1:dc171f34db9b | 384 | if (!DiskProcTimer[CF]) |
emh203 | 1:dc171f34db9b | 385 | { |
emh203 | 1:dc171f34db9b | 386 | CF_DEBUG("Timeout waiting after trying to call the SETFEATURES command\r\n"); |
emh203 | 1:dc171f34db9b | 387 | return Stat[CF]; |
emh203 | 1:dc171f34db9b | 388 | } |
emh203 | 1:dc171f34db9b | 389 | |
emh203 | 1:dc171f34db9b | 390 | } while (read_ata(REG_STATUS) & (BUSY | ERR)); |
emh203 | 1:dc171f34db9b | 391 | |
emh203 | 1:dc171f34db9b | 392 | Stat[CF] &= ~STA_NOINIT; /* When device goes ready, clear STA_NOINIT */ |
emh203 | 1:dc171f34db9b | 393 | |
emh203 | 1:dc171f34db9b | 394 | RetVal = Stat[CF]; |
emh203 | 1:dc171f34db9b | 395 | |
emh203 | 1:dc171f34db9b | 396 | break; |
emh203 | 1:dc171f34db9b | 397 | |
emh203 | 1:dc171f34db9b | 398 | case USB: |
emh203 | 1:dc171f34db9b | 399 | |
emh203 | 1:dc171f34db9b | 400 | Host_Init(); |
emh203 | 1:dc171f34db9b | 401 | if(!Host_EnumDev()) |
emh203 | 1:dc171f34db9b | 402 | { |
emh203 | 1:dc171f34db9b | 403 | |
emh203 | 1:dc171f34db9b | 404 | rc = MS_Init( &_blkSize, &_numBlks, inquiryResult ); |
emh203 | 1:dc171f34db9b | 405 | if (rc != OK) |
emh203 | 1:dc171f34db9b | 406 | { |
emh203 | 1:dc171f34db9b | 407 | TERMINAL_PRINTF("Could not initialize mass storage interface: %d\r\n", rc); |
emh203 | 1:dc171f34db9b | 408 | Stat[USB] |= STA_NOINIT; |
emh203 | 1:dc171f34db9b | 409 | } |
emh203 | 1:dc171f34db9b | 410 | else |
emh203 | 1:dc171f34db9b | 411 | { |
emh203 | 1:dc171f34db9b | 412 | Stat[USB] &= ~STA_NOINIT; |
emh203 | 1:dc171f34db9b | 413 | } |
emh203 | 1:dc171f34db9b | 414 | } |
emh203 | 1:dc171f34db9b | 415 | else |
emh203 | 1:dc171f34db9b | 416 | { |
emh203 | 1:dc171f34db9b | 417 | Stat[USB] |= STA_NOINIT; |
emh203 | 1:dc171f34db9b | 418 | } |
emh203 | 1:dc171f34db9b | 419 | |
emh203 | 1:dc171f34db9b | 420 | RetVal = Stat[USB]; |
emh203 | 1:dc171f34db9b | 421 | break; |
emh203 | 1:dc171f34db9b | 422 | |
emh203 | 1:dc171f34db9b | 423 | |
emh203 | 1:dc171f34db9b | 424 | case RAM: |
emh203 | 1:dc171f34db9b | 425 | Stat[RAM] &= ~STA_NOINIT; |
emh203 | 1:dc171f34db9b | 426 | RetVal = Stat[RAM]; |
emh203 | 1:dc171f34db9b | 427 | break; |
emh203 | 1:dc171f34db9b | 428 | |
emh203 | 1:dc171f34db9b | 429 | default: |
emh203 | 1:dc171f34db9b | 430 | RetVal = STA_NOINIT; |
emh203 | 1:dc171f34db9b | 431 | break; |
emh203 | 1:dc171f34db9b | 432 | } |
emh203 | 0:6b1e6c9e48ba | 433 | |
emh203 | 1:dc171f34db9b | 434 | return RetVal; |
emh203 | 0:6b1e6c9e48ba | 435 | } |
emh203 | 0:6b1e6c9e48ba | 436 | |
emh203 | 0:6b1e6c9e48ba | 437 | |
emh203 | 0:6b1e6c9e48ba | 438 | |
emh203 | 0:6b1e6c9e48ba | 439 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 440 | /* Return Disk Status */ |
emh203 | 0:6b1e6c9e48ba | 441 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 442 | |
emh203 | 0:6b1e6c9e48ba | 443 | DSTATUS disk_status ( |
emh203 | 1:dc171f34db9b | 444 | BYTE drv |
emh203 | 0:6b1e6c9e48ba | 445 | ) |
emh203 | 0:6b1e6c9e48ba | 446 | { |
emh203 | 1:dc171f34db9b | 447 | DSTATUS RetVal; |
emh203 | 1:dc171f34db9b | 448 | |
emh203 | 1:dc171f34db9b | 449 | switch(drv) |
emh203 | 1:dc171f34db9b | 450 | { |
emh203 | 1:dc171f34db9b | 451 | case CF: |
emh203 | 1:dc171f34db9b | 452 | RetVal = Stat[CF]; |
emh203 | 1:dc171f34db9b | 453 | break; |
emh203 | 1:dc171f34db9b | 454 | |
emh203 | 1:dc171f34db9b | 455 | |
emh203 | 1:dc171f34db9b | 456 | case USB: |
emh203 | 1:dc171f34db9b | 457 | RetVal = Stat[USB]; |
emh203 | 1:dc171f34db9b | 458 | break; |
emh203 | 1:dc171f34db9b | 459 | |
emh203 | 1:dc171f34db9b | 460 | case RAM: |
emh203 | 1:dc171f34db9b | 461 | RetVal = Stat[RAM]; |
emh203 | 1:dc171f34db9b | 462 | break; |
emh203 | 1:dc171f34db9b | 463 | |
emh203 | 1:dc171f34db9b | 464 | default: |
emh203 | 1:dc171f34db9b | 465 | RetVal = STA_NOINIT; |
emh203 | 1:dc171f34db9b | 466 | break; |
emh203 | 1:dc171f34db9b | 467 | } |
emh203 | 1:dc171f34db9b | 468 | |
emh203 | 1:dc171f34db9b | 469 | return RetVal; |
emh203 | 0:6b1e6c9e48ba | 470 | } |
emh203 | 0:6b1e6c9e48ba | 471 | |
emh203 | 0:6b1e6c9e48ba | 472 | |
emh203 | 0:6b1e6c9e48ba | 473 | |
emh203 | 0:6b1e6c9e48ba | 474 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 475 | /* Read Sector(s) */ |
emh203 | 0:6b1e6c9e48ba | 476 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 477 | |
emh203 | 0:6b1e6c9e48ba | 478 | DRESULT disk_read ( |
emh203 | 0:6b1e6c9e48ba | 479 | BYTE drv, /* Physical drive nmuber (0) */ |
emh203 | 0:6b1e6c9e48ba | 480 | BYTE *buff, /* Data buffer to store read data */ |
emh203 | 0:6b1e6c9e48ba | 481 | DWORD sector, /* Sector number (LBA) */ |
emh203 | 0:6b1e6c9e48ba | 482 | BYTE count /* Sector count (1..255) */ |
emh203 | 0:6b1e6c9e48ba | 483 | ) |
emh203 | 0:6b1e6c9e48ba | 484 | { |
emh203 | 0:6b1e6c9e48ba | 485 | BYTE c; |
emh203 | 1:dc171f34db9b | 486 | DWORD i,j; |
emh203 | 0:6b1e6c9e48ba | 487 | |
emh203 | 1:dc171f34db9b | 488 | switch(drv) |
emh203 | 1:dc171f34db9b | 489 | { |
emh203 | 1:dc171f34db9b | 490 | case CF: |
emh203 | 1:dc171f34db9b | 491 | if (Stat[CF] & STA_NOINIT) return RES_NOTRDY; |
emh203 | 0:6b1e6c9e48ba | 492 | |
emh203 | 1:dc171f34db9b | 493 | /* Issue Read Setor(s) command */ |
emh203 | 1:dc171f34db9b | 494 | write_ata(REG_COUNT, count); |
emh203 | 1:dc171f34db9b | 495 | write_ata(REG_SECTOR, (BYTE)sector); |
emh203 | 1:dc171f34db9b | 496 | write_ata(REG_CYLL, (BYTE)(sector >> 8)); |
emh203 | 1:dc171f34db9b | 497 | write_ata(REG_CYLH, (BYTE)(sector >> 16)); |
emh203 | 1:dc171f34db9b | 498 | write_ata(REG_DEV, ((BYTE)(sector >> 24) & 0x0F) | LBA); |
emh203 | 1:dc171f34db9b | 499 | write_ata(REG_COMMAND, CMD_READ); |
emh203 | 1:dc171f34db9b | 500 | |
emh203 | 1:dc171f34db9b | 501 | do { |
emh203 | 1:dc171f34db9b | 502 | if (!wait_data()) return RES_ERROR; /* Wait data ready */ |
emh203 | 1:dc171f34db9b | 503 | |
emh203 | 1:dc171f34db9b | 504 | SET_CF_ADDRESS(REG_DATA); |
emh203 | 1:dc171f34db9b | 505 | __nop(); |
emh203 | 1:dc171f34db9b | 506 | __nop(); |
emh203 | 1:dc171f34db9b | 507 | __nop(); |
emh203 | 1:dc171f34db9b | 508 | __nop(); |
emh203 | 1:dc171f34db9b | 509 | CS0_ACTIVE; |
emh203 | 1:dc171f34db9b | 510 | c = 0; |
emh203 | 1:dc171f34db9b | 511 | |
emh203 | 1:dc171f34db9b | 512 | __nop(); |
emh203 | 1:dc171f34db9b | 513 | __nop(); |
emh203 | 1:dc171f34db9b | 514 | __nop(); |
emh203 | 1:dc171f34db9b | 515 | |
emh203 | 1:dc171f34db9b | 516 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 1:dc171f34db9b | 517 | do { |
emh203 | 1:dc171f34db9b | 518 | IORD_ACTIVE; /* IORD = L */ |
emh203 | 1:dc171f34db9b | 519 | __nop(); |
emh203 | 1:dc171f34db9b | 520 | __nop(); |
emh203 | 1:dc171f34db9b | 521 | __nop(); |
emh203 | 1:dc171f34db9b | 522 | GET_CF_DATA(*buff++); /* Get even data */ |
emh203 | 1:dc171f34db9b | 523 | __nop(); |
emh203 | 1:dc171f34db9b | 524 | __nop(); |
emh203 | 1:dc171f34db9b | 525 | __nop(); |
emh203 | 1:dc171f34db9b | 526 | |
emh203 | 1:dc171f34db9b | 527 | __nop(); |
emh203 | 1:dc171f34db9b | 528 | __nop(); |
emh203 | 1:dc171f34db9b | 529 | __nop(); |
emh203 | 1:dc171f34db9b | 530 | |
emh203 | 1:dc171f34db9b | 531 | IORD_INACTIVE; /* IORD = H */ |
emh203 | 1:dc171f34db9b | 532 | __nop(); |
emh203 | 1:dc171f34db9b | 533 | __nop(); |
emh203 | 1:dc171f34db9b | 534 | __nop(); |
emh203 | 1:dc171f34db9b | 535 | |
emh203 | 1:dc171f34db9b | 536 | IORD_ACTIVE; /* IORD = L */ |
emh203 | 1:dc171f34db9b | 537 | __nop(); |
emh203 | 1:dc171f34db9b | 538 | __nop(); |
emh203 | 1:dc171f34db9b | 539 | __nop(); |
emh203 | 1:dc171f34db9b | 540 | |
emh203 | 1:dc171f34db9b | 541 | GET_CF_DATA(*buff++); /* Get Odd data */ |
emh203 | 1:dc171f34db9b | 542 | __nop(); |
emh203 | 1:dc171f34db9b | 543 | __nop(); |
emh203 | 1:dc171f34db9b | 544 | __nop(); |
emh203 | 1:dc171f34db9b | 545 | |
emh203 | 1:dc171f34db9b | 546 | __nop(); |
emh203 | 1:dc171f34db9b | 547 | IORD_INACTIVE; /* IORD = H */ |
emh203 | 1:dc171f34db9b | 548 | __nop(); |
emh203 | 1:dc171f34db9b | 549 | __nop(); |
emh203 | 1:dc171f34db9b | 550 | __nop(); |
emh203 | 1:dc171f34db9b | 551 | |
emh203 | 1:dc171f34db9b | 552 | |
emh203 | 1:dc171f34db9b | 553 | } while (--c); |
emh203 | 1:dc171f34db9b | 554 | } while (--count); |
emh203 | 1:dc171f34db9b | 555 | |
emh203 | 1:dc171f34db9b | 556 | CS0_INACTIVE; |
emh203 | 1:dc171f34db9b | 557 | read_ata(REG_ALTSTAT); |
emh203 | 1:dc171f34db9b | 558 | read_ata(REG_STATUS); |
emh203 | 1:dc171f34db9b | 559 | |
emh203 | 1:dc171f34db9b | 560 | return RES_OK; |
emh203 | 1:dc171f34db9b | 561 | break; |
emh203 | 1:dc171f34db9b | 562 | |
emh203 | 1:dc171f34db9b | 563 | |
emh203 | 1:dc171f34db9b | 564 | case USB: |
emh203 | 1:dc171f34db9b | 565 | |
emh203 | 1:dc171f34db9b | 566 | if ( OK == MS_BulkRecv(sector, 1, (USB_INT08U *)buff) ) |
emh203 | 1:dc171f34db9b | 567 | return RES_OK; |
emh203 | 1:dc171f34db9b | 568 | else |
emh203 | 1:dc171f34db9b | 569 | return RES_NOTRDY; |
emh203 | 1:dc171f34db9b | 570 | break; |
emh203 | 1:dc171f34db9b | 571 | |
emh203 | 1:dc171f34db9b | 572 | case RAM: |
emh203 | 1:dc171f34db9b | 573 | for(i=0;i<512;i++) |
emh203 | 1:dc171f34db9b | 574 | { |
emh203 | 1:dc171f34db9b | 575 | buff[i] = RAM_DISK[i]; |
emh203 | 1:dc171f34db9b | 576 | } |
emh203 | 1:dc171f34db9b | 577 | return RES_OK; |
emh203 | 1:dc171f34db9b | 578 | break; |
emh203 | 1:dc171f34db9b | 579 | |
emh203 | 1:dc171f34db9b | 580 | default: |
emh203 | 1:dc171f34db9b | 581 | return RES_PARERR; |
emh203 | 1:dc171f34db9b | 582 | break; |
emh203 | 1:dc171f34db9b | 583 | } |
emh203 | 0:6b1e6c9e48ba | 584 | } |
emh203 | 0:6b1e6c9e48ba | 585 | |
emh203 | 0:6b1e6c9e48ba | 586 | |
emh203 | 0:6b1e6c9e48ba | 587 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 588 | /* Write Sector(s) */ |
emh203 | 0:6b1e6c9e48ba | 589 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 590 | |
emh203 | 0:6b1e6c9e48ba | 591 | DRESULT disk_write ( |
emh203 | 0:6b1e6c9e48ba | 592 | BYTE drv, /* Physical drive number (0) */ |
emh203 | 0:6b1e6c9e48ba | 593 | const BYTE *buff, /* Data to be written */ |
emh203 | 0:6b1e6c9e48ba | 594 | DWORD sector, /* Sector number (LBA) */ |
emh203 | 0:6b1e6c9e48ba | 595 | BYTE count /* Sector count (1..255) */ |
emh203 | 0:6b1e6c9e48ba | 596 | ) |
emh203 | 0:6b1e6c9e48ba | 597 | { |
emh203 | 0:6b1e6c9e48ba | 598 | BYTE s, c; |
emh203 | 0:6b1e6c9e48ba | 599 | DWORD i; |
emh203 | 1:dc171f34db9b | 600 | DRESULT RetVal; |
emh203 | 0:6b1e6c9e48ba | 601 | |
emh203 | 1:dc171f34db9b | 602 | switch(drv) |
emh203 | 1:dc171f34db9b | 603 | { |
emh203 | 1:dc171f34db9b | 604 | case CF: |
emh203 | 1:dc171f34db9b | 605 | /* Issue Write Setor(s) command */ |
emh203 | 1:dc171f34db9b | 606 | write_ata(REG_COUNT, count); |
emh203 | 1:dc171f34db9b | 607 | write_ata(REG_SECTOR, (BYTE)sector); |
emh203 | 1:dc171f34db9b | 608 | write_ata(REG_CYLL, (BYTE)(sector >> 8)); |
emh203 | 1:dc171f34db9b | 609 | write_ata(REG_CYLH, (BYTE)(sector >> 16)); |
emh203 | 1:dc171f34db9b | 610 | write_ata(REG_DEV, ((BYTE)(sector >> 24) & 0x0F) | LBA); |
emh203 | 1:dc171f34db9b | 611 | write_ata(REG_COMMAND, CMD_WRITE); |
emh203 | 1:dc171f34db9b | 612 | |
emh203 | 1:dc171f34db9b | 613 | do { |
emh203 | 1:dc171f34db9b | 614 | if (!wait_data()) return RES_ERROR; |
emh203 | 1:dc171f34db9b | 615 | |
emh203 | 1:dc171f34db9b | 616 | SET_CF_ADDRESS(REG_DATA); |
emh203 | 1:dc171f34db9b | 617 | __nop(); |
emh203 | 1:dc171f34db9b | 618 | __nop(); |
emh203 | 1:dc171f34db9b | 619 | __nop(); |
emh203 | 1:dc171f34db9b | 620 | CS0_ACTIVE; |
emh203 | 1:dc171f34db9b | 621 | __nop(); |
emh203 | 1:dc171f34db9b | 622 | __nop(); |
emh203 | 1:dc171f34db9b | 623 | __nop(); |
emh203 | 1:dc171f34db9b | 624 | |
emh203 | 1:dc171f34db9b | 625 | SET_DATA_BUS_AS_OUTPUTS; |
emh203 | 1:dc171f34db9b | 626 | c = 0; |
emh203 | 1:dc171f34db9b | 627 | do { |
emh203 | 1:dc171f34db9b | 628 | SET_CF_DATA(*buff++); /* Set even data */ |
emh203 | 1:dc171f34db9b | 629 | __nop(); |
emh203 | 1:dc171f34db9b | 630 | __nop(); |
emh203 | 1:dc171f34db9b | 631 | __nop(); |
emh203 | 1:dc171f34db9b | 632 | |
emh203 | 1:dc171f34db9b | 633 | IOWR_ACTIVE; /* IOWR = L */ |
emh203 | 1:dc171f34db9b | 634 | __nop(); |
emh203 | 1:dc171f34db9b | 635 | __nop(); |
emh203 | 1:dc171f34db9b | 636 | __nop(); |
emh203 | 1:dc171f34db9b | 637 | |
emh203 | 1:dc171f34db9b | 638 | IOWR_INACTIVE; /* IOWR = H */ |
emh203 | 1:dc171f34db9b | 639 | __nop(); |
emh203 | 1:dc171f34db9b | 640 | __nop(); |
emh203 | 1:dc171f34db9b | 641 | __nop(); |
emh203 | 1:dc171f34db9b | 642 | |
emh203 | 1:dc171f34db9b | 643 | SET_CF_DATA(*buff++); /* Set odd data */ |
emh203 | 1:dc171f34db9b | 644 | __nop(); |
emh203 | 1:dc171f34db9b | 645 | __nop(); |
emh203 | 1:dc171f34db9b | 646 | __nop(); |
emh203 | 1:dc171f34db9b | 647 | |
emh203 | 1:dc171f34db9b | 648 | IOWR_ACTIVE; /* IOWR = L */ |
emh203 | 1:dc171f34db9b | 649 | __nop(); |
emh203 | 1:dc171f34db9b | 650 | __nop(); |
emh203 | 1:dc171f34db9b | 651 | __nop(); |
emh203 | 1:dc171f34db9b | 652 | |
emh203 | 1:dc171f34db9b | 653 | IOWR_INACTIVE; /* IOWR = H */ |
emh203 | 1:dc171f34db9b | 654 | __nop(); |
emh203 | 1:dc171f34db9b | 655 | __nop(); |
emh203 | 1:dc171f34db9b | 656 | __nop(); |
emh203 | 1:dc171f34db9b | 657 | } while (--c); |
emh203 | 1:dc171f34db9b | 658 | |
emh203 | 1:dc171f34db9b | 659 | } while (--count); |
emh203 | 1:dc171f34db9b | 660 | |
emh203 | 1:dc171f34db9b | 661 | SET_DATA_BUS_AS_INPUTS; |
emh203 | 1:dc171f34db9b | 662 | CS0_INACTIVE; |
emh203 | 1:dc171f34db9b | 663 | |
emh203 | 1:dc171f34db9b | 664 | DiskProcTimer[CF] = 100; |
emh203 | 1:dc171f34db9b | 665 | do { |
emh203 | 1:dc171f34db9b | 666 | if (!DiskProcTimer[CF]) return RES_ERROR; |
emh203 | 1:dc171f34db9b | 667 | s = read_ata(REG_STATUS); |
emh203 | 1:dc171f34db9b | 668 | } while (s & BUSY); |
emh203 | 1:dc171f34db9b | 669 | if (s & ERR) return RES_ERROR; |
emh203 | 1:dc171f34db9b | 670 | |
emh203 | 1:dc171f34db9b | 671 | read_ata(REG_ALTSTAT); |
emh203 | 1:dc171f34db9b | 672 | read_ata(REG_STATUS); |
emh203 | 0:6b1e6c9e48ba | 673 | |
emh203 | 1:dc171f34db9b | 674 | RetVal = RES_OK; |
emh203 | 1:dc171f34db9b | 675 | break; |
emh203 | 1:dc171f34db9b | 676 | |
emh203 | 1:dc171f34db9b | 677 | |
emh203 | 1:dc171f34db9b | 678 | case USB: |
emh203 | 1:dc171f34db9b | 679 | if ( OK == MS_BulkSend(sector, 1, (USB_INT08U *)buff) ) |
emh203 | 1:dc171f34db9b | 680 | RetVal = RES_OK; |
emh203 | 1:dc171f34db9b | 681 | else; |
emh203 | 1:dc171f34db9b | 682 | RetVal = RES_NOTRDY; |
emh203 | 1:dc171f34db9b | 683 | break; |
emh203 | 1:dc171f34db9b | 684 | |
emh203 | 1:dc171f34db9b | 685 | case RAM: |
emh203 | 1:dc171f34db9b | 686 | |
emh203 | 1:dc171f34db9b | 687 | for(i=0;i<512;i++) |
emh203 | 1:dc171f34db9b | 688 | { |
emh203 | 1:dc171f34db9b | 689 | RAM_DISK[i] = buff[i]; |
emh203 | 1:dc171f34db9b | 690 | } |
emh203 | 1:dc171f34db9b | 691 | RetVal = RES_OK; |
emh203 | 1:dc171f34db9b | 692 | |
emh203 | 1:dc171f34db9b | 693 | break; |
emh203 | 1:dc171f34db9b | 694 | |
emh203 | 1:dc171f34db9b | 695 | default: |
emh203 | 1:dc171f34db9b | 696 | RetVal = RES_PARERR; |
emh203 | 1:dc171f34db9b | 697 | break; |
emh203 | 1:dc171f34db9b | 698 | |
emh203 | 1:dc171f34db9b | 699 | return RetVal; |
emh203 | 1:dc171f34db9b | 700 | } |
emh203 | 0:6b1e6c9e48ba | 701 | |
emh203 | 1:dc171f34db9b | 702 | } |
emh203 | 0:6b1e6c9e48ba | 703 | |
emh203 | 1:dc171f34db9b | 704 | |
emh203 | 1:dc171f34db9b | 705 | |
emh203 | 0:6b1e6c9e48ba | 706 | |
emh203 | 0:6b1e6c9e48ba | 707 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 708 | /* Miscellaneous Functions */ |
emh203 | 0:6b1e6c9e48ba | 709 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 710 | |
emh203 | 0:6b1e6c9e48ba | 711 | DRESULT disk_ioctl ( |
emh203 | 0:6b1e6c9e48ba | 712 | BYTE drv, /* Physical drive nmuber (0) */ |
emh203 | 0:6b1e6c9e48ba | 713 | BYTE ctrl, /* Control code */ |
emh203 | 0:6b1e6c9e48ba | 714 | void *buff /* Buffer to send/receive data block */ |
emh203 | 0:6b1e6c9e48ba | 715 | ) |
emh203 | 0:6b1e6c9e48ba | 716 | { |
emh203 | 0:6b1e6c9e48ba | 717 | BYTE n, w, ofs, dl, dh, *ptr = (BYTE *)buff; |
emh203 | 1:dc171f34db9b | 718 | USB_INT32S rc; |
emh203 | 1:dc171f34db9b | 719 | |
emh203 | 1:dc171f34db9b | 720 | switch(drv) |
emh203 | 1:dc171f34db9b | 721 | { |
emh203 | 1:dc171f34db9b | 722 | case CF: |
emh203 | 1:dc171f34db9b | 723 | switch (ctrl) |
emh203 | 1:dc171f34db9b | 724 | { |
emh203 | 1:dc171f34db9b | 725 | case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ |
emh203 | 1:dc171f34db9b | 726 | ofs = 60; w = 2; n = 0; |
emh203 | 1:dc171f34db9b | 727 | break; |
emh203 | 1:dc171f34db9b | 728 | |
emh203 | 1:dc171f34db9b | 729 | case GET_BLOCK_SIZE : /* Get erase block size in sectors (DWORD) */ |
emh203 | 1:dc171f34db9b | 730 | *(DWORD*)buff = 32; |
emh203 | 1:dc171f34db9b | 731 | return RES_OK; |
emh203 | 1:dc171f34db9b | 732 | break; |
emh203 | 1:dc171f34db9b | 733 | case CTRL_SYNC : /* Nothing to do */ |
emh203 | 1:dc171f34db9b | 734 | return RES_OK; |
emh203 | 1:dc171f34db9b | 735 | break; |
emh203 | 1:dc171f34db9b | 736 | case ATA_GET_REV : /* Get firmware revision (8 chars) */ |
emh203 | 1:dc171f34db9b | 737 | ofs = 23; w = 4; n = 4; |
emh203 | 1:dc171f34db9b | 738 | break; |
emh203 | 1:dc171f34db9b | 739 | |
emh203 | 1:dc171f34db9b | 740 | case ATA_GET_MODEL : /* Get model name (40 chars) */ |
emh203 | 1:dc171f34db9b | 741 | ofs = 27; w = 20; n = 20; |
emh203 | 1:dc171f34db9b | 742 | break; |
emh203 | 1:dc171f34db9b | 743 | |
emh203 | 1:dc171f34db9b | 744 | case ATA_GET_SN : /* Get serial number (20 chars) */ |
emh203 | 1:dc171f34db9b | 745 | ofs = 10; w = 10; n = 10; |
emh203 | 1:dc171f34db9b | 746 | break; |
emh203 | 1:dc171f34db9b | 747 | |
emh203 | 1:dc171f34db9b | 748 | default: |
emh203 | 1:dc171f34db9b | 749 | return RES_PARERR; |
emh203 | 1:dc171f34db9b | 750 | } |
emh203 | 1:dc171f34db9b | 751 | |
emh203 | 1:dc171f34db9b | 752 | write_ata(REG_COMMAND, CMD_IDENTIFY); |
emh203 | 1:dc171f34db9b | 753 | |
emh203 | 1:dc171f34db9b | 754 | if (!wait_data()) return RES_ERROR; |
emh203 | 1:dc171f34db9b | 755 | |
emh203 | 1:dc171f34db9b | 756 | read_part(ptr, ofs, w); |
emh203 | 1:dc171f34db9b | 757 | |
emh203 | 1:dc171f34db9b | 758 | while (n--) |
emh203 | 1:dc171f34db9b | 759 | { |
emh203 | 1:dc171f34db9b | 760 | dl = *ptr; dh = *(ptr+1); |
emh203 | 1:dc171f34db9b | 761 | *ptr++ = dh; *ptr++ = dl; |
emh203 | 1:dc171f34db9b | 762 | } |
emh203 | 1:dc171f34db9b | 763 | |
emh203 | 1:dc171f34db9b | 764 | return RES_OK; |
emh203 | 1:dc171f34db9b | 765 | break; |
emh203 | 1:dc171f34db9b | 766 | |
emh203 | 1:dc171f34db9b | 767 | |
emh203 | 1:dc171f34db9b | 768 | case USB: |
emh203 | 1:dc171f34db9b | 769 | rc = MS_Init( &_blkSize, &_numBlks, inquiryResult ); |
emh203 | 1:dc171f34db9b | 770 | |
emh203 | 1:dc171f34db9b | 771 | if (rc != OK) |
emh203 | 1:dc171f34db9b | 772 | { |
emh203 | 1:dc171f34db9b | 773 | TERMINAL_PRINTF("Could not get data from USB Inquiry: %d\r\n", rc); |
emh203 | 1:dc171f34db9b | 774 | return RES_ERROR; |
emh203 | 1:dc171f34db9b | 775 | } |
emh203 | 1:dc171f34db9b | 776 | else |
emh203 | 1:dc171f34db9b | 777 | { |
emh203 | 1:dc171f34db9b | 778 | Stat[USB] &= ~STA_NOINIT; |
emh203 | 1:dc171f34db9b | 779 | switch (ctrl) |
emh203 | 1:dc171f34db9b | 780 | { |
emh203 | 1:dc171f34db9b | 781 | case GET_SECTOR_COUNT : |
emh203 | 1:dc171f34db9b | 782 | *(DWORD *)(buff) =_numBlks; |
emh203 | 1:dc171f34db9b | 783 | break; |
emh203 | 1:dc171f34db9b | 784 | |
emh203 | 1:dc171f34db9b | 785 | case GET_BLOCK_SIZE : |
emh203 | 1:dc171f34db9b | 786 | *(DWORD *)(buff) = _blkSize; |
emh203 | 1:dc171f34db9b | 787 | return RES_OK; |
emh203 | 1:dc171f34db9b | 788 | break; |
emh203 | 1:dc171f34db9b | 789 | case CTRL_SYNC : |
emh203 | 1:dc171f34db9b | 790 | return RES_OK; |
emh203 | 1:dc171f34db9b | 791 | break; |
emh203 | 1:dc171f34db9b | 792 | case ATA_GET_REV : |
emh203 | 1:dc171f34db9b | 793 | memcpy ((CHAR *)buff,(const char *)&inquiryResult[32],8); |
emh203 | 1:dc171f34db9b | 794 | return RES_OK; |
emh203 | 1:dc171f34db9b | 795 | break; |
emh203 | 1:dc171f34db9b | 796 | |
emh203 | 1:dc171f34db9b | 797 | case ATA_GET_MODEL : |
emh203 | 1:dc171f34db9b | 798 | memcpy ((CHAR *)buff, (const char *)&inquiryResult[8],8); |
emh203 | 1:dc171f34db9b | 799 | return RES_OK; |
emh203 | 1:dc171f34db9b | 800 | break; |
emh203 | 1:dc171f34db9b | 801 | |
emh203 | 1:dc171f34db9b | 802 | case ATA_GET_SN : |
emh203 | 1:dc171f34db9b | 803 | memcpy ((CHAR *)buff,(const char *)&inquiryResult[16],8); |
emh203 | 1:dc171f34db9b | 804 | return RES_OK; |
emh203 | 1:dc171f34db9b | 805 | break; |
emh203 | 1:dc171f34db9b | 806 | |
emh203 | 1:dc171f34db9b | 807 | default: |
emh203 | 1:dc171f34db9b | 808 | return RES_PARERR; |
emh203 | 1:dc171f34db9b | 809 | } |
emh203 | 1:dc171f34db9b | 810 | } |
emh203 | 1:dc171f34db9b | 811 | |
emh203 | 1:dc171f34db9b | 812 | break; |
emh203 | 1:dc171f34db9b | 813 | |
emh203 | 1:dc171f34db9b | 814 | case RAM: |
emh203 | 1:dc171f34db9b | 815 | switch (ctrl) |
emh203 | 1:dc171f34db9b | 816 | { |
emh203 | 1:dc171f34db9b | 817 | case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */ |
emh203 | 1:dc171f34db9b | 818 | *(DWORD *)(buff) = 1; |
emh203 | 1:dc171f34db9b | 819 | break; |
emh203 | 1:dc171f34db9b | 820 | |
emh203 | 1:dc171f34db9b | 821 | case GET_BLOCK_SIZE : /* Get erase block size in sectors (DWORD) */ |
emh203 | 1:dc171f34db9b | 822 | *(DWORD *)(buff) = 1; |
emh203 | 1:dc171f34db9b | 823 | return RES_OK; |
emh203 | 1:dc171f34db9b | 824 | break; |
emh203 | 1:dc171f34db9b | 825 | case CTRL_SYNC : /* Nothing to do */ |
emh203 | 1:dc171f34db9b | 826 | return RES_OK; |
emh203 | 1:dc171f34db9b | 827 | break; |
emh203 | 1:dc171f34db9b | 828 | case ATA_GET_REV : /* Get firmware revision (8 chars) */ |
emh203 | 1:dc171f34db9b | 829 | strcpy ((CHAR *)buff,"Rev 0.01"); |
emh203 | 1:dc171f34db9b | 830 | break; |
emh203 | 1:dc171f34db9b | 831 | |
emh203 | 1:dc171f34db9b | 832 | case ATA_GET_MODEL : /* Get model name (40 chars) */ |
emh203 | 1:dc171f34db9b | 833 | strcpy ((CHAR *)buff,"Wavenumber RAM Drive"); |
emh203 | 1:dc171f34db9b | 834 | break; |
emh203 | 1:dc171f34db9b | 835 | |
emh203 | 1:dc171f34db9b | 836 | case ATA_GET_SN : /* Get serial number (20 chars) */ |
emh203 | 1:dc171f34db9b | 837 | strcpy ((CHAR *)buff,"12345"); |
emh203 | 1:dc171f34db9b | 838 | break; |
emh203 | 1:dc171f34db9b | 839 | default: |
emh203 | 1:dc171f34db9b | 840 | return RES_PARERR; |
emh203 | 1:dc171f34db9b | 841 | } |
emh203 | 1:dc171f34db9b | 842 | return RES_OK; |
emh203 | 1:dc171f34db9b | 843 | break; |
emh203 | 1:dc171f34db9b | 844 | |
emh203 | 0:6b1e6c9e48ba | 845 | default: |
emh203 | 1:dc171f34db9b | 846 | return RES_PARERR; |
emh203 | 1:dc171f34db9b | 847 | break; |
emh203 | 0:6b1e6c9e48ba | 848 | } |
emh203 | 0:6b1e6c9e48ba | 849 | |
emh203 | 0:6b1e6c9e48ba | 850 | return RES_OK; |
emh203 | 0:6b1e6c9e48ba | 851 | } |
emh203 | 0:6b1e6c9e48ba | 852 | |
emh203 | 0:6b1e6c9e48ba | 853 | |
emh203 | 0:6b1e6c9e48ba | 854 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 855 | /* Device timer interrupt procedure */ |
emh203 | 0:6b1e6c9e48ba | 856 | /*-----------------------------------------------------------------------*/ |
emh203 | 0:6b1e6c9e48ba | 857 | /* This function must be called in period of 10ms */ |
emh203 | 0:6b1e6c9e48ba | 858 | |
emh203 | 0:6b1e6c9e48ba | 859 | void disk_timerproc (void) |
emh203 | 0:6b1e6c9e48ba | 860 | { |
emh203 | 0:6b1e6c9e48ba | 861 | static BYTE pv; |
emh203 | 0:6b1e6c9e48ba | 862 | BYTE n; |
emh203 | 1:dc171f34db9b | 863 | |
emh203 | 1:dc171f34db9b | 864 | n = DiskProcTimer[CF]; /* 100Hz decrement timer */ |
emh203 | 1:dc171f34db9b | 865 | if (n) DiskProcTimer[CF] = --n; |
emh203 | 0:6b1e6c9e48ba | 866 | |
emh203 | 1:dc171f34db9b | 867 | n = DiskProcTimer[USB]; /* 100Hz decrement timer */ |
emh203 | 1:dc171f34db9b | 868 | if (n) DiskProcTimer[USB] = --n; |
emh203 | 1:dc171f34db9b | 869 | |
emh203 | 1:dc171f34db9b | 870 | n = DiskProcTimer[RAM]; /* 100Hz decrement timer */ |
emh203 | 1:dc171f34db9b | 871 | if (n) DiskProcTimer[RAM] = --n; |
emh203 | 0:6b1e6c9e48ba | 872 | |
emh203 | 0:6b1e6c9e48ba | 873 | n = pv; |
emh203 | 0:6b1e6c9e48ba | 874 | pv = COMPACT_FLASH_CARD_DETECTED ; /* Sapmle socket switch */ |
emh203 | 0:6b1e6c9e48ba | 875 | |
emh203 | 1:dc171f34db9b | 876 | |
emh203 | 1:dc171f34db9b | 877 | //Check Compact Flash Card Detect |
emh203 | 0:6b1e6c9e48ba | 878 | if (n == pv) { /* Have contacts stabled? */ |
emh203 | 0:6b1e6c9e48ba | 879 | if (!COMPACT_FLASH_CARD_DETECTED ) |
emh203 | 0:6b1e6c9e48ba | 880 | { /* CD1 or CD2 is high (Socket empty) */ |
emh203 | 1:dc171f34db9b | 881 | Stat[CF] |= (STA_NODISK | STA_NOINIT); |
emh203 | 0:6b1e6c9e48ba | 882 | SET_DATA_BUS_TO_INPUTS; /* Float D0-D7 */ |
emh203 | 0:6b1e6c9e48ba | 883 | COMPACT_FLASH_RESET_ACTIVE; /* Assert RESET# */ |
emh203 | 0:6b1e6c9e48ba | 884 | COMPACT_FLASH_POWER_DISABLE; /* Power OFF */ |
emh203 | 0:6b1e6c9e48ba | 885 | LED1_OFF; |
emh203 | 1:dc171f34db9b | 886 | } |
emh203 | 1:dc171f34db9b | 887 | else |
emh203 | 1:dc171f34db9b | 888 | { /* CD1 and CD2 are low (Card inserted) */ |
emh203 | 1:dc171f34db9b | 889 | Stat[CF] &= ~STA_NODISK; |
emh203 | 0:6b1e6c9e48ba | 890 | LED1_ON; |
emh203 | 0:6b1e6c9e48ba | 891 | } |
emh203 | 0:6b1e6c9e48ba | 892 | } |
emh203 | 1:dc171f34db9b | 893 | |
emh203 | 1:dc171f34db9b | 894 | //Check to see if a USB drive is connected |
emh203 | 1:dc171f34db9b | 895 | if(HOST_RhscIntr>0) |
emh203 | 1:dc171f34db9b | 896 | LED2_ON; |
emh203 | 1:dc171f34db9b | 897 | else |
emh203 | 1:dc171f34db9b | 898 | LED2_OFF; |
emh203 | 1:dc171f34db9b | 899 | |
emh203 | 0:6b1e6c9e48ba | 900 | } |
emh203 | 0:6b1e6c9e48ba | 901 | |
emh203 | 0:6b1e6c9e48ba | 902 | |
emh203 | 0:6b1e6c9e48ba | 903 | DWORD get_fattime(void) |
emh203 | 0:6b1e6c9e48ba | 904 | { |
emh203 | 0:6b1e6c9e48ba | 905 | time_t CurrentTimeStamp; |
emh203 | 0:6b1e6c9e48ba | 906 | tm *CurrentLocalTime; |
emh203 | 0:6b1e6c9e48ba | 907 | DWORD FATFSTimeCode; |
emh203 | 0:6b1e6c9e48ba | 908 | |
emh203 | 0:6b1e6c9e48ba | 909 | CurrentTimeStamp = time(NULL); |
emh203 | 0:6b1e6c9e48ba | 910 | CurrentLocalTime = localtime(&CurrentTimeStamp); |
emh203 | 0:6b1e6c9e48ba | 911 | |
emh203 | 0:6b1e6c9e48ba | 912 | //Map the tm struct time into the FatFs time code |
emh203 | 0:6b1e6c9e48ba | 913 | FATFSTimeCode = ((CurrentLocalTime->tm_year-80)<<25) | |
emh203 | 0:6b1e6c9e48ba | 914 | ((CurrentLocalTime->tm_mon+1)<<21) | |
emh203 | 0:6b1e6c9e48ba | 915 | ((CurrentLocalTime->tm_mday)<<16) | |
emh203 | 0:6b1e6c9e48ba | 916 | ((CurrentLocalTime->tm_hour)<<11) | |
emh203 | 0:6b1e6c9e48ba | 917 | ((CurrentLocalTime->tm_min)<<5) | |
emh203 | 0:6b1e6c9e48ba | 918 | ((CurrentLocalTime->tm_sec)); |
emh203 | 0:6b1e6c9e48ba | 919 | |
emh203 | 0:6b1e6c9e48ba | 920 | return FATFSTimeCode; |
emh203 | 0:6b1e6c9e48ba | 921 | } |