Skip to content

Commit 0abf0cf

Browse files
author
Cruz Monrreal
authored
Merge pull request #7039 from shuoo/feature-cm3ds-misc
FPGAIO: Add MISC IO initialization support
2 parents e18ee80 + 5be69f3 commit 0abf0cf

File tree

4 files changed

+99
-1
lines changed

4 files changed

+99
-1
lines changed

targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/device/drivers/arm_mps2_io_drv.c

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,16 @@ struct arm_mps2_io_reg_map_t {
4646
* [31:2] : Reserved
4747
* [1:0] : Buttons */
4848
} button_reg;
49+
volatile uint32_t reserved1[16];
50+
volatile uint32_t misc; /* Offset: 0x04C (R/W) Misc control
51+
* [31:7] : Reserved
52+
* [6] : CLCD_BL_CTRL
53+
* [5] : CLCD_RD
54+
* [4] : CLCD_RS
55+
* [3] : CLCD_RESET
56+
* [2] : Reserved
57+
* [1] : SPI_nSS
58+
* [0] : CLCD_CS */
4959
};
5060

5161
void arm_mps2_io_write_leds(struct arm_mps2_io_dev_t* dev,
@@ -113,6 +123,25 @@ void arm_mps2_io_write_leds(struct arm_mps2_io_dev_t* dev,
113123
}
114124
}
115125

126+
void arm_mps2_io_write_misc(struct arm_mps2_io_dev_t* dev,
127+
enum arm_mps2_io_access_t access,
128+
uint8_t pin_num,
129+
uint32_t value)
130+
{
131+
struct arm_mps2_io_reg_map_t* p_mps2_io_port =
132+
(struct arm_mps2_io_reg_map_t*)dev->cfg->base;
133+
134+
/* The MISC write is for FPGAIO only */
135+
if (dev->cfg->type != ARM_MPS2_IO_TYPE_FPGAIO)
136+
return;
137+
138+
if (value) {
139+
p_mps2_io_port->misc |= (1UL << pin_num);
140+
} else {
141+
p_mps2_io_port->misc &= ~(1UL << pin_num);
142+
}
143+
}
144+
116145
uint32_t arm_mps2_io_read_buttons(struct arm_mps2_io_dev_t* dev,
117146
enum arm_mps2_io_access_t access,
118147
uint8_t pin_num)

targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/device/drivers/arm_mps2_io_drv.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ void arm_mps2_io_write_leds(struct arm_mps2_io_dev_t* dev,
6565
uint8_t pin_num,
6666
uint32_t value);
6767

