diff options
| author | Joel Challis <git@zvecr.com> | 2021-10-22 00:49:58 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-22 00:49:58 +0100 |
| commit | 0093d3d761e60a31bb2a15a5859dbd0c08ef9999 (patch) | |
| tree | 144db2e99236bd0fc2654cbeaecc57bbb5409b39 /drivers | |
| parent | 1b1f3ec68ee1e7abe436a46bcfedf30f21330aef (diff) | |
| download | qmk_firmware-0093d3d761e60a31bb2a15a5859dbd0c08ef9999.tar.gz qmk_firmware-0093d3d761e60a31bb2a15a5859dbd0c08ef9999.zip | |
Initial USB2422 driver (#14835)
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb2422.c | 402 | ||||
| -rw-r--r-- | drivers/usb2422.h | 59 |
2 files changed, 461 insertions, 0 deletions
diff --git a/drivers/usb2422.c b/drivers/usb2422.c new file mode 100644 index 000000000..62b919093 --- /dev/null +++ b/drivers/usb2422.c | |||
| @@ -0,0 +1,402 @@ | |||
| 1 | /* Copyright 2021 QMK | ||
| 2 | * | ||
| 3 | * This program is free software: you can redistribute it and/or modify | ||
| 4 | * it under the terms of the GNU General Public License as published by | ||
| 5 | * the Free Software Foundation, either version 3 of the License, or | ||
| 6 | * (at your option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 15 | */ | ||
| 16 | #include <string.h> | ||
| 17 | #include "usb2422.h" | ||
| 18 | #include "i2c_master.h" | ||
| 19 | #include "wait.h" | ||
| 20 | #include "gpio.h" | ||
| 21 | |||
| 22 | /* -------- USB2422_VID : (USB2422L Offset: 0x00) (R/W 16) Vendor ID -------- */ | ||
| 23 | typedef union { | ||
| 24 | struct { | ||
| 25 | uint16_t VID_LSB : 8; | ||
| 26 | uint16_t VID_MSB : 8; | ||
| 27 | } bit; /*!< Structure used for bit access */ | ||
| 28 | uint16_t reg; /*!< Type used for register access */ | ||
| 29 | } USB2422_VID_Type; | ||
| 30 | |||
| 31 | /* -------- USB2422_PID : (USB2422L Offset: 0x02) (R/W 16) Product ID -------- */ | ||
| 32 | typedef union { | ||
| 33 | struct { | ||
| 34 | uint16_t PID_LSB : 8; | ||
| 35 | uint16_t PID_MSB : 8; | ||
| 36 | } bit; /*!< Structure used for bit access */ | ||
| 37 | uint16_t reg; /*!< Type used for register access */ | ||
| 38 | } USB2422_PID_Type; | ||
| 39 | |||
| 40 | /* -------- USB2422_DID : (USB2422L Offset: 0x04) (R/W 16) Device ID -------- */ | ||
| 41 | typedef union { | ||
| 42 | struct { | ||
| 43 | uint16_t DID_LSB : 8; | ||
| 44 | uint16_t DID_MSB : 8; | ||
| 45 | } bit; /*!< Structure used for bit access */ | ||
| 46 | uint16_t reg; /*!< Type used for register access */ | ||
| 47 | } USB2422_DID_Type; | ||
| 48 | |||
| 49 | /* -------- USB2422_CFG1 : (USB2422L Offset: 0x06) (R/W 8) Configuration Data Byte 1-------- */ | ||
| 50 | typedef union { | ||
| 51 | struct { | ||
| 52 | uint8_t PORT_PWR : 1; | ||
| 53 | uint8_t CURRENT_SNS : 2; | ||
| 54 | uint8_t EOP_DISABLE : 1; | ||
| 55 | uint8_t MTT_ENABLE : 1; | ||
| 56 | uint8_t HS_DISABLE : 1; | ||
| 57 | uint8_t : 1; | ||
| 58 | uint8_t SELF_BUS_PWR : 1; | ||
| 59 | } bit; /*!< Structure used for bit access */ | ||
| 60 | uint8_t reg; /*!< Type used for register access */ | ||
| 61 | } USB2422_CFG1_Type; | ||
| 62 | |||
| 63 | /* -------- USB2422_CFG2 : (USB2422L Offset: 0x07) (R/W 8) Configuration Data Byte 2-------- */ | ||
| 64 | typedef union { | ||
| 65 | struct { | ||
| 66 | uint8_t : 3; | ||
| 67 | uint8_t COMPOUND : 1; | ||
| 68 | uint8_t OC_TIMER : 2; | ||
| 69 | uint8_t : 1; | ||
| 70 | uint8_t DYNAMIC : 1; | ||
| 71 | } bit; /*!< Structure used for bit access */ | ||
| 72 | uint8_t reg; /*!< Type used for register access */ | ||
| 73 | } USB2422_CFG2_Type; | ||
| 74 | |||
| 75 | /* -------- USB2422_CFG3 : (USB2422L Offset: 0x08) (R/W 16) Configuration Data Byte 3-------- */ | ||
| 76 | typedef union { | ||
| 77 | struct { | ||
| 78 | uint8_t STRING_EN : 1; | ||
| 79 | uint8_t : 2; | ||
| 80 | uint8_t PRTMAP_EN : 1; | ||
| 81 | uint8_t : 4; | ||
| 82 | } bit; /*!< Structure used for bit access */ | ||
| 83 | uint8_t reg; /*!< Type used for register access */ | ||
| 84 | } USB2422_CFG3_Type; | ||
| 85 | |||
| 86 | /* -------- USB2422_NRD : (USB2422L Offset: 0x09) (R/W 8) Non Removable Device -------- */ | ||
| 87 | typedef union { | ||
| 88 | struct { | ||
| 89 | uint8_t : 5; | ||
| 90 | uint8_t PORT2_NR : 1; | ||
| 91 | uint8_t PORT1_NR : 1; | ||
| 92 | uint8_t : 1; | ||
| 93 | } bit; /*!< Structure used for bit access */ | ||
| 94 | uint8_t reg; /*!< Type used for register access */ | ||
| 95 | } USB2422_NRD_Type; | ||
| 96 | |||
| 97 | /* -------- USB2422_PDS : (USB2422L Offset: 0x0A) (R/W 8) Port Diable for Self-Powered Operation -------- */ | ||
| 98 | typedef union { | ||
| 99 | struct { | ||
| 100 | uint8_t : 1; | ||
| 101 | uint8_t PORT1_DIS : 1; | ||
| 102 | uint8_t PORT2_DIS : 1; | ||
| 103 | uint8_t : 5; | ||
| 104 | } bit; /*!< Structure used for bit access */ | ||
| 105 | uint8_t reg; /*!< Type used for register access */ | ||
| 106 | } USB2422_PDS_Type; | ||
| 107 | |||
| 108 | /* -------- USB2422_PDB : (USB2422L Offset: 0x0B) (R/W 8) Port Diable for Bus-Powered Operation -------- */ | ||
| 109 | |||
| 110 | typedef union { | ||
| 111 | struct { | ||
| 112 | uint8_t : 1; | ||
| 113 | uint8_t PORT1_DIS : 1; | ||
| 114 | uint8_t PORT2_DIS : 1; | ||
| 115 | uint8_t : 5; | ||
| 116 | } bit; /*!< Structure used for bit access */ | ||
| 117 | uint8_t reg; /*!< Type used for register access */ | ||
| 118 | } USB2422_PDB_Type; | ||
| 119 | |||
| 120 | /* -------- USB2422_MAXPS : (USB2422L Offset: 0x0C) (R/W 8) Max Power for Self-Powered Operation -------- */ | ||
| 121 | typedef union { | ||
| 122 | struct { | ||
| 123 | uint8_t MAX_PWR_SP : 8; | ||
| 124 | } bit; /*!< Structure used for bit access */ | ||
| 125 | uint8_t reg; /*!< Type used for register access */ | ||
| 126 | } USB2422_MAXPS_Type; | ||
| 127 | |||
| 128 | /* -------- USB2422_MAXPB : (USB2422L Offset: 0x0D) (R/W 8) Max Power for Bus-Powered Operation -------- */ | ||
| 129 | typedef union { | ||
| 130 | struct { | ||
| 131 | uint8_t MAX_PWR_BP : 8; | ||
| 132 | } bit; /*!< Structure used for bit access */ | ||
| 133 | uint8_t reg; /*!< Type used for register access */ | ||
| 134 | } USB2422_MAXPB_Type; | ||
| 135 | |||
| 136 | /* -------- USB2422_HCMCS : (USB2422L Offset: 0x0E) (R/W 8) Hub Controller Max Current for Self-Powered Operation -------- */ | ||
| 137 | typedef union { | ||
| 138 | struct { | ||
| 139 | uint8_t HC_MAX_C_SP : 8; | ||
| 140 | } bit; /*!< Structure used for bit access */ | ||
| 141 | uint8_t reg; /*!< Type used for register access */ | ||
| 142 | } USB2422_HCMCS_Type; | ||
| 143 | |||
| 144 | /* -------- USB2422_HCMCB : (USB2422L Offset: 0x0F) (R/W 8) Hub Controller Max Current for Bus-Powered Operation -------- */ | ||
| 145 | typedef union { | ||
| 146 | struct { | ||
| 147 | uint8_t HC_MAX_C_BP : 8; | ||
| 148 | } bit; /*!< Structure used for bit access */ | ||
| 149 | uint8_t reg; /*!< Type used for register access */ | ||
| 150 | } USB2422_HCMCB_Type; | ||
| 151 | |||
| 152 | /* -------- USB2422_PWRT : (USB2422L Offset: 0x10) (R/W 8) Power On Time -------- */ | ||
| 153 | typedef union { | ||
| 154 | struct { | ||
| 155 | uint8_t POWER_ON_TIME : 8; | ||
| 156 | } bit; /*!< Structure used for bit access */ | ||
| 157 | uint8_t reg; /*!< Type used for register access */ | ||
| 158 | } USB2422_PWRT_Type; | ||
| 159 | |||
| 160 | /* -------- USB2422_LANGID LSB : (USB2422L Offset: 0x11) (R/W 16) Language ID -------- */ | ||
| 161 | typedef union { | ||
| 162 | struct { | ||
| 163 | uint8_t LANGID_LSB : 8; | ||
| 164 | } bit; /*!< Structure used for bit access */ | ||
| 165 | uint8_t reg; /*!< Type used for register access */ | ||
| 166 | } USB2422_LANGID_LSB_Type; | ||
| 167 | |||
| 168 | /* -------- USB2422_LANGID MSB : (USB2422L Offset: 0x12) (R/W 16) Language ID -------- */ | ||
| 169 | typedef union { | ||
| 170 | struct { | ||
| 171 | uint8_t LANGID_MSB : 8; | ||
| 172 | } bit; /*!< Structure used for bit access */ | ||
| 173 | uint8_t reg; /*!< Type used for register access */ | ||
| 174 | } USB2422_LANGID_MSB_Type; | ||
| 175 | |||
| 176 | /* -------- USB2422_MFRSL : (USB2422L Offset: 0x13) (R/W 8) Manufacturer String Length -------- */ | ||
| 177 | typedef union { | ||
| 178 | struct { | ||
| 179 | uint8_t MFR_STR_LEN : 8; | ||
| 180 | } bit; /*!< Structure used for bit access */ | ||
| 181 | uint8_t reg; /*!< Type used for register access */ | ||
| 182 | } USB2422_MFRSL_Type; | ||
| 183 | |||
| 184 | /* -------- USB2422_PRDSL : (USB2422L Offset: 0x14) (R/W 8) Product String Length -------- */ | ||
| 185 | typedef union { | ||
| 186 | struct { | ||
| 187 | uint8_t PRD_STR_LEN : 8; | ||
| 188 | } bit; /*!< Structure used for bit access */ | ||
| 189 | uint8_t reg; /*!< Type used for register access */ | ||
| 190 | } USB2422_PRDSL_Type; | ||
| 191 | |||
| 192 | /* -------- USB2422_SERSL : (USB2422L Offset: 0x15) (R/W 8) Serial String Length -------- */ | ||
| 193 | typedef union { | ||
| 194 | struct { | ||
| 195 | uint8_t SER_STR_LEN : 8; | ||
| 196 | } bit; /*!< Structure used for bit access */ | ||
| 197 | uint8_t reg; /*!< Type used for register access */ | ||
| 198 | } USB2422_SERSL_Type; | ||
| 199 | |||
| 200 | /* -------- USB2422_MFRSTR : (USB2422L Offset: 0x16-53) (R/W 8) Maufacturer String -------- */ | ||
| 201 | typedef uint16_t USB2422_MFRSTR_Type; | ||
| 202 | |||
| 203 | /* -------- USB2422_PRDSTR : (USB2422L Offset: 0x54-91) (R/W 8) Product String -------- */ | ||
| 204 | typedef uint16_t USB2422_PRDSTR_Type; | ||
| 205 | |||
| 206 | /* -------- USB2422_SERSTR : (USB2422L Offset: 0x92-CF) (R/W 8) Serial String -------- */ | ||
| 207 | typedef uint16_t USB2422_SERSTR_Type; | ||
| 208 | |||
| 209 | /* -------- USB2422_BCEN : (USB2422L Offset: 0xD0) (R/W 8) Battery Charging Enable -------- */ | ||
| 210 | |||
| 211 | typedef union { | ||
| 212 | struct { | ||
| 213 | uint8_t : 1; | ||
| 214 | uint8_t PORT1_BCE : 1; | ||
| 215 | uint8_t PORT2_BCE : 1; | ||
| 216 | uint8_t : 5; | ||
| 217 | } bit; /*!< Structure used for bit access */ | ||
| 218 | uint8_t reg; /*!< Type used for register access */ | ||
| 219 | } USB2422_BCEN_Type; | ||
| 220 | |||
| 221 | /* -------- USB2422_BOOSTUP : (USB2422L Offset: 0xF6) (R/W 8) Boost Upstream -------- */ | ||
| 222 | typedef union { | ||
| 223 | struct { | ||
| 224 | uint8_t BOOST : 2; | ||
| 225 | uint8_t : 6; | ||
| 226 | } bit; /*!< Structure used for bit access */ | ||
| 227 | uint8_t reg; /*!< Type used for register access */ | ||
| 228 | } USB2422_BOOSTUP_Type; | ||
| 229 | |||
| 230 | /* -------- USB2422_BOOSTDOWN : (USB2422L Offset: 0xF8) (R/W 8) Boost Downstream -------- */ | ||
| 231 | typedef union { | ||
| 232 | struct { | ||
| 233 | uint8_t BOOST1 : 2; | ||
| 234 | uint8_t BOOST2 : 2; | ||
| 235 | uint8_t : 4; | ||
| 236 | } bit; /*!< Structure used for bit access */ | ||
| 237 | uint8_t reg; /*!< Type used for register access */ | ||
| 238 | } USB2422_BOOSTDOWN_Type; | ||
| 239 | |||
| 240 | /* -------- USB2422_PRTSP : (USB2422L Offset: 0xFA) (R/W 8) Port Swap -------- */ | ||
| 241 | typedef union { | ||
| 242 | struct { | ||
| 243 | uint8_t : 1; | ||
| 244 | uint8_t PORT1_SP : 1; | ||
| 245 | uint8_t PORT2_SP : 1; | ||
| 246 | uint8_t : 5; | ||
| 247 | } bit; /*!< Structure used for bit access */ | ||
| 248 | uint8_t reg; /*!< Type used for register access */ | ||
| 249 | } USB2422_PRTSP_Type; | ||
| 250 | |||
| 251 | /* -------- USB2422_PRTR12 : (USB2422L Offset: 0xFB) (R/W 8) Port 1/2 Remap -------- */ | ||
| 252 | typedef union { | ||
| 253 | struct { | ||
| 254 | uint8_t PORT1_REMAP : 4; | ||
| 255 | uint8_t PORT2_REMAP : 4; | ||
| 256 | } bit; /*!< Structure used for bit access */ | ||
| 257 | uint8_t reg; /*!< Type used for register access */ | ||
| 258 | } USB2422_PRTR12_Type; | ||
| 259 | |||
| 260 | #define USB2422_PRTR12_DISABLE 0 | ||
| 261 | #define USB2422_PRT12_P2TOL1 1 | ||
| 262 | #define USB2422_PRT12_P2XTOL2 2 | ||
| 263 | #define USB2422_PRT12_P1TOL1 1 | ||
| 264 | #define USB2422_PRT12_P1XTOL2 2 | ||
| 265 | |||
| 266 | /* -------- USB2422_STCD : (USB2422L Offset: 0xFF) (R/W 8) Status Command -------- */ | ||
| 267 | typedef union { | ||
| 268 | struct { | ||
| 269 | uint8_t USB_ATTACH : 1; | ||
| 270 | uint8_t RESET : 1; | ||
| 271 | uint8_t INTF_PWRDN : 1; | ||
| 272 | uint8_t : 5; | ||
| 273 | } bit; /*!< Structure used for bit access */ | ||
| 274 | uint8_t reg; /*!< Type used for register access */ | ||
| 275 | } USB2422_STCD_Type; | ||
| 276 | |||
| 277 | /** \brief USB2422 device hardware registers */ | ||
| 278 | typedef struct { | ||
| 279 | USB2422_VID_Type VID; /**< \brief Offset: 0x00*/ | ||
| 280 | USB2422_PID_Type PID; /**< \brief Offset: 0x02*/ | ||
| 281 | USB2422_DID_Type DID; /**< \brief Offset: 0x04*/ | ||
| 282 | USB2422_CFG1_Type CFG1; /**< \brief Offset: 0x06*/ | ||
| 283 | USB2422_CFG2_Type CFG2; /**< \brief Offset: 0x07*/ | ||
| 284 | USB2422_CFG3_Type CFG3; /**< \brief Offset: 0x08*/ | ||
| 285 | USB2422_NRD_Type NRD; /**< \brief Offset: 0x09*/ | ||
| 286 | USB2422_PDS_Type PDS; /**< \brief Offset: 0x0A*/ | ||
| 287 | USB2422_PDB_Type PDB; /**< \brief Offset: 0x0B*/ | ||
| 288 | USB2422_MAXPS_Type MAXPS; /**< \brief Offset: 0x0C*/ | ||
| 289 | USB2422_MAXPB_Type MAXPB; /**< \brief Offset: 0x0D*/ | ||
| 290 | USB2422_HCMCS_Type HCMCS; /**< \brief Offset: 0x0E*/ | ||
| 291 | USB2422_HCMCB_Type HCMCB; /**< \brief Offset: 0x0F*/ | ||
| 292 | USB2422_PWRT_Type PWRT; /**< \brief Offset: 0x10*/ | ||
| 293 | USB2422_LANGID_LSB_Type LANGID_LSB; /**< \brief Offset: 0x11*/ | ||
| 294 | USB2422_LANGID_MSB_Type LANGID_MSB; /**< \brief Offset: 0x12*/ | ||
| 295 | USB2422_MFRSL_Type MFRSL; /**< \brief Offset: 0x13*/ | ||
| 296 | USB2422_PRDSL_Type PRDSL; /**< \brief Offset: 0x14*/ | ||
| 297 | USB2422_SERSL_Type SERSL; /**< \brief Offset: 0x15*/ | ||
| 298 | USB2422_MFRSTR_Type MFRSTR[31]; /**< \brief Offset: 0x16*/ | ||
| 299 | USB2422_PRDSTR_Type PRDSTR[31]; /**< \brief Offset: 0x54*/ | ||
| 300 | USB2422_SERSTR_Type SERSTR[31]; /**< \brief Offset: 0x92*/ | ||
| 301 | USB2422_BCEN_Type BCEN; /**< \brief Offset: 0xD0*/ | ||
| 302 | uint8_t Reserved1[0x25]; | ||
| 303 | USB2422_BOOSTUP_Type BOOSTUP; /**< \brief Offset: 0xF6*/ | ||
| 304 | uint8_t Reserved2[0x1]; | ||
| 305 | USB2422_BOOSTDOWN_Type BOOSTDOWN; /**< \brief Offset: 0xF8*/ | ||
| 306 | uint8_t Reserved3[0x1]; | ||
| 307 | USB2422_PRTSP_Type PRTSP; /**< \brief Offset: 0xFA*/ | ||
| 308 | USB2422_PRTR12_Type PRTR12; /**< \brief Offset: 0xFB*/ | ||
| 309 | uint8_t Reserved4[0x3]; | ||
| 310 | USB2422_STCD_Type STCD; /**< \brief Offset: 0xFF*/ | ||
| 311 | } Usb2422_t; | ||
| 312 | |||
| 313 | // *************************************************************** | ||
| 314 | |||
| 315 | static Usb2422_t config; | ||
| 316 | |||
| 317 | // *************************************************************** | ||
| 318 | |||
| 319 | /** \brief Handle the conversion to allow simple strings | ||
| 320 | */ | ||
| 321 | static void USB2422_strcpy(const char* str, USB2422_MFRSTR_Type* dest, uint8_t len) { | ||
| 322 | for (uint8_t i = 0; i < len; i++) { | ||
| 323 | dest[i] = str[i]; | ||
| 324 | } | ||
| 325 | } | ||
| 326 | |||
| 327 | /** \brief Handle the conversion to allow simple strings | ||
| 328 | */ | ||
| 329 | static void USB2422_write_block(void) { | ||
| 330 | static unsigned char i2c0_buf[34]; | ||
| 331 | |||
| 332 | unsigned char* dest = i2c0_buf; | ||
| 333 | unsigned char* src; | ||
| 334 | unsigned char* base = (unsigned char*)&config; | ||
| 335 | |||
| 336 | for (src = base; src < base + 256; src += 32) { | ||
| 337 | dest[0] = src - base; | ||
| 338 | dest[1] = 32; | ||
| 339 | memcpy(&dest[2], src, 32); | ||
| 340 | i2c_transmit(USB2422_ADDRESS, dest, 34, 50000); | ||
| 341 | wait_us(100); | ||
| 342 | } | ||
| 343 | } | ||
| 344 | |||
| 345 | // *************************************************************** | ||
| 346 | |||
| 347 | void USB2422_init() { | ||
| 348 | #ifdef USB2422_RESET_PIN | ||
| 349 | setPinOutput(USB2422_RESET_PIN); | ||
| 350 | #endif | ||
| 351 | #ifdef USB2422_ACTIVE_PIN | ||
| 352 | setPinInput(USB2422_ACTIVE_PIN); | ||
| 353 | #endif | ||
| 354 | |||
| 355 | i2c_init(); // IC2 clk must be high at USB2422 reset release time to signal SMB configuration | ||
| 356 | } | ||
| 357 | |||
| 358 | void USB2422_configure() { | ||
| 359 | static const char SERNAME[] = "Unavailable"; | ||
| 360 | |||
| 361 | memset(&config, 0, sizeof(Usb2422_t)); | ||
| 362 | |||
| 363 | // configure Usb2422 registers | ||
| 364 | config.VID.reg = USB2422_VENDOR_ID; | ||
| 365 | config.PID.reg = USB2422_PRODUCT_ID; | ||
| 366 | config.DID.reg = USB2422_DEVICE_VER; // BCD format, eg 01.01 | ||
| 367 | config.CFG1.bit.SELF_BUS_PWR = 1; // self powered for now | ||
| 368 | config.CFG1.bit.HS_DISABLE = 1; // full or high speed | ||
| 369 | // config.CFG2.bit.COMPOUND = 0; // compound device | ||
| 370 | config.CFG3.bit.STRING_EN = 1; // strings enabled | ||
| 371 | // config.NRD.bit.PORT2_NR = 0; // MCU is non-removable | ||
| 372 | config.MAXPB.reg = 20; // 0mA | ||
| 373 | config.HCMCB.reg = 20; // 0mA | ||
| 374 | config.MFRSL.reg = sizeof(USB2422_MANUFACTURER); | ||
| 375 | config.PRDSL.reg = sizeof(USB2422_PRODUCT); | ||
| 376 | config.SERSL.reg = sizeof(SERNAME); | ||
| 377 | USB2422_strcpy(USB2422_MANUFACTURER, config.MFRSTR, sizeof(USB2422_MANUFACTURER)); | ||
| 378 | USB2422_strcpy(USB2422_PRODUCT, config.PRDSTR, sizeof(USB2422_PRODUCT)); | ||
| 379 | USB2422_strcpy(SERNAME, config.SERSTR, sizeof(SERNAME)); | ||
| 380 | // config.BOOSTUP.bit.BOOST=3; //upstream port | ||
| 381 | // config.BOOSTDOWN.bit.BOOST1=0; // extra port | ||
| 382 | // config.BOOSTDOWN.bit.BOOST2=2; //MCU is close | ||
| 383 | config.STCD.bit.USB_ATTACH = 1; | ||
| 384 | |||
| 385 | USB2422_write_block(); | ||
| 386 | } | ||
| 387 | |||
| 388 | void USB2422_reset() { | ||
| 389 | #ifdef USB2422_RESET_PIN | ||
| 390 | writePinLow(USB2422_RESET_PIN); | ||
| 391 | wait_us(2); | ||
| 392 | writePinHigh(USB2422_RESET_PIN); | ||
| 393 | #endif | ||
| 394 | } | ||
| 395 | |||
| 396 | bool USB2422_active() { | ||
| 397 | #ifdef USB2422_ACTIVE_PIN | ||
| 398 | return readPin(USB2422_ACTIVE_PIN); | ||
| 399 | #else | ||
| 400 | return 1; | ||
| 401 | #endif | ||
| 402 | } | ||
diff --git a/drivers/usb2422.h b/drivers/usb2422.h new file mode 100644 index 000000000..2e435b02b --- /dev/null +++ b/drivers/usb2422.h | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | /* Copyright 2021 QMK | ||
| 2 | * | ||
| 3 | * This program is free software: you can redistribute it and/or modify | ||
| 4 | * it under the terms of the GNU General Public License as published by | ||
| 5 | * the Free Software Foundation, either version 3 of the License, or | ||
| 6 | * (at your option) any later version. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | * | ||
| 13 | * You should have received a copy of the GNU General Public License | ||
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 15 | */ | ||
| 16 | #pragma once | ||
| 17 | |||
| 18 | #include <stdbool.h> | ||
| 19 | |||
| 20 | #ifndef USB2422_ADDRESS | ||
| 21 | # define USB2422_ADDRESS 0x58 | ||
| 22 | #endif | ||
| 23 | |||
| 24 | #ifndef USB2422_VENDOR_ID | ||
| 25 | # define USB2422_VENDOR_ID 0xFEED | ||
| 26 | #endif | ||
| 27 | #ifndef USB2422_PRODUCT_ID | ||
| 28 | # define USB2422_PRODUCT_ID 0x0001 | ||
| 29 | #endif | ||
| 30 | #ifndef USB2422_DEVICE_VER | ||
| 31 | # define USB2422_DEVICE_VER 0x0001 | ||
| 32 | #endif | ||
| 33 | |||
| 34 | #ifndef USB2422_MANUFACTURER | ||
| 35 | # define USB2422_MANUFACTURER "QMK" | ||
| 36 | #endif | ||
| 37 | #ifndef USB2422_PRODUCT | ||
| 38 | # define USB2422_PRODUCT "QMK Hub" | ||
| 39 | #endif | ||
| 40 | |||
| 41 | /** \brief Initialises the dependent subsystems */ | ||
| 42 | void USB2422_init(void); | ||
| 43 | |||
| 44 | /** \brief Push configuration to the USB2422 device */ | ||
| 45 | void USB2422_configure(void); | ||
| 46 | |||
| 47 | /** \brief Reset the chip (RESET_N) | ||
| 48 | * | ||
| 49 | * NOTE: | ||
| 50 | * Depends on a valid USB2422_RESET_PIN configuration | ||
| 51 | */ | ||
| 52 | void USB2422_reset(void); | ||
| 53 | |||
| 54 | /** \brief Indicates the USB state of the hub (SUSP_IND) | ||
| 55 | * | ||
| 56 | * NOTE: | ||
| 57 | * Depends on a valid USB2422_ACTIVE_PIN configuration | ||
| 58 | */ | ||
| 59 | bool USB2422_active(void); | ||
