1 /*
2  * This file is part of the MicroPython project, http://micropython.org/
3  * The MIT License (MIT)
4  * Copyright (c) 2021 Damien P. George
5  */
6 
7 #include <stdint.h>
8 
9 #define MICROPY_HW_BOARD_NAME                    "LEGO Technic Hub No.6"
10 #define MICROPY_HW_MCU_NAME                      "STM32F413"
11 
12 #define MICROPY_HW_HAS_SWITCH                    (0)
13 #define MICROPY_HW_HAS_FLASH                     (1)
14 #define MICROPY_PY_PYB_LEGACY                    (0)
15 #define MICROPY_HW_ENTER_BOOTLOADER_VIA_RESET    (0)
16 #define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (0)
17 #define MICROPY_HW_ENABLE_RTC                    (1)
18 #define MICROPY_HW_ENABLE_RNG                    (1)
19 #define MICROPY_HW_ENABLE_DAC                    (1)
20 #define MICROPY_HW_ENABLE_USB                    (1)
21 
22 // HSE is 16MHz, CPU freq set to 100MHz, buses at maximum freq
23 #define MICROPY_HW_CLK_PLLM                      (16)
24 #define MICROPY_HW_CLK_PLLN                      (200)
25 #define MICROPY_HW_CLK_PLLP                      (RCC_PLLP_DIV2)
26 #define MICROPY_HW_CLK_PLLQ                      (4)
27 #define MICROPY_HW_CLK_AHB_DIV                   (RCC_SYSCLK_DIV1)
28 #define MICROPY_HW_CLK_APB1_DIV                  (RCC_HCLK_DIV2)
29 #define MICROPY_HW_CLK_APB2_DIV                  (RCC_HCLK_DIV1)
30 
31 // For 2.7 to 3.6 V, 75 to 100 MHz: 3 wait states.
32 #define MICROPY_HW_FLASH_LATENCY                 FLASH_LATENCY_3
33 
34 // UART buses
35 // Bluetooth HCI
36 #define MICROPY_HW_UART2_CTS                     (pin_D3)
37 #define MICROPY_HW_UART2_RTS                     (pin_D4)
38 #define MICROPY_HW_UART2_TX                      (pin_D5)
39 #define MICROPY_HW_UART2_RX                      (pin_D6)
40 // Port B
41 #define MICROPY_HW_UART4_TX                      (pin_D1)
42 #define MICROPY_HW_UART4_RX                      (pin_D0)
43 // Port D
44 #define MICROPY_HW_UART5_TX                      (pin_C12)
45 #define MICROPY_HW_UART5_RX                      (pin_D2)
46 // Port A
47 #define MICROPY_HW_UART7_TX                      (pin_E8)
48 #define MICROPY_HW_UART7_RX                      (pin_E7)
49 // Port C
50 #define MICROPY_HW_UART8_TX                      (pin_E1)
51 #define MICROPY_HW_UART8_RX                      (pin_E0)
52 // Port F
53 #define MICROPY_HW_UART9_TX                      (pin_D15)
54 #define MICROPY_HW_UART9_RX                      (pin_D14)
55 // Port E
56 #define MICROPY_HW_UART10_TX                     (pin_E3)
57 #define MICROPY_HW_UART10_RX                     (pin_E2)
58 
59 // SPI buses
60 #define MICROPY_HW_SPI1_NSS                      (pin_A4) // shared with DAC
61 #define MICROPY_HW_SPI1_SCK                      (pin_A5) // shared with DAC
62 #define MICROPY_HW_SPI1_MISO                     (pin_A6)
63 #define MICROPY_HW_SPI1_MOSI                     (pin_A7)
64 #define MICROPY_HW_SPI2_NSS                      (pin_B12)
65 #define MICROPY_HW_SPI2_SCK                      (pin_B13)
66 #define MICROPY_HW_SPI2_MISO                     (pin_C2)
67 #define MICROPY_HW_SPI2_MOSI                     (pin_C3)
68 
69 // USB config
70 #define MICROPY_HW_USB_VBUS_DETECT_PIN           (pin_A9)
71 #define MICROPY_HW_USB_FS                        (1)
72 #define MICROPY_HW_USB_MSC                       (1)
73 
74 // Bluetooth config
75 #define MICROPY_HW_BLE_UART_ID                   (PYB_UART_2)
76 #define MICROPY_HW_BLE_UART_BAUDRATE             (115200)
77 #define MICROPY_HW_BLE_UART_BAUDRATE_SECONDARY   (921600)
78 #define MICROPY_HW_BLE_BTSTACK_CHIPSET_INSTANCE  btstack_chipset_cc256x_instance()
79 
80 // SPI flash, for R/W storage
81 // The first 1MiB is skipped because it's used by the built-in bootloader
82 // Note: MICROPY_HW_SPIFLASH_OFFSET_BYTES must be a multiple of MP_SPIFLASH_ERASE_BLOCK_SIZE
83 #define MICROPY_HW_SPIFLASH_OFFSET_BYTES         (1024 * 1024)
84 #define MICROPY_HW_SPIFLASH_BLOCKMAP(bl)         ((bl) + MICROPY_HW_SPIFLASH_OFFSET_BYTES / FLASH_BLOCK_SIZE)
85 #define MICROPY_HW_SPIFLASH_BLOCKMAP_EXT(bl)     ((bl) + MICROPY_HW_SPIFLASH_OFFSET_BYTES / MP_SPIFLASH_ERASE_BLOCK_SIZE)
86 #define MICROPY_HW_SPIFLASH_ENABLE_CACHE         (1)
87 #define MICROPY_HW_SPIFLASH_SIZE_BITS            (256 * 1024 * 1024 - MICROPY_HW_SPIFLASH_OFFSET_BYTES * 8)
88 #define MICROPY_HW_SPIFLASH_CS                   (MICROPY_HW_SPI2_NSS)
89 #define MICROPY_HW_SPIFLASH_SCK                  (MICROPY_HW_SPI2_SCK)
90 #define MICROPY_HW_SPIFLASH_MISO                 (MICROPY_HW_SPI2_MISO)
91 #define MICROPY_HW_SPIFLASH_MOSI                 (MICROPY_HW_SPI2_MOSI)
92 
93 // SPI flash, block device config
94 extern int32_t board_bdev_ioctl(void);
95 extern struct _spi_bdev_t spi_bdev;
96 #define MICROPY_HW_BDEV_IOCTL(op, arg) ( \
97     (op) == BDEV_IOCTL_NUM_BLOCKS ? (MICROPY_HW_SPIFLASH_SIZE_BITS / 8 / FLASH_BLOCK_SIZE) : \
98     (op) == BDEV_IOCTL_INIT ? board_bdev_ioctl() : \
99     spi_bdev_ioctl(&spi_bdev, (op), (arg)) \
100     )
101 
102 // Configuration for stardard block protocol (block size FLASH_BLOCK_SIZE).
103 #define MICROPY_HW_BDEV_READBLOCKS(dest, bl, n) \
104     spi_bdev_readblocks(&spi_bdev, (dest), MICROPY_HW_SPIFLASH_BLOCKMAP(bl), (n))
105 #define MICROPY_HW_BDEV_WRITEBLOCKS(src, bl, n) \
106     spi_bdev_writeblocks(&spi_bdev, (src), MICROPY_HW_SPIFLASH_BLOCKMAP(bl), (n))
107 
108 // Configuration for extended block protocol (block size MP_SPIFLASH_ERASE_BLOCK_SIZE).
109 #define MICROPY_HW_BDEV_BLOCKSIZE_EXT (MP_SPIFLASH_ERASE_BLOCK_SIZE)
110 #define MICROPY_HW_BDEV_READBLOCKS_EXT(dest, bl, off, len) \
111     (spi_bdev_readblocks_raw(&spi_bdev, (dest), MICROPY_HW_SPIFLASH_BLOCKMAP_EXT(bl), (off), (len)))
112 #define MICROPY_HW_BDEV_WRITEBLOCKS_EXT(src, bl, off, len) \
113     (spi_bdev_writeblocks_raw(&spi_bdev, (src), MICROPY_HW_SPIFLASH_BLOCKMAP_EXT(bl), (off), (len)))
114 #define MICROPY_HW_BDEV_ERASEBLOCKS_EXT(bl, len) \
115     (spi_bdev_eraseblocks_raw(&spi_bdev, MICROPY_HW_SPIFLASH_BLOCKMAP_EXT(bl), (len)))
116 
117 // Board control config
118 #define MICROPY_BOARD_STARTUP                    board_init
119 
120 /******************************************************************************/
121 // Bootloader configuration
122 
123 #define MBOOT_LEAVE_BOOTLOADER_VIA_RESET         (0)
124 
125 #define MBOOT_LED1                               0
126 #define MBOOT_BOARD_LED_INIT                     board_mboot_led_init
127 #define MBOOT_BOARD_LED_STATE                    board_mboot_led_state
128 
129 #define MBOOT_BOARD_EARLY_INIT                   board_init
130 #define MBOOT_BOARD_CLEANUP                      board_mboot_cleanup
131 #define MBOOT_BOARD_GET_RESET_MODE               board_mboot_get_reset_mode
132 
133 /******************************************************************************/
134 // Function declarations
135 
136 void board_init(void);
137 void board_mboot_cleanup(int reset_mode);
138 void board_mboot_led_init(void);
139 void board_mboot_led_state(int led, int state);
140 int board_mboot_get_reset_mode(void);
141 void *btstack_chipset_cc256x_instance(void);
142