⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 udisk375.c

📁 44BO 的UCGUI包
💻 C
字号:
//***********************************************************
//* Copyright (c) 2005,韶关龙飞开发部
//* All rights reserved.
//* 
//* 文件名称:udisk375.c
//* 文件标识:
//* 摘    要:U盘基本驱动子程序模块
//* 
//* 当前版本:0.9
//* 作    者:zhtt
//* 完成日期:2005-05-20
//************************************************************

#define IN_UDISK375

#include 	"./SRC/includes.h"
//#include 	"./SRC/375/CH375HF9.H"

//============================================================
//* 函数介绍:ch375写命令
//* 参数列表:cmdCode CH375命令代码
//* 返回值  :无
//* 全局变量: 
//* 调用模块: 
//============================================================
void Wr375Cmd(uint8 cmdCode)
{
	volatile char *pch375;
	
	pch375 = (char *)USBCMD;
	
	*pch375 = cmdCode;
}

//============================================================
//* 函数介绍:ch375写数据
//* 参数列表:dataIn 输入数据
//* 返回值  :无
//* 全局变量: 
//* 调用模块: 
//============================================================
void Wr375Data(uint8 dataIn)
{
	volatile char *pch375;
	
	pch375 = (char *)USBDAT;
	
	*pch375 = dataIn;
}

//============================================================
//* 函数介绍:ch375读数据
//* 参数列表:无
//* 返回值  :输出数据
//* 全局变量: 
//* 调用模块: 
//============================================================
char Rd375Data(void)
{
	volatile char *pch375;
	char dataOut;
	
	pch375 = (char *)USBDAT;
	
	dataOut = *pch375;
	
	return dataOut;
}

//void xWriteCH375Cmd( UINT8 mCmd )
//{
//	LoopNop( 2 );
//	Wr375Cmd(mCmd);
//	LoopNop( 2 );
//}
//
//void xWriteCH375Data( UINT8 mData )
//{
//	Wr375Data(mData);
//	LoopNop( 2 );
//}
//	
//UINT8 xReadCH375Data( void )
//{
//	LoopNop( 2 );
//	return Rd375Data();
//}

//============================================================
//* 函数介绍:初始化CH375
//* 参数列表:无
//* 返回值  :0成功  非零失败
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 Ch375Init(void)
{
	uint8 i, sta;
	
	Wr375Cmd(CMD_SET_USB_MODE);
	LoopNop( 2 );
	
	Wr375Data(6);
	LoopNop( 20 );
	
	for (i=0; i<10; i++)
	{
		sta = Rd375Data();
		if (sta == CMD_RET_SUCCESS || sta == USB_INT_CONNECT)
		{
			break;
		}
		LoopNop( 2 );
	}
	if (i >= 10)
	{
		return (uint8)(-1);
	}
	return 0;
}

//============================================================
//* 函数介绍:测试CH375
//* 参数列表:无
//* 返回值  :0成功  非零失败
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 TestCH375(void)
{
	
	Wr375Cmd(CMD_CHECK_EXIST);
	LoopNop( 2 );
	
	Wr375Data(0x55);
	LoopNop( 2 );
	
	if (Rd375Data() == 0xaa)
	{
		return 0;
	}
	return (uint8)(-1);
}

//============================================================
//* 函数介绍:复位CH375
//* 参数列表:无
//* 返回值  :0成功  非零失败
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 ResetCH375(void)
{
	
	Wr375Cmd(CMD_RESET_ALL);
	LoopNop(30000);				//延时40ms
	
	if (Ch375Init() == 0)
	{
		if (TestCH375() == 0)
		{
			return 0;
		}
	}
	return 1;
}

//============================================================
//* 函数介绍:等待CH375中断并获取状态
//* 参数列表:无
//* 返回值  :中断状态
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 Wait375Int(void)
{
	AT91PS_PIO pPio;
	uint8 rt;
	
	pPio	= AT91C_BASE_PIO;
    pPio->PIO_ODR = USB_IRQ1;
    
    while (pPio->PIO_PDSR & USB_IRQ1);
	LoopNop( 200 );
    
	Wr375Cmd(CMD_GET_STATUS);
	LoopNop( 2 );
	
	rt = Rd375Data();
	
	return rt;
}

