/********************************** (C) COPYRIGHT *******************************
* File Name : CH57x_usbhost.c
* Author : WCH
* Version : V1.0
* Date : 2018/12/15
* Description
*******************************************************************************/
#include "CH57x_common.h"
#include "CH579UFI.H"
UINT8 UsbDevEndp0Size; // USB设备的端点0的最大包尺寸
UINT8 FoundNewDev;
_RootHubDev ThisUsbDev; //ROOT口
PUINT8 pHOST_RX_RAM_Addr;
PUINT8 pHOST_TX_RAM_Addr;
/*获取设备描述符*/
__align(4) const UINT8 SetupGetDevDescr[] = { USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00, USB_DESCR_TYP_DEVICE, 0x00, 0x00, sizeof( USB_DEV_DESCR ), 0x00 };
/*获取配置描述符*/
__align(4) const UINT8 SetupGetCfgDescr[] = { USB_REQ_TYP_IN, USB_GET_DESCRIPTOR, 0x00, USB_DESCR_TYP_CONFIG, 0x00, 0x00, 0x04, 0x00 };
/*设置USB地址*/
__align(4) const UINT8 SetupSetUsbAddr[] = { USB_REQ_TYP_OUT, USB_SET_ADDRESS, USB_DEVICE_ADDR, 0x00, 0x00, 0x00, 0x00, 0x00 };
/*设置USB配置*/
__align(4) const UINT8 SetupSetUsbConfig[] = { USB_REQ_TYP_OUT, USB_SET_CONFIGURATION, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
/*设置USB接口配置*/
__align(4) const UINT8 SetupSetUsbInterface[] = { USB_REQ_RECIP_INTERF, USB_SET_INTERFACE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
/*清除端点STALL*/
__align(4) const UINT8 SetupClrEndpStall[] = { USB_REQ_TYP_OUT | USB_REQ_RECIP_ENDP, USB_CLEAR_FEATURE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
/*******************************************************************************
* Function Name : DisableRootHubPort( )
* Description : 关闭HUB端口
* Input : None
* Return : None
*******************************************************************************/
void DisableRootHubPort(void)
{
#ifdef FOR_ROOT_UDISK_ONLY
CH579DiskStatus = DISK_DISCONNECT;
#endif
#ifndef DISK_BASE_BUF_LEN
ThisUsbDev.DeviceStatus = ROOT_DEV_DISCONNECT;
ThisUsbDev.DeviceAddress = 0x00;
#endif
}
/*******************************************************************************
* Function Name : AnalyzeRootHub(void)
* Description : 分析ROOT-HUB状态,处理ROOT-HUB端口的设备插拔事件
如果设备拔出,函数中调用DisableRootHubPort()函数,将端口关闭,插入事件,置相应端口的状态位
* Input : None
* Return : 返回ERR_SUCCESS为没有情况,返回ERR_USB_CONNECT为检测到新连接,返回ERR_USB_DISCON为检测到断开
*******************************************************************************/
UINT8 AnalyzeRootHub( void )
{
UINT8 s;
s = ERR_SUCCESS;
if ( R8_USB_MIS_ST & RB_UMS_DEV_ATTACH ) { // 设备存在
#ifdef DISK_BASE_BUF_LEN
if ( CH579DiskStatus == DISK_DISCONNECT
#else
if ( ThisUsbDev.DeviceStatus == ROOT_DEV_DISCONNECT // 检测到有设备插入
#endif
|| ( R8_UHOST_CTRL & RB_UH_PORT_EN ) == 0x00 ) { // 检测到有设备插入,但尚未允许,说明是刚插入
DisableRootHubPort( ); // 关闭端口
#ifdef DISK_BASE_BUF_LEN
CH579DiskStatus = DISK_CONNECT;
#else
ThisUsbDev.DeviceSpeed = R8_USB_MIS_ST & RB_UMS_DM_LEVEL ? 0 : 1;
ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED; //置连接标志
#endif
PRINT( "USB dev in\n" );
s = ERR_USB_CONNECT;
}
}
#ifdef DISK_BASE_BUF_LEN
else if ( CH579DiskStatus >= DISK_CONNECT ) {
#else
else if ( ThisUsbDev.DeviceStatus >= ROOT_DEV_CONNECTED ) { //检测到设备拔出
#endif
DisableRootHubPort( ); // 关闭端口
PRINT( "USB dev out\n" );
if ( s == ERR_SUCCESS ) s = ERR_USB_DISCON;
}
// R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志
return( s );
}
/*******************************************************************************
* Function Name : SetHostUsbAddr
* Description : 设置USB主机当前操作的USB设备地址
* Input : UINT8 addr
* Return : None
*******************************************************************************/
void SetHostUsbAddr( UINT8 addr )
{
R8_USB_DEV_AD = (R8_USB_DEV_AD&RB_UDA_GP_BIT) | (addr&MASK_USB_ADDR);
}
/*******************************************************************************
* Function Name : SetUsbSpeed
* Description : 设置当前USB速度
* Input : UINT8 FullSpeed
* Return : None
*******************************************************************************/
void SetUsbSpeed( UINT8 FullSpeed )
{
#ifndef DISK_BASE_BUF_LEN
if ( FullSpeed ) // 全速
{
R8_USB_CTRL &= ~ RB_UC_LOW_SPEED; // 全速
R8_UH_SETUP &= ~ RB_UH_PRE_PID_EN; // 禁止PRE PID
}
else
{
R8_USB_CTRL |= RB_UC_LOW_SPEED; // 低速
}
#endif
( void ) FullSpeed;
}
/*******************************************************************************
* Function Name : ResetRootHubPort( )
* Description : 检测到设备后,复位总线,为枚举设备准备,设置为默认为全速
* Input : None
* Return : None
*******************************************************************************/
void ResetRootHubPort( void )
{
UsbDevEndp0Size = DEFAULT_ENDP0_SIZE; //USB设备的端点0的最大包尺寸
SetHostUsbAddr( 0x00 );
R8_UHOST_CTRL &= ~RB_UH_PORT_EN; // 关掉端口
SetUsbSpeed( 1 ); // 默认为全速
R8_UHOST_CTRL = (R8_UHOST_CTRL & ~RB_UH_LOW_SPEED) | RB_UH_BUS_RESET; // 默认为全速,开始复位
mDelaymS( 15 ); // 复位时间10mS到20mS
R8_UHOST_CTRL = R8_UHOST_CTRL & ~ RB_UH_BUS_RESET; // 结束复位
mDelayuS( 250 );
R8_USB_INT_FG = RB_UIF_DETECT; // 清中断标志
}
/*******************************************************************************
* Function Name : EnableRootHubPort( )
* Description : 使能ROOT-HUB端口,相应的bUH_PORT_EN置1开启端口,设备断开可能导致返回失败
* Input : None
* Return : 返回ERR_SUCCESS为检测到新连接,返回ERR_USB_DISCON为无连接
*******************************************************************************/
UINT8 EnableRootHubPort(void)
{
#ifdef DISK_BASE_BUF_LEN
if ( CH579DiskStatus < DISK_CONNECT ) CH579DiskStatus = DISK_CONNECT;
#else
if ( ThisUsbDev.DeviceStatus < ROOT_DEV_CONNECTED ) ThisUsbDev.DeviceStatus = ROOT_DEV_CONNECTED;
#endif
if ( R8_USB_MIS_ST & RB_UMS_DEV_ATTACH ) { // 有设备
#ifndef DISK_BASE_BUF_LEN
if ( ( R8_UHOST_CTRL & RB_UH_PORT_EN ) == 0x00 ) { // 尚未使能
ThisUsbDev.DeviceSpeed = (R8_USB_MIS_ST & RB_UMS_DM_LEVEL) ? 0 : 1;
if ( ThisUsbDev.DeviceSpeed == 0 ) R8_UHOST_CTRL |= RB_UH_LOW_SPEED; // 低速
}
#endif
R8_UHOST_CTRL |= RB_UH_PORT_EN; //使能HUB端口
return( ERR_SUCCESS );
}
return( ERR_USB_DISCON );
}
/*******************************************************************************
* Function Name : WaitUSB_Interrupt
* Description : 等待USB中断
* Input : None
* Return : 返回ERR_SUCCESS 数据接收或者发送成功
ERR_USB_UNKNOWN 数据接收或者发送失败
************************************************
没有合适的资源?快使用搜索试试~ 我知道了~
CH579M-RT-THREAD点灯例子
共200个文件
o:45个
d:45个
crf:43个
需积分: 11 5 下载量 62 浏览量
2022-08-30
18:30:30
上传
评论
收藏 2.64MB ZIP 举报
温馨提示
CH579M-RT-THREAD点灯例子
资源详情
资源评论
资源推荐
收起资源包目录
CH579M-RT-THREAD点灯例子 (200个子文件)
project.axf 278KB
project_sct.Bak 479B
CH57x_usbhostBase.c 22KB
CH57x_clk.c 18KB
CH57x_usbhostClass.c 12KB
CH57x_spi0.c 12KB
CH579UFI.C 11KB
CH57x_flash.c 9KB
CH57x_int.c 8KB
CH57x_gpio.c 8KB
CH57x_pwr.c 7KB
CH57x_adc.c 7KB
CH57x_sys.c 6KB
CH57x_spi1.c 6KB
CH57x_timer1.c 4KB
CH57x_timer2.c 4KB
CH57x_uart3.c 4KB
CH57x_uart1.c 4KB
CH57x_uart2.c 4KB
CH57x_uart0.c 4KB
CH57x_usbdev.c 4KB
CH57x_timer0.c 3KB
CH57x_timer3.c 3KB
CH57x_pwm.c 3KB
board.c 3KB
main.c 2KB
CH57x_lcd.c 983B
finsh_port.c 611B
main.crf 132KB
board.crf 131KB
ch57x_usbhostbase.crf 113KB
ch57x_usbhostclass.crf 111KB
ch579ufi.crf 111KB
ch57x_clk.crf 106KB
ch57x_spi0.crf 104KB
ch57x_flash.crf 104KB
ch57x_int.crf 104KB
ch57x_adc.crf 103KB
ch57x_pwr.crf 103KB
ch57x_gpio.crf 103KB
ch57x_sys.crf 103KB
ch57x_spi1.crf 102KB
ch57x_usbdev.crf 102KB
ch57x_timer1.crf 102KB
ch57x_timer2.crf 102KB
ch57x_uart2.crf 102KB
ch57x_uart3.crf 102KB
ch57x_uart0.crf 102KB
ch57x_uart1.crf 102KB
ch57x_pwm.crf 102KB
ch57x_timer0.crf 102KB
ch57x_timer3.crf 102KB
ch57x_lcd.crf 102KB
finsh_port.crf 96KB
cmd.crf 56KB
shell.crf 54KB
mem.crf 53KB
msh.crf 51KB
kservice.crf 37KB
ipc.crf 34KB
thread.crf 33KB
timer.crf 32KB
object.crf 32KB
scheduler.crf 30KB
components.crf 30KB
idle.crf 30KB
clock.crf 29KB
irq.crf 29KB
mempool.crf 29KB
device.crf 29KB
cpuport.crf 28KB
board.d 4KB
main.d 3KB
ch57x_usbhostclass.d 3KB
ch57x_usbhostbase.d 3KB
ch57x_usbdev.d 3KB
ch57x_timer2.d 3KB
ch57x_timer0.d 3KB
ch57x_timer3.d 3KB
ch57x_timer1.d 3KB
ch57x_flash.d 3KB
ch57x_uart2.d 3KB
ch57x_uart0.d 3KB
ch57x_uart3.d 3KB
ch57x_uart1.d 3KB
ch57x_spi0.d 3KB
ch57x_gpio.d 3KB
ch57x_spi1.d 3KB
ch57x_adc.d 3KB
ch57x_sys.d 3KB
ch57x_clk.d 3KB
ch57x_pwr.d 3KB
ch57x_pwm.d 3KB
ch57x_int.d 3KB
ch57x_lcd.d 3KB
ch579ufi.d 3KB
shell.d 1KB
msh.d 1KB
finsh_port.d 1KB
cmd.d 1KB
共 200 条
- 1
- 2
海里的鱼2022
- 粉丝: 8289
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0