/*********************************************************************
*
* Copyright:
* MOTOROLA, INC. All Rights Reserved.
* You are hereby granted a copyright license to use, modify, and
* distribute the SOFTWARE so long as this entire notice is
* retained without alteration in any modified and/or redistributed
* versions, and that such modified versions are clearly identified
* as such. No licenses are granted by implication, estoppel or
* otherwise under any patents or trademarks of Motorola, Inc. This
* software is provided on an "AS IS" basis and without warranty.
*
* To the maximum extent permitted by applicable law, MOTOROLA
* DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR
* PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE
* SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY
* ACCOMPANYING WRITTEN MATERIALS.
*
* To the maximum extent permitted by applicable law, IN NO EVENT
* SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING
* WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS
* INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY
* LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.
*
* Motorola assumes no responsibility for the maintenance and support
* of this software
********************************************************************/
/*
* File: usb.c
* Purpose: Device Driver for the USB module of the MCF5272
*/
#include "mcf5272.h"
#include "init.h"
/********************************************************************/
/* Global Endpoint Status Structures */
USB_EP_STATE ep[NUM_ENDPOINTS];
/* Global Remote Wakeup Flag */
volatile int fRemoteWakeup = 0;
/* Global USB Descriptor Data (application specific) */
extern USB_DEVICE_DESC Descriptors;
/********************************************************************/
void
usb_init(void)
{
uint32 i, DescSize;
uint32 *pConfigRam;
uint32 *pDevDesc;
MCF5272_IMM *imm = mcf5272_get_immp();
/* Initialize Descriptor pointers and variables */
pConfigRam = (uint32 *)((uint32)imm + MCF5272_USB_CFG_RAM);
pDevDesc = (uint32 *)usb_get_desc(-1, -1, -1, -1);
DescSize = usb_get_desc_size() + 3;
/* Initialize Endpoint status structures */
ep[0].ttype = CONTROL;
ep[0].packet_size = ((USB_DEVICE_DESC *)pDevDesc)->bMaxPacketSize0;
ep[0].fifo_length = (uint16)(ep[0].packet_size * FIFO_DEPTH);
ep[0].buffer.start = 0;
ep[0].buffer.free = 0;
/* Set the EP0 IN-BUSY bit -- This is only required on
pre-2K75N masks. This bit is set by HW beginning with
the 2K75N silicon. */
MCF5272_WR_USB_EP0CTL(imm, MCF5272_RD_USB_EP0CTL(imm)
| MCF5272_USB_EP0CTL_IN_BUSY);
for (i = 1; i < NUM_ENDPOINTS; i++)
ep[i].ttype = DISABLED;
/* Invalidate Configuration RAM and disable Endpoint 0 */
MCF5272_WR_USB_EP0CTL(imm, 0);
/* Load the Configuration RAM with the descriptors */
for (i = 0; i < (DescSize/4); i++)
pConfigRam[i] = pDevDesc[i];
/* Initialize FIFOs */
usb_fifo_init();
/* Initialize the Interrupts */
usb_isr_init();
/* Enable USB controller, Config RAM, EXT AFE */
#if (DEBUG)
MCF5272_WR_USB_EP0CTL(imm, 0
| MCF5272_USB_EP0CTL_DEBUG
/* | MCF5272_USB_EP0CTL_AFE_EN */
| MCF5272_USB_EP0CTL_USB_EN
| MCF5272_USB_EP0CTL_CFG_RAM_VAL);
#else
MCF5272_WR_USB_EP0CTL(imm, 0
/* | MCF5272_USB_EP0CTL_AFE_EN */
| MCF5272_USB_EP0CTL_USB_EN
| MCF5272_USB_EP0CTL_CFG_RAM_VAL);
#endif
/* Enable desired interrupts on EP0 */
MCF5272_WR_USB_EP0IMR(imm, 0
| MCF5272_USB_EP0IMR_DEV_CFG_EN
| MCF5272_USB_EP0IMR_VEND_REQ_EN
| MCF5272_USB_EP0IMR_WAKE_CHG_EN
| MCF5272_USB_EP0IMR_RESUME_EN
| MCF5272_USB_EP0IMR_SUSPEND_EN
| MCF5272_USB_EP0IMR_RESET_EN
| MCF5272_USB_EP0IMR_OUT_EOT_EN
| MCF5272_USB_EP0IMR_OUT_EOP_EN
| MCF5272_USB_EP0IMR_IN_EOT_EN
| MCF5272_USB_EP0IMR_IN_EOP_EN
| MCF5272_USB_EP0IMR_UNHALT_EN
| MCF5272_USB_EP0IMR_HALT_EN);
}
/********************************************************************/
void
usb_isr_init(void)
{
MCF5272_IMM *imm = mcf5272_get_immp();
/* Clear any pending interrupts in all Endpoints */
MCF5272_WR_USB_EP0ISR(imm, 0x0001FFFF);
MCF5272_WR_USB_EP1ISR(imm, 0x001F);
MCF5272_WR_USB_EP2ISR(imm, 0x001F);
MCF5272_WR_USB_EP3ISR(imm, 0x001F);
MCF5272_WR_USB_EP4ISR(imm, 0x001F);
MCF5272_WR_USB_EP5ISR(imm, 0x001F);
MCF5272_WR_USB_EP6ISR(imm, 0x001F);
MCF5272_WR_USB_EP7ISR(imm, 0x001F);
/* Enable all interrupts on all Endpoints */
/* These will be altered on configuration/interface changes */
MCF5272_WR_USB_EP0IMR(imm, 0x0001FFFF);
MCF5272_WR_USB_EP1IMR(imm, 0x001F);
MCF5272_WR_USB_EP2IMR(imm, 0x001F);
MCF5272_WR_USB_EP3IMR(imm, 0x001F);
MCF5272_WR_USB_EP4IMR(imm, 0x001F);
MCF5272_WR_USB_EP5IMR(imm, 0x001F);
MCF5272_WR_USB_EP6IMR(imm, 0x001F);
MCF5272_WR_USB_EP7IMR(imm, 0x001F);
/* Initialize Interrupt Control Registers */
MCF5272_WR_SIM_ICR2(imm, 0
| (0x00008888)
| (USB_EP0_LEVEL << 12)
| (USB_EP1_LEVEL << 8)
| (USB_EP2_LEVEL << 4)
| (USB_EP3_LEVEL << 0));
MCF5272_WR_SIM_ICR3(imm, 0
| (0x88880000)
| (USB_EP4_LEVEL << 28)
| (USB_EP5_LEVEL << 24)
| (USB_EP6_LEVEL << 20)
| (USB_EP7_LEVEL << 16));
}
/********************************************************************/
void
usb_endpoint0_isr(void)
{
MCF5272_IMM *imm = mcf5272_get_immp();
uint32 event;
event = MCF5272_RD_USB_EP0ISR(imm) & MCF5272_RD_USB_EP0IMR(imm);
if (event & MCF5272_USB_EP0ISR_DEV_CFG)
{
usb_devcfg_service();
/* Clear this interrupt bit */
MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_DEV_CFG);
}
if (event & MCF5272_USB_EP0ISR_VEND_REQ)
{
/* Is this a GET_DESCRIPTOR(String) request? */
if ((MCF5272_RD_USB_DRR1(imm) & 0xFF00 >> 8) == GET_DESCRIPTOR)
{
/* To do: Return STRING Descriptor if it exists */
printf("Host requested the String Descriptor\n");
while (1) ;
}
/* Clear this interrupt bit */
MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_VEND_REQ);
usb_vendreq_service(
(uint8)(MCF5272_RD_USB_DRR1(imm) & 0xFF),
(uint8)(MCF5272_RD_USB_DRR1(imm) >> 8),
(uint16)(MCF5272_RD_USB_DRR1(imm) >> 16),
(uint16)(MCF5272_RD_USB_DRR2(imm) & 0xFFFF),
(uint16)(MCF5272_RD_USB_DRR2(imm) >> 16));
}
if (event & MCF5272_USB_EP0ISR_FRM_MAT)
{
/* Clear this interrupt bit */
MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_FRM_MAT);
}
if (event & MCF5272_USB_EP0ISR_ASOF)
{
/* Clear this interrupt bit */
MCF5272_WR_USB_EP0ISR(imm, MCF5272_USB_EP0ISR_ASOF);
}
if (event & MCF5272_USB_EP0ISR_SOF)
{
/* C
在Linux系统中,USB通信程序是用于与USB设备交互的软件工具,允许用户或系统通过USB接口发送和接收数据。这种通信方式广泛应用于各种设备,如打印机、移动存储设备、摄像头、手机等。本主题主要关注如何在Linux环境下编写和使用USB通信程序,以及与开发板之间的交互。 一、Linux USB架构 Linux内核提供了完善的USB支持,其USB子系统包括以下组件: 1. **USB主机控制器驱动**:与硬件直接交互,如EHCI(Enhanced Host Controller Interface)和OHCI(Open Host Controller Interface)等,负责管理USB总线。 2. **USB设备驱动**:为特定类型的USB设备提供功能,如USB鼠标、键盘或特定的开发板。 3. **USB核心**:作为中间层,协调主机控制器驱动和设备驱动的工作。 4. **用户空间接口**:如libusb库,允许用户空间应用程序直接与USB设备通信。 二、USB通信的基本步骤 1. **枚举设备**:当USB设备插入系统时,USB子系统会自动检测并枚举该设备,分配设备地址。 2. **加载设备驱动**:根据设备的Vendor ID和Product ID,内核匹配合适的驱动程序。 3. **建立通信通道**:通过USB endpoints(端点)进行数据传输,每个端点对应一种传输类型(控制、中断、批量或同步)。 4. **数据传输**:通过read/write系统调用或libusb库函数,向设备发送或接收数据。 三、USB通信示例 在"usb example"这个压缩包中,可能包含了一个简单的USB通信程序示例,用于演示如何与开发板进行通信。通常,这样的程序会包括以下部分: 1. **设备探测**:使用`libusb`库的`libusb_init`初始化USB上下文,然后用`libusb_get_device_list`获取所有连接的设备,并根据设备描述匹配目标开发板。 2. **打开设备**:使用`libusb_open`打开设备,并获取设备句柄。 3. **配置设备**:通过`libusb_set_configuration`选择设备配置。 4. **设置端点**:确定要使用的端点,并可能需要设置其属性,如`libusb_claim_interface`。 5. **数据交换**:利用`libusb_bulk_transfer`或`libusb_interrupt_transfer`等函数进行数据的发送和接收。 6. **关闭并清理**:完成通信后,释放资源,关闭设备,最后调用`libusb_exit`释放USB上下文。 四、注意事项 1. **权限问题**:在Linux中,直接操作USB设备可能需要root权限。可以使用`udev`规则或`setcap`来授予非root用户访问权限。 2. **错误处理**:编程过程中应充分考虑各种可能的错误情况,如设备未连接、设备繁忙等,确保程序健壮性。 3. **同步与异步**:根据应用场景,可以选择同步(阻塞)或异步(非阻塞)方式处理数据传输。 通过理解Linux USB通信的基本原理和操作步骤,开发者能够构建自己的USB通信程序,实现与各种USB设备的有效交互,包括开发板。这个"usb example"就是一个很好的起点,可以帮助你深入理解并实践Linux环境下的USB通信技术。











































- 1

- 粉丝: 0
- 资源: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- CAD DWG文件在线展示平台:多版本解析与跨平台兼容的实现
- 三菱FX-3U 1N 2N系列PLC高性价比国产替代方案及其应用详解
- 基于海利普变频器SP110的高效恒压供水系统设计方案
- 基于GMSK调制解调+LDPC编译码通信链路matlab误码率仿真【包括程序,中文注释,程序操作视频】
- 基于西门子S7-224XP与昆仑通态触摸屏的恒压供水一拖一控制系统解析
- 西门子S7-200 PLC模拟量转换库程序及PID控制应用详解
- 西门子S7-1200 PLC四轴定位控制程序及其在自动螺丝机中的应用
- Qt控件组态属性设计器:高效、灵活、跨平台的控件属性编辑器源码解析
- 三菱FX3U PLC通过FB方式控制四台E700变频器的硬件配置、参数设置及编程实现
- 工业自动化领域ABB ACS510变频器恒压供水与触摸屏通讯方案详解
- 基于西门子S7-200 PLC的换热机组智能控制系统设计与应用
- 西门子PLC与威纶通触摸屏构建一拖一恒压供水系统的自动化控制解析
- Qt实现ONVIF协议的设备搜索与云台控制工具源码解析
- Qt控件源码宝库:支持Qt4至Qt6的201个独立控件,涵盖多种应用场景
- 5KW混合储能系统:48V电池+500V光伏+220V逆变的功率板设计与实现
- 电源领域中双管反激电源的设计原理与应用实践



- 1
- 2
- 3
- 4
- 5
- 6
前往页