📄 udisk375.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 + -