在本科阶段曾对USB的基本协议有一点点的了解,由于当时只是纸上谈兵,学过的理论也就很快忘记了,不曾想本次的开发板具有USB的功能,同时,又给出通用的功能函数,所以,拟在此基础上,重新回味一下USB通信协议的工作机理,再加深一下对USB的学习。
如果以后可能的话,这里先透露一点,目前手头有一款USB接口的旧手机,可以当做USB接口的猫来用,以后可能会尝试用此USB主机去控制我的这款旧手机来收发短信息,批量打电话等多功能电话短信通知平台。
好了,灌水的话就少说了,现在把我今天学习的关于本开发板上的USB主机库函数的简单介绍传上来仅供大家参考,同时也希望,其它的团队能够在你们项目的基础上采用USB主机通信功能来丰富升级你们的产品,一起学习,共同进步哦!
//该头文件定义了两个USB对象,分别为:USBHost和EndPoint
#ifndef __H_RXDUINO_USBHOST
#define __H_RXDUINO_USBHOST
#include "rxduino.h"
#include "../tkdnhal/tkusbhost.h" //调用RX_CPU内部库中的usbhost库函数,此库函数为最基本的usbhost操作
#define USBHOST_LIBRARY_VERSION 0x01000000 // Version 0.50
#ifdef __cplusplus
extern "C" {
#endif
//声明一个USBHost新对象,为其进行一个内存分配
class USBHost;
//定义一个EndPoint对象
class EndPoint {
//类变量声明
int ep;
//获取为USBHost对象分配的内存区域首地址
USBHost *parent;//定义一个指针指向USBHost类
int timeout;
public:
//EndPoint中的公共成员
//该函数用于设置读或写的等待时间,如果输入为-1,则表示无限期等待下去,参数以ms为单位
void setTimeout(int milliseconds);
//读写控制函数
int read(unsigned char reqt,unsigned char req,unsigned short val,unsigned short index,unsigned char *buf,int len);
//该函数主要用于在控制传输模式下数据的读操作
//reqt:bmRequestType域
//req:bRequest域
//val:wValue域
//index:wIndex域
//*buf:指向读数据缓冲区的指针,用于存放读取的数据
//len:预读取数据的长度
//举例说明,如果主机要发送一个GET_DESCRIPTOR的获取从机描述符的命令,则应配置如下:
//reqt=0x80,req=0x06
//则从USB从设备中读取len中设置的字节数,如何读取失败则返回-1
int read(unsigned char *buf,int len);
//该函数主要用于在批量传输模式下的大量数据读操作
//*buf:指向读数据缓冲区的指针,用于存放读取的数据
//len:预读取数据的长度
int write(unsigned char reqt,unsigned char req,unsigned short val,unsigned short index,unsigned char *buf,int len);
//类似于read操作
int write(unsigned char *buf,int len);
//类似于read操作
//下面的函数和变量,USER无法操作和使用
EndPoint(); // 创建一个空的节点
EndPoint(const EndPoint &obj) {ep = obj.ep;parent = obj.parent;timeout = obj.timeout;} ; // コピーコンストラクタ
EndPoint(USBHost *parent,int ep) {this->parent = parent;this->ep = ep;timeout = 100;};
operator int() {if(!parent || (ep < 0)) return 0; return 1;}
operator bool() {if(!parent || (ep < 0)) return false; return true;}
};
//定义一个USBHost对象
class USBHost {
private:
bool init;
public:
USBHost();
~USBHost();
bool begin(int timeout,bool GPIOPullDown = false);
//用于初始化时,等待与目标器件建立连接
//如果不止一次的调用该函数,则初始化时将跳过第一个begin函数,将只等待第二个begin的连接
//timeout用于设置连接建立的等待时间,以ms为单位
//判断USB的两个data管脚D+:P25,D-:P22是否被拉低了,这个拉低信号只在USB刚连接时才有效
//成功则返回true,失败返回false
bool connected();
//检测连接是否正常建立,如果正常建立了则返回true,否则返回false
void stop();
//断开与目标器件的连接
unsigned short getVendor();
//获取并返回目标器件供应商的ID号码
unsigned short getVendor(char *string,int buflen);
//检查目标器件供应商的名字和ID号码,
//参数*string指针指向供应商名字的存储首地址,如果为NULL则表示忽略供应商名字,
//参数buflen作为输入参数,表示供应商名字缓冲区的大小,
//函数返回供应商ID号码
unsigned short getProduct();
//获取并返回目标器件的产品ID
unsigned short getProduct(char *string,int buflen);
//检查目标器件的产品名字和产品ID号码,
//参数*string指针指向产品名字的存储首地址,如果为NULL则表示忽略产品的名字,
//参数buflen作为输入参数,表示产品名字缓冲区的大小,
//函数返回目标器件的产品ID号码
EndPoint getEndPoint(int ep);
//获取端点号为ep的端点对象,无返回对象
};
#ifdef __cplusplus
}
#endif
#endif // __H_RXDUINO_TONE