omap3530/beagle_drivers/wb/drivers/CyAsSymbianStorageDriver.cpp
changeset 27 117faf51deac
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omap3530/beagle_drivers/wb/drivers/CyAsSymbianStorageDriver.cpp	Wed Mar 03 13:10:32 2010 +0000
@@ -0,0 +1,233 @@
+
+#include <kern_priv.h>
+//#include <beagle/beagle_gpio.h>
+#include <beagle/variant.h>
+//#include <assp/omap3530_assp/omap3530_assp_priv.h>
+//#include <assp/omap3530_assp/omap3530_irqmap.h> // GPIO interrupts
+//#include <assp/omap3530_assp/omap3530_gpio.h>
+
+//#include <assp.h> // Required for definition of TIsr
+
+#include <cyastoria.h>
+#include <cyasmtp.h>
+#include <cyasusbinit.h>
+//#include <cyasusbdescs.h>
+#include "CyAsSymbianStorageDriver.h"
+
+extern TmtpAstDev g_AstDevice;
+extern TmtpAstDev * g_pAstDevice;
+
+_LIT(KLitWbAPIMutex,"WBAPIMutex");
+static DMutex	*WbApiMutex;
+const TUint8 KMutexOrdWB			= 0x11; /**< @internalComponent */
+
+TInt64	iMediaTotalSize;
+EXPORT_C int  CyAsSymbianStorageDriver::Open(void)
+{
+	//CyAsHalDeviceTag          tag;
+	CyAsDeviceHandle          h;
+	CyAsReturnStatus_t ret ;
+	char *media_name = "SD";
+	uint32_t count = 0 ;
+
+	Kern::MutexCreate(WbApiMutex, KLitWbAPIMutex, KMutexOrdWB);
+	//tag = g_pAstDevice->astHalTag ;
+	h = g_pAstDevice->astDevHandle ;
+	
+    Kern::Printf("*** CyAsStorageStart...\n") ;
+    ret = CyAsStorageStart(h, 0, 0) ;
+    if (ret != CY_AS_ERROR_SUCCESS)
+    {
+        Kern::Printf("CyAsSymbianStorageOpen: CyAsStorageStart returned error code %d\n", ret) ;
+        return 0 ;
+    }
+
+	Kern::Printf("*** CyAsStorageQueryMedia...\n") ;
+	ret = CyAsStorageQueryMedia(h, CyAsMediaSDFlash, &count, 0, 0) ;
+	if (ret != CY_AS_ERROR_SUCCESS)
+	{
+	  Kern::Printf("CyAsSymbianStorageOpen: Cannot query %s device count - Reason code %d\n", media_name, ret) ;
+	  return 0 ;
+	}
+	Kern::Printf("%d %s device(s) found\n", count, media_name) ;
+
+	Kern::Printf("*** CyAsStorageClaim...\n") ;
+	ret = CyAsStorageClaim(h, CyAsBus_1, 0, 0, 0) ;
+	if (ret != CY_AS_ERROR_SUCCESS)
+	{
+	  Kern::Printf("CyAsSymbianStorageOpen: Cannot claim %s media - Reason code %d\n", media_name, ret) ;
+	  return 0;
+	}
+
+	/* We know that there is only one */
+	g_pAstDevice->dev_data.bus = CyAsBus_1 ;
+	g_pAstDevice->dev_data.device = 0 ;
+	ret = CyAsStorageQueryDevice(h, &(g_pAstDevice->dev_data), 0, 0) ;
+	if (ret != CY_AS_ERROR_SUCCESS)
+	{
+	  Kern::Printf("CyAsSymbianStorageOpen: Cannot query %s device - Reason code %d\n", media_name, ret) ;
+	  return 0 ;
+	}
+
+	g_pAstDevice->unit_data.bus = CyAsBus_1 ;
+	g_pAstDevice->unit_data.device = 0 ;
+	g_pAstDevice->unit_data.unit = 0 ;
+	
+	/* We know that there is only one */
+	ret = CyAsStorageQueryUnit(h, &(g_pAstDevice->unit_data), 0, 0) ;
+	if (ret != CY_AS_ERROR_SUCCESS)
+	{
+	  Kern::Printf("CyAsSymbianStorageOpen: Cannot query %s device unit - Reason code %d\n", media_name, ret) ;
+	  return 0 ;
+	}
+														
+	iMediaTotalSize = (TInt64)g_pAstDevice->dev_data.desc_p.block_size * (TInt64)g_pAstDevice->unit_data.desc_p.unit_size;
+
+#if 0
+	Kern::Printf("========================================================") ;
+	Kern::Printf("WBStorageInfo.type - %d", g_pAstDevice->dev_data.desc_p.type) ;
+	Kern::Printf("WBStorageInfo.removable - %d", g_pAstDevice->dev_data.desc_p.removable) ;
+	Kern::Printf("WBStorageInfo.writeable - %d", g_pAstDevice->dev_data.desc_p.writeable) ;
+	Kern::Printf("WBStorageInfo.block_size - %d Bytes", g_pAstDevice->dev_data.desc_p.block_size) ;
+	Kern::Printf("WBStorageInfo.number_units - %d", g_pAstDevice->dev_data.desc_p.number_units) ;
+	Kern::Printf("WBStorageInfo.locked - %d", g_pAstDevice->dev_data.desc_p.locked) ;
+	Kern::Printf("WBStorageInfo.erase_unit_size - %d Bytes", g_pAstDevice->dev_data.desc_p.erase_unit_size) ;
+	Kern::Printf("WBStorageInfo.unit_size - %d", g_pAstDevice->unit_data.desc_p.unit_size) ;
+	Kern::Printf("WBStorageInfo.start_block - %d", g_pAstDevice->unit_data.desc_p.start_block) ;
+	Kern::Printf("WBStorageInfo.totalsize - %d Bytes", iMediaTotalSize) ;
+	Kern::Printf("========================================================\n") ;
+#endif
+	return 1;
+}
+EXPORT_C int CyAsSymbianStorageDriver::Close(void)
+{
+	CyAsDeviceHandle          h;
+	CyAsReturnStatus_t ret ;
+	
+	//tag = g_pAstDevice->astHalTag ;
+	h = g_pAstDevice->astDevHandle ;
+    Kern::Printf("*** CyAsStorageStop...\n") ;
+    ret = CyAsStorageStop(h, 0, 0) ;
+    if (ret != CY_AS_ERROR_SUCCESS)
+    {
+        Kern::Printf("CyAsStorageStop: CyAsStorageStop returned error code %d\n", ret) ;
+        return 0 ;
+    }
+	return 1;
+}
+
+EXPORT_C int CyAsSymbianStorageDriver::Read(int	pos, int num_block, void* cybuf)
+{
+	//CyAsHalDeviceTag          tag;
+	CyAsDeviceHandle          h;
+	CyAsReturnStatus_t ret ;
+	char *tmpbuf;
+
+	Kern::MutexWait(*WbApiMutex); 
+
+	tmpbuf = (char *)cybuf;
+	//tag = g_pAstDevice->astHalTag ;
+	h = g_pAstDevice->astDevHandle ;
+	//CyAsHalPrintMessage("Read SD card\n");
+	ret = CyAsStorageRead(	h, 1, 0, 0, pos, tmpbuf, num_block);
+	if (ret != CY_AS_ERROR_SUCCESS)
+	{
+		Kern::Printf("CyAsSymbianStorageRead: Cannot read sector %d (%d@%d)\n", ret, num_block, pos) ;
+		return 0 ;
+	}
+	Kern::MutexSignal(*WbApiMutex); 
+	
+	return 1;
+}
+
+
+EXPORT_C int CyAsSymbianStorageDriver::Write(int pos, int num_block, void* cybuf)
+{
+	//CyAsHalDeviceTag          tag;
+	CyAsDeviceHandle          h;
+	CyAsReturnStatus_t ret ;
+	char *tmpbuf;
+
+	Kern::MutexWait(*WbApiMutex); 
+
+	tmpbuf = (char *)cybuf;
+	//tag = g_pAstDevice->astHalTag ;
+	h = g_pAstDevice->astDevHandle ;
+
+	ret = CyAsStorageWrite(h, 1, 0, 0, pos, tmpbuf, num_block);
+	if ( ret != CY_AS_ERROR_SUCCESS )
+	{
+		Kern::Printf("CyAsSymbianStorageWrite: Cannot write to first sector of SD card\n") ;
+		return 0 ;
+	}
+	Kern::MutexSignal(*WbApiMutex); 
+
+	return 1;
+}
+
+EXPORT_C TInt CyAsSymbianStorageDriver::GetMediaType(void)
+{
+	/* Type of device */
+	return (TInt)g_pAstDevice->dev_data.desc_p.type;
+}
+
+EXPORT_C TInt CyAsSymbianStorageDriver::GetIsRemovable(void)
+{
+	/* Is the device removable */
+	return g_pAstDevice->dev_data.desc_p.removable;
+}
+
+EXPORT_C TInt CyAsSymbianStorageDriver::GetIsWriteable(void)
+{
+	/* Is the device writeable */
+	return g_pAstDevice->dev_data.desc_p.writeable;
+}
+
+EXPORT_C TUint16 CyAsSymbianStorageDriver::GetBlockSize(void)
+{
+	/* Basic block size for device */
+	return g_pAstDevice->dev_data.desc_p.block_size;
+}
+
+EXPORT_C TUint CyAsSymbianStorageDriver::GetNumberOfUnits(void)
+{
+	/* Number of LUNs on the device */
+	return g_pAstDevice->dev_data.desc_p.number_units;
+}
+
+EXPORT_C TInt CyAsSymbianStorageDriver::GetIsLocked(void)
+{
+	/* Is the device password locked */
+	return g_pAstDevice->dev_data.desc_p.locked;
+}
+
+EXPORT_C TUint CyAsSymbianStorageDriver::GetEraseBlockSize(void)
+{
+		/* Size in bytes of an Erase Unit. Block erase operation is only supported for SD storage, 
+                    and the erase_unit_size is invalid for all other kinds of storage. */
+	return g_pAstDevice->dev_data.desc_p.erase_unit_size;
+}
+
+EXPORT_C TUint CyAsSymbianStorageDriver::GetUnitSize(void)
+{
+	/* Number of blocks in the LUN */
+	return g_pAstDevice->unit_data.desc_p.unit_size;
+}
+
+EXPORT_C TUint CyAsSymbianStorageDriver::GetStartBlock(void)
+{
+	/* Physical start block for LUN */
+	return g_pAstDevice->unit_data.desc_p.start_block;
+}
+
+EXPORT_C TInt64 CyAsSymbianStorageDriver::GetMediaSize(void)
+{
+
+	/*(Basic block size for device x  Number of LUNs on the device)  
+	g_pAstDevice->dev_data.desc_p.block_size * g_pAstDevice->dev_data.desc_p.number_units */
+	return iMediaTotalSize;
+}
+
+
+
+