drv: ft8xx: refactor coprocessor driver
Refactor the driver of FT8xx coprocessor by moving code common to
coprocessor commands to common functions.
Signed-off-by: Hubert Miś <hubert.mis@gmail.com>
diff --git a/drivers/misc/ft8xx/ft8xx_copro.c b/drivers/misc/ft8xx/ft8xx_copro.c
index 9e8e969..960c81b 100644
--- a/drivers/misc/ft8xx/ft8xx_copro.c
+++ b/drivers/misc/ft8xx/ft8xx_copro.c
@@ -57,20 +57,64 @@
data->reg_cmd_write = (data->reg_cmd_write + value) % FT800_RAM_CMD_SIZE;
}
-void ft8xx_copro_cmd(const struct device *dev, uint32_t cmd)
+static uint32_t ram_cmd_wr_address(const struct device *dev)
{
struct ft8xx_data *data = dev->data;
- while (ram_cmd_freespace(dev) < sizeof(cmd)) {
+ return FT800_RAM_CMD + data->reg_cmd_write;
+}
+
+static size_t ram_cmd_wr16(const struct device *dev, uint16_t data)
+{
+ ft8xx_wr16(dev, ram_cmd_wr_address(dev), data);
+ increase_reg_cmd_write(dev, sizeof(data));
+
+ return sizeof(data);
+}
+
+static size_t ram_cmd_wr32(const struct device *dev, uint32_t data)
+{
+ ft8xx_wr32(dev, ram_cmd_wr_address(dev), data);
+ increase_reg_cmd_write(dev, sizeof(data));
+
+ return sizeof(data);
+}
+
+static size_t ram_cmd_wr_var(const struct device *dev, const uint8_t *data, size_t data_size,
+ size_t padding_size)
+{
+ (void)ft8xx_drv_write(dev, ram_cmd_wr_address(dev), data, data_size);
+ increase_reg_cmd_write(dev, data_size + padding_size);
+
+ return data_size + padding_size;
+}
+
+static void cmd_beginning(const struct device *dev, size_t cmd_size)
+{
+ while (ram_cmd_freespace(dev) < cmd_size) {
refresh_reg_cmd_read(dev);
}
+}
- ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, cmd);
- increase_reg_cmd_write(dev, sizeof(cmd));
-
+static void cmd_ending(const struct device *dev, size_t cmd_size, size_t written_bytes)
+{
+ __ASSERT(written_bytes == cmd_size, "Written %zu bytes, expected %zu", written_bytes,
+ cmd_size);
+ (void)written_bytes;
+ (void)cmd_size;
flush_reg_cmd_write(dev);
}
+void ft8xx_copro_cmd(const struct device *dev, uint32_t cmd)
+{
+ const size_t cmd_size = sizeof(cmd);
+ size_t written_bytes = 0;
+
+ cmd_beginning(dev, cmd_size);
+ written_bytes += ram_cmd_wr32(dev, cmd);
+ cmd_ending(dev, cmd_size, written_bytes);
+}
+
void ft8xx_copro_cmd_dlstart(const struct device *dev)
{
ft8xx_copro_cmd(dev, CMD_DLSTART);
@@ -88,42 +132,25 @@
uint16_t options,
const char *string)
{
- struct ft8xx_data *data = dev->data;
-
const uint16_t str_bytes = strlen(string) + 1;
const uint16_t padding_bytes = (4 - (str_bytes % 4)) % 4;
- const uint16_t cmd_size = sizeof(CMD_TEXT) +
- sizeof(x) +
- sizeof(y) +
- sizeof(font) +
- sizeof(options) +
- str_bytes +
- padding_bytes;
+ const size_t cmd_size = sizeof(CMD_TEXT) +
+ sizeof(x) +
+ sizeof(y) +
+ sizeof(font) +
+ sizeof(options) +
+ str_bytes +
+ padding_bytes;
+ size_t written_bytes = 0;
- while (ram_cmd_freespace(dev) < cmd_size) {
- refresh_reg_cmd_read(dev);
- }
-
- ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_TEXT);
- increase_reg_cmd_write(dev, sizeof(CMD_TEXT));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, x);
- increase_reg_cmd_write(dev, sizeof(x));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, y);
- increase_reg_cmd_write(dev, sizeof(y));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, font);
- increase_reg_cmd_write(dev, sizeof(font));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, options);
- increase_reg_cmd_write(dev, sizeof(options));
-
- (void)ft8xx_drv_write(dev, FT800_RAM_CMD + data->reg_cmd_write, (uint8_t *)string,
- str_bytes);
- increase_reg_cmd_write(dev, str_bytes + padding_bytes);
-
- flush_reg_cmd_write(dev);
+ cmd_beginning(dev, cmd_size);
+ written_bytes += ram_cmd_wr32(dev, CMD_TEXT);
+ written_bytes += ram_cmd_wr16(dev, x);
+ written_bytes += ram_cmd_wr16(dev, y);
+ written_bytes += ram_cmd_wr16(dev, font);
+ written_bytes += ram_cmd_wr16(dev, options);
+ written_bytes += ram_cmd_wr_var(dev, (const uint8_t *)string, str_bytes, padding_bytes);
+ cmd_ending(dev, cmd_size, written_bytes);
}
void ft8xx_copro_cmd_number(const struct device *dev,
@@ -133,59 +160,37 @@
uint16_t options,
int32_t number)
{
- struct ft8xx_data *data = dev->data;
+ const size_t cmd_size = sizeof(CMD_NUMBER) +
+ sizeof(x) +
+ sizeof(y) +
+ sizeof(font) +
+ sizeof(options) +
+ sizeof(number);
+ size_t written_bytes = 0;
- const uint16_t cmd_size = sizeof(CMD_NUMBER) +
- sizeof(x) +
- sizeof(y) +
- sizeof(font) +
- sizeof(options) +
- sizeof(number);
-
- while (ram_cmd_freespace(dev) < cmd_size) {
- refresh_reg_cmd_read(dev);
- }
-
- ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_NUMBER);
- increase_reg_cmd_write(dev, sizeof(CMD_NUMBER));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, x);
- increase_reg_cmd_write(dev, sizeof(x));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, y);
- increase_reg_cmd_write(dev, sizeof(y));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, font);
- increase_reg_cmd_write(dev, sizeof(font));
-
- ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, options);
- increase_reg_cmd_write(dev, sizeof(options));
-
- ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, number);
- increase_reg_cmd_write(dev, sizeof(number));
-
- flush_reg_cmd_write(dev);
+ cmd_beginning(dev, cmd_size);
+ written_bytes += ram_cmd_wr32(dev, CMD_NUMBER);
+ written_bytes += ram_cmd_wr16(dev, x);
+ written_bytes += ram_cmd_wr16(dev, y);
+ written_bytes += ram_cmd_wr16(dev, font);
+ written_bytes += ram_cmd_wr16(dev, options);
+ written_bytes += ram_cmd_wr32(dev, number);
+ cmd_ending(dev, cmd_size, written_bytes);
}
void ft8xx_copro_cmd_calibrate(const struct device *dev, uint32_t *result)
{
- struct ft8xx_data *data = dev->data;
-
- const uint16_t cmd_size = sizeof(CMD_CALIBRATE) + sizeof(uint32_t);
uint32_t result_address;
- while (ram_cmd_freespace(dev) < cmd_size) {
- refresh_reg_cmd_read(dev);
- }
+ const size_t cmd_size = sizeof(CMD_CALIBRATE) +
+ sizeof(uint32_t);
+ size_t written_bytes = 0;
- ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_CALIBRATE);
- increase_reg_cmd_write(dev, sizeof(CMD_CALIBRATE));
-
- result_address = FT800_RAM_CMD + data->reg_cmd_write;
- ft8xx_wr32(dev, result_address, 1UL);
- increase_reg_cmd_write(dev, sizeof(uint32_t));
-
- flush_reg_cmd_write(dev);
+ cmd_beginning(dev, cmd_size);
+ written_bytes += ram_cmd_wr32(dev, CMD_CALIBRATE);
+ result_address = ram_cmd_wr_address(dev);
+ written_bytes += ram_cmd_wr32(dev, 1UL);
+ cmd_ending(dev, cmd_size, written_bytes);
/* Wait until calibration is finished. */
while (ram_cmd_fullness(dev) > 0) {