//============================================================
//* 函数介绍:初始化U盘
//* 参数列表:无
//* 返回值  :中断状态
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 InitUDisk(void)
{
	uint8 rt;

	Wr375Cmd(CMD_DISK_INIT);
	LoopNop( 2 );
	
	rt = Wait375Int();
	
	return rt;
}

//============================================================
//* 函数介绍:U盘是否就绪
//* 参数列表:无
//* 返回值  :中断状态
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 UdiskReady(void)
{
	uint8 rt;

	Wr375Cmd(CMD_DISK_READY);
	LoopNop( 2 );
	
	rt = Wait375Int();
	
	return rt;
}

//============================================================
//* 函数介绍:读取U盘的容量
//* 参数列表:读缓冲区,一般为8个字节,前4字节为扇区总数,后4字节为每扇区字节数(大端模式)
//* 返回值  :实际读取字节
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 ReadUDiskSize(char *buf)
{
	uint8 rt;
	uint8 i;
	
	Wr375Cmd(CMD_DISK_SIZE);
	LoopNop( 2 );
	
	rt = Wait375Int();
	if (rt == USB_INT_SUCCESS)
	{
		Wr375Cmd(CMD_RD_USB_DATA);
		LoopNop( 2 );
		i = Rd375Data();
		for (rt=0; rt<i; rt++)
		{
			*buf++ = Rd375Data();
		}
	}
	else
	{
		rt = 0;
	}
	return rt;
}
	
//============================================================
//* 函数介绍:读U盘的一个页面
//* 参数列表:page 待读数据的UDISK页地址
//*			  buf 数据输出缓冲区指针,大小至少为一扇区大小
//* 返回值  :0成功  非零失败
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 UDiskRdPage(uint32 page, char *buf)
{
	uint8 i,j;
	uint8 usbIntSat;
	
	Wr375Cmd(CMD_DISK_READ);
	LoopNop( 2 );
	
	Wr375Data((uint8)page);
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 8));
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 16));
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 24));
	LoopNop( 2 );
	
	Wr375Data(1);
	LoopNop( 2 );
	
	for (i=0; i<8; i++)
	{
		usbIntSat = Wait375Int();
		if (usbIntSat == USB_INT_DISK_READ)
		{
			Wr375Cmd(CMD_RD_USB_DATA);
			LoopNop( 2 );
			j = Rd375Data();
			while (j--)
			{
				*buf++ = Rd375Data();
			}
			Wr375Cmd(CMD_DISK_RD_GO);
			LoopNop( 2 );
		}
		else
		{
			break;
		}
	}
	if (i >= 8)
	{
		usbIntSat = Wait375Int();
	}
	if (usbIntSat == USB_INT_SUCCESS)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

//============================================================
//* 函数介绍:写U盘的一个页面
//* 参数列表:page 待写数据的UDISK页地址
//*			  buf 数据输出缓冲区指针,大小至少为一扇区大小
//* 返回值  :0成功  非零失败
//* 全局变量: 
//* 调用模块: 
//============================================================
uint8 UDiskWrPage(uint32 page, char *buf)
{
	uint8 i,j;
	uint8 usbIntSat;

	Wr375Cmd(CMD_DISK_WRITE);
	LoopNop( 2 );

	Wr375Data((uint8)page);
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 8));
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 16));
	LoopNop( 2 );
	Wr375Data((uint8)(page >> 24));
	LoopNop( 2 );
	
	Wr375Data(1);
	LoopNop( 2 );
	
	for (i=0; i<8; i++)
	{
		usbIntSat = Wait375Int();
		if (usbIntSat == USB_INT_DISK_WRITE)
		{
			Wr375Cmd(CMD_WR_USB_DATA7);
			LoopNop( 2 );
			
			j = 64;
			Wr375Data(j);
			LoopNop( 2 );
			
			while (j--)
			{
				Wr375Data(*buf++);
				LoopNop( 2 );
			}
			Wr375Cmd(CMD_DISK_WR_GO);
			LoopNop( 2 );
		}
		else
		{
			break;
		}
	}
	if (i >= 8)
	{
		usbIntSat = Wait375Int();
	}
	if (usbIntSat == USB_INT_SUCCESS)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}
	
//============================================================
//* 函数介绍:
//* 参数列表:
//* 返回值  :
//* 全局变量: 
//* 调用模块: 
//============================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -