Эх сурвалжийг харах

Support new board F7 Slim

Keir Fraser 4 жил өмнө
parent
commit
f8e7484233

+ 6 - 2
inc/stm32/f7.h

@@ -95,9 +95,10 @@ enum {
     F7SM_basic_v2,
     F7SM_ant_goffart_f7_plus_v2,
     F7SM_lightning_plus,
+    F7SM_slim,
 };
 
-struct user_pin {
+struct pin_mapping {
     uint8_t pin_id;
     uint8_t gpio_bank;
     uint8_t gpio_pin;
@@ -108,13 +109,16 @@ struct board_config {
     uint8_t hse_mhz;
     bool_t hse_byp;
     bool_t hs_usb;
-    const struct user_pin *user_pins;
+    const struct pin_mapping *user_pins;
+    const struct pin_mapping *msel_pins;
 };
 
 extern const struct board_config *board_config;
 void identify_board_config(void);
 
 GPIO gpio_from_id(uint8_t id);
+uint8_t write_mapped_pin(
+    const struct pin_mapping *map, int pin_id, bool_t level);
 
 void early_fatal(int blinks) __attribute__((noreturn));
 #define early_delay_ms(ms) (delay_ticks((ms)*2000))

+ 2 - 1
scripts/greaseweazle/tools/info.py

@@ -21,7 +21,8 @@ model_id = { 1: { 0: 'F1' },
                   2: 'F7 Lightning',
                   3: 'F7 (version 2)',
                   4: 'F7 Plus (Ant Goffart, version 2)',
-                  5: 'F7 Lightning Plus' } }
+                  5: 'F7 Lightning Plus',
+                  6: 'F7 Slim' } }
 
 speed_id = { 0: 'Full Speed (12 Mbit/s)',
              1: 'High Speed (480 Mbit/s)' }

+ 69 - 14
src/f7/board.c

@@ -32,55 +32,99 @@ GPIO gpio_from_id(uint8_t id)
     return NULL;
 }
 
-const static struct user_pin _user_pins_F7SM_basic_v1[] = {
+uint8_t write_mapped_pin(
+    const struct pin_mapping *map, int pin_id, bool_t level)
+{
+    const struct pin_mapping *pin;
+
+    for (pin = map; pin->pin_id != 0; pin++)
+        if (pin->pin_id == pin_id)
+            goto found;
+
+    return ACK_BAD_PIN;
+
+found:
+    gpio_write_pin(gpio_from_id(pin->gpio_bank), pin->gpio_pin, level);
+    return ACK_OKAY;
+}
+
+
+const static struct pin_mapping _msel_pins_std[] = {
+    { 10, _B,  1 },
+    { 12, _B,  0 },
+    { 14, _B, 11 },
+    { 16, _B, 10 },
+    {  0,  0,  0 }
+};
+
+const static struct pin_mapping _msel_pins_f7_slim[] = {
+    { 10, _B,  1 },
+    { 14, _B, 11 },
+    {  0,  0,  0 }
+};
+
+const static struct pin_mapping _user_pins_F7SM_basic_v1[] = {
     { 2, _B, 12, _OD },
     { 0,  0,  0, _OD } };
-const static struct user_pin _user_pins_F7SM_ant_goffart_f7_plus_v1[] = {
+const static struct pin_mapping _user_pins_F7SM_ant_goffart_f7_plus_v1[] = {
     { 2, _B, 12, _OD }, /* board bug: B12 isn't buffered */
     { 4, _C,  6, _PP },
     { 0,  0,  0, _PP } };
-const static struct user_pin _user_pins_F7SM_lightning[] = {
+const static struct pin_mapping _user_pins_F7SM_lightning[] = {
     { 2, _B, 12, _PP },
     { 4, _E, 15, _PP },
     { 6, _E, 14, _PP },
     { 0,  0,  0, _PP } };
-const static struct user_pin _user_pins_F7SM_basic_v2[] = {
+const static struct pin_mapping _user_pins_F7SM_basic_v2[] = {
     { 2, _B, 12, _OD },
     { 4, _C,  8, _OD },
     { 6, _C,  7, _OD },
     { 0,  0,  0, _OD } };
-const static struct user_pin _user_pins_F7SM_ant_goffart_f7_plus_v2[] = {
+const static struct pin_mapping _user_pins_F7SM_ant_goffart_f7_plus_v2[] = {
     { 2, _B, 12, _PP },
     { 4, _C,  8, _PP },
     { 6, _C,  7, _PP },
     { 0,  0,  0, _PP } };
-const static struct user_pin _user_pins_F7SM_lightning_plus[] = {
+const static struct pin_mapping _user_pins_F7SM_lightning_plus[] = {
     { 2, _B, 12, _PP },
     { 4, _E, 15, _PP },
     { 6, _E, 14, _PP },
     { 0,  0,  0, _PP } };
+const static struct pin_mapping _user_pins_F7SM_slim[] = {
+    { 0,  0,  0, _PP } };
 const static struct board_config _board_config[] = {
     [F7SM_basic_v1] = {
         .hse_mhz   = 8,
-        .user_pins = _user_pins_F7SM_basic_v1 },
+        .user_pins = _user_pins_F7SM_basic_v1,
+        .msel_pins = _msel_pins_std },
     [F7SM_ant_goffart_f7_plus_v1] = {
         .hse_mhz   = 8,
-        .user_pins = _user_pins_F7SM_ant_goffart_f7_plus_v1 },
+        .user_pins = _user_pins_F7SM_ant_goffart_f7_plus_v1,
+        .msel_pins = _msel_pins_std },
     [F7SM_lightning] = {
         .hse_mhz   = 16,
         .hs_usb    = TRUE,
-        .user_pins = _user_pins_F7SM_lightning },
+        .user_pins = _user_pins_F7SM_lightning,
+        .msel_pins = _msel_pins_std },
     [F7SM_basic_v2] = {
         .hse_mhz   = 8,
-        .user_pins = _user_pins_F7SM_basic_v2 },
+        .user_pins = _user_pins_F7SM_basic_v2,
+        .msel_pins = _msel_pins_std },
     [F7SM_ant_goffart_f7_plus_v2] = {
         .hse_mhz   = 8,
-        .user_pins = _user_pins_F7SM_ant_goffart_f7_plus_v2 },
+        .user_pins = _user_pins_F7SM_ant_goffart_f7_plus_v2,
+        .msel_pins = _msel_pins_std },
     [F7SM_lightning_plus] = {
         .hse_mhz   = 16,
         .hse_byp   = TRUE,
         .hs_usb    = TRUE,
-        .user_pins = _user_pins_F7SM_lightning_plus },
+        .user_pins = _user_pins_F7SM_lightning_plus,
+        .msel_pins = _msel_pins_std },
+    [F7SM_slim] = {
+        .hse_mhz   = 16,
+        .hse_byp   = TRUE,
+        .user_pins = _user_pins_F7SM_slim,
+        .msel_pins = _msel_pins_f7_slim },
 };
 const struct board_config *board_config;
 
@@ -149,7 +193,7 @@ static void mcu_board_init(void)
 {
     uint16_t pu[] = {
         [_A] = 0x9930, /* PA4-5,8,11-12,15 */
-        [_B] = 0x23f8, /* PB3-9,13 */
+        [_B] = 0x2ffb, /* PB0-1,3-11,13 */
         [_C] = 0xffe7, /* PC0-2,5-15 */
         [_D] = 0xffff, /* PD0-15 */
         [_E] = 0xffff, /* PE0-15 */
@@ -159,7 +203,8 @@ static void mcu_board_init(void)
         [_I] = 0xffff, /* PI0-15 */
     };
     uint32_t ahb1enr = rcc->ahb1enr;
-    const struct user_pin *upin;
+    const struct pin_mapping *mpin;
+    const struct pin_mapping *upin;
 
     /* Enable all GPIO bank register clocks to configure unused pins. */
     rcc->ahb1enr |= (RCC_AHB1ENR_GPIOAEN |
@@ -173,6 +218,10 @@ static void mcu_board_init(void)
                      RCC_AHB1ENR_GPIOIEN);
     peripheral_clock_delay();
 
+    /* MSEL pins: do not default these pins to pull-up mode. */
+    for (mpin = board_config->msel_pins; mpin->pin_id != 0; mpin++)
+        pu[mpin->gpio_bank] &= ~(1u << mpin->gpio_pin);
+
     /* Keep clock enabled for all banks containing user-modifiable pins. 
      * Also do not default these pins to pull-up mode. */
     for (upin = board_config->user_pins; upin->pin_id != 0; upin++) {
@@ -186,6 +235,12 @@ static void mcu_board_init(void)
         pu[_C] &= ~(1u << 1);
     }
 
+    /* F7 Slim: Extra pins should float in case they are inputs (drive->GW). */
+    if (gw_info.hw_submodel == F7SM_slim) {
+        pu[_B] &= ~((1u << 0) | (1u << 12)); /* PB0, PB12 */
+        pu[_C] &= ~(1u << 8); /* PC8 */
+    }
+
     gpio_pull_up_pins(gpioa, pu[_A]);
     gpio_pull_up_pins(gpiob, pu[_B]);
     gpio_pull_up_pins(gpioc, pu[_C]);

+ 45 - 32
src/f7/floppy.c

@@ -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);