drivers: serial: convert Zephyr constants to rpi-hal constants
rpi-hal function "uart_set_format" expects data width in the range of 5..8. So I created a new function “uart_rpi_set_format” which contains common parts of “uart_rpi_configure”. Signed-off-by: Jan Hilsdorf <jan.hilsdorf@gmail.com>
This commit is contained in:
parent
8c1aa8aa61
commit
a429528e3d
1 changed files with 71 additions and 61 deletions
|
@ -59,72 +59,13 @@ static void uart_rpi_poll_out(const struct device *dev, unsigned char c)
|
||||||
uart_hw->dr = c;
|
uart_hw->dr = c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int uart_rpi_init(const struct device *dev)
|
static int uart_rpi_set_format(const struct device *dev, const struct uart_config *cfg)
|
||||||
{
|
{
|
||||||
const struct uart_rpi_config *config = dev->config;
|
const struct uart_rpi_config *config = dev->config;
|
||||||
uart_inst_t * const uart_inst = config->uart_dev;
|
uart_inst_t * const uart_inst = config->uart_dev;
|
||||||
uart_hw_t * const uart_hw = config->uart_regs;
|
|
||||||
struct uart_rpi_data * const data = dev->data;
|
|
||||||
uint baudrate;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
|
|
||||||
if (ret < 0) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* uart_init() may be replaced by register based API once rpi-pico platform
|
|
||||||
* has a clock controller driver
|
|
||||||
*/
|
|
||||||
baudrate = uart_init(uart_inst, data->uart_config.baudrate);
|
|
||||||
/* Check if baudrate adjustment returned by 'uart_init' function is a positive value */
|
|
||||||
if (baudrate == 0) {
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* initialize uart_config with hardware reset values
|
|
||||||
* https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#tab-registerlist_uart page:431
|
|
||||||
* data bits set default to 8 instaed of hardware reset 5 to increase compatibility.
|
|
||||||
*/
|
|
||||||
data->uart_config = (struct uart_config){
|
|
||||||
.baudrate = baudrate,
|
|
||||||
.data_bits = UART_CFG_DATA_BITS_8,
|
|
||||||
.flow_ctrl = UART_CFG_FLOW_CTRL_NONE,
|
|
||||||
.parity = UART_CFG_PARITY_NONE,
|
|
||||||
.stop_bits = UART_CFG_STOP_BITS_1
|
|
||||||
};
|
|
||||||
uart_set_format(uart_inst,
|
|
||||||
data->uart_config.data_bits,
|
|
||||||
data->uart_config.stop_bits,
|
|
||||||
data->uart_config.parity);
|
|
||||||
hw_clear_bits(&uart_hw->lcr_h, UART_UARTLCR_H_FEN_BITS);
|
|
||||||
uart_hw->dr = 0U;
|
|
||||||
|
|
||||||
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
|
||||||
config->irq_config_func(dev);
|
|
||||||
#endif /* CONFIG_UART_INTERRUPT_DRIVEN */
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uart_rpi_config_get(const struct device *dev, struct uart_config *cfg)
|
|
||||||
{
|
|
||||||
struct uart_rpi_data *data = dev->data;
|
|
||||||
|
|
||||||
memcpy(cfg, &data->uart_config, sizeof(struct uart_config));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int uart_rpi_configure(const struct device *dev, const struct uart_config *cfg)
|
|
||||||
{
|
|
||||||
const struct uart_rpi_config *config = dev->config;
|
|
||||||
uart_inst_t * const uart_inst = config->uart_dev;
|
|
||||||
struct uart_rpi_data *data = dev->data;
|
|
||||||
uart_parity_t parity = 0;
|
uart_parity_t parity = 0;
|
||||||
uint data_bits = 0;
|
uint data_bits = 0;
|
||||||
uint stop_bits = 0;
|
uint stop_bits = 0;
|
||||||
uint baudrate = 0;
|
|
||||||
|
|
||||||
switch (cfg->data_bits) {
|
switch (cfg->data_bits) {
|
||||||
case UART_CFG_DATA_BITS_5:
|
case UART_CFG_DATA_BITS_5:
|
||||||
|
@ -168,11 +109,80 @@ static int uart_rpi_configure(const struct device *dev, const struct uart_config
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uart_set_format(uart_inst, data_bits, stop_bits, parity);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_rpi_init(const struct device *dev)
|
||||||
|
{
|
||||||
|
const struct uart_rpi_config *config = dev->config;
|
||||||
|
uart_inst_t * const uart_inst = config->uart_dev;
|
||||||
|
uart_hw_t * const uart_hw = config->uart_regs;
|
||||||
|
struct uart_rpi_data * const data = dev->data;
|
||||||
|
uint baudrate;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* uart_init() may be replaced by register based API once rpi-pico platform
|
||||||
|
* has a clock controller driver
|
||||||
|
*/
|
||||||
|
baudrate = uart_init(uart_inst, data->uart_config.baudrate);
|
||||||
|
/* Check if baudrate adjustment returned by 'uart_init' function is a positive value */
|
||||||
|
if (baudrate == 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* initialize uart_config with hardware reset values
|
||||||
|
* https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#tab-registerlist_uart page:431
|
||||||
|
* data bits set default to 8 instaed of hardware reset 5 to increase compatibility.
|
||||||
|
*/
|
||||||
|
data->uart_config = (struct uart_config){
|
||||||
|
.baudrate = baudrate,
|
||||||
|
.data_bits = UART_CFG_DATA_BITS_8,
|
||||||
|
.flow_ctrl = UART_CFG_FLOW_CTRL_NONE,
|
||||||
|
.parity = UART_CFG_PARITY_NONE,
|
||||||
|
.stop_bits = UART_CFG_STOP_BITS_1
|
||||||
|
};
|
||||||
|
uart_rpi_set_format(dev, &data->uart_config);
|
||||||
|
hw_clear_bits(&uart_hw->lcr_h, UART_UARTLCR_H_FEN_BITS);
|
||||||
|
uart_hw->dr = 0U;
|
||||||
|
|
||||||
|
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
|
||||||
|
config->irq_config_func(dev);
|
||||||
|
#endif /* CONFIG_UART_INTERRUPT_DRIVEN */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_rpi_config_get(const struct device *dev, struct uart_config *cfg)
|
||||||
|
{
|
||||||
|
struct uart_rpi_data *data = dev->data;
|
||||||
|
|
||||||
|
memcpy(cfg, &data->uart_config, sizeof(struct uart_config));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int uart_rpi_configure(const struct device *dev, const struct uart_config *cfg)
|
||||||
|
{
|
||||||
|
const struct uart_rpi_config *config = dev->config;
|
||||||
|
uart_inst_t * const uart_inst = config->uart_dev;
|
||||||
|
struct uart_rpi_data *data = dev->data;
|
||||||
|
uint baudrate = 0;
|
||||||
|
|
||||||
baudrate = uart_set_baudrate(uart_inst, cfg->baudrate);
|
baudrate = uart_set_baudrate(uart_inst, cfg->baudrate);
|
||||||
if (baudrate == 0) {
|
if (baudrate == 0) {
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
uart_set_format(uart_inst, data_bits, stop_bits, parity);
|
|
||||||
|
if (uart_rpi_set_format(dev, cfg) != 0) {
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
data->uart_config = *cfg;
|
data->uart_config = *cfg;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue