#include "USBHost.h"
#include "common.h"
#include "SCSI.h"
#include "USBMST.h"
//#define DEBUG
#define K60_USB_FRM_NUM (USB0_ISTAT = USB_ISTAT_SOFTOK_MASK , USB0_FRMNUML | (((uint16)USB0_FRMNUMH)<<8))
std_error_t std_error;
tr_error_t tr_error;
extern uint8 USBFlag;
extern MSTInfoStruct mst_info;
static uint8 dbuffer[DBUFFER_SIZE];
DeviceConect my_device;
uint8 tBDT_unaligned[1024];
tBDT * tBDTtable; // 16个端点的BDT
uint8 *bdt;
static EP_STRUCT endpoint_data[16];
struct {
uint8 next_rx;
uint8 next_tx;
} ep_info;
uint8 USBHostInit(void)
{
uint8 ep;
uint16 i;
tBDTtable = (tBDT *)((( uint32 ) tBDT_unaligned & 0xFFFFFE00UL) + 0x200UL);
bdt = (uint8 *)tBDTtable;
//1 清除设备所有端点
my_device.address = INVALID_ADDRESS;
ep_info.next_tx = 0;
ep_info.next_rx = 0;
/*
for(i = 0;i < 32;i++)
{
tBDTtable[i].Stat._byte = 0;
tBDTtable[i].Cnt = 0;
tBDTtable[i].Addr = 0;
}
*/
for(i = 0;i < 512;i++)
{
bdt[i] = 0;
}
for(ep=0;ep<MAX_EP_PER_DEVICE;ep++)
{
my_device.eps[ep].address = INVALID_ADDRESS;
my_device.eps[ep].last_due = 0;
my_device.eps[ep].interval = 74;
}
/* MPU Configuration */
MPU_CESR=0; // MPU is disable. All accesses from all bus masters are allowed
/* Configure USB to be clocked from PLL */
SIM_SOPT2 |= SIM_SOPT2_USBSRC_MASK | SIM_SOPT2_PLLFLLSEL_MASK;
/* Configure USBFRAC = 0, USBDIV = 1 => frq(USBout) = 1 / 2 * frq(PLLin) */
//SIM_CLKDIV2 &= ~(SIM_CLKDIV2_USBFRAC_MASK | SIM_CLKDIV2_USBDIV_MASK);
SIM_CLKDIV2 |= 0x02;
/* Configure enable USB regulator for device */
//SIM_SOPT1_REG(SIM_BASE_PTR) |= SIM_SOPT1_USBREGEN_MASK;
//_bsp_usb_io_init();
SIM_SCGC4 |= SIM_SCGC4_USBOTG_MASK;
/*******************************************/
/* NVIC Configuration */
//extern uint32 __VECTOR_RAM[]; //Get vector table that was copied to RAM
//__VECTOR_RAM[89]=(uint32)USBIsr; //replace ISR
NVICICER2|=(1<<9); //Clear any pending interrupts on USB
NVICISER2|=(1<<9); //Enable interrupts from USB module
/*******************************************/
/* Reset USB peripheral */
USB0_USBTRC0 |= USB_USBTRC0_USBRESET_MASK;
/* Wait while resetting */
while (USB0_USBTRC0 & USB_USBTRC0_USBRESET_MASK)
{}
/* reset USB CTRL register */
USB0_USBCTRL = 0;
USB0_ISTAT = 0xFF;
USB0_CTL |= USB_CTL_ODDRST_MASK;
//memset(endpoint_data, 0, sizeof(endpoint_data));
USB0_BDTPAGE1 = (uint8)(((uint32)BDT_BASE) >> 8);
USB0_BDTPAGE2 = (uint8)(((uint32)BDT_BASE) >> 16);
USB0_BDTPAGE3 = (uint8)(((uint32)BDT_BASE) >> 24);
USB0_SOFTHLD = 74;
USB0_OTGCTL = USB_OTGCTL_DPLOW_MASK | USB_OTGCTL_DMLOW_MASK | USB_OTGCTL_OTGEN_MASK;
/* Enable week pull-downs, usefull for detecting detach (effectivelly bus discharge) */
USB0_USBCTRL |= USB_USBCTRL_PDE_MASK;// Weak pulldowns are enabled on D+ and D-.
/* Remove suspend state */
USB0_USBCTRL &= ~USB_USBCTRL_SUSP_MASK;
USB0_INTEN = USB_INTEN_ATTACHEN_MASK
/*| USB_INTEN_RESUMEEN_MASK
| USB_INTEN_TOKDNEEN_MASK
| USB_INTEN_SOFTOKEN_MASK
| USB_INTEN_STALLEN_MASK
| USB_INTEN_SLEEPEN_MASK
| USB_INTEN_ERROREN_MASK
| USB_INTEN_USBRSTEN_MASK
*/
;
//USB0_USBTRC0|=0x40; // Software must set this bit to 1b.
USB0_CTL = USB_CTL_HOSTMODEEN_MASK
//| USB_CTL_USBENSOFEN_MASK
;
return 0;
}
//-------------------------------------------------------------------------*
//函数名: USBHostScan *
//功 能: 扫描总线是否有USB设备 *
//参 数: 无 *
//返 回: 0 无设备; 1 有设备 *
//说 明: *
//-------------------------------------------------------------------------*
uint8 USBHostScan(void)
{
//1 防止非主机模式
if ((USB0_CTL & USB_CTL_HOSTMODEEN_MASK) == 0)
{
my_device.address = INVALID_ADDRESS;
my_device.low_speed = 0;
return(0);
}
//2 检测USB设备
if(USBCheckDeviceConnect())
{
USBResetBus();
return(1);
}
return(0);
}
//-------------------------------------------------------------------------*
//函数名: USBModifyEps *
//功 能: 配置端点 *
//参 数: ep: 端点号; type: 端点类型; address: 端点地址 interval:访问间隔; *
// psize: 最大包长 *
//返 回: 无 *
//说 明: *
//-------------------------------------------------------------------------*
static void USBModifyEps(uint8 ep,uint8 type, uint8 address, uint8 interval, uint16 psize)
{
my_device.eps[ep].type = type;
my_device.eps[ep].address = address;
my_device.eps[ep].interval= interval;
my_device.eps[ep].psize = psize;
}
//-------------------------------------------------------------------------*
//函数名: USBResetBus *
//功 能: USB复位 *
//参 数: 无 *
//返 回: *
//说 明: 复位后重新检测USB设备的连接 *
//-------------------------------------------------------------------------*
static void USBResetBus(void)
{
uint8 ep=0;
if(USBWaitTokenFinish() != tre_none)
{
tr_error = tre_not_running;
return;
}
#ifdef DEBUG
printf("Reset ");
#endif
//1 产生复位信号
USB0_CTL |= USB_CTL_RESET_MASK; //产生复位信号
Delay(30); //适当延时
USB0_CTL &= ~USB_CTL_RESET_MASK; //停止复位信号
USB0_ISTAT = USB_ISTAT_USBRST_MASK; //清除复位事件
//2 只有端点0工作,并设置为控制传输
if (my_device.address != INVALID_ADDRESS)
my_device.address=0;
USBModifyEps(0, EPTYPE_CTRL, 0, 0, MIN_EP0_PSIZE);
for(ep=1;ep<MAX_EP_PER_DEVICE;ep++)
my_device.eps[ep].address = INVALID_ADDRESS;
//3 重新检测是否有USB设备
if (USBCheckDeviceConnect())
{
#ifdef DEBUG
printf("Connect! ");
#endif
USB0_CTL |= USB_CTL_USBENSOFEN_MASK; //使能SOF
USB0_ISTAT = USB_ISTAT_SLEEP_MASK | USB_ISTAT_RESUME_MASK; //清除标志
Delay(100); // device may need max 10 mS reset recovery time
//设置断点0(控制传输)的最大支持长度
if (!USBSetEp0psize()) //设置不成功则退出
{
return;
}
#ifdef DEBUG
printf("Got psize ");
#endif
//设置设备地址
if (!USBSetAddress(1))
{
return;
}
my_device.address=1;
#ifdef DEBUG
printf("Setaddress OK ");
#endif
}
else
{
#ifdef DEBUG
printf("NOConnect ");
#endif
}
}
//-----------------------------------------
没有合适的资源?快使用搜索试试~ 我知道了~
USBHost.rar_K60 USB host
共106个文件
args:14个
h:13个
obj:13个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 139 浏览量
2022-09-24
18:56:43
上传
评论
收藏 283KB RAR 举报
温馨提示
codewarrior环境下k60处理器的usb-otg作为usb主机的驱动
资源推荐
资源详情
资源评论
收起资源包目录
USBHost.rar_K60 USB host (106个子文件)
USBHost.a 68KB
USBDevice.afx 91KB
SaAnalysispointsManager.apconfig 435B
SaAnalysispointsManager.apconfig 404B
USBDevice.args 856B
isr.args 776B
main.args 776B
light.args 776B
USBHost.args 776B
hw_gpio.args 776B
hw_uart.args 776B
wdog.args 776B
printf.args 776B
start.args 730B
sysinit.args 729B
vectors.args 729B
common.args 686B
crt0.args 58B
USBHost.c 47KB
printf.c 17KB
hw_uart.c 9KB
sysinit.c 8KB
main.c 7KB
hw_gpio.c 5KB
vectors.c 5KB
common.c 4KB
start.c 3KB
wdog.c 2KB
isr.c 2KB
light.c 2KB
.cproject 55KB
.cwGeneratedFileSetLog 417B
main.d 3KB
isr.d 3KB
printf.d 2KB
USBHost.d 2KB
light.d 2KB
start.d 2KB
hw_gpio.d 2KB
hw_uart.d 2KB
wdog.d 2KB
vectors.d 2KB
sysinit.d 2KB
common.d 2KB
MK60N512VMD100.h 793KB
vectors.h 19KB
USBHost.h 10KB
USBMST.h 7KB
common.h 5KB
hw_uart.h 4KB
sysinit.h 4KB
Fat.h 4KB
SCSI.h 4KB
hw_gpio.h 3KB
light.h 2KB
wdog.h 1KB
includes.h 931B
USBDevice.afx.hex 40KB
K60_MK60N512VMD100_INTERNAL_FLASH_PnE OSJTAG.launch 28KB
K60_MK60N512VMD100_INTERNAL_FLASH_Segger J-Link.launch 24KB
K60_MK60N512VMD100_INTERNAL_RAM_PnE OSJTAG.launch 22KB
K60_MK60N512VMD100_INTERNAL_RAM_Segger J-Link.launch 21KB
512KB_flash.lcf 1KB
128KB_ram.lcf 1KB
makefile.local 791B
makefile 2KB
MK60N512VMD100.mem 1KB
subdir.mk 2KB
sources.mk 2KB
subdir.mk 2KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 1KB
subdir.mk 635B
objects.mk 254B
USBHost.obj 44KB
hw_uart.obj 15KB
main.obj 14KB
printf.obj 13KB
hw_gpio.obj 11KB
sysinit.obj 9KB
vectors.obj 8KB
common.obj 8KB
start.obj 6KB
light.obj 5KB
isr.obj 5KB
wdog.obj 4KB
crt0.obj 2KB
K60_MK60N512VMD100_INTERNAL_FLASH_PnE OSJTAG.pemicro 845B
org.eclipse.cdt.core.prefs 12KB
com.freescale.core.ide.cdt.toolchain.prefs 507B
com.freescale.core.ide.newprojectwizard.prefs 120B
org.eclipse.cdt.ui.prefs 120B
.project 2KB
crt0.s 779B
USBDevice.afx.S19 38KB
共 106 条
- 1
- 2
资源评论
钱亚锋
- 粉丝: 88
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功