|
@@ -29,14 +29,6 @@ static unsigned int AFO_bus;
|
|
|
#define pin_wrprot 1 /* PA1 */
|
|
|
|
|
|
/* Output pins. */
|
|
|
-#define gpio_pin10 gpiob
|
|
|
-#define pin_pin10 1 /* PB1 */
|
|
|
-#define gpio_pin12 gpiob
|
|
|
-#define pin_pin12 0 /* PB0 */
|
|
|
-#define gpio_pin14 gpiob
|
|
|
-#define pin_pin14 11 /* PB11 */
|
|
|
-#define gpio_pin16 gpiob
|
|
|
-#define pin_pin16 10 /* PB10 */
|
|
|
#define gpio_dir gpioc
|
|
|
#define pin_dir 4 /* PC4 */
|
|
|
#define gpio_step gpioa
|
|
@@ -69,7 +61,8 @@ static uint8_t u_buf[U_BUF_SZ] aligned(4) section_ext_ram;
|
|
|
|
|
|
static void floppy_mcu_init(void)
|
|
|
{
|
|
|
- const struct user_pin *upin;
|
|
|
+ const struct pin_mapping *mpin;
|
|
|
+ const struct pin_mapping *upin;
|
|
|
|
|
|
/* Enable clock for Timer 2. */
|
|
|
rcc->apb1enr |= RCC_APB1ENR_TIM2EN;
|
|
@@ -91,10 +84,10 @@ static void floppy_mcu_init(void)
|
|
|
AFO_bus = upin->push_pull ? AFO_bus_pp : AFO_bus_od;
|
|
|
|
|
|
/* Configure SELECT/MOTOR lines. */
|
|
|
- configure_pin(pin10, GPO_bus);
|
|
|
- configure_pin(pin12, GPO_bus);
|
|
|
- configure_pin(pin14, GPO_bus);
|
|
|
- configure_pin(pin16, GPO_bus);
|
|
|
+ for (mpin = board_config->msel_pins; mpin->pin_id != 0; mpin++) {
|
|
|
+ gpio_configure_pin(gpio_from_id(mpin->gpio_bank), mpin->gpio_pin,
|
|
|
+ GPO_bus);
|
|
|
+ }
|
|
|
|
|
|
/* Set up EXTI mapping for INDEX: PB[3:0] -> EXT[3:0] */
|
|
|
syscfg->exticr1 = 0x1111;
|
|
@@ -163,30 +156,39 @@ static void dma_wdata_start(void)
|
|
|
|
|
|
static void drive_deselect(void)
|
|
|
{
|
|
|
+ int pin = -1;
|
|
|
+ uint8_t rc;
|
|
|
+
|
|
|
if (unit_nr == -1)
|
|
|
return;
|
|
|
|
|
|
switch (bus_type) {
|
|
|
case BUS_IBMPC:
|
|
|
switch (unit_nr) {
|
|
|
- case 0: write_pin(pin14, FALSE); break;
|
|
|
- case 1: write_pin(pin12, FALSE); break;
|
|
|
+ case 0: pin = 14; break;
|
|
|
+ case 1: pin = 12; break;
|
|
|
}
|
|
|
break;
|
|
|
case BUS_SHUGART:
|
|
|
switch (unit_nr) {
|
|
|
- case 0: write_pin(pin10, FALSE); break;
|
|
|
- case 1: write_pin(pin12, FALSE); break;
|
|
|
- case 2: write_pin(pin14, FALSE); break;
|
|
|
+ case 0: pin = 10; break;
|
|
|
+ case 1: pin = 12; break;
|
|
|
+ case 2: pin = 14; break;
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
+ rc = write_mapped_pin(board_config->msel_pins, pin, O_FALSE);
|
|
|
+ ASSERT(rc == ACK_OKAY);
|
|
|
+
|
|
|
unit_nr = -1;
|
|
|
}
|
|
|
|
|
|
static uint8_t drive_select(uint8_t nr)
|
|
|
{
|
|
|
+ int pin = -1;
|
|
|
+ uint8_t rc;
|
|
|
+
|
|
|
if (nr == unit_nr)
|
|
|
return ACK_OKAY;
|
|
|
|
|
@@ -195,16 +197,16 @@ static uint8_t drive_select(uint8_t nr)
|
|
|
switch (bus_type) {
|
|
|
case BUS_IBMPC:
|
|
|
switch (nr) {
|
|
|
- case 0: write_pin(pin14, TRUE); break;
|
|
|
- case 1: write_pin(pin12, TRUE); break;
|
|
|
+ case 0: pin = 14; break;
|
|
|
+ case 1: pin = 12; break;
|
|
|
default: return ACK_BAD_UNIT;
|
|
|
}
|
|
|
break;
|
|
|
case BUS_SHUGART:
|
|
|
switch (nr) {
|
|
|
- case 0: write_pin(pin10, TRUE); break;
|
|
|
- case 1: write_pin(pin12, TRUE); break;
|
|
|
- case 2: write_pin(pin14, TRUE); break;
|
|
|
+ case 0: pin = 10; break;
|
|
|
+ case 1: pin = 12; break;
|
|
|
+ case 2: pin = 14; break;
|
|
|
default: return ACK_BAD_UNIT;
|
|
|
}
|
|
|
break;
|
|
@@ -212,6 +214,10 @@ static uint8_t drive_select(uint8_t nr)
|
|
|
return ACK_NO_BUS;
|
|
|
}
|
|
|
|
|
|
+ rc = write_mapped_pin(board_config->msel_pins, pin, O_TRUE);
|
|
|
+ if (rc != ACK_OKAY)
|
|
|
+ return ACK_BAD_UNIT;
|
|
|
+
|
|
|
unit_nr = nr;
|
|
|
delay_us(delay_params.select_delay);
|
|
|
|
|
@@ -220,6 +226,9 @@ static uint8_t drive_select(uint8_t nr)
|
|
|
|
|
|
static uint8_t drive_motor(uint8_t nr, bool_t on)
|
|
|
{
|
|
|
+ int pin = -1;
|
|
|
+ uint8_t rc;
|
|
|
+
|
|
|
switch (bus_type) {
|
|
|
case BUS_IBMPC:
|
|
|
if (nr >= 2)
|
|
@@ -227,8 +236,8 @@ static uint8_t drive_motor(uint8_t nr, bool_t on)
|
|
|
if (unit[nr].motor == on)
|
|
|
return ACK_OKAY;
|
|
|
switch (nr) {
|
|
|
- case 0: write_pin(pin10, on); break;
|
|
|
- case 1: write_pin(pin16, on); break;
|
|
|
+ case 0: pin = 10; break;
|
|
|
+ case 1: pin = 16; break;
|
|
|
}
|
|
|
break;
|
|
|
case BUS_SHUGART:
|
|
@@ -238,12 +247,16 @@ static uint8_t drive_motor(uint8_t nr, bool_t on)
|
|
|
nr = 0;
|
|
|
if (unit[nr].motor == on)
|
|
|
return ACK_OKAY;
|
|
|
- write_pin(pin16, on);
|
|
|
+ pin = 16;
|
|
|
break;
|
|
|
default:
|
|
|
return ACK_NO_BUS;
|
|
|
}
|
|
|
|
|
|
+ rc = write_mapped_pin(board_config->msel_pins, pin, on ? O_TRUE : O_FALSE);
|
|
|
+ if (rc != ACK_OKAY)
|
|
|
+ return ACK_BAD_UNIT;
|
|
|
+
|
|
|
unit[nr].motor = on;
|
|
|
if (on)
|
|
|
delay_ms(delay_params.motor_delay);
|
|
@@ -254,15 +267,15 @@ static uint8_t drive_motor(uint8_t nr, bool_t on)
|
|
|
|
|
|
static void reset_bus(void)
|
|
|
{
|
|
|
- write_pin(pin10, FALSE);
|
|
|
- write_pin(pin12, FALSE);
|
|
|
- write_pin(pin14, FALSE);
|
|
|
- write_pin(pin16, FALSE);
|
|
|
+ const struct pin_mapping *mpin;
|
|
|
+
|
|
|
+ for (mpin = board_config->msel_pins; mpin->pin_id != 0; mpin++)
|
|
|
+ gpio_write_pin(gpio_from_id(mpin->gpio_bank), mpin->gpio_pin, O_FALSE);
|
|
|
}
|
|
|
|
|
|
static uint8_t set_user_pin(unsigned int pin, unsigned int level)
|
|
|
{
|
|
|
- const struct user_pin *upin;
|
|
|
+ const struct pin_mapping *upin;
|
|
|
|
|
|
for (upin = board_config->user_pins; upin->pin_id != 0; upin++) {
|
|
|
if (upin->pin_id == pin)
|
|
@@ -277,7 +290,7 @@ found:
|
|
|
|
|
|
static void reset_user_pins(void)
|
|
|
{
|
|
|
- const struct user_pin *upin;
|
|
|
+ const struct pin_mapping *upin;
|
|
|
|
|
|
for (upin = board_config->user_pins; upin->pin_id != 0; upin++)
|
|
|
gpio_write_pin(gpio_from_id(upin->gpio_bank), upin->gpio_pin, O_FALSE);
|