68+
/**
69+
* \brief Writes corresponding pin in FPGA IO MISC register.
70+
*
71+
* \param[in] dev MPS2 IO device where to write \ref arm_mps2_io_dev_t
72+
* \param[in] pin_num Pin number.
73+
* \param[in] value Value to set.
74+
*
75+
* \note This function doesn't check if dev is NULL.
76+
* \note This function doesn't support port access.
77+
*/
78+
void arm_mps2_io_write_misc(struct arm_mps2_io_dev_t* dev,
79+
enum arm_mps2_io_access_t access,
80+
uint8_t pin_num,
81+
uint32_t value);
82+
6883
/**
6984
* \brief Reads the buttons status.
7085
*

targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/gpio_api.c

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "objects.h"
2121
#include "mbed_error.h"
2222

23+
#define RESERVED_MISC_PIN 7u
24+
2325
enum io_type {
2426
GPIO_DEVICE,
2527
MPS2_IO_DEVICE,
@@ -63,6 +65,38 @@ uint32_t gpio_set(PinName pin)
6365
}
6466
}
6567

68+
/*
69+
* FPGA MISC bit mapping:
70+
* [31:7] Reserved
71+
* [6] CLCD_BL_CTRL
72+
* [5] CLCD_RD
73+
* [4] CLCD_RS
74+
* [3] CLCD_RESET
75+
* [2] Reserved
76+
* [1] SPI_nSS
77+
* [0] CLCD_CS
78+
*/
79+
static uint32_t gpio_fpga_misc_pin(PinName pin)
80+
{
81+
uint32_t pin_number = RESERVED_MISC_PIN;
82+
83+
if (pin == CLCD_SSEL) {
84+
pin_number = 0u;
85+
} else if (pin == SPI_SSEL) {
86+
pin_number = 1u;
87+
} else if (pin == CLCD_RESET) {
88+
pin_number = 3u;
89+
} else if (pin == CLCD_RS) {
90+
pin_number = 4u;
91+
} else if (pin == CLCD_RD) {
92+
pin_number = 5u;
93+
} else if (pin == CLCD_BL_CTRL){
94+
pin_number = 6u;
95+
}
96+
97+
return pin_number;
98+
}
99+
66100
void gpio_init(gpio_t *obj, PinName pin)
67101
{
68102
struct arm_gpio_dev_t *gpio_dev;
@@ -100,6 +134,7 @@ void gpio_init(gpio_t *obj, PinName pin)
100134

101135
obj->gpio_dev = gpio_dev;
102136
obj->mps2_io_dev = NULL;
137+
obj->arm_mps2_io_write = NULL;
103138
obj->pin_number = GPIO_PIN_NUMBER(pin);
104139
/* GPIO is input by default */
105140
obj->direction = PIN_INPUT;
@@ -112,30 +147,43 @@ void gpio_init(gpio_t *obj, PinName pin)
112147
obj->gpio_dev = NULL;
113148
obj->mps2_io_dev = &ARM_MPS2_IO_FPGAIO_DEV;
114149
obj->pin_number = pin - USERLED1;
150+
obj->arm_mps2_io_write = arm_mps2_io_write_leds;
115151
obj->direction = PIN_OUTPUT;
116152
return;
117153
} else if (pin == USERSW1 || pin == USERSW2) {
118154
/* User Push buttons */
119155
obj->gpio_dev = NULL;
120156
obj->mps2_io_dev = &ARM_MPS2_IO_FPGAIO_DEV;
157+
obj->arm_mps2_io_write = NULL;
121158
obj->pin_number = pin - USERSW1;
122159
obj->direction = PIN_INPUT;
123160
return;
124161
}
162+
/* Check if pin is a MISC pin */
163+
obj->pin_number = gpio_fpga_misc_pin(pin);
164+
if (obj->pin_number != RESERVED_MISC_PIN) {
165+
obj->gpio_dev = NULL;
166+
obj->mps2_io_dev = &ARM_MPS2_IO_FPGAIO_DEV;
167+
obj->arm_mps2_io_write = arm_mps2_io_write_misc;
168+
obj->direction = PIN_OUTPUT;
169+
return;
170+
}
125171
#endif /* ARM_MPS2_IO_FPGAIO */
126172

127173
#ifdef ARM_MPS2_IO_SCC
128174
if (pin >= LED1 && pin <= LED8) {
129175
/* MCC LEDs */
130176
obj->gpio_dev = NULL;
131177
obj->mps2_io_dev = &ARM_MPS2_IO_SCC_DEV;
178+
obj->arm_mps2_io_write = NULL;
132179
obj->pin_number = pin - LED1;
133180
obj->direction = PIN_OUTPUT;
134181
return;
135182
} else if (pin >= SW1 && pin <= SW8) {
136183
/* MCC Switches */
137184
obj->gpio_dev = NULL;
138185
obj->mps2_io_dev = &ARM_MPS2_IO_SCC_DEV;
186+
obj->arm_mps2_io_write = NULL;
139187
obj->pin_number = pin - SW1;
140188
obj->direction = PIN_INPUT;
141189
return;
@@ -208,8 +256,10 @@ void gpio_write(gpio_t *obj, int value)
208256
*/
209257
return;
210258
}
211-
arm_mps2_io_write_leds(obj->mps2_io_dev, ARM_MPS2_IO_ACCESS_PIN,
259+
if (obj->arm_mps2_io_write != NULL) {
260+
obj->arm_mps2_io_write(obj->mps2_io_dev, ARM_MPS2_IO_ACCESS_PIN,
212261
obj->pin_number, (uint32_t)value);
262+
}
213263
return;
214264
case DEVICE_UNKNOWN:
215265
break;

targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/objects.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ extern "C" {
3030
typedef struct gpio_s {
3131
struct arm_gpio_dev_t *gpio_dev;
3232
struct arm_mps2_io_dev_t *mps2_io_dev;
33+
void (*arm_mps2_io_write)(struct arm_mps2_io_dev_t* dev,
34+
enum arm_mps2_io_access_t access,
35+
uint8_t pin_num,
36+
uint32_t value);
3337
uint32_t pin_number;
3438
PinDirection direction;
3539
} gpio_t;

0 commit comments

Comments
 (0)