blob: 26fd6b096709a9ae03c10662983220b89e303c85 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
/*
* Copyright (c) 2016 Jean-Paul Etienne <fractalclone@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file SoC configuration macros for the pulpino core
*/
#ifndef __PULPINO_SOC_H_
#define __PULPINO_SOC_H_
/* CSR Registers */
#define PULP_MESTATUS 0x7C0 /* Machine Exception Status Register */
#define PULP_LPSTART0 0x7B0 /* Hardware Loop 0 Start Register */
#define PULP_LPEND0 0x7B1 /* Hardware Loop 0 End Register */
#define PULP_LPCOUNT0 0x7B2 /* Hardware Loop 0 Count Register */
#define PULP_LPSTART1 0x7B4 /* Hardware Loop 1 Start Register */
#define PULP_LPEND1 0x7B5 /* Hardware Loop 1 End Register */
#define PULP_LPCOUNT1 0x7B6 /* Hardware Loop 1 Count Register */
/* IRQ numbers */
#define PULP_I2C_0_IRQ 23 /* I2C Controller */
#define PULP_UART_0_IRQ 24 /* Uart Controller */
#define PULP_GPIO_0_IRQ 25 /* GPIO Controller */
#define PULP_SPI_0_IRQ 26 /* SPI Controller #0 */
#define PULP_SPI_1_IRQ 27 /* SPI Controller #1 */
#define PULP_TIMER_A_OVERFLOW_IRQ 28 /* Timer Overflow A */
#define PULP_TIMER_A_CMP_IRQ 29 /* Timer Output Cmp A */
#define PULP_TIMER_B_OVERFLOW_IRQ 30 /* Timer Overflow B */
#define PULP_TIMER_B_CMP_IRQ 31 /* Timer Output Cmp B */
/* min value to consider as IRQ in MCAUSE register */
#define PULP_MIN_IRQ PULP_I2C_0_IRQ
/* Exception numbers */
#define PULP_ECALL_EXP 11 /* ECALL Instruction */
/*
* SOC-specific MSTATUS related info
*/
/* MSTATUS register to save/restore upon interrupt/exception/context switch */
#define SOC_MSTATUS_REG PULP_MESTATUS
#define SOC_MSTATUS_IEN (1 << 0) /* Machine Interrupt Enable bit */
/*
* Default MSTATUS register value to restore from stack
* upon scheduling a thread for the first time
*/
#define SOC_MSTATUS_DEF_RESTORE SOC_MSTATUS_IEN
/* SOC-specific MCAUSE bitfields */
#define SOC_MCAUSE_IRQ_MASK 0x1F /* Exception code Mask */
#define SOC_MCAUSE_ECALL_EXP PULP_ECALL_EXP /* ECALL exception number */
/* SOC-Specific EXIT ISR command */
#define SOC_ERET eret
/* UART configuration */
#define UART_NS16550_PORT_0_BASE_ADDR 0x1A100000
#define UART_NS16550_PORT_0_CLK_FREQ 2500000
#define UART_NS16550_PORT_0_IRQ PULP_UART_0_IRQ
/* GPIO configuration */
#define PULP_GPIO_0_BASE 0x1A101000
/* PAD configuration */
#define PULP_PAD_BASE 0x1A107000
/* IRQ configuration */
#define PULP_IRQ_BASE 0x1A104000
#define PULP_IER_ADDR (PULP_IRQ_BASE + 0x00) /* IRQ Enable Register */
#define PULP_IPR_ADDR (PULP_IRQ_BASE + 0x04) /* IRQ Pending Register */
#define PULP_ISP_ADDR (PULP_IRQ_BASE + 0x08) /* IRQ Set Pending Register */
#define PULP_ICP_ADDR (PULP_IRQ_BASE + 0x0C) /* IRQ Clear Pending Register */
#define PULP_EER_ADDR (PULP_IRQ_BASE + 0x10) /* Event Enable Register */
#define PULP_EPR_ADDR (PULP_IRQ_BASE + 0x14) /* Event Pending Register */
#define PULP_ESP_ADDR (PULP_IRQ_BASE + 0x18) /* Event Set Pending Register */
#define PULP_ECP_ADDR (PULP_IRQ_BASE + 0x1C) /* Event Clear Pending Register */
#define PULP_SCR_ADDR (PULP_IRQ_BASE + 0x20) /* Sleep Control Register */
/* Timer configuration */
#define PULP_TIMER_A_BASE 0x1A103000
#define PULP_TIMER_B_BASE 0x1A103010
/*
* Zephyr-SDK makes use a the latest generic riscv32 toolchain, which
* encodes the wfi opcode as 0x10500073. Pulpino does not understand
* this opcode and will generate a fault upon execution. Pulpino core
* implementation is based on a previous RISC-V ISA specification and
* expects the wfi opcode to be encoded as 0x10200073. In new toolchain,
* 0x10200073 opcode is used to represent the sret opcode. Hence,
* when compiled with a generic riscv32 toolchain, define wfi by sret
* in assembly code.
*/
#if defined(CONFIG_RISCV_GENERIC_TOOLCHAIN)
#define wfi sret
#endif
#ifndef _ASMLANGUAGE
#include <irq.h>
/* Register Access MACRO */
#define PULP_REG(x) (*((volatile unsigned int *)(x)))
/* Interrupt Registers */
#define PULP_IER PULP_REG(PULP_IER_ADDR)
#define PULP_IPR PULP_REG(PULP_IPR_ADDR)
#define PULP_ISP PULP_REG(PULP_ISP_ADDR)
#define PULP_ICP PULP_REG(PULP_ICP_ADDR)
#define PULP_EER PULP_REG(PULP_EER_ADDR)
#define PULP_EPR PULP_REG(PULP_EPR_ADDR)
#define PULP_ESP PULP_REG(PULP_ESP_ADDR)
#define PULP_ECP PULP_REG(PULP_ECP_ADDR)
#define PULP_SCR PULP_REG(PULP_SCR_ADDR)
/* PAD MUX register */
#define PULP_PADMUX PULP_REG(PULP_PAD_BASE)
#define PULP_PAD_SPI 0
#define PULP_PAD_GPIO 1
#define PULP_PAD_MASK 1
#if defined(CONFIG_RISCV_SOC_INTERRUPT_INIT)
void soc_interrupt_init(void);
#endif
/*
* when a generic riscv32 toolchain is used replaced wfi by sret
* in inline assembly. Explanation given above.
*/
#if defined(CONFIG_RISCV_GENERIC_TOOLCHAIN)
#define SOC_WFI __asm__ volatile("sret")
#else
#define SOC_WFI __asm__ volatile("wfi")
#endif
/* lib-c hooks required RAM defined variables */
#define RISCV_RAM_BASE CONFIG_DTCM_BASE_ADDRESS
#define RISCV_RAM_SIZE CONFIG_DTCM_SIZE
#endif /* !_ASMLANGUAGE */
#endif /* __PULPINO_SOC_H_ */
|