/*C**************************************************************************
* 文件名称 : ch375.c
*----------------------------------------------------------------------------
* 发 行 : usb_disk
* 版 本 : 1.0
* 作 者 : liuyang
* 创建日期 : 2009-06-20
*----------------------------------------------------------------------------
* 用 途 :
* - 本文件是CH375的外部固件模式
*
* 注 解 :
* 全局变量 :
* - 无
* 本文件参照WCH公司的CH375外置固件模式程序。
*
* 重要参数 :
* - 厂商ID (0xEEAD), 产品ID (0x1003)
*
*****************************************************************************/
/*_____ 包 含 文 件 ________________________________________________________*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "types.h"
#include "ch375inc.h"
#include "bulk-only.h"
#include "ch375.h"
/*_____ 常 量 定 义 ________________________________________________________*/
// 设备描述符,根据Bulk-Only协议提供的描述符
const u8_t dev_descr[] = {
0x12, // 描述符大小
0x01, // 常数DEVICE
0x10, 0x01, // USB规范版本信息 : 0x0110
0x00, // 类别码 : 0
0x00, // 子类别码 : 0
0x00, // 协议码 : 0
0x08, // 端点0的最大信息包大小
0x48, 0x43, // 厂商ID : 0xEEAD
0xE0, 0x00, // 产品ID : 0x1003
0x00, 0x01, // 设备版本信息 : 0x0100
0x00, // 索引值
0x00,
0x00,
0x01 // 可能配置的数目
};
// 配置描述符,根据Bulk-Only协议提供的描述符
const u8_t config_descr[] = {
// 配置描述符
0x09, // 描述符大小
0x02, // 常数CONFIG
0x20, 0x00, // 此配置传回所有数据大小, 0X0020
0x01, // 接口数
0x01, // 配置值
0x00, // 索引
0x60, // 电源设置
0x00, // 需要总线电源
// 接口描述符
0x09, // 描述符大小
0x04, // 常数INTERFACE
0x00, // 识别码
0x00, // 代替数值
0x02, // 支持的端点数
0xFF, // 类别码 : FF
0x80, // 子类别码 : 80
0x37, // 协议码 : 37
0x00, // 索引
// 端点描述符1
0x07, // 描述符大小
0x05, // 常数ENDPOINT
0x82, // 端点数目及方向,Bulk In
0x02, // 支持的传输类型
0x40, // 支持的最大信息包大小
0x00, // 能够接收或发送的最大数据包的大小
0x00, // 轮寻数据传送端点的时间间隙
// 端点描述符2
0x07, // 描述符大小
0x05, // 常数ENDPOINT
0x02, // 端点数目及方向,Bulk Out
0x02, // 支持的传输类型
0x40, // 支持的最大信息包大小
0x00, // 能够接收或发送的最大数据包的大小
0x00 // 轮寻数据传送端点的时间间隙
};
/*_____ 变 量 定 义 ________________________________________________________*/
rp_t request; // USB请求包
u8_t len_residue; // 剩余数据长度
bool_t flag_config; // 配置标志
bool_t flag_error; // 错误标志
u8_t ep2_buf[64]; // 端点2数据缓冲区
u8_t ep2_len; // 端点2数据缓冲区长度
const u8_t* ptr_descr; // 描述符偏移地址
/*_____ 函 数 定 义 ________________________________________________________*/
/*F**************************************************************************
* 函 数 名 : _delay_ms
*----------------------------------------------------------------------------
* 入口参数 : 无
*
* 出口参数 : 无
*----------------------------------------------------------------------------
* 函数用途 : 毫秒级延时(8MHz时钟下比较精确)
*****************************************************************************/
void _delay_ms(u16_t ms)
{
volatile u16_t i, j;
for (i=0; i<ms; i++)
for (j=0; j<419; j++);
}
/*F**************************************************************************
* 函 数 名 : ch375_wr_cmd
*----------------------------------------------------------------------------
* 入口参数 : cmd (unsinged char) - 要写入的命令
*
* 出口参数 : 无
*----------------------------------------------------------------------------
* 函数用途 : 向CH375写入一个字节的命令
*****************************************************************************/
void ch375_wr_cmd(u8_t cmd)
{
CH375_DAT_OUT = cmd;
CH375_DAT_DIR = 0xFF; // 设置数据端口方向为输出
CH375_A0_SET(); // 选择CH375的命令口
CH375_RD_SET(); // 使读信号无效
CH375_WR_CLR();
CH375_WR_SET(); // 写信号产生一个低脉冲,将命令打入375
CH375_DAT_DIR = 0x00; // 设置数据端口方向为输入
}
/*F**************************************************************************
* 函 数 名 : ch375_wr_dat
*----------------------------------------------------------------------------
* 入口参数 : dat (unsinged char) - 要写入的数据
*
* 出口参数 : 无
*----------------------------------------------------------------------------
* 函数用途 : 向CH375写入一个字节的数据
*****************************************************************************/
void ch375_wr_dat(u8_t dat)
{
CH375_DAT_OUT = dat;
CH375_DAT_DIR = 0xFF; // 设置数据端口方向为输出
CH375_A0_CLR(); // 选择CH375的数据口
CH375_RD_SET(); // 使读信号无效
CH375_WR_CLR();
CH375_WR_SET(); // 写信号产生一个低脉冲,将数据打入375
CH375_DAT_DIR = 0x00; // 设置数据端口方向为输入
}
/*F**************************************************************************
* 函 数 名 : ch375_rd_dat
*----------------------------------------------------------------------------
* 入口参数 :
*
* 出口参数 : 返回值 (u8_t) - 读出的数据
*----------------------------------------------------------------------------
* 函数用途 : 从CH375读出一个字节的数据
*****************************************************************************/
u8_t ch375_rd_dat(void)
{
CH375_DAT_DIR = 0x00; // 设置数据端口方向为输入
CH375_A0_CLR(); // 选择CH375的数据口
CH375_WR_SET(); // 使写信号无效
CH375_RD_CLR(); // 读信号有效
u8_t dat = CH375_DAT_IN; // 将数据读出
CH375_RD_SET(); // 读信号恢复高电平
return dat;
}
/*F**************************************************************************
* 函 数 名 : ch375_init
*----------------------------------------------------------------------------
* 入口参数 : 无
*
* 出口参数 : 无
*----------------------------------------------------------------------------
* 函数用途 : 初始化CH375
*****************************************************************************/
void ch375_init(void)
{
CH375_DAT_OUT = 0xFF; // 初始化数据端口的输出值
CH375_SIG_OUT |= CH375_WR + CH375_RD + CH375_A0; // 初始化信号端口的电平
CH375_DAT_DIR = 0xFF; // 设置ATmega16的数据端口方向
CH375_SIG_DIR |= CH375_WR + CH375_RD + CH375_A0; // 设置ATmega16的信号端口方向
GICR |= 0x40; // 使能INT0中断
sei(); // 打开全局中断
ch375_wr_cmd(CMD_SET_USB_MODE); // 设置USB工作模式, 必要操作
ch375_wr_dat(1); // 设置为使用外置固件的USB设备方式
while (1) // 等待操作成功,通常需要等待10us-20us
{
if (ch375_rd_dat() == CMD_RET_SUCCESS)
{
break;
}
}
}
/*F**************************************************************************
* 函 数 名 : ch375_ep0_up
*----------------------------------------------------------------------------
* 入口参数 : 无
*
* 出口参数 : 无
*----------------------------------------------------------------------------
* 函数用途 : 端点0数据上传
*****************************************************************************/
void ch375_ep0_up(void)
{
u8_t i,len;
if(len_residue) // 长度不为0传输具体长度的数据
{
if(len_residue <= 8) // 长度小于8则长输要求的长度
{
len = len_residue;
len_residue = 0;
}
else // 长度大于8则传输8个,且总长度减8
{
len = 8;
len_residue -= 8;
}
ch375_wr_cmd(CMD_WR_USB_DATA3); // 发出写端点0的命令
ch375_wr_dat(len); // 写入长度
for(i=0; i<len; i++)
ch375_wr_dat(request.buffer[i]); // 循环写入数据
}
else // 发出写端点0的命令
{
ch375_wr_cmd(CMD_WR_USB_DATA3);
ch375_wr_dat(0); // 上传0长度数据,这是一个状态阶段
}
}
/*F**************************************************************************
* 函 数 名 : ep2_in
*----------------------------------------------------------------------------
*
【原创】小U盘固件程序
5星 · 超过95%的资源 需积分: 9 47 浏览量
2010-02-10
18:25:43
上传
评论
收藏 16KB RAR 举报
lau1860
- 粉丝: 0
- 资源: 19
最新资源
- tensorflow-gpu-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.8.0-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.4-cp39-cp39-manylinux2010-x86-64.whl
- 个人资料-1111相关内容
- # C 语言介绍与使用技巧 ## C 语言简介:
- 3、高质量汽车租赁系统+layui)
- 介绍 Python 的一些基本信息,并分享一些使用技巧
- Qt的tcp网络编程(客户端和服务器)
- 当谈到 Linux 常用命令时,有很多命令可以提及 以下是一些常见的 Linux 命令及其功能:
- Sora AI Video Preview Case Sora AI 视频模版项目,React全栈快速部署.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页