uint16_t rdwr_vcon_pot(uint8_t *val, CyBool_t write) { uint16_t status; CyU3PI2cPreamble_t preamble; preamble.length = 1; uint8_t addr = UXN1330_VCON_POT; if (!write) { addr |= 1; // read } preamble.buffer[0] = addr; preamble.ctrlMask = 0x0000; if (write) { status = CyU3PI2cTransmitBytes(&preamble, val, 1, 1); } else { status = CyU3PI2cReceiveBytes(&preamble, val, 1, 1); } if(status) { log_debug ( "vcon_pot CyU3PI2c status: %d\n", status ); return status; /* Wait for the write to complete. */ preamble.length = 1; status = CyU3PI2cWaitForAck(&preamble, 200); if(status) { log_error( "CyU3PI2cWaitForAck fail %d\n", status ); return status; } } return 0; }
CyBool_t handle_serial_num(uint8_t bReqType, uint16_t wLength) { CyU3PI2cPreamble_t preamble; uint32_t reg_addr = FX3_PROM_SERIALNUM0_0; uint8_t dev_addr = 0x50; uint8_t size = 17; // size of prom uint16_t status; if (wLength != 16) { log_error("Bad length=%d \n", wLength); return CY_U3P_ERROR_BAD_ARGUMENT; } switch(bReqType) { case 0xC0: preamble.length = 4; preamble.buffer[0] = m24xx_get_dev_addr(dev_addr, reg_addr, size, 0); preamble.buffer[1] = (uint8_t)(reg_addr >> 8); preamble.buffer[2] = (uint8_t)(reg_addr & 0xFF); preamble.buffer[3] = m24xx_get_dev_addr(dev_addr, reg_addr, size, 1); preamble.ctrlMask = 0x0004; status = CyU3PI2cReceiveBytes (&preamble, gSerialNum, 16, 1); if(status) { log_error("Error reading serial num from prom (%d)\n", status); return CyFalse; } status = CyU3PUsbSendEP0Data(16, gSerialNum); if(status) { log_error("Error Sending serial num to EP0 (%d)\n", status); return CyFalse; } return CyTrue; case 0x40: status = CyU3PUsbGetEP0Data(wLength, gSerialNum, 0); if(status) { log_error("Error getting serial num from EP0 (%d)\n", status); return status; } preamble.length = 3; preamble.buffer[0] = m24xx_get_dev_addr(dev_addr, reg_addr, size, 0); preamble.buffer[1] = (uint8_t)(reg_addr >> 8); preamble.buffer[2] = (uint8_t)(reg_addr & 0xFF); preamble.ctrlMask = 0x0000; status = CyU3PI2cTransmitBytes(&preamble, gSerialNum, 16, 1); if(status) { log_error("Error writing serial num to I2C (%d)\n", status); return CyFalse; } /* Wait for the write to complete. */ preamble.length = 1; status = CyU3PI2cWaitForAck(&preamble, 200); if(status) { log_error("Error waiting for i2c ACK after writing serial num (%d)\n", status); return CyFalse; } /* An additional delay seems to be required after receiving an ACK. */ CyU3PThreadSleep (1); return CyTrue; default: log_error("Bad ReqType=%d \n", bReqType); return CY_U3P_ERROR_BAD_ARGUMENT; } }