00001 00002 00003 00004 00005 00006 00007 00008 00009 00010 00011 00012 00013 00014 //_____ I N C L U D E S ___________________________________________________ 00015 00016 #include "config.h" // system configuration 00017 #include "df_mem.h" 00018 #include "df.h" 00019 00020 00021 00022 //_____ M A C R O S ________________________________________________________ 00023 //_____ P R I V A T E D E C L A R A T I O N _____________________________ 00024 00025 00026 //_____ D E F I N I T I O N ________________________________________________ 00027 00028 00029 #define MEM_BASE_ADDRESS 0x0000 00030 00031 00032 data U32 gl_ptr_mem; /* memory data pointer */ 00033 00034 00035 /* Disk management */ 00036 bit reserved_disk_space = FALSE; /* reserved space for application on disk */ 00037 00038 00039 00040 //extern xdata U32 df_mem_size; 00041 extern xdata U32 DF_DISK_SIZE; 00042 00043 00044 void df_check_init( void ); 00045 00046 00047 //_____ D E C L A R A T I O N ______________________________________________ 00048 00059 void df_mem_init(void) 00060 { 00061 df_init(); // Init the DF driver and its communication link. 00062 } 00063 00064 00076 Ctrl_status df_test_unit_ready(void) 00077 { 00078 return( (OK==df_mem_check()) ? CTRL_GOOD : CTRL_NO_PRESENT); 00079 } 00080 00081 00092 Ctrl_status df_read_capacity( U32 _MEM_TYPE_SLOW_ *u32_nb_sector ) 00093 { 00094 *u32_nb_sector = DF_DISK_SIZE; 00095 return CTRL_GOOD; 00096 } 00097 00098 00110 Bool df_wr_protect(void) 00111 { 00112 return FALSE; 00113 } 00114 00115 00125 Bool df_removal(void) 00126 { 00127 return FALSE; 00128 } 00129 00130 00131 00132 //------------ STANDARD FUNCTIONS to read/write the memory -------------------- 00133 00150 Ctrl_status df_read_10( U32 addr , U16 nb_sector ) 00151 { 00152 #if (DF_NB_MEM != 1) // if more than 1 memory, variables are needed for zones mangement 00153 U32 next_sector_addr = addr; 00154 U16 nb_sectors_remaining = nb_sector; 00155 #endif 00156 00157 #if (DF_NB_MEM == 1) /* 1 DATAFLASH */ 00158 df_read_open(addr); // wait device is not busy, then send command & address 00159 df_read_sector(nb_sector); // transfer data from memory to USB 00160 #else /* 2 or 4 DATAFLASH */ 00161 #ifdef DF_4_MB // 512B PAGES 00162 while (nb_sectors_remaining != 0) 00163 { 00164 df_read_open(next_sector_addr); // wait device is not busy, then send command & address 00165 df_read_sector(1); // transfer the page from memory to USB 00166 df_read_close(); 00167 nb_sectors_remaining--; 00168 next_sector_addr++; 00169 } 00170 #else // 1024B PAGES 00171 while (nb_sectors_remaining != 0) 00172 { 00173 df_read_open(next_sector_addr); // wait device is not busy, then send command & address 00174 if ((LSB0(next_sector_addr)&0x01) == 0) 00175 { 00176 if (nb_sectors_remaining == 1) 00177 { 00178 df_read_sector(1); 00179 df_read_close(); 00180 nb_sectors_remaining--; 00181 next_sector_addr++; 00182 } 00183 else 00184 { 00185 df_read_sector(2); 00186 df_read_close(); 00187 nb_sectors_remaining -= 2; 00188 next_sector_addr += 2; 00189 } 00190 } 00191 else 00192 { 00193 df_read_sector(1); 00194 df_read_close(); 00195 nb_sectors_remaining--; 00196 next_sector_addr++; 00197 } 00198 } 00199 #endif 00200 #endif 00201 df_read_close(); // unselect memory 00202 return CTRL_GOOD; 00203 } 00204 00205 00219 Ctrl_status df_write_10( U32 addr , U16 nb_sector ) 00220 { 00221 #if (DF_NB_MEM != 1) // if more than 1 memory, variables are needed for zones mangement 00222 U32 next_sector_addr = addr; 00223 U16 nb_sectors_remaining = nb_sector; 00224 #endif 00225 00226 #if (DF_NB_MEM == 1) /* 1 DATAFLASH */ 00227 df_write_open(addr); // wait device is not busy, then send command & address 00228 df_write_sector(nb_sector); // transfer data from memory to USB 00229 #else /* 2 or 4 DATAFLASH */ 00230 #ifdef DF_4_MB // 512B PAGES 00231 while (nb_sectors_remaining != 0) 00232 { 00233 df_write_open(next_sector_addr); // wait device is not busy, then send command & address 00234 df_write_sector(1); // transfer the page from memory to USB 00235 df_write_close(); 00236 nb_sectors_remaining--; 00237 next_sector_addr++; 00238 } 00239 #else // 1024B PAGES 00240 while (nb_sectors_remaining != 0) 00241 { 00242 df_write_open(next_sector_addr); // wait device is not busy, then send command & address 00243 if ((LSB0(next_sector_addr)&0x01) == 0) 00244 { 00245 if (nb_sectors_remaining == 1) 00246 { 00247 df_write_sector(1); 00248 df_write_close(); 00249 nb_sectors_remaining--; 00250 next_sector_addr++; 00251 } 00252 else 00253 { 00254 df_write_sector(2); 00255 df_write_close(); 00256 nb_sectors_remaining -= 2; 00257 next_sector_addr += 2; 00258 } 00259 } 00260 else 00261 { 00262 df_write_sector(1); 00263 df_write_close(); 00264 nb_sectors_remaining--; 00265 next_sector_addr++; 00266 } 00267 } 00268 #endif 00269 #endif 00270 df_write_close(); // unselect memory 00271 return CTRL_GOOD; 00272 } 00273 00274 00275 //------------ SPECIFIC FONCTION USB TRANSFER ----------------------------------------- 00276 00277 //** If your device transfer have a specific transfer for USB (Particularity of Chejudo product, or bootloader) 00278 // !!! In this case the driver must be know the USB access 00279 00285 Ctrl_status df_usb_read() 00286 { 00287 return CTRL_GOOD; 00288 } 00289 00290 00296 Ctrl_status df_usb_write( void ) 00297 { 00298 return CTRL_GOOD; 00299 } 00300 00301 00302 //------------ Standard functions for read/write 1 sector to 1 sector ram buffer ----------------- 00303 00317 Ctrl_status df_ram_2_df(U32 addr, U8 *ram) 00318 { 00319 df_write_open(addr); 00320 df_write_sector_from_ram(ram); 00321 df_write_close(); 00322 return CTRL_GOOD; 00323 } 00324 00337 Ctrl_status df_df_2_ram( U32 addr, U8 *ram) 00338 { 00339 df_read_open(addr); 00340 df_read_sector_2_ram(ram); 00341 df_read_close(); 00342 return CTRL_GOOD; 00343 } 00344 00345 00346 00352 Ctrl_status df_df_2_ram_read() 00353 { 00354 return CTRL_GOOD; 00355 } 00356 00357 00363 Ctrl_status df_ram_2_df_write( void ) 00364 { 00365 return CTRL_GOOD; 00366 } 00367