diff --git a/right/src/usb_protocol_handler.c b/right/src/usb_protocol_handler.c index e575a4a..cc4fd1c 100644 --- a/right/src/usb_protocol_handler.c +++ b/right/src/usb_protocol_handler.c @@ -12,6 +12,8 @@ void JumpToBootloader(); void GetSetTestLed(); void WriteLedDriver(); void ReadLedDriver(); +void WriteEeprom(); +void ReadEeprom(); // Functions for setting error statuses @@ -51,6 +53,12 @@ void UsbProtocolHandler() case USB_COMMAND_READ_LED_DRIVER: ReadLedDriver(); break; + case USB_COMMAND_WRITE_EEPROM: + WriteEeprom(); + break; + case USB_COMMAND_READ_EEPROM: + ReadEeprom(); + break; default: break; } @@ -116,4 +124,52 @@ void WriteLedDriver() void ReadLedDriver() { + +} + +void WriteEeprom() +{ + uint8_t i2cPayloadSize = GenericHidInBuffer[1]; + + if (i2cPayloadSize > USB_GENERIC_HID_OUT_BUFFER_LENGTH-2) { + SetError(WRITE_EEPROM_RESPONSE_INVALID_PAYLOAD_SIZE); + return; + } + + i2c_master_transfer_t masterXfer; + masterXfer.slaveAddress = I2C_ADDRESS_EEPROM; + masterXfer.direction = kI2C_Write; + masterXfer.subaddress = 0; + masterXfer.subaddressSize = 0; + masterXfer.data = GenericHidInBuffer+2; + masterXfer.dataSize = i2cPayloadSize; + masterXfer.flags = kI2C_TransferDefaultFlag; + I2C_MasterTransferBlocking(I2C_EEPROM_BUS_BASEADDR, &masterXfer); +} + +void ReadEeprom() +{ + uint8_t i2cPayloadSize = GenericHidInBuffer[1]; + + if (i2cPayloadSize > USB_GENERIC_HID_OUT_BUFFER_LENGTH-1) { + SetError(WRITE_EEPROM_RESPONSE_INVALID_PAYLOAD_SIZE); + return; + } + + i2c_master_transfer_t masterXfer; + masterXfer.slaveAddress = I2C_ADDRESS_EEPROM; + masterXfer.direction = kI2C_Write; + masterXfer.subaddress = 0; + masterXfer.subaddressSize = 0; + masterXfer.data = GenericHidInBuffer+2; + masterXfer.dataSize = 2; + masterXfer.flags = kI2C_TransferDefaultFlag; + I2C_MasterTransferBlocking(I2C_EEPROM_BUS_BASEADDR, &masterXfer); + + masterXfer.direction = kI2C_Read; + masterXfer.data = GenericHidOutBuffer+1; + masterXfer.dataSize = i2cPayloadSize; + I2C_MasterTransferBlocking(I2C_EEPROM_BUS_BASEADDR, &masterXfer); + + GenericHidOutBuffer[0] = PROTOCOL_RESPONSE_SUCCESS; } diff --git a/right/src/usb_protocol_handler.h b/right/src/usb_protocol_handler.h index 4448c5b..7df75c0 100644 --- a/right/src/usb_protocol_handler.h +++ b/right/src/usb_protocol_handler.h @@ -21,6 +21,9 @@ #define WRITE_LED_DRIVER_RESPONSE_INVALID_ADDRESS 1 #define WRITE_LED_DRIVER_RESPONSE_INVALID_PAYLOAD_SIZE 2 #define USB_COMMAND_READ_LED_DRIVER 4 + #define USB_COMMAND_WRITE_EEPROM 5 + #define WRITE_EEPROM_RESPONSE_INVALID_PAYLOAD_SIZE 1 + #define USB_COMMAND_READ_EEPROM 6 // Functions: diff --git a/shared/i2c_addresses.h b/shared/i2c_addresses.h index 2013b20..3294118 100644 --- a/shared/i2c_addresses.h +++ b/shared/i2c_addresses.h @@ -9,6 +9,7 @@ // Reserved for future purposes 0b0000011 // High-Speed master code 0b00001XX #define I2C_ADDRESS_LEFT_KEYBOARD_HALF 0b0001000 +#define I2C_ADDRESS_EEPROM 0b1010000 #define I2C_ADDRESS_LED_DRIVER_LEFT 0b1110100 // LED driver / touchpad 0b1110101 // LED driver / touchpad 0b1110110