diff options
Diffstat (limited to 'platforms/chibios/drivers/i2c_master.c')
-rw-r--r-- | platforms/chibios/drivers/i2c_master.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c index 981f6fa06..312b4c7d0 100644 --- a/platforms/chibios/drivers/i2c_master.c +++ b/platforms/chibios/drivers/i2c_master.c | |||
@@ -102,7 +102,7 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, | |||
102 | i2cStart(&I2C_DRIVER, &i2cconfig); | 102 | i2cStart(&I2C_DRIVER, &i2cconfig); |
103 | 103 | ||
104 | uint8_t complete_packet[length + 1]; | 104 | uint8_t complete_packet[length + 1]; |
105 | for (uint8_t i = 0; i < length; i++) { | 105 | for (uint16_t i = 0; i < length; i++) { |
106 | complete_packet[i + 1] = data[i]; | 106 | complete_packet[i + 1] = data[i]; |
107 | } | 107 | } |
108 | complete_packet[0] = regaddr; | 108 | complete_packet[0] = regaddr; |
@@ -111,6 +111,21 @@ i2c_status_t i2c_writeReg(uint8_t devaddr, uint8_t regaddr, const uint8_t* data, | |||
111 | return chibios_to_qmk(&status); | 111 | return chibios_to_qmk(&status); |
112 | } | 112 | } |
113 | 113 | ||
114 | i2c_status_t i2c_writeReg16(uint8_t devaddr, uint16_t regaddr, const uint8_t* data, uint16_t length, uint16_t timeout) { | ||
115 | i2c_address = devaddr; | ||
116 | i2cStart(&I2C_DRIVER, &i2cconfig); | ||
117 | |||
118 | uint8_t complete_packet[length + 2]; | ||
119 | for (uint16_t i = 0; i < length; i++) { | ||
120 | complete_packet[i + 2] = data[i]; | ||
121 | } | ||
122 | complete_packet[0] = regaddr >> 8; | ||
123 | complete_packet[1] = regaddr & 0xFF; | ||
124 | |||
125 | msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), complete_packet, length + 2, 0, 0, TIME_MS2I(timeout)); | ||
126 | return chibios_to_qmk(&status); | ||
127 | } | ||
128 | |||
114 | i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { | 129 | i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { |
115 | i2c_address = devaddr; | 130 | i2c_address = devaddr; |
116 | i2cStart(&I2C_DRIVER, &i2cconfig); | 131 | i2cStart(&I2C_DRIVER, &i2cconfig); |
@@ -118,4 +133,12 @@ i2c_status_t i2c_readReg(uint8_t devaddr, uint8_t regaddr, uint8_t* data, uint16 | |||
118 | return chibios_to_qmk(&status); | 133 | return chibios_to_qmk(&status); |
119 | } | 134 | } |
120 | 135 | ||
136 | i2c_status_t i2c_readReg16(uint8_t devaddr, uint16_t regaddr, uint8_t* data, uint16_t length, uint16_t timeout) { | ||
137 | i2c_address = devaddr; | ||
138 | i2cStart(&I2C_DRIVER, &i2cconfig); | ||
139 | uint8_t register_packet[2] = {regaddr >> 8, regaddr & 0xFF}; | ||
140 | msg_t status = i2cMasterTransmitTimeout(&I2C_DRIVER, (i2c_address >> 1), ®ister_packet, 2, data, length, TIME_MS2I(timeout)); | ||
141 | return chibios_to_qmk(&status); | ||
142 | } | ||
143 | |||
121 | void i2c_stop(void) { i2cStop(&I2C_DRIVER); } | 144 | void i2c_stop(void) { i2cStop(&I2C_DRIVER); } |