soc: sensry: udma, pad renaming
Before that fix the names for UDMA could be misleading. With that fix the namespace is clear and easy to follow. Same applies for peripheral addresses and pad config. Signed-off-by: Sven Ginka <s.ginka@sensry.de>
This commit is contained in:
parent
795644f8f3
commit
fe4215462d
7 changed files with 301 additions and 290 deletions
|
@ -20,13 +20,13 @@ struct sy1xx_uart_config {
|
|||
typedef struct {
|
||||
uint16_t data_len;
|
||||
uint8_t *data;
|
||||
} uartTransfer_t;
|
||||
} sy1xx_uartTransfer_t;
|
||||
|
||||
typedef enum {
|
||||
DRIVERS_UART_STOP_1,
|
||||
DRIVERS_UART_STOP_1_5,
|
||||
DRIVERS_UART_STOP_2
|
||||
} uart_stop_t;
|
||||
} sy1xx_uart_stop_t;
|
||||
|
||||
typedef enum {
|
||||
DRIVERS_UART_PAR_NONE,
|
||||
|
@ -34,13 +34,13 @@ typedef enum {
|
|||
DRIVERS_UART_PAR_ODD,
|
||||
DRIVERS_UART_PAR_MARK,
|
||||
DRIVERS_UART_PAR_SPACE
|
||||
} uart_parity_t;
|
||||
} sy1xx_uart_parity_t;
|
||||
|
||||
typedef struct {
|
||||
uint32_t baudrate;
|
||||
uart_stop_t stopbits;
|
||||
uart_parity_t parity;
|
||||
} uartConfig_t;
|
||||
sy1xx_uart_stop_t stopbits;
|
||||
sy1xx_uart_parity_t parity;
|
||||
} sy1xx_uartConfig_t;
|
||||
|
||||
#define DEVICE_MAX_BUFFER_SIZE (512)
|
||||
|
||||
|
@ -50,10 +50,10 @@ struct sy1xx_uart_data {
|
|||
};
|
||||
|
||||
/* prototypes */
|
||||
static int32_t drivers_uart_read(const struct device *dev, uartTransfer_t *request);
|
||||
static int32_t drivers_uart_write(const struct device *dev, uartTransfer_t *request);
|
||||
static int32_t sy1xx_uart_read(const struct device *dev, sy1xx_uartTransfer_t *request);
|
||||
static int32_t sy1xx_uart_write(const struct device *dev, sy1xx_uartTransfer_t *request);
|
||||
|
||||
static int32_t drivers_uart_configure(const struct device *dev, uartConfig_t *uart_cfg)
|
||||
static int32_t sy1xx_uart_configure(const struct device *dev, sy1xx_uartConfig_t *uart_cfg)
|
||||
{
|
||||
struct sy1xx_uart_config *config = (struct sy1xx_uart_config *)dev->config;
|
||||
|
||||
|
@ -66,7 +66,7 @@ static int32_t drivers_uart_configure(const struct device *dev, uartConfig_t *ua
|
|||
* and then will restart from 0, so we must give div - 1 as
|
||||
* divider
|
||||
*/
|
||||
int32_t divider = soc_get_peripheral_clock() / uart_cfg->baudrate - 1;
|
||||
uint32_t divider = sy1xx_soc_get_peripheral_clock() / uart_cfg->baudrate - 1;
|
||||
|
||||
/*
|
||||
* [31:16]: clock divider (from SoC clock)
|
||||
|
@ -85,17 +85,17 @@ static int32_t drivers_uart_configure(const struct device *dev, uartConfig_t *ua
|
|||
volatile uint32_t setup = 0x0306 | uart_cfg->parity;
|
||||
|
||||
setup |= ((divider) << 16);
|
||||
UDMA_WRITE_REG(config->base, UDMA_SETUP_REG, setup);
|
||||
SY1XX_UDMA_WRITE_REG(config->base, SY1XX_UDMA_SETUP_REG, setup);
|
||||
|
||||
/* start initial reading request to get the dma running */
|
||||
uint8_t dummy_data[10];
|
||||
|
||||
uartTransfer_t dummy_request = {
|
||||
sy1xx_uartTransfer_t dummy_request = {
|
||||
.data_len = 10,
|
||||
.data = (uint8_t *)dummy_data,
|
||||
};
|
||||
|
||||
drivers_uart_read(dev, &dummy_request);
|
||||
sy1xx_uart_read(dev, &dummy_request);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -105,7 +105,7 @@ static int32_t drivers_uart_configure(const struct device *dev, uartConfig_t *ua
|
|||
* - 0: OK
|
||||
* - > 0: Busy
|
||||
*/
|
||||
int32_t drivers_uart_read(const struct device *dev, uartTransfer_t *request)
|
||||
int32_t sy1xx_uart_read(const struct device *dev, sy1xx_uartTransfer_t *request)
|
||||
{
|
||||
struct sy1xx_uart_config *config = (struct sy1xx_uart_config *)dev->config;
|
||||
struct sy1xx_uart_data *data = (struct sy1xx_uart_data *)dev->data;
|
||||
|
@ -125,7 +125,7 @@ int32_t drivers_uart_read(const struct device *dev, uartTransfer_t *request)
|
|||
int32_t ret = 0;
|
||||
|
||||
/* rx is ready */
|
||||
int32_t remaining_bytes = UDMA_READ_REG(config->base, UDMA_RX_SIZE_REG);
|
||||
int32_t remaining_bytes = SY1XX_UDMA_READ_REG(config->base, SY1XX_UDMA_RX_SIZE_REG);
|
||||
int32_t bytes_transferred = (DEVICE_MAX_BUFFER_SIZE - remaining_bytes);
|
||||
|
||||
if (bytes_transferred > 0) {
|
||||
|
@ -140,10 +140,10 @@ int32_t drivers_uart_read(const struct device *dev, uartTransfer_t *request)
|
|||
request->data_len = bytes_transferred;
|
||||
|
||||
/* stop and restart receiving */
|
||||
UDMA_CANCEL_RX(config->base);
|
||||
SY1XX_UDMA_CANCEL_RX(config->base);
|
||||
|
||||
/* start another read request, with maximum buffer size */
|
||||
UDMA_START_RX(config->base, (int32_t)data->read, DEVICE_MAX_BUFFER_SIZE, 0);
|
||||
SY1XX_UDMA_START_RX(config->base, (int32_t)data->read, DEVICE_MAX_BUFFER_SIZE, 0);
|
||||
|
||||
/* return: some data received */
|
||||
ret = 0;
|
||||
|
@ -162,7 +162,7 @@ int32_t drivers_uart_read(const struct device *dev, uartTransfer_t *request)
|
|||
* - 0: OK
|
||||
* - > 0: Busy
|
||||
*/
|
||||
int32_t drivers_uart_write(const struct device *dev, uartTransfer_t *request)
|
||||
int32_t sy1xx_uart_write(const struct device *dev, sy1xx_uartTransfer_t *request)
|
||||
{
|
||||
struct sy1xx_uart_config *config = (struct sy1xx_uart_config *)dev->config;
|
||||
struct sy1xx_uart_data *data = (struct sy1xx_uart_data *)dev->data;
|
||||
|
@ -180,15 +180,15 @@ int32_t drivers_uart_write(const struct device *dev, uartTransfer_t *request)
|
|||
return -2;
|
||||
}
|
||||
|
||||
if (0 == UDMA_IS_FINISHED_TX(config->base)) {
|
||||
if (0 == SY1XX_UDMA_IS_FINISHED_TX(config->base)) {
|
||||
/* writing not finished => busy */
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint32_t remaining_bytes = UDMA_GET_REMAINING_TX(config->base);
|
||||
uint32_t remaining_bytes = SY1XX_UDMA_GET_REMAINING_TX(config->base);
|
||||
|
||||
if (remaining_bytes != 0) {
|
||||
UDMA_CANCEL_TX(config->base);
|
||||
SY1XX_UDMA_CANCEL_TX(config->base);
|
||||
return -3;
|
||||
}
|
||||
|
||||
|
@ -198,7 +198,7 @@ int32_t drivers_uart_write(const struct device *dev, uartTransfer_t *request)
|
|||
}
|
||||
|
||||
/* start new transmission */
|
||||
UDMA_START_TX(config->base, (uint32_t)data->write, request->data_len, 0);
|
||||
SY1XX_UDMA_START_TX(config->base, (uint32_t)data->write, request->data_len, 0);
|
||||
|
||||
/* success */
|
||||
return 0;
|
||||
|
@ -207,14 +207,14 @@ int32_t drivers_uart_write(const struct device *dev, uartTransfer_t *request)
|
|||
/*
|
||||
* it should be avoided to read single characters only
|
||||
*/
|
||||
static int sensry_uart_poll_in(const struct device *dev, unsigned char *c)
|
||||
static int sy1xx_uart_poll_in(const struct device *dev, unsigned char *c)
|
||||
{
|
||||
uartTransfer_t request = {
|
||||
sy1xx_uartTransfer_t request = {
|
||||
.data_len = 1,
|
||||
.data = c,
|
||||
};
|
||||
|
||||
if (0 == drivers_uart_read(dev, &request)) {
|
||||
if (0 == sy1xx_uart_read(dev, &request)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -224,21 +224,21 @@ static int sensry_uart_poll_in(const struct device *dev, unsigned char *c)
|
|||
/*
|
||||
* it should be avoided to write single characters only
|
||||
*/
|
||||
static void sensry_uart_poll_out(const struct device *dev, unsigned char c)
|
||||
static void sy1xx_uart_poll_out(const struct device *dev, unsigned char c)
|
||||
{
|
||||
uartTransfer_t request = {
|
||||
sy1xx_uartTransfer_t request = {
|
||||
.data_len = 1,
|
||||
.data = &c,
|
||||
};
|
||||
|
||||
while (1) {
|
||||
if (0 == drivers_uart_write(dev, &request)) {
|
||||
if (0 == sy1xx_uart_write(dev, &request)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int sensry_uart_err_check(const struct device *dev)
|
||||
static int sy1xx_uart_err_check(const struct device *dev)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
|
@ -256,47 +256,51 @@ static int sy1xx_uart_init(const struct device *dev)
|
|||
}
|
||||
|
||||
/* UDMA clock enable */
|
||||
drivers_udma_enable_clock(DRIVERS_UDMA_UART, config->inst);
|
||||
sy1xx_udma_enable_clock(SY1XX_UDMA_MODULE_UART, config->inst);
|
||||
|
||||
/* PAD config */
|
||||
uint32_t pad_config_tx =
|
||||
PAD_CONFIG(0, PAD_SMT_DISABLE, PAD_SLEW_LOW, PAD_PULLUP_DIS, PAD_PULLDOWN_DIS,
|
||||
PAD_DRIVE_2PF, PAD_PMOD_NORMAL, PAD_DIR_OUTPUT);
|
||||
SY1XX_PAD_CONFIG(0, SY1XX_PAD_SMT_DISABLE, SY1XX_PAD_SLEW_LOW, SY1XX_PAD_PULLUP_DIS,
|
||||
SY1XX_PAD_PULLDOWN_DIS, SY1XX_PAD_DRIVE_2PF, SY1XX_PAD_PMOD_NORMAL,
|
||||
SY1XX_PAD_DIR_OUTPUT);
|
||||
|
||||
uint32_t pad_config_rx =
|
||||
PAD_CONFIG(8, PAD_SMT_DISABLE, PAD_SLEW_LOW, PAD_PULLUP_DIS, PAD_PULLDOWN_DIS,
|
||||
PAD_DRIVE_2PF, PAD_PMOD_NORMAL, PAD_DIR_INPUT);
|
||||
SY1XX_PAD_CONFIG(8, SY1XX_PAD_SMT_DISABLE, SY1XX_PAD_SLEW_LOW, SY1XX_PAD_PULLUP_DIS,
|
||||
SY1XX_PAD_PULLDOWN_DIS, SY1XX_PAD_DRIVE_2PF, SY1XX_PAD_PMOD_NORMAL,
|
||||
SY1XX_PAD_DIR_INPUT);
|
||||
|
||||
uint32_t pad_config_cts =
|
||||
PAD_CONFIG(16, PAD_SMT_DISABLE, PAD_SLEW_LOW, PAD_PULLUP_EN, PAD_PULLDOWN_DIS,
|
||||
PAD_DRIVE_2PF, PAD_PMOD_NORMAL, PAD_DIR_INPUT);
|
||||
SY1XX_PAD_CONFIG(16, SY1XX_PAD_SMT_DISABLE, SY1XX_PAD_SLEW_LOW, SY1XX_PAD_PULLUP_EN,
|
||||
SY1XX_PAD_PULLDOWN_DIS, SY1XX_PAD_DRIVE_2PF, SY1XX_PAD_PMOD_NORMAL,
|
||||
SY1XX_PAD_DIR_INPUT);
|
||||
|
||||
uint32_t pad_config_rts =
|
||||
PAD_CONFIG(24, PAD_SMT_DISABLE, PAD_SLEW_LOW, PAD_PULLUP_DIS, PAD_PULLDOWN_DIS,
|
||||
PAD_DRIVE_2PF, PAD_PMOD_NORMAL, PAD_DIR_OUTPUT);
|
||||
SY1XX_PAD_CONFIG(24, SY1XX_PAD_SMT_DISABLE, SY1XX_PAD_SLEW_LOW,
|
||||
SY1XX_PAD_PULLUP_DIS, SY1XX_PAD_PULLDOWN_DIS, SY1XX_PAD_DRIVE_2PF,
|
||||
SY1XX_PAD_PMOD_NORMAL, SY1XX_PAD_DIR_OUTPUT);
|
||||
|
||||
sys_write32((pad_config_tx | pad_config_rx | pad_config_cts | pad_config_rts),
|
||||
PAD_CONFIG_ADDR_UART + (config->inst * 4 + 0));
|
||||
SY1XX_PAD_CONFIG_ADDR_UART + (config->inst * 4 + 0));
|
||||
|
||||
uartConfig_t default_config = {
|
||||
sy1xx_uartConfig_t default_config = {
|
||||
.baudrate = 1000000,
|
||||
.parity = DRIVERS_UART_PAR_NONE,
|
||||
.stopbits = DRIVERS_UART_STOP_1,
|
||||
};
|
||||
|
||||
UDMA_CANCEL_RX(config->base);
|
||||
UDMA_CANCEL_TX(config->base);
|
||||
SY1XX_UDMA_CANCEL_RX(config->base);
|
||||
SY1XX_UDMA_CANCEL_TX(config->base);
|
||||
|
||||
drivers_uart_configure(dev, &default_config);
|
||||
sy1xx_uart_configure(dev, &default_config);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct uart_driver_api sy1xx_uart_driver_api = {
|
||||
|
||||
.poll_in = sensry_uart_poll_in,
|
||||
.poll_out = sensry_uart_poll_out,
|
||||
.err_check = sensry_uart_err_check,
|
||||
.poll_in = sy1xx_uart_poll_in,
|
||||
.poll_out = sy1xx_uart_poll_out,
|
||||
.err_check = sy1xx_uart_err_check,
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -17,80 +17,81 @@
|
|||
|
||||
#define SY1XX_MINIMUM_ALLOWED_TICK 1000
|
||||
|
||||
#define REG_TIMER_CMP_LO_OFFS 0x10
|
||||
#define SY1XX_REG_TIMER_CMP_LO_OFFS 0x10
|
||||
|
||||
/* config bits */
|
||||
#define PLP_TIMER_ENABLE_BIT 0
|
||||
#define PLP_TIMER_RESET_BIT 1
|
||||
#define PLP_TIMER_IRQ_ENABLE_BIT 2
|
||||
#define PLP_TIMER_IEM_BIT 3
|
||||
#define PLP_TIMER_CMP_CLR_BIT 4
|
||||
#define PLP_TIMER_ONE_SHOT_BIT 5
|
||||
#define PLP_TIMER_PRESCALER_ENABLE_BIT 6
|
||||
#define PLP_TIMER_CLOCK_SOURCE_BIT 7
|
||||
#define PLP_TIMER_PRESCALER_VALUE_BIT 8
|
||||
#define PLP_TIMER_PRESCALER_VALUE_BITS 8
|
||||
#define PLP_TIMER_64_BIT 31
|
||||
#define SY1XX_TIMER_ENABLE_BIT 0
|
||||
#define SY1XX_TIMER_RESET_BIT 1
|
||||
#define SY1XX_TIMER_IRQ_ENABLE_BIT 2
|
||||
#define SY1XX_TIMER_IEM_BIT 3
|
||||
#define SY1XX_TIMER_CMP_CLR_BIT 4
|
||||
#define SY1XX_TIMER_ONE_SHOT_BIT 5
|
||||
#define SY1XX_TIMER_PRESCALER_ENABLE_BIT 6
|
||||
#define SY1XX_TIMER_CLOCK_SOURCE_BIT 7
|
||||
#define SY1XX_TIMER_PRESCALER_VALUE_BIT 8
|
||||
#define SY1XX_TIMER_PRESCALER_VALUE_BITS 8
|
||||
#define SY1XX_TIMER_64_BIT 31
|
||||
|
||||
/* config flags */
|
||||
#define PLP_TIMER_ACTIVE 1
|
||||
#define PLP_TIMER_IDLE 0
|
||||
#define SY1XX_TIMER_ACTIVE 1
|
||||
#define SY1XX_TIMER_IDLE 0
|
||||
|
||||
#define PLP_TIMER_RESET_ENABLED 1
|
||||
#define PLP_TIMER_RESET_DISABLED 0
|
||||
#define SY1XX_TIMER_RESET_ENABLED 1
|
||||
#define SY1XX_TIMER_RESET_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_IRQ_ENABLED 1
|
||||
#define PLP_TIMER_IRQ_DISABLED 0
|
||||
#define SY1XX_TIMER_IRQ_ENABLED 1
|
||||
#define SY1XX_TIMER_IRQ_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_IEM_ENABLED 1
|
||||
#define PLP_TIMER_IEM_DISABLED 0
|
||||
#define SY1XX_TIMER_IEM_ENABLED 1
|
||||
#define SY1XX_TIMER_IEM_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_CMPCLR_ENABLED 1
|
||||
#define PLP_TIMER_CMPCLR_DISABLED 0
|
||||
#define SY1XX_TIMER_CMPCLR_ENABLED 1
|
||||
#define SY1XX_TIMER_CMPCLR_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_ONE_SHOT_ENABLED 1
|
||||
#define PLP_TIMER_ONE_SHOT_DISABLED 0
|
||||
#define SY1XX_TIMER_ONE_SHOT_ENABLED 1
|
||||
#define SY1XX_TIMER_ONE_SHOT_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_REFCLK_ENABLED 1
|
||||
#define PLP_TIMER_REFCLK_DISABLED 0
|
||||
#define SY1XX_TIMER_REFCLK_ENABLED 1
|
||||
#define SY1XX_TIMER_REFCLK_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_PRESCALER_ENABLED 1
|
||||
#define PLP_TIMER_PRESCALER_DISABLED 0
|
||||
#define SY1XX_TIMER_PRESCALER_ENABLED 1
|
||||
#define SY1XX_TIMER_PRESCALER_DISABLED 0
|
||||
|
||||
#define PLP_TIMER_MODE_64_ENABLED 1
|
||||
#define PLP_TIMER_MODE_64_DISABLED 0
|
||||
#define SY1XX_TIMER_MODE_64_ENABLED 1
|
||||
#define SY1XX_TIMER_MODE_64_DISABLED 0
|
||||
|
||||
static volatile uint32_t current_sys_clock;
|
||||
|
||||
struct timer_cfg {
|
||||
struct sy1xx_timer_cfg {
|
||||
uint32_t tick_us;
|
||||
};
|
||||
|
||||
static inline unsigned int timer_conf_prep(int enable, int reset, int irq_enable, int event_mask,
|
||||
int cmp_clr, int one_shot, int clk_source,
|
||||
int prescaler_enable, int prescaler, int mode_64)
|
||||
static inline unsigned int sy1xx_timer_conf_prep(int enable, int reset, int irq_enable,
|
||||
int event_mask, int cmp_clr, int one_shot,
|
||||
int clk_source, int prescaler_enable,
|
||||
int prescaler, int mode_64)
|
||||
{
|
||||
return (enable << PLP_TIMER_ENABLE_BIT) | (reset << PLP_TIMER_RESET_BIT) |
|
||||
(irq_enable << PLP_TIMER_IRQ_ENABLE_BIT) | (event_mask << PLP_TIMER_IEM_BIT) |
|
||||
(cmp_clr << PLP_TIMER_CMP_CLR_BIT) | (one_shot << PLP_TIMER_ONE_SHOT_BIT) |
|
||||
(clk_source << PLP_TIMER_CLOCK_SOURCE_BIT) |
|
||||
(prescaler_enable << PLP_TIMER_PRESCALER_ENABLE_BIT) |
|
||||
(prescaler << PLP_TIMER_PRESCALER_VALUE_BIT) | (mode_64 << PLP_TIMER_64_BIT);
|
||||
return (enable << SY1XX_TIMER_ENABLE_BIT) | (reset << SY1XX_TIMER_RESET_BIT) |
|
||||
(irq_enable << SY1XX_TIMER_IRQ_ENABLE_BIT) | (event_mask << SY1XX_TIMER_IEM_BIT) |
|
||||
(cmp_clr << SY1XX_TIMER_CMP_CLR_BIT) | (one_shot << SY1XX_TIMER_ONE_SHOT_BIT) |
|
||||
(clk_source << SY1XX_TIMER_CLOCK_SOURCE_BIT) |
|
||||
(prescaler_enable << SY1XX_TIMER_PRESCALER_ENABLE_BIT) |
|
||||
(prescaler << SY1XX_TIMER_PRESCALER_VALUE_BIT) | (mode_64 << SY1XX_TIMER_64_BIT);
|
||||
}
|
||||
|
||||
static void sy1xx_sys_timer_reload(uint32_t base, uint32_t reload_timer_ticks)
|
||||
{
|
||||
sys_write32(reload_timer_ticks, (base + REG_TIMER_CMP_LO_OFFS));
|
||||
sys_write32(reload_timer_ticks, (base + SY1XX_REG_TIMER_CMP_LO_OFFS));
|
||||
}
|
||||
|
||||
static void sy1xx_sys_timer_cfg_auto_reload(uint32_t base)
|
||||
{
|
||||
|
||||
uint32_t conf =
|
||||
timer_conf_prep(PLP_TIMER_ACTIVE, PLP_TIMER_RESET_ENABLED, PLP_TIMER_IRQ_ENABLED,
|
||||
PLP_TIMER_IEM_DISABLED, PLP_TIMER_CMPCLR_ENABLED,
|
||||
PLP_TIMER_ONE_SHOT_DISABLED, PLP_TIMER_REFCLK_ENABLED,
|
||||
PLP_TIMER_PRESCALER_DISABLED, 0, PLP_TIMER_MODE_64_DISABLED);
|
||||
uint32_t conf = sy1xx_timer_conf_prep(
|
||||
SY1XX_TIMER_ACTIVE, SY1XX_TIMER_RESET_ENABLED, SY1XX_TIMER_IRQ_ENABLED,
|
||||
SY1XX_TIMER_IEM_DISABLED, SY1XX_TIMER_CMPCLR_ENABLED, SY1XX_TIMER_ONE_SHOT_DISABLED,
|
||||
SY1XX_TIMER_REFCLK_ENABLED, SY1XX_TIMER_PRESCALER_DISABLED, 0,
|
||||
SY1XX_TIMER_MODE_64_DISABLED);
|
||||
|
||||
sys_write32(conf, base);
|
||||
}
|
||||
|
@ -105,7 +106,7 @@ static void sy1xx_sys_timer_irq_disable(void)
|
|||
soc_disable_irq(DT_IRQN(SY1XX_SYS_TIMER_NODE));
|
||||
}
|
||||
|
||||
static int32_t sy1xx_sys_timer_config(uint32_t base, struct timer_cfg *cfg)
|
||||
static int32_t sy1xx_sys_timer_config(uint32_t base, struct sy1xx_timer_cfg *cfg)
|
||||
{
|
||||
|
||||
/* global irq disable */
|
||||
|
@ -118,11 +119,12 @@ static int32_t sy1xx_sys_timer_config(uint32_t base, struct timer_cfg *cfg)
|
|||
/* expect 1.0ms resolution => tick_us = 1000 */
|
||||
uint32_t us = cfg->tick_us;
|
||||
volatile double ticks_f =
|
||||
(((double)us / (double)1000000) * (double)soc_get_rts_clock_frequency()) + 1.0;
|
||||
(((double)us / (double)1000000) * (double)sy1xx_soc_get_rts_clock_frequency()) +
|
||||
1.0;
|
||||
|
||||
volatile uint32_t timer_ticks = (uint32_t)ticks_f;
|
||||
|
||||
printk("timer [%d] expected %u (%d)\n", soc_get_rts_clock_frequency(), cfg->tick_us,
|
||||
printk("timer [%d] expected %u (%d)\n", sy1xx_soc_get_rts_clock_frequency(), cfg->tick_us,
|
||||
timer_ticks);
|
||||
|
||||
sy1xx_sys_timer_reload(base, timer_ticks);
|
||||
|
@ -159,7 +161,7 @@ static int sy1xx_sys_timer_init(void)
|
|||
{
|
||||
printk("starting sys_timer\n");
|
||||
|
||||
struct timer_cfg timerCfg0 = {
|
||||
struct sy1xx_timer_cfg timerCfg0 = {
|
||||
.tick_us = DT_PROP(SY1XX_SYS_TIMER_NODE, ticks_us),
|
||||
};
|
||||
|
||||
|
|
|
@ -6,39 +6,39 @@
|
|||
#ifndef GANYMED_SY1XX_PAD_CTRL_H
|
||||
#define GANYMED_SY1XX_PAD_CTRL_H
|
||||
|
||||
#define PAD_CONFIG(pin_offset, SMT, SLEW, PULLUP, PULLDOWN, DRV, PMOD, DIR) \
|
||||
#define SY1XX_PAD_CONFIG(pin_offset, SMT, SLEW, PULLUP, PULLDOWN, DRV, PMOD, DIR) \
|
||||
(((SMT << 7) | (SLEW << 6) | (PULLUP << 5) | (PULLDOWN << 4) | (DRV << 2) | (PMOD << 1) | \
|
||||
DIR) \
|
||||
<< pin_offset)
|
||||
|
||||
#define PAD_CONFIG_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
#define SY1XX_PAD_CONFIG_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
|
||||
#define PAD_CONFIG_ADDR_UART (PAD_CONFIG_ADDR + 0x020)
|
||||
#define PAD_CONFIG_ADDR_SPI (PAD_CONFIG_ADDR + 0x02c)
|
||||
#define PAD_CONFIG_ADDR_I2C (PAD_CONFIG_ADDR + 0x100)
|
||||
#define PAD_CONFIG_ADDR_MAC (PAD_CONFIG_ADDR + 0x130)
|
||||
#define SY1XX_PAD_CONFIG_ADDR_UART (SY1XX_PAD_CONFIG_ADDR + 0x020)
|
||||
#define SY1XX_PAD_CONFIG_ADDR_SPI (SY1XX_PAD_CONFIG_ADDR + 0x02c)
|
||||
#define SY1XX_PAD_CONFIG_ADDR_I2C (SY1XX_PAD_CONFIG_ADDR + 0x100)
|
||||
#define SY1XX_PAD_CONFIG_ADDR_MAC (SY1XX_PAD_CONFIG_ADDR + 0x130)
|
||||
|
||||
#define PAD_SMT_DISABLE 0
|
||||
#define PAD_SMT_ENABLE 1
|
||||
#define SY1XX_PAD_SMT_DISABLE 0
|
||||
#define SY1XX_PAD_SMT_ENABLE 1
|
||||
|
||||
#define PAD_SLEW_LOW 0
|
||||
#define PAD_SLEW_HIGH 1
|
||||
#define SY1XX_PAD_SLEW_LOW 0
|
||||
#define SY1XX_PAD_SLEW_HIGH 1
|
||||
|
||||
#define PAD_PULLUP_DIS 0
|
||||
#define PAD_PULLUP_EN 1
|
||||
#define SY1XX_PAD_PULLUP_DIS 0
|
||||
#define SY1XX_PAD_PULLUP_EN 1
|
||||
|
||||
#define PAD_PULLDOWN_DIS 0
|
||||
#define PAD_PULLDOWN_EN 1
|
||||
#define SY1XX_PAD_PULLDOWN_DIS 0
|
||||
#define SY1XX_PAD_PULLDOWN_EN 1
|
||||
|
||||
#define PAD_DRIVE_2PF 0
|
||||
#define PAD_DRIVE_4PF 1
|
||||
#define PAD_DRIVE_8PF 2
|
||||
#define PAD_DRIVE_16PF 3
|
||||
#define SY1XX_PAD_DRIVE_2PF 0
|
||||
#define SY1XX_PAD_DRIVE_4PF 1
|
||||
#define SY1XX_PAD_DRIVE_8PF 2
|
||||
#define SY1XX_PAD_DRIVE_16PF 3
|
||||
|
||||
#define PAD_PMOD_NORMAL 0
|
||||
#define PAD_PMOD_TRISTATE 1
|
||||
#define SY1XX_PAD_PMOD_NORMAL 0
|
||||
#define SY1XX_PAD_PMOD_TRISTATE 1
|
||||
|
||||
#define PAD_DIR_OUTPUT 0
|
||||
#define PAD_DIR_INPUT 1
|
||||
#define SY1XX_PAD_DIR_OUTPUT 0
|
||||
#define SY1XX_PAD_DIR_INPUT 1
|
||||
|
||||
#endif /* GANYMED_SY1XX_PAD_CTRL_H */
|
||||
|
|
|
@ -15,33 +15,33 @@ LOG_MODULE_REGISTER(soc);
|
|||
#include "soc.h"
|
||||
|
||||
/* ITC */
|
||||
#define ARCHI_ITC_MASK_OFFSET 0x0
|
||||
#define ARCHI_ITC_MASK_SET_OFFSET 0x4
|
||||
#define ARCHI_ITC_MASK_CLR_OFFSET 0x8
|
||||
#define ARCHI_ITC_STATUS_OFFSET 0xc
|
||||
#define ARCHI_ITC_STATUS_SET_OFFSET 0x10
|
||||
#define ARCHI_ITC_STATUS_CLR_OFFSET 0x14
|
||||
#define ARCHI_ITC_ACK_OFFSET 0x18
|
||||
#define ARCHI_ITC_ACK_SET_OFFSET 0x1c
|
||||
#define ARCHI_ITC_ACK_CLR_OFFSET 0x20
|
||||
#define ARCHI_ITC_FIFO_OFFSET 0x24
|
||||
#define SY1XX_ARCHI_ITC_MASK_OFFSET 0x0
|
||||
#define SY1XX_ARCHI_ITC_MASK_SET_OFFSET 0x4
|
||||
#define SY1XX_ARCHI_ITC_MASK_CLR_OFFSET 0x8
|
||||
#define SY1XX_ARCHI_ITC_STATUS_OFFSET 0xc
|
||||
#define SY1XX_ARCHI_ITC_STATUS_SET_OFFSET 0x10
|
||||
#define SY1XX_ARCHI_ITC_STATUS_CLR_OFFSET 0x14
|
||||
#define SY1XX_ARCHI_ITC_ACK_OFFSET 0x18
|
||||
#define SY1XX_ARCHI_ITC_ACK_SET_OFFSET 0x1c
|
||||
#define SY1XX_ARCHI_ITC_ACK_CLR_OFFSET 0x20
|
||||
#define SY1XX_ARCHI_ITC_FIFO_OFFSET 0x24
|
||||
|
||||
void sys_arch_reboot(int type)
|
||||
{
|
||||
ARG_UNUSED(type);
|
||||
}
|
||||
|
||||
#define ARCHI_REF_CLOCK (32768)
|
||||
#define ARCHI_PER_CLOCK (125000000)
|
||||
#define SY1XX_ARCHI_REF_CLOCK (32768)
|
||||
#define SY1XX_ARCHI_PER_CLOCK (125000000)
|
||||
|
||||
uint32_t soc_get_rts_clock_frequency(void)
|
||||
uint32_t sy1xx_soc_get_rts_clock_frequency(void)
|
||||
{
|
||||
return ARCHI_REF_CLOCK;
|
||||
return SY1XX_ARCHI_REF_CLOCK;
|
||||
}
|
||||
|
||||
uint32_t soc_get_peripheral_clock(void)
|
||||
uint32_t sy1xx_soc_get_peripheral_clock(void)
|
||||
{
|
||||
return ARCHI_PER_CLOCK;
|
||||
return SY1XX_ARCHI_PER_CLOCK;
|
||||
}
|
||||
|
||||
void riscv_clic_irq_priority_set(uint32_t irq, uint32_t prio, uint32_t flags)
|
||||
|
@ -51,17 +51,18 @@ void riscv_clic_irq_priority_set(uint32_t irq, uint32_t prio, uint32_t flags)
|
|||
|
||||
void soc_enable_irq(uint32_t idx)
|
||||
{
|
||||
uint32_t current = sys_read32(ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_SET_OFFSET);
|
||||
uint32_t current = sys_read32(SY1XX_ARCHI_FC_ITC_ADDR + SY1XX_ARCHI_ITC_MASK_SET_OFFSET);
|
||||
|
||||
sys_write32(current | (1 << (idx & 0x1f)), ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_SET_OFFSET);
|
||||
sys_write32(current | (1 << (idx & 0x1f)),
|
||||
SY1XX_ARCHI_FC_ITC_ADDR + SY1XX_ARCHI_ITC_MASK_SET_OFFSET);
|
||||
}
|
||||
|
||||
void soc_disable_irq(uint32_t idx)
|
||||
{
|
||||
uint32_t current = sys_read32(ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
uint32_t current = sys_read32(SY1XX_ARCHI_FC_ITC_ADDR + SY1XX_ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
|
||||
sys_write32(current & (~(1 << (idx & 0x1f))),
|
||||
ARCHI_FC_ITC_ADDR + ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
SY1XX_ARCHI_FC_ITC_ADDR + SY1XX_ARCHI_ITC_MASK_CLR_OFFSET);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -82,10 +83,10 @@ void soc_interrupt_init(void)
|
|||
*
|
||||
* @return 0
|
||||
*/
|
||||
static int soc_sy1xx_init(void)
|
||||
static int sy1xx_soc_init(void)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SYS_INIT(soc_sy1xx_init, PRE_KERNEL_1, 0);
|
||||
SYS_INIT(sy1xx_soc_init, PRE_KERNEL_1, 0);
|
||||
|
|
|
@ -12,33 +12,34 @@
|
|||
|
||||
/* SOC PERIPHERALS */
|
||||
|
||||
#define ARCHI_SOC_PERIPHERALS_ADDR 0x1A100000
|
||||
#define SY1XX_ARCHI_SOC_PERIPHERALS_ADDR 0x1A100000
|
||||
|
||||
#define ARCHI_GPIO_OFFSET 0x00001000
|
||||
#define ARCHI_UDMA_OFFSET 0x00002000
|
||||
#define ARCHI_APB_SOC_CTRL_OFFSET 0x00004000
|
||||
#define ARCHI_SOC_EU_OFFSET 0x00006000
|
||||
#define ARCHI_FC_ITC_OFFSET 0x00009800
|
||||
#define ARCHI_FC_TIMER_OFFSET 0x0000B000
|
||||
#define ARCHI_STDOUT_OFFSET 0x0000F000
|
||||
#define SY1XX_ARCHI_GPIO_OFFSET 0x00001000
|
||||
#define SY1XX_ARCHI_UDMA_OFFSET 0x00002000
|
||||
#define SY1XX_ARCHI_APB_SOC_CTRL_OFFSET 0x00004000
|
||||
#define SY1XX_ARCHI_SOC_EU_OFFSET 0x00006000
|
||||
#define SY1XX_ARCHI_FC_ITC_OFFSET 0x00009800
|
||||
#define SY1XX_ARCHI_FC_TIMER_OFFSET 0x0000B000
|
||||
#define SY1XX_ARCHI_STDOUT_OFFSET 0x0000F000
|
||||
|
||||
#define ARCHI_GPIO_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_GPIO_OFFSET)
|
||||
#define ARCHI_UDMA_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET)
|
||||
#define ARCHI_APB_SOC_CTRL_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
#define ARCHI_SOC_EU_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_SOC_EU_OFFSET)
|
||||
#define ARCHI_FC_ITC_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_FC_ITC_OFFSET)
|
||||
#define ARCHI_FC_TIMER_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_FC_TIMER_OFFSET)
|
||||
#define ARCHI_STDOUT_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_STDOUT_OFFSET)
|
||||
#define SY1XX_ARCHI_GPIO_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_GPIO_OFFSET)
|
||||
#define SY1XX_ARCHI_UDMA_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_UDMA_OFFSET)
|
||||
#define SY1XX_ARCHI_APB_SOC_CTRL_ADDR \
|
||||
(SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_APB_SOC_CTRL_OFFSET)
|
||||
#define SY1XX_ARCHI_SOC_EU_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_SOC_EU_OFFSET)
|
||||
#define SY1XX_ARCHI_FC_ITC_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_FC_ITC_OFFSET)
|
||||
#define SY1XX_ARCHI_FC_TIMER_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_FC_TIMER_OFFSET)
|
||||
#define SY1XX_ARCHI_STDOUT_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_STDOUT_OFFSET)
|
||||
|
||||
#define ARCHI_PLL_ADDR (ARCHI_SOC_PERIPHERALS_ADDR)
|
||||
#define ARCHI_SECURE_MRAM_CTRL_ADDR 0x1D180000
|
||||
#define ARCHI_GLOBAL_MRAM_CTRL_ADDR 0x1E080000
|
||||
#define ARCHI_MRAM_EFUSE_ADDR 0x1D070100
|
||||
#define ARCHI_TSN_ADDR 0x1A120000
|
||||
#define ARCHI_CAN_ADDR 0x1A130000
|
||||
#define SY1XX_ARCHI_PLL_ADDR (SY1XX_ARCHI_SOC_PERIPHERALS_ADDR)
|
||||
#define SY1XX_ARCHI_SECURE_MRAM_CTRL_ADDR 0x1D180000
|
||||
#define SY1XX_ARCHI_GLOBAL_MRAM_CTRL_ADDR 0x1E080000
|
||||
#define SY1XX_ARCHI_MRAM_EFUSE_ADDR 0x1D070100
|
||||
#define SY1XX_ARCHI_TSN_ADDR 0x1A120000
|
||||
#define SY1XX_ARCHI_CAN_ADDR 0x1A130000
|
||||
|
||||
uint32_t soc_get_rts_clock_frequency(void);
|
||||
uint32_t soc_get_peripheral_clock(void);
|
||||
uint32_t sy1xx_soc_get_rts_clock_frequency(void);
|
||||
uint32_t sy1xx_soc_get_peripheral_clock(void);
|
||||
|
||||
void soc_enable_irq(uint32_t idx);
|
||||
void soc_disable_irq(uint32_t idx);
|
||||
|
|
|
@ -6,98 +6,98 @@
|
|||
#include "soc.h"
|
||||
#include "udma.h"
|
||||
|
||||
#define UDMA_CTRL_PER_CG (ARCHI_UDMA_ADDR + UDMA_CONF_OFFSET)
|
||||
#define SY1XX_UDMA_CTRL_PER_CG (SY1XX_ARCHI_UDMA_ADDR + SY1XX_UDMA_CONF_OFFSET)
|
||||
|
||||
#define DRIVERS_MAX_UART_COUNT 3
|
||||
#define DRIVERS_MAX_I2C_COUNT 4
|
||||
#define DRIVERS_MAX_SPI_COUNT 7
|
||||
#define DEVICE_MAX_ETH_COUNT 1
|
||||
#define SY1XX_MAX_UART_COUNT 3
|
||||
#define SY1XX_MAX_I2C_COUNT 4
|
||||
#define SY1XX_MAX_SPI_COUNT 7
|
||||
#define SY1XX_MAX_ETH_COUNT 1
|
||||
|
||||
void drivers_udma_enable_clock(udma_module_t module, uint32_t instance)
|
||||
void sy1xx_udma_enable_clock(sy1xx_udma_module_t module, uint32_t instance)
|
||||
{
|
||||
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(UDMA_CTRL_PER_CG);
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(SY1XX_UDMA_CTRL_PER_CG);
|
||||
|
||||
switch (module) {
|
||||
|
||||
case DRIVERS_UDMA_UART:
|
||||
if (instance >= DRIVERS_MAX_UART_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_UART:
|
||||
if (instance >= SY1XX_MAX_UART_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 0);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_I2C:
|
||||
if (instance >= DRIVERS_MAX_I2C_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_I2C:
|
||||
if (instance >= SY1XX_MAX_I2C_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 10);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_SPI:
|
||||
if (instance >= DRIVERS_MAX_SPI_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_SPI:
|
||||
if (instance >= SY1XX_MAX_SPI_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 3);
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_MAC:
|
||||
if (instance >= DEVICE_MAX_ETH_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_MAC:
|
||||
if (instance >= SY1XX_MAX_ETH_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg |= 1 << (instance + 20);
|
||||
break;
|
||||
|
||||
case DRIVERS_MAX_UDMA_COUNT:
|
||||
case SY1XX_UDMA_MAX_MODULE_COUNT:
|
||||
break;
|
||||
}
|
||||
|
||||
sys_write32(udma_ctrl_per_cg, UDMA_CTRL_PER_CG);
|
||||
sys_write32(udma_ctrl_per_cg, SY1XX_UDMA_CTRL_PER_CG);
|
||||
}
|
||||
|
||||
void drivers_udma_disable_clock(udma_module_t module, uint32_t instance)
|
||||
void sy1xx_udma_disable_clock(sy1xx_udma_module_t module, uint32_t instance)
|
||||
{
|
||||
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(UDMA_CTRL_PER_CG);
|
||||
uint32_t udma_ctrl_per_cg = sys_read32(SY1XX_UDMA_CTRL_PER_CG);
|
||||
|
||||
switch (module) {
|
||||
|
||||
case DRIVERS_UDMA_UART:
|
||||
if (instance >= DRIVERS_MAX_UART_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_UART:
|
||||
if (instance >= SY1XX_MAX_UART_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 0));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_I2C:
|
||||
if (instance >= DRIVERS_MAX_I2C_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_I2C:
|
||||
if (instance >= SY1XX_MAX_I2C_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 10));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_SPI:
|
||||
if (instance >= DRIVERS_MAX_SPI_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_SPI:
|
||||
if (instance >= SY1XX_MAX_SPI_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 3));
|
||||
break;
|
||||
|
||||
case DRIVERS_UDMA_MAC:
|
||||
if (instance >= DEVICE_MAX_ETH_COUNT) {
|
||||
case SY1XX_UDMA_MODULE_MAC:
|
||||
if (instance >= SY1XX_MAX_ETH_COUNT) {
|
||||
return;
|
||||
}
|
||||
udma_ctrl_per_cg &= ~(1 << (instance + 20));
|
||||
break;
|
||||
|
||||
case DRIVERS_MAX_UDMA_COUNT:
|
||||
case SY1XX_UDMA_MAX_MODULE_COUNT:
|
||||
break;
|
||||
}
|
||||
|
||||
sys_write32(udma_ctrl_per_cg, UDMA_CTRL_PER_CG);
|
||||
sys_write32(udma_ctrl_per_cg, SY1XX_UDMA_CTRL_PER_CG);
|
||||
}
|
||||
|
||||
void drivers_udma_busy_delay(uint32_t msec)
|
||||
void sy1xx_udma_busy_delay(uint32_t msec)
|
||||
{
|
||||
uint32_t sec = 250000000;
|
||||
uint32_t millis = (sec / 1000) * msec;
|
||||
|
@ -107,32 +107,35 @@ void drivers_udma_busy_delay(uint32_t msec)
|
|||
}
|
||||
}
|
||||
|
||||
int32_t drivers_udma_cancel(uint32_t base, uint32_t channel)
|
||||
int32_t sy1xx_udma_cancel(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
/* clear existing */
|
||||
UDMA_WRITE_REG(base, UDMA_CFG_REG + channel_offset, UDMA_CHANNEL_CFG_CLEAR);
|
||||
SY1XX_UDMA_WRITE_REG(base, SY1XX_UDMA_CFG_REG + channel_offset,
|
||||
SY1XX_UDMA_CHANNEL_CFG_CLEAR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_is_ready(uint32_t base, uint32_t channel)
|
||||
int32_t sy1xx_udma_is_ready(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
int32_t isBusy = UDMA_READ_REG(base, UDMA_CFG_REG + channel_offset) & (UDMA_CHANNEL_CFG_EN);
|
||||
int32_t isBusy = SY1XX_UDMA_READ_REG(base, SY1XX_UDMA_CFG_REG + channel_offset) &
|
||||
(SY1XX_UDMA_CHANNEL_CFG_EN);
|
||||
|
||||
return isBusy ? 0 : 1;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_wait_for_finished(uint32_t base, uint32_t channel)
|
||||
int32_t sy1xx_udma_wait_for_finished(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
volatile uint32_t timeout = 200;
|
||||
|
||||
while (UDMA_READ_REG(base, UDMA_CFG_REG + channel_offset) & (UDMA_CHANNEL_CFG_EN)) {
|
||||
drivers_udma_busy_delay(1);
|
||||
while (SY1XX_UDMA_READ_REG(base, SY1XX_UDMA_CFG_REG + channel_offset) &
|
||||
(SY1XX_UDMA_CHANNEL_CFG_EN)) {
|
||||
sy1xx_udma_busy_delay(1);
|
||||
timeout--;
|
||||
if (timeout == 0) {
|
||||
return -1;
|
||||
|
@ -142,13 +145,13 @@ int32_t drivers_udma_wait_for_finished(uint32_t base, uint32_t channel)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_wait_for_status(uint32_t base)
|
||||
int32_t sy1xx_udma_wait_for_status(uint32_t base)
|
||||
{
|
||||
|
||||
volatile uint32_t timeout = 200;
|
||||
|
||||
while (UDMA_READ_REG(base, UDMA_STATUS) & (0x3)) {
|
||||
drivers_udma_busy_delay(1);
|
||||
while (SY1XX_UDMA_READ_REG(base, SY1XX_UDMA_STATUS) & (0x3)) {
|
||||
sy1xx_udma_busy_delay(1);
|
||||
timeout--;
|
||||
if (timeout == 0) {
|
||||
return -1;
|
||||
|
@ -158,23 +161,24 @@ int32_t drivers_udma_wait_for_status(uint32_t base)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
int32_t sy1xx_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
uint32_t optional_cfg)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
UDMA_WRITE_REG(base, UDMA_SADDR_REG + channel_offset, saddr);
|
||||
UDMA_WRITE_REG(base, UDMA_SIZE_REG + channel_offset, size);
|
||||
UDMA_WRITE_REG(base, UDMA_CFG_REG + channel_offset, UDMA_CHANNEL_CFG_EN | optional_cfg);
|
||||
SY1XX_UDMA_WRITE_REG(base, SY1XX_UDMA_SADDR_REG + channel_offset, saddr);
|
||||
SY1XX_UDMA_WRITE_REG(base, SY1XX_UDMA_SIZE_REG + channel_offset, size);
|
||||
SY1XX_UDMA_WRITE_REG(base, SY1XX_UDMA_CFG_REG + channel_offset,
|
||||
SY1XX_UDMA_CHANNEL_CFG_EN | optional_cfg);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int32_t drivers_udma_get_remaining(uint32_t base, uint32_t channel)
|
||||
int32_t sy1xx_udma_get_remaining(uint32_t base, uint32_t channel)
|
||||
{
|
||||
uint32_t channel_offset = channel == 0 ? 0x00 : 0x10;
|
||||
|
||||
int32_t size = UDMA_READ_REG(base, UDMA_SIZE_REG + channel_offset);
|
||||
int32_t size = SY1XX_UDMA_READ_REG(base, SY1XX_UDMA_SIZE_REG + channel_offset);
|
||||
|
||||
return size;
|
||||
}
|
||||
|
|
|
@ -11,21 +11,20 @@
|
|||
#include <soc.h>
|
||||
|
||||
/* UDMA */
|
||||
#define ARCHI_UDMA_ADDR (ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET)
|
||||
|
||||
#define UDMA_PERIPH_AREA_SIZE_LOG2 7
|
||||
#define UDMA_PERIPH_OFFSET(id) (((id) << UDMA_PERIPH_AREA_SIZE_LOG2))
|
||||
#define SY1XX_UDMA_PERIPH_AREA_SIZE_LOG2 7
|
||||
#define SY1XX_UDMA_PERIPH_OFFSET(id) (((id) << SY1XX_UDMA_PERIPH_AREA_SIZE_LOG2))
|
||||
|
||||
#define ARCHI_UDMA_UART_ID(id) (0 + (id))
|
||||
#define ARCHI_UDMA_SPIM_ID(id) (3 + (id))
|
||||
#define ARCHI_UDMA_I2C_ID(id) (10 + (id))
|
||||
#define ARCHI_UDMA_I2S_ID(id) (14 + (id))
|
||||
#define ARCHI_UDMA_HYPER_ID(id) (19 + (id))
|
||||
#define ARCHI_UDMA_TSN_ID(id) (20 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_UART_ID(id) (0 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_SPIM_ID(id) (3 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_I2C_ID(id) (10 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_I2S_ID(id) (14 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_HYPER_ID(id) (19 + (id))
|
||||
#define SY1XX_ARCHI_UDMA_TSN_ID(id) (20 + (id))
|
||||
|
||||
#define UDMA_CHANNEL_RX_OFFSET 0x00
|
||||
#define UDMA_CHANNEL_TX_OFFSET 0x10
|
||||
#define UDMA_CHANNEL_CUSTOM_OFFSET 0x20
|
||||
#define SY1XX_UDMA_CHANNEL_RX_OFFSET 0x00
|
||||
#define SY1XX_UDMA_CHANNEL_TX_OFFSET 0x10
|
||||
#define SY1XX_UDMA_CHANNEL_CUSTOM_OFFSET 0x20
|
||||
|
||||
/*
|
||||
* For each channel, the RX and TX part have the following registers
|
||||
|
@ -33,119 +32,119 @@
|
|||
*/
|
||||
|
||||
/* Start address register */
|
||||
#define UDMA_CHANNEL_SADDR_OFFSET 0x0
|
||||
#define SY1XX_UDMA_CHANNEL_SADDR_OFFSET 0x0
|
||||
/* Size register */
|
||||
#define UDMA_CHANNEL_SIZE_OFFSET 0x4
|
||||
#define SY1XX_UDMA_CHANNEL_SIZE_OFFSET 0x4
|
||||
/* Configuration register */
|
||||
#define UDMA_CHANNEL_CFG_OFFSET 0x8
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_OFFSET 0x8
|
||||
/* Int configuration register */
|
||||
#define UDMA_CHANNEL_INTCFG_OFFSET 0xC
|
||||
#define SY1XX_UDMA_CHANNEL_INTCFG_OFFSET 0xC
|
||||
|
||||
/*
|
||||
* The configuration register of the RX and TX parts for each channel can be accessed using the
|
||||
* following bits
|
||||
*/
|
||||
|
||||
#define UDMA_CHANNEL_CFG_SHADOW_BIT (5)
|
||||
#define UDMA_CHANNEL_CFG_CLEAR_BIT (5)
|
||||
#define UDMA_CHANNEL_CFG_EN_BIT (4)
|
||||
#define UDMA_CHANNEL_CFG_SIZE_BIT (1)
|
||||
#define UDMA_CHANNEL_CFG_CONT_BIT (0)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SHADOW_BIT (5)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_CLEAR_BIT (5)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_EN_BIT (4)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SIZE_BIT (1)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_CONT_BIT (0)
|
||||
|
||||
/* Indicates if a shadow transfer is there */
|
||||
#define UDMA_CHANNEL_CFG_SHADOW (1 << UDMA_CHANNEL_CFG_SHADOW_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SHADOW (1 << SY1XX_UDMA_CHANNEL_CFG_SHADOW_BIT)
|
||||
/* Stop and clear all pending transfers */
|
||||
#define UDMA_CHANNEL_CFG_CLEAR (1 << UDMA_CHANNEL_CFG_CLEAR_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_CLEAR (1 << SY1XX_UDMA_CHANNEL_CFG_CLEAR_BIT)
|
||||
/* Start a transfer */
|
||||
#define UDMA_CHANNEL_CFG_EN (1 << UDMA_CHANNEL_CFG_EN_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_EN (1 << SY1XX_UDMA_CHANNEL_CFG_EN_BIT)
|
||||
/* Configure for 8-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_8 (0 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SIZE_8 (0 << SY1XX_UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for 16-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_16 (1 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SIZE_16 (1 << SY1XX_UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for 32-bits transfer */
|
||||
#define UDMA_CHANNEL_CFG_SIZE_32 (2 << UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_SIZE_32 (2 << SY1XX_UDMA_CHANNEL_CFG_SIZE_BIT)
|
||||
/* Configure for continuous mode */
|
||||
#define UDMA_CHANNEL_CFG_CONT (1 << UDMA_CHANNEL_CFG_CONT_BIT)
|
||||
#define SY1XX_UDMA_CHANNEL_CFG_CONT (1 << SY1XX_UDMA_CHANNEL_CFG_CONT_BIT)
|
||||
|
||||
/* Configuration area offset */
|
||||
#define UDMA_CONF_OFFSET 0xF80
|
||||
#define SY1XX_UDMA_CONF_OFFSET 0xF80
|
||||
/* Clock-gating control register */
|
||||
#define UDMA_CONF_CG_OFFSET 0x00
|
||||
#define SY1XX_UDMA_CONF_CG_OFFSET 0x00
|
||||
|
||||
static inline void plp_udma_cg_set(unsigned int value)
|
||||
{
|
||||
sys_write32(value, ARCHI_SOC_PERIPHERALS_ADDR + ARCHI_UDMA_OFFSET + UDMA_CONF_OFFSET +
|
||||
UDMA_CONF_CG_OFFSET);
|
||||
sys_write32(value, SY1XX_ARCHI_SOC_PERIPHERALS_ADDR + SY1XX_ARCHI_UDMA_OFFSET +
|
||||
SY1XX_UDMA_CONF_OFFSET + SY1XX_UDMA_CONF_CG_OFFSET);
|
||||
}
|
||||
|
||||
typedef enum {
|
||||
DRIVERS_UDMA_UART,
|
||||
DRIVERS_UDMA_I2C,
|
||||
DRIVERS_UDMA_SPI,
|
||||
DRIVERS_UDMA_MAC,
|
||||
DRIVERS_MAX_UDMA_COUNT
|
||||
} udma_module_t;
|
||||
SY1XX_UDMA_MODULE_UART,
|
||||
SY1XX_UDMA_MODULE_I2C,
|
||||
SY1XX_UDMA_MODULE_SPI,
|
||||
SY1XX_UDMA_MODULE_MAC,
|
||||
SY1XX_UDMA_MAX_MODULE_COUNT
|
||||
} sy1xx_udma_module_t;
|
||||
|
||||
void drivers_udma_enable_clock(udma_module_t module, uint32_t instance);
|
||||
void drivers_udma_disable_clock(udma_module_t module, uint32_t instance);
|
||||
void sy1xx_udma_enable_clock(sy1xx_udma_module_t module, uint32_t instance);
|
||||
void sy1xx_drivers_udma_disable_clock(sy1xx_udma_module_t module, uint32_t instance);
|
||||
|
||||
int32_t drivers_udma_cancel(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_is_ready(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_wait_for_finished(uint32_t base, uint32_t channel);
|
||||
int32_t drivers_udma_wait_for_status(uint32_t base);
|
||||
int32_t drivers_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
int32_t sy1xx_udma_cancel(uint32_t base, uint32_t channel);
|
||||
int32_t sy1xx_udma_is_ready(uint32_t base, uint32_t channel);
|
||||
int32_t sy1xx_udma_wait_for_finished(uint32_t base, uint32_t channel);
|
||||
int32_t sy1xx_udma_wait_for_status(uint32_t base);
|
||||
int32_t sy1xx_udma_start(uint32_t base, uint32_t channel, uint32_t saddr, uint32_t size,
|
||||
uint32_t optional_cfg);
|
||||
int32_t drivers_udma_get_remaining(uint32_t base, uint32_t channel);
|
||||
int32_t sy1xx_udma_get_remaining(uint32_t base, uint32_t channel);
|
||||
|
||||
typedef enum {
|
||||
UDMA_SADDR_REG = 0x00,
|
||||
UDMA_SIZE_REG = 0x04,
|
||||
UDMA_CFG_REG = 0x08,
|
||||
SY1XX_UDMA_SADDR_REG = 0x00,
|
||||
SY1XX_UDMA_SIZE_REG = 0x04,
|
||||
SY1XX_UDMA_CFG_REG = 0x08,
|
||||
|
||||
} udma_regs_t;
|
||||
|
||||
typedef enum {
|
||||
UDMA_RX_SADDR_REG = 0x00,
|
||||
UDMA_RX_SIZE_REG = 0x04,
|
||||
UDMA_RX_CFG_REG = 0x08,
|
||||
SY1XX_UDMA_RX_SADDR_REG = 0x00,
|
||||
SY1XX_UDMA_RX_SIZE_REG = 0x04,
|
||||
SY1XX_UDMA_RX_CFG_REG = 0x08,
|
||||
|
||||
UDMA_TX_SADDR_REG = 0x10,
|
||||
UDMA_TX_SIZE_REG = 0x14,
|
||||
UDMA_TX_CFG_REG = 0x18,
|
||||
SY1XX_UDMA_TX_SADDR_REG = 0x10,
|
||||
SY1XX_UDMA_TX_SIZE_REG = 0x14,
|
||||
SY1XX_UDMA_TX_CFG_REG = 0x18,
|
||||
|
||||
UDMA_STATUS = 0x20,
|
||||
UDMA_SETUP_REG = 0x24,
|
||||
SY1XX_UDMA_STATUS = 0x20,
|
||||
SY1XX_UDMA_SETUP_REG = 0x24,
|
||||
} udma_reg_t;
|
||||
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_8 (0x0 << 1)
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_16 (0x1 << 1)
|
||||
#define UDMA_RX_DATA_ADDR_INC_SIZE_32 (0x2 << 1)
|
||||
#define SY1XX_UDMA_RX_DATA_ADDR_INC_SIZE_8 (0x0 << 1)
|
||||
#define SY1XX_UDMA_RX_DATA_ADDR_INC_SIZE_16 (0x1 << 1)
|
||||
#define SY1XX_UDMA_RX_DATA_ADDR_INC_SIZE_32 (0x2 << 1)
|
||||
|
||||
#define UDMA_RX_CHANNEL 0
|
||||
#define UDMA_TX_CHANNEL 1
|
||||
#define SY1XX_UDMA_RX_CHANNEL 0
|
||||
#define SY1XX_UDMA_TX_CHANNEL 1
|
||||
|
||||
#define UDMA_READ_REG(udma_base, reg) sys_read32(udma_base + reg)
|
||||
#define UDMA_WRITE_REG(udma_base, reg, value) sys_write32(value, udma_base + reg)
|
||||
#define SY1XX_UDMA_READ_REG(udma_base, reg) sys_read32(udma_base + reg)
|
||||
#define SY1XX_UDMA_WRITE_REG(udma_base, reg, value) sys_write32(value, udma_base + reg)
|
||||
|
||||
#define UDMA_CANCEL_RX(udma_base) drivers_udma_cancel(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_CANCEL_TX(udma_base) drivers_udma_cancel(udma_base, UDMA_TX_CHANNEL)
|
||||
#define SY1XX_UDMA_CANCEL_RX(udma_base) sy1xx_udma_cancel(udma_base, SY1XX_UDMA_RX_CHANNEL)
|
||||
#define SY1XX_UDMA_CANCEL_TX(udma_base) sy1xx_udma_cancel(udma_base, SY1XX_UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_IS_FINISHED_RX(udma_base) drivers_udma_is_ready(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_IS_FINISHED_TX(udma_base) drivers_udma_is_ready(udma_base, UDMA_TX_CHANNEL)
|
||||
#define SY1XX_UDMA_IS_FINISHED_RX(udma_base) sy1xx_udma_is_ready(udma_base, SY1XX_UDMA_RX_CHANNEL)
|
||||
#define SY1XX_UDMA_IS_FINISHED_TX(udma_base) sy1xx_udma_is_ready(udma_base, SY1XX_UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_WAIT_FOR_FINISHED_RX(udma_base) \
|
||||
drivers_udma_wait_for_finished(udma_base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_WAIT_FOR_FINISHED_TX(udma_base) \
|
||||
drivers_udma_wait_for_finished(udma_base, UDMA_TX_CHANNEL)
|
||||
#define SY1XX_UDMA_WAIT_FOR_FINISHED_RX(udma_base) \
|
||||
sy1xx_udma_wait_for_finished(udma_base, SY1XX_UDMA_RX_CHANNEL)
|
||||
#define SY1XX_UDMA_WAIT_FOR_FINISHED_TX(udma_base) \
|
||||
sy1xx_udma_wait_for_finished(udma_base, SY1XX_UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_START_RX(base, addr, size, cfg) \
|
||||
drivers_udma_start(base, UDMA_RX_CHANNEL, addr, size, cfg)
|
||||
#define UDMA_START_TX(base, addr, size, cfg) \
|
||||
drivers_udma_start(base, UDMA_TX_CHANNEL, addr, size, cfg)
|
||||
#define SY1XX_UDMA_START_RX(base, addr, size, cfg) \
|
||||
sy1xx_udma_start(base, SY1XX_UDMA_RX_CHANNEL, addr, size, cfg)
|
||||
#define SY1XX_UDMA_START_TX(base, addr, size, cfg) \
|
||||
sy1xx_udma_start(base, SY1XX_UDMA_TX_CHANNEL, addr, size, cfg)
|
||||
|
||||
#define UDMA_GET_REMAINING_RX(base) drivers_udma_get_remaining(base, UDMA_RX_CHANNEL)
|
||||
#define UDMA_GET_REMAINING_TX(base) drivers_udma_get_remaining(base, UDMA_TX_CHANNEL)
|
||||
#define SY1XX_UDMA_GET_REMAINING_RX(base) sy1xx_udma_get_remaining(base, SY1XX_UDMA_RX_CHANNEL)
|
||||
#define SY1XX_UDMA_GET_REMAINING_TX(base) sy1xx_udma_get_remaining(base, SY1XX_UDMA_TX_CHANNEL)
|
||||
|
||||
#define UDMA_WAIT_FOR_STATUS_IDLE(udma_base) drivers_udma_wait_for_status(udma_base)
|
||||
#define SY1XX_UDMA_WAIT_FOR_STATUS_IDLE(udma_base) sy1xx_udma_wait_for_status(udma_base)
|
||||
|
||||
#endif /* GANYMED_SY1XX_UDMA_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue