Skip to content

Commit fc05ff1

Browse files
hubertmisjhedberg
authored andcommitted
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ś <[email protected]>
1 parent 22471f1 commit fc05ff1

File tree

1 file changed

+90
-85
lines changed

1 file changed

+90
-85
lines changed

drivers/misc/ft8xx/ft8xx_copro.c

Lines changed: 90 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -57,20 +57,64 @@ static void increase_reg_cmd_write(const struct device *dev, uint16_t value)
5757
data->reg_cmd_write = (data->reg_cmd_write + value) % FT800_RAM_CMD_SIZE;
5858
}
5959

60-
void ft8xx_copro_cmd(const struct device *dev, uint32_t cmd)
60+
static uint32_t ram_cmd_wr_address(const struct device *dev)
6161
{
6262
struct ft8xx_data *data = dev->data;
6363

64-
while (ram_cmd_freespace(dev) < sizeof(cmd)) {
64+
return FT800_RAM_CMD + data->reg_cmd_write;
65+
}
66+
67+
static size_t ram_cmd_wr16(const struct device *dev, uint16_t data)
68+
{
69+
ft8xx_wr16(dev, ram_cmd_wr_address(dev), data);
70+
increase_reg_cmd_write(dev, sizeof(data));
71+
72+
return sizeof(data);
73+
}
74+
75+
static size_t ram_cmd_wr32(const struct device *dev, uint32_t data)
76+
{
77+
ft8xx_wr32(dev, ram_cmd_wr_address(dev), data);
78+
increase_reg_cmd_write(dev, sizeof(data));
79+
80+
return sizeof(data);
81+
}
82+
83+
static size_t ram_cmd_wr_var(const struct device *dev, const uint8_t *data, size_t data_size,
84+
size_t padding_size)
85+
{
86+
(void)ft8xx_drv_write(dev, ram_cmd_wr_address(dev), data, data_size);
87+
increase_reg_cmd_write(dev, data_size + padding_size);
88+
89+
return data_size + padding_size;
90+
}
91+
92+
static void cmd_beginning(const struct device *dev, size_t cmd_size)
93+
{
94+
while (ram_cmd_freespace(dev) < cmd_size) {
6595
refresh_reg_cmd_read(dev);
6696
}
97+
}
6798

68-
ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, cmd);
69-
increase_reg_cmd_write(dev, sizeof(cmd));
70-
99+
static void cmd_ending(const struct device *dev, size_t cmd_size, size_t written_bytes)
100+
{
101+
__ASSERT(written_bytes == cmd_size, "Written %zu bytes, expected %zu", written_bytes,
102+
cmd_size);
103+
(void)written_bytes;
104+
(void)cmd_size;
71105
flush_reg_cmd_write(dev);
72106
}
73107

108+
void ft8xx_copro_cmd(const struct device *dev, uint32_t cmd)
109+
{
110+
const size_t cmd_size = sizeof(cmd);
111+
size_t written_bytes = 0;
112+
113+
cmd_beginning(dev, cmd_size);
114+
written_bytes += ram_cmd_wr32(dev, cmd);
115+
cmd_ending(dev, cmd_size, written_bytes);
116+
}
117+
74118
void ft8xx_copro_cmd_dlstart(const struct device *dev)
75119
{
76120
ft8xx_copro_cmd(dev, CMD_DLSTART);
@@ -88,42 +132,25 @@ void ft8xx_copro_cmd_text(const struct device *dev,
88132
uint16_t options,
89133
const char *string)
90134
{
91-
struct ft8xx_data *data = dev->data;
92-
93135
const uint16_t str_bytes = strlen(string) + 1;
94136
const uint16_t padding_bytes = (4 - (str_bytes % 4)) % 4;
95-
const uint16_t cmd_size = sizeof(CMD_TEXT) +
96-
sizeof(x) +
97-
sizeof(y) +
98-
sizeof(font) +
99-
sizeof(options) +
100-
str_bytes +
101-
padding_bytes;
102-
103-
while (ram_cmd_freespace(dev) < cmd_size) {
104-
refresh_reg_cmd_read(dev);
105-
}
106-
107-
ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_TEXT);
108-
increase_reg_cmd_write(dev, sizeof(CMD_TEXT));
109-
110-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, x);
111-
increase_reg_cmd_write(dev, sizeof(x));
112-
113-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, y);
114-
increase_reg_cmd_write(dev, sizeof(y));
115-
116-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, font);
117-
increase_reg_cmd_write(dev, sizeof(font));
118-
119-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, options);
120-
increase_reg_cmd_write(dev, sizeof(options));
121-
122-
(void)ft8xx_drv_write(dev, FT800_RAM_CMD + data->reg_cmd_write, (uint8_t *)string,
123-
str_bytes);
124-
increase_reg_cmd_write(dev, str_bytes + padding_bytes);
125-
126-
flush_reg_cmd_write(dev);
137+
const size_t cmd_size = sizeof(CMD_TEXT) +
138+
sizeof(x) +
139+
sizeof(y) +
140+
sizeof(font) +
141+
sizeof(options) +
142+
str_bytes +
143+
padding_bytes;
144+
size_t written_bytes = 0;
145+
146+
cmd_beginning(dev, cmd_size);
147+
written_bytes += ram_cmd_wr32(dev, CMD_TEXT);
148+
written_bytes += ram_cmd_wr16(dev, x);
149+
written_bytes += ram_cmd_wr16(dev, y);
150+
written_bytes += ram_cmd_wr16(dev, font);
151+
written_bytes += ram_cmd_wr16(dev, options);
152+
written_bytes += ram_cmd_wr_var(dev, (const uint8_t *)string, str_bytes, padding_bytes);
153+
cmd_ending(dev, cmd_size, written_bytes);
127154
}
128155

129156
void ft8xx_copro_cmd_number(const struct device *dev,
@@ -133,59 +160,37 @@ void ft8xx_copro_cmd_number(const struct device *dev,
133160
uint16_t options,
134161
int32_t number)
135162
{
136-
struct ft8xx_data *data = dev->data;
137-
138-
const uint16_t cmd_size = sizeof(CMD_NUMBER) +
139-
sizeof(x) +
140-
sizeof(y) +
141-
sizeof(font) +
142-
sizeof(options) +
143-
sizeof(number);
144-
145-
while (ram_cmd_freespace(dev) < cmd_size) {
146-
refresh_reg_cmd_read(dev);
147-
}
148-
149-
ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_NUMBER);
150-
increase_reg_cmd_write(dev, sizeof(CMD_NUMBER));
151-
152-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, x);
153-
increase_reg_cmd_write(dev, sizeof(x));
154-
155-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, y);
156-
increase_reg_cmd_write(dev, sizeof(y));
157-
158-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, font);
159-
increase_reg_cmd_write(dev, sizeof(font));
160-
161-
ft8xx_wr16(dev, FT800_RAM_CMD + data->reg_cmd_write, options);
162-
increase_reg_cmd_write(dev, sizeof(options));
163-
164-
ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, number);
165-
increase_reg_cmd_write(dev, sizeof(number));
166-
167-
flush_reg_cmd_write(dev);
163+
const size_t cmd_size = sizeof(CMD_NUMBER) +
164+
sizeof(x) +
165+
sizeof(y) +
166+
sizeof(font) +
167+
sizeof(options) +
168+
sizeof(number);
169+
size_t written_bytes = 0;
170+
171+
cmd_beginning(dev, cmd_size);
172+
written_bytes += ram_cmd_wr32(dev, CMD_NUMBER);
173+
written_bytes += ram_cmd_wr16(dev, x);
174+
written_bytes += ram_cmd_wr16(dev, y);
175+
written_bytes += ram_cmd_wr16(dev, font);
176+
written_bytes += ram_cmd_wr16(dev, options);
177+
written_bytes += ram_cmd_wr32(dev, number);
178+
cmd_ending(dev, cmd_size, written_bytes);
168179
}
169180

170181
void ft8xx_copro_cmd_calibrate(const struct device *dev, uint32_t *result)
171182
{
172-
struct ft8xx_data *data = dev->data;
173-
174-
const uint16_t cmd_size = sizeof(CMD_CALIBRATE) + sizeof(uint32_t);
175183
uint32_t result_address;
176184

177-
while (ram_cmd_freespace(dev) < cmd_size) {
178-
refresh_reg_cmd_read(dev);
179-
}
185+
const size_t cmd_size = sizeof(CMD_CALIBRATE) +
186+
sizeof(uint32_t);
187+
size_t written_bytes = 0;
180188

181-
ft8xx_wr32(dev, FT800_RAM_CMD + data->reg_cmd_write, CMD_CALIBRATE);
182-
increase_reg_cmd_write(dev, sizeof(CMD_CALIBRATE));
183-
184-
result_address = FT800_RAM_CMD + data->reg_cmd_write;
185-
ft8xx_wr32(dev, result_address, 1UL);
186-
increase_reg_cmd_write(dev, sizeof(uint32_t));
187-
188-
flush_reg_cmd_write(dev);
189+
cmd_beginning(dev, cmd_size);
190+
written_bytes += ram_cmd_wr32(dev, CMD_CALIBRATE);
191+
result_address = ram_cmd_wr_address(dev);
192+
written_bytes += ram_cmd_wr32(dev, 1UL);
193+
cmd_ending(dev, cmd_size, written_bytes);
189194

190195
/* Wait until calibration is finished. */
191196
while (ram_cmd_fullness(dev) > 0) {

0 commit comments

Comments
 (0)