CY7c68013 Venor命令学习笔记
2016-05-07 11:33
447 查看
在BOOL DR_VendorCmnd(void)函数里的switch(SETUPDAT[1])中的SETUPDAT[1]与WINDOWS API的
SetupPacket.bRequest = ReqCode;//SETUPDAT[1]对应。
SETUPDAT数组总共8个字节,SETUPDAT[0:7]分别与PC API 的SetupPacket结构相对应。
SetupPacket的结构定义如下:
赋值例子:
通过EP0的VENDER指令读写数据:
1、PC->EP0写数据。
使用数据前要进行:
EP0BCH = 0;
EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
//清零计数以允许新的数据进来,同时停止 NAKing
否则读取不了正确的数据。
/////////////////自定义指令//////////////////////////////
case 0XB0://B0写LED数码管
// Arm endpoint - do it here to clear (after sud avail)
EP0BCH = 0;
EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
//清零计数以允许新的数据进来,同时停止 NAKing
while(EP0CS & bmEPBUSY);
I2C_WriteByte(LED_ADDR,EP0BUF[0]);
break;
2、PC->EP0读数据。
直接给EP0BUF赋值,传输字节数量赋值,然后EP0CS |= bmHSNAK; 即可。
case 0XB1://B1读按键
*EP0BUF = I2C_ReadByte(BTN_ADDR);
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
break;
SetupPacket.bRequest = ReqCode;//SETUPDAT[1]对应。
SETUPDAT数组总共8个字节,SETUPDAT[0:7]分别与PC API 的SetupPacket结构相对应。
SetupPacket的结构定义如下:
typedef struct _SETUP_PACKET { union {//对应SETUPDAT[0] BM_REQ_TYPE bmReqType; UCHAR bmRequest; }; UCHAR bRequest;//对应SETUPDAT[1] union { //对应SETUPDAT[2:3] WORD_SPLIT wVal; USHORT wValue; }; union {//对应SETUPDAT[4:5] WORD_SPLIT wIndx; USHORT wIndex; }; union {//对应SETUPDAT[6:7] WORD_SPLIT wLen; USHORT wLength; }; ULONG ulTimeOut;//这个参数用于API超时检测,不传输到下位机。 } SETUP_PACKET, *PSETUP_PACKET;
赋值例子:
SetupPacket.bmRequest = bmReq; //SETUPDAT[0] SetupPacket.bRequest = ReqCode;//SETUPDAT[1] SetupPacket.wValue = Value;//SETUPDAT[2:3] SetupPacket.wIndex = Index;//SETUPDAT[4:5] SetupPacket.wLength = bufLen;//SETUPDAT[6:7] SetupPacket.ulTimeOut = TimeOut / 1000;
通过EP0的VENDER指令读写数据:
1、PC->EP0写数据。
使用数据前要进行:
EP0BCH = 0;
EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
//清零计数以允许新的数据进来,同时停止 NAKing
否则读取不了正确的数据。
/////////////////自定义指令//////////////////////////////
case 0XB0://B0写LED数码管
// Arm endpoint - do it here to clear (after sud avail)
EP0BCH = 0;
EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing
//清零计数以允许新的数据进来,同时停止 NAKing
while(EP0CS & bmEPBUSY);
I2C_WriteByte(LED_ADDR,EP0BUF[0]);
break;
2、PC->EP0读数据。
直接给EP0BUF赋值,传输字节数量赋值,然后EP0CS |= bmHSNAK; 即可。
case 0XB1://B1读按键
*EP0BUF = I2C_ReadByte(BTN_ADDR);
EP0BCH = 0;
EP0BCL = 1; // Arm endpoint with # bytes to transfer
EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request
break;
BOOL DR_VendorCmnd(void) { WORD addr, len, bc; WORD ChipRev; WORD i; // Determine I2C boot eeprom device address; addr = 0x0 for 8 bit addr eeproms (24LC00) I2C_Addr = SERIAL_ADDR | ((I2CS & 0x10) >> 4); // addr=0x01 for 16 bit addr eeprom (LC65) // Indicate if it is a dual byte address part DB_Addr = (BOOL)(I2C_Addr & 0x01); //TPM: ID1 is 16 bit addr bit - set by rocker sw or jumper switch(SETUPDAT[1]) { /////////////////自定义指令///////////////////////////////// case 0XB0://B0写LED数码管 // Arm endpoint - do it here to clear (after sud avail) EP0BCH = 0; EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing //清零计数以允许新的数据进来,同时停止 NAKing while(EP0CS & bmEPBUSY); I2C_WriteByte(LED_ADDR,EP0BUF[0]); break; case 0XB1://B1读按键 *EP0BUF = I2C_ReadByte(BTN_ADDR); EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request break; //////////////////////////////////////////// //TPM handle new commands case VR_GET_CHIP_REV: ChipRev = GET_CHIP_REV(); *EP0BUF = ChipRev; EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request break; case VR_I2C_100: I2CTL &= ~bm400KHZ; EP0BCH = 0; EP0BCL = 0; break; case VR_I2C_400: I2CTL |= bm400KHZ; EP0BCH = 0; EP0BCL = 0; break; case VR_RENUM: *EP0BUF = 7; EP0BCH = 0; EP0BCL = 1; // Arm endpoint with # bytes to transfer EP0CS |= bmHSNAK; // Acknowledge handshake phase of device request EZUSB_Delay(1000); EZUSB_Discon(TRUE); // renumerate until setup received break; case VR_DB_FX: DB_Addr = 0x01; //TPM: need to assert double byte I2C_Addr |= 0x01; //TPM: need to assert double byte addr = SETUPDAT[2]; // Get address and length addr |= SETUPDAT[3] << 8; len = SETUPDAT[6]; len |= SETUPDAT[7] << 8; // Is this an upload command ? if(SETUPDAT[0] == VR_UPLOAD) { while(len) // Move requested data through EP0IN { // one packet at a time. while(EP0CS & bmEPBUSY); if(len < EP0BUFF_SIZE) bc = len; else bc = EP0BUFF_SIZE; for(i=0; i<bc; i++) *(EP0BUF+i) = 0xcd; EEPROMRead(addr,(WORD)bc,(WORD)EP0BUF); EP0BCH = 0; EP0BCL = (BYTE)bc; // Arm endpoint with # bytes to transfer addr += bc; len -= bc; } } // Is this a download command ? else if(SETUPDAT[0] == VR_DOWNLOAD) { while(len) // Move new data through EP0OUT { // one packet at a time. // Arm endpoint - do it here to clear (after sud avail) EP0BCH = 0; EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing while(EP0CS & bmEPBUSY); bc = EP0BCL; // Get the new bytecount EEPROMWrite(addr,bc,(WORD)EP0BUF); addr += bc; len -= bc; } } break; case VR_RAM: // NOTE: This case falls through ! case VR_EEPROM: DB_Addr = 0x00; //TPM: need to assert double byte I2C_Addr |= 0x00; //TPM: need to assert double byte addr = SETUPDAT[2]; // Get address and length addr |= SETUPDAT[3] << 8; len = SETUPDAT[6]; len |= SETUPDAT[7] << 8; // Is this an upload command ? if(SETUPDAT[0] == VR_UPLOAD) { while(len) // Move requested data through EP0IN { // one packet at a time. while(EP0CS & bmEPBUSY); if(len < EP0BUFF_SIZE) bc = len; else bc = EP0BUFF_SIZE; // Is this a RAM upload ? if(SETUPDAT[1] == VR_RAM) { for(i=0; i<bc; i++) *(EP0BUF+i) = *((BYTE xdata *)addr+i); } else { for(i=0; i<bc; i++) *(EP0BUF+i) = 0xcd; EEPROMRead(addr,(WORD)bc,(WORD)EP0BUF); } EP0BCH = 0; EP0BCL = (BYTE)bc; // Arm endpoint with # bytes to transfer addr += bc; len -= bc; } } // Is this a download command ? else if(SETUPDAT[0] == VR_DOWNLOAD) { while(len) // Move new data through EP0OUT { // one packet at a time. // Arm endpoint - do it here to clear (after sud avail) EP0BCH = 0; EP0BCL = 0; // Clear bytecount to allow new data in; also stops NAKing while(EP0CS & bmEPBUSY); bc = EP0BCL; // Get the new bytecount // Is this a RAM download ? if(SETUPDAT[1] == VR_RAM) { for(i=0; i<bc; i++) *((BYTE xdata *)addr+i) = *(EP0BUF+i); } else EEPROMWrite(addr,bc,(WORD)EP0BUF); addr += bc; len -= bc; } } break; } return(FALSE); // no error; command handled OK }
相关文章推荐
- 【计算机视觉】SIFT中LoG和DoG比较
- pwntools使用简介
- 计算机视觉与机器视觉
- Eclipse-----Eclipse中SVN过滤提交
- CC2530+74HC164矩阵键盘的设计
- [C#]浮雕化、锐化图像处理
- paper:synthesizable finite state machine design techniques using the new systemverilog 3.0 enhancements 之 FSM Coding Goals
- 【LeetCode】Increasing Triplet Subsequence
- js--面向对象--非构造函数的继承
- webview修改版式
- popupWindow弹出窗口的完美实现(实现弹出背景变暗效果)
- poj 2002 Square
- 一张关于docker版本的图
- 实习面经--阿里 java研发 v1
- Activity生命周期图
- 表空间问题----收缩空间方法:表空间中表的查法:扩展表空间
- 2016互联网创业三大方向:反向O2O、文娱IP、生态化
- 给Linux服务器开启mysql远程访问以及防火墙规则配置
- 系统调用与标准IO库区别
- 数据结构总结文