📄 df.c
字号:
void df_write_close (void)
{
while ((((Byte*)&gl_ptr_mem)[3] != 0x00) || ((((Byte*)&gl_ptr_mem)[2] & 0x01) != 0x00))
{
Spi_write_data(0x00);
Spi_ack_write();
gl_ptr_mem++;
}
DF_CS |= DF_DESEL_ALL; /* launch page programming */
df_mem_busy = TRUE; /* memory is busy */
}
/*F**************************************************************************
* NAME: df_write_byte
*----------------------------------------------------------------------------
* PARAMS:
* b: byte to program
*
* return:
* write status: OK: write done, KO: write not done
*----------------------------------------------------------------------------
* PURPOSE:
* Low level memory write function
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* There is no need to pre-load a new page in buffer as first write
* will start at address 0 of the page. This considers file write
* does not overwrite exixting file...
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_write_byte (const Byte b)
{
if (df_mem_busy)
{ /* memory busy */
df_mem_busy = FALSE; /* memory is ready */
df_busy(); /* wait end of programming */
/* select right memory */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
/* prepare the memory in write mode */
Spi_write_data(DF_PG_BUF_1); /* main program through buffer 1 */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[2] & ~DF_PAGE_MASK) << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0x00); /* address 00 of the page */
Spi_ack_write();
Spi_write_data(b); /* write current data */
Spi_ack_write();
gl_ptr_mem++;
return OK; /* write done */
}
else
{ /* memory ready */
Spi_write_data(b); /* write current data */
Spi_ack_write();
gl_ptr_mem++;
/* check if end of page */
if ((((Byte*)&gl_ptr_mem)[3] == 0x00) && ((((Byte*)&gl_ptr_mem)[2] & DF_PAGE_MASK) == 0x00))
{
DF_CS |= DF_DESEL_ALL; /* launch page programming */
df_mem_busy = TRUE; /* memory is busy */
}
return OK; /* write done */
}
}
/*F**************************************************************************
* NAME: df_write_sector
*----------------------------------------------------------------------------
* PARAMS:
* nb_sector: number of contiguous sector to write
* global: gl_ptr_mem
*
* return:
* write status: OK: write done
* KO: write not done
*----------------------------------------------------------------------------
* PURPOSE:
* This function is an optimized function that writes nb-sector * 512 bytes
* from USB controller to DataFlash memory
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* - First call must be preceded by a call to df_write_open function
* - As 512 is always a sub-multiple of page size, there is no need to check
* page end for each bytes.
* - nb_sector always >= 1, can not be zero
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit df_write_sector (Uint16 nb_sector)
{
Byte i;
do
{
if (df_mem_busy)
{
df_mem_busy = FALSE; /* memory is ready */
df_busy(); /* wait end of programming */
#if DF_PAGE_SIZE > 512
/* load page in internal buffer */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
Spi_write_data(DF_TF_BUF_1); /* main to buffer 1 transfer */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data(((Byte*)&gl_ptr_mem)[2] << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0xFF); /* dummy byte */
Spi_ack_write();
DF_CS |= DF_DESEL_ALL; /* deselect memory */
df_busy(); /* wait end of page transfer */
#endif
/* select right memory */
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEH] & DF_MEM_MASKH) == 0)
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS0 = 0;
else
DF_CS1 = 0;
}
else
{
if ((((Byte*)&gl_ptr_mem)[DF_MEM_BYTEL] & DF_MEM_MASKL) == 0)
DF_CS2 = 0;
else
DF_CS3 = 0;
}
/* prepare the memory in write mode */
Spi_write_data(DF_PG_BUF_1); /* main program through buffer 1 */
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[1] << DF_SHFT_B1) | (((Byte*)&gl_ptr_mem)[2] >> DF_SHFT_B2));
Spi_ack_write();
Spi_write_data((((Byte*)&gl_ptr_mem)[2] & ~DF_PAGE_MASK) << DF_SHFT_B1);
Spi_ack_write();
Spi_write_data(0x00); /* address 00 of the page */
Spi_ack_write();
}
for (i = 8; i != 0; i--) /* write 8x64b = 512b */
{
while (!Usb_rx_complete()); /* wait end of reception */
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Spi_write_data(Usb_read_byte()); Spi_ack_write();
Usb_clear_RXOUT_PP(); /* usb read acknowledgement */
}
gl_ptr_mem += 512;
#if DF_PAGE_SIZE > 512
/* check if end of page */
if ((((Byte*)&gl_ptr_mem)[2] & DF_PAGE_MASK) == 0x00)
{
DF_CS |= DF_DESEL_ALL; /* launch page programming */
df_mem_busy = TRUE; /* memory is busy */
}
#else
/* always end of page */
DF_CS |= DF_DESEL_ALL; /* launch page programming */
df_mem_busy = TRUE;
#endif
nb_sector--; /* 1 more sector written */
}
while (nb_sector != 0);
return OK; /* write done */
}
/*F**************************************************************************
* NAME: df_format
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
* Address of the format parameter structure in code
*----------------------------------------------------------------------------
* PURPOSE:
* This function is called by the fat_format function and returns a pointer
* to a table containing the format parameters.
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
* DF FORMAT PARAMETERS
* CAPACITY LBAs CYL HDs S/T CLUSTs S/C S/F FAT HID
* 16MB 32640 510 4 16 4080 8 12 12 15
* 32MB 65280 510 8 16 4080 16 12 12 15
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
s_format code * df_format (void)
{
code s_format df_tab_format[]=
{
/* nb_cylinder, nb_head, nb_sector, nb_hidden, nb_sector_per_cluster */
{ (Uint16)510, (Byte)4, (Byte)16, (Byte)15, (Byte)8 },
{ (Uint16)510, (Byte)8, (Byte)16, (Byte)15, (Byte)8 },
};
/* -- DF Type Selection -- */
if (Df_disk_size() == DF_SIZE_16MB) return &df_tab_format[DF_16MB];
if (Df_disk_size() == DF_SIZE_32MB) return &df_tab_format[DF_32MB];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -