229 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			229 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* If a working storage control module is available, it should be        */
							 | 
						||
| 
								 | 
							
								/* attached to the FatFs via a glue function rather than modifying it.   */
							 | 
						||
| 
								 | 
							
								/* This is an example of glue functions to attach various exsisting      */
							 | 
						||
| 
								 | 
							
								/* storage control modules to the FatFs module with a defined API.       */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "ff.h"			/* Obtains integer types */
							 | 
						||
| 
								 | 
							
								#include "diskio.h"		/* Declarations of disk functions */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* Definitions of physical drive number for each drive */
							 | 
						||
| 
								 | 
							
								#define DEV_RAM		0	/* Example: Map Ramdisk to physical drive 0 */
							 | 
						||
| 
								 | 
							
								#define DEV_MMC		1	/* Example: Map MMC/SD card to physical drive 1 */
							 | 
						||
| 
								 | 
							
								#define DEV_USB		2	/* Example: Map USB MSD to physical drive 2 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Get Drive Status                                                      */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DSTATUS disk_status (
							 | 
						||
| 
								 | 
							
									BYTE pdrv		/* Physical drive nmuber to identify the drive */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									DSTATUS stat;
							 | 
						||
| 
								 | 
							
									int result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch (pdrv) {
							 | 
						||
| 
								 | 
							
									case DEV_RAM :
							 | 
						||
| 
								 | 
							
										result = RAM_disk_status();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_MMC :
							 | 
						||
| 
								 | 
							
										result = MMC_disk_status();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_USB :
							 | 
						||
| 
								 | 
							
										result = USB_disk_status();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return STA_NOINIT;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Inidialize a Drive                                                    */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DSTATUS disk_initialize (
							 | 
						||
| 
								 | 
							
									BYTE pdrv				/* Physical drive nmuber to identify the drive */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									DSTATUS stat;
							 | 
						||
| 
								 | 
							
									int result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch (pdrv) {
							 | 
						||
| 
								 | 
							
									case DEV_RAM :
							 | 
						||
| 
								 | 
							
										result = RAM_disk_initialize();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_MMC :
							 | 
						||
| 
								 | 
							
										result = MMC_disk_initialize();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_USB :
							 | 
						||
| 
								 | 
							
										result = USB_disk_initialize();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return stat;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return STA_NOINIT;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Read Sector(s)                                                        */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DRESULT disk_read (
							 | 
						||
| 
								 | 
							
									BYTE pdrv,		/* Physical drive nmuber to identify the drive */
							 | 
						||
| 
								 | 
							
									BYTE *buff,		/* Data buffer to store read data */
							 | 
						||
| 
								 | 
							
									LBA_t sector,	/* Start sector in LBA */
							 | 
						||
| 
								 | 
							
									UINT count		/* Number of sectors to read */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									DRESULT res;
							 | 
						||
| 
								 | 
							
									int result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch (pdrv) {
							 | 
						||
| 
								 | 
							
									case DEV_RAM :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = RAM_disk_read(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_MMC :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = MMC_disk_read(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_USB :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = USB_disk_read(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return RES_PARERR;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Write Sector(s)                                                       */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if FF_FS_READONLY == 0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DRESULT disk_write (
							 | 
						||
| 
								 | 
							
									BYTE pdrv,			/* Physical drive nmuber to identify the drive */
							 | 
						||
| 
								 | 
							
									const BYTE *buff,	/* Data to be written */
							 | 
						||
| 
								 | 
							
									LBA_t sector,		/* Start sector in LBA */
							 | 
						||
| 
								 | 
							
									UINT count			/* Number of sectors to write */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									DRESULT res;
							 | 
						||
| 
								 | 
							
									int result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch (pdrv) {
							 | 
						||
| 
								 | 
							
									case DEV_RAM :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = RAM_disk_write(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_MMC :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = MMC_disk_write(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_USB :
							 | 
						||
| 
								 | 
							
										// translate the arguments here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										result = USB_disk_write(buff, sector, count);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// translate the reslut code here
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return RES_PARERR;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								/* Miscellaneous Functions                                               */
							 | 
						||
| 
								 | 
							
								/*-----------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								DRESULT disk_ioctl (
							 | 
						||
| 
								 | 
							
									BYTE pdrv,		/* Physical drive nmuber (0..) */
							 | 
						||
| 
								 | 
							
									BYTE cmd,		/* Control code */
							 | 
						||
| 
								 | 
							
									void *buff		/* Buffer to send/receive control data */
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									DRESULT res;
							 | 
						||
| 
								 | 
							
									int result;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									switch (pdrv) {
							 | 
						||
| 
								 | 
							
									case DEV_RAM :
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Process of the command for the RAM drive
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_MMC :
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Process of the command for the MMC/SD card
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									case DEV_USB :
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Process of the command the USB drive
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return res;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return RES_PARERR;
							 | 
						||
| 
								 | 
							
								}
							 |