📄 usbdevhal.c
字号:
/****************************************Copyright (c)****************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info---------------------------------------------------------------------------------
** File name: usbDevHAL.c
** Latest modified Date: 2008-05-10
** Latest Version: 1.1
** Descriptions: ZLG_USB2400 Device 软件包硬件抽象层源文件
**
**--------------------------------------------------------------------------------------------------------
** Created by: ZhengMingyuan
** Created date: 2005-08-08
** Version: 1.0
** Descriptions: The original version
**
**--------------------------------------------------------------------------------------------------------
** Modified by: LingGuilin
** Modified date: 2008-05-10
** Version: 1.1
** Descriptions: 修改部分代码以适合SmartARM2400系列开发板
**
*********************************************************************************************************/
#include "config.h"
#ifndef USBClkCtrl
#define USBClkCtrl (*(volatile unsigned long *)(0xFFE0CFF4))
#endif
#ifndef USBClkSt
#define USBClkSt (*(volatile unsigned long *)(0xFFE0CFF8))
#endif
#ifndef USBPortSel
#define USBPortSel (*(volatile unsigned long *)(0xFFE0C110))
#endif
#define __USB_DEV_CLK_EN (0x01 << 1)
#define __USB_I2C_CLK_EN (0x01 << 2)
#define __USB_OTG_CLK_EN (0x01 << 3)
#define __USB_AHB_CLK_EN (0x01 << 4)
#define __USB_TDI (0x01 << 0)
/*********************************************************************************************************
** Function name: __usbDevHardwareInit
** Descriptions: 初始化 USB 设备控制器硬件
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHardwareInit (void)
{
INT32U ulClkCtrl = (__USB_I2C_CLK_EN | __USB_OTG_CLK_EN | \
__USB_DEV_CLK_EN | __USB_AHB_CLK_EN);
PCONP |= 0x80000000; /* 给USB控制器提供电源 */
OTGClkCtrl = ulClkCtrl; /* 配置USB时钟控制寄存器 */
while ((OTGClkSt & ulClkCtrl) != ulClkCtrl);
OTGStCtrl &= ~0x01; /* U1 HOST, U2 HOST */
PINSEL1 &= ~(0x03U << 26); /* P0.29 为 LPC2400 USB */
PINSEL1 |= (0x01U << 26); /* ...Device(1) 的D+ */
PINSEL1 &= ~(0x03U << 28); /* P0.30 为 LPC2400 USB */
PINSEL1 |= (0x01U << 28); /* ...Device(1) 的 D- */
PINSEL3 &= ~(0x03U << 28); /* P1.30 为 LPC2400 USB */
PINSEL3 |= (0x02U << 28); /* Device(1)和(2) 的 VBUS */
PINSEL3 &= ~(0x03U << 4); /* P1.18 为 LPC2400 USB */
PINSEL3 |= (0x01U << 4); /* ...Device(1) UP_LED */
PINSEL3 &= ~(0x0F << 24); /* P1.28 为 USB_SCL1, P1.29 */
PINSEL3 |= (0x05 << 24); /* ...为 USB_SDA1 */
__isp1301DisEnPswOE();
__isp1301Write(__OTG_CTL1_CLR, __OTG_CTL1_DM_PULLDOWN |
__OTG_CTL1_DP_PULLDOWN | __OTG_CTL1_DM_PULLUP);
}
/*********************************************************************************************************
** Function name: __usbDevHadwareDisconnect
** Descriptions: 断开与USB 总线的连接
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHadwareDisconnect (void)
{
/*
* 取消 ISP1301 上的 D+ 线电阻上拉
*/
OTG_I2C_TX = 0x15A; /* 发送 ISP1301 地址, */
/* ...R/W=0, 写操作 */
OTG_I2C_TX = 0x007; /* send OTG Control (Set) */
/* ...register address */
OTG_I2C_TX = 0x201; /* Set DP_PULLUP bit, */
/* ...send STOP condition */
while (!(OTG_I2C_STS & __USB_TDI)); /* Wait for TDI to be set */
OTG_I2C_STS = __USB_TDI; /* Clear TDI */
}
/*********************************************************************************************************
** Function name: __usbDevHadwareConnect
** Descriptions: 连接 USB 总线
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHadwareConnect (void)
{
/*
* 设置 ISP1301 上的 D+ 线电阻上拉
*/
OTG_I2C_TX = 0x15A; /* 发送 ISP1301 地址, */
/* ...R/W=0, 写操作 */
OTG_I2C_TX = 0x006; /* send OTG Control (Set) */
/* ...register address */
OTG_I2C_TX = 0x201; /* Set DP_PULLUP bit, */
/* ...send STOP condition */
while (!(OTG_I2C_STS & __USB_TDI)); /* Wait for TDI to be set */
OTG_I2C_STS = __USB_TDI; /* Clear TDI */
}
/*********************************************************************************************************
** Function name: __usbDevHadwareReconnect
** Descriptions: 重新连接 USB 总线
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevHadwareReconnect (void)
{
INT32U ulClkCnt = 0;
__usbDevHadwareDisconnect(); /* 断开与USB总线的连接 */
for (ulClkCnt = 0;ulClkCnt <= 0x1FFFF;ulClkCnt++); /* 延时 */
__usbDevHadwareConnect(); /* 连接至USB总线 */
}
/*********************************************************************************************************
** Function name: __usbDevIntConfig
** Descriptions: 配置USB设备控制器的中断
** input parameters: 无
** output parameters: 无
** Returned value: 无
*********************************************************************************************************/
void __usbDevIntConfig (void)
{
INT32U ulTmp = EP_SLOW;
USBDevIntClr = FRAME; /* 禁止同步传输帧中断 */
USBDevIntEn = ulTmp; /* 使能复位中断, 低速中断 */
USBDevIntPri = 0; /* 使能端点中断为低优先级中断 */
#if DMA_ENGINE_EN
ulTmp = (0x01 << 0) + (0x01 << 1); /* 使能控制传输端点从机中断 */
#else
ulTmp = (0x01 << 0) + (0x01 << 1) + (0x01 << 2) +
(0x01 << 3) + (0x01 << 4) + (0x01 << 5); /* 使能端点 0 ~ 5 从机中断 */
#endif
USBEpIntEn = ulTmp; /* 使能物理端点 0 ~ 5中断 */
USBEpIntPri &= ~(unsigned long)ulTmp; /* 设置为低优先级中断 */
}
/*********************************************************************************************************
END FILE
*********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -