[
  {
    "path": ".gitignore",
    "content": "\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA.lib\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/ChangeLog.c\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/CONFIG.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/DATALUTS.cpp\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/example1.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/example2.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/example3.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/example4.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/INIT.cpp\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/iomacros.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/MODDMA.cpp\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/MODDMA.h\nFirmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/MODDMA/SETUP.cpp\nFirmware/FirmwareSource/Remora-OS6/.mbed\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_Octopus/OCTOPUS_ENDER3/config.txt",
    "content": "{\r\n\t\"Board\": \"BIGTREETECH OCTOPUS\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X DRIVER0 - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PF_13\",\r\n\t\t\"Direction Pin\": \t\"PF_12\",\r\n\t\t\"Enable Pin\": \t\t\"PF_14\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y DRIVER1 - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PG_0\",\r\n\t\t\"Direction Pin\": \t\"PG_1\",\r\n\t\t\"Enable Pin\": \t\t\"PF_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z DRIVER2 - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"PF_11\",\r\n\t\t\"Direction Pin\": \t\"PG_3\",\r\n\t\t\"Enable Pin\": \t\t\"PG_5\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E0 DRIVER3 - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"PG_4\",\r\n\t\t\"Direction Pin\": \t\"PC_1\",\r\n\t\t\"Enable Pin\": \t\t\"PA_0\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min DIAG0\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_6\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max DIAG4\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_12\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min DIAG1\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_9\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max DIAG5\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_13\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min DIAG2\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_10\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max DIAG6\",\r\n\t\t\"Pin\":\t\t\t\t\"PG_14\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Heated Bed tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PF_3\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t0,\r\n\t\t\"PWM Pin\": \t\t\t\"PA_1\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Ext 0 temperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t1,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PF_4\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t1,\r\n\t\t\"PWM Pin\": \t\t\t\"PA_2\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 part cooling fan PWM FAN0\",\r\n\t\t\"SP[i]\": \t\t\t2,\r\n\t\t\"PWM Max\":\t\t\t128,\r\n\t\t\"PWM Pin\": \t\t\t\"PA_8\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe bltouch according to marlin\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"PB_6\"\r\n\t}\r\n\t]\r\n}"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_Octopus/OCTOPUS_xyz/config.txt",
    "content": "{\r\n\t\"Board\": \"BIGTREETECH OCTOPUS\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PF_13\",\r\n\t\t\"Direction Pin\": \t\"PF_12\",\r\n\t\t\"Enable Pin\": \t\t\"PF_14\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PG_0\",\r\n\t\t\"Direction Pin\": \t\"PG_1\",\r\n\t\t\"Enable Pin\": \t\t\"PF_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"PF_11\",\r\n\t\t\"Direction Pin\": \t\"PG_3\",\r\n\t\t\"Enable Pin\": \t\t\"PG_5\"\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv13/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v1.3 & v1.4\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"1.31\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"2.2\",\n\t\t\"Direction Pin\": \t\"2.6\",\n\t\t\"Enable Pin\": \t\t\"2.1\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"0.19\",\n\t\t\"Direction Pin\": \t\"0.20\",\n\t\t\"Enable Pin\": \t\t\"2.08\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"0.22\",\n\t\t\"Direction Pin\": \t\"2.11\",\n\t\t\"Enable Pin\": \t\t\"0.21\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"2.13\",\n\t\t\"Direction Pin\": \t\"0.11\",\n\t\t\"Enable Pin\": \t\t\"2.12\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Extruder tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t0,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.23\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"RCServo\",\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\n\t\t\"SP[i]\": \t\t\t3,\n\t\t\"Servo Pin\": \t\t\"2.0\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Encoder\",\n\t\t\"Comment\":\t\t\t\"Encoder\",\n\t\t\"PV[i]\":\t\t\t2,\n\t\t\"ChA Pin\":\t\t\t\"1.20\",\n\t\t\"ChB Pin\":\t\t\t\"1.22\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"1.29\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X max\",\n\t\t\"Pin\":\t\t\t\t\"1.28\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"1.27\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y max\",\n\t\t\"Pin\":\t\t\t\t\"1.26\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"1.25\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z max\",\n\t\t\"Pin\":\t\t\t\t\"1.24\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"0.0\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t0,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv14/SKRv14_3dp/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v1.4\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"1.31\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"2.2\",\n\t\t\"Direction Pin\": \t\"2.6\",\n\t\t\"Enable Pin\": \t\t\"2.1\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.10\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"0.19\",\n\t\t\"Direction Pin\": \t\"0.20\",\n\t\t\"Enable Pin\": \t\t\"2.08\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.9\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"0.22\",\n\t\t\"Direction Pin\": \t\"2.11\",\n\t\t\"Enable Pin\": \t\t\"0.21\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.8\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"2.13\",\n\t\t\"Direction Pin\": \t\"0.11\",\n\t\t\"Enable Pin\": \t\t\"2.12\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.4\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\n\t\t\"Joint Number\":\t\t4,\n\t\t\"Step Pin\": \t\t\"1.15\",\n\t\t\"Direction Pin\": \t\"1.14\",\n\t\t\"Enable Pin\": \t\t\"1.16\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.1\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\n\t\t\"SP[i]\": \t\t\t0,\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Bed tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t0,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.25\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 heater PWM\",\n\t\t\"SP[i]\": \t\t\t1,\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t1,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.24\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 heater PWM\",\n\t\t\"SP[i]\": \t\t\t2,\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t2,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.23\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"1.29\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"1.28\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"1.27\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E0DET\",\n\t\t\"Pin\":\t\t\t\t\"1.26\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E1DET\",\n\t\t\"Pin\":\t\t\t\t\"1.25\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"PWRDET\",\n\t\t\"Pin\":\t\t\t\t\"1.0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Probe\",\n\t\t\"Pin\":\t\t\t\t\"0.10\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t6\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"RCServo\",\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\n\t\t\"SP[i]\": \t\t\t3,\n\t\t\"Servo Pin\": \t\t\"2.0\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"0.0\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t1,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv14/SKRv14_TMC2209/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v1.4\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"1.31\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"2.2\",\n\t\t\"Direction Pin\": \t\"2.6\",\n\t\t\"Enable Pin\": \t\t\"2.1\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.10\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"0.19\",\n\t\t\"Direction Pin\": \t\"0.20\",\n\t\t\"Enable Pin\": \t\t\"2.08\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.9\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"0.22\",\n\t\t\"Direction Pin\": \t\"2.11\",\n\t\t\"Enable Pin\": \t\t\"0.21\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.8\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"2.13\",\n\t\t\"Direction Pin\": \t\"0.11\",\n\t\t\"Enable Pin\": \t\t\"2.12\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.4\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\n\t\t\"Joint Number\":\t\t4,\n\t\t\"Step Pin\": \t\t\"1.15\",\n\t\t\"Direction Pin\": \t\"1.14\",\n\t\t\"Enable Pin\": \t\t\"1.16\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.1\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\n\t\t\"SP[i]\": \t\t\t0,\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Bed tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t0,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.25\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 heater PWM\",\n\t\t\"SP[i]\": \t\t\t1,\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t1,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.24\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 heater PWM\",\n\t\t\"SP[i]\": \t\t\t2,\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t2,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.23\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"1.29\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"1.28\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"1.27\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E0DET\",\n\t\t\"Pin\":\t\t\t\t\"1.26\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E1DET\",\n\t\t\"Pin\":\t\t\t\t\"1.25\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"PWRDET\",\n\t\t\"Pin\":\t\t\t\t\"1.0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Probe\",\n\t\t\"Pin\":\t\t\t\t\"0.10\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t6\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"RCServo\",\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\n\t\t\"SP[i]\": \t\t\t3,\n\t\t\"Servo Pin\": \t\t\"2.0\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"0.0\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t1,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv14/SKRv14_xyz/config.txt",
    "content": "{\r\n\t\"Board\": \"BIGTREETECH SKR v1.3 & v1.4\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"1.31\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"2.2\",\r\n\t\t\"Direction Pin\": \t\"2.6\",\r\n\t\t\"Enable Pin\": \t\t\"2.1\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"0.19\",\r\n\t\t\"Direction Pin\": \t\"0.20\",\r\n\t\t\"Enable Pin\": \t\t\"2.08\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"0.22\",\r\n\t\t\"Direction Pin\": \t\"2.11\",\r\n\t\t\"Enable Pin\": \t\t\"0.21\"\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv2/SKRv2_TMC2209/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v2\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"PC_4\"\n\t},\n\t\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"Motor Power\",\n\t\t\"Comment\": \"Enable motor power SKR2\",\n\t\t\"Pin\":\t\t\t\t\t \"PC_13\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"PE_2\",\n\t\t\"Direction Pin\": \t\"PE_1\",\n\t\t\"Enable Pin\": \t\t\"PE_3\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PE_0\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"PD_5\",\n\t\t\"Direction Pin\": \t\"PD_4\",\n\t\t\"Enable Pin\": \t\t\"PD_6\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_3\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"PA_15\",\n\t\t\"Direction Pin\": \t\"PA_8\",\n\t\t\"Enable Pin\": \t\t\"PD_1\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_0\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"PD_15\",\n\t\t\"Direction Pin\": \t\"PD_14\",\n\t\t\"Enable Pin\": \t\t\"PC_7\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PC_6\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\n\t\t\"Joint Number\":\t\t4,\n\t\t\"Step Pin\": \t\t\"PD_11\",\n\t\t\"Direction Pin\": \t\"PD_10\",\n\t\t\"Enable Pin\": \t\t\"PD_13\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_12\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"PC_1\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X max\",\n\t\t\"Pin\":\t\t\t\t\"PC_2\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"PC_3\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y max\",\n\t\t\"Pin\":\t\t\t\t\"PA_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"PC_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z max\",\n\t\t\"Pin\":\t\t\t\t\"PC_15\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"PB_7\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t0,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv2/SKRv2_ender3/config.txt",
    "content": "{\r\n\t\"Board\": \"BIGTREETECH SKR v2\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"Motor Power\",\r\n\t\"Comment\": \"Enable motor power SKR2\",\r\n\t\"Pin\":\t\t\t\t\t \"PC_13\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PE_2\",\r\n\t\t\"Direction Pin\": \t\"PE_1\",\r\n\t\t\"Enable Pin\": \t\t\"PE_3\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PD_5\",\r\n\t\t\"Direction Pin\": \t\"PD_4\",\r\n\t\t\"Enable Pin\": \t\t\"PD_6\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"PA_15\",\r\n\t\t\"Direction Pin\": \t\"PA_8\",\r\n\t\t\"Enable Pin\": \t\t\"PD_1\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"PD_15\",\r\n\t\t\"Direction Pin\": \t\"PD_14\",\r\n\t\t\"Enable Pin\": \t\t\"PC_7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_1\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_2\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_3\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max\",\r\n\t\t\"Pin\":\t\t\t\t\"PA_0\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_0\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_15\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Heated Bed tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PA_1\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t0,\r\n\t\t\"PWM Pin\": \t\t\t\"PD_7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Ext 0 temperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t1,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PA_2\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t1,\r\n\t\t\"PWM Pin\": \t\t\t\"PB_3\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 part cooling fan PWM FAN0\",\r\n\t\t\"SP[i]\": \t\t\t2,\r\n\t\t\"PWM Max\":\t\t\t128,\r\n\t\t\"PWM Pin\": \t\t\t\"PB_7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe bltouch according to marlin\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"PE_5\"\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/BTT_SKRv2/SKRv2_xyz/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v2\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"PC_4\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"Motor Power\",\n\t\t\"Comment\": \"Enable motor power SKR2\",\n\t\t\"Pin\":\t\t\t\t\t \"PC_13\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"PE_2\",\n\t\t\"Direction Pin\": \t\"PE_1\",\n\t\t\"Enable Pin\": \t\t\"PE_3\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"PD_5\",\n\t\t\"Direction Pin\": \t\"PD_4\",\n\t\t\"Enable Pin\": \t\t\"PD_6\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"PA_15\",\n\t\t\"Direction Pin\": \t\"PA_8\",\n\t\t\"Enable Pin\": \t\t\"PD_1\"\n\t},\n\t\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"PC_1\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X max\",\n\t\t\"Pin\":\t\t\t\t\"PC_2\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"PC_3\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y max\",\n\t\t\"Pin\":\t\t\t\t\"PA_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"PC_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z max\",\n\t\t\"Pin\":\t\t\t\t\"PC_15\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/Fysetc_Spider/config.txt",
    "content": "{\r\n\t\"Board\": \"FYSETC SPIDER\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"PC_7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X M1 - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PE_11\",\r\n\t\t\"Direction Pin\": \t\"PE_10\",\r\n\t\t\"Enable Pin\": \t\t\"PE_9\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y M2 - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PD_8\",\r\n\t\t\"Direction Pin\": \t\"PB_12\",\r\n\t\t\"Enable Pin\": \t\t\"PD_9\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z M3 - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"PD_14\",\r\n\t\t\"Direction Pin\": \t\"PD_13\",\r\n\t\t\"Enable Pin\": \t\t\"PD_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E0 M4 - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"PD_5\",\r\n\t\t\"Direction Pin\": \t\"PD_6\",\r\n\t\t\"Enable Pin\": \t\t\"PD_4\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E1 M5 - Joint 4 step generator\",\r\n\t\t\"Joint Number\":\t\t4,\r\n\t\t\"Step Pin\": \t\t\"PE_6\",\r\n\t\t\"Direction Pin\": \t\"PC_13\",\r\n\t\t\"Enable Pin\": \t\t\"PE_5\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E2 M6 - Joint 5 step generator\",\r\n\t\t\"Joint Number\":\t\t5,\r\n\t\t\"Step Pin\": \t\t\"PE_2\",\r\n\t\t\"Direction Pin\": \t\"PE_4\",\r\n\t\t\"Enable Pin\": \t\t\"PE_3\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E3 M7 - Joint 6 step generator\",\r\n\t\t\"Joint Number\":\t\t6,\r\n\t\t\"Step Pin\": \t\t\"PD_12\",\r\n\t\t\"Direction Pin\": \t\"PC_4\",\r\n\t\t\"Enable Pin\": \t\t\"PE_8\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E4 M8 - Joint 7 step generator\",\r\n\t\t\"Joint Number\":\t\t7,\r\n\t\t\"Step Pin\": \t\t\"PE_1\",\r\n\t\t\"Direction Pin\": \t\"PE_0\",\r\n\t\t\"Enable Pin\": \t\t\"PC_5\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Extruder tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PC_0\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min X-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PB_14\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max E0-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PA_1\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min Y-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PB_13\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max E1-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PA_2\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min Z-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PA_0\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max E2-DIAG\",\r\n\t\t\"Pin\":\t\t\t\t\"PA_3\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t}\r\n\t]\r\n}"
  },
  {
    "path": "Firmware/ConfigSamples/Fysetc_Spider_King/config.txt",
    "content": "{\r\n\t\"Board\": \"FYSETC SPIDER KING\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin\",\r\n\t\t\"Pin\":\t\t\t\t\"PB_11\"\r\n\t}\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PE_2\",\r\n\t\t\"Direction Pin\": \t\"PE_1\",\r\n\t\t\"Enable Pin\": \t\t\"PE_3\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"TMC stepper\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\r\n\t\t\"Driver\": \t\t\t\"2209\",\r\n\t\t\"RX pin\": \t\t\t\"PE_0\",\r\n\t\t\"RSense\":\t\t\t0.11,\r\n\t\t\"Current\":\t\t\t800,\r\n\t\t\"Microsteps\":\t\t16,\r\n\t\t\"Stealth chop\":\t\t\"on\",\r\n\t\t\"Stall sensitivity\":0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PD_5\",\r\n\t\t\"Direction Pin\": \t\"PD_4\",\r\n\t\t\"Enable Pin\": \t\t\"PD_6\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"TMC stepper\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\r\n\t\t\"Driver\": \t\t\t\"2209\",\r\n\t\t\"RX pin\": \t\t\t\"PD_3\",\r\n\t\t\"RSense\":\t\t\t0.11,\r\n\t\t\"Current\":\t\t\t800,\r\n\t\t\"Microsteps\":\t\t16,\r\n\t\t\"Stealth chop\":\t\t\"on\",\r\n\t\t\"Stall sensitivity\":0\r\n\t}\r\n\t\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/Hypercube-evolution/config.txt",
    "content": "{\r\n\t\"Board\": \"MKS SBASE v1.3\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 0 - 3\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t0,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 4 - 7\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t2,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"2.0\",\r\n\t\t\"Direction Pin\": \t\"0.5\",\r\n\t\t\"Enable Pin\": \t\t\"0.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"2.1\",\r\n\t\t\"Direction Pin\": \t\"0.11\",\r\n\t\t\"Enable Pin\": \t\t\"0.10\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z1 - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"2.2\",\r\n\t\t\"Direction Pin\": \t\"0.20\",\r\n\t\t\"Enable Pin\": \t\t\"0.19\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z2 - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"2.3\",\r\n\t\t\"Direction Pin\": \t\"0.22\",\r\n\t\t\"Enable Pin\": \t\t\"0.21\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t4,\r\n\t\t\"Step Pin\": \t\t\"2.8\",\r\n\t\t\"Direction Pin\": \t\"2.13\",\r\n\t\t\"Enable Pin\": \t\t\"4.29\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Blink\",\r\n\t\t\"Pin\":\t\t\t\t\"1.18\",\r\n\t\t\"Frequency\":\t\t2\r\n\t},\t\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.24\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.25\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.26\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.27\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.28\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.29\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Heated Bed tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.23\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t0,\r\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Ext 0 temperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t1,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.24\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t1,\r\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 part cooling fan PWM\",\r\n\t\t\"SP[i]\": \t\t\t2,\r\n\t\t\"PWM Max\":\t\t\t128,\r\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"1.23\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Switch\",\r\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\r\n\t\t\"Pin\":\t\t\t\t\"1.22\",\r\n\t\t\"Mode\":\t\t\t\t\"On\",\r\n\t\t\"PV[i]\":\t\t\t1,\r\n\t\t\"SP\":\t\t\t\t35.0\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/MKS_Monster8/config.txt",
    "content": "{\r\n\t\"Board\": \"MKS MONSTER8\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Reset Pin\",\r\n\t\t\"Comment\":\t\t\t\"Reset pin USE BTN_EN2\",\r\n\t\t\"Pin\":\t\t\t\t\"PE_8\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"PC_14\",\r\n\t\t\"Direction Pin\": \t\"PC_13\",\r\n\t\t\"Enable Pin\": \t\t\"PC_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"PE_5\",\r\n\t\t\"Direction Pin\": \t\"PE_4\",\r\n\t\t\"Enable Pin\": \t\t\"PC_15\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"PE_1\",\r\n\t\t\"Direction Pin\": \t\"PE_0\",\r\n\t\t\"Enable Pin\": \t\t\"PE_2\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E0 DRIVER3 - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"PB_5\",\r\n\t\t\"Direction Pin\": \t\"PB_4\",\r\n\t\t\"Enable Pin\": \t\t\"PB_6\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E1 DRIVER4 - Joint 4 step generator\",\r\n\t\t\"Joint Number\":\t\t4,\r\n\t\t\"Step Pin\": \t\t\"PD_6\",\r\n\t\t\"Direction Pin\": \t\"PD_5\",\r\n\t\t\"Enable Pin\": \t\t\"PD_7\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E2 DRIVER5 - Joint 5 step generator\",\r\n\t\t\"Joint Number\":\t\t5,\r\n\t\t\"Step Pin\": \t\t\"PD_2\",\r\n\t\t\"Direction Pin\": \t\"PD_1\",\r\n\t\t\"Enable Pin\": \t\t\"PD_3\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E3 DRIVER6 - Joint 6 step generator\",\r\n\t\t\"Joint Number\":\t\t6,\r\n\t\t\"Step Pin\": \t\t\"PC_7\",\r\n\t\t\"Direction Pin\": \t\"PC_6\",\r\n\t\t\"Enable Pin\": \t\t\"PC_8\"\r\n\t},\r\n\t\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E4 DRIVER7 - Joint 7 step generator\",\r\n\t\t\"Joint Number\":\t\t7,\r\n\t\t\"Step Pin\": \t\t\"PD_13\",\r\n\t\t\"Direction Pin\": \t\"PD_12\",\r\n\t\t\"Enable Pin\": \t\t\"PD_14\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Extruder tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"PC_1\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe bltouch according to marlin\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"PB_6\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min \",\r\n\t\t\"Pin\":\t\t\t\t\"PA_14\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max \",\r\n\t\t\"Pin\":\t\t\t\t\"PA_13\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min \",\r\n\t\t\"Pin\":\t\t\t\t\"PA_15\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max \",\r\n\t\t\"Pin\":\t\t\t\t\"PC_5\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min \",\r\n\t\t\"Pin\":\t\t\t\t\"PB_13\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max \",\r\n\t\t\"Pin\":\t\t\t\t\"PB_12\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t}\r\n\t]\r\n}"
  },
  {
    "path": "Firmware/ConfigSamples/MKS_Robin_E3/Robin_E3/config.txt",
    "content": "{\n\t\"Board\": \"Mks Robin E3\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"PC_5\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"PC_0\",\n\t\t\"Direction Pin\": \t\"PB_2\",\n\t\t\"Enable Pin\": \t\t\"PC_13\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"PC_2\",\n\t\t\"Direction Pin\": \t\"PB_9\",\n\t\t\"Enable Pin\": \t\t\"PB_12\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"PC_14\",\n\t\t\"Direction Pin\": \t\"PC_15\",\n\t\t\"Enable Pin\": \t\t\"PB_8\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"PB_4\",\n\t\t\"Direction Pin\": \t\"PB_3\",\n\t\t\"Enable Pin\": \t\t\"PB_5\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Extruder tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t0,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"PA_0\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"RCServo\",\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\n\t\t\"SP[i]\": \t\t\t3,\n\t\t\"Servo Pin\": \t\t\"PA_3\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"PA_12\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"PA_11\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"PC_6\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/MKS_Sbase/MKS Sbase/Ender3/config.txt-Ender3",
    "content": "{\r\n\t\"Board\": \"MKS SBASE v1.3\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 0 - 3\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t0,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 4 - 7\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t2,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"2.0\",\r\n\t\t\"Direction Pin\": \t\"0.5\",\r\n\t\t\"Enable Pin\": \t\t\"0.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"2.1\",\r\n\t\t\"Direction Pin\": \t\"0.11\",\r\n\t\t\"Enable Pin\": \t\t\"0.10\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"2.2\",\r\n\t\t\"Direction Pin\": \t\"0.20\",\r\n\t\t\"Enable Pin\": \t\t\"0.19\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"2.3\",\r\n\t\t\"Direction Pin\": \t\"0.22\",\r\n\t\t\"Enable Pin\": \t\t\"0.21\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Blink\",\r\n\t\t\"Pin\":\t\t\t\t\"1.18\",\r\n\t\t\"Frequency\":\t\t2\r\n\t},\t\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.24\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.25\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.26\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.27\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.28\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.29\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Heated Bed tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.23\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t0,\r\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Ext 0 temperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t1,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.24\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t1,\r\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 part cooling fan PWM on FAN\",\r\n\t\t\"SP[i]\": \t\t\t2,\r\n\t\t\"PWM Max\":\t\t\t128,\r\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"1.23\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Switch\",\r\n\t\t\"Comment\":\t\t\t\"Extruder fan switch on E2\",\r\n\t\t\"Pin\":\t\t\t\t\"2.6\",\r\n\t\t\"Mode\":\t\t\t\t\"On\",\r\n\t\t\"PV[i]\":\t\t\t1,\r\n\t\t\"SP\":\t\t\t\t35.0\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/MKS_Sbase/MKS Sbase/config.txt",
    "content": "{\r\n\t\"Board\": \"MKS SBASE v1.3\",\r\n\t\"Modules\":[\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 0 - 3\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t0,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"On load\",\r\n\t\"Type\": \"MCP4451\",\r\n\t\t\"Comment\":\t\t\t\"Digipot for joints 4 - 7\",\r\n\t\t\"I2C SDA pin\":\t\t\"0.0\",\r\n\t\t\"I2C SCL pin\":\t\t\"0.1\",\r\n\t\t\"I2C address\":\t\t2,\r\n\t\t\"Max current\":\t\t2.0,\r\n\t\t\"Factor\":\t\t\t113.33,\r\n\t\t\"Current 0\":\t\t0.8,\r\n\t\t\"Current 1\":\t\t0.8,\r\n\t\t\"Current 2\":\t\t0.8,\r\n\t\t\"Current 3\":\t\t0.8\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\r\n\t\t\"Joint Number\":\t\t0,\r\n\t\t\"Step Pin\": \t\t\"2.0\",\r\n\t\t\"Direction Pin\": \t\"0.5\",\r\n\t\t\"Enable Pin\": \t\t\"0.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\r\n\t\t\"Joint Number\":\t\t1,\r\n\t\t\"Step Pin\": \t\t\"2.1\",\r\n\t\t\"Direction Pin\": \t\"0.11\",\r\n\t\t\"Enable Pin\": \t\t\"0.10\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\r\n\t\t\"Joint Number\":\t\t2,\r\n\t\t\"Step Pin\": \t\t\"2.2\",\r\n\t\t\"Direction Pin\": \t\"0.20\",\r\n\t\t\"Enable Pin\": \t\t\"0.19\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\r\n\t\t\"Joint Number\":\t\t3,\r\n\t\t\"Step Pin\": \t\t\"2.3\",\r\n\t\t\"Direction Pin\": \t\"0.22\",\r\n\t\t\"Enable Pin\": \t\t\"0.21\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"Stepgen\",\r\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\r\n\t\t\"Joint Number\":\t\t4,\r\n\t\t\"Step Pin\": \t\t\"2.8\",\r\n\t\t\"Direction Pin\": \t\"2.13\",\r\n\t\t\"Enable Pin\": \t\t\"4.29\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Blink\",\r\n\t\t\"Pin\":\t\t\t\t\"1.18\",\r\n\t\t\"Frequency\":\t\t2\r\n\t},\t\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.24\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t0\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"X max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.25\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t1\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.26\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t2\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Y max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.27\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t3\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z min\",\r\n\t\t\"Pin\":\t\t\t\t\"1.28\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t4\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Digital Pin\",\r\n\t\t\"Comment\":\t\t\t\"Z max\",\r\n\t\t\"Pin\":\t\t\t\t\"1.29\",\r\n\t\t\"Mode\":\t\t\t\t\"Input\",\r\n\t\t\"Data Bit\":\t\t\t5\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Heated Bed tenperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t0,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.23\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t0,\r\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Temperature\",\r\n\t\t\"Comment\": \t\t\t\"Ext 0 temperature sensor\",\r\n\t\t\"PV[i]\": \t\t\t1,\r\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\r\n\t\t\t\"Thermistor\":\r\n\t\t\t{\r\n\t\t\t\t\"Pin\": \t\t\"0.24\",\r\n\t\t\t\t\"beta\": \t3990,\r\n\t\t\t\t\"r0\": \t\t100000,\r\n\t\t\t\t\"t0\": \t\t25\r\n\t\t\t}\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 heater PWM\",\r\n\t\t\"SP[i]\": \t\t\t1,\r\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"PWM\",\r\n\t\t\"Comment\": \t\t\t\"Ext0 part cooling fan PWM on FAN\",\r\n\t\t\"SP[i]\": \t\t\t2,\r\n\t\t\"PWM Max\":\t\t\t128,\r\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Base\",\r\n\t\"Type\": \"RCServo\",\r\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\r\n\t\t\"SP[i]\": \t\t\t3,\r\n\t\t\"Servo Pin\": \t\t\"1.23\"\r\n\t},\r\n\t{\r\n\t\"Thread\": \"Servo\",\r\n\t\"Type\": \"Switch\",\r\n\t\t\"Comment\":\t\t\t\"Extruder fan switch on E2\",\r\n\t\t\"Pin\":\t\t\t\t\"2.6\",\r\n\t\t\"Mode\":\t\t\t\t\"On\",\r\n\t\t\"PV[i]\":\t\t\t1,\r\n\t\t\"SP\":\t\t\t\t35.0\r\n\t}\r\n\t]\r\n}\r\n"
  },
  {
    "path": "Firmware/ConfigSamples/TMC2209 Example/SKRv14_TMC2209/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v1.4\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"1.31\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"2.2\",\n\t\t\"Direction Pin\": \t\"2.6\",\n\t\t\"Enable Pin\": \t\t\"2.1\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.10\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"0.19\",\n\t\t\"Direction Pin\": \t\"0.20\",\n\t\t\"Enable Pin\": \t\t\"2.08\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.9\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"0.22\",\n\t\t\"Direction Pin\": \t\"2.11\",\n\t\t\"Enable Pin\": \t\t\"0.21\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.8\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"2.13\",\n\t\t\"Direction Pin\": \t\"0.11\",\n\t\t\"Enable Pin\": \t\t\"2.12\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.4\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\n\t\t\"Joint Number\":\t\t4,\n\t\t\"Step Pin\": \t\t\"1.15\",\n\t\t\"Direction Pin\": \t\"1.14\",\n\t\t\"Enable Pin\": \t\t\"1.16\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"1.1\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Bed heater PWM\",\n\t\t\"SP[i]\": \t\t\t0,\n\t\t\"PWM Pin\": \t\t\t\"2.5\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Bed tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t0,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.25\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 heater PWM\",\n\t\t\"SP[i]\": \t\t\t1,\n\t\t\"PWM Pin\": \t\t\t\"2.7\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 0 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t1,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.24\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"PWM\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 heater PWM\",\n\t\t\"SP[i]\": \t\t\t2,\n\t\t\"PWM Pin\": \t\t\t\"2.4\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Temperature\",\n\t\t\"Comment\": \t\t\t\"Hotend 1 tenperature sensor\",\n\t\t\"PV[i]\": \t\t\t2,\n\t\t\"Sensor\": \t\t\t\"Thermistor\",\n\t\t\t\"Thermistor\":\n\t\t\t{\n\t\t\t\t\"Pin\": \t\t\"0.23\",\n\t\t\t\t\"beta\": \t3990,\n\t\t\t\t\"r0\": \t\t100000,\n\t\t\t\t\"t0\": \t\t25\n\t\t\t}\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"1.29\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"1.28\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"1.27\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E0DET\",\n\t\t\"Pin\":\t\t\t\t\"1.26\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"E1DET\",\n\t\t\"Pin\":\t\t\t\t\"1.25\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"PWRDET\",\n\t\t\"Pin\":\t\t\t\t\"1.0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Probe\",\n\t\t\"Pin\":\t\t\t\t\"0.10\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t6\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"RCServo\",\n\t\t\"Comment\": \t\t\t\"RC servo for probe\",\n\t\t\"SP[i]\": \t\t\t3,\n\t\t\"Servo Pin\": \t\t\"2.0\"\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"0.0\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t1,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/ConfigSamples/TMC2209 Example/SKRv2_TMC2209/config.txt",
    "content": "{\n\t\"Board\": \"BIGTREETECH SKR v2\",\n\t\"Modules\":[\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Reset Pin\",\n\t\t\"Comment\":\t\t\t\"Reset pin\",\n\t\t\"Pin\":\t\t\t\t\"PC_4\"\n\t},\n\t\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"Motor Power\",\n\t\t\"Comment\": \"Enable motor power SKR2\",\n\t\t\"Pin\":\t\t\t\t\t \"PC_13\"\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 step generator\",\n\t\t\"Joint Number\":\t\t0,\n\t\t\"Step Pin\": \t\t\"PE_2\",\n\t\t\"Direction Pin\": \t\"PE_1\",\n\t\t\"Enable Pin\": \t\t\"PE_3\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"X - Joint 0 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PE_0\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 step generator\",\n\t\t\"Joint Number\":\t\t1,\n\t\t\"Step Pin\": \t\t\"PD_5\",\n\t\t\"Direction Pin\": \t\"PD_4\",\n\t\t\"Enable Pin\": \t\t\"PD_6\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Y - Joint 1 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_3\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 step generator\",\n\t\t\"Joint Number\":\t\t2,\n\t\t\"Step Pin\": \t\t\"PA_15\",\n\t\t\"Direction Pin\": \t\"PA_8\",\n\t\t\"Enable Pin\": \t\t\"PD_1\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"Z - Joint 2 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_0\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 step generator\",\n\t\t\"Joint Number\":\t\t3,\n\t\t\"Step Pin\": \t\t\"PD_15\",\n\t\t\"Direction Pin\": \t\"PD_14\",\n\t\t\"Enable Pin\": \t\t\"PC_7\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E0 - Joint 3 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PC_6\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Base\",\n\t\"Type\": \"Stepgen\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 step generator\",\n\t\t\"Joint Number\":\t\t4,\n\t\t\"Step Pin\": \t\t\"PD_11\",\n\t\t\"Direction Pin\": \t\"PD_10\",\n\t\t\"Enable Pin\": \t\t\"PD_13\"\n\t},\n\t{\n\t\"Thread\": \"On load\",\n\t\"Type\": \"TMC2209\",\n\t\t\"Comment\":\t\t\t\"E1 - Joint 4 TMC driver\",\n\t\t\"RX pin\": \t\t\t\"PD_12\",\n\t\t\"RSense\":\t\t\t0.11,\n\t\t\"Current\":\t\t\t800,\n\t\t\"Microsteps\":\t\t16,\n\t\t\"Stealth chop\":\t\t\"on\",\n\t\t\"Stall sensitivity\":0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X min\",\n\t\t\"Pin\":\t\t\t\t\"PC_1\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t0\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"X max\",\n\t\t\"Pin\":\t\t\t\t\"PC_2\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t1\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y min\",\n\t\t\"Pin\":\t\t\t\t\"PC_3\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t2\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Y max\",\n\t\t\"Pin\":\t\t\t\t\"PA_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t3\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z min\",\n\t\t\"Pin\":\t\t\t\t\"PC_0\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t4\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Digital Pin\",\n\t\t\"Comment\":\t\t\t\"Z max\",\n\t\t\"Pin\":\t\t\t\t\"PC_15\",\n\t\t\"Mode\":\t\t\t\t\"Input\",\n\t\t\"Data Bit\":\t\t\t5\n\t},\n\t{\n\t\"Thread\": \"Servo\",\n\t\"Type\": \"Switch\",\n\t\t\"Comment\":\t\t\t\"Extruder fan switch\",\n\t\t\"Pin\":\t\t\t\t\"PB_7\",\n\t\t\"Mode\":\t\t\t\t\"On\",\n\t\t\"PV[i]\":\t\t\t0,\n\t\t\"SP\":\t\t\t\t25.5\n\t}\n\t]\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/.gitignore",
    "content": "/Remora-OS5/mbed-os\n/Remora-OS5/BUILD\n/Remora-OS6/mbed-os\n/Remora-OS6/BUILD"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/.gitignore",
    "content": "/BUILD\n/mbed-os"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/.mbed",
    "content": "ROOT=.\n<<<<<<< refs/remotes/origin/main=undefined\n<<<<<<< Updated upstream=undefined\n=\n>>>>>>> Stashed changes=undefined\n>>>>>>> update=undefined\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/MODDMA.lib",
    "content": "https://os.mbed.com/users/AjK/code/MODDMA/#97a16bf2ff439853ed01edd65a382207e203c733"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/README.md",
    "content": "Remora OS5 firmware\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/SoftwareSerial/SoftwareSerial.cpp",
    "content": "\n#include \"SoftwareSerial.h\"\n#include <cstdint>\n\n\n\nSoftwareSerial::SoftwareSerial(std::string tx, std::string rx)\n{\n    if (!tx.empty()) TXportAndPin = tx;\n    if (!rx.empty()) RXportAndPin = rx;\n    halfDuplex = !TXportAndPin.compare(RXportAndPin);\n\n    if(halfDuplex)\n    {\n        this->rxpin = new Pin(RXportAndPin,1);\n        this->txpin = this->rxpin;\n        setTX();\n    }\n    else\n    {\n        this->txpin = new Pin(TXportAndPin,0);\n        setTX();\n\n        this->rxpin = new Pin(RXportAndPin,1);\n        setRX();\n    }\n    \n    qin = 0;\n    qout = 0;\n    activeTx = false;\n    activeRx = false;\n}\n\n\nvoid SoftwareSerial::begin(int baudrate)\n{\n    #ifdef FORCE_BAUD_RATE\n    baudrate = FORCE_BAUD_RATE;     // 19200 fastest stable baud rate\n    #endif\n    baudRate = baudrate;\n    //ticker.attach_us(callback(this, &SoftwareSerial::tickerHandler), 1000000.0 / (baudRate * 3.0));\n}\n\nvoid SoftwareSerial::setSpeed(int baudrate)\n{\n    //ticker.detach();\n  \n    //ticker.attach_us(callback(this, &SoftwareSerial::tickerHandler), 1000000.0 / (baudrate * 3.0));\n    this->baudRate = baudrate;\n}\n\nvoid SoftwareSerial::setTX(void)\n{\n    // First write, then set output. If we do this the other way around,\n    // the pin would be output low for a short while before switching to\n    // output hihg. Now, it is input with pullup for a short while, which\n    // is fine. With inverse logic, either order is fine.\n\n    //this->txpin->set(1);                  // works for LPC1768 but not STM32\n    this->txpin->setAsOutput();\n    this->txpin->set(1);\n}\n\nvoid SoftwareSerial::setRX(void)\n{\n\n    this->rxpin->setAsInput();\n    this->rxpin->pull_up();\n}\n\nvoid SoftwareSerial::setRXTX(bool input)\n{\n    if (halfDuplex)\n    {\n        if (input)\n        {\n            setRX();\n            rxBitCnt = -1;\n            rxTickCnt = 2;\n            activeRx = true;\n        }\n        else\n        {\n            if (activeRx)\n            {\n                setTX();\n                activeRx = false;\n            }\n        }\n    }\n}\n\nbool SoftwareSerial::listen()\n{\n    if (rxpin != nullptr)\n    {\n        setRXTX(true);\n        return true;\n    }\n    return false;\n}\n\nvoid SoftwareSerial::end(void)\n{\n    \n}\n\nvoid SoftwareSerial::tickerHandler(void)\n{\n    if (activeTx) this->send();\n    if (activeRx) this->receive();\n}\n\nvoid SoftwareSerial::send(void)\n{\n    if (--txTickCnt <= 0)\n    {\n        if (txBitCnt++ < TX_BITS)   // count out the bits in the txBuffer\n        {\n            this->txpin->set(txBuffer & 0x01);   // set output equal to the LSB in txBuffer\n            txBuffer >>= 1;                     // shift txBuffer to right\n            txTickCnt = OVERSAMPLE;             // reset the tick counter\n        }\n        else    // transmit finished, stay active or wait for a period before swapping to Rx mode if half duplex mode\n        {\n            txTickCnt = 1;\n            if (outputPending)\n            {\n                activeTx = false;    // output pending allow new byte to be written to txBuffer from write()\n            }\n            else if (txBitCnt > 10 + OVERSAMPLE*5)\n            {\n                if (halfDuplex)\n                {\n                    setRXTX(true);        // switch to receive mode\n                }\n                activeTx = false;\n            }\n        }\n    }\n}\n\nvoid SoftwareSerial::receive()\n{\n    if (--rxTickCnt <= 0)\n    {\n        uint8_t inbit = this->rxpin->get();   // read the rx line\n        if (rxBitCnt == -1)                 // waiting for start bit\n        {\n            if (!inbit)\n            {\n                // got a start bit\n                rxBitCnt = 0;\n                rxTickCnt = OVERSAMPLE + 1;\n                rxBuffer = 0;\n            }\n            else\n            {\n                rxTickCnt = 1;\n            }\n        }\n        else if (rxBitCnt >= RX_BITS)     // full byte has been read\n        {\n            // add stop bit to buffer\n            inbuf[qin] = rxBuffer;\n\t\t\tif ( ++qin >= IN_BUF_SIZE )\n            {\n\t\t\t    // overflow - reset inbuf-index\n\t\t\t\tqin = 0;\n\t\t\t}\n            rxTickCnt = 1;\n            rxBitCnt = -1;              // flag waiting for start bit\n        }\n        else                            // read data bits\n        {\n            rxBuffer >>= 1;\n            if (inbit)  rxBuffer |= 0x80;\n            rxBitCnt++;\n            rxTickCnt = OVERSAMPLE;\n        }\n    }\n}\n\n\nint SoftwareSerial::available()\n{\n    return (qout - qin);\n}\n\n\nvoid SoftwareSerial::printStr(char* str)\n{\n    int i = 0;\n    int len = strlen(str); \n    for(i = 0; i<len; i++)\n    {\n        write(str[i]);\n    }\n}\n\n\nvoid SoftwareSerial::write(int b)\n{\n    outputPending = true;               // notify ticker handler that there are more bytes to transmit after current\n    while (activeTx)                    // wait for current transmission to complete\n    {\n        idle();\n    }\n    txBuffer =      (b << 1) | 0x200;   // add start and stop bits\n    txBitCnt =      0;\n    txTickCnt =     OVERSAMPLE;\n    if (halfDuplex) setRXTX(false);\n    outputPending = false;\n    activeTx =      true;\n}\n\nint16_t SoftwareSerial::read()\n{\n    if (qout == qin) return -1;\n\n    char d = inbuf[qout] & 0xFF;\n\n    if ( ++qout >= IN_BUF_SIZE ) {qout = 0;}\n    \n    return d;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/SoftwareSerial/SoftwareSerial.h",
    "content": "#ifndef SOFTWARESERIAL_H\n#define SOFTWARESERIAL_H\n\n//#include \"LPC17xx.h\"\n#include \"mbed.h\"\n#include <cstdint>\n#include <string>\n#include \"configuration.h\"\n#include \"pin.h\"\n\n\n#define FORCE_BAUD_RATE 19600 //9600\n#define IN_BUF_SIZE     64\n#define TX_BITS         10     // 1 Startbit, 8 Databits, 1 Stopbit = 10 Bits/Frame\n#define RX_BITS         8      // startbit and stopbit parsed internally (see ISR)\n//#define OVERSAMPLE      3\n\n\nclass SoftwareSerial\n{\n    private:\n\n    //static SoftwareSerial* instance;        // there can only be one\n    //void (*_rit_isr)(void);                 // storage for an appended isr function\n    //void ritisr(void);                      // the default (instance) isr\n    //static void _ritisr(void);              // the actual static isr\n\n    std::string     TXportAndPin;\n    std::string     RXportAndPin;\n    Pin*            txpin;\n    Pin*            rxpin;\n\n    //Ticker          ticker;\n    \n    unsigned char   inbuf[IN_BUF_SIZE];\n    unsigned char   qin;\n    unsigned char   qout;\n    \n    int32_t  baudRate;\n \n    bool     activeTx;\n    bool     activeRx;\n    bool     halfDuplex;\n    bool     outputPending;\n\n    int32_t  rxTickCnt;\n    int32_t  txTickCnt;\n    int32_t  txBitCnt;\n    int32_t  rxBitCnt;\n    int32_t  txBuffer;\n    int32_t  rxBuffer;\n\n    public:\n\n    SoftwareSerial(std::string, std::string);\n\n    void begin(int);\n    void setSpeed(int);\n    void end(void);\n    void setTX(void);\n    void setRX(void);\n    void setRXTX(bool);\n    void send(void);\n    void receive(void);\n    void write(int);\n    int16_t  read(void);\n    bool listen(void);\n    void tickerHandler(void);\n\n    void enableTx(void);\n    void enableRx(void);\n    void idle() {__NOP();}\n    \n\n    int available();\n\n    void flush_input_buffer();\n    void printStr(char*);\n};\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_429/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2015, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n#ifndef MBED_PERIPHERALNAMES_H\r\n#define MBED_PERIPHERALNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ADC_1 = (int)ADC1_BASE,\r\n    ADC_2 = (int)ADC2_BASE,\r\n    ADC_3 = (int)ADC3_BASE\r\n} ADCName;\r\n\r\ntypedef enum {\r\n    DAC_1 = (int)DAC_BASE\r\n} DACName;\r\n\r\ntypedef enum {\r\n    UART_1 = (int)USART1_BASE,\r\n    UART_2 = (int)USART2_BASE,\r\n    UART_3 = (int)USART3_BASE,\r\n    UART_4 = (int)UART4_BASE,\r\n    UART_5 = (int)UART5_BASE,\r\n    UART_6 = (int)USART6_BASE,\r\n    UART_7 = (int)UART7_BASE,\r\n    UART_8 = (int)UART8_BASE\r\n} UARTName;\r\n\r\n#define DEVICE_SPI_COUNT 6\r\ntypedef enum {\r\n    SPI_1 = (int)SPI1_BASE,\r\n    SPI_2 = (int)SPI2_BASE,\r\n    SPI_3 = (int)SPI3_BASE,\r\n    SPI_4 = (int)SPI4_BASE,\r\n    SPI_5 = (int)SPI5_BASE,\r\n    SPI_6 = (int)SPI6_BASE\r\n} SPIName;\r\n\r\ntypedef enum {\r\n    I2C_1 = (int)I2C1_BASE,\r\n    I2C_2 = (int)I2C2_BASE,\r\n    I2C_3 = (int)I2C3_BASE\r\n} I2CName;\r\n\r\ntypedef enum {\r\n    PWM_1  = (int)TIM1_BASE,\r\n    PWM_2  = (int)TIM2_BASE,\r\n    PWM_3  = (int)TIM3_BASE,\r\n    PWM_4  = (int)TIM4_BASE,\r\n    PWM_5  = (int)TIM5_BASE,\r\n    PWM_8  = (int)TIM8_BASE,\r\n    PWM_9  = (int)TIM9_BASE,\r\n    PWM_10 = (int)TIM10_BASE,\r\n    PWM_11 = (int)TIM11_BASE,\r\n    PWM_12 = (int)TIM12_BASE,\r\n    PWM_13 = (int)TIM13_BASE,\r\n    PWM_14 = (int)TIM14_BASE\r\n} PWMName;\r\n\r\ntypedef enum {\r\n    CAN_1 = (int)CAN1_BASE,\r\n    CAN_2 = (int)CAN2_BASE\r\n} CANName;\r\n\r\ntypedef enum {\r\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\r\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\r\n} USBName;\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_429/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2018, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n\r\n#include \"PeripheralPins.h\"\r\n#include \"mbed_toolchain.h\"\r\n\r\n//==============================================================================\r\n// Notes\r\n//\r\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\r\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\r\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\r\n//   pinout image on mbed.org.\r\n//\r\n// - The pins which are connected to other components present on the board have\r\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\r\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\r\n//   Please read the board reference manual and schematic for more information.\r\n//\r\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\r\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\r\n//\r\n//==============================================================================\r\n\r\n\r\n//*** ADC ***\r\n\r\nMBED_WEAK const PinMap PinMap_ADC[] = {\r\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to B5\r\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 // Connected to B5\r\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 // Connected to B5\r\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to VSYNC\r\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to VSYNC\r\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5\r\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5\r\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to G2\r\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to G2\r\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to ACP_RST\r\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to ACP_RST\r\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to R3\r\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to R3\r\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // Connected to R6\r\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // Connected to R6\r\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to SDNWE\r\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to SDNWE\r\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to SDNWE\r\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\r\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13\r\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13\r\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 // Connected to OTG_FS_PSO [OTG_FS_PowerSwitchOn]\r\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // Connected to OTG_FS_PSO [OTG_FS_PowerSwitchOn]\r\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 // Connected to OTG_FS_OC [OTG_FS_OverCurrent]\r\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 // Connected to OTG_FS_OC [OTG_FS_OverCurrent]\r\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 // Connected to A3\r\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 // Connected to A4\r\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 // Connected to A5\r\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4\r\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 // Connected to ENABLE [LCD-RGB_ENABLE]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\r\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\r\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\r\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** DAC ***\r\n\r\nMBED_WEAK const PinMap PinMap_DAC[] = {\r\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to VSYNC\r\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** I2C ***\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\r\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\r\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to B7\r\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to G5\r\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to A0\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\r\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to I2C3_SCL [ACP/RF_SCL]\r\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to B6\r\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to G4\r\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to A1\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** PWM ***\r\n\r\n// TIM5 cannot be used because already used by the us_ticker\r\nMBED_WEAK const PinMap PinMap_PWM[] = {\r\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\r\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\r\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to B5\r\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // Connected to B5\r\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 // Connected to B5\r\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\r\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\r\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to G2\r\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to G2\r\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ACP_RST\r\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to ACP_RST\r\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ACP_RST\r\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to ACP_RST\r\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to I2C3_SCL [ACP/RF_SCL]\r\n//  {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to STDIO_UART_TX\r\n//  {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to STDIO_UART_RX\r\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to R4\r\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to TP_INT1 [Touch Panel]\r\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to R3\r\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to R3\r\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to R3\r\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to R6\r\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to R6\r\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to R6\r\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\r\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\r\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SDCKE1\r\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\r\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to B6\r\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 // Connected to B6\r\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to B7\r\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to B7\r\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to G4\r\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to G5\r\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to VBUS_HS\r\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to OTG_HS_DM\r\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to OTG_HS_DM\r\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 // Connected to OTG_HS_DM\r\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to OTG_HS_DP\r\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to OTG_HS_DP\r\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 // Connected to OTG_HS_DP\r\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to HSYNC\r\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 // Connected to HSYNC\r\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to G6\r\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to G6\r\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\r\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\r\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to RDX [LDC-RGB_RDX]\r\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to WRX_DCX [LCD-RGB_WRX_DCX]\r\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to D0\r\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to D1\r\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\r\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\r\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to D5\r\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to D6\r\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to D7\r\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to D8\r\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to D9\r\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to D10\r\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to D11\r\n    {PF_6,       PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\r\n    {PF_7,       PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SERIAL ***\r\n\r\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\r\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\r\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX\r\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to G4\r\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to HSYNC\r\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to R2\r\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to R2\r\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\r\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\r\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to D13\r\n    {PE_1,       UART_8,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to NBL1 [SDRAM_UDQM]\r\n    {PE_8,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to D5\r\n    {PF_7,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PG_14,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LD4 [Red Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\r\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B5\r\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_RX\r\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\r\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to G5\r\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to G6\r\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\r\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\r\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\r\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B2\r\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to D14\r\n    {PE_0,       UART_8,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to NBL0 [SDRAM_LDQM]\r\n    {PE_7,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to D4\r\n    {PF_6,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},\r\n    {PG_9,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\r\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to R5\r\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to OTG_HS_DM\r\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\r\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to RDX [LDC-RGB_RDX]\r\n    {PG_8,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDCLK\r\n    {PG_12,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to B4\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\r\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\r\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to R4\r\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to VBUS_HS\r\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to G7\r\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to TE [LCD-RGB_TE]\r\n    {PG_13,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LD3 [Green Led]\r\n    {PG_15,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDNCAS\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SPI ***\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\r\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ACP_RST\r\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SDCKE1\r\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SDCKE1\r\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_DP\r\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\r\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to B2\r\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D11\r\n    {PF_9,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {PF_11,      SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SDNRAS\r\n    {PG_14,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to LD4 [Red Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\r\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to G2\r\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_DM\r\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D10\r\n    {PF_8,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PG_12,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to B4\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\r\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to G4\r\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to VBUS_HS\r\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to R2\r\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to G7\r\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D9\r\n    {PF_7,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PG_13,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to LD3 [Green Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\r\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to VSYNC\r\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to VSYNC\r\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to TP_INT1 [Touch Panel]\r\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to TP_INT1 [Touch Panel]\r\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to B7\r\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_ID\r\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D8\r\n    {PF_6,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\r\n    {PG_8,       SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to SDCLK\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** CAN ***\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\r\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to R4\r\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDCKE1\r\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to B6\r\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to OTG_HS_ID\r\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to D2\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\r\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to R5\r\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to B7\r\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to VBUS_HS\r\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to D3\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** USBDEVICE ***\r\n\r\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\r\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF // Connected to I2C3_SCL [ACP/RF_SCL]\r\n//  {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to STDIO_UART_TX\r\n//  {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to STDIO_UART_RX\r\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to R4\r\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to R5\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** USBDEVICE ***\r\n\r\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\r\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\r\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to VSYNC\r\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID // Connected to OTG_HS_ID\r\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS // Connected to VBUS_HS\r\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM // Connected to OTG_HS_DM\r\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP // Connected to OTG_HS_DP\r\n#else /* MBED_CONF_TARGET_USB_SPEED */\r\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 // Connected to B5\r\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK\r\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 // Connected to R3\r\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 // Connected to R6\r\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 // Connected to SDCKE1\r\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to G4\r\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 // Connected to G5\r\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 // Connected to OTG_HS_ID\r\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 // Connected to VBUS_HS\r\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to SDNWE\r\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT\r\n#endif /* MBED_CONF_TARGET_USB_SPEED */\r\n    {NC, NC, 0}\r\n};\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_429/PinNames.h",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2018, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n\r\n#ifndef MBED_PINNAMES_H\r\n#define MBED_PINNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n#include \"PinNamesTypes.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ALT0  = 0x100,\r\n    ALT1  = 0x200,\r\n    ALT2  = 0x300,\r\n    ALT3  = 0x400\r\n} ALTx;\r\n\r\ntypedef enum {\r\n    PA_0  = 0x00,\r\n    PA_0_ALT0 = PA_0 | ALT0,\r\n    PA_0_ALT1 = PA_0 | ALT1,\r\n    PA_1  = 0x01,\r\n    PA_1_ALT0 = PA_1 | ALT0,\r\n    PA_1_ALT1 = PA_1 | ALT1,\r\n    PA_2  = 0x02,\r\n    PA_2_ALT0 = PA_2 | ALT0,\r\n    PA_2_ALT1 = PA_2 | ALT1,\r\n    PA_3  = 0x03,\r\n    PA_3_ALT0 = PA_3 | ALT0,\r\n    PA_3_ALT1 = PA_3 | ALT1,\r\n    PA_4  = 0x04,\r\n    PA_4_ALT0 = PA_4 | ALT0,\r\n    PA_5  = 0x05,\r\n    PA_5_ALT0 = PA_5 | ALT0,\r\n    PA_5_ALT1 = PA_5 | ALT1,\r\n    PA_6  = 0x06,\r\n    PA_6_ALT0 = PA_6 | ALT0,\r\n    PA_7  = 0x07,\r\n    PA_7_ALT0 = PA_7 | ALT0,\r\n    PA_7_ALT1 = PA_7 | ALT1,\r\n    PA_7_ALT2 = PA_7 | ALT2,\r\n    PA_8  = 0x08,\r\n    PA_9  = 0x09,\r\n    PA_10 = 0x0A,\r\n    PA_11 = 0x0B,\r\n    PA_12 = 0x0C,\r\n    PA_13 = 0x0D,\r\n    PA_14 = 0x0E,\r\n    PA_15 = 0x0F,\r\n    PA_15_ALT0 = PA_15 | ALT0,\r\n\r\n    PB_0  = 0x10,\r\n    PB_0_ALT0 = PB_0 | ALT0,\r\n    PB_0_ALT1 = PB_0 | ALT1,\r\n    PB_1  = 0x11,\r\n    PB_1_ALT0 = PB_1 | ALT0,\r\n    PB_1_ALT1 = PB_1 | ALT1,\r\n    PB_2  = 0x12,\r\n    PB_3  = 0x13,\r\n    PB_3_ALT0 = PB_3 | ALT0,\r\n    PB_4  = 0x14,\r\n    PB_4_ALT0 = PB_4 | ALT0,\r\n    PB_5  = 0x15,\r\n    PB_5_ALT0 = PB_5 | ALT0,\r\n    PB_6  = 0x16,\r\n    PB_7  = 0x17,\r\n    PB_8  = 0x18,\r\n    PB_8_ALT0 = PB_8 | ALT0,\r\n    PB_9  = 0x19,\r\n    PB_9_ALT0 = PB_9 | ALT0,\r\n    PB_10 = 0x1A,\r\n    PB_11 = 0x1B,\r\n    PB_12 = 0x1C,\r\n    PB_13 = 0x1D,\r\n    PB_14 = 0x1E,\r\n    PB_14_ALT0 = PB_14 | ALT0,\r\n    PB_14_ALT1 = PB_14 | ALT1,\r\n    PB_15 = 0x1F,\r\n    PB_15_ALT0 = PB_15 | ALT0,\r\n    PB_15_ALT1 = PB_15 | ALT1,\r\n\r\n    PC_0  = 0x20,\r\n    PC_0_ALT0 = PC_0 | ALT0,\r\n    PC_0_ALT1 = PC_0 | ALT1,\r\n    PC_1  = 0x21,\r\n    PC_1_ALT0 = PC_1 | ALT0,\r\n    PC_1_ALT1 = PC_1 | ALT1,\r\n    PC_2  = 0x22,\r\n    PC_2_ALT0 = PC_2 | ALT0,\r\n    PC_2_ALT1 = PC_2 | ALT1,\r\n    PC_3  = 0x23,\r\n    PC_3_ALT0 = PC_3 | ALT0,\r\n    PC_3_ALT1 = PC_3 | ALT1,\r\n    PC_4  = 0x24,\r\n    PC_4_ALT0 = PC_4 | ALT0,\r\n    PC_5  = 0x25,\r\n    PC_5_ALT0 = PC_5 | ALT0,\r\n    PC_6  = 0x26,\r\n    PC_6_ALT0 = PC_6 | ALT0,\r\n    PC_7  = 0x27,\r\n    PC_7_ALT0 = PC_7 | ALT0,\r\n    PC_8  = 0x28,\r\n    PC_8_ALT0 = PC_8 | ALT0,\r\n    PC_9  = 0x29,\r\n    PC_9_ALT0 = PC_9 | ALT0,\r\n    PC_10 = 0x2A,\r\n    PC_10_ALT0 = PC_10 | ALT0,\r\n    PC_11 = 0x2B,\r\n    PC_11_ALT0 = PC_11 | ALT0,\r\n    PC_12 = 0x2C,\r\n    PC_13 = 0x2D,\r\n    PC_14 = 0x2E,\r\n    PC_15 = 0x2F,\r\n\r\n    PD_0  = 0x30,\r\n    PD_1  = 0x31,\r\n    PD_2  = 0x32,\r\n    PD_3  = 0x33,\r\n    PD_4  = 0x34,\r\n    PD_5  = 0x35,\r\n    PD_6  = 0x36,\r\n    PD_7  = 0x37,\r\n    PD_8  = 0x38,\r\n    PD_9  = 0x39,\r\n    PD_10 = 0x3A,\r\n    PD_11 = 0x3B,\r\n    PD_12 = 0x3C,\r\n    PD_13 = 0x3D,\r\n    PD_14 = 0x3E,\r\n    PD_15 = 0x3F,\r\n\r\n    PE_0  = 0x40,\r\n    PE_1  = 0x41,\r\n    PE_2  = 0x42,\r\n    PE_3  = 0x43,\r\n    PE_4  = 0x44,\r\n    PE_5  = 0x45,\r\n    PE_6  = 0x46,\r\n    PE_7  = 0x47,\r\n    PE_8  = 0x48,\r\n    PE_9  = 0x49,\r\n    PE_10 = 0x4A,\r\n    PE_11 = 0x4B,\r\n    PE_12 = 0x4C,\r\n    PE_13 = 0x4D,\r\n    PE_14 = 0x4E,\r\n    PE_15 = 0x4F,\r\n\r\n    PF_0  = 0x50,\r\n    PF_1  = 0x51,\r\n    PF_2  = 0x52,\r\n    PF_3  = 0x53,\r\n    PF_4  = 0x54,\r\n    PF_5  = 0x55,\r\n    PF_6  = 0x56,\r\n    PF_7  = 0x57,\r\n    PF_8  = 0x58,\r\n    PF_9  = 0x59,\r\n    PF_10 = 0x5A,\r\n    PF_11 = 0x5B,\r\n    PF_12 = 0x5C,\r\n    PF_13 = 0x5D,\r\n    PF_14 = 0x5E,\r\n    PF_15 = 0x5F,\r\n\r\n    PG_0  = 0x60,\r\n    PG_1  = 0x61,\r\n    PG_2  = 0x62,\r\n    PG_3  = 0x63,\r\n    PG_4  = 0x64,\r\n    PG_5  = 0x65,\r\n    PG_6  = 0x66,\r\n    PG_7  = 0x67,\r\n    PG_8  = 0x68,\r\n    PG_9  = 0x69,\r\n    PG_10 = 0x6A,\r\n    PG_11 = 0x6B,\r\n    PG_12 = 0x6C,\r\n    PG_13 = 0x6D,\r\n    PG_14 = 0x6E,\r\n    PG_15 = 0x6F,\r\n\r\n    PH_0  = 0x70,\r\n    PH_1  = 0x71,\r\n\r\n    // ADC internal channels\r\n    ADC_TEMP = 0xF0,\r\n    ADC_VREF = 0xF1,\r\n    ADC_VBAT = 0xF2,\r\n\r\n    // STDIO for console print\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\r\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\r\n#else\r\n    STDIO_UART_TX = PA_9,\r\n#endif\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\r\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\r\n#else\r\n    STDIO_UART_RX = PA_10,\r\n#endif\r\n\r\n    // Generic signals namings\r\n    LED1        = PG_13, // Corresponds to LD3 on MB1075B\r\n    LED2        = PG_14, // Corresponds to LD4 on MB1075B\r\n    LED3        = PG_13,\r\n    LED4        = PG_14,\r\n    LED_RED     = LED2,\r\n    USER_BUTTON = PA_0,\r\n    // Standardized button names\r\n    BUTTON1 = USER_BUTTON,\r\n    SERIAL_TX   = STDIO_UART_TX,\r\n    SERIAL_RX   = STDIO_UART_RX,\r\n    USBTX       = STDIO_UART_TX,\r\n    USBRX       = STDIO_UART_RX,\r\n    SPI_MOSI    = PA_7,\r\n    SPI_MISO    = PA_6,\r\n    SPI_SCK     = PA_5,\r\n    SPI_CS      = PB_6,\r\n\r\n    /**** USB FS pins ****/\r\n    USB_OTG_FS_DM = PA_11,\r\n    USB_OTG_FS_DP = PA_12,\r\n    USB_OTG_FS_ID = PA_10,\r\n    USB_OTG_FS_SOF = PA_8,\r\n    USB_OTG_FS_VBUS = PA_9,\r\n\r\n    /**** USB HS pins ****/\r\n    USB_OTG_HS_DM = PB_14,\r\n    USB_OTG_HS_DP = PB_15,\r\n    USB_OTG_HS_ID = PB_12,\r\n    USB_OTG_HS_SOF = PA_4,\r\n    USB_OTG_HS_ULPI_CK = PA_5,\r\n    USB_OTG_HS_ULPI_D0 = PA_3,\r\n    USB_OTG_HS_ULPI_D1 = PB_0,\r\n    USB_OTG_HS_ULPI_D2 = PB_1,\r\n    USB_OTG_HS_ULPI_D3 = PB_10,\r\n    USB_OTG_HS_ULPI_D4 = PB_11,\r\n    USB_OTG_HS_ULPI_D5 = PB_12,\r\n    USB_OTG_HS_ULPI_D6 = PB_13,\r\n    USB_OTG_HS_ULPI_D7 = PB_5,\r\n    USB_OTG_HS_ULPI_DIR = PC_2,\r\n    USB_OTG_HS_ULPI_NXT = PC_3,\r\n    USB_OTG_HS_ULPI_STP = PC_0,\r\n    USB_OTG_HS_VBUS = PB_13,\r\n\r\n    /**** ETHERNET pins ****/\r\n    ETH_COL = PA_3,\r\n    ETH_CRS = PA_0,\r\n    ETH_CRS_DV = PA_7,\r\n    ETH_MDC = PC_1,\r\n    ETH_MDIO = PA_2,\r\n    ETH_PPS_OUT = PG_8,\r\n    ETH_PPS_OUT_ALT0 = PB_5,\r\n    ETH_REF_CLK = PA_1,\r\n    ETH_RXD0 = PC_4,\r\n    ETH_RXD1 = PC_5,\r\n    ETH_RXD2 = PB_0,\r\n    ETH_RXD3 = PB_1,\r\n    ETH_RX_CLK = PA_1,\r\n    ETH_RX_DV = PA_7,\r\n    ETH_RX_ER = PB_10,\r\n    ETH_TXD0 = PB_12,\r\n    ETH_TXD0_ALT0 = PG_13,\r\n    ETH_TXD1 = PB_13,\r\n    ETH_TXD1_ALT0 = PG_14,\r\n    ETH_TXD2 = PC_2,\r\n    ETH_TXD3 = PE_2,\r\n    ETH_TXD3_ALT0 = PB_8,\r\n    ETH_TX_CLK = PC_3,\r\n    ETH_TX_EN = PB_11,\r\n    ETH_TX_EN_ALT0 = PG_11,\r\n\r\n    /**** OSCILLATOR pins ****/\r\n    RCC_OSC32_IN = PC_14,\r\n    RCC_OSC32_OUT = PC_15,\r\n    RCC_OSC_IN = PH_0,\r\n    RCC_OSC_OUT = PH_1,\r\n\r\n    /**** DEBUG pins ****/\r\n    SYS_JTCK_SWCLK = PA_14,\r\n    SYS_JTDI = PA_15,\r\n    SYS_JTDO_SWO = PB_3,\r\n    SYS_JTMS_SWDIO = PA_13,\r\n    SYS_JTRST = PB_4,\r\n    SYS_TRACECLK = PE_2,\r\n    SYS_TRACED0 = PE_3,\r\n    SYS_TRACED1 = PE_4,\r\n    SYS_TRACED2 = PE_5,\r\n    SYS_TRACED3 = PE_6,\r\n    SYS_WKUP = PA_0,\r\n\r\n    // Not connected\r\n    NC = (int)0xFFFFFFFF\r\n} PinName;\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_429/system_clock.c",
    "content": "/* mbed Microcontroller Library\r\n* Copyright (c) 2006-2017 ARM Limited\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n*     http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n*/\r\n\r\n/**\r\n  * This file configures the system clock as follows:\r\n  *-----------------------------------------------------------------------------------\r\n  * System clock source   | 1- USE_PLL_HSE_EXTC (external 8 MHz clock) |\r\n  *                       | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)  | DEVICE_USBDEVICE=1\r\n  *                       | 3- USE_PLL_HSI (internal 16 MHz clock)     |\r\n  *-----------------------------------------------------------------------------------\r\n  * SYSCLK(MHz)           |                               180          | 168\r\n  * AHBCLK (MHz)          |                               180          | 168\r\n  * APB1CLK (MHz)         |                                45          |  42\r\n  * APB2CLK (MHz)         |                                90          |  84\r\n  * USB capable (48 MHz)  |                                NO          | YES (HSI calibration needed)\r\n  *-----------------------------------------------------------------------------------\r\n**/\r\n\r\n#include \"stm32f4xx.h\"\r\n//#include \"nvic_addr.h\"         original\r\n#include \"mbed_error.h\"\r\n\r\n/*!< COPIED FROM SKR2 Uncomment the following line if you need to relocate your vector Table in\r\n     Internal SRAM. */\r\n/* #define VECT_TAB_SRAM */\r\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\r\n                                   This value must be a multiple of 0x200. */\r\n\r\n\r\n// clock source is selected with CLOCK_SOURCE in json config\r\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\r\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\r\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\r\n\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\nuint8_t SetSysClock_PLL_HSI(void);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\r\n\r\n\r\n/**\r\n  * @brief  Setup the microcontroller system\r\n  *         Initialize the FPU setting, vector table location and External memory\r\n  *         configuration.\r\n  * @param  None\r\n  * @retval None\r\n  */\r\nvoid SystemInit(void)\r\n{\r\n    /* FPU settings ------------------------------------------------------------*/\r\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\r\n#endif\r\n    /* Reset the RCC clock configuration to the default reset state ------------*/\r\n    /* Set HSION bit */\r\n    RCC->CR |= (uint32_t)0x00000001;\r\n\r\n    /* Reset CFGR register */\r\n    RCC->CFGR = 0x00000000;\r\n\r\n    /* Reset HSEON, CSSON and PLLON bits */\r\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\r\n\r\n    /* Reset PLLCFGR register */\r\n    RCC->PLLCFGR = 0x24003010;\r\n\r\n    /* Reset HSEBYP bit */\r\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\r\n\r\n    /* Disable all interrupts */\r\n    RCC->CIR = 0x00000000;\r\n\r\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\r\n    SystemInit_ExtMemCtl();\r\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\r\n\r\n    /* Configure the Vector Table location add offset address ------------------*/\r\n#ifdef VECT_TAB_SRAM\r\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\r\n#else\r\n    // original line \r\n   \r\n    //SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; /* Vector Table Relocation in Internal FLASH */\r\n    // copied from SKR2\r\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\r\n#endif\r\n\r\n}\r\n\r\n/**\r\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\r\n  *               AHB/APBx prescalers and Flash settings\r\n  * @note   This function should be called only once the RCC clock configuration\r\n  *         is reset to the default reset state (done in SystemInit() function).\r\n  * @param  None\r\n  * @retval None\r\n  */\r\n\r\nvoid SetSysClock(void)\r\n{\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\r\n    /* 1- Try to start with HSE and external clock */\r\n    if (SetSysClock_PLL_HSE(1) == 0)\r\n#endif\r\n    {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\r\n        /* 2- If fail try to start with HSE and external xtal */\r\n        if (SetSysClock_PLL_HSE(0) == 0)\r\n#endif\r\n        {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\n            /* 3- If fail start with HSI clock */\r\n            if (SetSysClock_PLL_HSI() == 0)\r\n#endif\r\n            {\r\n                {\r\n                    error(\"SetSysClock failed\\n\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\n/******************************************************************************/\r\n/*            PLL (clocked by HSE) used as System clock source                */\r\n/******************************************************************************/\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\r\n{\r\n    RCC_OscInitTypeDef RCC_OscInitStruct;\r\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\r\n\r\n    /* The voltage scaling allows optimizing the power consumption when the device is\r\n       clocked below the maximum system frequency, to update the voltage scaling value\r\n       regarding system frequency refer to product datasheet. */\r\n    __HAL_RCC_PWR_CLK_ENABLE();\r\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\r\n\r\n    // Enable HSE oscillator and activate PLL with HSE as source\r\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\r\n    if (bypass == 0) {\r\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT\r\n    } else {\r\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN\r\n    }\r\n\r\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\r\n    RCC_OscInitStruct.PLL.PLLM = 8;\r\n#if (DEVICE_USBDEVICE)\r\n    RCC_OscInitStruct.PLL.PLLN = 336;\r\n#else\r\n    RCC_OscInitStruct.PLL.PLLN = 360;\r\n#endif\r\n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 180 MHz or 168 MHz if DEVICE_USBDEVICE defined\r\n    RCC_OscInitStruct.PLL.PLLQ = 7;             //  48 MHz if DEVICE_USBDEVICE defined\r\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Activate the OverDrive to reach the 180 MHz Frequency\r\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers\r\n    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\r\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 or 168 MHz\r\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 or  42 MHz\r\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 or  84 MHz\r\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_3);\r\n\r\n    return 1;\r\n}\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\n/******************************************************************************/\r\n/*            PLL (clocked by HSI) used as System clock source                */\r\n/******************************************************************************/\r\nuint8_t SetSysClock_PLL_HSI(void)\r\n{\r\n    RCC_OscInitTypeDef RCC_OscInitStruct;\r\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\r\n\r\n    /* The voltage scaling allows optimizing the power consumption when the device is\r\n       clocked below the maximum system frequency, to update the voltage scaling value\r\n       regarding system frequency refer to product datasheet. */\r\n    __HAL_RCC_PWR_CLK_ENABLE();\r\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\r\n\r\n    // Enable HSI oscillator and activate PLL with HSI as source\r\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\r\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\r\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\r\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\r\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\r\n    RCC_OscInitStruct.PLL.PLLM = 8;\r\n#if (DEVICE_USBDEVICE)\r\n    RCC_OscInitStruct.PLL.PLLN = 168;\r\n#else\r\n    RCC_OscInitStruct.PLL.PLLN = 180;\r\n#endif\r\n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 180 MHz or 168 MHz if DEVICE_USBDEVICE defined\r\n    RCC_OscInitStruct.PLL.PLLQ = 7;             //  48 MHz if DEVICE_USBDEVICE defined\r\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Activate the OverDrive to reach the 180 MHz Frequency\r\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\r\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\r\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 or 168 MHz\r\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 or  42 MHz\r\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 or  84 MHz\r\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_3);\r\n\r\n    return 1;\r\n}\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_446/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 4\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE,\n    SPI_4 = (int)SPI4_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE,\n    FMPI2C_1 = (int)FMPI2C1_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    QSPI_1 = (int)QSPI_R_BASE,\n} QSPIName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_446/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to LD1\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to LD1\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_3,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PB_4,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to LD2 [Blue]\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_7,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PC_12,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PD_13,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to USB_SOF [TP1]\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_6,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_12,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to USB_SOF [TP1]\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_VBUS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to USB_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD1\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LD1\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD1\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD2 [Blue]\n    {PB_8,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_8_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT1,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_9_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PB_9_ALT1,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 // Connected to LD3 [Red]\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {PF_6,       PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PF_7,       PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_VBUS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n//  {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_10,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_TX\n    {PE_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_14,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to LD2 [Blue]\n//  {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_5,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_11,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_RX\n    {PE_7,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_9,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DP\n    {PA_15,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD3 [Red]\n    {PC_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_8,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_12,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DM\n    {PB_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to LD1\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_9,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_13,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_15,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)}, // Connected to LD1\n    {PB_2,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PC_1_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LD3 [Red]\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_VBUS\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_7,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PD_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** QUADSPI ***\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA0[] = {\n    {PC_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PD_11,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PF_8,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO0\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA1[] = {\n    {PC_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PD_12,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PF_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO1\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA2[] = {\n    {PE_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {PF_7,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA3[] = {\n    {PA_1,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PD_13,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PF_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SCLK[] = {\n    {PB_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {PD_3,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SSEL[] = {\n    {PB_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS\n    {PG_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS // Connected to USB_PowerSwitchOn [STMPS2151STR_EN]\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF // Connected to USB_SOF [TP1]\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to USB_VBUS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to USB_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to USB_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM // Connected to LD3 [Red]\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_446/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // Arduino connector namings\n    A0          = PA_3,\n    A1          = PC_0,\n    A2          = PC_3,\n    A3          = PF_3,\n    A4          = PF_5,\n    A5          = PF_10,\n    D0          = PG_9,\n    D1          = PG_14,\n    D2          = PF_15,\n    D3          = PE_13,\n    D4          = PF_14,\n    D5          = PE_11,\n    D6          = PE_9,\n    D7          = PF_13,\n    D8          = PF_12,\n    D9          = PD_15,\n    D10         = PD_14,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PD_8,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PD_9,\n#endif\n\n    // Generic signals namings\n    LED1        = PB_0,\n    LED2        = PB_7,\n    LED3        = PB_14,\n    LED4        = LED1,\n    LED_RED     = LED3,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    SERIAL_TX   = STDIO_UART_TX, // Virtual Com Port\n    SERIAL_RX   = STDIO_UART_RX, // Virtual Com Port\n    USBTX       = STDIO_UART_TX, // Virtual Com Port\n    USBRX       = STDIO_UART_RX, // Virtual Com Port\n    I2C_SCL     = D15,\n    I2C_SDA     = D14,\n    SPI_MOSI    = D11,\n    SPI_MISO    = D12,\n    SPI_SCK     = D13,\n    SPI_CS      = D10,\n    PWM_OUT     = D9,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_2,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED0_ALT0 = PC_8,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED1_ALT0 = PD_3,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED2_ALT0 = PG_13,\n    SYS_TRACED3 = PE_6,\n    SYS_TRACED3_ALT0 = PG_14,\n    SYS_WKUP0 = PA_0,\n    SYS_WKUP1 = PC_13,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_OCTOPUS_446/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 12 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 12 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 180\n  * AHBCLK (MHz)        | 180\n  * APB1CLK (MHz)       |  45\n  * APB2CLK (MHz)       |  90\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x0000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI      0x2 // Use HSI internal clock\n\n//#define DEBUG_MCO        (1) // Output the MCO1/MCO2 on PA8/PC9 for debugging (0=OFF, 1=ON)\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\n\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    // Output clock on MCO2 pin(PC9) for debugging purpose\n#if DEBUG_MCO == 1\n    HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4);\n#endif\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n    /* Enable Power Control clock */\n    __HAL_RCC_PWR_CLK_ENABLE();\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.PLL.PLLState  = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM = 6;             \n    RCC_OscInitStruct.PLL.PLLN = 180;           \n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; \n    RCC_OscInitStruct.PLL.PLLQ = 7;             \n    RCC_OscInitStruct.PLL.PLLR = 2;             \n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Activate the OverDrive to reach the 180 MHz Frequency\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if DEVICE_USBDEVICE\n    // Select PLLSAI output as USB clock source\n    PeriphClkInitStruct.PLLSAI.PLLSAIM = 6;\n    PeriphClkInitStruct.PLLSAI.PLLSAIN = 96;\n    PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4;\n    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n    PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;\n    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 180 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Output clock on MCO1 pin(PA8) for debugging purpose\n#if DEBUG_MCO == 1\n    if (bypass == 0) {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2);    // 4 MHz with xtal\n    } else {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);    // 8 MHz with external clock (MCO)\n    }\n#endif\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n    /* Enable Power Control clock */\n    __HAL_RCC_PWR_CLK_ENABLE();\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;\n    RCC_OscInitStruct.PLL.PLLM            = 16;            // VCO input clock = 1 MHz (16 MHz / 16)\n    RCC_OscInitStruct.PLL.PLLN            = 360;           // VCO output clock = 360 MHz (1 MHz * 360)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 180 MHz (360 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             //\n    RCC_OscInitStruct.PLL.PLLR            = 6;             //\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if DEVICE_USBDEVICE\n    /* Select PLLSAI output as USB clock source */\n    PeriphClkInitStruct.PLLSAI.PLLSAIM = 8;\n    PeriphClkInitStruct.PLLSAI.PLLSAIN = 192;\n    PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV8;\n    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n    PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;\n    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 180 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 180 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;           //  45 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;           //  90 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Output clock on MCO1 pin(PA8) for debugging purpose\n#if DEBUG_MCO == 1\n    HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz\n#endif\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_ROBIN_E3/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_ROBIN_E3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n//  {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to STDIO_UART_TX\n//  {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to STDIO_UART_RX\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to LD2 [Green Led]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM4 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM2_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM2_CH2\n//  {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM2_CH3 // Connected to STDIO_UART_TX\n//  {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM2_CH4 // Connected to STDIO_UART_RX\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM3_CH1\n    {PA_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM3_CH2\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM1_CH2\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM1_CH3\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM1_CH4\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM3_CH3\n    {PB_1,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM3_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 2, 0)}, // TIM3_CH2\n//  {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM4_CH1\n//  {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM4_CH2\n//  {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM4_CH3\n//  {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM4_CH4\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 1)}, // TIM1_CH2N\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 1)}, // TIM1_CH3N\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 1, 0)}, // TIM3_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 2, 0)}, // TIM3_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 3, 0)}, // TIM3_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 4, 0)}, // TIM3_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_TX\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_RX\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)}, // Connected to LD2 [Green Led]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1 // Connected to SWO\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 10)}, // Remap CAN_RX to PB_8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 10)}, // Remap CAN_TX to PB_9\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DP\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_ROBIN_E3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_1  = 0x01,\n    PA_2  = 0x02,\n    PA_3  = 0x03,\n    PA_4  = 0x04,\n    PA_5  = 0x05,\n    PA_6  = 0x06,\n    PA_7  = 0x07,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n\n    PB_0  = 0x10,\n    PB_1  = 0x11,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_4  = 0x14,\n    PB_5  = 0x15,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_9  = 0x19,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_15 = 0x1F,\n\n    PC_0  = 0x20,\n    PC_1  = 0x21,\n    PC_2  = 0x22,\n    PC_3  = 0x23,\n    PC_4  = 0x24,\n    PC_5  = 0x25,\n    PC_6  = 0x26,\n    PC_7  = 0x27,\n    PC_8  = 0x28,\n    PC_9  = 0x29,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n\n    // Arduino connector namings\n    A0          = PA_0,\n    A1          = PA_1,\n    A2          = PA_4,\n    A3          = PB_0,\n    A4          = PC_1,\n    A5          = PC_0,\n    D0          = PA_3,\n    D1          = PA_2,\n    D2          = PA_10,\n    D3          = PB_3,\n    D4          = PB_5,\n    D5          = PB_4,\n    D6          = PB_10,\n    D7          = PA_8,\n    D8          = PA_9,\n    D9          = PC_7,\n    D10         = PB_6,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PA_5,\n    LED2        = PA_5,\n    LED3        = PA_5,\n    LED4        = PA_5,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    SERIAL_TX   = STDIO_UART_TX,\n    SERIAL_RX   = STDIO_UART_RX,\n    USBTX       = STDIO_UART_TX,\n    USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8,\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB pins ****/\n    USB_DM = PA_11,\n    USB_DP = PA_12,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PD_0,\n    RCC_OSC_OUT = PD_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_TRACESWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_NJTRST = PB_4,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_ROBIN_E3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-------------------------------------------------------------------------------------------\n  * System clock source                | 1- PLL_HSE_EXTC  / DEVICE_USBDEVICE   | 3- PLL_HSI / DEVICE_USBDEVICE\n  *                                    | (external 8 MHz clock)                | (internal 8 MHz)\n  *                                    | 2- PLL_HSE_XTAL / DEVICE_USBDEVICE    |\n  *                                    | (external 8 MHz xtal)                 |\n  *-------------------------------------------------------------------------------------------\n  * SYSCLK(MHz)                        | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * AHBCLK (MHz)                       | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * APB1CLK (MHz)                      | 36 / 36                               | 32 / 24\n  *-------------------------------------------------------------------------------------------\n  * APB2CLK (MHz)                      | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  */\n\n#include \"stm32f1xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x00000000U /*!< Vector Table base offset field.\n                                  This value must be a multiple of 0x200. */\n\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the Embedded Flash Interface, the PLL and update the\n  *         SystemCoreClock variable.\n  * @note   This function should be used only after reset.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit (void)\n{\n    /* Reset the RCC clock configuration to the default reset state(for debug purpose) */\n    /* Set HSION bit */\n    RCC->CR |= 0x00000001U;\n\n    /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */\n#if !defined(STM32F105xC) && !defined(STM32F107xC)\n    RCC->CFGR &= 0xF8FF0000U;\n#else\n    RCC->CFGR &= 0xF0FF0000U;\n#endif /* STM32F105xC */\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= 0xFEF6FFFFU;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= 0xFFFBFFFFU;\n\n    /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */\n    RCC->CFGR &= 0xFF80FFFFU;\n\n#if defined(STM32F105xC) || defined(STM32F107xC)\n    /* Reset PLL2ON and PLL3ON bits */\n    RCC->CR &= 0xEBFFFFFFU;\n\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x00FF0000U;\n\n    /* Reset CFGR2 register */\n    RCC->CFGR2 = 0x00000000U;\n#elif defined(STM32F100xB) || defined(STM32F100xE)\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x009F0000U;\n\n    /* Reset CFGR2 register */\n    RCC->CFGR2 = 0x00000000U;\n#else\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x009F0000U;\n#endif /* STM32F105xC */\n\n#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)\n#ifdef DATA_IN_ExtSRAM\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM */\n#endif\n\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // 72 MHz or 64 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSEPredivValue      = RCC_HSE_PREDIV_DIV1;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL9; // 72 MHz (8 MHz * 9)\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 72 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 72 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 36 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 72 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI_DIV2;\n#if (DEVICE_USBDEVICE)\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL12; // 48 MHz (8 MHz/2 * 12)\n#else /* DEVICE_USBDEVICE */\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL16; // 64 MHz (8 MHz/2 * 16)\n#endif /* DEVICE_USBDEVICE */\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 64 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 64 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 32 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 64 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/branch",
    "content": "default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/cache/branch2-base",
    "content": "97a16bf2ff439853ed01edd65a382207e203c733 17\n97a16bf2ff439853ed01edd65a382207e203c733 o default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/cache/rbc-names-v1",
    "content": "default"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/cache/tags2-visible",
    "content": "17 97a16bf2ff439853ed01edd65a382207e203c733\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/hgrc",
    "content": "# example repository config (see 'hg help config' for more info)\n[paths]\nmbed-studio-cache = c:\\Users\\tanya\\AppData\\Local\\Mbed Studio\\library-cache\\os.mbed.com\\users\\AjK\\code\\MODDMA\ndefault = https://os.mbed.com/users/AjK/code/MODDMA/\n\n# path aliases to other clones of this repo in URLs or filesystem paths\n# (see 'hg help config.paths' for more info)\n#\n# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork\n# my-fork         = ssh://jdoe@example.net/hg/jdoes-fork\n# my-clone        = /home/jdoe/jdoes-clone\n\n[ui]\n# name and email (local to this repository, optional), e.g.\n# username = Jane Doe <jdoe@example.com>\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/requires",
    "content": "dotencode\nfncache\ngeneraldelta\nrevlogv1\nsparserevlog\nstore\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/store/fncache",
    "content": "data/example4.h.i\ndata/example2.h.i\ndata/ChangeLog.c.i\ndata/example2.cpp.i\ndata/CONFIG.h.i\ndata/example1.h.i\ndata/MODDMA.h.i\ndata/example1.cpp.i\ndata/SETUP.cpp.i\ndata/example3.h.i\ndata/DATALUTS.cpp.i\ndata/INIT.cpp.i\ndata/iomacros.h.i\ndata/MODDMA.cpp.i\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/.hg/thgstatus",
    "content": ""
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/CONFIG.h",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n\n#ifdef NOCOMPILE\n\n#ifndef MODDMA_CONFIG_H\n#define MODDMA_CONFIG_H\n\n#include \"mbed.h\"\n\nnamespace AjK {\n\n// Forward reference.\nclass MODDMA;\n\nclass  MODDMA_Channel_CFG_t {\npublic:\n\n    // *****************************************\n    // From GPDMA by NXP MCU SW Application Team\n    // *****************************************\n    \n    uint32_t ChannelNum;        //!< DMA channel number, should be in range from 0 to 7. \n    uint32_t TransferSize;      //!< Length/Size of transfer \n    uint32_t TransferWidth;     //!< Transfer width - used for TransferType is GPDMA_TRANSFERTYPE_m2m only \n    uint32_t SrcMemAddr;        //!< Physical Src Addr, used in case TransferType is chosen as MODDMA::GPDMA_TRANSFERTYPE::m2m or MODDMA::GPDMA_TRANSFERTYPE::m2p \n    uint32_t DstMemAddr;        //!< Physical Destination Address, used in case TransferType is chosen as MODDMA::GPDMA_TRANSFERTYPE::m2m or MODDMA::GPDMA_TRANSFERTYPE::p2m \n    uint32_t TransferType;      //!< Transfer Type\n    uint32_t SrcConn;           ///!< Peripheral Source Connection type, used in case TransferType is chosen as\n    uint32_t DstConn;           //!< Peripheral Destination Connection type, used in case TransferType is chosen as\n    uint32_t DMALLI;            //!< Linker List Item structure data address if there's no Linker List, set as '0'\n    \n    // Mbed specifics.\n    \n    MODDMA_Channel_CFG_t() {\n        isrIntTCStat  = new FunctionPointer;\n        isrIntErrStat = new FunctionPointer;\n    }\n    \n    ~MODDMA_Channel_CFG_t() {\n        delete(isrIntTCStat);\n        delete(isrIntErrStat);\n    }\n        \n    class MODDMA_Channel_CFG_t * channelNum(uint32_t n)    { ChannelNum = n;    return this; }\n    class MODDMA_Channel_CFG_t * transferSize(uint32_t n)  { TransferSize = n;  return this; }\n    class MODDMA_Channel_CFG_t * transferWidth(uint32_t n) { TransferWidth = n; return this; }\n    class MODDMA_Channel_CFG_t * srcMemAddr(uint32_t n)    { SrcMemAddr = n;    return this; }\n    class MODDMA_Channel_CFG_t * dstMemAddr(uint32_t n)    { DstMemAddr = n;    return this; }\n    class MODDMA_Channel_CFG_t * transferType(uint32_t n)  { TransferType = n;  return this; }\n    class MODDMA_Channel_CFG_t * srcConn(uint32_t n)       { SrcConn = n;       return this; }\n    class MODDMA_Channel_CFG_t * dstConn(uint32_t n)       { DstConn = n;       return this; }\n    class MODDMA_Channel_CFG_t * dmaLLI(uint32_t n)        { DMALLI = n;        return this; }\n    \n    uint32_t channelNum(void) { return ChannelNum; }\n    \n    FunctionPointer *isrIntTCStat;                        \n    FunctionPointer *isrIntErrStat;                        \n};\n\n/**\n * @brief GPDMA Linker List Item structure type definition\n */\nclass GPDMA_LLI_t \n{\npublic:\n    uint32_t SrcAddr;    //!< Source Address \n    uint32_t DstAddr;    //!< Destination address \n    uint32_t NextLLI;    //!< Next LLI address, otherwise set to '0' \n    uint32_t Control;    //!< GPDMA Control of this LLI \n};\n\n}; // namespace AjK ends.\n\n#endif \n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/ChangeLog.c",
    "content": "/* $Id:$\n\n1.13- 2 Mar 2013\n\n    * Update RESERVED9 to DMAREQSEL in SETUP.cpp\n      Thanks Bryce Chee for pointing it out.\n\n1.12- 14 Mar 2011\n\n    * Added example4.h that demonstrates alternately sending\n      two buffers (double buffering) to the DAC. All those\n      people building MP3 players may find this of interest.\n      \n1.11- 13 Mar 2011\n\n    * Fixed a silly typo in the documentation of example3.h\n    \n1.10- 13 Mar 2011\n\n    * The rescheduling showed the timer being stopped and restarted\n      to perform a new scheduled grab. This was changed to show the \n      timer free running and the reschedules being setup.\n\n1.9 - 13 Mar 2011\n\n    * Improved example3.h to add rescheduling additional grabs\n      based on the timer setup.\n      \n1.8 - 13 Mar 2011\n\n    * Renamed example files to .h\n    * Added pseudo g2m and m2g transferTypes to support GPIO \n      \"memory moves\" but triggered by peripheral timer. To \n      support this new operating mode added example3.h\n    \n1.7 - 13 Mar 2011\n\n    * Remove the test at the beginning of the channel setup.\n    \n1.6 - 8 Mar 2011\n      \n    * Fixed a typo bug. Reported by Wim van der Vegt\n      http://mbed.org/forum/mbed/topic/1798/?page=1#comment-9845\n      \n1.5 - 5 Feb 2011\n\n    * Found a bug in the NXP library that I had copied over.\n      http://mbed.org/forum/mbed/topic/1798\n    * Added example2.cpp to support that forum thread.\n      \n1.4 - 23/11/2010\n\n    * Added some extra overloaded methods to make calling certain\n      userland API methods simpler.\n      \n1.3 - 23/10/2010\n\n    * Added the LLI class wrapper.\n    * Added checking channel's LLI for non-null before auto-disable\n      of a channel with the ISR.\n    * Tested with MODSERIAL which is now natively MODDMA \"aware\".\n      MODSERIAL can now, using MODDMA, send blocks of bytes out\n      of it's TX port under DMA control.\n        \n1.2 - 23/10/2010\n\n    * Improved the IRQ callback attachment API to make \n      easier attachments when creating configurations.\n      \n1.1 - 23/10/2010\n\n    * Tidied up example1.cpp\n    * Removed some unneeded methoids that cause compiler errs.\n    \n1.0 - 23/11/2010\n\n    * First release\n\n*/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/DATALUTS.cpp",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n\n#include \"MODDMA.h\"\n\n#ifndef MBED_H\n#include \"mbed.h\"\n#endif\n\n#ifndef MODDMA_CONFIG_H\n#include \"CONFIG.h\"\n#endif\n\nnamespace AjK {\n\nuint32_t\nMODDMA::LUTPerAddr(int n)\n{\n    const uint32_t lut[] = { \n          (uint32_t)&LPC_SSP0->DR         // SSP0 Tx\n        , (uint32_t)&LPC_SSP0->DR         // SSP0 Rx\n        , (uint32_t)&LPC_SSP1->DR         // SSP1 Tx\n        , (uint32_t)&LPC_SSP1->DR         // SSP1 Rx\n        , (uint32_t)&LPC_ADC->ADGDR       // ADC\n        , (uint32_t)&LPC_I2S->I2STXFIFO   // I2S Tx\n        , (uint32_t)&LPC_I2S->I2SRXFIFO   // I2S Rx\n        , (uint32_t)&LPC_DAC->DACR        // DAC\n        , (uint32_t)&LPC_UART0->THR       // UART0 Tx\n        , (uint32_t)&LPC_UART0->RBR       // UART0 Rx\n        , (uint32_t)&LPC_UART1->THR       // UART1 Tx\n        , (uint32_t)&LPC_UART1->RBR       // UART1 Rx\n        , (uint32_t)&LPC_UART2->THR       // UART2 Tx\n        , (uint32_t)&LPC_UART2->RBR       // UART2 Rx\n        , (uint32_t)&LPC_UART3->THR       // UART3 Tx\n        , (uint32_t)&LPC_UART3->RBR       // UART3 Rx\n        , (uint32_t)&LPC_TIM0->MR0        // MAT0.0\n        , (uint32_t)&LPC_TIM0->MR1        // MAT0.1\n        , (uint32_t)&LPC_TIM1->MR0        // MAT1.0\n        , (uint32_t)&LPC_TIM1->MR1        // MAT1.1\n        , (uint32_t)&LPC_TIM2->MR0        // MAT2.0\n        , (uint32_t)&LPC_TIM2->MR1        // MAT2.1\n        , (uint32_t)&LPC_TIM3->MR0        // MAT3.0\n        , (uint32_t)&LPC_TIM3->MR1        // MAT3.1   \n    };\n    return lut[n & 0xFF];    \n}\n\nuint32_t\nMODDMA::Channel_p(int channel)\n{\n    const uint32_t lut[] = {\n          (uint32_t)LPC_GPDMACH0\n        , (uint32_t)LPC_GPDMACH1\n        , (uint32_t)LPC_GPDMACH2\n        , (uint32_t)LPC_GPDMACH3\n        , (uint32_t)LPC_GPDMACH4\n        , (uint32_t)LPC_GPDMACH5\n        , (uint32_t)LPC_GPDMACH6\n        , (uint32_t)LPC_GPDMACH7\n    };\n    return lut[channel & 0xFF];\n}\n\nuint8_t\nMODDMA::LUTPerBurst(int n)\n{\n    const uint8_t lut[] = {\n          (uint8_t)_4       // SSP0 Tx \n        , (uint8_t)_4       // SSP0 Rx\n        , (uint8_t)_4       // SSP1 Tx\n        , (uint8_t)_4       // SSP1 Rx\n        , (uint8_t)_1       // ADC\n        , (uint8_t)_32      // I2S channel 0\n        , (uint8_t)_32      // I2S channel 1\n        , (uint8_t)_1       // DAC\n        , (uint8_t)_1       // UART0 Tx\n        , (uint8_t)_1       // UART0 Rx\n        , (uint8_t)_1       // UART1 Tx\n        , (uint8_t)_1       // UART1 Rx\n        , (uint8_t)_1       // UART2 Tx\n        , (uint8_t)_1       // UART2 Rx\n        , (uint8_t)_1       // UART3 Tx\n        , (uint8_t)_1       // UART3 Rx\n        , (uint8_t)_1       // MAT0.0\n        , (uint8_t)_1       // MAT0.1\n        , (uint8_t)_1       // MAT1.0\n        , (uint8_t)_1       // MAT1.1\n        , (uint8_t)_1       // MAT2.0\n        , (uint8_t)_1       // MAT2.1\n        , (uint8_t)_1       // MAT3.0\n        , (uint8_t)_1       // MAT3.1\n    };\n    return lut[n & 0xFFF];\n}\n\nuint8_t\nMODDMA::LUTPerWid(int n)\n{\n    const uint8_t lut[] = {\n          (uint8_t)byte      // SSP0 Tx\n        , (uint8_t)byte      // SSP0 Rx\n        , (uint8_t)byte      // SSP1 Tx\n        , (uint8_t)byte      // SSP1 Rx\n        , (uint8_t)word      // ADC\n        , (uint8_t)word      // I2S channel 0\n        , (uint8_t)word      // I2S channel 1\n        , (uint8_t)word      // DAC \n        , (uint8_t)byte      // UART0 Tx\n        , (uint8_t)byte      // UART0 Rx\n        , (uint8_t)byte      // UART1 Tx\n        , (uint8_t)byte      // UART1 Rx\n        , (uint8_t)byte      // UART2 Tx\n        , (uint8_t)byte      // UART2 Rx\n        , (uint8_t)byte      // UART3 Tx\n        , (uint8_t)byte      // UART3 Rx  \n        , (uint8_t)word      // MAT0.0\n        , (uint8_t)word      // MAT0.1\n        , (uint8_t)word      // MAT1.0\n        , (uint8_t)word      // MAT1.1\n        , (uint8_t)word      // MAT2.0\n        , (uint8_t)word      // MAT2.1\n        , (uint8_t)word      // MAT3.0\n        , (uint8_t)word      // MAT3.1  \n    };\n    return lut[n & 0xFFF];\n}\n\n}; // namespace AjK ends\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/INIT.cpp",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n\n#include \"MODDMA.h\"\n\nnamespace AjK {\n\nextern uint32_t oldDMAHandler;\nextern \"C\" void MODDMA_IRQHandler(void);\nextern class MODDMA *moddma_p;\n\nvoid\nMODDMA::init(bool isConstructorCalling, int Channels, int Tc, int Err)\n{\n    if (isConstructorCalling) {    \n        if (LPC_SC->PCONP & (1UL << 29)) {\n            if (LPC_GPDMA->DMACConfig & 1) {\n                error(\"Only one instance of MODDMA can exist.\");\n            }\n        }\n        LPC_SC->PCONP |= (1UL << 29);\n        LPC_GPDMA->DMACConfig = 1;\n        moddma_p = this;\n        for (int i = 0; i < 8; i++) {\n            setups[i] = (MODDMA_Config *)NULL;\n        }        \n    }\n    \n    // Reset channel configuration register(s)\n    if (Channels & 0x01) LPC_GPDMACH0->DMACCConfig = 0;\n    if (Channels & 0x02) LPC_GPDMACH1->DMACCConfig = 0;\n    if (Channels & 0x04) LPC_GPDMACH2->DMACCConfig = 0;\n    if (Channels & 0x08) LPC_GPDMACH3->DMACCConfig = 0;\n    if (Channels & 0x10) LPC_GPDMACH4->DMACCConfig = 0;\n    if (Channels & 0x20) LPC_GPDMACH5->DMACCConfig = 0;\n    if (Channels & 0x40) LPC_GPDMACH6->DMACCConfig = 0;\n    if (Channels & 0x80) LPC_GPDMACH7->DMACCConfig = 0;\n\n    /* Clear DMA interrupt and error flag */\n    LPC_GPDMA->DMACIntTCClear = Tc;\n    LPC_GPDMA->DMACIntErrClr  = Err;\n    \n    if (isConstructorCalling) {    \n        oldDMAHandler = NVIC_GetVector(DMA_IRQn);\n        NVIC_SetVector(DMA_IRQn, (uint32_t)MODDMA_IRQHandler);\n        NVIC_EnableIRQ(DMA_IRQn);\n    }\n}\n\n}; // namespace AjK ends\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/MODDMA.cpp",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n#include \"iomacros.h\"\n#include \"MODDMA.h\"\n\nnamespace AjK {\n\n// Create a \"hook\" for our ISR to make callbacks. Set by init()\nclass MODDMA *moddma_p = (class MODDMA *)NULL;\n\nvoid\nMODDMA::Enable(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );\n    pChannel->DMACCConfig |= _E;\n}\n\nbool\nMODDMA::Enabled(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );    \n    return (bool)(pChannel->DMACCConfig & _E);\n}\n\nvoid\nMODDMA::Disable(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );\n    pChannel->DMACCConfig &= ~(_E);\n}\n\nbool\nMODDMA::isActive(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );\n    return (bool)( pChannel->DMACCConfig & CxConfig_A() ) ;\n}\n\nvoid \nMODDMA::haltChannel(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );\n    pChannel->DMACCConfig |= CxConfig_H();\n}\n\nuint32_t \nMODDMA::getControl(CHANNELS ChannelNumber)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber );\n    return pChannel->DMACCControl;\n}\n\nuint32_t oldDMAHandler = 0;\ntypedef void (*MODDMA_FN)(void);\n\nextern \"C\" void MODDMA_IRQHandler(void) {\n    uint32_t channel_mask;\n        \n    if (moddma_p == (class MODDMA *)NULL) {\n        if (oldDMAHandler) {\n            ((MODDMA_FN)oldDMAHandler)();\n            return;\n        }\n        else {\n            error(\"Interrupt without instance\");\n        }\n    }\n    \n    for (int channel_number = 0; channel_number < 8; channel_number++) {\n        channel_mask = (1UL << channel_number);\n        if (LPC_GPDMA->DMACIntStat & channel_mask) {\n            if (LPC_GPDMA->DMACIntTCStat & channel_mask) {\n                if (moddma_p->setups[channel_number] != (MODDMA_Config *)NULL) {\n                    moddma_p->setIrqProcessingChannel((MODDMA::CHANNELS)channel_number);\n                    moddma_p->setIrqType(MODDMA::TcIrq);\n                    moddma_p->setups[channel_number]->isrIntTCStat->call();\n                    moddma_p->isrIntTCStat.call();\n                    // The user callback should clear the IRQ. But if they forget\n                    // then the Mbed will lockup. So, check to see if the IRQ has\n                    // been dismissed, if not, we will dismiss it here.\n                    if (LPC_GPDMA->DMACIntTCStat & channel_mask) {\n                        LPC_GPDMA->DMACIntTCClear = channel_mask;\n                    }\n                    // If the user has left the channel enabled, disable it.\n                    // Note, we don't check Active here as it may block inside\n                    // an ISR, we just shut it down immediately. If the user\n                    // must wait for completion they should implement their\n                    // own ISR. But only disable if the LLI linked list register\n                    // is null otherwise we can crap out a series of transfers.\n                    if (moddma_p->Enabled( (MODDMA::CHANNELS)channel_number )) {\n                        if (moddma_p->lli( (MODDMA::CHANNELS)channel_number ) == 0 ) {\n                            moddma_p->Disable( (MODDMA::CHANNELS)channel_number ); \n                        }\n                    }\n                }            \n            }\n            \n            if (LPC_GPDMA->DMACIntErrStat & channel_mask) {\n                if (moddma_p->setups[channel_number] != (MODDMA_Config *)NULL) {\n                    moddma_p->setIrqProcessingChannel((MODDMA::CHANNELS)channel_number);\n                    moddma_p->setIrqType(MODDMA::ErrIrq);\n                    moddma_p->setups[channel_number]->isrIntErrStat->call();\n                    moddma_p->isrIntErrStat.call();\n                    // The user callback should clear the IRQ. But if they forget\n                    // then the Mbed will lockup. So, check to see if the IRQ has\n                    // been dismissed, if not, we will dismiss it here.\n                    if (LPC_GPDMA->DMACIntErrStat & channel_mask) {\n                        LPC_GPDMA->DMACIntErrClr = channel_mask;\n                    }\n                    // If the user has left the channel enabled, disable it.\n                    // Not, we don't check Active here as it may block inside\n                    // an ISR, we just shut it down immediately. If the user\n                    // must wait for completion they should implement their\n                    // own ISR. But only disable if the LLI linked list register\n                    // is null otherwise we can crap out a series of transfers.\n                    if (moddma_p->Enabled( (MODDMA::CHANNELS)channel_number )) {\n                        if (moddma_p->lli( (MODDMA::CHANNELS)channel_number ) == 0 ) {\n                            moddma_p->Disable( (MODDMA::CHANNELS)channel_number ); \n                        }\n                    }\n                }            \n            }\n        }\n    }\n    \n    /* IRQ should be handled by now, check to make sure. */\n    if (LPC_GPDMA->DMACIntStat) {\n        ((MODDMA_FN)oldDMAHandler)();\n        LPC_GPDMA->DMACIntTCClear = (uint32_t)0xFF; /* If not, clear anyway! */\n    }\n    if (LPC_GPDMA->DMACIntErrStat) {\n        ((MODDMA_FN)oldDMAHandler)();\n        LPC_GPDMA->DMACIntErrClr = (uint32_t)0xFF; /* If not, clear anyway! */\n    }\n}\n\n}; // namespace AjK ends\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/MODDMA.h",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n    \n    @file          MODDMA.h \n    @purpose       Adds DMA controller and multiple transfer configurations\n    @version       see ChangeLog.c\n    @date          Nov 2010\n    @author        Andy Kirkham    \n*/\n\n#ifndef MODDMA_H\n#define MODDMA_H\n\n/** @defgroup API The MODDMA API */\n/** @defgroup MISC Misc MODSERIAL functions */\n/** @defgroup INTERNALS MODSERIAL Internals */\n\n#include \"mbed.h\"\n#include \"iomacros.h\"\n\nnamespace AjK {\n\n/**\n * @brief The MODDMA configuration system\n * @author Andy Kirkham\n * @see http://mbed.org/cookbook/MODDMA_Config\n * @see MODDMA\n * @see API \n *\n * <b>MODDMA_Config</b> defines a configuration that can be passed to the MODDMA controller\n * instance to perform a GPDMA data transfer.\n */\nclass  MODDMA_Config {\nprotected:\n\n    // *****************************************\n    // From GPDMA by NXP MCU SW Application Team\n    // *****************************************\n    \n    uint32_t ChannelNum;        //!< DMA channel number, should be in range from 0 to 7. \n    uint32_t TransferSize;      //!< Length/Size of transfer \n    uint32_t TransferWidth;     //!< Transfer width - used for TransferType is GPDMA_TRANSFERTYPE_m2m only \n    uint32_t SrcMemAddr;        //!< Physical Src Addr, used in case TransferType is chosen as MODDMA::GPDMA_TRANSFERTYPE::m2m or MODDMA::GPDMA_TRANSFERTYPE::m2p \n    uint32_t DstMemAddr;        //!< Physical Destination Address, used in case TransferType is chosen as MODDMA::GPDMA_TRANSFERTYPE::m2m or MODDMA::GPDMA_TRANSFERTYPE::p2m \n    uint32_t TransferType;      //!< Transfer Type\n    uint32_t SrcConn;           //!< Peripheral Source Connection type, used in case TransferType is chosen as\n    uint32_t DstConn;           //!< Peripheral Destination Connection type, used in case TransferType is chosen as\n    uint32_t DMALLI;            //!< Linker List Item structure data address if there's no Linker List, set as '0'\n    uint32_t DMACSync;          //!< DMACSync if required.\n    \n    // Mbed specifics.\n\npublic: \n   \n    MODDMA_Config() {\n        isrIntTCStat  = new FunctionPointer;\n        isrIntErrStat = new FunctionPointer;\n        ChannelNum    = 0xFFFF;\n        TransferSize  = 0;\n        TransferWidth = 0;\n        SrcMemAddr    = 0;\n        DstMemAddr    = 0;\n        TransferType  = 0;\n        SrcConn       = 0;\n        DstConn       = 0;\n        DMALLI        = 0;\n        DMACSync      = 0;\n    }\n    \n    ~MODDMA_Config() {\n        delete(isrIntTCStat);\n        delete(isrIntErrStat);\n    }\n        \n    class MODDMA_Config * channelNum(uint32_t n)    { ChannelNum = n & 0x7;  return this; }\n    class MODDMA_Config * transferSize(uint32_t n)  { TransferSize = n;      return this; }\n    class MODDMA_Config * transferWidth(uint32_t n) { TransferWidth = n;     return this; }\n    class MODDMA_Config * srcMemAddr(uint32_t n)    { SrcMemAddr = n;        return this; }\n    class MODDMA_Config * dstMemAddr(uint32_t n)    { DstMemAddr = n;        return this; }\n    class MODDMA_Config * transferType(uint32_t n)  { TransferType = n;      return this; }\n    class MODDMA_Config * srcConn(uint32_t n)       { SrcConn = n;           return this; }\n    class MODDMA_Config * dstConn(uint32_t n)       { DstConn = n;           return this; }\n    class MODDMA_Config * dmaLLI(uint32_t n)        { DMALLI = n;            return this; }\n    class MODDMA_Config * dmacSync(uint32_t n)      { DMACSync = n;          return this; }\n    \n    uint32_t channelNum(void)    { return ChannelNum;    }\n    uint32_t transferSize(void)  { return TransferSize;  }\n    uint32_t transferWidth(void) { return TransferWidth; }\n    uint32_t srcMemAddr(void)    { return SrcMemAddr;    }\n    uint32_t dstMemAddr(void)    { return DstMemAddr;    }\n    uint32_t transferType(void)  { return TransferType;  }\n    uint32_t srcConn(void)       { return SrcConn;       }\n    uint32_t dstConn(void)       { return DstConn;       }\n    uint32_t dmaLLI(void)        { return DMALLI;        }\n    uint32_t dmacSync(void)      { return DMACSync; }\n    \n    /**\n     * Attach a callback to the TC IRQ configuration.\n     *\n     * @param fptr A function pointer to call\n     * @return this\n     */\n    class MODDMA_Config * attach_tc(void (*fptr)(void)) {  \n        isrIntTCStat->attach(fptr); \n        return this;\n    }\n    \n    /**\n     * Attach a callback to the ERR IRQ configuration.\n     *\n     * @param fptr A function pointer to call\n     * @return this\n     */\n    class MODDMA_Config * attach_err(void (*fptr)(void)) {  \n        isrIntErrStat->attach(fptr);         \n        return this;\n    }\n    \n    /**\n     * Attach a callback to the TC IRQ configuration.\n     *\n     * @param tptr A template pointer to the calling object\n     * @param mptr A method pointer within the object to call.\n     * @return this\n     */\n    template<typename T>\n    class MODDMA_Config * attach_tc(T* tptr, void (T::*mptr)(void)) {  \n        if((mptr != NULL) && (tptr != NULL)) {\n            isrIntTCStat->attach(tptr, mptr);\n        }\n        return this;\n    }\n    \n    /**\n     * Attach a callback to the ERR IRQ configuration.\n     *\n     * @param tptr A template pointer to the calling object\n     * @param mptr A method pointer within the object to call.\n     * @return this\n     */\n    template<typename T>\n    class MODDMA_Config * attach_err(T* tptr, void (T::*mptr)(void)) {  \n        if((mptr != NULL) && (tptr != NULL)) {\n            isrIntErrStat->attach(tptr, mptr);\n        }\n        return this;\n    }\n    FunctionPointer *isrIntTCStat;                        \n    FunctionPointer *isrIntErrStat;                        \n};\n\n/**\n * @brief The MODDMA configuration system (linked list items)\n * @author Andy Kirkham\n * @see http://mbed.org/cookbook/MODDMA_Config\n * @see MODDMA\n * @see MODDMA_Config\n * @see API \n */\nclass MODDMA_LLI {\npublic:\n    class MODDMA_LLI *srcAddr(uint32_t n) { SrcAddr = n; return this; }\n    class MODDMA_LLI *dstAddr(uint32_t n) { DstAddr = n; return this; }\n    class MODDMA_LLI *nextLLI(uint32_t n) { NextLLI = n; return this; }\n    class MODDMA_LLI *control(uint32_t n) { Control = n; return this; }\n    uint32_t srcAddr(void) { return SrcAddr; }\n    uint32_t dstAddr(void) { return DstAddr; }\n    uint32_t nextLLI(void) { return NextLLI; }\n    uint32_t control(void) { return Control; }\n\n    uint32_t SrcAddr;    //!< Source Address \n    uint32_t DstAddr;    //!< Destination address \n    uint32_t NextLLI;    //!< Next LLI address, otherwise set to '0' \n    uint32_t Control;    //!< GPDMA Control of this LLI \n};\n\n\n\n /**\n * @brief MODDMA GPDMA Controller\n * @author Andy Kirkham\n * @see http://mbed.org/cookbook/MODDMA\n * @see example1.cpp\n * @see API \n *\n * <b>MODDMA</b> defines a GPDMA controller and multiple DMA configurations that allow for DMA\n * transfers from memory to memory, memory to peripheral or peripheral to memory.\n *\n * At the heart of the library is the MODDMA class that defines a single instance controller that\n * manages all the GPDMA hardware registers and interrupts. The controller can accept multiple\n * configurations that define the channel transfers. Each configuration specifies the source and \n * destination information and other associated parts to maintain the transfer process.\n *\n * Standard example:\n * @code\n * #include \"mbed.h\"\n * #include \"MODDMA.h\"\n *\n * DigitalOut led1(LED1);\n * Serial pc(USBTX, USBRX); // tx, rx\n * MODDMA dma;\n *\n * int main() {\n *\n *     // Create a string buffer to send directly to a Uart/Serial\n *     char s[] = \"***DMA*** ABCDEFGHIJKLMNOPQRSTUVWXYZ ***DMA***\";\n *\n *     // Create a transfer configuarion\n *     MODDMA_Config *config = new MODDMA_Config;\n *\n *     // Provide a \"minimal\" setup for demo purposes.\n *     config\n *      ->channelNum    ( MODDMA::Channel_0 )   // The DMA channel to use.\n *      ->srcMemAddr    ( (uint32_t) &s )       // A pointer to the buffer to send.\n *      ->transferSize  ( sizeof(s) )           // The size of that buffer.\n *      ->transferType  ( MODDMA::m2p )         // Source is memory, destination is peripheral\n *      ->dstConn       ( MODDMA::UART0_Tx )    // Specifically, peripheral is Uart0 TX (USBTX, USBRX)\n *    ; // config end.\n *\n *    // Pass the configuration to the MODDMA controller.\n *    dma.Setup( config );\n *\n *    // Enable the channel and begin transfer.\n *    dma.Enable( config->channelNum() );\n *\n *    while(1) {\n *         led1 = !led1;\n *         wait(0.25);\n *     }\n * }\n * @endcode\n */\nclass MODDMA\n{\npublic:\n\n    //! Channel definitions.\n    enum CHANNELS {\n          Channel_0 = 0     /*!< Channel 0 */ \n        , Channel_1         /*!< Channel 1 */ \n        , Channel_2         /*!< Channel 2 */ \n        , Channel_3         /*!< Channel 3 */ \n        , Channel_4         /*!< Channel 4 */ \n        , Channel_5         /*!< Channel 5 */ \n        , Channel_6         /*!< Channel 6 */ \n        , Channel_7         /*!< Channel 7 */ \n    };\n    \n    //! Interrupt callback types.\n    enum IrqType_t {\n          TcIrq = 0     /*!< Terminal Count interrupt */\n        , ErrIrq        /*!< Error interrupt */\n    };\n    \n    //! Return status codes.\n    enum Status {\n          Ok            = 0     /*!< Ok, suceeded */\n        , Error         = -1    /*!< General error */\n        , ErrChInUse    = -2    /*!< Specific error, channel in use */\n    };\n    \n    //! DMA Connection number definitions \n    enum GPDMA_CONNECTION {\n          SSP0_Tx       = 0UL   /*!< SSP0 Tx */\n        , SSP0_Rx       = 1UL   /*!< SSP0 Rx */\n        , SSP1_Tx       = 2UL   /*!< SSP1 Tx */\n        , SSP1_Rx       = 3UL   /*!< SSP1 Rx */\n        , ADC           = 4UL   /*!< ADC */\n        , I2S_Channel_0 = 5UL   /*!< I2S channel 0 */\n        , I2S_Channel_1 = 6UL   /*!< I2S channel 1 */\n        , DAC           = 7UL   /*!< DAC */\n        , UART0_Tx      = 8UL   /*!< UART0 Tx */\n        , UART0_Rx      = 9UL   /*!< UART0 Rx */\n        , UART1_Tx      = 10UL  /*!< UART1 Tx */\n        , UART1_Rx      = 11UL  /*!< UART1 Rx */\n        , UART2_Tx      = 12UL  /*!< UART2 Tx */\n        , UART2_Rx      = 13UL  /*!< UART2 Rx */\n        , UART3_Tx      = 14UL  /*!< UART3 Tx */\n        , UART3_Rx      = 15UL  /*!< UART3 Rx */\n        , MAT0_0        = 16UL  /*!< MAT0.0 */\n        , MAT0_1        = 17UL  /*!< MAT0.1 */\n        , MAT1_0        = 18UL  /*!< MAT1.0 */\n        , MAT1_1        = 19UL  /*!< MAT1.1 */\n        , MAT2_0        = 20UL  /**< MAT2.0 */\n        , MAT2_1        = 21UL  /*!< MAT2.1 */\n        , MAT3_0        = 22UL  /*!< MAT3.0 */\n        , MAT3_1        = 23UL  /*!< MAT3.1 */\n    };\n\n    //! GPDMA Transfer type definitions \n    enum  GPDMA_TRANSFERTYPE {\n          m2m = 0UL     /*!< Memory to memory - DMA control */\n        , m2p = 1UL     /*!< Memory to peripheral - DMA control */\n        , p2m = 2UL     /*!< Peripheral to memory - DMA control */\n        , p2p = 3UL     /*!< Src peripheral to dest peripheral - DMA control */         \n        , g2m = 4UL     /*!< Psuedo special case for reading \"peripheral GPIO\" that's memory mapped. */\n        , m2g = 5UL     /*!< Psuedo Special case for writing \"peripheral GPIO\" that's memory mapped. */        \n    };   \n\n    //! Burst size in Source and Destination definitions */\n    enum GPDMA_BSIZE {\n          _1    = 0UL   /*!< Burst size = 1 */\n        , _4    = 1UL   /*!< Burst size = 4 */\n        , _8    = 2UL   /*!< Burst size = 8 */\n        , _16   = 3UL   /*!< Burst size = 16 */\n        , _32   = 4UL   /*!< Burst size = 32 */\n        , _64   = 5UL   /*!< Burst size = 64 */\n        , _128  = 6UL   /*!< Burst size = 128 */\n        , _256  = 7UL   /*!< Burst size = 256 */\n    };\n    \n    //! Width in Src transfer width and Dest transfer width definitions */\n    enum GPDMA_WIDTH {\n          byte     = 0UL    /*!< Width = 1 byte */\n        , halfword = 1UL    /*!< Width = 2 bytes */\n        , word     = 2UL    /*!< Width = 4 bytes */\n    };\n    \n    //! DMA Request Select Mode definitions. */\n    enum GPDMA_REQSEL {\n          uart  = 0UL   /*!< UART TX/RX is selected */\n        , timer = 1UL   /*!< Timer match is selected */\n    };\n\n    //! GPDMA Control register bits.\n    enum Config {\n          _E = 1        /*!< DMA Controller enable */\n        , _M = 2        /*!< AHB Master endianness configuration */\n    };    \n\n    //! GPDMA Channel config register bits.\n    enum CConfig {\n          _CE  = (1UL << 0)     /*!< Channel enable */\n        , _IE  = (1UL << 14)    /*!< Interrupt error mask */\n        , _ITC = (1UL << 15)    /*!< Terminal count interrupt mask */\n        , _L   = (1UL << 16)    /*!< Lock */\n        , _A   = (1UL << 17)    /*!< Active */\n        , _H   = (1UL << 18)    /*!< Halt */\n    };\n    \n    /**\n     * The MODDMA constructor is used to initialise the DMA controller object.\n     */    \n    MODDMA() { init(true); }\n    \n    /**\n     * The MODDMA destructor.\n     */    \n    ~MODDMA() {}\n    \n    /**\n     * Used to setup the DMA controller to prepare for a data transfer.\n     *\n     * @ingroup API\n     * @param isConstructorCalling Set true when called from teh constructor\n     * @param \n     */\n    void init(bool isConstructorCalling, int Channels = 0xFF, int Tc = 0xFF, int Err = 0xFF);\n    \n    /**\n     * Used to setup and enable the DMA controller.\n     *\n     * @see Setup\n     * @see Enable\n     * @ingroup API\n     * @param c A pointer to an instance of MODDMA_Config to setup.\n     */\n    uint32_t Prepare(MODDMA_Config *c) {\n        uint32_t u = Setup(c);\n        if (u) Enable(c);\n        return u;\n    }\n    \n    /**\n     * Used to setup the DMA controller to prepare for a data transfer.\n     *\n     * @ingroup API\n     * @param c A pointer to an instance of MODDMA_Config to setup.\n     */\n    uint32_t Setup(MODDMA_Config *c);\n    \n    /**\n     * Enable and begin data transfer.\n     *\n     * @ingroup API\n     * @param ChannelNumber Type CHANNELS, the channel number to enable\n     */\n    void Enable(CHANNELS ChannelNumber);\n    \n    /**\n     * Enable and begin data transfer (overloaded function)\n     *\n     * @ingroup API\n     * @param ChannelNumber Type uin32_t, the channel number to enable\n     */\n    void Enable(uint32_t ChannelNumber) { Enable((CHANNELS)(ChannelNumber & 0x7)); }\n    \n    /**\n     * Enable and begin data transfer (overloaded function)\n     *\n     * @ingroup API\n     * @param config A pointer to teh configuration\n     */\n    void Enable(MODDMA_Config *config) { Enable( config->channelNum() ); }\n        \n    \n    /**\n     * Disable a channel and end data transfer.\n     *\n     * @ingroup API\n     * @param ChannelNumber Type CHANNELS, the channel number to enable\n     */\n    void Disable(CHANNELS ChannelNumber);\n    \n    /**\n     * Disable a channel and end data transfer (overloaded function)\n     *\n     * @ingroup API\n     * @param ChannelNumber Type uin32_t, the channel number to disable\n     */\n    void Disable(uint32_t ChannelNumber) { Disable((CHANNELS)(ChannelNumber & 0x7)); }\n    \n    /**\n     * Is the specified channel enabled?\n     *\n     * @ingroup API\n     * @param ChannelNumber Type CHANNELS, the channel number to test\n     * @return bool true if enabled, false otherwise.\n     */\n    bool Enabled(CHANNELS ChannelNumber);\n    \n    /**\n     * Is the specified channel enabled? (overloaded function)\n     *\n     * @ingroup API\n     * @param ChannelNumber Type uin32_t, the channel number to test\n     * @return bool true if enabled, false otherwise.\n     */\n    bool Enabled(uint32_t ChannelNumber) { return Enabled((CHANNELS)(ChannelNumber & 0x7)); }\n    \n    __INLINE uint32_t IntStat(uint32_t n)            { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t IntTCStat_Ch(uint32_t n)       { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t IntTCClear_Ch(uint32_t n)      { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t IntErrStat_Ch(uint32_t n)      { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t IntErrClr_Ch(uint32_t n)       { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t RawIntErrStat_Ch(uint32_t n)   { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t EnbldChns_Ch(uint32_t n)       { return (1UL << n) & 0xFF; }\n    __INLINE uint32_t SoftBReq_Src(uint32_t n)       { return (1UL << n) & 0xFFFF; }\n    __INLINE uint32_t SoftSReq_Src(uint32_t n)       { return (1UL << n) & 0xFFFF; }\n    __INLINE uint32_t SoftLBReq_Src(uint32_t n)      { return (1UL << n) & 0xFFFF; }\n    __INLINE uint32_t SoftLSReq_Src(uint32_t n)      { return (1UL << n) & 0xFFFF; }\n    __INLINE uint32_t Sync_Src(uint32_t n)           { return (1UL << n) & 0xFFFF; }\n    __INLINE uint32_t ReqSel_Input(uint32_t n)       { return (1UL << (n - 8)) & 0xFF; }\n    \n\n    __INLINE uint32_t CxControl_TransferSize(uint32_t n)     { return (n & 0xFFF) << 0; }\n    __INLINE uint32_t CxControl_SBSize(uint32_t n)           { return (n & 0x7) << 12; }\n    __INLINE uint32_t CxControl_DBSize(uint32_t n)           { return (n & 0x7) << 15; }\n    __INLINE uint32_t CxControl_SWidth(uint32_t n)           { return (n & 0x7) << 18; }\n    __INLINE uint32_t CxControl_DWidth(uint32_t n)           { return (n & 0x7) << 21; }\n    __INLINE uint32_t CxControl_SI()                         { return (1UL << 26); }\n    __INLINE uint32_t CxControl_DI()                         { return (1UL << 27); }\n    __INLINE uint32_t CxControl_Prot1()                      { return (1UL << 28); }\n    __INLINE uint32_t CxControl_Prot2()                      { return (1UL << 29); }\n    __INLINE uint32_t CxControl_Prot3()                      { return (1UL << 30); }\n    __INLINE uint32_t CxControl_I()                          { return (1UL << 31); }\n    __INLINE uint32_t CxControl_E()                          { return (1UL << 0); }\n    __INLINE uint32_t CxConfig_SrcPeripheral(uint32_t n)     { return (n & 0x1F) << 1; }\n    __INLINE uint32_t CxConfig_DestPeripheral(uint32_t n)    { return (n & 0x1F) << 6; }\n    __INLINE uint32_t CxConfig_TransferType(uint32_t n)      { return (n & 0x7) << 11; }\n    __INLINE uint32_t CxConfig_IE()                          { return (1UL << 14); }\n    __INLINE uint32_t CxConfig_ITC()                         { return (1UL << 15); }\n    __INLINE uint32_t CxConfig_L()                           { return (1UL << 16); }\n    __INLINE uint32_t CxConfig_A()                           { return (1UL << 17); }\n    __INLINE uint32_t CxConfig_H()                           { return (1UL << 18); }\n    \n    /**\n     * A store for up to 8 (8 channels) of configurations.\n     * @see MODDMA_Config\n     */\n    MODDMA_Config *setups[8];\n    \n    /**\n     * Get a pointer to the current configuration the ISR is servicing.\n     *\n     * @ingroup API\n     * @return MODDMA_Config * A pointer to the setup the ISR is currently servicing.\n     */\n    MODDMA_Config *getConfig(void) { return setups[IrqProcessingChannel]; }\n    \n    /**\n     * Set which channel the ISR is currently servicing.\n     *\n     * *** USED INTERNALLY. DO NOT CALL FROM USER PROGRAMS ***\n     *\n     * Must be public so the extern \"C\" ISR can use it.\n     */\n    void setIrqProcessingChannel(CHANNELS n) { IrqProcessingChannel = n; }\n    \n    /**\n     * Gets which channel the ISR is currently servicing.\n     *\n     * @ingroup API\n     * @return CHANNELS The current channel the ISR is servicing.\n     */\n    CHANNELS irqProcessingChannel(void) { return IrqProcessingChannel; }\n    \n    /**\n     * Sets which type of IRQ the ISR is making a callback for.\n     *\n     * *** USED INTERNALLY. DO NOT CALL FROM USER PROGRAMS ***\n     *\n     * Must be public so the extern \"C\" ISR can use it.\n     */ \n    void setIrqType(IrqType_t n) { IrqType = n; }\n    \n    /**\n     * Get which type of IRQ the ISR is calling you about,\n     * terminal count or error.\n     */\n    IrqType_t irqType(void) { return IrqType; }\n    \n    /**\n     * Clear the interrupt after handling.\n     *\n     * @param CHANNELS The channel the IQR occured on.\n     */\n    void clearTcIrq(CHANNELS n) { LPC_GPDMA->DMACIntTCClear = (uint32_t)(1UL << n); } \n    \n    /**\n     * Clear the interrupt the ISR is currently handing..\n     */\n    void clearTcIrq(void) { clearTcIrq( IrqProcessingChannel ); }\n    \n    /**\n     * Clear the error interrupt after handling.\n     *\n     * @ingroup API\n     * @param CHANNELS The channel the IQR occured on.\n     */\n    void clearErrIrq(CHANNELS n) { LPC_GPDMA->DMACIntTCClear = (uint32_t)(1UL << n); } \n    \n    /**\n     * Clear the error interrupt the ISR is currently handing.\n     * @ingroup API\n     */\n    void clearErrIrq(void) { clearErrIrq( IrqProcessingChannel ); }\n   \n    /**\n     * Is the supplied channel currently active?\n     *\n     * @ingroup API\n     * @param CHANNELS The channel to inquire about.\n     * @return bool true if active, false otherwise.\n     */     \n    bool isActive(CHANNELS ChannelNumber);\n    \n    /**\n     * Halt the supplied channel. \n     *\n     * @ingroup API\n     * @param CHANNELS The channel to halt.\n     */\n    void haltChannel(CHANNELS ChannelNumber);\n    \n    /**\n     * get a channels control register. \n     *\n     * @ingroup API\n     * @param CHANNELS The channel to get the control register for.\n     */\n    uint32_t getControl(CHANNELS ChannelNumber);\n    \n    /**\n     * Wait for channel transfer to complete and then halt.\n     *\n     * @ingroup API\n     * @param CHANNELS The channel to wait for then halt.\n     */\n    void haltAndWaitChannelComplete(CHANNELS n) { haltChannel(n); while (isActive(n)); }\n    \n    /**\n     * Attach a callback to the TC IRQ controller.\n     *\n     * @ingroup API\n     * @param fptr A function pointer to call\n     * @return this\n     */\n    void attach_tc(void (*fptr)(void)) {  \n        isrIntTCStat.attach(fptr);         \n    }\n    \n    /**\n     * Attach a callback to the TC IRQ controller.\n     *\n     * @ingroup API\n     * @param tptr A template pointer to the calling object\n     * @param mptr A method pointer within the object to call.\n     * @return this\n     */\n    template<typename T>\n    void attach_tc(T* tptr, void (T::*mptr)(void)) {  \n        if((mptr != NULL) && (tptr != NULL)) {\n            isrIntTCStat.attach(tptr, mptr);         \n        }        \n    }\n       \n    /**\n     * The MODDMA controllers terminal count interrupt callback.\n     */\n    FunctionPointer isrIntTCStat;                        \n    \n    /**\n     * Attach a callback to the ERR IRQ controller.\n     *\n     * @ingroup API\n     * @param fptr A function pointer to call\n     * @return this\n     */\n    void attach_err(void (*fptr)(void)) {  \n        isrIntErrStat.attach(fptr);                 \n    }\n    \n    /**\n     * Attach a callback to the ERR IRQ controller.\n     *\n     * @ingroup API\n     * @param tptr A template pointer to the calling object\n     * @param mptr A method pointer within the object to call.\n     * @return this\n     */\n    template<typename T>\n    void attach_err(T* tptr, void (T::*mptr)(void)) {  \n        if((mptr != NULL) && (tptr != NULL)) {\n            isrIntErrStat.attach(tptr, mptr);         \n        }\n    }\n    \n    /**\n     * Get the Linked List index regsiter for the requested channel.\n     *\n     * @param channelNum The channel number.\n     * @return uint32_t The value of the DMACCLLI register\n     */\n    uint32_t lli(CHANNELS ChannelNumber, MODDMA_LLI *set = 0) { \n        LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( ChannelNumber & 0x7 );\n        if (set) pChannel->DMACCLLI = (uint32_t)set;\n        return pChannel->DMACCLLI; \n    }\n    \n    /**\n     * The MODDMA controllers error interrupt callback.\n     */\n    FunctionPointer isrIntErrStat;                        \n    \n    uint32_t Channel_p(int channel);\n    \nprotected:\n   \n    // Data LUTs.\n    uint32_t LUTPerAddr(int n);\n    uint8_t  LUTPerBurst(int n);\n    uint8_t  LUTPerWid(int n);    \n    //uint32_t Channel_p(int channel);\n    \n    CHANNELS IrqProcessingChannel;\n    \n    IrqType_t IrqType;\n};\n\n}; // namespace AjK ends.\n\nusing namespace AjK;\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/SETUP.cpp",
    "content": "/*\n    Copyright (c) 2010 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n\n#include \"MODDMA.h\"\n\nnamespace AjK {\n\nuint32_t\nMODDMA::Setup(MODDMA_Config *config)\n{\n    LPC_GPDMACH_TypeDef *pChannel = (LPC_GPDMACH_TypeDef *)Channel_p( config->channelNum() );\n    \n    setups[config->channelNum() & 0x7] = config;\n    \n    // Reset the Interrupt status\n    LPC_GPDMA->DMACIntTCClear = IntTCClear_Ch( config->channelNum() );\n    LPC_GPDMA->DMACIntErrClr  = IntErrClr_Ch ( config->channelNum() );\n\n    // Clear DMA configure\n    pChannel->DMACCControl = 0x00;\n    pChannel->DMACCConfig  = 0x00;\n\n    // Assign Linker List Item value \n    pChannel->DMACCLLI = config->dmaLLI();\n\n    // Set value to Channel Control Registers \n    switch (config->transferType()) {\n    \n        // Memory to memory\n        case m2m:\n            // Assign physical source and destination address\n            pChannel->DMACCSrcAddr  = config->srcMemAddr();\n            pChannel->DMACCDestAddr = config->dstMemAddr();\n            pChannel->DMACCControl\n                = CxControl_TransferSize(config->transferSize()) \n                | CxControl_SBSize(_32) \n                | CxControl_DBSize(_32) \n                | CxControl_SWidth(config->transferWidth()) \n                | CxControl_DWidth(config->transferWidth()) \n                | CxControl_SI() \n                | CxControl_DI() \n                | CxControl_I();\n            break;\n        \n        // Memory to peripheral\n        case m2p:\n            // Assign physical source\n            pChannel->DMACCSrcAddr = config->srcMemAddr();\n            // Assign peripheral destination address\n            pChannel->DMACCDestAddr = (uint32_t)LUTPerAddr(config->dstConn());\n            pChannel->DMACCControl\n                = CxControl_TransferSize((uint32_t)config->transferSize()) \n                | CxControl_SBSize((uint32_t)LUTPerBurst(config->dstConn())) \n                | CxControl_DBSize((uint32_t)LUTPerBurst(config->dstConn())) \n                | CxControl_SWidth((uint32_t)LUTPerWid(config->dstConn())) \n                | CxControl_DWidth((uint32_t)LUTPerWid(config->dstConn())) \n                | CxControl_SI() \n                | CxControl_I();\n            break;\n            \n        // Peripheral to memory\n        case p2m:\n            // Assign peripheral source address\n            pChannel->DMACCSrcAddr = (uint32_t)LUTPerAddr(config->srcConn());\n            // Assign memory destination address\n            pChannel->DMACCDestAddr = config->dstMemAddr();\n            pChannel->DMACCControl\n                = CxControl_TransferSize((uint32_t)config->transferSize()) \n                | CxControl_SBSize((uint32_t)LUTPerBurst(config->srcConn())) \n                | CxControl_DBSize((uint32_t)LUTPerBurst(config->srcConn())) \n                | CxControl_SWidth((uint32_t)LUTPerWid(config->srcConn())) \n                | CxControl_DWidth((uint32_t)LUTPerWid(config->srcConn())) \n                | CxControl_DI() \n                | CxControl_I();\n            break;\n            \n        // Peripheral to peripheral\n        case p2p:\n            // Assign peripheral source address\n            pChannel->DMACCSrcAddr = (uint32_t)LUTPerAddr(config->srcConn());\n            // Assign peripheral destination address\n            pChannel->DMACCDestAddr = (uint32_t)LUTPerAddr(config->dstConn());\n            pChannel->DMACCControl\n                = CxControl_TransferSize((uint32_t)config->transferSize()) \n                | CxControl_SBSize((uint32_t)LUTPerBurst(config->srcConn())) \n                | CxControl_DBSize((uint32_t)LUTPerBurst(config->dstConn())) \n                | CxControl_SWidth((uint32_t)LUTPerWid(config->srcConn())) \n                | CxControl_DWidth((uint32_t)LUTPerWid(config->dstConn())) \n                | CxControl_I();\n            break;\n            \n        // GPIO to memory\n        case g2m:\n            // Assign GPIO source address\n            pChannel->DMACCSrcAddr = config->srcMemAddr();\n            // Assign memory destination address\n            pChannel->DMACCDestAddr = config->dstMemAddr();\n            pChannel->DMACCControl\n                = CxControl_TransferSize((uint32_t)config->transferSize()) \n                | CxControl_SBSize((uint32_t)LUTPerBurst(config->srcConn())) \n                | CxControl_DBSize((uint32_t)LUTPerBurst(config->srcConn())) \n                | CxControl_SWidth((uint32_t)LUTPerWid(config->srcConn())) \n                | CxControl_DWidth((uint32_t)LUTPerWid(config->srcConn())) \n                | CxControl_DI() \n                | CxControl_I();\n            break;\n            \n        // Memory to GPIO\n        case m2g:\n            // Assign physical source\n            pChannel->DMACCSrcAddr = config->srcMemAddr();\n            // Assign peripheral destination address\n            pChannel->DMACCDestAddr = config->dstMemAddr();\n            pChannel->DMACCControl\n                = CxControl_TransferSize((uint32_t)config->transferSize()) \n                | CxControl_SBSize((uint32_t)LUTPerBurst(config->dstConn())) \n                | CxControl_DBSize((uint32_t)LUTPerBurst(config->dstConn())) \n                | CxControl_SWidth((uint32_t)LUTPerWid(config->dstConn())) \n                | CxControl_DWidth((uint32_t)LUTPerWid(config->dstConn())) \n                | CxControl_SI() \n                | CxControl_I();\n            break;\n            \n        // Do not support any more transfer type, return ERROR\n        default:\n            return 0;\n    }\n\n     // Re-Configure DMA Request Select for source peripheral \n    if (config->srcConn() > 15) {\n        LPC_SC->DMAREQSEL |= (1 << (config->srcConn() - 16));\n    } \n    else {\n        LPC_SC->DMAREQSEL &= ~(1 << (config->srcConn() - 8));\n    }\n\n    // Re-Configure DMA Request Select for destination peripheral\n    if (config->dstConn() > 15) {\n        LPC_SC->DMAREQSEL |= (1 << (config->dstConn() - 16));\n    } \n    else {\n        LPC_SC->DMAREQSEL &= ~(1 << (config->dstConn() - 8));\n    }\n\n    // Enable DMA channels, little endian \n    LPC_GPDMA->DMACConfig = _E;\n    while (!(LPC_GPDMA->DMACConfig & _E));\n\n    // Calculate absolute value for Connection number\n    uint32_t tmp1 = config->srcConn(); tmp1 = ((tmp1 > 15) ? (tmp1 - 8) : tmp1);\n    uint32_t tmp2 = config->dstConn(); tmp2 = ((tmp2 > 15) ? (tmp2 - 8) : tmp2);\n\n    if (config->dmacSync()) {\n        uint32_t tmp3 = config->dmacSync(); tmp3 = ((tmp3 > 15) ? (tmp3 - 8) : tmp3);\n        LPC_GPDMA->DMACSync |= Sync_Src( tmp3 );\n    }\n    \n    uint32_t tfer_type = (uint32_t)config->transferType();\n    if (tfer_type == g2m || tfer_type == m2g) {\n        tfer_type -= 2; // Adjust psuedo transferType to a real transferType.\n    }\n    \n    // Configure DMA Channel, enable Error Counter and Terminate counter\n    pChannel->DMACCConfig \n        = CxConfig_IE() \n        | CxConfig_ITC() \n        | CxConfig_TransferType(tfer_type) \n        | CxConfig_SrcPeripheral(tmp1) \n        | CxConfig_DestPeripheral(tmp2);\n\n    return pChannel->DMACCControl;\n}\n\n}; // namespace AjK ends\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/example1.h",
    "content": "#include \"mbed.h\"\n#include \"MODDMA.h\"\n#include \"MODSERIAL.h\"\n\nDigitalOut led1(LED1);\nDigitalOut led2(LED2);\nDigitalOut led3(LED3);\nDigitalOut led4(LED4);\nMODDMA dma;\nMODSERIAL pc(USBTX, USBRX);\n\n// Function prototypes for IRQ callbacks.\n// See definitions following main() below.\nvoid dmaTCCallback(void);\nvoid dmaERRCallback(void);\nvoid TC0_callback(void);\nvoid ERR0_callback(void);\n\nint main() {\n    char s[] = \"**DMA** ABCDEFGHIJKLMNOPQRSTUVWXYZ **DMA**\";\n    \n    pc.baud(PC_BAUD);\n    \n    dma.attach_tc( &dmaTCCallback );\n    dma.attach_err( &dmaERRCallback );\n    \n    MODDMA_Config *config = new MODDMA_Config;\n    config\n     ->channelNum    ( MODDMA::Channel_0 )\n     ->srcMemAddr    ( (uint32_t) &s )\n     ->dstMemAddr    ( 0 )\n     ->transferSize  ( sizeof(s) )\n     ->transferType  ( MODDMA::m2p )\n     ->transferWidth ( 0 )\n     ->srcConn       ( 0 )\n     ->dstConn       ( MODDMA::UART0_Tx )\n     ->dmaLLI        ( 0 )\n     ->attach_tc     ( &TC0_callback )\n     ->attach_err    ( &ERR0_callback )\n    ; // config end\n    \n    // Setup the configuration.\n    dma.Setup(config);\n    \n    //dma.Enable( MODDMA::Channel_0 );\n    //dma.Enable( config->channelNum() );\n    dma.Enable( config );\n    \n    while (1) {\n        led1 = !led1;\n        wait(0.25);        \n    }\n}\n\n// Main controller TC IRQ callback\nvoid dmaTCCallback(void) {\n    led2 = 1;\n}\n\n// Main controller ERR IRQ callback\nvoid dmaERRCallback(void) {\n    error(\"Oh no! My Mbed exploded! :( Only kidding, find the problem\");\n}\n\n// Configuration callback on TC\nvoid TC0_callback(void) {\n    MODDMA_Config *config = dma.getConfig();\n    dma.haltAndWaitChannelComplete( (MODDMA::CHANNELS)config->channelNum());\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n    \n    // Configurations have two IRQ callbacks for TC and Err so you \n    // know which you are processing. However, if you want to use \n    // a single callback function you can tell what type of IRQ \n    // is being processed thus:-\n    if (dma.irqType() == MODDMA::TcIrq)  {\n        led3 = 1;\n        dma.clearTcIrq();\n    }\n    if (dma.irqType() == MODDMA::ErrIrq) {\n        led4 = 1;\n        dma.clearErrIrq();\n    }\n}\n\n// Configuration cakllback on Error\nvoid ERR0_callback(void) {\n    error(\"Oh no! My Mbed exploded! :( Only kidding, find the problem\");\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/example2.h",
    "content": "/*\n * This example was provided to support Mbed forum thread:-\n * http://mbed.org/forum/mbed/topic/1798\n */\n \n#include \"mbed.h\"\n#include \"MODDMA.h\"\n\n#define SAMPLE_BUFFER_LENGTH 32\n\nDigitalOut led1(LED1);\nDigitalOut led2(LED2);\n\nMODDMA dma;\nSerial pc(USBTX, USBRX);\n\n// ISR set's this when transfer complete.\nbool dmaTransferComplete = false;\n\n// Function prototypes for IRQ callbacks.\n// See definitions following main() below.\nvoid TC0_callback(void);\nvoid ERR0_callback(void);\n\nint main() {\n\n    // Create a buffer to hold the ADC samples and clear it.\n    // Note, we are going to sample two ADC inputs so they\n    // end up in this buffer \"interleaved\". So you will want\n    // a buffer twice this size to a real life given sample\n    // frequency. See the printf() output for details.\n    uint32_t adcInputBuffer[SAMPLE_BUFFER_LENGTH];    \n    memset(adcInputBuffer, 0, sizeof(adcInputBuffer));\n    \n    // We use the ADC irq to trigger DMA and the manual says\n    // that in this case the NVIC for ADC must be disabled.\n    NVIC_DisableIRQ(ADC_IRQn);\n    \n    // Power up the ADC and set PCLK\n    LPC_SC->PCONP    |=  (1UL << 12);\n    LPC_SC->PCLKSEL0 &= ~(3UL << 24); // PCLK = CCLK/4 96M/4 = 24MHz\n    \n    // Enable the ADC, 12MHz,  ADC0.0 & .1\n    LPC_ADC->ADCR  = (1UL << 21) | (1UL << 8) | (3UL << 0); \n    \n    // Set the pin functions to ADC\n    LPC_PINCON->PINSEL1 &= ~(3UL << 14);  /* P0.23, Mbed p15. */\n    LPC_PINCON->PINSEL1 |=  (1UL << 14);\n    LPC_PINCON->PINSEL1 &= ~(3UL << 16);  /* P0.24, Mbed p16. */\n    LPC_PINCON->PINSEL1 |=  (1UL << 16);\n    \n    // Setup the serial port to print out results.\n    pc.baud(115200);\n    pc.printf(\"ADC with DMA example\\n\");\n    pc.printf(\"====================\\n\");\n    \n    // Prepare an ADC configuration.\n    MODDMA_Config *conf = new MODDMA_Config;\n    conf\n     ->channelNum    ( MODDMA::Channel_0 )\n     ->srcMemAddr    ( 0 )\n     ->dstMemAddr    ( (uint32_t)adcInputBuffer )\n     ->transferSize  ( SAMPLE_BUFFER_LENGTH )\n     ->transferType  ( MODDMA::p2m )\n     ->transferWidth ( MODDMA::word )\n     ->srcConn       ( MODDMA::ADC )\n     ->dstConn       ( 0 )\n     ->dmaLLI        ( 0 )\n     ->attach_tc     ( &TC0_callback )\n     ->attach_err    ( &ERR0_callback )\n    ; // end conf.\n    \n    // Prepare configuration.\n    dma.Setup( conf );\n    \n    // Enable configuration.\n    dma.Enable( conf );\n    \n    // Enable ADC irq flag (to DMA).\n    // Note, don't set the individual flags,\n    // just set the global flag.\n    LPC_ADC->ADINTEN = 0x100;\n\n    // Enable burst mode on inputs 0 and 1.\n    LPC_ADC->ADCR |= (1UL << 16); \n    \n    while (1) {\n        // When transfer complete do this block.\n        if (dmaTransferComplete) {\n            delete conf; // No memory leaks, delete the configuration.\n            dmaTransferComplete = false;\n            for (int i = 0; i < SAMPLE_BUFFER_LENGTH; i++) {\n                int channel = (adcInputBuffer[i] >> 24) & 0x7;\n                int iVal = (adcInputBuffer[i] >> 4) & 0xFFF;\n                double fVal = 3.3 * (double)((double)iVal) / ((double)0x1000); // scale to 0v to 3.3v\n                pc.printf(\"Array index %02d : ADC input channel %d = 0x%03x %01.3f volts\\n\", i, channel, iVal, fVal);                  \n            }\n        }\n        \n        // Just flash LED1 for something to do.\n        led1 = !led1;\n        wait(0.25);        \n    }\n}\n\n// Configuration callback on TC\nvoid TC0_callback(void) {\n    \n    MODDMA_Config *config = dma.getConfig();\n    \n    // Disbale burst mode and switch off the IRQ flag.\n    LPC_ADC->ADCR &= ~(1UL << 16);\n    LPC_ADC->ADINTEN = 0;    \n    \n    // Finish the DMA cycle by shutting down the channel.\n    dma.haltAndWaitChannelComplete( (MODDMA::CHANNELS)config->channelNum());\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n    \n    // Tell main() while(1) loop to print the results.\n    dmaTransferComplete = true;            \n    \n    // Switch on LED2 to show transfer complete.\n    led2 = 1;        \n    \n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();    \n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n}\n\n// Configuration callback on Error\nvoid ERR0_callback(void) {\n    // Switch off burst conversions.\n    LPC_ADC->ADCR |= ~(1UL << 16);\n    LPC_ADC->ADINTEN = 0;\n    error(\"Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem\");\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/example3.h",
    "content": "/*\n * Demonstrates capturing the GPIO P0.4 to P0.7 \"nibble\" to memory \n * using GPDMA. The transfers from port pins to memory buffer are\n * triggered using Timer1 MAT1.0 match compare.\n *\n * In this example all inputs have pullups. So with nothing connected\n * the P0.4/7 reads as 0xF. Connecting a wire from one or more of the four \n * inputs to ground will show up in the captured buffer sequence.\n */\n \n#include \"mbed.h\"\n#include \"MODDMA.h\"\n#include \"iomacros.h\" // within MODDMA library.\n\n// How long between grabbing GPIO FIO0PIN register.\n// Value is in microseconds. (500000 is half a second).\n#define SAMPLE_PERIOD   500000\n\n#define NUM_OF_SAMPLES  5\n\nSerial pc(USBTX, USBRX);\n\nDigitalOut led1(LED1);\nDigitalOut led2(LED2);\nDigitalOut led3(LED3);\n\nuint32_t buffer[NUM_OF_SAMPLES];\n\nbool dmaTransferComplete;\n\nMODDMA dma;\nMODDMA_Config *conf;\n\nvoid TC0_callback(void);\nvoid ERR0_callback(void);\n\nint main() {\n    volatile int life_counter = 0;\n     \n    // Macros defined in iomacros.h, saves messing with DigitalIn\n    p30_AS_INPUT; p30_MODE( PIN_PULLUP ); // P0.4\n    p29_AS_INPUT; p29_MODE( PIN_PULLUP ); // P0.5\n    p8_AS_INPUT;  p8_MODE( PIN_PULLUP );  // P0.6\n    p7_AS_INPUT;  p7_MODE( PIN_PULLUP );  // P0.7\n    \n    // Clear the buffer.\n    memset(buffer, 0, sizeof(buffer));\n    \n    // Setup the serial port to print out results.\n    pc.baud(115200);\n    pc.printf(\"Starting up...\\n\");\n    \n    // Set-up timer1 as a periodic timer.\n    LPC_SC->PCONP    |= (1UL << 2); // TIM1 On\n    LPC_SC->PCLKSEL0 |= (3UL << 4); // CCLK/8 = 12MHz\n    LPC_TIM1->PR      = 11;         // TC clocks at 1MHz.\n    LPC_TIM1->MCR     = 2;          // Reset TCR to zero on match.\n    LPC_TIM1->MR0     = SAMPLE_PERIOD;\n    \n    // Prepare the GPDMA system.\n    conf = new MODDMA_Config;\n    conf\n     ->channelNum    ( MODDMA::Channel_0 )\n     ->srcMemAddr    ( (uint32_t)&LPC_GPIO0->FIOPIN )\n     ->dstMemAddr    ( (uint32_t)&buffer[0] )\n     ->transferSize  ( NUM_OF_SAMPLES )\n     ->transferType  ( MODDMA::g2m ) // pseudo transfer code MODDMA understands.\n     ->transferWidth ( MODDMA::word )\n     ->srcConn       ( MODDMA::MAT1_0 )\n     ->dmacSync      ( MODDMA::MAT1_0 ) \n     ->attach_tc     ( TC0_callback )\n     ->attach_err    ( ERR0_callback )\n    ; // end conf.\n    \n    // Prepare configuration.\n    if (!dma.Setup( conf )) {\n        error(\"Doh!\");\n    }\n    \n    // Enable GPDMA to be ready for the TIM1 \"ticks\".       \n    dma.Enable( conf );\n    \n    // Begin.\n    LPC_TIM1->TCR = 1;\n       \n    while (1) { \n        if (life_counter++ > 1000000) {\n            led1 = !led1; // Show some sort of life.\n            life_counter = 0;\n        }\n        \n        if (dmaTransferComplete) {\n            dmaTransferComplete = false;\n            for (int i = 0; i < NUM_OF_SAMPLES; i++) {\n                int val = (buffer[i] >> 4) & 0xF; \n                pc.printf(\"Buffer index %d = 0x%x\\n\", i, val);\n            }\n            pc.printf(\"Done.\\n\");\n            \n            // Schedule another grab.\n            if (dma.Setup( conf )) {        \n                dma.Enable( conf );                \n            }            \n        }\n    }       \n}\n\n// Configuration callback on TC\nvoid TC0_callback(void) {\n    \n    // Just show sample sequence grab complete.\n    led3 = !led3; \n        \n    // Get configuration pointer.\n    MODDMA_Config *config = dma.getConfig();\n    \n    // Finish the DMA cycle by shutting down the channel.\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n    \n    // Tell main() while(1) loop to print the results.\n    dmaTransferComplete = true;            \n    \n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();    \n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();    \n}\n\n// Configuration callback on Error\nvoid ERR0_callback(void) {\n    error(\"Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem\");\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/example4.h",
    "content": "/*\n * Demonstrates sending a buffer repeatedly to the DAC using DMA.\n * Connect an oscilloscope to Mbed pin 18. This example doesn't\n * output anything else (nothing on any serial ports).\n */\n#include \"mbed.h\"\n#include \"MODDMA.h\"\n\n// Make the buffer size match the number of degrees\n// in a circle since we are going to output a sinewave.\n#define BUFFER_SIZE 360\n\n// Set DAC output power mode.\n#define DAC_POWER_MODE  (1 << 16)\n\nDigitalOut led1(LED1);\nDigitalOut led3(LED3);\nDigitalOut led4(LED4);\n\nint buffer[2][BUFFER_SIZE];\n\nAnalogOut signal(p18);\n\nMODDMA dma;\nMODDMA_Config *conf0, *conf1;\n\nvoid TC0_callback(void);\nvoid ERR0_callback(void);\n\nvoid TC1_callback(void);\nvoid ERR1_callback(void);\n\nint main() {\n    volatile int life_counter = 0;\n    \n    // Create a sinewave buffer for testing.\n    for (int i =   0; i <=  90; i++) buffer[0][i] =  (512 * sin(3.14159/180.0 * i)) + 512;                \n    for (int i =  91; i <= 180; i++) buffer[0][i] =  buffer[0][180 - i];\n    for (int i = 181; i <= 270; i++) buffer[0][i] =  512 - (buffer[0][i - 180] - 512);\n    for (int i = 271; i <  360; i++) buffer[0][i] =  512 - (buffer[0][360 - i] - 512);\n    \n    // Adjust the sinewave buffer for use with DAC hardware.\n    for (int i = 0; i < 360; i++) {\n        buffer[0][i] = DAC_POWER_MODE | ((buffer[0][i] << 6) & 0xFFC0);\n        buffer[1][i] = buffer[0][i]; // Just create a copy of buffer0 to continue sinewave.\n    }\n    \n    // Prepare the GPDMA system for buffer0.\n    conf0 = new MODDMA_Config;\n    conf0\n     ->channelNum    ( MODDMA::Channel_0 )\n     ->srcMemAddr    ( (uint32_t) &buffer[0] )\n     ->dstMemAddr    ( MODDMA::DAC )\n     ->transferSize  ( 360 )\n     ->transferType  ( MODDMA::m2p )\n     ->dstConn       ( MODDMA::DAC )\n     ->attach_tc     ( &TC0_callback )\n     ->attach_err    ( &ERR0_callback )     \n    ; // config end\n    \n    \n    // Prepare the GPDMA system for buffer1.\n    conf1 = new MODDMA_Config;\n    conf1\n     ->channelNum    ( MODDMA::Channel_1 )\n     ->srcMemAddr    ( (uint32_t) &buffer[1] )\n     ->dstMemAddr    ( MODDMA::DAC )\n     ->transferSize  ( 360 )\n     ->transferType  ( MODDMA::m2p )\n     ->dstConn       ( MODDMA::DAC )\n     ->attach_tc     ( &TC1_callback )\n     ->attach_err    ( &ERR1_callback )     \n    ; // config end\n\n    \n    // Calculating the transfer frequency:\n    // By default, the Mbed library sets the PCLK_DAC clock value\n    // to 24MHz. One complete sinewave cycle in each buffer is 360\n    // points long. So, for a 1Hz wave we would need to transfer 360\n    // values per second. That would be 24000000/360 which is approx\n    // 66,666. But that's no good! The count val is only 16bits in size\n    // so bare this in mind. If you need to go slower you will need to\n    // alter PCLK_DAC from CCLK/4 to CCLK/8.\n    // For our demo we are going to have the sinewave run at 1kHz.\n    // That's 24000000/360000 which is approx 66. Experimentation\n    // however showed 65 to get closer to 1kHz (on my Mbed and scope \n    // at least).\n    LPC_DAC->DACCNTVAL = 65; // 6500 for 10Hz\n\n    // Prepare first configuration.\n    if (!dma.Prepare( conf0 )) {\n        error(\"Doh!\");\n    }\n    \n    // Begin (enable DMA and counter). Note, don't enable\n    // DBLBUF_ENA as we are using DMA double buffering.\n    LPC_DAC->DACCTRL |= (3UL << 2);\n    \n    while (1) { \n        // There's not a lot to do as DMA and interrupts are\n        // now handling the buffer transfers. So we'll just\n        // flash led1 to show the Mbed is alive and kicking.\n        if (life_counter++ > 1000000) {\n            led1 = !led1; // Show some sort of life.\n            life_counter = 0;\n        }\n    } \n}\n\n// Configuration callback on TC\nvoid TC0_callback(void) {\n    \n    // Just show sending buffer0 complete.\n    led3 = !led3; \n        \n    // Get configuration pointer.\n    MODDMA_Config *config = dma.getConfig();\n    \n    // Finish the DMA cycle by shutting down the channel.\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n   \n    // Swap to buffer1\n    dma.Prepare( conf1 );\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq(); \n}\n\n// Configuration callback on Error\nvoid ERR0_callback(void) {\n    error(\"Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem\");\n}\n\n// Configuration callback on TC\nvoid TC1_callback(void) {\n    \n    // Just show sending buffer1 complete.\n    led4 = !led4; \n        \n    // Get configuration pointer.\n    MODDMA_Config *config = dma.getConfig();\n    \n    // Finish the DMA cycle by shutting down the channel.\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n    \n    // Swap to buffer0\n    dma.Prepare( conf0 );\n    \n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq(); \n}\n\n// Configuration callback on Error\nvoid ERR1_callback(void) {\n    error(\"Oh no! My Mbed EXPLODED! :( Only kidding, go find the problem\");\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA/iomacros.h",
    "content": "/*\n    Copyright (c) 2011 Andy Kirkham\n \n    Permission is hereby granted, free of charge, to any person obtaining a copy\n    of this software and associated documentation files (the \"Software\"), to deal\n    in the Software without restriction, including without limitation the rights\n    to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n    copies of the Software, and to permit persons to whom the Software is\n    furnished to do so, subject to the following conditions:\n \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n    OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n    THE SOFTWARE.\n*/\n\n#ifndef IOMACROS_H\n#define IOMACROS_H\n\n#ifndef __LPC17xx_H__\n#include \"LPC17xx.h\"\n#endif\n\n#define PIN_PULLUP      0UL\n#define PIN_REPEAT      1UL\n#define PIN_NONE        2UL\n#define PIN_PULLDOWN    3UL\n\n/* p5 is P0.9 */\n#define p5_SEL_MASK     ~(3UL << 18)\n#define p5_SET_MASK     (1UL << 9)\n#define p5_CLR_MASK     ~(p5_SET_MASK)\n#define p5_AS_OUTPUT    LPC_PINCON->PINSEL0&=p5_SEL_MASK;LPC_GPIO0->FIODIR|=p5_SET_MASK\n#define p5_AS_INPUT     LPC_GPIO0->FIOMASK &= p5_CLR_MASK; \n#define p5_SET          LPC_GPIO0->FIOSET = p5_SET_MASK\n#define p5_CLR          LPC_GPIO0->FIOCLR = p5_SET_MASK\n#define p5_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p5_SET_MASK)\n#define p5_IS_CLR       !(p5_IS_SET)\n#define p5_MODE(x)      LPC_PINCON->PINMODE0&=p5_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<18)\n\n/* p6 is P0.8 */\n#define p6_SEL_MASK     ~(3UL << 16)\n#define p6_SET_MASK     (1UL <<  8)\n#define p6_CLR_MASK     ~(p6_SET_MASK)\n#define p6_AS_OUTPUT    LPC_PINCON->PINSEL0&=p6_SEL_MASK;LPC_GPIO0->FIODIR|=p6-SET_MASK\n#define p6_AS_INPUT     LPC_GPIO0->FIOMASK &= p6_CLR_MASK; \n#define p6_SET          LPC_GPIO0->FIOSET = p6_SET_MASK\n#define p6_CLR          LPC_GPIO0->FIOCLR = p6_SET_MASK\n#define p6_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p6_SET_MASK)\n#define p6_IS_CLR       !(p6_IS_SET)\n#define p6_MODE(x)      LPC_PINCON->PINMODE0&=p6_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<16)    \n\n/* p7 is P0.7 */\n#define p7_SEL_MASK     ~(3UL << 14)\n#define p7_SET_MASK     (1UL <<  7)\n#define p7_CLR_MASK     ~(p7_SET_MASK)\n#define p7_AS_OUTPUT    LPC_PINCON->PINSEL0&=p7_SEL_MASK;LPC_GPIO0->FIODIR|=p7_SET_MASK\n#define p7_AS_INPUT     LPC_GPIO0->FIOMASK &= p7_CLR_MASK; \n#define p7_SET          LPC_GPIO0->FIOSET = p7_SET_MASK\n#define p7_CLR          LPC_GPIO0->FIOCLR = p7_SET_MASK\n#define p7_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p7_SET_MASK)\n#define p7_IS_CLR       !(p7_IS_SET)\n#define p7_MODE(x)      LPC_PINCON->PINMODE0&=p7_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<14)    \n\n/* p8 is P0.6 */\n#define p8_SEL_MASK     ~(3UL << 12)\n#define p8_SET_MASK     (1UL <<  6)\n#define p8_CLR_MASK     ~(p8_SET_MASK)\n#define p8_AS_OUTPUT    LPC_PINCON->PINSEL0&=p8_SEL_MASK;LPC_GPIO0->FIODIR|=p8_SET_MASK\n#define p8_AS_INPUT     LPC_GPIO0->FIOMASK &= p8_CLR_MASK; \n#define p8_SET          LPC_GPIO0->FIOSET = p8_SET_MASK\n#define p8_CLR          LPC_GPIO0->FIOCLR = p8_SET_MASK\n#define p8_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p8_SET_MASK)\n#define p8_IS_CLR       !(p8_IS_SET)\n#define p8_MODE(x)      LPC_PINCON->PINMODE0&=p8_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<12)    \n\n/* p9 is P0.0 */\n#define p9_SEL_MASK     ~(3UL <<  0)\n#define p9_SET_MASK     (1UL <<  0)\n#define p9_CLR_MASK     ~(p9_SET_MASK)\n#define p9_AS_OUTPUT    LPC_PINCON->PINSEL0&=p9_SEL_MASK;LPC_GPIO0->FIODIR|=p9_SET_MASK\n#define p9_AS_INPUT     LPC_GPIO0->FIOMASK &= p9_CLR_MASK; \n#define p9_SET          LPC_GPIO0->FIOSET = p9_SET_MASK\n#define p9_CLR          LPC_GPIO0->FIOCLR = p9_SET_MASK\n#define p9_IS_SET       (bool)(LPC_GPIO0->FIOPIN & p9_SET_MASK)\n#define p9_IS_CLR       !(p9_IS_SET)\n#define p9_MODE(x)      LPC_PINCON->PINMODE0&=p9_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<0)    \n\n/* p10 is P0.1 */\n#define p10_SEL_MASK    ~(3UL <<  2)\n#define p10_SET_MASK    (1UL <<  1)\n#define p10_CLR_MASK    ~(p10_SET_MASK)\n#define p10_AS_OUTPUT   LPC_PINCON->PINSEL0&=p10_SEL_MASK;LPC_GPIO0->FIODIR|=p10_SET_MASK\n#define p10_AS_INPUT    LPC_GPIO0->FIOMASK &= p10_CLR_MASK; \n#define p10_SET         LPC_GPIO0->FIOSET = p10_SET_MASK\n#define p10_CLR         LPC_GPIO0->FIOCLR = p10_SET_MASK\n#define p10_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p10_SET_MASK)\n#define p10_IS_CLR      !(p10_IS_SET)\n#define p10_MODE(x)     LPC_PINCON->PINMODE0&=p10_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<2)\n\n/* p11 is P0.18 */\n#define p11_SEL_MASK    ~(3UL << 4)\n#define p11_SET_MASK    (1UL <<  18)\n#define p11_CLR_MASK    ~(p11_SET_MASK)\n#define p11_AS_OUTPUT   LPC_PINCON->PINSEL1&=p11_SEL_MASK;LPC_GPIO0->FIODIR|=p11_SET_MASK\n#define p11_AS_INPUT    LPC_GPIO0->FIOMASK &= p11_CLR_MASK; \n#define p11_SET         LPC_GPIO0->FIOSET = p11_SET_MASK\n#define p11_CLR         LPC_GPIO0->FIOCLR = p11_SET_MASK\n#define p11_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p11_SET_MASK)\n#define p11_IS_CLR      !(p11_IS_SET)\n#define p11_MODE(x)     LPC_PINCON->PINMODE1&=p11_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<4)\n\n/* p12 is P0.17 */\n#define p12_SEL_MASK    ~(3UL << 2)\n#define p12_SET_MASK    (1UL << 17)\n#define p12_CLR_MASK    ~(p12_SET_MASK)\n#define p12_AS_OUTPUT   LPC_PINCON->PINSEL1&=p12_SEL_MASK;LPC_GPIO0->FIODIR|=p12_SET_MASK\n#define p12_AS_INPUT    LPC_GPIO0->FIOMASK &= p12_CLR_MASK; \n#define p12_SET         LPC_GPIO0->FIOSET = p12_SET_MASK\n#define p12_CLR         LPC_GPIO0->FIOCLR = p12_SET_MASK\n#define p12_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p12_SET_MASK)\n#define p12_IS_CLR      !(p12_IS_SET)\n#define p12_MODE(x)     LPC_PINCON->PINMODE1&=p12_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<2)\n\n/* p13 is P0.15 */\n#define p13_SEL_MASK    ~(3UL << 30)\n#define p13_SET_MASK    (1UL << 15)\n#define p13_CLR_MASK    ~(p13_SET_MASK)\n#define p13_AS_OUTPUT   LPC_PINCON->PINSEL0&=p13_SEL_MASK;LPC_GPIO0->FIODIR|=p13_SET_MASK\n#define p13_AS_INPUT    LPC_GPIO0->FIOMASK &= p13_CLR_MASK; \n#define p13_SET         LPC_GPIO0->FIOSET = p13_SET_MASK\n#define p13_CLR         LPC_GPIO0->FIOCLR = p13_SET_MASK\n#define p13_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p13_SET_MASK)\n#define p13_IS_CLR      !(p13_IS_SET)\n#define p13_MODE(x)     LPC_PINCON->PINMODE0&=p13_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<30)\n\n/* p14 is P0.16 */\n#define p14_SEL_MASK    ~(3UL << 0)\n#define p14_SET_MASK    (1UL << 16)\n#define p14_CLR_MASK    ~(p14_SET_MASK)\n#define p14_AS_OUTPUT   LPC_PINCON->PINSEL1&=p14_SEL_MASK;LPC_GPIO0->FIODIR|=p14_SET_MASK\n#define p14_AS_INPUT    LPC_GPIO0->FIOMASK &= p14_CLR_MASK; \n#define p14_SET         LPC_GPIO0->FIOSET = p14_SET_MASK\n#define p14_CLR         LPC_GPIO0->FIOCLR = p14_SET_MASK\n#define p14_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p14_SET_MASK)\n#define p14_IS_CLR      !(p14_IS_SET)\n#define p14_MODE(x)     LPC_PINCON->PINMODE1&=p14_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<0)\n\n/* p15 is P0.23 */\n#define p15_SEL_MASK    ~(3UL << 14)\n#define p15_SET_MASK    (1UL << 23)\n#define p15_CLR_MASK    ~(p15_SET_MASK)\n#define p15_AS_OUTPUT   LPC_PINCON->PINSEL1&=p15_SEL_MASK;LPC_GPIO0->FIODIR|=p15_SET_MASK\n#define p15_AS_INPUT    LPC_GPIO0->FIOMASK &= p15_CLR_MASK; \n#define p15_SET         LPC_GPIO0->FIOSET = p15_SET_MASK\n#define p15_CLR         LPC_GPIO0->FIOCLR = p15_SET_MASK\n#define p15_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p15_SET_MASK)\n#define p15_IS_CLR      !(p15_IS_SET)\n#define p15_MODE(x)     LPC_PINCON->PINMODE1&=p15_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<14)\n\n/* p16 is P0.24 */\n#define p16_SEL_MASK    ~(3UL << 16)\n#define p16_SET_MASK    (1UL <<  24)\n#define p16_CLR_MASK    ~(p16_SET_MASK)\n#define p16_AS_OUTPUT   LPC_PINCON->PINSEL1&=p16_SEL_MASK;LPC_GPIO0->FIODIR|=p16_SET_MASK\n#define p16_AS_INPUT    LPC_GPIO0->FIOMASK &= p16_CLR_MASK; \n#define p16_SET         LPC_GPIO0->FIOSET = p16_SET_MASK\n#define p16_CLR         LPC_GPIO0->FIOCLR = p16_SET_MASK\n#define p16_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p16_SET_MASK)\n#define p16_IS_CLR      !(p16_IS_SET)\n#define p16_MODE(x)     LPC_PINCON->PINMODE1&=p16_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<16)\n\n/* p17 is P0.25 */\n#define p17_SEL_MASK    ~(3UL <<  18)\n#define p17_SET_MASK    (1UL <<  25)\n#define p17_CLR_MASK    ~(p17_SET_MASK)\n#define p17_AS_OUTPUT   LPC_PINCON->PINSEL1&=p17_SEL_MASK;LPC_GPIO0->FIODIR|=p17_SET_MASK\n#define p17_AS_INPUT    LPC_GPIO0->FIOMASK &= p17_CLR_MASK; \n#define p17_SET         LPC_GPIO0->FIOSET = p17_SET_MASK\n#define p17_CLR         LPC_GPIO0->FIOCLR = p17_SET_MASK\n#define p17_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p17_SET_MASK)\n#define p17_IS_CLR      !(p17_IS_SET)\n#define p17_MODE(x)     LPC_PINCON->PINMODE1&=p17_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<18)\n\n/* p18 is P0.26 */\n#define p18_SEL_MASK    ~(3UL << 20)\n#define p18_SET_MASK    (1UL << 26)\n#define p18_CLR_MASK    ~(p18_SET_MASK)\n#define p18_AS_OUTPUT   LPC_PINCON->PINSEL1&=p18_SEL_MASK;LPC_GPIO0->FIODIR|=p18_SET_MASK\n#define p18_AS_INPUT    LPC_GPIO0->FIOMASK &= p18_CLR_MASK; \n#define p18_SET         LPC_GPIO0->FIOSET = p18_SET_MASK\n#define p18_CLR         LPC_GPIO0->FIOCLR = p18_SET_MASK\n#define p18_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p18_SET_MASK)\n#define p18_IS_CLR      !(p18_IS_SET)\n#define p18_MODE(x)     LPC_PINCON->PINMODE1&=p18_SEL_MASK;LPC_PINCON->PINMODE1|=((x&0x3)<<20)\n\n/* p19 is P1.30 */\n#define p19_SEL_MASK    ~(3UL << 28)\n#define p19_SET_MASK    (1UL << 30)\n#define p19_AS_OUTPUT   LPC_PINCON->PINSEL3&=p19_SEL_MASK;LPC_GPIO1->FIODIR|=p19_SET_MASK\n#define p19_AS_INPUT    LPC_GPIO1->FIOMASK &= p19_CLR_MASK; \n#define p19_SET         LPC_GPIO1->FIOSET = p19_SET_MASK\n#define p19_CLR         LPC_GPIO1->FIOCLR = p19_SET_MASK\n#define p19_IS_SET      (bool)(LPC_GPIO1->FIOPIN & p19_SET_MASK)\n#define p19_IS_CLR      !(p19_IS_SET)\n#define p19_MODE(x)     LPC_PINCON->PINMODE3&=p19_SEL_MASK;LPC_PINCON->PINMODE3|=((x&0x3)<<28)\n\n/* p20 is P1.31 */\n#define p20_SEL_MASK    ~(3UL << 30)\n#define p20_SET_MASK    (1UL << 31)\n#define p20_CLR_MASK    ~(p20_SET_MASK)\n#define p20_AS_OUTPUT   LPC_PINCON->PINSEL3&=p20_SEL_MASK;LPC_GPIO1->FIODIR|=p20_SET_MASK\n#define p20_AS_INPUT    LPC_GPIO1->FIOMASK &= p20_CLR_MASK; \n#define p20_SET         LPC_GPIO1->FIOSET = p20_SET_MASK\n#define p20_CLR         LPC_GPIO1->FIOCLR = p20_SET_MASK\n#define p20_IS_SET      (bool)(LPC_GPIO1->FIOPIN & p20_SET_MASK)\n#define p20_IS_CLR      !(p20_IS_SET)\n#define p20_MODE(x)     LPC_PINCON->PINMODE3&=p20_SEL_MASK;LPC_PINCON->PINMODE3|=((x&0x3)<<30)\n\n/* p21 is P2.5 */\n#define p21_SEL_MASK    ~(3UL << 10)\n#define p21_SET_MASK    (1UL << 5)\n#define p21_CLR_MASK    ~(p21_SET_MASK)\n#define p21_AS_OUTPUT   LPC_PINCON->PINSEL4&=p21_SEL_MASK;LPC_GPIO2->FIODIR|=p21_SET_MASK\n#define p21_AS_INPUT    LPC_GPIO2->FIOMASK &= p21_CLR_MASK; \n#define p21_SET         LPC_GPIO2->FIOSET = p21_SET_MASK\n#define p21_CLR         LPC_GPIO2->FIOCLR = p21_SET_MASK\n#define p21_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p21_SET_MASK)\n#define p21_IS_CLR      !(p21_IS_SET)\n#define p21_TOGGLE      p21_IS_SET?p21_CLR:p21_SET\n#define p21_MODE(x)     LPC_PINCON->PINMODE4&=p21_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<10)\n\n/* p22 is P2.4 */\n#define p22_SEL_MASK    ~(3UL << 8)\n#define p22_SET_MASK    (1UL << 4)\n#define p22_CLR_MASK    ~(p22_SET_MASK)\n#define p22_AS_OUTPUT   LPC_PINCON->PINSEL4&=p22_SEL_MASK;LPC_GPIO2->FIODIR|=p22_SET_MASK\n#define p22_AS_INPUT    LPC_GPIO2->FIOMASK &= p22_CLR_MASK; \n#define p22_SET         LPC_GPIO2->FIOSET = p22_SET_MASK\n#define p22_CLR         LPC_GPIO2->FIOCLR = p22_SET_MASK\n#define p22_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p22_SET_MASK)\n#define p22_IS_CLR      !(p22_IS_SET)\n#define p22_TOGGLE      p22_IS_SET?p22_CLR:p22_SET\n#define p22_MODE(x)     LPC_PINCON->PINMODE4&=p22_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<8)\n\n/* p23 is P2.3 */\n#define p23_SEL_MASK    ~(3UL << 6)\n#define p23_SET_MASK    (1UL << 3)\n#define p23_CLR_MASK    ~(p23_SET_MASK)\n#define p23_AS_OUTPUT   LPC_PINCON->PINSEL4&=p23_SEL_MASK;LPC_GPIO2->FIODIR|=p23_SET_MASK\n#define p23_AS_INPUT    LPC_GPIO2->FIOMASK &= p23_CLR_MASK; \n#define p23_SET         LPC_GPIO2->FIOSET = p23_SET_MASK\n#define p23_CLR         LPC_GPIO2->FIOCLR = p23_SET_MASK\n#define p23_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p23_SET_MASK)\n#define p23_IS_CLR      !(p23_IS_SET)\n#define p23_TOGGLE      p23_IS_SET?p23_CLR:p23_SET\n#define p23_MODE(x)     LPC_PINCON->PINMODE4&=p23_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<6)\n\n/* p24 is P2.2 */\n#define p24_SEL_MASK    ~(3UL << 4)\n#define p24_SET_MASK    (1UL << 2)\n#define p24_CLR_MASK    ~(p24_SET_MASK)\n#define p24_AS_OUTPUT   LPC_PINCON->PINSEL4&=p24_SEL_MASK;LPC_GPIO2->FIODIR|=p24_SET_MASK\n#define p24_AS_INPUT    LPC_GPIO2->FIOMASK &= p24_CLR_MASK; \n#define p24_SET         LPC_GPIO2->FIOSET = p24_SET_MASK\n#define p24_CLR         LPC_GPIO2->FIOCLR = p24_SET_MASK\n#define p24_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p24_SET_MASK)\n#define p24_IS_CLR      !(p24_IS_SET)\n#define p24_TOGGLE      p24_IS_SET?p24_CLR:p24_SET\n#define p24_MODE(x)     LPC_PINCON->PINMODE4&=p24_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<4)\n\n/* p25 is P2.1 */\n#define p25_SEL_MASK    ~(3UL << 2)\n#define p25_SET_MASK    (1UL << 1)\n#define p25_CLR_MASK    ~(p25_SET_MASK)\n#define p25_AS_OUTPUT   LPC_PINCON->PINSEL4&=p25_SEL_MASK;LPC_GPIO2->FIODIR|=p25_SET_MASK\n#define p25_AS_INPUT    LPC_GPIO2->FIOMASK &= p25_CLR_MASK; \n#define p25_SET         LPC_GPIO2->FIOSET = p25_SET_MASK\n#define p25_CLR         LPC_GPIO2->FIOCLR = p25_SET_MASK\n#define p25_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p25_SET_MASK)\n#define p25_IS_CLR      !(p25_IS_SET)\n#define p25_MODE(x)     LPC_PINCON->PINMODE4&=p25_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<2)\n\n/* p26 is P2.0 */\n#define p26_SEL_MASK    ~(3UL << 0)\n#define p26_SET_MASK    (1UL << 0)\n#define p26_CLR_MASK    ~(p26_SET_MASK)\n#define p26_AS_OUTPUT   LPC_PINCON->PINSEL4&=p26_SEL_MASK;LPC_GPIO2->FIODIR|=p26_SET_MASK\n#define p26_AS_INPUT    LPC_GPIO2->FIOMASK &= p26_CLR_MASK; \n#define p26_SET         LPC_GPIO2->FIOSET = p26_SET_MASK\n#define p26_CLR         LPC_GPIO2->FIOCLR = p26_SET_MASK\n#define p26_IS_SET      (bool)(LPC_GPIO2->FIOPIN & p26_SET_MASK)\n#define p26_IS_CLR      !(p26_IS_SET)\n#define p26_MODE(x)     LPC_PINCON->PINMODE4&=p26_SEL_MASK;LPC_PINCON->PINMODE4|=((x&0x3)<<0)\n\n/* p27 is P0.11 */\n#define p27_SEL_MASK    ~(3UL << 22)\n#define p27_SET_MASK    (1UL << 11)\n#define p27_CLR_MASK    ~(p27_SET_MASK)\n#define p27_AS_OUTPUT   LPC_PINCON->PINSEL0&=p27_SEL_MASK;LPC_GPIO0->FIODIR|=p27_SET_MASK\n#define p27_AS_INPUT    LPC_GPIO0->FIOMASK &= p27_CLR_MASK; \n#define p27_SET         LPC_GPIO0->FIOSET = p27_SET_MASK\n#define p27_CLR         LPC_GPIO0->FIOCLR = p27_SET_MASK\n#define p27_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p27_SET_MASK)\n#define p27_IS_CLR      !(p27_IS_SET)\n#define p27_MODE(x)     LPC_PINCON->PINMODE0&=p27_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<22)\n\n/* p28 is P0.10 */\n#define p28_SEL_MASK    ~(3UL << 20)\n#define p28_SET_MASK    (1UL <<  10)\n#define p28_CLR_MASK    ~(p28_SET_MASK)\n#define p28_AS_OUTPUT   LPC_PINCON->PINSEL0&=p28_SEL_MASK;LPC_GPIO0->FIODIR|=p28_SET_MASK\n#define p28_AS_INPUT    LPC_GPIO0->FIOMASK &= p28_CLR_MASK; \n#define p28_SET         LPC_GPIO0->FIOSET = p28_SET_MASK\n#define p28_CLR         LPC_GPIO0->FIOCLR = p28_SET_MASK\n#define p28_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p28_SET_MASK)\n#define p28_IS_CLR      !(p28_IS_SET)\n#define p28_MODE(x)     LPC_PINCON->PINMODE0&=p28_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<20)\n\n/* p29 is P0.5 */\n#define p29_SEL_MASK    ~(3UL << 10)\n#define p29_SET_MASK    (1UL << 5)\n#define p29_CLR_MASK    ~(p29_SET_MASK)\n#define p29_AS_OUTPUT   LPC_PINCON->PINSEL0&=p29_SEL_MASK;LPC_GPIO0->FIODIR|=p29_SET_MASK\n#define p29_AS_INPUT    LPC_GPIO0->FIOMASK &= p29_CLR_MASK; \n#define p29_SET         LPC_GPIO0->FIOSET = p29_SET_MASK\n#define p29_CLR         LPC_GPIO0->FIOCLR = p29_SET_MASK\n#define p29_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p29_SET_MASK)\n#define p29_IS_CLR      !(p29_IS_SET)\n#define p29_TOGGLE      p29_IS_SET?p29_CLR:p29_SET\n#define p29_MODE(x)     LPC_PINCON->PINMODE0&=p29_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<10)\n\n/* p30 is P0.4 */\n#define p30_SEL_MASK    ~(3UL << 8)\n#define p30_SET_MASK    (1UL << 4)\n#define p30_CLR_MASK    ~(p30_SET_MASK)\n#define p30_AS_OUTPUT   LPC_PINCON->PINSEL0&=p30_SEL_MASK;LPC_GPIO0->FIODIR|=p30_SET_MASK\n#define p30_AS_INPUT    LPC_GPIO0->FIOMASK &= p30_CLR_MASK; \n#define p30_SET         LPC_GPIO0->FIOSET = p30_SET_MASK\n#define p30_CLR         LPC_GPIO0->FIOCLR = p30_SET_MASK\n#define p30_IS_SET      (bool)(LPC_GPIO0->FIOPIN & p30_SET_MASK)\n#define p30_IS_CLR      !(p30_IS_SET)\n#define p30_MODE(x)     LPC_PINCON->PINMODE0&=p30_SEL_MASK;LPC_PINCON->PINMODE0|=((x&0x3)<<8)\n\n/* The following definitions are for the four Mbed LEDs.\n    LED1 = P1.18\n    LED2 = P1.20\n    LED3 = P1.21\n    LED4 = P1.23 */\n\n#define P1_18_SEL_MASK  ~(3UL << 4)\n#define P1_18_SET_MASK  (1UL << 18)\n#define P1_18_CLR_MASK  ~(P1_18_SET_MASK)\n#define P1_18_AS_OUTPUT LPC_PINCON->PINSEL3&=P1_18_SEL_MASK;LPC_GPIO1->FIODIR|=P1_18_SET_MASK\n#define P1_18_AS_INPUT  LPC_GPIO1->FIOMASK &= P1_18_CLR_MASK; \n#define P1_18_SET       LPC_GPIO1->FIOSET = P1_18_SET_MASK\n#define P1_18_CLR       LPC_GPIO1->FIOCLR = P1_18_SET_MASK\n#define P1_18_IS_SET    (bool)(LPC_GPIO1->FIOPIN & P1_18_SET_MASK)\n#define P1_18_IS_CLR    !(P1_18_IS_SET)\n#define LED1_USE        P1_18_AS_OUTPUT;P1_18_AS_INPUT\n#define LED1_ON         P1_18_SET\n#define LED1_OFF        P1_18_CLR\n#define LED1_IS_ON      P1_18_IS_SET\n#define LED1_TOGGLE     P1_18_IS_SET?LED1_OFF:LED1_ON\n\n#define P1_20_SEL_MASK  ~(3UL << 8)\n#define P1_20_SET_MASK  (1UL << 20)\n#define P1_20_CLR_MASK  ~(P1_20_SET_MASK)\n#define P1_20_AS_OUTPUT LPC_PINCON->PINSEL3&=P1_20_SEL_MASK;LPC_GPIO1->FIODIR|=P1_20_SET_MASK\n#define P1_20_AS_INPUT  LPC_GPIO1->FIOMASK &= P1_20_CLR_MASK; \n#define P1_20_SET       LPC_GPIO1->FIOSET = P1_20_SET_MASK\n#define P1_20_CLR       LPC_GPIO1->FIOCLR = P1_20_SET_MASK\n#define P1_20_IS_SET    (bool)(LPC_GPIO1->FIOPIN & P1_20_SET_MASK)\n#define P1_20_IS_CLR    !(P1_20_IS_SET)    \n#define LED2_USE        P1_20_AS_OUTPUT;P1_20_AS_INPUT\n#define LED2_ON         P1_20_SET\n#define LED2_OFF        P1_20_CLR\n#define LED2_IS_ON      P1_20_IS_SET\n#define LED2_TOGGLE     P1_20_IS_SET?LED2_OFF:LED2_ON\n\n#define P1_21_SEL_MASK  ~(3UL << 10)\n#define P1_21_SET_MASK  (1UL << 21)\n#define P1_21_CLR_MASK  ~(P1_21_SET_MASK)\n#define P1_21_AS_OUTPUT LPC_PINCON->PINSEL3&=P1_21_SEL_MASK;LPC_GPIO1->FIODIR|=P1_21_SET_MASK\n#define P1_21_AS_INPUT  LPC_GPIO1->FIOMASK &= P1_21_CLR_MASK; \n#define P1_21_SET       LPC_GPIO1->FIOSET = P1_21_SET_MASK\n#define P1_21_CLR       LPC_GPIO1->FIOCLR = P1_21_SET_MASK\n#define P1_21_IS_SET    (bool)(LPC_GPIO1->FIOPIN & P1_21_SET_MASK)\n#define P1_21_IS_CLR    !(P1_21_IS_SET)\n#define LED3_USE        P1_21_AS_OUTPUT;P1_21_AS_INPUT\n#define LED3_ON         P1_21_SET\n#define LED3_OFF        P1_21_CLR\n#define LED3_IS_ON      P1_21_IS_SET\n#define LED3_TOGGLE     P1_21_IS_SET?LED3_OFF:LED3_ON\n\n#define P1_23_SEL_MASK  ~(3UL << 14)\n#define P1_23_SET_MASK  (1UL << 23)\n#define P1_23_CLR_MASK  ~(P1_23_SET_MASK)\n#define P1_23_AS_OUTPUT LPC_PINCON->PINSEL3&=P1_23_SEL_MASK;LPC_GPIO1->FIODIR|=P1_23_SET_MASK\n#define P1_23_AS_INPUT  LPC_GPIO1->FIOMASK &= P1_23_CLR_MASK; \n#define P1_23_SET       LPC_GPIO1->FIOSET = P1_23_SET_MASK\n#define P1_23_CLR       LPC_GPIO1->FIOCLR = P1_23_SET_MASK\n#define P1_23_IS_SET    (bool)(LPC_GPIO1->FIOPIN & P1_23_SET_MASK)\n#define P1_23_IS_CLR    !(P1_23_IS_SET)    \n#define LED4_USE        P1_23_AS_OUTPUT;P1_23_AS_INPUT\n#define LED4_ON         P1_23_SET\n#define LED4_OFF        P1_23_CLR\n#define LED4_IS_ON      P1_23_IS_SET\n#define LED4_TOGGLE     P1_23_IS_SET?LED4_OFF:LED4_ON\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/MODDMA.lib",
    "content": "https://os.mbed.com/users/AjK/code/MODDMA/#97a16bf2ff439853ed01edd65a382207e203c733"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiSlave(MOSI0, MISO0, SCK0, SSEL0)\n{\n    spiSlave.frequency(48000000);\n}\n\nvoid RemoraComms::init()\n{\n    // Create MODDMA configuration objects for the SPI transfer and memory copy\n    spiDMAmemcpy1 = new MODDMA_Config;\n    spiDMAmemcpy2 = new MODDMA_Config;\n    spiDMAtx1 = new MODDMA_Config;\n    spiDMAtx2 = new MODDMA_Config;\n    spiDMArx1 = new MODDMA_Config;\n    spiDMArx2 = new MODDMA_Config;\n\n   // Setup DMA configurations\n    spiDMAtx1\n        ->channelNum    ( MODDMA::Channel_0 )\n        ->srcMemAddr    ( (uint32_t) ptrTxData )\n        ->dstMemAddr    ( 0 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2p )\n        ->srcConn       ( 0 )\n        ->dstConn       ( MODDMA::SSP0_Tx )\n        ->attach_tc     ( this, &RemoraComms::tc0_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMAtx2\n        ->channelNum    ( MODDMA::Channel_1 )\n        ->srcMemAddr    ( (uint32_t) ptrTxData )\n        ->dstMemAddr    ( 0 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2p )\n        ->srcConn       ( 0 )\n        ->dstConn       ( MODDMA::SSP0_Tx )\n        ->attach_tc     ( this, &RemoraComms::tc1_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMArx1\n        ->channelNum    ( MODDMA::Channel_2 )\n        ->srcMemAddr    ( 0 )\n        ->dstMemAddr    ( (uint32_t) &spiRxBuffer1 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::p2m )\n        ->srcConn       ( MODDMA::SSP0_Rx )\n        ->dstConn       ( 0 )\n        ->attach_tc     ( this, &RemoraComms::tc2_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMArx2\n        ->channelNum    ( MODDMA::Channel_3 )\n        ->srcMemAddr    ( 0 )\n        ->dstMemAddr    ( (uint32_t) &spiRxBuffer2 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::p2m )\n        ->srcConn       ( MODDMA::SSP0_Rx )\n        ->dstConn       ( 0 )\n        ->attach_tc     ( this, &RemoraComms::tc3_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMAmemcpy1\n        ->channelNum    ( MODDMA::Channel_4 )\n        ->srcMemAddr    ( (uint32_t) &spiRxBuffer1 )\n        ->dstMemAddr    ( (uint32_t) &rxData )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2m )\n    ;\n\n    spiDMAmemcpy2\n        ->channelNum    ( MODDMA::Channel_5 )\n        ->srcMemAddr    ( (uint32_t) &spiRxBuffer2 )\n        ->dstMemAddr    ( (uint32_t) &rxData )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2m )\n    ;\n}\n\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n\n    // Pass the configurations to the controller\n    dma.Prepare( spiDMArx1 );\n    dma.Prepare( spiDMAtx1 );\n\n    // Enable SSP0 for DMA\n    LPC_SSP0->DMACR = 0;\n    LPC_SSP0->DMACR = (1<<1)|(1<<0); // TX,RX DMA Enable\n}\n\n\nvoid RemoraComms::tc0_callback()\n{\n    // SPI Tx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    dma.Prepare( spiDMAtx2 );\n}\n\nvoid RemoraComms::tc1_callback()\n{\n    // SPI Tx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    dma.Prepare( spiDMAtx1 );\n}\n\nvoid RemoraComms::tc2_callback()\n{\n    // SPI Rx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    SPIdata = false;\n    SPIdataError = false;\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    // Check and move the recieved SPI data payload\n    switch (spiRxBuffer1.header)\n    {\n      case PRU_READ:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Disable( spiDMAmemcpy2->channelNum()  );\n        break;\n\n      case PRU_WRITE:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Prepare( spiDMAmemcpy1 );\n        break;\n\n      default:\n        rejectCnt++;\n        if (rejectCnt > 5)\n        {\n            SPIdataError = true;\n        }\n        dma.Disable( spiDMAmemcpy2->channelNum()  );\n    }\n\n    // swap Rx buffers\n    dma.Prepare( spiDMArx2 );\n}\n\nvoid RemoraComms::tc3_callback()\n{\n    // SPI Rx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    SPIdata = false;\n    SPIdataError = false;\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    // Check and move the recieved SPI data payload\n    switch (spiRxBuffer2.header)\n    {\n      case PRU_READ:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Disable( spiDMAmemcpy1->channelNum()  );\n        break;\n\n      case PRU_WRITE:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Prepare( spiDMAmemcpy2 );\n        break;\n\n      default:\n        rejectCnt++;\n        if (rejectCnt > 5)\n        {\n            SPIdataError = true;\n        }\n        dma.Disable( spiDMAmemcpy1->channelNum()  );\n    }\n\n    // swap Rx buffers\n    dma.Prepare( spiDMArx1 );\n}\n\nvoid RemoraComms::err_callback()\n{\n    printf(\"err\\r\\n\");\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->SPIdata;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->SPIdata = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n#include \"MODDMA.h\"\n\n// RPi SPI\n#define MOSI0               P0_18\n#define MISO0               P0_17\n#define SCK0                P0_15\n#define SSEL0               P0_16\n\nclass RemoraComms\n{\n    private:\n\n        SPISlave            spiSlave;\n\n        MODDMA              dma;\n\n        MODDMA_Config*      spiDMArx1;\n        MODDMA_Config*      spiDMArx2;\n        MODDMA_Config*      spiDMAtx1;\n        MODDMA_Config*      spiDMAtx2;\n        MODDMA_Config*      spiDMAmemcpy1;\n        MODDMA_Config*      spiDMAmemcpy2;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer1;\n        rxData_t            spiRxBuffer2;\n        uint8_t             rejectCnt;\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*);\n\n        void tc0_callback(void);\n        void tc1_callback(void);\n        void tc2_callback(void);\n        void tc3_callback(void);\n        void err_callback(void);\n\n        void init(void);\n        void start(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"LPC17xx.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    this->configPin();\n\n    if (this->dir == 0) //input\n    {\n        switch(this->modifier)\n        {\n            case OPENDRAIN:\n                printf(\"  Setting pin as open drain\\n\");\n                this->as_open_drain();\n                break;\n            case PULLUP:\n                printf(\"  Setting pin as pull_up\\n\");\n                this->pull_up();\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as pull_down\\n\");\n                this->pull_down();\n                break;\n            case PULLNONE:\n                printf(\"  Setting pin as pull_none\\n\");\n                this->pull_none();\n                break;\n        }\n    }\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    LPC_GPIO_TypeDef* gpios[5] ={LPC_GPIO0,LPC_GPIO1,LPC_GPIO2,LPC_GPIO3,LPC_GPIO4};\n\n    // The method below to determine the port and pin from the string is taken from Smoothieware, thanks!\n\n    // cs is the current position in the string\n    const char* cs = this->portAndPin.c_str();\n\n    // cn is the position of the next char after the number we just read\n    char* cn = NULL;\n\n    // grab first integer as port. pointer to first non-digit goes in cn\n    this->portNumber = std::strtol(cs, &cn, 10);\n\n    printf(\"  portNumber = %d\\n\", this->portNumber);\n\n    // if cn > cs then strtol read at least one digit\n    if ((cn > cs) && (this->portNumber <= 4))\n    {\n        // translate port index into something useful\n        this->port = gpios[this->portNumber];\n\n        // if the char after the first integer is a . then we should expect a pin index next\n        if (*cn == '.')\n        {\n            // move pointer to first digit (hopefully) of pin index\n            cs = ++cn;\n\n            // grab pin index.\n            this->pin = strtol(cs, &cn, 10);\n\n            printf(\"  pin = %d\\n\", this->pin);\n\n            // if strtol read some numbers, cn will point to the first non-digit\n            if ((cn > cs) && (this->pin < 32) && (this->dir >= 0))\n            {\n                // configure pin direction: FIODIR\n                if (dir == INPUT)\n                {\n                    this->port->FIODIR &= ~(1<<this->pin);\n                }\n                else\n                {\n                    this->port->FIODIR |= 1<<this->pin;\n                }\n\n                // configure\n                this->port->FIOMASK &= ~(1 << this->pin);\n            }\n        }\n    }\n}\n\nvoid Pin::setAsOutput()\n{\n    this->port->FIODIR |= 1<<this->pin;\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->port->FIODIR &= ~(1<<this->pin);\n}\n\n// Configure this pin as OD\nvoid Pin::as_open_drain(){\n    if( this->portNumber == 0 ){ LPC_PINCON->PINMODE_OD0 |= (1<<this->pin); }\n    if( this->portNumber == 1 ){ LPC_PINCON->PINMODE_OD1 |= (1<<this->pin); }\n    if( this->portNumber == 2 ){ LPC_PINCON->PINMODE_OD2 |= (1<<this->pin); }\n    if( this->portNumber == 3 ){ LPC_PINCON->PINMODE_OD3 |= (1<<this->pin); }\n    if( this->portNumber == 4 ){ LPC_PINCON->PINMODE_OD4 |= (1<<this->pin); }\n    pull_none(); // no pull up by default\n}\n\n// Configure this pin as no pullup or pulldown\nvoid Pin::pull_none()\n{\n    // Set the two bits for this pin as 10\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE0 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE1 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE2 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE3 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE4 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE7 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE9 &= ~(1<<((this->pin-16)*2)); }\n}\n\n// Configure this pin as a pullup\nvoid Pin::pull_up()\n{\n    // Set the two bits for this pin as 00\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 &= ~(3<<((this->pin-16)*2)); }\n}\n\n// Configure this pin as a pulldown\nvoid Pin::pull_down()\n{\n    // Set the two bits for this pin as 11\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 |= (3<<((this->pin-16)*2)); }\n}\n\n// Convert a PortAndPin into a mBed Pin\n// allows use of standard mbed libraries, eg FastAnalogIn\nPinName Pin::pinToPinName()\n{\n  if( this->port == LPC_GPIO0 && this->pin == 0 ) {\n      return p9;\n  } else if( this->port == LPC_GPIO0 && this->pin == 1 ) {\n      return p10;\n  } else if( this->port == LPC_GPIO0 && this->pin == 23 ) {\n      return p15;\n  } else if( this->port == LPC_GPIO0 && this->pin == 24 ) {\n      return p16;\n  } else if( this->port == LPC_GPIO0 && this->pin == 25 ) {\n      return p17;\n  } else if( this->port == LPC_GPIO0 && this->pin == 26 ) {\n      return p18;\n  } else if( this->port == LPC_GPIO1 && this->pin == 30 ) {\n      return p19;\n  } else if( this->port == LPC_GPIO1 && this->pin == 31 ) {\n      return p20;\n  } else {\n      //TODO: Error\n      return NC;\n  }\n}\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portNumber == 1)\n    {\n        if (this->pin == 18) { return new mbed::PwmOut(P1_18); }\n        if (this->pin == 20) { return new mbed::PwmOut(P1_20); }\n        if (this->pin == 21) { return new mbed::PwmOut(P1_21); }\n        if (this->pin == 23) { return new mbed::PwmOut(P1_23); }\n        if (this->pin == 24) { return new mbed::PwmOut(P1_24); }\n        if (this->pin == 26) { return new mbed::PwmOut(P1_26); }\n    }\n    else if (this->portNumber == 2)\n    {\n        if (this->pin == 0) { return new mbed::PwmOut(P2_0); }\n        if (this->pin == 1) { return new mbed::PwmOut(P2_1); }\n        if (this->pin == 2) { return new mbed::PwmOut(P2_2); }\n        if (this->pin == 3) { return new mbed::PwmOut(P2_3); }\n        if (this->pin == 4) { return new mbed::PwmOut(P2_4); }\n        if (this->pin == 5) { return new mbed::PwmOut(P2_5); }\n    }\n    else if (this->portNumber == 3)\n    {\n        if (this->pin == 25) { return new mbed::PwmOut(P3_25); }\n        if (this->pin == 26) { return new mbed::PwmOut(P3_26); }\n    }\n    return nullptr;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"LPC17xx.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portNumber;\n        uint8_t             pin;\n        LPC_GPIO_TypeDef*   port;\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void setAsOutput();\n        void setAsInput();\n        void as_open_drain();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return ((this->port->FIOPIN >> this->pin ) & 1);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n                this->port->FIOSET = 1 << this->pin;\n            else\n                this->port->FIOCLR = 1 << this->pin;\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n#include \"interrupt.h\"\n#include \"qeiInterrupt.h\"\n\nQEIdriver::QEIdriver()\n{\n    this->hasIndex = false;\n\n    this->dirinv = 0;\n    this->sigmode = 0;  // quadrature inputs\n    this->capmode = 1;  // count channels A and B (4x mode)\n    this->invinx = 0;\n\n    this->init();\n}\n\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex)\n{\n    this->hasIndex = true;\n\n    this->dirinv = 0;\n    this->sigmode = 0;  // quadrature inputs\n    this->capmode = 1;  // count channels A and B (4x mode)\n    this->invinx = 0;\n\n    this->irq = QEI_IRQn;\n\n    this->init();\n\n    interruptPtr = new qeiInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\n\nvoid QEIdriver::interruptHandler()\n{\n    this->indexDetected = true;\n    this->indexCount = this->get();\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return (LPC_QEI->QEIPOS);\n}\n\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n\n    /* Set up clock and power for QEI module */\n    LPC_SC->PCONP |= PCONP_QEI_ENABLE;\n\n    /* The clock for theQEI module is set to FCCLK  */\n    LPC_SC->PCLKSEL1 = LPC_SC->PCLKSEL1 & ~(3UL<<0) | ((PCLKSEL_CCLK_DIV_1 & 3)<<0); \n\n    /* Assign the pins. They are hard-coded, not user-selected. */\n    // MCI0 (PhA)\n    LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI0_MASK) | PINSEL3_MCI0 ;\n    LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI0_MASK) | PINMODE3_MCI0;\n\n    // MCI1 (PhB)\n    LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI1_MASK) | PINSEL3_MCI1 ;\n    LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI1_MASK) | PINMODE3_MCI1;\n\n    // MCI2 (Index)\n    if (hasIndex)\n    {\n        LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI2_MASK) | PINSEL3_MCI2 ;\n        LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI2_MASK) | PINMODE3_MCI2;\n    }\n\n    // Initialize all remaining values in QEI peripheral\n    LPC_QEI->QEICON = QEI_CON_RESP | QEI_CON_RESV | QEI_CON_RESI;\n    LPC_QEI->QEIMAXPOS = 0xFFFFFFFF;                          // Default value\n    LPC_QEI->CMPOS0 = 0x00;\n    LPC_QEI->CMPOS1 = 0x00;\n    LPC_QEI->CMPOS2 = 0x00;\n    LPC_QEI->INXCMP = 0x00;\n    LPC_QEI->QEILOAD = 0x00;\n    LPC_QEI->VELCOMP = 0x00;\n    LPC_QEI->FILTER = 200000;       // Default for mechanical switches.\n\n    // Set QEI configuration value corresponding to the call parameters\n    LPC_QEI->QEICONF = (\n        ((dirinv << 0) & 1) | \\\n        ((sigmode << 1) & 2) | \\\n        ((capmode << 2) & 4) | \\\n        ((invinx <<3) & 8) );\n       \n    // Mask all int sources   \n    LPC_QEI->QEIIEC = QEI_IECLR_BITMASK;    // Set the \"clear\" bits for all sources in the IE clear register              \n\n    // Clear any pending ints    \n    LPC_QEI->QEICLR = QEI_INTCLR_BITMASK;   // Set the \"clear\" bits for for all sources in the Interrupt clear register\n\n    // Enable specified interrupt on QEI peropheral\n    LPC_QEI->QEIIES = QEI_INTSTAT_INX_Int;\n\n    // set digital filter\n    LPC_QEI->FILTER = 480UL;\n    \n    // set max position\n    LPC_QEI->QEIMAXPOS = 0xFFFFFFFF;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\nclass qeiInterrupt; // forward declatation\n\nclass QEIdriver\n{\n    \tfriend class    qeiInterrupt;\n    \n    private:\n\n        qeiInterrupt* \tinterruptPtr;\n        IRQn_Type \t\tirq;\n\n        int             dirinv;                 // Direction invert. When = 1, complements the QEICONF register DIR bit\n        int             sigmode;                // Signal mode. When = 0, PhA and PhB are quadrature inputs. When = 1, PhA is direction and PhB is clock\n        int             capmode;                // Capture mode. When = 0, count PhA edges only (2X mode). Whe = 1, count PhB edges also (4X mode)\n        int             invinx;                 // Invert index. When = 1, inverts the sense of the index signal\n\n        void interruptHandler();\n\n    public:\n\n        bool             hasIndex;\n        bool             indexDetected;\n        int32_t          indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n\n\n/* Private Macros ------------------------------------------------------------- */\n/* --------------------- BIT DEFINITIONS -------------------------------------- */\n/* Quadrature Encoder Interface Control Register Definition --------------------- */\n/*********************************************************************//**\n * Macro defines for QEI Control register\n **********************************************************************/\n#define QEI_CON_RESP        ((uint32_t)(1<<0))        /**< Reset position counter */\n#define QEI_CON_RESPI        ((uint32_t)(1<<1))        /**< Reset Posistion Counter on Index */\n#define QEI_CON_RESV        ((uint32_t)(1<<2))        /**< Reset Velocity */\n#define QEI_CON_RESI        ((uint32_t)(1<<3))        /**< Reset Index Counter */\n#define QEI_CON_BITMASK        ((uint32_t)(0x0F))        /**< QEI Control register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Configuration register\n **********************************************************************/\n#define QEI_CONF_DIRINV        ((uint32_t)(1<<0))        /**< Direction Invert */\n#define QEI_CONF_SIGMODE    ((uint32_t)(1<<1))        /**< Signal mode */\n#define QEI_CONF_CAPMODE    ((uint32_t)(1<<2))        /**< Capture mode */\n#define QEI_CONF_INVINX        ((uint32_t)(1<<3))        /**< Invert index */\n#define QEI_CONF_BITMASK    ((uint32_t)(0x0F))        /**< QEI Configuration register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Status register\n **********************************************************************/\n#define QEI_STAT_DIR        ((uint32_t)(1<<0))        /**< Direction bit */\n#define QEI_STAT_BITMASK    ((uint32_t)(1<<0))        /**< QEI status register bit-mask */\n\n/* Quadrature Encoder Interface Interrupt registers definitions --------------------- */\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Status register\n **********************************************************************/\n#define QEI_INTSTAT_INX_Int            ((uint32_t)(1<<0))    /**< Indicates that an index pulse was detected */\n#define QEI_INTSTAT_TIM_Int            ((uint32_t)(1<<1))    /**< Indicates that a velocity timer overflow occurred */\n#define QEI_INTSTAT_VELC_Int        ((uint32_t)(1<<2))    /**< Indicates that capture velocity is less than compare velocity */\n#define QEI_INTSTAT_DIR_Int            ((uint32_t)(1<<3))    /**< Indicates that a change of direction was detected */\n#define QEI_INTSTAT_ERR_Int            ((uint32_t)(1<<4))    /**< Indicates that an encoder phase error was detected */\n#define QEI_INTSTAT_ENCLK_Int        ((uint32_t)(1<<5))    /**< Indicates that and encoder clock pulse was detected */\n#define QEI_INTSTAT_POS0_Int        ((uint32_t)(1<<6))    /**< Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_POS1_Int        ((uint32_t)(1<<7))    /**< Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_POS2_Int        ((uint32_t)(1<<8))    /**< Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_REV_Int            ((uint32_t)(1<<9))    /**< Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTSTAT_POS0REV_Int        ((uint32_t)(1<<10))    /**< Combined position 0 and revolution count interrupt. Set when\n                                                        both the POS0_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_POS1REV_Int        ((uint32_t)(1<<11))    /**< Combined position 1 and revolution count interrupt. Set when\n                                                        both the POS1_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_POS2REV_Int        ((uint32_t)(1<<12))    /**< Combined position 2 and revolution count interrupt. Set when\n                                                        both the POS2_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Status register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Set register\n **********************************************************************/\n#define QEI_INTSET_INX_Int            ((uint32_t)(1<<0))    /**< Set Bit Indicates that an index pulse was detected */\n#define QEI_INTSET_TIM_Int            ((uint32_t)(1<<1))    /**< Set Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTSET_VELC_Int            ((uint32_t)(1<<2))    /**< Set Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTSET_DIR_Int            ((uint32_t)(1<<3))    /**< Set Bit Indicates that a change of direction was detected */\n#define QEI_INTSET_ERR_Int            ((uint32_t)(1<<4))    /**< Set Bit Indicates that an encoder phase error was detected */\n#define QEI_INTSET_ENCLK_Int        ((uint32_t)(1<<5))    /**< Set Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTSET_POS0_Int            ((uint32_t)(1<<6))    /**< Set Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_POS1_Int            ((uint32_t)(1<<7))    /**< Set Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_POS2_Int            ((uint32_t)(1<<8))    /**< Set Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_REV_Int            ((uint32_t)(1<<9))    /**< Set Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTSET_POS0REV_Int        ((uint32_t)(1<<10))    /**< Set Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTSET_POS1REV_Int        ((uint32_t)(1<<11))    /**< Set Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTSET_POS2REV_Int        ((uint32_t)(1<<12))    /**< Set Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTSET_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Set register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Clear register\n **********************************************************************/\n#define QEI_INTCLR_INX_Int            ((uint32_t)(1<<0))    /**< Clear Bit Indicates that an index pulse was detected */\n#define QEI_INTCLR_TIM_Int            ((uint32_t)(1<<1))    /**< Clear Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTCLR_VELC_Int            ((uint32_t)(1<<2))    /**< Clear Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTCLR_DIR_Int            ((uint32_t)(1<<3))    /**< Clear Bit Indicates that a change of direction was detected */\n#define QEI_INTCLR_ERR_Int            ((uint32_t)(1<<4))    /**< Clear Bit Indicates that an encoder phase error was detected */\n#define QEI_INTCLR_ENCLK_Int        ((uint32_t)(1<<5))    /**< Clear Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTCLR_POS0_Int            ((uint32_t)(1<<6))    /**< Clear Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_POS1_Int            ((uint32_t)(1<<7))    /**< Clear Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_POS2_Int            ((uint32_t)(1<<8))    /**< Clear Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_REV_Int            ((uint32_t)(1<<9))    /**< Clear Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTCLR_POS0REV_Int        ((uint32_t)(1<<10))    /**< Clear Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTCLR_POS1REV_Int        ((uint32_t)(1<<11))    /**< Clear Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTCLR_POS2REV_Int        ((uint32_t)(1<<12))    /**< Clear Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTCLR_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Clear register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable register\n **********************************************************************/\n#define QEI_INTEN_INX_Int            ((uint32_t)(1<<0))    /**< Enabled Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_INTEN_TIM_Int            ((uint32_t)(1<<1))    /**< Enabled Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTEN_VELC_Int            ((uint32_t)(1<<2))    /**< Enabled Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTEN_DIR_Int            ((uint32_t)(1<<3))    /**< Enabled Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_INTEN_ERR_Int            ((uint32_t)(1<<4))    /**< Enabled Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_INTEN_ENCLK_Int            ((uint32_t)(1<<5))    /**< Enabled Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTEN_POS0_Int            ((uint32_t)(1<<6))    /**< Enabled Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_POS1_Int            ((uint32_t)(1<<7))    /**< Enabled Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_POS2_Int            ((uint32_t)(1<<8))    /**< Enabled Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_REV_Int            ((uint32_t)(1<<9))    /**< Enabled Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTEN_POS0REV_Int        ((uint32_t)(1<<10))    /**< Enabled Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTEN_POS1REV_Int        ((uint32_t)(1<<11))    /**< Enabled Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTEN_POS2REV_Int        ((uint32_t)(1<<12))    /**< Enabled Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTEN_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable Set register\n **********************************************************************/\n#define QEI_IESET_INX_Int            ((uint32_t)(1<<0))    /**< Set Enable Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_IESET_TIM_Int            ((uint32_t)(1<<1))    /**< Set Enable Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_IESET_VELC_Int            ((uint32_t)(1<<2))    /**< Set Enable Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_IESET_DIR_Int            ((uint32_t)(1<<3))    /**< Set Enable Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_IESET_ERR_Int            ((uint32_t)(1<<4))    /**< Set Enable Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_IESET_ENCLK_Int            ((uint32_t)(1<<5))    /**< Set Enable Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_IESET_POS0_Int            ((uint32_t)(1<<6))    /**< Set Enable Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_IESET_POS1_Int            ((uint32_t)(1<<7))    /**< Set Enable Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_IESET_POS2_Int            ((uint32_t)(1<<8))    /**< Set Enable Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_IESET_REV_Int            ((uint32_t)(1<<9))    /**< Set Enable Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_IESET_POS0REV_Int        ((uint32_t)(1<<10))    /**< Set Enable Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_IESET_POS1REV_Int        ((uint32_t)(1<<11))    /**< Set Enable Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_IESET_POS2REV_Int        ((uint32_t)(1<<12))    /**< Set Enable Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_IESET_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable Set register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable Clear register\n **********************************************************************/\n#define QEI_IECLR_INX_Int            ((uint32_t)(1<<0))    /**< Clear Enabled Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_IECLR_TIM_Int            ((uint32_t)(1<<1))    /**< Clear Enabled Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_IECLR_VELC_Int            ((uint32_t)(1<<2))    /**< Clear Enabled Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_IECLR_DIR_Int            ((uint32_t)(1<<3))    /**< Clear Enabled Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_IECLR_ERR_Int            ((uint32_t)(1<<4))    /**< Clear Enabled Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_IECLR_ENCLK_Int            ((uint32_t)(1<<5))    /**< Clear Enabled Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_IECLR_POS0_Int            ((uint32_t)(1<<6))    /**< Clear Enabled Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_POS1_Int            ((uint32_t)(1<<7))    /**< Clear Enabled Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_POS2_Int            ((uint32_t)(1<<8))    /**< Clear Enabled Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_REV_Int            ((uint32_t)(1<<9))    /**< Clear Enabled Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_IECLR_POS0REV_Int        ((uint32_t)(1<<10))    /**< Clear Enabled Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_IECLR_POS1REV_Int        ((uint32_t)(1<<11))    /**< Clear Enabled Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_IECLR_POS2REV_Int        ((uint32_t)(1<<12))    /**< Clear Enabled Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_IECLR_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable Clear register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for PCONP register QEI-related bits\n **********************************************************************/\n#define PCONP_QEI_ENABLE             ((uint32_t)(1<<18))     /**< QEI peripheral power enable bit */\n#define PCONP_QEI_DISABLE            ~((uint32_t)(1<<18))     /**< QEI peripheral power disable bit-mask */\n\n/*********************************************************************//**\n * Macro defines for PCLKSELx register QEI-related bits\n **********************************************************************/\n#define PCLKSEL_CCLK_DIV_1              1UL                 /**< Set PCLK to CCLK/1 */\n#define PCLKSEL_CCLK_DIV_2              2UL                 /**< Set PCLK to CCLK/2 */\n#define PCLKSEL_CCLK_DIV_4              0UL                 /**< Set PCLK to CCLK/4 */\n#define PCLKSEL_CCLK_DIV_8              3UL                 /**< Set PCLK to CCLK/8 */\n#define PCLKSEL1_PCLK_QEI_MASK          ((uint32_t)(3<<0))  /**< PCLK_QEI PCLK_QEI bit field mask */\n/*********************************************************************//**\n * Macro defines for PINSEL3 register QEI-related bits\n **********************************************************************/\n#define PINSEL3_MCI0                ((uint32_t)(1<<8))     /**< MCIO (PhA) pin select */\n#define PINSEL3_MCI0_MASK          ~((uint32_t)(3<<8))     /**< MCIO (PhA) pin mask */\n#define PINSEL3_MCI1                ((uint32_t)(1<<14))    /**< MCI1 (PhB) pin select */\n#define PINSEL3_MCI1_MASK          ~((uint32_t)(3<<14))    /**< MCI2 (PhB) pin mask */\n#define PINSEL3_MCI2                ((uint32_t)(1<<16))    /**< MCI2 (Index) pin select */\n#define PINSEL3_MCI2_MASK          ~((uint32_t)(3<<16))    /**< MCI2 (Index) pin mask */\n\n/*********************************************************************//**\n * Macro defines for PINMODE3 register QEI-related bits\n **********************************************************************/\n#define PIN_PULL_UP                     0UL\n#define PIN_REPEATER                    1UL\n#define PIN_NORESISTOR                  2UL\n#define PIN_PULL_DOWN                   3UL     \n\n#define PINMODE3_MCI0                ((uint32_t)(PIN_NORESISTOR<<8))     /**< MCIO (PhA) resistor selection */\n#define PINMODE3_GPIO1p20            ((uint32_t)(PIN_PULL_DOWN<<8))      /**< GPIO 1.20) resistor selection */\n#define PINMODE3_MCI0_MASK          ~((uint32_t)(3<<8))                  /**< MCIO (PhA) resistor mask */\n\n#define PINMODE3_MCI1                ((uint32_t)(PIN_NORESISTOR<<14))    /**< MCI1 (PhB) resistor selection */\n#define PINMODE3_GPIO1p23            ((uint32_t)(PIN_PULL_DOWN<<14))      /**< GPIO 1.23) resistor selection */\n#define PINMODE3_MCI1_MASK          ~((uint32_t)(3<<14))                 /**< MCI1 (PhB) resistor mask */\n\n#define PINMODE3_MCI2                ((uint32_t)(PIN_PULL_UP<<16))       /**< MCI2 (Index) resistor selection */\n#define PINMODE3_GPIO1p24            ((uint32_t)(PIN_PULL_DOWN<<16))      /**< GPIO 1.24) resistor selection */\n#define PINMODE3_MCI2_MASK          ~((uint32_t)(3<<16))                 /**< MCI2 (Index) resistor mask */\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the USB bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n    //\n    // Note: DMAC has highest priority, then Base thread and then Servo thread\n    //       to ensure SPI data transfer is reliable\n\n    NVIC_SetPriority(DMA_IRQn, 1);\n\n    baseThread = new pruThread(LPC_TIM0, TIMER0_IRQn, base_freq);\n    NVIC_SetVector(TIMER0_IRQn, (uint32_t)TIMER0_IRQHandler);\n    NVIC_SetPriority(TIMER0_IRQn, 2);\n\n    servoThread = new pruThread(LPC_TIM1, TIMER1_IRQn, servo_freq);\n    NVIC_SetVector(TIMER1_IRQn, (uint32_t)TIMER1_IRQHandler);\n    NVIC_SetPriority(TIMER1_IRQn, 3);\n\n    commsThread = new pruThread(LPC_TIM2, TIMER2_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIMER2_IRQn, (uint32_t)TIMER2_IRQHandler);\n    NVIC_SetPriority(TIMER2_IRQn, 4);\n\n    // for QEI modudule\n    NVIC_SetVector(QEI_IRQn, (uint32_t)QEI_IRQHandler);\n    NVIC_SetPriority(QEI_IRQn, 5);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"LPC17xx.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\nvoid Interrupt::TIMER0_Wrapper(void)\n{\n\tISRVectorTable[TIMER0_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIMER1_Wrapper(void)\n{\n\tISRVectorTable[TIMER1_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIMER2_Wrapper(void)\n{\n\tISRVectorTable[TIMER2_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::QEI_Wrapper(void)\n{\n\tISRVectorTable[QEI_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t32\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n\t\tstatic void TIMER0_Wrapper();\n\t\tstatic void TIMER1_Wrapper();\n        static void TIMER2_Wrapper();\n        static void QEI_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n\n/******  LPC17xx Specific Interrupt Numbers ******************************************************\n  WDT_IRQn                      = 0,        Watchdog Timer Interrupt\n  TIMER0_IRQn                   = 1,        Timer0 Interrupt\n  TIMER1_IRQn                   = 2,        Timer1 Interrupt\n  TIMER2_IRQn                   = 3,        Timer2 Interrupt\n  TIMER3_IRQn                   = 4,        Timer3 Interrupt\n  UART0_IRQn                    = 5,        UART0 Interrupt\n  UART1_IRQn                    = 6,        UART1 Interrupt\n  UART2_IRQn                    = 7,        UART2 Interrupt\n  UART3_IRQn                    = 8,        UART3 Interrupt\n  PWM1_IRQn                     = 9,        PWM1 Interrupt\n  I2C0_IRQn                     = 10,       I2C0 Interrupt\n  I2C1_IRQn                     = 11,       I2C1 Interrupt\n  I2C2_IRQn                     = 12,       I2C2 Interrupt\n  SPI_IRQn                      = 13,       SPI Interrupt\n  SSP0_IRQn                     = 14,       SSP0 Interrupt\n  SSP1_IRQn                     = 15,       SSP1 Interrupt\n  PLL0_IRQn                     = 16,       PLL0 Lock (Main PLL) Interrupt\n  RTC_IRQn                      = 17,       Real Time Clock Interrupt\n  EINT0_IRQn                    = 18,       External Interrupt 0 Interrupt\n  EINT1_IRQn                    = 19,       External Interrupt 1 Interrupt\n  EINT2_IRQn                    = 20,       External Interrupt 2 Interrupt\n  EINT3_IRQn                    = 21,       External Interrupt 3 Interrupt\n  ADC_IRQn                      = 22,       A/D Converter Interrupt\n  BOD_IRQn                      = 23,       Brown-Out Detect Interrupt\n  USB_IRQn                      = 24,       USB Interrupt\n  CAN_IRQn                      = 25,       CAN Interrupt\n  DMA_IRQn                      = 26,       General Purpose DMA Interrupt\n  I2S_IRQn                      = 27,       I2S Interrupt\n  ENET_IRQn                     = 28,       Ethernet Interrupt\n  RIT_IRQn                      = 29,       Repetitive Interrupt Timer Interrupt\n  MCPWM_IRQn                    = 30,       Motor Control PWM Interrupt\n  QEI_IRQn                      = 31,       Quadrature Encoder Interface Interrupt\n  PLL1_IRQn                     = 32,       PLL1 Lock (USB PLL) Interrupt\n\nPERIPH_COUNT_IRQn    = 32  < Number of peripheral IDs */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\nvoid TIMER0_IRQHandler()\n{\n    // Base thread interrupt handler\n    unsigned int isrMask = LPC_TIM0->IR;\n    LPC_TIM0->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER0_Wrapper();\n}\n\n\nvoid TIMER1_IRQHandler(void)\n{\n    // Servo thread interrupt handler\n    unsigned int isrMask = LPC_TIM1->IR;\n    LPC_TIM1->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER1_Wrapper();\n}\n\n\nvoid TIMER2_IRQHandler(void)\n{\n    // Servo thread interrupt handler\n    unsigned int isrMask = LPC_TIM2->IR;\n    LPC_TIM2->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER2_Wrapper();\n}\n\n\nvoid QEI_IRQHandler(void)\n{\n    // QEI (quatrature encoder interface) index interrupt handler\n    LPC_QEI->QEICLR = ((uint32_t)(1<<0));   \n    Interrupt:: QEI_Wrapper();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"LPC17xx.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tLPC_TIM_TypeDef* \ttimer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/qeiInterrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"qeiInterrupt.h\"\n#include \"qei.h\"\n\n\nqeiInterrupt::qeiInterrupt(int interruptNumber, QEIdriver* owner)\n{\n\t// Allows interrupt to access owner's data\n\tInterruptOwnerPtr = owner;\n\n\t// When a device interrupt object is instantiated, the Register function must be called to let the\n\t// Interrupt base class know that there is an appropriate ISR function for the given interrupt.\n\tInterrupt::Register(interruptNumber, this);\n}\n\n\nvoid qeiInterrupt::ISR_Handler(void)\n{\n\tthis->InterruptOwnerPtr->interruptHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/qeiInterrupt.h",
    "content": "#ifndef QEIINTERRUPT_H\n#define QEIINTERRUPT_H\n\n// Derived class for timer interrupts\n\nclass QEIdriver; // forward declatation\n\nclass qeiInterrupt : public Interrupt\n{\n\tprivate:\n\t    \n\t\tQEIdriver* InterruptOwnerPtr;\n\t\n\tpublic:\n\n\t\tqeiInterrupt(int interruptNumber, QEIdriver* ownerptr);\n    \n\t\tvoid ISR_Handler(void);\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"LPC17xx.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n#define SBIT_TIMER0  1\n#define SBIT_TIMER1  2\n#define SBIT_TIMER2  22\n#define SBIT_TIMER3  23\n\n#define SBIT_MR0I    0\n#define SBIT_MR0R    1\n#define SBIT_CNTEN   0\n\n\n// Timer constructor\npruTimer::pruTimer(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    if (this->timer == LPC_TIM0)\n    {\n        printf(\"\tpower on Timer 0\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER0);\n    }\n    else if (this->timer == LPC_TIM1)\n    {\n        printf(\"\tpower on Timer 1\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER1);\n    }\n    else if (this->timer == LPC_TIM2)\n    {\n        printf(\"\tpower on Timer 2\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER2);\n    }\n\n    printf(\"\ttimer set MCR\\n\");\n    this->timer->MCR  = (1<<SBIT_MR0I) | (1<<SBIT_MR0R);     /* Clear TC on MR0 match and Generate Interrupt*/\n    \n    printf(\"\ttimer set PR\\n\");\n    this->timer->PR   = 0x00;\n    \n    printf(\"\ttimer set PRO\\n\");\n    this->timer->MR0  = SystemCoreClock/4/this->frequency;\n    \n    printf(\"\ttimer start\\n\");\n    this->timer->TCR  = (1<<SBIT_CNTEN);                     /* Start timer by setting the Counter Enable*/\n    \n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\");\n    this->timer->TCR  = (0<<SBIT_CNTEN);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV1_4/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tLPC_TIM_TypeDef* \ttimer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV2/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_0 = 0,\n    DAC_1\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE,\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV2/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to VBUS_FS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to OTG_FS_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to LD4 [Green Led]\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD3 [Orange Led]\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to LD5 [Red Led]\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to LD6 [Blue Led]\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to VBUS_FS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to OTG_FS_OverCurrent\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DP\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to Audio_RST [CS43L22_RESET]\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD4 [Green Led]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DM\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SWO\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SWO\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to VBUS_FS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to I2S3_WS [CS43L22_LRCK]\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to OTG_FS_PowerSwitchOn\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT // Connected to PDM_OUT [MP45DT02_DOUT]\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV2/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0,\n    PC_11 = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n    PH_3  = 0x73,\n    PH_4  = 0x74,\n    PH_5  = 0x75,\n    PH_6  = 0x76,\n    PH_7  = 0x77,\n    PH_8  = 0x78,\n    PH_9  = 0x79,\n    PH_10 = 0x7A,\n    PH_11 = 0x7B,\n    PH_12 = 0x7C,\n    PH_13 = 0x7D,\n    PH_14 = 0x7E,\n    PH_15 = 0x7F,\n\n    PI_0  = 0x80,\n    PI_1  = 0x81,\n    PI_2  = 0x82,\n    PI_3  = 0x83,\n    PI_4  = 0x84,\n    PI_5  = 0x85,\n    PI_6  = 0x86,\n    PI_7  = 0x87,\n    PI_8  = 0x88,\n    PI_9  = 0x89,\n    PI_10 = 0x8A,\n    PI_11 = 0x8B,\n    PI_12 = 0x8C,\n    PI_13 = 0x8D,\n    PI_14 = 0x8E,\n    PI_15 = 0x8F,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PD_13, // LD3 as LD1 is not a user LED\n    LED2        = PD_12, // LD4 as LD2 is not a user LED\n    LED3        = PD_13, // orange\n    LED4        = PD_12, // green\n    LED5        = PD_14, // red\n    LED6        = PD_15, // blue\n    LED_RED     = LED5,\n    USER_BUTTON = PA_0,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    SERIAL_TX   = STDIO_UART_TX, /* USART2 */\n    SERIAL_RX   = STDIO_UART_RX,\n    USBTX       = STDIO_UART_TX, /* USART2 */\n    USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8, /* I2C1 */\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD1 = PB_13,\n    ETH_TXD2 = PC_2,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3,\n    ETH_TX_EN = PB_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED3 = PE_6,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKRV2/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 168\n  * AHBCLK (MHz)        | 168\n  * APB1CLK (MHz)       | 42\n  * APB2CLK (MHz)       | 84\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO2 pin(PC9) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); // 84 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM            = 8;             // VCO input clock = 1 MHz (8 MHz / 8)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> OK for USB\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;   // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;   // 84 MHz (SPI1 clock...)\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    /*\n    if (bypass == 0)\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz\n    else\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n    */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;\n    RCC_OscInitStruct.PLL.PLLM            = 16;            // VCO input clock = 1 MHz (16 MHz / 16)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> freq is ok but not precise enough\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;           // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;           // 84 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKR_MINI_E3/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKR_MINI_E3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n//  {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to STDIO_UART_TX\n//  {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to STDIO_UART_RX\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to LD2 [Green Led]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM4 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM2_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM2_CH2\n//  {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM2_CH3 // Connected to STDIO_UART_TX\n//  {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM2_CH4 // Connected to STDIO_UART_RX\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM3_CH1\n    {PA_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM3_CH2\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM1_CH2\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM1_CH3\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM1_CH4\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM3_CH3\n    {PB_1,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM3_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 2, 0)}, // TIM3_CH2\n//  {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM4_CH1\n//  {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM4_CH2\n//  {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM4_CH3\n//  {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM4_CH4\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 1)}, // TIM1_CH2N\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 1)}, // TIM1_CH3N\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 1, 0)}, // TIM3_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 2, 0)}, // TIM3_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 3, 0)}, // TIM3_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 4, 0)}, // TIM3_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_TX\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_RX\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)}, // Connected to LD2 [Green Led]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1 // Connected to SWO\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 10)}, // Remap CAN_RX to PB_8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 10)}, // Remap CAN_TX to PB_9\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DP\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKR_MINI_E3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_1  = 0x01,\n    PA_2  = 0x02,\n    PA_3  = 0x03,\n    PA_4  = 0x04,\n    PA_5  = 0x05,\n    PA_6  = 0x06,\n    PA_7  = 0x07,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n\n    PB_0  = 0x10,\n    PB_1  = 0x11,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_4  = 0x14,\n    PB_5  = 0x15,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_9  = 0x19,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_15 = 0x1F,\n\n    PC_0  = 0x20,\n    PC_1  = 0x21,\n    PC_2  = 0x22,\n    PC_3  = 0x23,\n    PC_4  = 0x24,\n    PC_5  = 0x25,\n    PC_6  = 0x26,\n    PC_7  = 0x27,\n    PC_8  = 0x28,\n    PC_9  = 0x29,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n\n    // Arduino connector namings\n    A0          = PA_0,\n    A1          = PA_1,\n    A2          = PA_4,\n    A3          = PB_0,\n    A4          = PC_1,\n    A5          = PC_0,\n    D0          = PA_3,\n    D1          = PA_2,\n    D2          = PA_10,\n    D3          = PB_3,\n    D4          = PB_5,\n    D5          = PB_4,\n    D6          = PB_10,\n    D7          = PA_8,\n    D8          = PA_9,\n    D9          = PC_7,\n    D10         = PB_6,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PA_5,\n    LED2        = PA_5,\n    LED3        = PA_5,\n    LED4        = PA_5,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    SERIAL_TX   = STDIO_UART_TX,\n    SERIAL_RX   = STDIO_UART_RX,\n    USBTX       = STDIO_UART_TX,\n    USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8,\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB pins ****/\n    USB_DM = PA_11,\n    USB_DP = PA_12,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PD_0,\n    RCC_OSC_OUT = PD_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_TRACESWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_NJTRST = PB_4,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_SKR_MINI_E3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-------------------------------------------------------------------------------------------\n  * System clock source                | 1- PLL_HSE_EXTC  / DEVICE_USBDEVICE   | 3- PLL_HSI / DEVICE_USBDEVICE\n  *                                    | (external 8 MHz clock)                | (internal 8 MHz)\n  *                                    | 2- PLL_HSE_XTAL / DEVICE_USBDEVICE    |\n  *                                    | (external 8 MHz xtal)                 |\n  *-------------------------------------------------------------------------------------------\n  * SYSCLK(MHz)                        | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * AHBCLK (MHz)                       | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * APB1CLK (MHz)                      | 36 / 36                               | 32 / 24\n  *-------------------------------------------------------------------------------------------\n  * APB2CLK (MHz)                      | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  */\n\n#include \"stm32f1xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x00000000U /*!< Vector Table base offset field.\n                                  This value must be a multiple of 0x200. */\n\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the Embedded Flash Interface, the PLL and update the\n  *         SystemCoreClock variable.\n  * @note   This function should be used only after reset.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit (void)\n{\n    /* Reset the RCC clock configuration to the default reset state(for debug purpose) */\n    /* Set HSION bit */\n    RCC->CR |= 0x00000001U;\n\n    /* Reset SW, HPRE, PPRE1, PPRE2, ADCPRE and MCO bits */\n#if !defined(STM32F105xC) && !defined(STM32F107xC)\n    RCC->CFGR &= 0xF8FF0000U;\n#else\n    RCC->CFGR &= 0xF0FF0000U;\n#endif /* STM32F105xC */\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= 0xFEF6FFFFU;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= 0xFFFBFFFFU;\n\n    /* Reset PLLSRC, PLLXTPRE, PLLMUL and USBPRE/OTGFSPRE bits */\n    RCC->CFGR &= 0xFF80FFFFU;\n\n#if defined(STM32F105xC) || defined(STM32F107xC)\n    /* Reset PLL2ON and PLL3ON bits */\n    RCC->CR &= 0xEBFFFFFFU;\n\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x00FF0000U;\n\n    /* Reset CFGR2 register */\n    RCC->CFGR2 = 0x00000000U;\n#elif defined(STM32F100xB) || defined(STM32F100xE)\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x009F0000U;\n\n    /* Reset CFGR2 register */\n    RCC->CFGR2 = 0x00000000U;\n#else\n    /* Disable all interrupts and clear pending bits  */\n    RCC->CIR = 0x009F0000U;\n#endif /* STM32F105xC */\n\n#if defined(STM32F100xE) || defined(STM32F101xE) || defined(STM32F101xG) || defined(STM32F103xE) || defined(STM32F103xG)\n#ifdef DATA_IN_ExtSRAM\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM */\n#endif\n\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // 72 MHz or 64 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSEPredivValue      = RCC_HSE_PREDIV_DIV1;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL9; // 72 MHz (8 MHz * 9)\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 72 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 72 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 36 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 72 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI_DIV2;\n#if (DEVICE_USBDEVICE)\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL12; // 48 MHz (8 MHz/2 * 12)\n#else /* DEVICE_USBDEVICE */\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL16; // 64 MHz (8 MHz/2 * 16)\n#endif /* DEVICE_USBDEVICE */\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 64 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 64 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 32 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 64 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32f1xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin),\n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PA_4)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PA_15)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI15_10_IRQn , 5, 0);\n    }\n    else if (this->interruptPin == PC_1)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI1_IRQn , 5, 0);\n    }\n\n    slaveSelect.rise(callback(this, &RemoraComms::processPacket));  \n}\n\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising SPI1 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PA4     ------> SPI1_NSS\n        PA5     ------> SPI1_SCK\n        PA6     ------> SPI1_MISO\n        PA7     ------> SPI1_MOSI\n        */\n\n        GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;\n        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_6;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI1_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        }\n        this->spiHandle.Init.BaudRatePrescaler        = SPI_BAUDRATEPRESCALER_2;\n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n \n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOA_CLK_ENABLE();\n        __HAL_RCC_DMA1_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA1_Channel3;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        \n         HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA1_Channel3_IRQn, (uint32_t)&DMA1_Channel3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA1_Channel2;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);\n        //NVIC_SetVector(DMA1_Channel2_IRQn, (uint32_t)&DMA1_Channel2_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::processPacket()\n{\n    switch (this->spiRxBuffer.header)\n    {\n      case PRU_READ:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // READ so do nothing with the received data\n        break;\n\n      case PRU_WRITE:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // we've got a good WRITE header, move the data to rxData\n\n        // **** would like to use DMA for this but cannot when the stream is in CIRCULAR mode for the SPI transfer ****\n        // TODO: figure out how to use NORMAL mode for SPI...\n        //this->status = HAL_DMA_Start(&hdma_memtomem_dma2_stream1, (uint32_t)&this->spiRxBuffer.rxBuffer, (uint32_t)this->rxData->rxBuffer, SPI_BUFF_SIZE);\n        //if (this->status != HAL_OK) printf(\"F\\n\");\n       \n            \n        // Do it the slower way. This does not seem to impact performance but not great to stay in ISR context for longer.. :-(\n\n        // ensure an atomic access to the rxBuffer\n\t\t// disable thread interrupts\n\t\t__disable_irq();        \n        for (int i = 0; i < SPI_BUFF_SIZE; i++)\n        {\n            this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n        }\n\t\t// re-enable thread interrupts\n\t\t__enable_irq();\n        break;\n\n      default:\n        this->rejectCnt++;\n        if (this->rejectCnt > 5)\n        {\n            this->SPIdataError = true;\n        }\n        // reset SPI somehow\n    }\n\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->SPIdata;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->SPIdata = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32f1xx_hal.h\"\n\n\n\nclass RemoraComms\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n        uint8_t             rejectCnt;\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void processPacket(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n        void init(void);\n        void start(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[5] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        //if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        //if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PC_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PC_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PC_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PC_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PC_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PC_5); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->init();\n\n}\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(NC)\n{\n    this->init();;\n}\n\nvoid QEIdriver::interruptHandler()\n{\n\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return false;\n}\n\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n    printf(\"        This target does not support a QEI module\\n\");\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM1, TIM1_UP_IRQn, base_freq);\n    NVIC_SetVector(TIM1_UP_IRQn, (uint32_t)TIM1_IRQHandler);\n    NVIC_SetPriority(TIM1_UP_IRQn, 2);\n\n    servoThread = new pruThread(TIM2, TIM2_IRQn , servo_freq);\n    NVIC_SetVector(TIM2_IRQn , (uint32_t)TIM2_IRQHandler);\n    NVIC_SetPriority(TIM2_IRQn , 3);\n\n    commsThread = new pruThread(TIM3, TIM3_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM3_IRQn, (uint32_t)TIM3_IRQHandler);\n    NVIC_SetPriority(TIM3_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32f1xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\nvoid Interrupt::TIM1_Wrapper(void)\n{\n\tISRVectorTable[TIM1_UP_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM2_Wrapper(void)\n{\n\tISRVectorTable[TIM2_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM3_Wrapper(void)\n{\n\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t60\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n\t\tstatic void TIM1_Wrapper();\n        static void TIM2_Wrapper();\n        static void TIM3_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !< Window WatchDog Interrupt                            \n  PVD_IRQn                    = 1,      !< PVD through EXTI Line detection Interrupt            \n  TAMPER_IRQn                 = 2,      !< Tamper Interrupt                                     \n  RTC_IRQn                    = 3,      !< RTC global Interrupt                                 \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                               \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                 \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                 \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                 \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                 \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                 \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                 \n  DMA1_Channel1_IRQn          = 11,     !< DMA1 Channel 1 global Interrupt                      \n  DMA1_Channel2_IRQn          = 12,     !< DMA1 Channel 2 global Interrupt                      \n  DMA1_Channel3_IRQn          = 13,     !< DMA1 Channel 3 global Interrupt                      \n  DMA1_Channel4_IRQn          = 14,     !< DMA1 Channel 4 global Interrupt                      \n  DMA1_Channel5_IRQn          = 15,     !< DMA1 Channel 5 global Interrupt                      \n  DMA1_Channel6_IRQn          = 16,     !< DMA1 Channel 6 global Interrupt                      \n  DMA1_Channel7_IRQn          = 17,     !< DMA1 Channel 7 global Interrupt                      \n  ADC1_2_IRQn                 = 18,     !< ADC1 and ADC2 global Interrupt                       \n  USB_HP_CAN1_TX_IRQn         = 19,     !< USB Device High Priority or CAN1 TX Interrupts       \n  USB_LP_CAN1_RX0_IRQn        = 20,     !< USB Device Low Priority or CAN1 RX0 Interrupts       \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                   \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                   \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                        \n  TIM1_BRK_IRQn               = 24,     !< TIM1 Break Interrupt                                 \n  TIM1_UP_IRQn                = 25,     !< TIM1 Update Interrupt                                \n  TIM1_TRG_COM_IRQn           = 26,     !< TIM1 Trigger and Commutation Interrupt               \n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                       \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                 \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                 \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                 \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                 \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                              \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                              \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                              \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                      \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm through EXTI Line Interrupt                \n  USBWakeUp_IRQn              = 42,     !< USB Device WakeUp from suspend through EXTI Line Interrupt \n  TIM8_BRK_IRQn               = 43,     !< TIM8 Break Interrupt                                 \n  TIM8_UP_IRQn                = 44,     !< TIM8 Update Interrupt                                \n  TIM8_TRG_COM_IRQn           = 45,     !< TIM8 Trigger and Commutation Interrupt               \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare Interrupt                       \n  ADC3_IRQn                   = 47,     !< ADC3 global Interrupt                                \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                               \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                               \n  TIM6_IRQn                   = 54,     !< TIM6 global Interrupt                                \n  TIM7_IRQn                   = 55,     !< TIM7 global Interrupt                                \n  DMA2_Channel1_IRQn          = 56,     !< DMA2 Channel 1 global Interrupt                      \n  DMA2_Channel2_IRQn          = 57,     !< DMA2 Channel 2 global Interrupt                      \n  DMA2_Channel3_IRQn          = 58,     !< DMA2 Channel 3 global Interrupt                      \n  DMA2_Channel4_5_IRQn        = 59,     !< DMA2 Channel 4 and Channel 5 global Interrupt                                                   \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n\nvoid TIM1_IRQHandler()\n{\n  if(TIM1->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM1->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM1_Wrapper();\n  }\n}\n\nvoid TIM2_IRQHandler()\n{\n  if(TIM2->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM2->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM2_Wrapper();\n  }\n}\n\nvoid TIM3_IRQHandler()\n{\n  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM3_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32f1xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32f1xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM1)\n    {\n        printf(\"\tpower on Timer 1\\n\\r\");\n        __HAL_RCC_TIM1_CLK_ENABLE();\n        TIM_CLK = APB2CLK;\n    }\n    else if (this->timer == TIM2)\n    {\n        printf(\"\tpower on Timer 2\\n\\r\");\n        __HAL_RCC_TIM2_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 30\\n\\r\");\n        __HAL_RCC_TIM3_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n\n\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F1/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 1\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/TOOLCHAIN_ARM/startup_stm32f103xe.S",
    "content": ";******************** (C) COPYRIGHT 2017 STMicroelectronics ********************\n;* File Name          : startup_stm32f103xe.s\n;* Author             : MCD Application Team\n;* Description        : STM32F103xE Devices vector table for MDK-ARM toolchain. \n;*                      This module performs:\n;*                      - Set the initial SP\n;*                      - Set the initial PC == Reset_Handler\n;*                      - Set the vector table entries with the exceptions ISR address\n;*                      - Configure the clock system\n;*                      - Branches to __main in the C library (which eventually\n;*                        calls main()).\n;*                      After Reset the Cortex-M3 processor is in Thread mode,\n;*                      priority is Privileged, and the Stack is set to Main.\n;******************************************************************************\n;* @attention\n;*\n;* Copyright (c) 2017 STMicroelectronics.\n;* All rights reserved.\n;*\n;* This software component is licensed by ST under BSD 3-Clause license,\n;* the \"License\"; You may not use this file except in compliance with the\n;* License. You may obtain a copy of the License at:\n;*                        opensource.org/licenses/BSD-3-Clause\n;*\n;******************************************************************************\n\n; Amount of memory (in bytes) allocated for Stack\n; Tailor this value to your application needs\n; <h> Stack Configuration\n;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>\n; </h>\n\nStack_Size      EQU     0x00000400\n\n                AREA    STACK, NOINIT, READWRITE, ALIGN=3\nStack_Mem       SPACE   Stack_Size\n__initial_sp\n                                                  \n; <h> Heap Configuration\n;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>\n; </h>\n\nHeap_Size       EQU     0x00000200\n\n                AREA    HEAP, NOINIT, READWRITE, ALIGN=3\n__heap_base\nHeap_Mem        SPACE   Heap_Size\n__heap_limit\n\n                PRESERVE8\n                THUMB\n\n\n; Vector Table Mapped to Address 0 at Reset\n                AREA    RESET, DATA, READONLY\n                EXPORT  __Vectors\n                EXPORT  __Vectors_End\n                EXPORT  __Vectors_Size\n\n__Vectors       DCD     __initial_sp               ; Top of Stack\n                DCD     Reset_Handler              ; Reset Handler\n                DCD     NMI_Handler                ; NMI Handler\n                DCD     HardFault_Handler          ; Hard Fault Handler\n                DCD     MemManage_Handler          ; MPU Fault Handler\n                DCD     BusFault_Handler           ; Bus Fault Handler\n                DCD     UsageFault_Handler         ; Usage Fault Handler\n                DCD     0                          ; Reserved\n                DCD     0                          ; Reserved\n                DCD     0                          ; Reserved\n                DCD     0                          ; Reserved\n                DCD     SVC_Handler                ; SVCall Handler\n                DCD     DebugMon_Handler           ; Debug Monitor Handler\n                DCD     0                          ; Reserved\n                DCD     PendSV_Handler             ; PendSV Handler\n                DCD     SysTick_Handler            ; SysTick Handler\n\n                ; External Interrupts\n                DCD     WWDG_IRQHandler            ; Window Watchdog\n                DCD     PVD_IRQHandler             ; PVD through EXTI Line detect\n                DCD     TAMPER_IRQHandler          ; Tamper\n                DCD     RTC_IRQHandler             ; RTC\n                DCD     FLASH_IRQHandler           ; Flash\n                DCD     RCC_IRQHandler             ; RCC\n                DCD     EXTI0_IRQHandler           ; EXTI Line 0\n                DCD     EXTI1_IRQHandler           ; EXTI Line 1\n                DCD     EXTI2_IRQHandler           ; EXTI Line 2\n                DCD     EXTI3_IRQHandler           ; EXTI Line 3\n                DCD     EXTI4_IRQHandler           ; EXTI Line 4\n                DCD     DMA1_Channel1_IRQHandler   ; DMA1 Channel 1\n                DCD     DMA1_Channel2_IRQHandler   ; DMA1 Channel 2\n                DCD     DMA1_Channel3_IRQHandler   ; DMA1 Channel 3\n                DCD     DMA1_Channel4_IRQHandler   ; DMA1 Channel 4\n                DCD     DMA1_Channel5_IRQHandler   ; DMA1 Channel 5\n                DCD     DMA1_Channel6_IRQHandler   ; DMA1 Channel 6\n                DCD     DMA1_Channel7_IRQHandler   ; DMA1 Channel 7\n                DCD     ADC1_2_IRQHandler          ; ADC1 & ADC2\n                DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX\n                DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0\n                DCD     CAN1_RX1_IRQHandler        ; CAN1 RX1\n                DCD     CAN1_SCE_IRQHandler        ; CAN1 SCE\n                DCD     EXTI9_5_IRQHandler         ; EXTI Line 9..5\n                DCD     TIM1_BRK_IRQHandler        ; TIM1 Break\n                DCD     TIM1_UP_IRQHandler         ; TIM1 Update\n                DCD     TIM1_TRG_COM_IRQHandler    ; TIM1 Trigger and Commutation\n                DCD     TIM1_CC_IRQHandler         ; TIM1 Capture Compare\n                DCD     TIM2_IRQHandler            ; TIM2\n                DCD     TIM3_IRQHandler            ; TIM3\n                DCD     TIM4_IRQHandler            ; TIM4\n                DCD     I2C1_EV_IRQHandler         ; I2C1 Event\n                DCD     I2C1_ER_IRQHandler         ; I2C1 Error\n                DCD     I2C2_EV_IRQHandler         ; I2C2 Event\n                DCD     I2C2_ER_IRQHandler         ; I2C2 Error\n                DCD     SPI1_IRQHandler            ; SPI1\n                DCD     SPI2_IRQHandler            ; SPI2\n                DCD     USART1_IRQHandler          ; USART1\n                DCD     USART2_IRQHandler          ; USART2\n                DCD     USART3_IRQHandler          ; USART3\n                DCD     EXTI15_10_IRQHandler       ; EXTI Line 15..10\n                DCD     RTC_Alarm_IRQHandler        ; RTC Alarm through EXTI Line\n                DCD     USBWakeUp_IRQHandler       ; USB Wakeup from suspend\n                DCD     TIM8_BRK_IRQHandler        ; TIM8 Break\n                DCD     TIM8_UP_IRQHandler         ; TIM8 Update\n                DCD     TIM8_TRG_COM_IRQHandler    ; TIM8 Trigger and Commutation\n                DCD     TIM8_CC_IRQHandler         ; TIM8 Capture Compare\n                DCD     ADC3_IRQHandler            ; ADC3\n                DCD     FSMC_IRQHandler            ; FSMC\n                DCD     SDIO_IRQHandler            ; SDIO\n                DCD     TIM5_IRQHandler            ; TIM5\n                DCD     SPI3_IRQHandler            ; SPI3\n                DCD     UART4_IRQHandler           ; UART4\n                DCD     UART5_IRQHandler           ; UART5\n                DCD     TIM6_IRQHandler            ; TIM6\n                DCD     TIM7_IRQHandler            ; TIM7\n                DCD     DMA2_Channel1_IRQHandler   ; DMA2 Channel1\n                DCD     DMA2_Channel2_IRQHandler   ; DMA2 Channel2\n                DCD     DMA2_Channel3_IRQHandler   ; DMA2 Channel3\n                DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5\n__Vectors_End\n\n__Vectors_Size  EQU  __Vectors_End - __Vectors\n\n                AREA    |.text|, CODE, READONLY\n                \n; Reset handler\nReset_Handler   PROC\n                EXPORT  Reset_Handler             [WEAK]\n                IMPORT  __main\n                IMPORT  SystemInit\n                LDR     R0, =SystemInit\n                BLX     R0               \n                LDR     R0, =__main\n                BX      R0\n                ENDP\n                \n; Dummy Exception Handlers (infinite loops which can be modified)\n\nNMI_Handler     PROC\n                EXPORT  NMI_Handler                [WEAK]\n                B       .\n                ENDP\nHardFault_Handler\\\n                PROC\n                EXPORT  HardFault_Handler          [WEAK]\n                B       .\n                ENDP\nMemManage_Handler\\\n                PROC\n                EXPORT  MemManage_Handler          [WEAK]\n                B       .\n                ENDP\nBusFault_Handler\\\n                PROC\n                EXPORT  BusFault_Handler           [WEAK]\n                B       .\n                ENDP\nUsageFault_Handler\\\n                PROC\n                EXPORT  UsageFault_Handler         [WEAK]\n                B       .\n                ENDP\nSVC_Handler     PROC\n                EXPORT  SVC_Handler                [WEAK]\n                B       .\n                ENDP\nDebugMon_Handler\\\n                PROC\n                EXPORT  DebugMon_Handler           [WEAK]\n                B       .\n                ENDP\nPendSV_Handler  PROC\n                EXPORT  PendSV_Handler             [WEAK]\n                B       .\n                ENDP\nSysTick_Handler PROC\n                EXPORT  SysTick_Handler            [WEAK]\n                B       .\n                ENDP\n\nDefault_Handler PROC\n\n                EXPORT  WWDG_IRQHandler            [WEAK]\n                EXPORT  PVD_IRQHandler             [WEAK]\n                EXPORT  TAMPER_IRQHandler          [WEAK]\n                EXPORT  RTC_IRQHandler             [WEAK]\n                EXPORT  FLASH_IRQHandler           [WEAK]\n                EXPORT  RCC_IRQHandler             [WEAK]\n                EXPORT  EXTI0_IRQHandler           [WEAK]\n                EXPORT  EXTI1_IRQHandler           [WEAK]\n                EXPORT  EXTI2_IRQHandler           [WEAK]\n                EXPORT  EXTI3_IRQHandler           [WEAK]\n                EXPORT  EXTI4_IRQHandler           [WEAK]\n                EXPORT  DMA1_Channel1_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel2_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel3_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel4_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel5_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel6_IRQHandler   [WEAK]\n                EXPORT  DMA1_Channel7_IRQHandler   [WEAK]\n                EXPORT  ADC1_2_IRQHandler          [WEAK]\n                EXPORT  USB_HP_CAN1_TX_IRQHandler  [WEAK]\n                EXPORT  USB_LP_CAN1_RX0_IRQHandler [WEAK]\n                EXPORT  CAN1_RX1_IRQHandler        [WEAK]\n                EXPORT  CAN1_SCE_IRQHandler        [WEAK]\n                EXPORT  EXTI9_5_IRQHandler         [WEAK]\n                EXPORT  TIM1_BRK_IRQHandler        [WEAK]\n                EXPORT  TIM1_UP_IRQHandler         [WEAK]\n                EXPORT  TIM1_TRG_COM_IRQHandler    [WEAK]\n                EXPORT  TIM1_CC_IRQHandler         [WEAK]\n                EXPORT  TIM2_IRQHandler            [WEAK]\n                EXPORT  TIM3_IRQHandler            [WEAK]\n                EXPORT  TIM4_IRQHandler            [WEAK]\n                EXPORT  I2C1_EV_IRQHandler         [WEAK]\n                EXPORT  I2C1_ER_IRQHandler         [WEAK]\n                EXPORT  I2C2_EV_IRQHandler         [WEAK]\n                EXPORT  I2C2_ER_IRQHandler         [WEAK]\n                EXPORT  SPI1_IRQHandler            [WEAK]\n                EXPORT  SPI2_IRQHandler            [WEAK]\n                EXPORT  USART1_IRQHandler          [WEAK]\n                EXPORT  USART2_IRQHandler          [WEAK]\n                EXPORT  USART3_IRQHandler          [WEAK]\n                EXPORT  EXTI15_10_IRQHandler       [WEAK]\n                EXPORT  RTC_Alarm_IRQHandler        [WEAK]\n                EXPORT  USBWakeUp_IRQHandler       [WEAK]\n                EXPORT  TIM8_BRK_IRQHandler        [WEAK]\n                EXPORT  TIM8_UP_IRQHandler         [WEAK]\n                EXPORT  TIM8_TRG_COM_IRQHandler    [WEAK]\n                EXPORT  TIM8_CC_IRQHandler         [WEAK]\n                EXPORT  ADC3_IRQHandler            [WEAK]\n                EXPORT  FSMC_IRQHandler            [WEAK]\n                EXPORT  SDIO_IRQHandler            [WEAK]\n                EXPORT  TIM5_IRQHandler            [WEAK]\n                EXPORT  SPI3_IRQHandler            [WEAK]\n                EXPORT  UART4_IRQHandler           [WEAK]\n                EXPORT  UART5_IRQHandler           [WEAK]\n                EXPORT  TIM6_IRQHandler            [WEAK]\n                EXPORT  TIM7_IRQHandler            [WEAK]\n                EXPORT  DMA2_Channel1_IRQHandler   [WEAK]\n                EXPORT  DMA2_Channel2_IRQHandler   [WEAK]\n                EXPORT  DMA2_Channel3_IRQHandler   [WEAK]\n                EXPORT  DMA2_Channel4_5_IRQHandler [WEAK]\n\nWWDG_IRQHandler\nPVD_IRQHandler\nTAMPER_IRQHandler\nRTC_IRQHandler\nFLASH_IRQHandler\nRCC_IRQHandler\nEXTI0_IRQHandler\nEXTI1_IRQHandler\nEXTI2_IRQHandler\nEXTI3_IRQHandler\nEXTI4_IRQHandler\nDMA1_Channel1_IRQHandler\nDMA1_Channel2_IRQHandler\nDMA1_Channel3_IRQHandler\nDMA1_Channel4_IRQHandler\nDMA1_Channel5_IRQHandler\nDMA1_Channel6_IRQHandler\nDMA1_Channel7_IRQHandler\nADC1_2_IRQHandler\nUSB_HP_CAN1_TX_IRQHandler\nUSB_LP_CAN1_RX0_IRQHandler\nCAN1_RX1_IRQHandler\nCAN1_SCE_IRQHandler\nEXTI9_5_IRQHandler\nTIM1_BRK_IRQHandler\nTIM1_UP_IRQHandler\nTIM1_TRG_COM_IRQHandler\nTIM1_CC_IRQHandler\nTIM2_IRQHandler\nTIM3_IRQHandler\nTIM4_IRQHandler\nI2C1_EV_IRQHandler\nI2C1_ER_IRQHandler\nI2C2_EV_IRQHandler\nI2C2_ER_IRQHandler\nSPI1_IRQHandler\nSPI2_IRQHandler\nUSART1_IRQHandler\nUSART2_IRQHandler\nUSART3_IRQHandler\nEXTI15_10_IRQHandler\nRTC_Alarm_IRQHandler\nUSBWakeUp_IRQHandler\nTIM8_BRK_IRQHandler\nTIM8_UP_IRQHandler\nTIM8_TRG_COM_IRQHandler\nTIM8_CC_IRQHandler\nADC3_IRQHandler\nFSMC_IRQHandler\nSDIO_IRQHandler\nTIM5_IRQHandler\nSPI3_IRQHandler\nUART4_IRQHandler\nUART5_IRQHandler\nTIM6_IRQHandler\nTIM7_IRQHandler\nDMA2_Channel1_IRQHandler\nDMA2_Channel2_IRQHandler\nDMA2_Channel3_IRQHandler\nDMA2_Channel4_5_IRQHandler\n                B       .\n\n                ENDP\n\n                ALIGN\n\n;*******************************************************************************\n; User Stack and Heap initialization\n;*******************************************************************************\n\n                 END\n\n;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/TOOLCHAIN_ARM/stm32f103xe.sct",
    "content": "#! armclang -E --target=arm-arm-none-eabi -x c -mcpu=cortex-m3\n; Scatter-Loading Description File\n;\n; SPDX-License-Identifier: BSD-3-Clause\n;******************************************************************************\n;* @attention\n;*\n;* Copyright (c) 2016-2020 STMicroelectronics.\n;* All rights reserved.\n;*\n;* This software component is licensed by ST under BSD 3-Clause license,\n;* the \"License\"; You may not use this file except in compliance with the\n;* License. You may obtain a copy of the License at:\n;*                        opensource.org/licenses/BSD-3-Clause\n;*\n;******************************************************************************\n\n#include \"../cmsis_nvic.h\"\n\n#if !defined(MBED_APP_START)\n  #define MBED_APP_START  MBED_ROM_START\n#endif\n\n#if !defined(MBED_APP_SIZE)\n  #define MBED_APP_SIZE  MBED_ROM_SIZE\n#endif\n\n/* This value is normally defined by the tools to 0x1000 for bare metal and 0x400 for RTOS */\n#if !defined(MBED_CONF_TARGET_BOOT_STACK_SIZE)\n#  if defined(MBED_BOOT_STACK_SIZE)\n#    define MBED_CONF_TARGET_BOOT_STACK_SIZE MBED_BOOT_STACK_SIZE\n#  else\n#    define MBED_CONF_TARGET_BOOT_STACK_SIZE 0x400\n#  endif\n#endif\n\n/* Round up VECTORS_SIZE to 8 bytes */\n#define VECTORS_SIZE  (((NVIC_NUM_VECTORS * 4) + 7) AND ~7)\n\nLR_IROM1  MBED_APP_START  MBED_APP_SIZE  {\n\n  ER_IROM1  MBED_APP_START  MBED_APP_SIZE  {\n    *.o (RESET, +First)\n    *(InRoot$$Sections)\n    .ANY (+RO)\n  }\n\n  RW_IRAM1  (MBED_RAM_START + VECTORS_SIZE)  {  ; RW data\n    .ANY (+RW +ZI)\n  }\n\n  ARM_LIB_HEAP  AlignExpr(+0, 16)  EMPTY  (MBED_RAM_START + MBED_RAM_SIZE - MBED_CONF_TARGET_BOOT_STACK_SIZE - AlignExpr(ImageLimit(RW_IRAM1), 16))  { ; Heap growing up\n  }\n\n  ARM_LIB_STACK  (MBED_RAM_START + MBED_RAM_SIZE)  EMPTY  -MBED_CONF_TARGET_BOOT_STACK_SIZE  { ; Stack region growing down\n  }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/cmsis_nvic.h",
    "content": "/* mbed Microcontroller Library\n * SPDX-License-Identifier: BSD-3-Clause\n ******************************************************************************\n * @attention\n *\n * <h2><center>&copy; Copyright (c) 2016-2020 STMicroelectronics.\n * All rights reserved.</center></h2>\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n*/\n\n#ifndef MBED_CMSIS_NVIC_H\n#define MBED_CMSIS_NVIC_H\n\n#if !defined(MBED_ROM_START)\n#define MBED_ROM_START  0x8000000\n#endif\n\n#if !defined(MBED_ROM_SIZE)\n#define MBED_ROM_SIZE  0x40000  // 256 KB\n#endif\n\n#if !defined(MBED_RAM_START)\n#define MBED_RAM_START  0x20000000\n#endif\n\n#if !defined(MBED_RAM_SIZE)\n#define MBED_RAM_SIZE  0xC000  // 48 KB\n#endif\n\n#define NVIC_NUM_VECTORS        76\n#define NVIC_RAM_VECTOR_ADDRESS MBED_RAM_START\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/stm32f103xe.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f103xe.h\n  * @author  MCD Application Team\n  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer Header File. \n  *          This file contains all the peripheral register's definitions, bits \n  *          definitions and memory mapping for STM32F1xx devices.            \n  *            \n  *          This file contains:\n  *           - Data structures and the address mapping for all peripherals\n  *           - Peripheral's registers declarations and bits definition\n  *           - Macros to access peripherals registers hardware\n  *  \n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n\n/** @addtogroup CMSIS\n  * @{\n  */\n\n/** @addtogroup stm32f103xe\n  * @{\n  */\n    \n#ifndef __STM32F103xE_H\n#define __STM32F103xE_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif \n\n/** @addtogroup Configuration_section_for_CMSIS\n  * @{\n  */\n/**\n  * @brief Configuration of the Cortex-M3 Processor and Core Peripherals \n */\n#define __CM3_REV                  0x0200U  /*!< Core Revision r2p0                           */\n #define __MPU_PRESENT             0U       /*!< Other STM32 devices does not provide an MPU  */\n#define __NVIC_PRIO_BITS           4U       /*!< STM32 uses 4 Bits for the Priority Levels    */\n#define __Vendor_SysTickConfig     0U       /*!< Set to 1 if different SysTick Config is used */\n\n/**\n  * @}\n  */\n\n/** @addtogroup Peripheral_interrupt_number_definition\n  * @{\n  */\n\n/**\n * @brief STM32F10x Interrupt Number Definition, according to the selected device \n *        in @ref Library_configuration_section \n */\n\n /*!< Interrupt Number Definition */\ntypedef enum\n{\n/******  Cortex-M3 Processor Exceptions Numbers ***************************************************/\n  NonMaskableInt_IRQn         = -14,    /*!< 2 Non Maskable Interrupt                             */\n  HardFault_IRQn              = -13,    /*!< 3 Cortex-M3 Hard Fault Interrupt                     */\n  MemoryManagement_IRQn       = -12,    /*!< 4 Cortex-M3 Memory Management Interrupt              */\n  BusFault_IRQn               = -11,    /*!< 5 Cortex-M3 Bus Fault Interrupt                      */\n  UsageFault_IRQn             = -10,    /*!< 6 Cortex-M3 Usage Fault Interrupt                    */\n  SVCall_IRQn                 = -5,     /*!< 11 Cortex-M3 SV Call Interrupt                       */\n  DebugMonitor_IRQn           = -4,     /*!< 12 Cortex-M3 Debug Monitor Interrupt                 */\n  PendSV_IRQn                 = -2,     /*!< 14 Cortex-M3 Pend SV Interrupt                       */\n  SysTick_IRQn                = -1,     /*!< 15 Cortex-M3 System Tick Interrupt                   */\n\n/******  STM32 specific Interrupt Numbers *********************************************************/\n  WWDG_IRQn                   = 0,      /*!< Window WatchDog Interrupt                            */\n  PVD_IRQn                    = 1,      /*!< PVD through EXTI Line detection Interrupt            */\n  TAMPER_IRQn                 = 2,      /*!< Tamper Interrupt                                     */\n  RTC_IRQn                    = 3,      /*!< RTC global Interrupt                                 */\n  FLASH_IRQn                  = 4,      /*!< FLASH global Interrupt                               */\n  RCC_IRQn                    = 5,      /*!< RCC global Interrupt                                 */\n  EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                 */\n  EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                 */\n  EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                 */\n  EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                 */\n  EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                 */\n  DMA1_Channel1_IRQn          = 11,     /*!< DMA1 Channel 1 global Interrupt                      */\n  DMA1_Channel2_IRQn          = 12,     /*!< DMA1 Channel 2 global Interrupt                      */\n  DMA1_Channel3_IRQn          = 13,     /*!< DMA1 Channel 3 global Interrupt                      */\n  DMA1_Channel4_IRQn          = 14,     /*!< DMA1 Channel 4 global Interrupt                      */\n  DMA1_Channel5_IRQn          = 15,     /*!< DMA1 Channel 5 global Interrupt                      */\n  DMA1_Channel6_IRQn          = 16,     /*!< DMA1 Channel 6 global Interrupt                      */\n  DMA1_Channel7_IRQn          = 17,     /*!< DMA1 Channel 7 global Interrupt                      */\n  ADC1_2_IRQn                 = 18,     /*!< ADC1 and ADC2 global Interrupt                       */\n  USB_HP_CAN1_TX_IRQn         = 19,     /*!< USB Device High Priority or CAN1 TX Interrupts       */\n  USB_LP_CAN1_RX0_IRQn        = 20,     /*!< USB Device Low Priority or CAN1 RX0 Interrupts       */\n  CAN1_RX1_IRQn               = 21,     /*!< CAN1 RX1 Interrupt                                   */\n  CAN1_SCE_IRQn               = 22,     /*!< CAN1 SCE Interrupt                                   */\n  EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts                        */\n  TIM1_BRK_IRQn               = 24,     /*!< TIM1 Break Interrupt                                 */\n  TIM1_UP_IRQn                = 25,     /*!< TIM1 Update Interrupt                                */\n  TIM1_TRG_COM_IRQn           = 26,     /*!< TIM1 Trigger and Commutation Interrupt               */\n  TIM1_CC_IRQn                = 27,     /*!< TIM1 Capture Compare Interrupt                       */\n  TIM2_IRQn                   = 28,     /*!< TIM2 global Interrupt                                */\n  TIM3_IRQn                   = 29,     /*!< TIM3 global Interrupt                                */\n  TIM4_IRQn                   = 30,     /*!< TIM4 global Interrupt                                */\n  I2C1_EV_IRQn                = 31,     /*!< I2C1 Event Interrupt                                 */\n  I2C1_ER_IRQn                = 32,     /*!< I2C1 Error Interrupt                                 */\n  I2C2_EV_IRQn                = 33,     /*!< I2C2 Event Interrupt                                 */\n  I2C2_ER_IRQn                = 34,     /*!< I2C2 Error Interrupt                                 */\n  SPI1_IRQn                   = 35,     /*!< SPI1 global Interrupt                                */\n  SPI2_IRQn                   = 36,     /*!< SPI2 global Interrupt                                */\n  USART1_IRQn                 = 37,     /*!< USART1 global Interrupt                              */\n  USART2_IRQn                 = 38,     /*!< USART2 global Interrupt                              */\n  USART3_IRQn                 = 39,     /*!< USART3 global Interrupt                              */\n  EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts                      */\n  RTC_Alarm_IRQn              = 41,     /*!< RTC Alarm through EXTI Line Interrupt                */\n  USBWakeUp_IRQn              = 42,     /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */\n  TIM8_BRK_IRQn               = 43,     /*!< TIM8 Break Interrupt                                 */\n  TIM8_UP_IRQn                = 44,     /*!< TIM8 Update Interrupt                                */\n  TIM8_TRG_COM_IRQn           = 45,     /*!< TIM8 Trigger and Commutation Interrupt               */\n  TIM8_CC_IRQn                = 46,     /*!< TIM8 Capture Compare Interrupt                       */\n  ADC3_IRQn                   = 47,     /*!< ADC3 global Interrupt                                */\n  FSMC_IRQn                   = 48,     /*!< FSMC global Interrupt                                */\n  SDIO_IRQn                   = 49,     /*!< SDIO global Interrupt                                */\n  TIM5_IRQn                   = 50,     /*!< TIM5 global Interrupt                                */\n  SPI3_IRQn                   = 51,     /*!< SPI3 global Interrupt                                */\n  UART4_IRQn                  = 52,     /*!< UART4 global Interrupt                               */\n  UART5_IRQn                  = 53,     /*!< UART5 global Interrupt                               */\n  TIM6_IRQn                   = 54,     /*!< TIM6 global Interrupt                                */\n  TIM7_IRQn                   = 55,     /*!< TIM7 global Interrupt                                */\n  DMA2_Channel1_IRQn          = 56,     /*!< DMA2 Channel 1 global Interrupt                      */\n  DMA2_Channel2_IRQn          = 57,     /*!< DMA2 Channel 2 global Interrupt                      */\n  DMA2_Channel3_IRQn          = 58,     /*!< DMA2 Channel 3 global Interrupt                      */\n  DMA2_Channel4_5_IRQn        = 59,     /*!< DMA2 Channel 4 and Channel 5 global Interrupt        */\n} IRQn_Type;\n\n/**\n  * @}\n  */\n\n#include \"core_cm3.h\"\n#include \"system_stm32f1xx.h\"\n#include <stdint.h>\n\n/** @addtogroup Peripheral_registers_structures\n  * @{\n  */   \n\n/** \n  * @brief Analog to Digital Converter  \n  */\n\ntypedef struct\n{\n  __IO uint32_t SR;\n  __IO uint32_t CR1;\n  __IO uint32_t CR2;\n  __IO uint32_t SMPR1;\n  __IO uint32_t SMPR2;\n  __IO uint32_t JOFR1;\n  __IO uint32_t JOFR2;\n  __IO uint32_t JOFR3;\n  __IO uint32_t JOFR4;\n  __IO uint32_t HTR;\n  __IO uint32_t LTR;\n  __IO uint32_t SQR1;\n  __IO uint32_t SQR2;\n  __IO uint32_t SQR3;\n  __IO uint32_t JSQR;\n  __IO uint32_t JDR1;\n  __IO uint32_t JDR2;\n  __IO uint32_t JDR3;\n  __IO uint32_t JDR4;\n  __IO uint32_t DR;\n} ADC_TypeDef;\n\ntypedef struct\n{\n  __IO uint32_t SR;               /*!< ADC status register,    used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address         */\n  __IO uint32_t CR1;              /*!< ADC control register 1, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x04  */\n  __IO uint32_t CR2;              /*!< ADC control register 2, used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x08  */\n  uint32_t  RESERVED[16];\n  __IO uint32_t DR;               /*!< ADC data register,      used for ADC multimode (bits common to several ADC instances). Address offset: ADC1 base address + 0x4C  */\n} ADC_Common_TypeDef;\n\n/** \n  * @brief Backup Registers  \n  */\n\ntypedef struct\n{\n  uint32_t  RESERVED0;\n  __IO uint32_t DR1;\n  __IO uint32_t DR2;\n  __IO uint32_t DR3;\n  __IO uint32_t DR4;\n  __IO uint32_t DR5;\n  __IO uint32_t DR6;\n  __IO uint32_t DR7;\n  __IO uint32_t DR8;\n  __IO uint32_t DR9;\n  __IO uint32_t DR10;\n  __IO uint32_t RTCCR;\n  __IO uint32_t CR;\n  __IO uint32_t CSR;\n  uint32_t  RESERVED13[2];\n  __IO uint32_t DR11;\n  __IO uint32_t DR12;\n  __IO uint32_t DR13;\n  __IO uint32_t DR14;\n  __IO uint32_t DR15;\n  __IO uint32_t DR16;\n  __IO uint32_t DR17;\n  __IO uint32_t DR18;\n  __IO uint32_t DR19;\n  __IO uint32_t DR20;\n  __IO uint32_t DR21;\n  __IO uint32_t DR22;\n  __IO uint32_t DR23;\n  __IO uint32_t DR24;\n  __IO uint32_t DR25;\n  __IO uint32_t DR26;\n  __IO uint32_t DR27;\n  __IO uint32_t DR28;\n  __IO uint32_t DR29;\n  __IO uint32_t DR30;\n  __IO uint32_t DR31;\n  __IO uint32_t DR32;\n  __IO uint32_t DR33;\n  __IO uint32_t DR34;\n  __IO uint32_t DR35;\n  __IO uint32_t DR36;\n  __IO uint32_t DR37;\n  __IO uint32_t DR38;\n  __IO uint32_t DR39;\n  __IO uint32_t DR40;\n  __IO uint32_t DR41;\n  __IO uint32_t DR42;\n} BKP_TypeDef;\n  \n/** \n  * @brief Controller Area Network TxMailBox \n  */\n\ntypedef struct\n{\n  __IO uint32_t TIR;\n  __IO uint32_t TDTR;\n  __IO uint32_t TDLR;\n  __IO uint32_t TDHR;\n} CAN_TxMailBox_TypeDef;\n\n/** \n  * @brief Controller Area Network FIFOMailBox \n  */\n  \ntypedef struct\n{\n  __IO uint32_t RIR;\n  __IO uint32_t RDTR;\n  __IO uint32_t RDLR;\n  __IO uint32_t RDHR;\n} CAN_FIFOMailBox_TypeDef;\n\n/** \n  * @brief Controller Area Network FilterRegister \n  */\n  \ntypedef struct\n{\n  __IO uint32_t FR1;\n  __IO uint32_t FR2;\n} CAN_FilterRegister_TypeDef;\n\n/** \n  * @brief Controller Area Network \n  */\n  \ntypedef struct\n{\n  __IO uint32_t MCR;\n  __IO uint32_t MSR;\n  __IO uint32_t TSR;\n  __IO uint32_t RF0R;\n  __IO uint32_t RF1R;\n  __IO uint32_t IER;\n  __IO uint32_t ESR;\n  __IO uint32_t BTR;\n  uint32_t  RESERVED0[88];\n  CAN_TxMailBox_TypeDef sTxMailBox[3];\n  CAN_FIFOMailBox_TypeDef sFIFOMailBox[2];\n  uint32_t  RESERVED1[12];\n  __IO uint32_t FMR;\n  __IO uint32_t FM1R;\n  uint32_t  RESERVED2;\n  __IO uint32_t FS1R;\n  uint32_t  RESERVED3;\n  __IO uint32_t FFA1R;\n  uint32_t  RESERVED4;\n  __IO uint32_t FA1R;\n  uint32_t  RESERVED5[8];\n  CAN_FilterRegister_TypeDef sFilterRegister[14];\n} CAN_TypeDef;\n\n/** \n  * @brief CRC calculation unit \n  */\n\ntypedef struct\n{\n  __IO uint32_t DR;           /*!< CRC Data register,                           Address offset: 0x00 */\n  __IO uint8_t  IDR;          /*!< CRC Independent data register,               Address offset: 0x04 */\n  uint8_t       RESERVED0;    /*!< Reserved,                                    Address offset: 0x05 */\n  uint16_t      RESERVED1;    /*!< Reserved,                                    Address offset: 0x06 */  \n  __IO uint32_t CR;           /*!< CRC Control register,                        Address offset: 0x08 */ \n} CRC_TypeDef;\n\n/** \n  * @brief Digital to Analog Converter\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR;\n  __IO uint32_t SWTRIGR;\n  __IO uint32_t DHR12R1;\n  __IO uint32_t DHR12L1;\n  __IO uint32_t DHR8R1;\n  __IO uint32_t DHR12R2;\n  __IO uint32_t DHR12L2;\n  __IO uint32_t DHR8R2;\n  __IO uint32_t DHR12RD;\n  __IO uint32_t DHR12LD;\n  __IO uint32_t DHR8RD;\n  __IO uint32_t DOR1;\n  __IO uint32_t DOR2;\n} DAC_TypeDef;\n\n/** \n  * @brief Debug MCU\n  */\n\ntypedef struct\n{\n  __IO uint32_t IDCODE;\n  __IO uint32_t CR;\n}DBGMCU_TypeDef;\n\n/** \n  * @brief DMA Controller\n  */\n\ntypedef struct\n{\n  __IO uint32_t CCR;\n  __IO uint32_t CNDTR;\n  __IO uint32_t CPAR;\n  __IO uint32_t CMAR;\n} DMA_Channel_TypeDef;\n\ntypedef struct\n{\n  __IO uint32_t ISR;\n  __IO uint32_t IFCR;\n} DMA_TypeDef;\n\n\n\n/** \n  * @brief External Interrupt/Event Controller\n  */\n\ntypedef struct\n{\n  __IO uint32_t IMR;\n  __IO uint32_t EMR;\n  __IO uint32_t RTSR;\n  __IO uint32_t FTSR;\n  __IO uint32_t SWIER;\n  __IO uint32_t PR;\n} EXTI_TypeDef;\n\n/** \n  * @brief FLASH Registers\n  */\n\ntypedef struct\n{\n  __IO uint32_t ACR;\n  __IO uint32_t KEYR;\n  __IO uint32_t OPTKEYR;\n  __IO uint32_t SR;\n  __IO uint32_t CR;\n  __IO uint32_t AR;\n  __IO uint32_t RESERVED;\n  __IO uint32_t OBR;\n  __IO uint32_t WRPR;\n} FLASH_TypeDef;\n\n/** \n  * @brief Option Bytes Registers\n  */\n  \ntypedef struct\n{\n  __IO uint16_t RDP;\n  __IO uint16_t USER;\n  __IO uint16_t Data0;\n  __IO uint16_t Data1;\n  __IO uint16_t WRP0;\n  __IO uint16_t WRP1;\n  __IO uint16_t WRP2;\n  __IO uint16_t WRP3;\n} OB_TypeDef;\n\n/** \n  * @brief Flexible Static Memory Controller\n  */\n\ntypedef struct\n{\n  __IO uint32_t BTCR[8];   \n} FSMC_Bank1_TypeDef; \n\n/** \n  * @brief Flexible Static Memory Controller Bank1E\n  */\n  \ntypedef struct\n{\n  __IO uint32_t BWTR[7];\n} FSMC_Bank1E_TypeDef;\n\n/** \n  * @brief Flexible Static Memory Controller Bank2\n  */\n  \ntypedef struct\n{\n  __IO uint32_t PCR2;       /*!< NAND Flash control register 2,                       Address offset: 0x60 */\n  __IO uint32_t SR2;        /*!< NAND Flash FIFO status and interrupt register 2,     Address offset: 0x64 */\n  __IO uint32_t PMEM2;      /*!< NAND Flash Common memory space timing register 2,    Address offset: 0x68 */\n  __IO uint32_t PATT2;      /*!< NAND Flash Attribute memory space timing register 2, Address offset: 0x6C */\n  uint32_t      RESERVED0;  /*!< Reserved, 0x70                                                            */\n  __IO uint32_t ECCR2;      /*!< NAND Flash ECC result registers 2,                   Address offset: 0x74 */\n  uint32_t      RESERVED1;  /*!< Reserved, 0x78                                                            */\n  uint32_t      RESERVED2;  /*!< Reserved, 0x7C                                                            */\n  __IO uint32_t PCR3;       /*!< NAND Flash control register 3,                       Address offset: 0x80 */\n  __IO uint32_t SR3;        /*!< NAND Flash FIFO status and interrupt register 3,     Address offset: 0x84 */\n  __IO uint32_t PMEM3;      /*!< NAND Flash Common memory space timing register 3,    Address offset: 0x88 */\n  __IO uint32_t PATT3;      /*!< NAND Flash Attribute memory space timing register 3, Address offset: 0x8C */\n  uint32_t      RESERVED3;  /*!< Reserved, 0x90                                                            */\n  __IO uint32_t ECCR3;      /*!< NAND Flash ECC result registers 3,                   Address offset: 0x94 */\n} FSMC_Bank2_3_TypeDef;  \n\n/** \n  * @brief Flexible Static Memory Controller Bank4\n  */\n  \ntypedef struct\n{\n  __IO uint32_t PCR4;\n  __IO uint32_t SR4;\n  __IO uint32_t PMEM4;\n  __IO uint32_t PATT4;\n  __IO uint32_t PIO4; \n} FSMC_Bank4_TypeDef; \n\n/** \n  * @brief General Purpose I/O\n  */\n\ntypedef struct\n{\n  __IO uint32_t CRL;\n  __IO uint32_t CRH;\n  __IO uint32_t IDR;\n  __IO uint32_t ODR;\n  __IO uint32_t BSRR;\n  __IO uint32_t BRR;\n  __IO uint32_t LCKR;\n} GPIO_TypeDef;\n\n/** \n  * @brief Alternate Function I/O\n  */\n\ntypedef struct\n{\n  __IO uint32_t EVCR;\n  __IO uint32_t MAPR;\n  __IO uint32_t EXTICR[4];\n  uint32_t RESERVED0;\n  __IO uint32_t MAPR2;  \n} AFIO_TypeDef;\n/** \n  * @brief Inter Integrated Circuit Interface\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR1;\n  __IO uint32_t CR2;\n  __IO uint32_t OAR1;\n  __IO uint32_t OAR2;\n  __IO uint32_t DR;\n  __IO uint32_t SR1;\n  __IO uint32_t SR2;\n  __IO uint32_t CCR;\n  __IO uint32_t TRISE;\n} I2C_TypeDef;\n\n/** \n  * @brief Independent WATCHDOG\n  */\n\ntypedef struct\n{\n  __IO uint32_t KR;           /*!< Key register,                                Address offset: 0x00 */\n  __IO uint32_t PR;           /*!< Prescaler register,                          Address offset: 0x04 */\n  __IO uint32_t RLR;          /*!< Reload register,                             Address offset: 0x08 */\n  __IO uint32_t SR;           /*!< Status register,                             Address offset: 0x0C */\n} IWDG_TypeDef;\n\n/** \n  * @brief Power Control\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR;\n  __IO uint32_t CSR;\n} PWR_TypeDef;\n\n/** \n  * @brief Reset and Clock Control\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR;\n  __IO uint32_t CFGR;\n  __IO uint32_t CIR;\n  __IO uint32_t APB2RSTR;\n  __IO uint32_t APB1RSTR;\n  __IO uint32_t AHBENR;\n  __IO uint32_t APB2ENR;\n  __IO uint32_t APB1ENR;\n  __IO uint32_t BDCR;\n  __IO uint32_t CSR;\n\n\n} RCC_TypeDef;\n\n/** \n  * @brief Real-Time Clock\n  */\n\ntypedef struct\n{\n  __IO uint32_t CRH;\n  __IO uint32_t CRL;\n  __IO uint32_t PRLH;\n  __IO uint32_t PRLL;\n  __IO uint32_t DIVH;\n  __IO uint32_t DIVL;\n  __IO uint32_t CNTH;\n  __IO uint32_t CNTL;\n  __IO uint32_t ALRH;\n  __IO uint32_t ALRL;\n} RTC_TypeDef;\n\n/** \n  * @brief SD host Interface\n  */\n\ntypedef struct\n{\n  __IO uint32_t POWER;\n  __IO uint32_t CLKCR;\n  __IO uint32_t ARG;\n  __IO uint32_t CMD;\n  __I uint32_t RESPCMD;\n  __I uint32_t RESP1;\n  __I uint32_t RESP2;\n  __I uint32_t RESP3;\n  __I uint32_t RESP4;\n  __IO uint32_t DTIMER;\n  __IO uint32_t DLEN;\n  __IO uint32_t DCTRL;\n  __I uint32_t DCOUNT;\n  __I uint32_t STA;\n  __IO uint32_t ICR;\n  __IO uint32_t MASK;\n  uint32_t  RESERVED0[2];\n  __I uint32_t FIFOCNT;\n  uint32_t  RESERVED1[13];\n  __IO uint32_t FIFO;\n} SDIO_TypeDef;\n\n/** \n  * @brief Serial Peripheral Interface\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR1;\n  __IO uint32_t CR2;\n  __IO uint32_t SR;\n  __IO uint32_t DR;\n  __IO uint32_t CRCPR;\n  __IO uint32_t RXCRCR;\n  __IO uint32_t TXCRCR;\n  __IO uint32_t I2SCFGR;\n  __IO uint32_t I2SPR;\n} SPI_TypeDef;\n\n/**\n  * @brief TIM Timers\n  */\ntypedef struct\n{\n  __IO uint32_t CR1;             /*!< TIM control register 1,                      Address offset: 0x00 */\n  __IO uint32_t CR2;             /*!< TIM control register 2,                      Address offset: 0x04 */\n  __IO uint32_t SMCR;            /*!< TIM slave Mode Control register,             Address offset: 0x08 */\n  __IO uint32_t DIER;            /*!< TIM DMA/interrupt enable register,           Address offset: 0x0C */\n  __IO uint32_t SR;              /*!< TIM status register,                         Address offset: 0x10 */\n  __IO uint32_t EGR;             /*!< TIM event generation register,               Address offset: 0x14 */\n  __IO uint32_t CCMR1;           /*!< TIM  capture/compare mode register 1,        Address offset: 0x18 */\n  __IO uint32_t CCMR2;           /*!< TIM  capture/compare mode register 2,        Address offset: 0x1C */\n  __IO uint32_t CCER;            /*!< TIM capture/compare enable register,         Address offset: 0x20 */\n  __IO uint32_t CNT;             /*!< TIM counter register,                        Address offset: 0x24 */\n  __IO uint32_t PSC;             /*!< TIM prescaler register,                      Address offset: 0x28 */\n  __IO uint32_t ARR;             /*!< TIM auto-reload register,                    Address offset: 0x2C */\n  __IO uint32_t RCR;             /*!< TIM  repetition counter register,            Address offset: 0x30 */\n  __IO uint32_t CCR1;            /*!< TIM capture/compare register 1,              Address offset: 0x34 */\n  __IO uint32_t CCR2;            /*!< TIM capture/compare register 2,              Address offset: 0x38 */\n  __IO uint32_t CCR3;            /*!< TIM capture/compare register 3,              Address offset: 0x3C */\n  __IO uint32_t CCR4;            /*!< TIM capture/compare register 4,              Address offset: 0x40 */\n  __IO uint32_t BDTR;            /*!< TIM break and dead-time register,            Address offset: 0x44 */\n  __IO uint32_t DCR;             /*!< TIM DMA control register,                    Address offset: 0x48 */\n  __IO uint32_t DMAR;            /*!< TIM DMA address for full transfer register,  Address offset: 0x4C */\n  __IO uint32_t OR;              /*!< TIM option register,                         Address offset: 0x50 */\n}TIM_TypeDef;\n\n\n/** \n  * @brief Universal Synchronous Asynchronous Receiver Transmitter\n  */\n \ntypedef struct\n{\n  __IO uint32_t SR;         /*!< USART Status register,                   Address offset: 0x00 */\n  __IO uint32_t DR;         /*!< USART Data register,                     Address offset: 0x04 */\n  __IO uint32_t BRR;        /*!< USART Baud rate register,                Address offset: 0x08 */\n  __IO uint32_t CR1;        /*!< USART Control register 1,                Address offset: 0x0C */\n  __IO uint32_t CR2;        /*!< USART Control register 2,                Address offset: 0x10 */\n  __IO uint32_t CR3;        /*!< USART Control register 3,                Address offset: 0x14 */\n  __IO uint32_t GTPR;       /*!< USART Guard time and prescaler register, Address offset: 0x18 */\n} USART_TypeDef;\n\n/** \n  * @brief Universal Serial Bus Full Speed Device\n  */\n  \ntypedef struct\n{\n  __IO uint16_t EP0R;                 /*!< USB Endpoint 0 register,                   Address offset: 0x00 */ \n  __IO uint16_t RESERVED0;            /*!< Reserved */     \n  __IO uint16_t EP1R;                 /*!< USB Endpoint 1 register,                   Address offset: 0x04 */\n  __IO uint16_t RESERVED1;            /*!< Reserved */       \n  __IO uint16_t EP2R;                 /*!< USB Endpoint 2 register,                   Address offset: 0x08 */\n  __IO uint16_t RESERVED2;            /*!< Reserved */       \n  __IO uint16_t EP3R;                 /*!< USB Endpoint 3 register,                   Address offset: 0x0C */ \n  __IO uint16_t RESERVED3;            /*!< Reserved */       \n  __IO uint16_t EP4R;                 /*!< USB Endpoint 4 register,                   Address offset: 0x10 */\n  __IO uint16_t RESERVED4;            /*!< Reserved */       \n  __IO uint16_t EP5R;                 /*!< USB Endpoint 5 register,                   Address offset: 0x14 */\n  __IO uint16_t RESERVED5;            /*!< Reserved */       \n  __IO uint16_t EP6R;                 /*!< USB Endpoint 6 register,                   Address offset: 0x18 */\n  __IO uint16_t RESERVED6;            /*!< Reserved */       \n  __IO uint16_t EP7R;                 /*!< USB Endpoint 7 register,                   Address offset: 0x1C */\n  __IO uint16_t RESERVED7[17];        /*!< Reserved */     \n  __IO uint16_t CNTR;                 /*!< Control register,                          Address offset: 0x40 */\n  __IO uint16_t RESERVED8;            /*!< Reserved */       \n  __IO uint16_t ISTR;                 /*!< Interrupt status register,                 Address offset: 0x44 */\n  __IO uint16_t RESERVED9;            /*!< Reserved */       \n  __IO uint16_t FNR;                  /*!< Frame number register,                     Address offset: 0x48 */\n  __IO uint16_t RESERVEDA;            /*!< Reserved */       \n  __IO uint16_t DADDR;                /*!< Device address register,                   Address offset: 0x4C */\n  __IO uint16_t RESERVEDB;            /*!< Reserved */       \n  __IO uint16_t BTABLE;               /*!< Buffer Table address register,             Address offset: 0x50 */\n  __IO uint16_t RESERVEDC;            /*!< Reserved */       \n} USB_TypeDef;\n\n\n/** \n  * @brief Window WATCHDOG\n  */\n\ntypedef struct\n{\n  __IO uint32_t CR;   /*!< WWDG Control register,       Address offset: 0x00 */\n  __IO uint32_t CFR;  /*!< WWDG Configuration register, Address offset: 0x04 */\n  __IO uint32_t SR;   /*!< WWDG Status register,        Address offset: 0x08 */\n} WWDG_TypeDef;\n\n/**\n  * @}\n  */\n  \n/** @addtogroup Peripheral_memory_map\n  * @{\n  */\n\n\n#define FLASH_BASE            0x08000000UL /*!< FLASH base address in the alias region */\n#define FLASH_BANK1_END       0x0807FFFFUL /*!< FLASH END address of bank1 */\n#define SRAM_BASE             0x20000000UL /*!< SRAM base address in the alias region */\n#define PERIPH_BASE           0x40000000UL /*!< Peripheral base address in the alias region */\n\n#define SRAM_BB_BASE          0x22000000UL /*!< SRAM base address in the bit-band region */\n#define PERIPH_BB_BASE        0x42000000UL /*!< Peripheral base address in the bit-band region */\n\n#define FSMC_BASE             0x60000000UL /*!< FSMC base address */\n#define FSMC_R_BASE           0xA0000000UL /*!< FSMC registers base address */\n\n/*!< Peripheral memory map */\n#define APB1PERIPH_BASE       PERIPH_BASE\n#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000UL)\n#define AHBPERIPH_BASE        (PERIPH_BASE + 0x00020000UL)\n\n#define TIM2_BASE             (APB1PERIPH_BASE + 0x00000000UL)\n#define TIM3_BASE             (APB1PERIPH_BASE + 0x00000400UL)\n#define TIM4_BASE             (APB1PERIPH_BASE + 0x00000800UL)\n#define TIM5_BASE             (APB1PERIPH_BASE + 0x00000C00UL)\n#define TIM6_BASE             (APB1PERIPH_BASE + 0x00001000UL)\n#define TIM7_BASE             (APB1PERIPH_BASE + 0x00001400UL)\n#define RTC_BASE              (APB1PERIPH_BASE + 0x00002800UL)\n#define WWDG_BASE             (APB1PERIPH_BASE + 0x00002C00UL)\n#define IWDG_BASE             (APB1PERIPH_BASE + 0x00003000UL)\n#define SPI2_BASE             (APB1PERIPH_BASE + 0x00003800UL)\n#define SPI3_BASE             (APB1PERIPH_BASE + 0x00003C00UL)\n#define USART2_BASE           (APB1PERIPH_BASE + 0x00004400UL)\n#define USART3_BASE           (APB1PERIPH_BASE + 0x00004800UL)\n#define UART4_BASE            (APB1PERIPH_BASE + 0x00004C00UL)\n#define UART5_BASE            (APB1PERIPH_BASE + 0x00005000UL)\n#define I2C1_BASE             (APB1PERIPH_BASE + 0x00005400UL)\n#define I2C2_BASE             (APB1PERIPH_BASE + 0x00005800UL)\n#define CAN1_BASE             (APB1PERIPH_BASE + 0x00006400UL)\n#define BKP_BASE              (APB1PERIPH_BASE + 0x00006C00UL)\n#define PWR_BASE              (APB1PERIPH_BASE + 0x00007000UL)\n#define DAC_BASE              (APB1PERIPH_BASE + 0x00007400UL)\n#define AFIO_BASE             (APB2PERIPH_BASE + 0x00000000UL)\n#define EXTI_BASE             (APB2PERIPH_BASE + 0x00000400UL)\n#define GPIOA_BASE            (APB2PERIPH_BASE + 0x00000800UL)\n#define GPIOB_BASE            (APB2PERIPH_BASE + 0x00000C00UL)\n#define GPIOC_BASE            (APB2PERIPH_BASE + 0x00001000UL)\n#define GPIOD_BASE            (APB2PERIPH_BASE + 0x00001400UL)\n#define GPIOE_BASE            (APB2PERIPH_BASE + 0x00001800UL)\n#define GPIOF_BASE            (APB2PERIPH_BASE + 0x00001C00UL)\n#define GPIOG_BASE            (APB2PERIPH_BASE + 0x00002000UL)\n#define ADC1_BASE             (APB2PERIPH_BASE + 0x00002400UL)\n#define ADC2_BASE             (APB2PERIPH_BASE + 0x00002800UL)\n#define TIM1_BASE             (APB2PERIPH_BASE + 0x00002C00UL)\n#define SPI1_BASE             (APB2PERIPH_BASE + 0x00003000UL)\n#define TIM8_BASE             (APB2PERIPH_BASE + 0x00003400UL)\n#define USART1_BASE           (APB2PERIPH_BASE + 0x00003800UL)\n#define ADC3_BASE             (APB2PERIPH_BASE + 0x00003C00UL)\n\n#define SDIO_BASE             (PERIPH_BASE + 0x00018000UL)\n\n#define DMA1_BASE             (AHBPERIPH_BASE + 0x00000000UL)\n#define DMA1_Channel1_BASE    (AHBPERIPH_BASE + 0x00000008UL)\n#define DMA1_Channel2_BASE    (AHBPERIPH_BASE + 0x0000001CUL)\n#define DMA1_Channel3_BASE    (AHBPERIPH_BASE + 0x00000030UL)\n#define DMA1_Channel4_BASE    (AHBPERIPH_BASE + 0x00000044UL)\n#define DMA1_Channel5_BASE    (AHBPERIPH_BASE + 0x00000058UL)\n#define DMA1_Channel6_BASE    (AHBPERIPH_BASE + 0x0000006CUL)\n#define DMA1_Channel7_BASE    (AHBPERIPH_BASE + 0x00000080UL)\n#define DMA2_BASE             (AHBPERIPH_BASE + 0x00000400UL)\n#define DMA2_Channel1_BASE    (AHBPERIPH_BASE + 0x00000408UL)\n#define DMA2_Channel2_BASE    (AHBPERIPH_BASE + 0x0000041CUL)\n#define DMA2_Channel3_BASE    (AHBPERIPH_BASE + 0x00000430UL)\n#define DMA2_Channel4_BASE    (AHBPERIPH_BASE + 0x00000444UL)\n#define DMA2_Channel5_BASE    (AHBPERIPH_BASE + 0x00000458UL)\n#define RCC_BASE              (AHBPERIPH_BASE + 0x00001000UL)\n#define CRC_BASE              (AHBPERIPH_BASE + 0x00003000UL)\n\n#define FLASH_R_BASE          (AHBPERIPH_BASE + 0x00002000UL) /*!< Flash registers base address */\n#define FLASHSIZE_BASE        0x1FFFF7E0UL    /*!< FLASH Size register base address */\n#define UID_BASE              0x1FFFF7E8UL    /*!< Unique device ID register base address */\n#define OB_BASE               0x1FFFF800UL    /*!< Flash Option Bytes base address */\n\n\n#define FSMC_BANK1            (FSMC_BASE)               /*!< FSMC Bank1 base address */\n#define FSMC_BANK1_1          (FSMC_BANK1)              /*!< FSMC Bank1_1 base address */\n#define FSMC_BANK1_2          (FSMC_BANK1 + 0x04000000UL) /*!< FSMC Bank1_2 base address */\n#define FSMC_BANK1_3          (FSMC_BANK1 + 0x08000000UL) /*!< FSMC Bank1_3 base address */\n#define FSMC_BANK1_4          (FSMC_BANK1 + 0x0C000000UL) /*!< FSMC Bank1_4 base address */\n\n#define FSMC_BANK2            (FSMC_BASE + 0x10000000UL)  /*!< FSMC Bank2 base address */\n#define FSMC_BANK3            (FSMC_BASE + 0x20000000UL)  /*!< FSMC Bank3 base address */\n#define FSMC_BANK4            (FSMC_BASE + 0x30000000UL)  /*!< FSMC Bank4 base address */\n\n#define FSMC_BANK1_R_BASE     (FSMC_R_BASE + 0x00000000UL)    /*!< FSMC Bank1 registers base address */\n#define FSMC_BANK1E_R_BASE    (FSMC_R_BASE + 0x00000104UL)    /*!< FSMC Bank1E registers base address */\n#define FSMC_BANK2_3_R_BASE   (FSMC_R_BASE + 0x00000060UL)    /*!< FSMC Bank2/Bank3 registers base address */\n#define FSMC_BANK4_R_BASE     (FSMC_R_BASE + 0x000000A0UL)    /*!< FSMC Bank4 registers base address */\n\n#define DBGMCU_BASE          0xE0042000UL /*!< Debug MCU registers base address */\n\n/* USB device FS */\n#define USB_BASE              (APB1PERIPH_BASE + 0x00005C00UL) /*!< USB_IP Peripheral Registers base address */\n#define USB_PMAADDR           (APB1PERIPH_BASE + 0x00006000UL) /*!< USB_IP Packet Memory Area base address */\n\n\n/**\n  * @}\n  */\n  \n/** @addtogroup Peripheral_declaration\n  * @{\n  */  \n\n#define TIM2                ((TIM_TypeDef *)TIM2_BASE)\n#define TIM3                ((TIM_TypeDef *)TIM3_BASE)\n#define TIM4                ((TIM_TypeDef *)TIM4_BASE)\n#define TIM5                ((TIM_TypeDef *)TIM5_BASE)\n#define TIM6                ((TIM_TypeDef *)TIM6_BASE)\n#define TIM7                ((TIM_TypeDef *)TIM7_BASE)\n#define RTC                 ((RTC_TypeDef *)RTC_BASE)\n#define WWDG                ((WWDG_TypeDef *)WWDG_BASE)\n#define IWDG                ((IWDG_TypeDef *)IWDG_BASE)\n#define SPI2                ((SPI_TypeDef *)SPI2_BASE)\n#define SPI3                ((SPI_TypeDef *)SPI3_BASE)\n#define USART2              ((USART_TypeDef *)USART2_BASE)\n#define USART3              ((USART_TypeDef *)USART3_BASE)\n#define UART4               ((USART_TypeDef *)UART4_BASE)\n#define UART5               ((USART_TypeDef *)UART5_BASE)\n#define I2C1                ((I2C_TypeDef *)I2C1_BASE)\n#define I2C2                ((I2C_TypeDef *)I2C2_BASE)\n#define USB                 ((USB_TypeDef *)USB_BASE)\n#define CAN1                ((CAN_TypeDef *)CAN1_BASE)\n#define BKP                 ((BKP_TypeDef *)BKP_BASE)\n#define PWR                 ((PWR_TypeDef *)PWR_BASE)\n#define DAC1                ((DAC_TypeDef *)DAC_BASE)\n#define DAC                 ((DAC_TypeDef *)DAC_BASE) /* Kept for legacy purpose */\n#define AFIO                ((AFIO_TypeDef *)AFIO_BASE)\n#define EXTI                ((EXTI_TypeDef *)EXTI_BASE)\n#define GPIOA               ((GPIO_TypeDef *)GPIOA_BASE)\n#define GPIOB               ((GPIO_TypeDef *)GPIOB_BASE)\n#define GPIOC               ((GPIO_TypeDef *)GPIOC_BASE)\n#define GPIOD               ((GPIO_TypeDef *)GPIOD_BASE)\n#define GPIOE               ((GPIO_TypeDef *)GPIOE_BASE)\n#define GPIOF               ((GPIO_TypeDef *)GPIOF_BASE)\n#define GPIOG               ((GPIO_TypeDef *)GPIOG_BASE)\n#define ADC1                ((ADC_TypeDef *)ADC1_BASE)\n#define ADC2                ((ADC_TypeDef *)ADC2_BASE)\n#define ADC3                ((ADC_TypeDef *)ADC3_BASE)\n#define ADC12_COMMON        ((ADC_Common_TypeDef *)ADC1_BASE)\n#define TIM1                ((TIM_TypeDef *)TIM1_BASE)\n#define SPI1                ((SPI_TypeDef *)SPI1_BASE)\n#define TIM8                ((TIM_TypeDef *)TIM8_BASE)\n#define USART1              ((USART_TypeDef *)USART1_BASE)\n#define SDIO                ((SDIO_TypeDef *)SDIO_BASE)\n#define DMA1                ((DMA_TypeDef *)DMA1_BASE)\n#define DMA2                ((DMA_TypeDef *)DMA2_BASE)\n#define DMA1_Channel1       ((DMA_Channel_TypeDef *)DMA1_Channel1_BASE)\n#define DMA1_Channel2       ((DMA_Channel_TypeDef *)DMA1_Channel2_BASE)\n#define DMA1_Channel3       ((DMA_Channel_TypeDef *)DMA1_Channel3_BASE)\n#define DMA1_Channel4       ((DMA_Channel_TypeDef *)DMA1_Channel4_BASE)\n#define DMA1_Channel5       ((DMA_Channel_TypeDef *)DMA1_Channel5_BASE)\n#define DMA1_Channel6       ((DMA_Channel_TypeDef *)DMA1_Channel6_BASE)\n#define DMA1_Channel7       ((DMA_Channel_TypeDef *)DMA1_Channel7_BASE)\n#define DMA2_Channel1       ((DMA_Channel_TypeDef *)DMA2_Channel1_BASE)\n#define DMA2_Channel2       ((DMA_Channel_TypeDef *)DMA2_Channel2_BASE)\n#define DMA2_Channel3       ((DMA_Channel_TypeDef *)DMA2_Channel3_BASE)\n#define DMA2_Channel4       ((DMA_Channel_TypeDef *)DMA2_Channel4_BASE)\n#define DMA2_Channel5       ((DMA_Channel_TypeDef *)DMA2_Channel5_BASE)\n#define RCC                 ((RCC_TypeDef *)RCC_BASE)\n#define CRC                 ((CRC_TypeDef *)CRC_BASE)\n#define FLASH               ((FLASH_TypeDef *)FLASH_R_BASE)\n#define OB                  ((OB_TypeDef *)OB_BASE)\n#define FSMC_Bank1          ((FSMC_Bank1_TypeDef *)FSMC_BANK1_R_BASE)\n#define FSMC_Bank1E         ((FSMC_Bank1E_TypeDef *)FSMC_BANK1E_R_BASE)\n#define FSMC_Bank2_3        ((FSMC_Bank2_3_TypeDef *)FSMC_BANK2_3_R_BASE)\n#define FSMC_Bank4          ((FSMC_Bank4_TypeDef *)FSMC_BANK4_R_BASE)\n#define DBGMCU              ((DBGMCU_TypeDef *)DBGMCU_BASE)\n\n\n/**\n  * @}\n  */\n\n/** @addtogroup Exported_constants\n  * @{\n  */\n  \n  /** @addtogroup Peripheral_Registers_Bits_Definition\n  * @{\n  */\n    \n/******************************************************************************/\n/*                         Peripheral Registers_Bits_Definition               */\n/******************************************************************************/\n\n/******************************************************************************/\n/*                                                                            */\n/*                       CRC calculation unit (CRC)                           */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for CRC_DR register  *********************/\n#define CRC_DR_DR_Pos                       (0U)                               \n#define CRC_DR_DR_Msk                       (0xFFFFFFFFUL << CRC_DR_DR_Pos)     /*!< 0xFFFFFFFF */\n#define CRC_DR_DR                           CRC_DR_DR_Msk                      /*!< Data register bits */\n\n/*******************  Bit definition for CRC_IDR register  ********************/\n#define CRC_IDR_IDR_Pos                     (0U)                               \n#define CRC_IDR_IDR_Msk                     (0xFFUL << CRC_IDR_IDR_Pos)         /*!< 0x000000FF */\n#define CRC_IDR_IDR                         CRC_IDR_IDR_Msk                    /*!< General-purpose 8-bit data register bits */\n\n/********************  Bit definition for CRC_CR register  ********************/\n#define CRC_CR_RESET_Pos                    (0U)                               \n#define CRC_CR_RESET_Msk                    (0x1UL << CRC_CR_RESET_Pos)         /*!< 0x00000001 */\n#define CRC_CR_RESET                        CRC_CR_RESET_Msk                   /*!< RESET bit */\n\n/******************************************************************************/\n/*                                                                            */\n/*                             Power Control                                  */\n/*                                                                            */\n/******************************************************************************/\n\n/********************  Bit definition for PWR_CR register  ********************/\n#define PWR_CR_LPDS_Pos                     (0U)                               \n#define PWR_CR_LPDS_Msk                     (0x1UL << PWR_CR_LPDS_Pos)          /*!< 0x00000001 */\n#define PWR_CR_LPDS                         PWR_CR_LPDS_Msk                    /*!< Low-Power Deepsleep */\n#define PWR_CR_PDDS_Pos                     (1U)                               \n#define PWR_CR_PDDS_Msk                     (0x1UL << PWR_CR_PDDS_Pos)          /*!< 0x00000002 */\n#define PWR_CR_PDDS                         PWR_CR_PDDS_Msk                    /*!< Power Down Deepsleep */\n#define PWR_CR_CWUF_Pos                     (2U)                               \n#define PWR_CR_CWUF_Msk                     (0x1UL << PWR_CR_CWUF_Pos)          /*!< 0x00000004 */\n#define PWR_CR_CWUF                         PWR_CR_CWUF_Msk                    /*!< Clear Wakeup Flag */\n#define PWR_CR_CSBF_Pos                     (3U)                               \n#define PWR_CR_CSBF_Msk                     (0x1UL << PWR_CR_CSBF_Pos)          /*!< 0x00000008 */\n#define PWR_CR_CSBF                         PWR_CR_CSBF_Msk                    /*!< Clear Standby Flag */\n#define PWR_CR_PVDE_Pos                     (4U)                               \n#define PWR_CR_PVDE_Msk                     (0x1UL << PWR_CR_PVDE_Pos)          /*!< 0x00000010 */\n#define PWR_CR_PVDE                         PWR_CR_PVDE_Msk                    /*!< Power Voltage Detector Enable */\n\n#define PWR_CR_PLS_Pos                      (5U)                               \n#define PWR_CR_PLS_Msk                      (0x7UL << PWR_CR_PLS_Pos)           /*!< 0x000000E0 */\n#define PWR_CR_PLS                          PWR_CR_PLS_Msk                     /*!< PLS[2:0] bits (PVD Level Selection) */\n#define PWR_CR_PLS_0                        (0x1UL << PWR_CR_PLS_Pos)           /*!< 0x00000020 */\n#define PWR_CR_PLS_1                        (0x2UL << PWR_CR_PLS_Pos)           /*!< 0x00000040 */\n#define PWR_CR_PLS_2                        (0x4UL << PWR_CR_PLS_Pos)           /*!< 0x00000080 */\n\n/*!< PVD level configuration */\n#define PWR_CR_PLS_LEV0                      0x00000000U                           /*!< PVD level 2.2V */\n#define PWR_CR_PLS_LEV1                      0x00000020U                           /*!< PVD level 2.3V */\n#define PWR_CR_PLS_LEV2                      0x00000040U                           /*!< PVD level 2.4V */\n#define PWR_CR_PLS_LEV3                      0x00000060U                           /*!< PVD level 2.5V */\n#define PWR_CR_PLS_LEV4                      0x00000080U                           /*!< PVD level 2.6V */\n#define PWR_CR_PLS_LEV5                      0x000000A0U                           /*!< PVD level 2.7V */\n#define PWR_CR_PLS_LEV6                      0x000000C0U                           /*!< PVD level 2.8V */\n#define PWR_CR_PLS_LEV7                      0x000000E0U                           /*!< PVD level 2.9V */\n\n/* Legacy defines */\n#define PWR_CR_PLS_2V2                       PWR_CR_PLS_LEV0\n#define PWR_CR_PLS_2V3                       PWR_CR_PLS_LEV1\n#define PWR_CR_PLS_2V4                       PWR_CR_PLS_LEV2\n#define PWR_CR_PLS_2V5                       PWR_CR_PLS_LEV3\n#define PWR_CR_PLS_2V6                       PWR_CR_PLS_LEV4\n#define PWR_CR_PLS_2V7                       PWR_CR_PLS_LEV5\n#define PWR_CR_PLS_2V8                       PWR_CR_PLS_LEV6\n#define PWR_CR_PLS_2V9                       PWR_CR_PLS_LEV7\n\n#define PWR_CR_DBP_Pos                      (8U)                               \n#define PWR_CR_DBP_Msk                      (0x1UL << PWR_CR_DBP_Pos)           /*!< 0x00000100 */\n#define PWR_CR_DBP                          PWR_CR_DBP_Msk                     /*!< Disable Backup Domain write protection */\n\n\n/*******************  Bit definition for PWR_CSR register  ********************/\n#define PWR_CSR_WUF_Pos                     (0U)                               \n#define PWR_CSR_WUF_Msk                     (0x1UL << PWR_CSR_WUF_Pos)          /*!< 0x00000001 */\n#define PWR_CSR_WUF                         PWR_CSR_WUF_Msk                    /*!< Wakeup Flag */\n#define PWR_CSR_SBF_Pos                     (1U)                               \n#define PWR_CSR_SBF_Msk                     (0x1UL << PWR_CSR_SBF_Pos)          /*!< 0x00000002 */\n#define PWR_CSR_SBF                         PWR_CSR_SBF_Msk                    /*!< Standby Flag */\n#define PWR_CSR_PVDO_Pos                    (2U)                               \n#define PWR_CSR_PVDO_Msk                    (0x1UL << PWR_CSR_PVDO_Pos)         /*!< 0x00000004 */\n#define PWR_CSR_PVDO                        PWR_CSR_PVDO_Msk                   /*!< PVD Output */\n#define PWR_CSR_EWUP_Pos                    (8U)                               \n#define PWR_CSR_EWUP_Msk                    (0x1UL << PWR_CSR_EWUP_Pos)         /*!< 0x00000100 */\n#define PWR_CSR_EWUP                        PWR_CSR_EWUP_Msk                   /*!< Enable WKUP pin */\n\n/******************************************************************************/\n/*                                                                            */\n/*                            Backup registers                                */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for BKP_DR1 register  ********************/\n#define BKP_DR1_D_Pos                       (0U)                               \n#define BKP_DR1_D_Msk                       (0xFFFFUL << BKP_DR1_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR1_D                           BKP_DR1_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR2 register  ********************/\n#define BKP_DR2_D_Pos                       (0U)                               \n#define BKP_DR2_D_Msk                       (0xFFFFUL << BKP_DR2_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR2_D                           BKP_DR2_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR3 register  ********************/\n#define BKP_DR3_D_Pos                       (0U)                               \n#define BKP_DR3_D_Msk                       (0xFFFFUL << BKP_DR3_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR3_D                           BKP_DR3_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR4 register  ********************/\n#define BKP_DR4_D_Pos                       (0U)                               \n#define BKP_DR4_D_Msk                       (0xFFFFUL << BKP_DR4_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR4_D                           BKP_DR4_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR5 register  ********************/\n#define BKP_DR5_D_Pos                       (0U)                               \n#define BKP_DR5_D_Msk                       (0xFFFFUL << BKP_DR5_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR5_D                           BKP_DR5_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR6 register  ********************/\n#define BKP_DR6_D_Pos                       (0U)                               \n#define BKP_DR6_D_Msk                       (0xFFFFUL << BKP_DR6_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR6_D                           BKP_DR6_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR7 register  ********************/\n#define BKP_DR7_D_Pos                       (0U)                               \n#define BKP_DR7_D_Msk                       (0xFFFFUL << BKP_DR7_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR7_D                           BKP_DR7_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR8 register  ********************/\n#define BKP_DR8_D_Pos                       (0U)                               \n#define BKP_DR8_D_Msk                       (0xFFFFUL << BKP_DR8_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR8_D                           BKP_DR8_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR9 register  ********************/\n#define BKP_DR9_D_Pos                       (0U)                               \n#define BKP_DR9_D_Msk                       (0xFFFFUL << BKP_DR9_D_Pos)         /*!< 0x0000FFFF */\n#define BKP_DR9_D                           BKP_DR9_D_Msk                      /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR10 register  *******************/\n#define BKP_DR10_D_Pos                      (0U)                               \n#define BKP_DR10_D_Msk                      (0xFFFFUL << BKP_DR10_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR10_D                          BKP_DR10_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR11 register  *******************/\n#define BKP_DR11_D_Pos                      (0U)                               \n#define BKP_DR11_D_Msk                      (0xFFFFUL << BKP_DR11_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR11_D                          BKP_DR11_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR12 register  *******************/\n#define BKP_DR12_D_Pos                      (0U)                               \n#define BKP_DR12_D_Msk                      (0xFFFFUL << BKP_DR12_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR12_D                          BKP_DR12_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR13 register  *******************/\n#define BKP_DR13_D_Pos                      (0U)                               \n#define BKP_DR13_D_Msk                      (0xFFFFUL << BKP_DR13_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR13_D                          BKP_DR13_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR14 register  *******************/\n#define BKP_DR14_D_Pos                      (0U)                               \n#define BKP_DR14_D_Msk                      (0xFFFFUL << BKP_DR14_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR14_D                          BKP_DR14_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR15 register  *******************/\n#define BKP_DR15_D_Pos                      (0U)                               \n#define BKP_DR15_D_Msk                      (0xFFFFUL << BKP_DR15_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR15_D                          BKP_DR15_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR16 register  *******************/\n#define BKP_DR16_D_Pos                      (0U)                               \n#define BKP_DR16_D_Msk                      (0xFFFFUL << BKP_DR16_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR16_D                          BKP_DR16_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR17 register  *******************/\n#define BKP_DR17_D_Pos                      (0U)                               \n#define BKP_DR17_D_Msk                      (0xFFFFUL << BKP_DR17_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR17_D                          BKP_DR17_D_Msk                     /*!< Backup data */\n\n/******************  Bit definition for BKP_DR18 register  ********************/\n#define BKP_DR18_D_Pos                      (0U)                               \n#define BKP_DR18_D_Msk                      (0xFFFFUL << BKP_DR18_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR18_D                          BKP_DR18_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR19 register  *******************/\n#define BKP_DR19_D_Pos                      (0U)                               \n#define BKP_DR19_D_Msk                      (0xFFFFUL << BKP_DR19_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR19_D                          BKP_DR19_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR20 register  *******************/\n#define BKP_DR20_D_Pos                      (0U)                               \n#define BKP_DR20_D_Msk                      (0xFFFFUL << BKP_DR20_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR20_D                          BKP_DR20_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR21 register  *******************/\n#define BKP_DR21_D_Pos                      (0U)                               \n#define BKP_DR21_D_Msk                      (0xFFFFUL << BKP_DR21_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR21_D                          BKP_DR21_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR22 register  *******************/\n#define BKP_DR22_D_Pos                      (0U)                               \n#define BKP_DR22_D_Msk                      (0xFFFFUL << BKP_DR22_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR22_D                          BKP_DR22_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR23 register  *******************/\n#define BKP_DR23_D_Pos                      (0U)                               \n#define BKP_DR23_D_Msk                      (0xFFFFUL << BKP_DR23_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR23_D                          BKP_DR23_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR24 register  *******************/\n#define BKP_DR24_D_Pos                      (0U)                               \n#define BKP_DR24_D_Msk                      (0xFFFFUL << BKP_DR24_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR24_D                          BKP_DR24_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR25 register  *******************/\n#define BKP_DR25_D_Pos                      (0U)                               \n#define BKP_DR25_D_Msk                      (0xFFFFUL << BKP_DR25_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR25_D                          BKP_DR25_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR26 register  *******************/\n#define BKP_DR26_D_Pos                      (0U)                               \n#define BKP_DR26_D_Msk                      (0xFFFFUL << BKP_DR26_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR26_D                          BKP_DR26_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR27 register  *******************/\n#define BKP_DR27_D_Pos                      (0U)                               \n#define BKP_DR27_D_Msk                      (0xFFFFUL << BKP_DR27_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR27_D                          BKP_DR27_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR28 register  *******************/\n#define BKP_DR28_D_Pos                      (0U)                               \n#define BKP_DR28_D_Msk                      (0xFFFFUL << BKP_DR28_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR28_D                          BKP_DR28_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR29 register  *******************/\n#define BKP_DR29_D_Pos                      (0U)                               \n#define BKP_DR29_D_Msk                      (0xFFFFUL << BKP_DR29_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR29_D                          BKP_DR29_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR30 register  *******************/\n#define BKP_DR30_D_Pos                      (0U)                               \n#define BKP_DR30_D_Msk                      (0xFFFFUL << BKP_DR30_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR30_D                          BKP_DR30_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR31 register  *******************/\n#define BKP_DR31_D_Pos                      (0U)                               \n#define BKP_DR31_D_Msk                      (0xFFFFUL << BKP_DR31_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR31_D                          BKP_DR31_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR32 register  *******************/\n#define BKP_DR32_D_Pos                      (0U)                               \n#define BKP_DR32_D_Msk                      (0xFFFFUL << BKP_DR32_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR32_D                          BKP_DR32_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR33 register  *******************/\n#define BKP_DR33_D_Pos                      (0U)                               \n#define BKP_DR33_D_Msk                      (0xFFFFUL << BKP_DR33_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR33_D                          BKP_DR33_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR34 register  *******************/\n#define BKP_DR34_D_Pos                      (0U)                               \n#define BKP_DR34_D_Msk                      (0xFFFFUL << BKP_DR34_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR34_D                          BKP_DR34_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR35 register  *******************/\n#define BKP_DR35_D_Pos                      (0U)                               \n#define BKP_DR35_D_Msk                      (0xFFFFUL << BKP_DR35_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR35_D                          BKP_DR35_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR36 register  *******************/\n#define BKP_DR36_D_Pos                      (0U)                               \n#define BKP_DR36_D_Msk                      (0xFFFFUL << BKP_DR36_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR36_D                          BKP_DR36_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR37 register  *******************/\n#define BKP_DR37_D_Pos                      (0U)                               \n#define BKP_DR37_D_Msk                      (0xFFFFUL << BKP_DR37_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR37_D                          BKP_DR37_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR38 register  *******************/\n#define BKP_DR38_D_Pos                      (0U)                               \n#define BKP_DR38_D_Msk                      (0xFFFFUL << BKP_DR38_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR38_D                          BKP_DR38_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR39 register  *******************/\n#define BKP_DR39_D_Pos                      (0U)                               \n#define BKP_DR39_D_Msk                      (0xFFFFUL << BKP_DR39_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR39_D                          BKP_DR39_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR40 register  *******************/\n#define BKP_DR40_D_Pos                      (0U)                               \n#define BKP_DR40_D_Msk                      (0xFFFFUL << BKP_DR40_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR40_D                          BKP_DR40_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR41 register  *******************/\n#define BKP_DR41_D_Pos                      (0U)                               \n#define BKP_DR41_D_Msk                      (0xFFFFUL << BKP_DR41_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR41_D                          BKP_DR41_D_Msk                     /*!< Backup data */\n\n/*******************  Bit definition for BKP_DR42 register  *******************/\n#define BKP_DR42_D_Pos                      (0U)                               \n#define BKP_DR42_D_Msk                      (0xFFFFUL << BKP_DR42_D_Pos)        /*!< 0x0000FFFF */\n#define BKP_DR42_D                          BKP_DR42_D_Msk                     /*!< Backup data */\n\n#define RTC_BKP_NUMBER 42\n\n/******************  Bit definition for BKP_RTCCR register  *******************/\n#define BKP_RTCCR_CAL_Pos                   (0U)                               \n#define BKP_RTCCR_CAL_Msk                   (0x7FUL << BKP_RTCCR_CAL_Pos)       /*!< 0x0000007F */\n#define BKP_RTCCR_CAL                       BKP_RTCCR_CAL_Msk                  /*!< Calibration value */\n#define BKP_RTCCR_CCO_Pos                   (7U)                               \n#define BKP_RTCCR_CCO_Msk                   (0x1UL << BKP_RTCCR_CCO_Pos)        /*!< 0x00000080 */\n#define BKP_RTCCR_CCO                       BKP_RTCCR_CCO_Msk                  /*!< Calibration Clock Output */\n#define BKP_RTCCR_ASOE_Pos                  (8U)                               \n#define BKP_RTCCR_ASOE_Msk                  (0x1UL << BKP_RTCCR_ASOE_Pos)       /*!< 0x00000100 */\n#define BKP_RTCCR_ASOE                      BKP_RTCCR_ASOE_Msk                 /*!< Alarm or Second Output Enable */\n#define BKP_RTCCR_ASOS_Pos                  (9U)                               \n#define BKP_RTCCR_ASOS_Msk                  (0x1UL << BKP_RTCCR_ASOS_Pos)       /*!< 0x00000200 */\n#define BKP_RTCCR_ASOS                      BKP_RTCCR_ASOS_Msk                 /*!< Alarm or Second Output Selection */\n\n/********************  Bit definition for BKP_CR register  ********************/\n#define BKP_CR_TPE_Pos                      (0U)                               \n#define BKP_CR_TPE_Msk                      (0x1UL << BKP_CR_TPE_Pos)           /*!< 0x00000001 */\n#define BKP_CR_TPE                          BKP_CR_TPE_Msk                     /*!< TAMPER pin enable */\n#define BKP_CR_TPAL_Pos                     (1U)                               \n#define BKP_CR_TPAL_Msk                     (0x1UL << BKP_CR_TPAL_Pos)          /*!< 0x00000002 */\n#define BKP_CR_TPAL                         BKP_CR_TPAL_Msk                    /*!< TAMPER pin active level */\n\n/*******************  Bit definition for BKP_CSR register  ********************/\n#define BKP_CSR_CTE_Pos                     (0U)                               \n#define BKP_CSR_CTE_Msk                     (0x1UL << BKP_CSR_CTE_Pos)          /*!< 0x00000001 */\n#define BKP_CSR_CTE                         BKP_CSR_CTE_Msk                    /*!< Clear Tamper event */\n#define BKP_CSR_CTI_Pos                     (1U)                               \n#define BKP_CSR_CTI_Msk                     (0x1UL << BKP_CSR_CTI_Pos)          /*!< 0x00000002 */\n#define BKP_CSR_CTI                         BKP_CSR_CTI_Msk                    /*!< Clear Tamper Interrupt */\n#define BKP_CSR_TPIE_Pos                    (2U)                               \n#define BKP_CSR_TPIE_Msk                    (0x1UL << BKP_CSR_TPIE_Pos)         /*!< 0x00000004 */\n#define BKP_CSR_TPIE                        BKP_CSR_TPIE_Msk                   /*!< TAMPER Pin interrupt enable */\n#define BKP_CSR_TEF_Pos                     (8U)                               \n#define BKP_CSR_TEF_Msk                     (0x1UL << BKP_CSR_TEF_Pos)          /*!< 0x00000100 */\n#define BKP_CSR_TEF                         BKP_CSR_TEF_Msk                    /*!< Tamper Event Flag */\n#define BKP_CSR_TIF_Pos                     (9U)                               \n#define BKP_CSR_TIF_Msk                     (0x1UL << BKP_CSR_TIF_Pos)          /*!< 0x00000200 */\n#define BKP_CSR_TIF                         BKP_CSR_TIF_Msk                    /*!< Tamper Interrupt Flag */\n\n/******************************************************************************/\n/*                                                                            */\n/*                         Reset and Clock Control                            */\n/*                                                                            */\n/******************************************************************************/\n\n/********************  Bit definition for RCC_CR register  ********************/\n#define RCC_CR_HSION_Pos                     (0U)                              \n#define RCC_CR_HSION_Msk                     (0x1UL << RCC_CR_HSION_Pos)        /*!< 0x00000001 */\n#define RCC_CR_HSION                         RCC_CR_HSION_Msk                  /*!< Internal High Speed clock enable */\n#define RCC_CR_HSIRDY_Pos                    (1U)                              \n#define RCC_CR_HSIRDY_Msk                    (0x1UL << RCC_CR_HSIRDY_Pos)       /*!< 0x00000002 */\n#define RCC_CR_HSIRDY                        RCC_CR_HSIRDY_Msk                 /*!< Internal High Speed clock ready flag */\n#define RCC_CR_HSITRIM_Pos                   (3U)                              \n#define RCC_CR_HSITRIM_Msk                   (0x1FUL << RCC_CR_HSITRIM_Pos)     /*!< 0x000000F8 */\n#define RCC_CR_HSITRIM                       RCC_CR_HSITRIM_Msk                /*!< Internal High Speed clock trimming */\n#define RCC_CR_HSICAL_Pos                    (8U)                              \n#define RCC_CR_HSICAL_Msk                    (0xFFUL << RCC_CR_HSICAL_Pos)      /*!< 0x0000FF00 */\n#define RCC_CR_HSICAL                        RCC_CR_HSICAL_Msk                 /*!< Internal High Speed clock Calibration */\n#define RCC_CR_HSEON_Pos                     (16U)                             \n#define RCC_CR_HSEON_Msk                     (0x1UL << RCC_CR_HSEON_Pos)        /*!< 0x00010000 */\n#define RCC_CR_HSEON                         RCC_CR_HSEON_Msk                  /*!< External High Speed clock enable */\n#define RCC_CR_HSERDY_Pos                    (17U)                             \n#define RCC_CR_HSERDY_Msk                    (0x1UL << RCC_CR_HSERDY_Pos)       /*!< 0x00020000 */\n#define RCC_CR_HSERDY                        RCC_CR_HSERDY_Msk                 /*!< External High Speed clock ready flag */\n#define RCC_CR_HSEBYP_Pos                    (18U)                             \n#define RCC_CR_HSEBYP_Msk                    (0x1UL << RCC_CR_HSEBYP_Pos)       /*!< 0x00040000 */\n#define RCC_CR_HSEBYP                        RCC_CR_HSEBYP_Msk                 /*!< External High Speed clock Bypass */\n#define RCC_CR_CSSON_Pos                     (19U)                             \n#define RCC_CR_CSSON_Msk                     (0x1UL << RCC_CR_CSSON_Pos)        /*!< 0x00080000 */\n#define RCC_CR_CSSON                         RCC_CR_CSSON_Msk                  /*!< Clock Security System enable */\n#define RCC_CR_PLLON_Pos                     (24U)                             \n#define RCC_CR_PLLON_Msk                     (0x1UL << RCC_CR_PLLON_Pos)        /*!< 0x01000000 */\n#define RCC_CR_PLLON                         RCC_CR_PLLON_Msk                  /*!< PLL enable */\n#define RCC_CR_PLLRDY_Pos                    (25U)                             \n#define RCC_CR_PLLRDY_Msk                    (0x1UL << RCC_CR_PLLRDY_Pos)       /*!< 0x02000000 */\n#define RCC_CR_PLLRDY                        RCC_CR_PLLRDY_Msk                 /*!< PLL clock ready flag */\n\n\n/*******************  Bit definition for RCC_CFGR register  *******************/\n/*!< SW configuration */\n#define RCC_CFGR_SW_Pos                      (0U)                              \n#define RCC_CFGR_SW_Msk                      (0x3UL << RCC_CFGR_SW_Pos)         /*!< 0x00000003 */\n#define RCC_CFGR_SW                          RCC_CFGR_SW_Msk                   /*!< SW[1:0] bits (System clock Switch) */\n#define RCC_CFGR_SW_0                        (0x1UL << RCC_CFGR_SW_Pos)         /*!< 0x00000001 */\n#define RCC_CFGR_SW_1                        (0x2UL << RCC_CFGR_SW_Pos)         /*!< 0x00000002 */\n\n#define RCC_CFGR_SW_HSI                      0x00000000U                       /*!< HSI selected as system clock */\n#define RCC_CFGR_SW_HSE                      0x00000001U                       /*!< HSE selected as system clock */\n#define RCC_CFGR_SW_PLL                      0x00000002U                       /*!< PLL selected as system clock */\n\n/*!< SWS configuration */\n#define RCC_CFGR_SWS_Pos                     (2U)                              \n#define RCC_CFGR_SWS_Msk                     (0x3UL << RCC_CFGR_SWS_Pos)        /*!< 0x0000000C */\n#define RCC_CFGR_SWS                         RCC_CFGR_SWS_Msk                  /*!< SWS[1:0] bits (System Clock Switch Status) */\n#define RCC_CFGR_SWS_0                       (0x1UL << RCC_CFGR_SWS_Pos)        /*!< 0x00000004 */\n#define RCC_CFGR_SWS_1                       (0x2UL << RCC_CFGR_SWS_Pos)        /*!< 0x00000008 */\n\n#define RCC_CFGR_SWS_HSI                     0x00000000U                       /*!< HSI oscillator used as system clock */\n#define RCC_CFGR_SWS_HSE                     0x00000004U                       /*!< HSE oscillator used as system clock */\n#define RCC_CFGR_SWS_PLL                     0x00000008U                       /*!< PLL used as system clock */\n\n/*!< HPRE configuration */\n#define RCC_CFGR_HPRE_Pos                    (4U)                              \n#define RCC_CFGR_HPRE_Msk                    (0xFUL << RCC_CFGR_HPRE_Pos)       /*!< 0x000000F0 */\n#define RCC_CFGR_HPRE                        RCC_CFGR_HPRE_Msk                 /*!< HPRE[3:0] bits (AHB prescaler) */\n#define RCC_CFGR_HPRE_0                      (0x1UL << RCC_CFGR_HPRE_Pos)       /*!< 0x00000010 */\n#define RCC_CFGR_HPRE_1                      (0x2UL << RCC_CFGR_HPRE_Pos)       /*!< 0x00000020 */\n#define RCC_CFGR_HPRE_2                      (0x4UL << RCC_CFGR_HPRE_Pos)       /*!< 0x00000040 */\n#define RCC_CFGR_HPRE_3                      (0x8UL << RCC_CFGR_HPRE_Pos)       /*!< 0x00000080 */\n\n#define RCC_CFGR_HPRE_DIV1                   0x00000000U                       /*!< SYSCLK not divided */\n#define RCC_CFGR_HPRE_DIV2                   0x00000080U                       /*!< SYSCLK divided by 2 */\n#define RCC_CFGR_HPRE_DIV4                   0x00000090U                       /*!< SYSCLK divided by 4 */\n#define RCC_CFGR_HPRE_DIV8                   0x000000A0U                       /*!< SYSCLK divided by 8 */\n#define RCC_CFGR_HPRE_DIV16                  0x000000B0U                       /*!< SYSCLK divided by 16 */\n#define RCC_CFGR_HPRE_DIV64                  0x000000C0U                       /*!< SYSCLK divided by 64 */\n#define RCC_CFGR_HPRE_DIV128                 0x000000D0U                       /*!< SYSCLK divided by 128 */\n#define RCC_CFGR_HPRE_DIV256                 0x000000E0U                       /*!< SYSCLK divided by 256 */\n#define RCC_CFGR_HPRE_DIV512                 0x000000F0U                       /*!< SYSCLK divided by 512 */\n\n/*!< PPRE1 configuration */\n#define RCC_CFGR_PPRE1_Pos                   (8U)                              \n#define RCC_CFGR_PPRE1_Msk                   (0x7UL << RCC_CFGR_PPRE1_Pos)      /*!< 0x00000700 */\n#define RCC_CFGR_PPRE1                       RCC_CFGR_PPRE1_Msk                /*!< PRE1[2:0] bits (APB1 prescaler) */\n#define RCC_CFGR_PPRE1_0                     (0x1UL << RCC_CFGR_PPRE1_Pos)      /*!< 0x00000100 */\n#define RCC_CFGR_PPRE1_1                     (0x2UL << RCC_CFGR_PPRE1_Pos)      /*!< 0x00000200 */\n#define RCC_CFGR_PPRE1_2                     (0x4UL << RCC_CFGR_PPRE1_Pos)      /*!< 0x00000400 */\n\n#define RCC_CFGR_PPRE1_DIV1                  0x00000000U                       /*!< HCLK not divided */\n#define RCC_CFGR_PPRE1_DIV2                  0x00000400U                       /*!< HCLK divided by 2 */\n#define RCC_CFGR_PPRE1_DIV4                  0x00000500U                       /*!< HCLK divided by 4 */\n#define RCC_CFGR_PPRE1_DIV8                  0x00000600U                       /*!< HCLK divided by 8 */\n#define RCC_CFGR_PPRE1_DIV16                 0x00000700U                       /*!< HCLK divided by 16 */\n\n/*!< PPRE2 configuration */\n#define RCC_CFGR_PPRE2_Pos                   (11U)                             \n#define RCC_CFGR_PPRE2_Msk                   (0x7UL << RCC_CFGR_PPRE2_Pos)      /*!< 0x00003800 */\n#define RCC_CFGR_PPRE2                       RCC_CFGR_PPRE2_Msk                /*!< PRE2[2:0] bits (APB2 prescaler) */\n#define RCC_CFGR_PPRE2_0                     (0x1UL << RCC_CFGR_PPRE2_Pos)      /*!< 0x00000800 */\n#define RCC_CFGR_PPRE2_1                     (0x2UL << RCC_CFGR_PPRE2_Pos)      /*!< 0x00001000 */\n#define RCC_CFGR_PPRE2_2                     (0x4UL << RCC_CFGR_PPRE2_Pos)      /*!< 0x00002000 */\n\n#define RCC_CFGR_PPRE2_DIV1                  0x00000000U                       /*!< HCLK not divided */\n#define RCC_CFGR_PPRE2_DIV2                  0x00002000U                       /*!< HCLK divided by 2 */\n#define RCC_CFGR_PPRE2_DIV4                  0x00002800U                       /*!< HCLK divided by 4 */\n#define RCC_CFGR_PPRE2_DIV8                  0x00003000U                       /*!< HCLK divided by 8 */\n#define RCC_CFGR_PPRE2_DIV16                 0x00003800U                       /*!< HCLK divided by 16 */\n\n/*!< ADCPPRE configuration */\n#define RCC_CFGR_ADCPRE_Pos                  (14U)                             \n#define RCC_CFGR_ADCPRE_Msk                  (0x3UL << RCC_CFGR_ADCPRE_Pos)     /*!< 0x0000C000 */\n#define RCC_CFGR_ADCPRE                      RCC_CFGR_ADCPRE_Msk               /*!< ADCPRE[1:0] bits (ADC prescaler) */\n#define RCC_CFGR_ADCPRE_0                    (0x1UL << RCC_CFGR_ADCPRE_Pos)     /*!< 0x00004000 */\n#define RCC_CFGR_ADCPRE_1                    (0x2UL << RCC_CFGR_ADCPRE_Pos)     /*!< 0x00008000 */\n\n#define RCC_CFGR_ADCPRE_DIV2                 0x00000000U                       /*!< PCLK2 divided by 2 */\n#define RCC_CFGR_ADCPRE_DIV4                 0x00004000U                       /*!< PCLK2 divided by 4 */\n#define RCC_CFGR_ADCPRE_DIV6                 0x00008000U                       /*!< PCLK2 divided by 6 */\n#define RCC_CFGR_ADCPRE_DIV8                 0x0000C000U                       /*!< PCLK2 divided by 8 */\n\n#define RCC_CFGR_PLLSRC_Pos                  (16U)                             \n#define RCC_CFGR_PLLSRC_Msk                  (0x1UL << RCC_CFGR_PLLSRC_Pos)     /*!< 0x00010000 */\n#define RCC_CFGR_PLLSRC                      RCC_CFGR_PLLSRC_Msk               /*!< PLL entry clock source */\n\n#define RCC_CFGR_PLLXTPRE_Pos                (17U)                             \n#define RCC_CFGR_PLLXTPRE_Msk                (0x1UL << RCC_CFGR_PLLXTPRE_Pos)   /*!< 0x00020000 */\n#define RCC_CFGR_PLLXTPRE                    RCC_CFGR_PLLXTPRE_Msk             /*!< HSE divider for PLL entry */\n\n/*!< PLLMUL configuration */\n#define RCC_CFGR_PLLMULL_Pos                 (18U)                             \n#define RCC_CFGR_PLLMULL_Msk                 (0xFUL << RCC_CFGR_PLLMULL_Pos)    /*!< 0x003C0000 */\n#define RCC_CFGR_PLLMULL                     RCC_CFGR_PLLMULL_Msk              /*!< PLLMUL[3:0] bits (PLL multiplication factor) */\n#define RCC_CFGR_PLLMULL_0                   (0x1UL << RCC_CFGR_PLLMULL_Pos)    /*!< 0x00040000 */\n#define RCC_CFGR_PLLMULL_1                   (0x2UL << RCC_CFGR_PLLMULL_Pos)    /*!< 0x00080000 */\n#define RCC_CFGR_PLLMULL_2                   (0x4UL << RCC_CFGR_PLLMULL_Pos)    /*!< 0x00100000 */\n#define RCC_CFGR_PLLMULL_3                   (0x8UL << RCC_CFGR_PLLMULL_Pos)    /*!< 0x00200000 */\n\n#define RCC_CFGR_PLLXTPRE_HSE                0x00000000U                      /*!< HSE clock not divided for PLL entry */\n#define RCC_CFGR_PLLXTPRE_HSE_DIV2           0x00020000U                      /*!< HSE clock divided by 2 for PLL entry */\n\n#define RCC_CFGR_PLLMULL2                    0x00000000U                       /*!< PLL input clock*2 */\n#define RCC_CFGR_PLLMULL3_Pos                (18U)                             \n#define RCC_CFGR_PLLMULL3_Msk                (0x1UL << RCC_CFGR_PLLMULL3_Pos)   /*!< 0x00040000 */\n#define RCC_CFGR_PLLMULL3                    RCC_CFGR_PLLMULL3_Msk             /*!< PLL input clock*3 */\n#define RCC_CFGR_PLLMULL4_Pos                (19U)                             \n#define RCC_CFGR_PLLMULL4_Msk                (0x1UL << RCC_CFGR_PLLMULL4_Pos)   /*!< 0x00080000 */\n#define RCC_CFGR_PLLMULL4                    RCC_CFGR_PLLMULL4_Msk             /*!< PLL input clock*4 */\n#define RCC_CFGR_PLLMULL5_Pos                (18U)                             \n#define RCC_CFGR_PLLMULL5_Msk                (0x3UL << RCC_CFGR_PLLMULL5_Pos)   /*!< 0x000C0000 */\n#define RCC_CFGR_PLLMULL5                    RCC_CFGR_PLLMULL5_Msk             /*!< PLL input clock*5 */\n#define RCC_CFGR_PLLMULL6_Pos                (20U)                             \n#define RCC_CFGR_PLLMULL6_Msk                (0x1UL << RCC_CFGR_PLLMULL6_Pos)   /*!< 0x00100000 */\n#define RCC_CFGR_PLLMULL6                    RCC_CFGR_PLLMULL6_Msk             /*!< PLL input clock*6 */\n#define RCC_CFGR_PLLMULL7_Pos                (18U)                             \n#define RCC_CFGR_PLLMULL7_Msk                (0x5UL << RCC_CFGR_PLLMULL7_Pos)   /*!< 0x00140000 */\n#define RCC_CFGR_PLLMULL7                    RCC_CFGR_PLLMULL7_Msk             /*!< PLL input clock*7 */\n#define RCC_CFGR_PLLMULL8_Pos                (19U)                             \n#define RCC_CFGR_PLLMULL8_Msk                (0x3UL << RCC_CFGR_PLLMULL8_Pos)   /*!< 0x00180000 */\n#define RCC_CFGR_PLLMULL8                    RCC_CFGR_PLLMULL8_Msk             /*!< PLL input clock*8 */\n#define RCC_CFGR_PLLMULL9_Pos                (18U)                             \n#define RCC_CFGR_PLLMULL9_Msk                (0x7UL << RCC_CFGR_PLLMULL9_Pos)   /*!< 0x001C0000 */\n#define RCC_CFGR_PLLMULL9                    RCC_CFGR_PLLMULL9_Msk             /*!< PLL input clock*9 */\n#define RCC_CFGR_PLLMULL10_Pos               (21U)                             \n#define RCC_CFGR_PLLMULL10_Msk               (0x1UL << RCC_CFGR_PLLMULL10_Pos)  /*!< 0x00200000 */\n#define RCC_CFGR_PLLMULL10                   RCC_CFGR_PLLMULL10_Msk            /*!< PLL input clock10 */\n#define RCC_CFGR_PLLMULL11_Pos               (18U)                             \n#define RCC_CFGR_PLLMULL11_Msk               (0x9UL << RCC_CFGR_PLLMULL11_Pos)  /*!< 0x00240000 */\n#define RCC_CFGR_PLLMULL11                   RCC_CFGR_PLLMULL11_Msk            /*!< PLL input clock*11 */\n#define RCC_CFGR_PLLMULL12_Pos               (19U)                             \n#define RCC_CFGR_PLLMULL12_Msk               (0x5UL << RCC_CFGR_PLLMULL12_Pos)  /*!< 0x00280000 */\n#define RCC_CFGR_PLLMULL12                   RCC_CFGR_PLLMULL12_Msk            /*!< PLL input clock*12 */\n#define RCC_CFGR_PLLMULL13_Pos               (18U)                             \n#define RCC_CFGR_PLLMULL13_Msk               (0xBUL << RCC_CFGR_PLLMULL13_Pos)  /*!< 0x002C0000 */\n#define RCC_CFGR_PLLMULL13                   RCC_CFGR_PLLMULL13_Msk            /*!< PLL input clock*13 */\n#define RCC_CFGR_PLLMULL14_Pos               (20U)                             \n#define RCC_CFGR_PLLMULL14_Msk               (0x3UL << RCC_CFGR_PLLMULL14_Pos)  /*!< 0x00300000 */\n#define RCC_CFGR_PLLMULL14                   RCC_CFGR_PLLMULL14_Msk            /*!< PLL input clock*14 */\n#define RCC_CFGR_PLLMULL15_Pos               (18U)                             \n#define RCC_CFGR_PLLMULL15_Msk               (0xDUL << RCC_CFGR_PLLMULL15_Pos)  /*!< 0x00340000 */\n#define RCC_CFGR_PLLMULL15                   RCC_CFGR_PLLMULL15_Msk            /*!< PLL input clock*15 */\n#define RCC_CFGR_PLLMULL16_Pos               (19U)                             \n#define RCC_CFGR_PLLMULL16_Msk               (0x7UL << RCC_CFGR_PLLMULL16_Pos)  /*!< 0x00380000 */\n#define RCC_CFGR_PLLMULL16                   RCC_CFGR_PLLMULL16_Msk            /*!< PLL input clock*16 */\n#define RCC_CFGR_USBPRE_Pos                  (22U)                             \n#define RCC_CFGR_USBPRE_Msk                  (0x1UL << RCC_CFGR_USBPRE_Pos)     /*!< 0x00400000 */\n#define RCC_CFGR_USBPRE                      RCC_CFGR_USBPRE_Msk               /*!< USB Device prescaler */\n\n/*!< MCO configuration */\n#define RCC_CFGR_MCO_Pos                     (24U)                             \n#define RCC_CFGR_MCO_Msk                     (0x7UL << RCC_CFGR_MCO_Pos)        /*!< 0x07000000 */\n#define RCC_CFGR_MCO                         RCC_CFGR_MCO_Msk                  /*!< MCO[2:0] bits (Microcontroller Clock Output) */\n#define RCC_CFGR_MCO_0                       (0x1UL << RCC_CFGR_MCO_Pos)        /*!< 0x01000000 */\n#define RCC_CFGR_MCO_1                       (0x2UL << RCC_CFGR_MCO_Pos)        /*!< 0x02000000 */\n#define RCC_CFGR_MCO_2                       (0x4UL << RCC_CFGR_MCO_Pos)        /*!< 0x04000000 */\n\n#define RCC_CFGR_MCO_NOCLOCK                 0x00000000U                        /*!< No clock */\n#define RCC_CFGR_MCO_SYSCLK                  0x04000000U                        /*!< System clock selected as MCO source */\n#define RCC_CFGR_MCO_HSI                     0x05000000U                        /*!< HSI clock selected as MCO source */\n#define RCC_CFGR_MCO_HSE                     0x06000000U                        /*!< HSE clock selected as MCO source  */\n#define RCC_CFGR_MCO_PLLCLK_DIV2             0x07000000U                        /*!< PLL clock divided by 2 selected as MCO source */\n\n /* Reference defines */\n #define RCC_CFGR_MCOSEL                      RCC_CFGR_MCO\n #define RCC_CFGR_MCOSEL_0                    RCC_CFGR_MCO_0\n #define RCC_CFGR_MCOSEL_1                    RCC_CFGR_MCO_1\n #define RCC_CFGR_MCOSEL_2                    RCC_CFGR_MCO_2\n #define RCC_CFGR_MCOSEL_NOCLOCK              RCC_CFGR_MCO_NOCLOCK\n #define RCC_CFGR_MCOSEL_SYSCLK               RCC_CFGR_MCO_SYSCLK\n #define RCC_CFGR_MCOSEL_HSI                  RCC_CFGR_MCO_HSI\n #define RCC_CFGR_MCOSEL_HSE                  RCC_CFGR_MCO_HSE\n #define RCC_CFGR_MCOSEL_PLL_DIV2             RCC_CFGR_MCO_PLLCLK_DIV2\n\n/*!<******************  Bit definition for RCC_CIR register  ********************/\n#define RCC_CIR_LSIRDYF_Pos                  (0U)                              \n#define RCC_CIR_LSIRDYF_Msk                  (0x1UL << RCC_CIR_LSIRDYF_Pos)     /*!< 0x00000001 */\n#define RCC_CIR_LSIRDYF                      RCC_CIR_LSIRDYF_Msk               /*!< LSI Ready Interrupt flag */\n#define RCC_CIR_LSERDYF_Pos                  (1U)                              \n#define RCC_CIR_LSERDYF_Msk                  (0x1UL << RCC_CIR_LSERDYF_Pos)     /*!< 0x00000002 */\n#define RCC_CIR_LSERDYF                      RCC_CIR_LSERDYF_Msk               /*!< LSE Ready Interrupt flag */\n#define RCC_CIR_HSIRDYF_Pos                  (2U)                              \n#define RCC_CIR_HSIRDYF_Msk                  (0x1UL << RCC_CIR_HSIRDYF_Pos)     /*!< 0x00000004 */\n#define RCC_CIR_HSIRDYF                      RCC_CIR_HSIRDYF_Msk               /*!< HSI Ready Interrupt flag */\n#define RCC_CIR_HSERDYF_Pos                  (3U)                              \n#define RCC_CIR_HSERDYF_Msk                  (0x1UL << RCC_CIR_HSERDYF_Pos)     /*!< 0x00000008 */\n#define RCC_CIR_HSERDYF                      RCC_CIR_HSERDYF_Msk               /*!< HSE Ready Interrupt flag */\n#define RCC_CIR_PLLRDYF_Pos                  (4U)                              \n#define RCC_CIR_PLLRDYF_Msk                  (0x1UL << RCC_CIR_PLLRDYF_Pos)     /*!< 0x00000010 */\n#define RCC_CIR_PLLRDYF                      RCC_CIR_PLLRDYF_Msk               /*!< PLL Ready Interrupt flag */\n#define RCC_CIR_CSSF_Pos                     (7U)                              \n#define RCC_CIR_CSSF_Msk                     (0x1UL << RCC_CIR_CSSF_Pos)        /*!< 0x00000080 */\n#define RCC_CIR_CSSF                         RCC_CIR_CSSF_Msk                  /*!< Clock Security System Interrupt flag */\n#define RCC_CIR_LSIRDYIE_Pos                 (8U)                              \n#define RCC_CIR_LSIRDYIE_Msk                 (0x1UL << RCC_CIR_LSIRDYIE_Pos)    /*!< 0x00000100 */\n#define RCC_CIR_LSIRDYIE                     RCC_CIR_LSIRDYIE_Msk              /*!< LSI Ready Interrupt Enable */\n#define RCC_CIR_LSERDYIE_Pos                 (9U)                              \n#define RCC_CIR_LSERDYIE_Msk                 (0x1UL << RCC_CIR_LSERDYIE_Pos)    /*!< 0x00000200 */\n#define RCC_CIR_LSERDYIE                     RCC_CIR_LSERDYIE_Msk              /*!< LSE Ready Interrupt Enable */\n#define RCC_CIR_HSIRDYIE_Pos                 (10U)                             \n#define RCC_CIR_HSIRDYIE_Msk                 (0x1UL << RCC_CIR_HSIRDYIE_Pos)    /*!< 0x00000400 */\n#define RCC_CIR_HSIRDYIE                     RCC_CIR_HSIRDYIE_Msk              /*!< HSI Ready Interrupt Enable */\n#define RCC_CIR_HSERDYIE_Pos                 (11U)                             \n#define RCC_CIR_HSERDYIE_Msk                 (0x1UL << RCC_CIR_HSERDYIE_Pos)    /*!< 0x00000800 */\n#define RCC_CIR_HSERDYIE                     RCC_CIR_HSERDYIE_Msk              /*!< HSE Ready Interrupt Enable */\n#define RCC_CIR_PLLRDYIE_Pos                 (12U)                             \n#define RCC_CIR_PLLRDYIE_Msk                 (0x1UL << RCC_CIR_PLLRDYIE_Pos)    /*!< 0x00001000 */\n#define RCC_CIR_PLLRDYIE                     RCC_CIR_PLLRDYIE_Msk              /*!< PLL Ready Interrupt Enable */\n#define RCC_CIR_LSIRDYC_Pos                  (16U)                             \n#define RCC_CIR_LSIRDYC_Msk                  (0x1UL << RCC_CIR_LSIRDYC_Pos)     /*!< 0x00010000 */\n#define RCC_CIR_LSIRDYC                      RCC_CIR_LSIRDYC_Msk               /*!< LSI Ready Interrupt Clear */\n#define RCC_CIR_LSERDYC_Pos                  (17U)                             \n#define RCC_CIR_LSERDYC_Msk                  (0x1UL << RCC_CIR_LSERDYC_Pos)     /*!< 0x00020000 */\n#define RCC_CIR_LSERDYC                      RCC_CIR_LSERDYC_Msk               /*!< LSE Ready Interrupt Clear */\n#define RCC_CIR_HSIRDYC_Pos                  (18U)                             \n#define RCC_CIR_HSIRDYC_Msk                  (0x1UL << RCC_CIR_HSIRDYC_Pos)     /*!< 0x00040000 */\n#define RCC_CIR_HSIRDYC                      RCC_CIR_HSIRDYC_Msk               /*!< HSI Ready Interrupt Clear */\n#define RCC_CIR_HSERDYC_Pos                  (19U)                             \n#define RCC_CIR_HSERDYC_Msk                  (0x1UL << RCC_CIR_HSERDYC_Pos)     /*!< 0x00080000 */\n#define RCC_CIR_HSERDYC                      RCC_CIR_HSERDYC_Msk               /*!< HSE Ready Interrupt Clear */\n#define RCC_CIR_PLLRDYC_Pos                  (20U)                             \n#define RCC_CIR_PLLRDYC_Msk                  (0x1UL << RCC_CIR_PLLRDYC_Pos)     /*!< 0x00100000 */\n#define RCC_CIR_PLLRDYC                      RCC_CIR_PLLRDYC_Msk               /*!< PLL Ready Interrupt Clear */\n#define RCC_CIR_CSSC_Pos                     (23U)                             \n#define RCC_CIR_CSSC_Msk                     (0x1UL << RCC_CIR_CSSC_Pos)        /*!< 0x00800000 */\n#define RCC_CIR_CSSC                         RCC_CIR_CSSC_Msk                  /*!< Clock Security System Interrupt Clear */\n\n\n/*****************  Bit definition for RCC_APB2RSTR register  *****************/\n#define RCC_APB2RSTR_AFIORST_Pos             (0U)                              \n#define RCC_APB2RSTR_AFIORST_Msk             (0x1UL << RCC_APB2RSTR_AFIORST_Pos) /*!< 0x00000001 */\n#define RCC_APB2RSTR_AFIORST                 RCC_APB2RSTR_AFIORST_Msk          /*!< Alternate Function I/O reset */\n#define RCC_APB2RSTR_IOPARST_Pos             (2U)                              \n#define RCC_APB2RSTR_IOPARST_Msk             (0x1UL << RCC_APB2RSTR_IOPARST_Pos) /*!< 0x00000004 */\n#define RCC_APB2RSTR_IOPARST                 RCC_APB2RSTR_IOPARST_Msk          /*!< I/O port A reset */\n#define RCC_APB2RSTR_IOPBRST_Pos             (3U)                              \n#define RCC_APB2RSTR_IOPBRST_Msk             (0x1UL << RCC_APB2RSTR_IOPBRST_Pos) /*!< 0x00000008 */\n#define RCC_APB2RSTR_IOPBRST                 RCC_APB2RSTR_IOPBRST_Msk          /*!< I/O port B reset */\n#define RCC_APB2RSTR_IOPCRST_Pos             (4U)                              \n#define RCC_APB2RSTR_IOPCRST_Msk             (0x1UL << RCC_APB2RSTR_IOPCRST_Pos) /*!< 0x00000010 */\n#define RCC_APB2RSTR_IOPCRST                 RCC_APB2RSTR_IOPCRST_Msk          /*!< I/O port C reset */\n#define RCC_APB2RSTR_IOPDRST_Pos             (5U)                              \n#define RCC_APB2RSTR_IOPDRST_Msk             (0x1UL << RCC_APB2RSTR_IOPDRST_Pos) /*!< 0x00000020 */\n#define RCC_APB2RSTR_IOPDRST                 RCC_APB2RSTR_IOPDRST_Msk          /*!< I/O port D reset */\n#define RCC_APB2RSTR_ADC1RST_Pos             (9U)                              \n#define RCC_APB2RSTR_ADC1RST_Msk             (0x1UL << RCC_APB2RSTR_ADC1RST_Pos) /*!< 0x00000200 */\n#define RCC_APB2RSTR_ADC1RST                 RCC_APB2RSTR_ADC1RST_Msk          /*!< ADC 1 interface reset */\n\n#define RCC_APB2RSTR_ADC2RST_Pos             (10U)                             \n#define RCC_APB2RSTR_ADC2RST_Msk             (0x1UL << RCC_APB2RSTR_ADC2RST_Pos) /*!< 0x00000400 */\n#define RCC_APB2RSTR_ADC2RST                 RCC_APB2RSTR_ADC2RST_Msk          /*!< ADC 2 interface reset */\n\n#define RCC_APB2RSTR_TIM1RST_Pos             (11U)                             \n#define RCC_APB2RSTR_TIM1RST_Msk             (0x1UL << RCC_APB2RSTR_TIM1RST_Pos) /*!< 0x00000800 */\n#define RCC_APB2RSTR_TIM1RST                 RCC_APB2RSTR_TIM1RST_Msk          /*!< TIM1 Timer reset */\n#define RCC_APB2RSTR_SPI1RST_Pos             (12U)                             \n#define RCC_APB2RSTR_SPI1RST_Msk             (0x1UL << RCC_APB2RSTR_SPI1RST_Pos) /*!< 0x00001000 */\n#define RCC_APB2RSTR_SPI1RST                 RCC_APB2RSTR_SPI1RST_Msk          /*!< SPI 1 reset */\n#define RCC_APB2RSTR_USART1RST_Pos           (14U)                             \n#define RCC_APB2RSTR_USART1RST_Msk           (0x1UL << RCC_APB2RSTR_USART1RST_Pos) /*!< 0x00004000 */\n#define RCC_APB2RSTR_USART1RST               RCC_APB2RSTR_USART1RST_Msk        /*!< USART1 reset */\n\n\n#define RCC_APB2RSTR_IOPERST_Pos             (6U)                              \n#define RCC_APB2RSTR_IOPERST_Msk             (0x1UL << RCC_APB2RSTR_IOPERST_Pos) /*!< 0x00000040 */\n#define RCC_APB2RSTR_IOPERST                 RCC_APB2RSTR_IOPERST_Msk          /*!< I/O port E reset */\n\n#define RCC_APB2RSTR_IOPFRST_Pos             (7U)                              \n#define RCC_APB2RSTR_IOPFRST_Msk             (0x1UL << RCC_APB2RSTR_IOPFRST_Pos) /*!< 0x00000080 */\n#define RCC_APB2RSTR_IOPFRST                 RCC_APB2RSTR_IOPFRST_Msk          /*!< I/O port F reset */\n#define RCC_APB2RSTR_IOPGRST_Pos             (8U)                              \n#define RCC_APB2RSTR_IOPGRST_Msk             (0x1UL << RCC_APB2RSTR_IOPGRST_Pos) /*!< 0x00000100 */\n#define RCC_APB2RSTR_IOPGRST                 RCC_APB2RSTR_IOPGRST_Msk          /*!< I/O port G reset */\n#define RCC_APB2RSTR_TIM8RST_Pos             (13U)                             \n#define RCC_APB2RSTR_TIM8RST_Msk             (0x1UL << RCC_APB2RSTR_TIM8RST_Pos) /*!< 0x00002000 */\n#define RCC_APB2RSTR_TIM8RST                 RCC_APB2RSTR_TIM8RST_Msk          /*!< TIM8 Timer reset */\n#define RCC_APB2RSTR_ADC3RST_Pos             (15U)                             \n#define RCC_APB2RSTR_ADC3RST_Msk             (0x1UL << RCC_APB2RSTR_ADC3RST_Pos) /*!< 0x00008000 */\n#define RCC_APB2RSTR_ADC3RST                 RCC_APB2RSTR_ADC3RST_Msk          /*!< ADC3 interface reset */\n\n\n\n/*****************  Bit definition for RCC_APB1RSTR register  *****************/\n#define RCC_APB1RSTR_TIM2RST_Pos             (0U)                              \n#define RCC_APB1RSTR_TIM2RST_Msk             (0x1UL << RCC_APB1RSTR_TIM2RST_Pos) /*!< 0x00000001 */\n#define RCC_APB1RSTR_TIM2RST                 RCC_APB1RSTR_TIM2RST_Msk          /*!< Timer 2 reset */\n#define RCC_APB1RSTR_TIM3RST_Pos             (1U)                              \n#define RCC_APB1RSTR_TIM3RST_Msk             (0x1UL << RCC_APB1RSTR_TIM3RST_Pos) /*!< 0x00000002 */\n#define RCC_APB1RSTR_TIM3RST                 RCC_APB1RSTR_TIM3RST_Msk          /*!< Timer 3 reset */\n#define RCC_APB1RSTR_WWDGRST_Pos             (11U)                             \n#define RCC_APB1RSTR_WWDGRST_Msk             (0x1UL << RCC_APB1RSTR_WWDGRST_Pos) /*!< 0x00000800 */\n#define RCC_APB1RSTR_WWDGRST                 RCC_APB1RSTR_WWDGRST_Msk          /*!< Window Watchdog reset */\n#define RCC_APB1RSTR_USART2RST_Pos           (17U)                             \n#define RCC_APB1RSTR_USART2RST_Msk           (0x1UL << RCC_APB1RSTR_USART2RST_Pos) /*!< 0x00020000 */\n#define RCC_APB1RSTR_USART2RST               RCC_APB1RSTR_USART2RST_Msk        /*!< USART 2 reset */\n#define RCC_APB1RSTR_I2C1RST_Pos             (21U)                             \n#define RCC_APB1RSTR_I2C1RST_Msk             (0x1UL << RCC_APB1RSTR_I2C1RST_Pos) /*!< 0x00200000 */\n#define RCC_APB1RSTR_I2C1RST                 RCC_APB1RSTR_I2C1RST_Msk          /*!< I2C 1 reset */\n\n#define RCC_APB1RSTR_CAN1RST_Pos             (25U)                             \n#define RCC_APB1RSTR_CAN1RST_Msk             (0x1UL << RCC_APB1RSTR_CAN1RST_Pos) /*!< 0x02000000 */\n#define RCC_APB1RSTR_CAN1RST                 RCC_APB1RSTR_CAN1RST_Msk          /*!< CAN1 reset */\n\n#define RCC_APB1RSTR_BKPRST_Pos              (27U)                             \n#define RCC_APB1RSTR_BKPRST_Msk              (0x1UL << RCC_APB1RSTR_BKPRST_Pos) /*!< 0x08000000 */\n#define RCC_APB1RSTR_BKPRST                  RCC_APB1RSTR_BKPRST_Msk           /*!< Backup interface reset */\n#define RCC_APB1RSTR_PWRRST_Pos              (28U)                             \n#define RCC_APB1RSTR_PWRRST_Msk              (0x1UL << RCC_APB1RSTR_PWRRST_Pos) /*!< 0x10000000 */\n#define RCC_APB1RSTR_PWRRST                  RCC_APB1RSTR_PWRRST_Msk           /*!< Power interface reset */\n\n#define RCC_APB1RSTR_TIM4RST_Pos             (2U)                              \n#define RCC_APB1RSTR_TIM4RST_Msk             (0x1UL << RCC_APB1RSTR_TIM4RST_Pos) /*!< 0x00000004 */\n#define RCC_APB1RSTR_TIM4RST                 RCC_APB1RSTR_TIM4RST_Msk          /*!< Timer 4 reset */\n#define RCC_APB1RSTR_SPI2RST_Pos             (14U)                             \n#define RCC_APB1RSTR_SPI2RST_Msk             (0x1UL << RCC_APB1RSTR_SPI2RST_Pos) /*!< 0x00004000 */\n#define RCC_APB1RSTR_SPI2RST                 RCC_APB1RSTR_SPI2RST_Msk          /*!< SPI 2 reset */\n#define RCC_APB1RSTR_USART3RST_Pos           (18U)                             \n#define RCC_APB1RSTR_USART3RST_Msk           (0x1UL << RCC_APB1RSTR_USART3RST_Pos) /*!< 0x00040000 */\n#define RCC_APB1RSTR_USART3RST               RCC_APB1RSTR_USART3RST_Msk        /*!< USART 3 reset */\n#define RCC_APB1RSTR_I2C2RST_Pos             (22U)                             \n#define RCC_APB1RSTR_I2C2RST_Msk             (0x1UL << RCC_APB1RSTR_I2C2RST_Pos) /*!< 0x00400000 */\n#define RCC_APB1RSTR_I2C2RST                 RCC_APB1RSTR_I2C2RST_Msk          /*!< I2C 2 reset */\n\n#define RCC_APB1RSTR_USBRST_Pos              (23U)                             \n#define RCC_APB1RSTR_USBRST_Msk              (0x1UL << RCC_APB1RSTR_USBRST_Pos) /*!< 0x00800000 */\n#define RCC_APB1RSTR_USBRST                  RCC_APB1RSTR_USBRST_Msk           /*!< USB Device reset */\n\n#define RCC_APB1RSTR_TIM5RST_Pos             (3U)                              \n#define RCC_APB1RSTR_TIM5RST_Msk             (0x1UL << RCC_APB1RSTR_TIM5RST_Pos) /*!< 0x00000008 */\n#define RCC_APB1RSTR_TIM5RST                 RCC_APB1RSTR_TIM5RST_Msk          /*!< Timer 5 reset */\n#define RCC_APB1RSTR_TIM6RST_Pos             (4U)                              \n#define RCC_APB1RSTR_TIM6RST_Msk             (0x1UL << RCC_APB1RSTR_TIM6RST_Pos) /*!< 0x00000010 */\n#define RCC_APB1RSTR_TIM6RST                 RCC_APB1RSTR_TIM6RST_Msk          /*!< Timer 6 reset */\n#define RCC_APB1RSTR_TIM7RST_Pos             (5U)                              \n#define RCC_APB1RSTR_TIM7RST_Msk             (0x1UL << RCC_APB1RSTR_TIM7RST_Pos) /*!< 0x00000020 */\n#define RCC_APB1RSTR_TIM7RST                 RCC_APB1RSTR_TIM7RST_Msk          /*!< Timer 7 reset */\n#define RCC_APB1RSTR_SPI3RST_Pos             (15U)                             \n#define RCC_APB1RSTR_SPI3RST_Msk             (0x1UL << RCC_APB1RSTR_SPI3RST_Pos) /*!< 0x00008000 */\n#define RCC_APB1RSTR_SPI3RST                 RCC_APB1RSTR_SPI3RST_Msk          /*!< SPI 3 reset */\n#define RCC_APB1RSTR_UART4RST_Pos            (19U)                             \n#define RCC_APB1RSTR_UART4RST_Msk            (0x1UL << RCC_APB1RSTR_UART4RST_Pos) /*!< 0x00080000 */\n#define RCC_APB1RSTR_UART4RST                RCC_APB1RSTR_UART4RST_Msk         /*!< UART 4 reset */\n#define RCC_APB1RSTR_UART5RST_Pos            (20U)                             \n#define RCC_APB1RSTR_UART5RST_Msk            (0x1UL << RCC_APB1RSTR_UART5RST_Pos) /*!< 0x00100000 */\n#define RCC_APB1RSTR_UART5RST                RCC_APB1RSTR_UART5RST_Msk         /*!< UART 5 reset */\n\n\n\n\n#define RCC_APB1RSTR_DACRST_Pos              (29U)                             \n#define RCC_APB1RSTR_DACRST_Msk              (0x1UL << RCC_APB1RSTR_DACRST_Pos) /*!< 0x20000000 */\n#define RCC_APB1RSTR_DACRST                  RCC_APB1RSTR_DACRST_Msk           /*!< DAC interface reset */\n\n/******************  Bit definition for RCC_AHBENR register  ******************/\n#define RCC_AHBENR_DMA1EN_Pos                (0U)                              \n#define RCC_AHBENR_DMA1EN_Msk                (0x1UL << RCC_AHBENR_DMA1EN_Pos)   /*!< 0x00000001 */\n#define RCC_AHBENR_DMA1EN                    RCC_AHBENR_DMA1EN_Msk             /*!< DMA1 clock enable */\n#define RCC_AHBENR_SRAMEN_Pos                (2U)                              \n#define RCC_AHBENR_SRAMEN_Msk                (0x1UL << RCC_AHBENR_SRAMEN_Pos)   /*!< 0x00000004 */\n#define RCC_AHBENR_SRAMEN                    RCC_AHBENR_SRAMEN_Msk             /*!< SRAM interface clock enable */\n#define RCC_AHBENR_FLITFEN_Pos               (4U)                              \n#define RCC_AHBENR_FLITFEN_Msk               (0x1UL << RCC_AHBENR_FLITFEN_Pos)  /*!< 0x00000010 */\n#define RCC_AHBENR_FLITFEN                   RCC_AHBENR_FLITFEN_Msk            /*!< FLITF clock enable */\n#define RCC_AHBENR_CRCEN_Pos                 (6U)                              \n#define RCC_AHBENR_CRCEN_Msk                 (0x1UL << RCC_AHBENR_CRCEN_Pos)    /*!< 0x00000040 */\n#define RCC_AHBENR_CRCEN                     RCC_AHBENR_CRCEN_Msk              /*!< CRC clock enable */\n\n#define RCC_AHBENR_DMA2EN_Pos                (1U)                              \n#define RCC_AHBENR_DMA2EN_Msk                (0x1UL << RCC_AHBENR_DMA2EN_Pos)   /*!< 0x00000002 */\n#define RCC_AHBENR_DMA2EN                    RCC_AHBENR_DMA2EN_Msk             /*!< DMA2 clock enable */\n\n#define RCC_AHBENR_FSMCEN_Pos                (8U)                              \n#define RCC_AHBENR_FSMCEN_Msk                (0x1UL << RCC_AHBENR_FSMCEN_Pos)   /*!< 0x00000100 */\n#define RCC_AHBENR_FSMCEN                    RCC_AHBENR_FSMCEN_Msk             /*!< FSMC clock enable */\n#define RCC_AHBENR_SDIOEN_Pos                (10U)                             \n#define RCC_AHBENR_SDIOEN_Msk                (0x1UL << RCC_AHBENR_SDIOEN_Pos)   /*!< 0x00000400 */\n#define RCC_AHBENR_SDIOEN                    RCC_AHBENR_SDIOEN_Msk             /*!< SDIO clock enable */\n\n\n/******************  Bit definition for RCC_APB2ENR register  *****************/\n#define RCC_APB2ENR_AFIOEN_Pos               (0U)                              \n#define RCC_APB2ENR_AFIOEN_Msk               (0x1UL << RCC_APB2ENR_AFIOEN_Pos)  /*!< 0x00000001 */\n#define RCC_APB2ENR_AFIOEN                   RCC_APB2ENR_AFIOEN_Msk            /*!< Alternate Function I/O clock enable */\n#define RCC_APB2ENR_IOPAEN_Pos               (2U)                              \n#define RCC_APB2ENR_IOPAEN_Msk               (0x1UL << RCC_APB2ENR_IOPAEN_Pos)  /*!< 0x00000004 */\n#define RCC_APB2ENR_IOPAEN                   RCC_APB2ENR_IOPAEN_Msk            /*!< I/O port A clock enable */\n#define RCC_APB2ENR_IOPBEN_Pos               (3U)                              \n#define RCC_APB2ENR_IOPBEN_Msk               (0x1UL << RCC_APB2ENR_IOPBEN_Pos)  /*!< 0x00000008 */\n#define RCC_APB2ENR_IOPBEN                   RCC_APB2ENR_IOPBEN_Msk            /*!< I/O port B clock enable */\n#define RCC_APB2ENR_IOPCEN_Pos               (4U)                              \n#define RCC_APB2ENR_IOPCEN_Msk               (0x1UL << RCC_APB2ENR_IOPCEN_Pos)  /*!< 0x00000010 */\n#define RCC_APB2ENR_IOPCEN                   RCC_APB2ENR_IOPCEN_Msk            /*!< I/O port C clock enable */\n#define RCC_APB2ENR_IOPDEN_Pos               (5U)                              \n#define RCC_APB2ENR_IOPDEN_Msk               (0x1UL << RCC_APB2ENR_IOPDEN_Pos)  /*!< 0x00000020 */\n#define RCC_APB2ENR_IOPDEN                   RCC_APB2ENR_IOPDEN_Msk            /*!< I/O port D clock enable */\n#define RCC_APB2ENR_ADC1EN_Pos               (9U)                              \n#define RCC_APB2ENR_ADC1EN_Msk               (0x1UL << RCC_APB2ENR_ADC1EN_Pos)  /*!< 0x00000200 */\n#define RCC_APB2ENR_ADC1EN                   RCC_APB2ENR_ADC1EN_Msk            /*!< ADC 1 interface clock enable */\n\n#define RCC_APB2ENR_ADC2EN_Pos               (10U)                             \n#define RCC_APB2ENR_ADC2EN_Msk               (0x1UL << RCC_APB2ENR_ADC2EN_Pos)  /*!< 0x00000400 */\n#define RCC_APB2ENR_ADC2EN                   RCC_APB2ENR_ADC2EN_Msk            /*!< ADC 2 interface clock enable */\n\n#define RCC_APB2ENR_TIM1EN_Pos               (11U)                             \n#define RCC_APB2ENR_TIM1EN_Msk               (0x1UL << RCC_APB2ENR_TIM1EN_Pos)  /*!< 0x00000800 */\n#define RCC_APB2ENR_TIM1EN                   RCC_APB2ENR_TIM1EN_Msk            /*!< TIM1 Timer clock enable */\n#define RCC_APB2ENR_SPI1EN_Pos               (12U)                             \n#define RCC_APB2ENR_SPI1EN_Msk               (0x1UL << RCC_APB2ENR_SPI1EN_Pos)  /*!< 0x00001000 */\n#define RCC_APB2ENR_SPI1EN                   RCC_APB2ENR_SPI1EN_Msk            /*!< SPI 1 clock enable */\n#define RCC_APB2ENR_USART1EN_Pos             (14U)                             \n#define RCC_APB2ENR_USART1EN_Msk             (0x1UL << RCC_APB2ENR_USART1EN_Pos) /*!< 0x00004000 */\n#define RCC_APB2ENR_USART1EN                 RCC_APB2ENR_USART1EN_Msk          /*!< USART1 clock enable */\n\n\n#define RCC_APB2ENR_IOPEEN_Pos               (6U)                              \n#define RCC_APB2ENR_IOPEEN_Msk               (0x1UL << RCC_APB2ENR_IOPEEN_Pos)  /*!< 0x00000040 */\n#define RCC_APB2ENR_IOPEEN                   RCC_APB2ENR_IOPEEN_Msk            /*!< I/O port E clock enable */\n\n#define RCC_APB2ENR_IOPFEN_Pos               (7U)                              \n#define RCC_APB2ENR_IOPFEN_Msk               (0x1UL << RCC_APB2ENR_IOPFEN_Pos)  /*!< 0x00000080 */\n#define RCC_APB2ENR_IOPFEN                   RCC_APB2ENR_IOPFEN_Msk            /*!< I/O port F clock enable */\n#define RCC_APB2ENR_IOPGEN_Pos               (8U)                              \n#define RCC_APB2ENR_IOPGEN_Msk               (0x1UL << RCC_APB2ENR_IOPGEN_Pos)  /*!< 0x00000100 */\n#define RCC_APB2ENR_IOPGEN                   RCC_APB2ENR_IOPGEN_Msk            /*!< I/O port G clock enable */\n#define RCC_APB2ENR_TIM8EN_Pos               (13U)                             \n#define RCC_APB2ENR_TIM8EN_Msk               (0x1UL << RCC_APB2ENR_TIM8EN_Pos)  /*!< 0x00002000 */\n#define RCC_APB2ENR_TIM8EN                   RCC_APB2ENR_TIM8EN_Msk            /*!< TIM8 Timer clock enable */\n#define RCC_APB2ENR_ADC3EN_Pos               (15U)                             \n#define RCC_APB2ENR_ADC3EN_Msk               (0x1UL << RCC_APB2ENR_ADC3EN_Pos)  /*!< 0x00008000 */\n#define RCC_APB2ENR_ADC3EN                   RCC_APB2ENR_ADC3EN_Msk            /*!< DMA1 clock enable */\n\n\n\n/*****************  Bit definition for RCC_APB1ENR register  ******************/\n#define RCC_APB1ENR_TIM2EN_Pos               (0U)                              \n#define RCC_APB1ENR_TIM2EN_Msk               (0x1UL << RCC_APB1ENR_TIM2EN_Pos)  /*!< 0x00000001 */\n#define RCC_APB1ENR_TIM2EN                   RCC_APB1ENR_TIM2EN_Msk            /*!< Timer 2 clock enabled*/\n#define RCC_APB1ENR_TIM3EN_Pos               (1U)                              \n#define RCC_APB1ENR_TIM3EN_Msk               (0x1UL << RCC_APB1ENR_TIM3EN_Pos)  /*!< 0x00000002 */\n#define RCC_APB1ENR_TIM3EN                   RCC_APB1ENR_TIM3EN_Msk            /*!< Timer 3 clock enable */\n#define RCC_APB1ENR_WWDGEN_Pos               (11U)                             \n#define RCC_APB1ENR_WWDGEN_Msk               (0x1UL << RCC_APB1ENR_WWDGEN_Pos)  /*!< 0x00000800 */\n#define RCC_APB1ENR_WWDGEN                   RCC_APB1ENR_WWDGEN_Msk            /*!< Window Watchdog clock enable */\n#define RCC_APB1ENR_USART2EN_Pos             (17U)                             \n#define RCC_APB1ENR_USART2EN_Msk             (0x1UL << RCC_APB1ENR_USART2EN_Pos) /*!< 0x00020000 */\n#define RCC_APB1ENR_USART2EN                 RCC_APB1ENR_USART2EN_Msk          /*!< USART 2 clock enable */\n#define RCC_APB1ENR_I2C1EN_Pos               (21U)                             \n#define RCC_APB1ENR_I2C1EN_Msk               (0x1UL << RCC_APB1ENR_I2C1EN_Pos)  /*!< 0x00200000 */\n#define RCC_APB1ENR_I2C1EN                   RCC_APB1ENR_I2C1EN_Msk            /*!< I2C 1 clock enable */\n\n#define RCC_APB1ENR_CAN1EN_Pos               (25U)                             \n#define RCC_APB1ENR_CAN1EN_Msk               (0x1UL << RCC_APB1ENR_CAN1EN_Pos)  /*!< 0x02000000 */\n#define RCC_APB1ENR_CAN1EN                   RCC_APB1ENR_CAN1EN_Msk            /*!< CAN1 clock enable */\n\n#define RCC_APB1ENR_BKPEN_Pos                (27U)                             \n#define RCC_APB1ENR_BKPEN_Msk                (0x1UL << RCC_APB1ENR_BKPEN_Pos)   /*!< 0x08000000 */\n#define RCC_APB1ENR_BKPEN                    RCC_APB1ENR_BKPEN_Msk             /*!< Backup interface clock enable */\n#define RCC_APB1ENR_PWREN_Pos                (28U)                             \n#define RCC_APB1ENR_PWREN_Msk                (0x1UL << RCC_APB1ENR_PWREN_Pos)   /*!< 0x10000000 */\n#define RCC_APB1ENR_PWREN                    RCC_APB1ENR_PWREN_Msk             /*!< Power interface clock enable */\n\n#define RCC_APB1ENR_TIM4EN_Pos               (2U)                              \n#define RCC_APB1ENR_TIM4EN_Msk               (0x1UL << RCC_APB1ENR_TIM4EN_Pos)  /*!< 0x00000004 */\n#define RCC_APB1ENR_TIM4EN                   RCC_APB1ENR_TIM4EN_Msk            /*!< Timer 4 clock enable */\n#define RCC_APB1ENR_SPI2EN_Pos               (14U)                             \n#define RCC_APB1ENR_SPI2EN_Msk               (0x1UL << RCC_APB1ENR_SPI2EN_Pos)  /*!< 0x00004000 */\n#define RCC_APB1ENR_SPI2EN                   RCC_APB1ENR_SPI2EN_Msk            /*!< SPI 2 clock enable */\n#define RCC_APB1ENR_USART3EN_Pos             (18U)                             \n#define RCC_APB1ENR_USART3EN_Msk             (0x1UL << RCC_APB1ENR_USART3EN_Pos) /*!< 0x00040000 */\n#define RCC_APB1ENR_USART3EN                 RCC_APB1ENR_USART3EN_Msk          /*!< USART 3 clock enable */\n#define RCC_APB1ENR_I2C2EN_Pos               (22U)                             \n#define RCC_APB1ENR_I2C2EN_Msk               (0x1UL << RCC_APB1ENR_I2C2EN_Pos)  /*!< 0x00400000 */\n#define RCC_APB1ENR_I2C2EN                   RCC_APB1ENR_I2C2EN_Msk            /*!< I2C 2 clock enable */\n\n#define RCC_APB1ENR_USBEN_Pos                (23U)                             \n#define RCC_APB1ENR_USBEN_Msk                (0x1UL << RCC_APB1ENR_USBEN_Pos)   /*!< 0x00800000 */\n#define RCC_APB1ENR_USBEN                    RCC_APB1ENR_USBEN_Msk             /*!< USB Device clock enable */\n\n#define RCC_APB1ENR_TIM5EN_Pos               (3U)                              \n#define RCC_APB1ENR_TIM5EN_Msk               (0x1UL << RCC_APB1ENR_TIM5EN_Pos)  /*!< 0x00000008 */\n#define RCC_APB1ENR_TIM5EN                   RCC_APB1ENR_TIM5EN_Msk            /*!< Timer 5 clock enable */\n#define RCC_APB1ENR_TIM6EN_Pos               (4U)                              \n#define RCC_APB1ENR_TIM6EN_Msk               (0x1UL << RCC_APB1ENR_TIM6EN_Pos)  /*!< 0x00000010 */\n#define RCC_APB1ENR_TIM6EN                   RCC_APB1ENR_TIM6EN_Msk            /*!< Timer 6 clock enable */\n#define RCC_APB1ENR_TIM7EN_Pos               (5U)                              \n#define RCC_APB1ENR_TIM7EN_Msk               (0x1UL << RCC_APB1ENR_TIM7EN_Pos)  /*!< 0x00000020 */\n#define RCC_APB1ENR_TIM7EN                   RCC_APB1ENR_TIM7EN_Msk            /*!< Timer 7 clock enable */\n#define RCC_APB1ENR_SPI3EN_Pos               (15U)                             \n#define RCC_APB1ENR_SPI3EN_Msk               (0x1UL << RCC_APB1ENR_SPI3EN_Pos)  /*!< 0x00008000 */\n#define RCC_APB1ENR_SPI3EN                   RCC_APB1ENR_SPI3EN_Msk            /*!< SPI 3 clock enable */\n#define RCC_APB1ENR_UART4EN_Pos              (19U)                             \n#define RCC_APB1ENR_UART4EN_Msk              (0x1UL << RCC_APB1ENR_UART4EN_Pos) /*!< 0x00080000 */\n#define RCC_APB1ENR_UART4EN                  RCC_APB1ENR_UART4EN_Msk           /*!< UART 4 clock enable */\n#define RCC_APB1ENR_UART5EN_Pos              (20U)                             \n#define RCC_APB1ENR_UART5EN_Msk              (0x1UL << RCC_APB1ENR_UART5EN_Pos) /*!< 0x00100000 */\n#define RCC_APB1ENR_UART5EN                  RCC_APB1ENR_UART5EN_Msk           /*!< UART 5 clock enable */\n\n\n\n\n#define RCC_APB1ENR_DACEN_Pos                (29U)                             \n#define RCC_APB1ENR_DACEN_Msk                (0x1UL << RCC_APB1ENR_DACEN_Pos)   /*!< 0x20000000 */\n#define RCC_APB1ENR_DACEN                    RCC_APB1ENR_DACEN_Msk             /*!< DAC interface clock enable */\n\n/*******************  Bit definition for RCC_BDCR register  *******************/\n#define RCC_BDCR_LSEON_Pos                   (0U)                              \n#define RCC_BDCR_LSEON_Msk                   (0x1UL << RCC_BDCR_LSEON_Pos)      /*!< 0x00000001 */\n#define RCC_BDCR_LSEON                       RCC_BDCR_LSEON_Msk                /*!< External Low Speed oscillator enable */\n#define RCC_BDCR_LSERDY_Pos                  (1U)                              \n#define RCC_BDCR_LSERDY_Msk                  (0x1UL << RCC_BDCR_LSERDY_Pos)     /*!< 0x00000002 */\n#define RCC_BDCR_LSERDY                      RCC_BDCR_LSERDY_Msk               /*!< External Low Speed oscillator Ready */\n#define RCC_BDCR_LSEBYP_Pos                  (2U)                              \n#define RCC_BDCR_LSEBYP_Msk                  (0x1UL << RCC_BDCR_LSEBYP_Pos)     /*!< 0x00000004 */\n#define RCC_BDCR_LSEBYP                      RCC_BDCR_LSEBYP_Msk               /*!< External Low Speed oscillator Bypass */\n\n#define RCC_BDCR_RTCSEL_Pos                  (8U)                              \n#define RCC_BDCR_RTCSEL_Msk                  (0x3UL << RCC_BDCR_RTCSEL_Pos)     /*!< 0x00000300 */\n#define RCC_BDCR_RTCSEL                      RCC_BDCR_RTCSEL_Msk               /*!< RTCSEL[1:0] bits (RTC clock source selection) */\n#define RCC_BDCR_RTCSEL_0                    (0x1UL << RCC_BDCR_RTCSEL_Pos)     /*!< 0x00000100 */\n#define RCC_BDCR_RTCSEL_1                    (0x2UL << RCC_BDCR_RTCSEL_Pos)     /*!< 0x00000200 */\n\n/*!< RTC congiguration */\n#define RCC_BDCR_RTCSEL_NOCLOCK              0x00000000U                       /*!< No clock */\n#define RCC_BDCR_RTCSEL_LSE                  0x00000100U                       /*!< LSE oscillator clock used as RTC clock */\n#define RCC_BDCR_RTCSEL_LSI                  0x00000200U                       /*!< LSI oscillator clock used as RTC clock */\n#define RCC_BDCR_RTCSEL_HSE                  0x00000300U                       /*!< HSE oscillator clock divided by 128 used as RTC clock */\n\n#define RCC_BDCR_RTCEN_Pos                   (15U)                             \n#define RCC_BDCR_RTCEN_Msk                   (0x1UL << RCC_BDCR_RTCEN_Pos)      /*!< 0x00008000 */\n#define RCC_BDCR_RTCEN                       RCC_BDCR_RTCEN_Msk                /*!< RTC clock enable */\n#define RCC_BDCR_BDRST_Pos                   (16U)                             \n#define RCC_BDCR_BDRST_Msk                   (0x1UL << RCC_BDCR_BDRST_Pos)      /*!< 0x00010000 */\n#define RCC_BDCR_BDRST                       RCC_BDCR_BDRST_Msk                /*!< Backup domain software reset  */\n\n/*******************  Bit definition for RCC_CSR register  ********************/  \n#define RCC_CSR_LSION_Pos                    (0U)                              \n#define RCC_CSR_LSION_Msk                    (0x1UL << RCC_CSR_LSION_Pos)       /*!< 0x00000001 */\n#define RCC_CSR_LSION                        RCC_CSR_LSION_Msk                 /*!< Internal Low Speed oscillator enable */\n#define RCC_CSR_LSIRDY_Pos                   (1U)                              \n#define RCC_CSR_LSIRDY_Msk                   (0x1UL << RCC_CSR_LSIRDY_Pos)      /*!< 0x00000002 */\n#define RCC_CSR_LSIRDY                       RCC_CSR_LSIRDY_Msk                /*!< Internal Low Speed oscillator Ready */\n#define RCC_CSR_RMVF_Pos                     (24U)                             \n#define RCC_CSR_RMVF_Msk                     (0x1UL << RCC_CSR_RMVF_Pos)        /*!< 0x01000000 */\n#define RCC_CSR_RMVF                         RCC_CSR_RMVF_Msk                  /*!< Remove reset flag */\n#define RCC_CSR_PINRSTF_Pos                  (26U)                             \n#define RCC_CSR_PINRSTF_Msk                  (0x1UL << RCC_CSR_PINRSTF_Pos)     /*!< 0x04000000 */\n#define RCC_CSR_PINRSTF                      RCC_CSR_PINRSTF_Msk               /*!< PIN reset flag */\n#define RCC_CSR_PORRSTF_Pos                  (27U)                             \n#define RCC_CSR_PORRSTF_Msk                  (0x1UL << RCC_CSR_PORRSTF_Pos)     /*!< 0x08000000 */\n#define RCC_CSR_PORRSTF                      RCC_CSR_PORRSTF_Msk               /*!< POR/PDR reset flag */\n#define RCC_CSR_SFTRSTF_Pos                  (28U)                             \n#define RCC_CSR_SFTRSTF_Msk                  (0x1UL << RCC_CSR_SFTRSTF_Pos)     /*!< 0x10000000 */\n#define RCC_CSR_SFTRSTF                      RCC_CSR_SFTRSTF_Msk               /*!< Software Reset flag */\n#define RCC_CSR_IWDGRSTF_Pos                 (29U)                             \n#define RCC_CSR_IWDGRSTF_Msk                 (0x1UL << RCC_CSR_IWDGRSTF_Pos)    /*!< 0x20000000 */\n#define RCC_CSR_IWDGRSTF                     RCC_CSR_IWDGRSTF_Msk              /*!< Independent Watchdog reset flag */\n#define RCC_CSR_WWDGRSTF_Pos                 (30U)                             \n#define RCC_CSR_WWDGRSTF_Msk                 (0x1UL << RCC_CSR_WWDGRSTF_Pos)    /*!< 0x40000000 */\n#define RCC_CSR_WWDGRSTF                     RCC_CSR_WWDGRSTF_Msk              /*!< Window watchdog reset flag */\n#define RCC_CSR_LPWRRSTF_Pos                 (31U)                             \n#define RCC_CSR_LPWRRSTF_Msk                 (0x1UL << RCC_CSR_LPWRRSTF_Pos)    /*!< 0x80000000 */\n#define RCC_CSR_LPWRRSTF                     RCC_CSR_LPWRRSTF_Msk              /*!< Low-Power reset flag */\n\n\n \n/******************************************************************************/\n/*                                                                            */\n/*                General Purpose and Alternate Function I/O                  */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for GPIO_CRL register  *******************/\n#define GPIO_CRL_MODE_Pos                    (0U)                              \n#define GPIO_CRL_MODE_Msk                    (0x33333333UL << GPIO_CRL_MODE_Pos) /*!< 0x33333333 */\n#define GPIO_CRL_MODE                        GPIO_CRL_MODE_Msk                 /*!< Port x mode bits */\n\n#define GPIO_CRL_MODE0_Pos                   (0U)                              \n#define GPIO_CRL_MODE0_Msk                   (0x3UL << GPIO_CRL_MODE0_Pos)      /*!< 0x00000003 */\n#define GPIO_CRL_MODE0                       GPIO_CRL_MODE0_Msk                /*!< MODE0[1:0] bits (Port x mode bits, pin 0) */\n#define GPIO_CRL_MODE0_0                     (0x1UL << GPIO_CRL_MODE0_Pos)      /*!< 0x00000001 */\n#define GPIO_CRL_MODE0_1                     (0x2UL << GPIO_CRL_MODE0_Pos)      /*!< 0x00000002 */\n\n#define GPIO_CRL_MODE1_Pos                   (4U)                              \n#define GPIO_CRL_MODE1_Msk                   (0x3UL << GPIO_CRL_MODE1_Pos)      /*!< 0x00000030 */\n#define GPIO_CRL_MODE1                       GPIO_CRL_MODE1_Msk                /*!< MODE1[1:0] bits (Port x mode bits, pin 1) */\n#define GPIO_CRL_MODE1_0                     (0x1UL << GPIO_CRL_MODE1_Pos)      /*!< 0x00000010 */\n#define GPIO_CRL_MODE1_1                     (0x2UL << GPIO_CRL_MODE1_Pos)      /*!< 0x00000020 */\n\n#define GPIO_CRL_MODE2_Pos                   (8U)                              \n#define GPIO_CRL_MODE2_Msk                   (0x3UL << GPIO_CRL_MODE2_Pos)      /*!< 0x00000300 */\n#define GPIO_CRL_MODE2                       GPIO_CRL_MODE2_Msk                /*!< MODE2[1:0] bits (Port x mode bits, pin 2) */\n#define GPIO_CRL_MODE2_0                     (0x1UL << GPIO_CRL_MODE2_Pos)      /*!< 0x00000100 */\n#define GPIO_CRL_MODE2_1                     (0x2UL << GPIO_CRL_MODE2_Pos)      /*!< 0x00000200 */\n\n#define GPIO_CRL_MODE3_Pos                   (12U)                             \n#define GPIO_CRL_MODE3_Msk                   (0x3UL << GPIO_CRL_MODE3_Pos)      /*!< 0x00003000 */\n#define GPIO_CRL_MODE3                       GPIO_CRL_MODE3_Msk                /*!< MODE3[1:0] bits (Port x mode bits, pin 3) */\n#define GPIO_CRL_MODE3_0                     (0x1UL << GPIO_CRL_MODE3_Pos)      /*!< 0x00001000 */\n#define GPIO_CRL_MODE3_1                     (0x2UL << GPIO_CRL_MODE3_Pos)      /*!< 0x00002000 */\n\n#define GPIO_CRL_MODE4_Pos                   (16U)                             \n#define GPIO_CRL_MODE4_Msk                   (0x3UL << GPIO_CRL_MODE4_Pos)      /*!< 0x00030000 */\n#define GPIO_CRL_MODE4                       GPIO_CRL_MODE4_Msk                /*!< MODE4[1:0] bits (Port x mode bits, pin 4) */\n#define GPIO_CRL_MODE4_0                     (0x1UL << GPIO_CRL_MODE4_Pos)      /*!< 0x00010000 */\n#define GPIO_CRL_MODE4_1                     (0x2UL << GPIO_CRL_MODE4_Pos)      /*!< 0x00020000 */\n\n#define GPIO_CRL_MODE5_Pos                   (20U)                             \n#define GPIO_CRL_MODE5_Msk                   (0x3UL << GPIO_CRL_MODE5_Pos)      /*!< 0x00300000 */\n#define GPIO_CRL_MODE5                       GPIO_CRL_MODE5_Msk                /*!< MODE5[1:0] bits (Port x mode bits, pin 5) */\n#define GPIO_CRL_MODE5_0                     (0x1UL << GPIO_CRL_MODE5_Pos)      /*!< 0x00100000 */\n#define GPIO_CRL_MODE5_1                     (0x2UL << GPIO_CRL_MODE5_Pos)      /*!< 0x00200000 */\n\n#define GPIO_CRL_MODE6_Pos                   (24U)                             \n#define GPIO_CRL_MODE6_Msk                   (0x3UL << GPIO_CRL_MODE6_Pos)      /*!< 0x03000000 */\n#define GPIO_CRL_MODE6                       GPIO_CRL_MODE6_Msk                /*!< MODE6[1:0] bits (Port x mode bits, pin 6) */\n#define GPIO_CRL_MODE6_0                     (0x1UL << GPIO_CRL_MODE6_Pos)      /*!< 0x01000000 */\n#define GPIO_CRL_MODE6_1                     (0x2UL << GPIO_CRL_MODE6_Pos)      /*!< 0x02000000 */\n\n#define GPIO_CRL_MODE7_Pos                   (28U)                             \n#define GPIO_CRL_MODE7_Msk                   (0x3UL << GPIO_CRL_MODE7_Pos)      /*!< 0x30000000 */\n#define GPIO_CRL_MODE7                       GPIO_CRL_MODE7_Msk                /*!< MODE7[1:0] bits (Port x mode bits, pin 7) */\n#define GPIO_CRL_MODE7_0                     (0x1UL << GPIO_CRL_MODE7_Pos)      /*!< 0x10000000 */\n#define GPIO_CRL_MODE7_1                     (0x2UL << GPIO_CRL_MODE7_Pos)      /*!< 0x20000000 */\n\n#define GPIO_CRL_CNF_Pos                     (2U)                              \n#define GPIO_CRL_CNF_Msk                     (0x33333333UL << GPIO_CRL_CNF_Pos) /*!< 0xCCCCCCCC */\n#define GPIO_CRL_CNF                         GPIO_CRL_CNF_Msk                  /*!< Port x configuration bits */\n\n#define GPIO_CRL_CNF0_Pos                    (2U)                              \n#define GPIO_CRL_CNF0_Msk                    (0x3UL << GPIO_CRL_CNF0_Pos)       /*!< 0x0000000C */\n#define GPIO_CRL_CNF0                        GPIO_CRL_CNF0_Msk                 /*!< CNF0[1:0] bits (Port x configuration bits, pin 0) */\n#define GPIO_CRL_CNF0_0                      (0x1UL << GPIO_CRL_CNF0_Pos)       /*!< 0x00000004 */\n#define GPIO_CRL_CNF0_1                      (0x2UL << GPIO_CRL_CNF0_Pos)       /*!< 0x00000008 */\n\n#define GPIO_CRL_CNF1_Pos                    (6U)                              \n#define GPIO_CRL_CNF1_Msk                    (0x3UL << GPIO_CRL_CNF1_Pos)       /*!< 0x000000C0 */\n#define GPIO_CRL_CNF1                        GPIO_CRL_CNF1_Msk                 /*!< CNF1[1:0] bits (Port x configuration bits, pin 1) */\n#define GPIO_CRL_CNF1_0                      (0x1UL << GPIO_CRL_CNF1_Pos)       /*!< 0x00000040 */\n#define GPIO_CRL_CNF1_1                      (0x2UL << GPIO_CRL_CNF1_Pos)       /*!< 0x00000080 */\n\n#define GPIO_CRL_CNF2_Pos                    (10U)                             \n#define GPIO_CRL_CNF2_Msk                    (0x3UL << GPIO_CRL_CNF2_Pos)       /*!< 0x00000C00 */\n#define GPIO_CRL_CNF2                        GPIO_CRL_CNF2_Msk                 /*!< CNF2[1:0] bits (Port x configuration bits, pin 2) */\n#define GPIO_CRL_CNF2_0                      (0x1UL << GPIO_CRL_CNF2_Pos)       /*!< 0x00000400 */\n#define GPIO_CRL_CNF2_1                      (0x2UL << GPIO_CRL_CNF2_Pos)       /*!< 0x00000800 */\n\n#define GPIO_CRL_CNF3_Pos                    (14U)                             \n#define GPIO_CRL_CNF3_Msk                    (0x3UL << GPIO_CRL_CNF3_Pos)       /*!< 0x0000C000 */\n#define GPIO_CRL_CNF3                        GPIO_CRL_CNF3_Msk                 /*!< CNF3[1:0] bits (Port x configuration bits, pin 3) */\n#define GPIO_CRL_CNF3_0                      (0x1UL << GPIO_CRL_CNF3_Pos)       /*!< 0x00004000 */\n#define GPIO_CRL_CNF3_1                      (0x2UL << GPIO_CRL_CNF3_Pos)       /*!< 0x00008000 */\n\n#define GPIO_CRL_CNF4_Pos                    (18U)                             \n#define GPIO_CRL_CNF4_Msk                    (0x3UL << GPIO_CRL_CNF4_Pos)       /*!< 0x000C0000 */\n#define GPIO_CRL_CNF4                        GPIO_CRL_CNF4_Msk                 /*!< CNF4[1:0] bits (Port x configuration bits, pin 4) */\n#define GPIO_CRL_CNF4_0                      (0x1UL << GPIO_CRL_CNF4_Pos)       /*!< 0x00040000 */\n#define GPIO_CRL_CNF4_1                      (0x2UL << GPIO_CRL_CNF4_Pos)       /*!< 0x00080000 */\n\n#define GPIO_CRL_CNF5_Pos                    (22U)                             \n#define GPIO_CRL_CNF5_Msk                    (0x3UL << GPIO_CRL_CNF5_Pos)       /*!< 0x00C00000 */\n#define GPIO_CRL_CNF5                        GPIO_CRL_CNF5_Msk                 /*!< CNF5[1:0] bits (Port x configuration bits, pin 5) */\n#define GPIO_CRL_CNF5_0                      (0x1UL << GPIO_CRL_CNF5_Pos)       /*!< 0x00400000 */\n#define GPIO_CRL_CNF5_1                      (0x2UL << GPIO_CRL_CNF5_Pos)       /*!< 0x00800000 */\n\n#define GPIO_CRL_CNF6_Pos                    (26U)                             \n#define GPIO_CRL_CNF6_Msk                    (0x3UL << GPIO_CRL_CNF6_Pos)       /*!< 0x0C000000 */\n#define GPIO_CRL_CNF6                        GPIO_CRL_CNF6_Msk                 /*!< CNF6[1:0] bits (Port x configuration bits, pin 6) */\n#define GPIO_CRL_CNF6_0                      (0x1UL << GPIO_CRL_CNF6_Pos)       /*!< 0x04000000 */\n#define GPIO_CRL_CNF6_1                      (0x2UL << GPIO_CRL_CNF6_Pos)       /*!< 0x08000000 */\n\n#define GPIO_CRL_CNF7_Pos                    (30U)                             \n#define GPIO_CRL_CNF7_Msk                    (0x3UL << GPIO_CRL_CNF7_Pos)       /*!< 0xC0000000 */\n#define GPIO_CRL_CNF7                        GPIO_CRL_CNF7_Msk                 /*!< CNF7[1:0] bits (Port x configuration bits, pin 7) */\n#define GPIO_CRL_CNF7_0                      (0x1UL << GPIO_CRL_CNF7_Pos)       /*!< 0x40000000 */\n#define GPIO_CRL_CNF7_1                      (0x2UL << GPIO_CRL_CNF7_Pos)       /*!< 0x80000000 */\n\n/*******************  Bit definition for GPIO_CRH register  *******************/\n#define GPIO_CRH_MODE_Pos                    (0U)                              \n#define GPIO_CRH_MODE_Msk                    (0x33333333UL << GPIO_CRH_MODE_Pos) /*!< 0x33333333 */\n#define GPIO_CRH_MODE                        GPIO_CRH_MODE_Msk                 /*!< Port x mode bits */\n\n#define GPIO_CRH_MODE8_Pos                   (0U)                              \n#define GPIO_CRH_MODE8_Msk                   (0x3UL << GPIO_CRH_MODE8_Pos)      /*!< 0x00000003 */\n#define GPIO_CRH_MODE8                       GPIO_CRH_MODE8_Msk                /*!< MODE8[1:0] bits (Port x mode bits, pin 8) */\n#define GPIO_CRH_MODE8_0                     (0x1UL << GPIO_CRH_MODE8_Pos)      /*!< 0x00000001 */\n#define GPIO_CRH_MODE8_1                     (0x2UL << GPIO_CRH_MODE8_Pos)      /*!< 0x00000002 */\n\n#define GPIO_CRH_MODE9_Pos                   (4U)                              \n#define GPIO_CRH_MODE9_Msk                   (0x3UL << GPIO_CRH_MODE9_Pos)      /*!< 0x00000030 */\n#define GPIO_CRH_MODE9                       GPIO_CRH_MODE9_Msk                /*!< MODE9[1:0] bits (Port x mode bits, pin 9) */\n#define GPIO_CRH_MODE9_0                     (0x1UL << GPIO_CRH_MODE9_Pos)      /*!< 0x00000010 */\n#define GPIO_CRH_MODE9_1                     (0x2UL << GPIO_CRH_MODE9_Pos)      /*!< 0x00000020 */\n\n#define GPIO_CRH_MODE10_Pos                  (8U)                              \n#define GPIO_CRH_MODE10_Msk                  (0x3UL << GPIO_CRH_MODE10_Pos)     /*!< 0x00000300 */\n#define GPIO_CRH_MODE10                      GPIO_CRH_MODE10_Msk               /*!< MODE10[1:0] bits (Port x mode bits, pin 10) */\n#define GPIO_CRH_MODE10_0                    (0x1UL << GPIO_CRH_MODE10_Pos)     /*!< 0x00000100 */\n#define GPIO_CRH_MODE10_1                    (0x2UL << GPIO_CRH_MODE10_Pos)     /*!< 0x00000200 */\n\n#define GPIO_CRH_MODE11_Pos                  (12U)                             \n#define GPIO_CRH_MODE11_Msk                  (0x3UL << GPIO_CRH_MODE11_Pos)     /*!< 0x00003000 */\n#define GPIO_CRH_MODE11                      GPIO_CRH_MODE11_Msk               /*!< MODE11[1:0] bits (Port x mode bits, pin 11) */\n#define GPIO_CRH_MODE11_0                    (0x1UL << GPIO_CRH_MODE11_Pos)     /*!< 0x00001000 */\n#define GPIO_CRH_MODE11_1                    (0x2UL << GPIO_CRH_MODE11_Pos)     /*!< 0x00002000 */\n\n#define GPIO_CRH_MODE12_Pos                  (16U)                             \n#define GPIO_CRH_MODE12_Msk                  (0x3UL << GPIO_CRH_MODE12_Pos)     /*!< 0x00030000 */\n#define GPIO_CRH_MODE12                      GPIO_CRH_MODE12_Msk               /*!< MODE12[1:0] bits (Port x mode bits, pin 12) */\n#define GPIO_CRH_MODE12_0                    (0x1UL << GPIO_CRH_MODE12_Pos)     /*!< 0x00010000 */\n#define GPIO_CRH_MODE12_1                    (0x2UL << GPIO_CRH_MODE12_Pos)     /*!< 0x00020000 */\n\n#define GPIO_CRH_MODE13_Pos                  (20U)                             \n#define GPIO_CRH_MODE13_Msk                  (0x3UL << GPIO_CRH_MODE13_Pos)     /*!< 0x00300000 */\n#define GPIO_CRH_MODE13                      GPIO_CRH_MODE13_Msk               /*!< MODE13[1:0] bits (Port x mode bits, pin 13) */\n#define GPIO_CRH_MODE13_0                    (0x1UL << GPIO_CRH_MODE13_Pos)     /*!< 0x00100000 */\n#define GPIO_CRH_MODE13_1                    (0x2UL << GPIO_CRH_MODE13_Pos)     /*!< 0x00200000 */\n\n#define GPIO_CRH_MODE14_Pos                  (24U)                             \n#define GPIO_CRH_MODE14_Msk                  (0x3UL << GPIO_CRH_MODE14_Pos)     /*!< 0x03000000 */\n#define GPIO_CRH_MODE14                      GPIO_CRH_MODE14_Msk               /*!< MODE14[1:0] bits (Port x mode bits, pin 14) */\n#define GPIO_CRH_MODE14_0                    (0x1UL << GPIO_CRH_MODE14_Pos)     /*!< 0x01000000 */\n#define GPIO_CRH_MODE14_1                    (0x2UL << GPIO_CRH_MODE14_Pos)     /*!< 0x02000000 */\n\n#define GPIO_CRH_MODE15_Pos                  (28U)                             \n#define GPIO_CRH_MODE15_Msk                  (0x3UL << GPIO_CRH_MODE15_Pos)     /*!< 0x30000000 */\n#define GPIO_CRH_MODE15                      GPIO_CRH_MODE15_Msk               /*!< MODE15[1:0] bits (Port x mode bits, pin 15) */\n#define GPIO_CRH_MODE15_0                    (0x1UL << GPIO_CRH_MODE15_Pos)     /*!< 0x10000000 */\n#define GPIO_CRH_MODE15_1                    (0x2UL << GPIO_CRH_MODE15_Pos)     /*!< 0x20000000 */\n\n#define GPIO_CRH_CNF_Pos                     (2U)                              \n#define GPIO_CRH_CNF_Msk                     (0x33333333UL << GPIO_CRH_CNF_Pos) /*!< 0xCCCCCCCC */\n#define GPIO_CRH_CNF                         GPIO_CRH_CNF_Msk                  /*!< Port x configuration bits */\n\n#define GPIO_CRH_CNF8_Pos                    (2U)                              \n#define GPIO_CRH_CNF8_Msk                    (0x3UL << GPIO_CRH_CNF8_Pos)       /*!< 0x0000000C */\n#define GPIO_CRH_CNF8                        GPIO_CRH_CNF8_Msk                 /*!< CNF8[1:0] bits (Port x configuration bits, pin 8) */\n#define GPIO_CRH_CNF8_0                      (0x1UL << GPIO_CRH_CNF8_Pos)       /*!< 0x00000004 */\n#define GPIO_CRH_CNF8_1                      (0x2UL << GPIO_CRH_CNF8_Pos)       /*!< 0x00000008 */\n\n#define GPIO_CRH_CNF9_Pos                    (6U)                              \n#define GPIO_CRH_CNF9_Msk                    (0x3UL << GPIO_CRH_CNF9_Pos)       /*!< 0x000000C0 */\n#define GPIO_CRH_CNF9                        GPIO_CRH_CNF9_Msk                 /*!< CNF9[1:0] bits (Port x configuration bits, pin 9) */\n#define GPIO_CRH_CNF9_0                      (0x1UL << GPIO_CRH_CNF9_Pos)       /*!< 0x00000040 */\n#define GPIO_CRH_CNF9_1                      (0x2UL << GPIO_CRH_CNF9_Pos)       /*!< 0x00000080 */\n\n#define GPIO_CRH_CNF10_Pos                   (10U)                             \n#define GPIO_CRH_CNF10_Msk                   (0x3UL << GPIO_CRH_CNF10_Pos)      /*!< 0x00000C00 */\n#define GPIO_CRH_CNF10                       GPIO_CRH_CNF10_Msk                /*!< CNF10[1:0] bits (Port x configuration bits, pin 10) */\n#define GPIO_CRH_CNF10_0                     (0x1UL << GPIO_CRH_CNF10_Pos)      /*!< 0x00000400 */\n#define GPIO_CRH_CNF10_1                     (0x2UL << GPIO_CRH_CNF10_Pos)      /*!< 0x00000800 */\n\n#define GPIO_CRH_CNF11_Pos                   (14U)                             \n#define GPIO_CRH_CNF11_Msk                   (0x3UL << GPIO_CRH_CNF11_Pos)      /*!< 0x0000C000 */\n#define GPIO_CRH_CNF11                       GPIO_CRH_CNF11_Msk                /*!< CNF11[1:0] bits (Port x configuration bits, pin 11) */\n#define GPIO_CRH_CNF11_0                     (0x1UL << GPIO_CRH_CNF11_Pos)      /*!< 0x00004000 */\n#define GPIO_CRH_CNF11_1                     (0x2UL << GPIO_CRH_CNF11_Pos)      /*!< 0x00008000 */\n\n#define GPIO_CRH_CNF12_Pos                   (18U)                             \n#define GPIO_CRH_CNF12_Msk                   (0x3UL << GPIO_CRH_CNF12_Pos)      /*!< 0x000C0000 */\n#define GPIO_CRH_CNF12                       GPIO_CRH_CNF12_Msk                /*!< CNF12[1:0] bits (Port x configuration bits, pin 12) */\n#define GPIO_CRH_CNF12_0                     (0x1UL << GPIO_CRH_CNF12_Pos)      /*!< 0x00040000 */\n#define GPIO_CRH_CNF12_1                     (0x2UL << GPIO_CRH_CNF12_Pos)      /*!< 0x00080000 */\n\n#define GPIO_CRH_CNF13_Pos                   (22U)                             \n#define GPIO_CRH_CNF13_Msk                   (0x3UL << GPIO_CRH_CNF13_Pos)      /*!< 0x00C00000 */\n#define GPIO_CRH_CNF13                       GPIO_CRH_CNF13_Msk                /*!< CNF13[1:0] bits (Port x configuration bits, pin 13) */\n#define GPIO_CRH_CNF13_0                     (0x1UL << GPIO_CRH_CNF13_Pos)      /*!< 0x00400000 */\n#define GPIO_CRH_CNF13_1                     (0x2UL << GPIO_CRH_CNF13_Pos)      /*!< 0x00800000 */\n\n#define GPIO_CRH_CNF14_Pos                   (26U)                             \n#define GPIO_CRH_CNF14_Msk                   (0x3UL << GPIO_CRH_CNF14_Pos)      /*!< 0x0C000000 */\n#define GPIO_CRH_CNF14                       GPIO_CRH_CNF14_Msk                /*!< CNF14[1:0] bits (Port x configuration bits, pin 14) */\n#define GPIO_CRH_CNF14_0                     (0x1UL << GPIO_CRH_CNF14_Pos)      /*!< 0x04000000 */\n#define GPIO_CRH_CNF14_1                     (0x2UL << GPIO_CRH_CNF14_Pos)      /*!< 0x08000000 */\n\n#define GPIO_CRH_CNF15_Pos                   (30U)                             \n#define GPIO_CRH_CNF15_Msk                   (0x3UL << GPIO_CRH_CNF15_Pos)      /*!< 0xC0000000 */\n#define GPIO_CRH_CNF15                       GPIO_CRH_CNF15_Msk                /*!< CNF15[1:0] bits (Port x configuration bits, pin 15) */\n#define GPIO_CRH_CNF15_0                     (0x1UL << GPIO_CRH_CNF15_Pos)      /*!< 0x40000000 */\n#define GPIO_CRH_CNF15_1                     (0x2UL << GPIO_CRH_CNF15_Pos)      /*!< 0x80000000 */\n\n/*!<******************  Bit definition for GPIO_IDR register  *******************/\n#define GPIO_IDR_IDR0_Pos                    (0U)                              \n#define GPIO_IDR_IDR0_Msk                    (0x1UL << GPIO_IDR_IDR0_Pos)       /*!< 0x00000001 */\n#define GPIO_IDR_IDR0                        GPIO_IDR_IDR0_Msk                 /*!< Port input data, bit 0 */\n#define GPIO_IDR_IDR1_Pos                    (1U)                              \n#define GPIO_IDR_IDR1_Msk                    (0x1UL << GPIO_IDR_IDR1_Pos)       /*!< 0x00000002 */\n#define GPIO_IDR_IDR1                        GPIO_IDR_IDR1_Msk                 /*!< Port input data, bit 1 */\n#define GPIO_IDR_IDR2_Pos                    (2U)                              \n#define GPIO_IDR_IDR2_Msk                    (0x1UL << GPIO_IDR_IDR2_Pos)       /*!< 0x00000004 */\n#define GPIO_IDR_IDR2                        GPIO_IDR_IDR2_Msk                 /*!< Port input data, bit 2 */\n#define GPIO_IDR_IDR3_Pos                    (3U)                              \n#define GPIO_IDR_IDR3_Msk                    (0x1UL << GPIO_IDR_IDR3_Pos)       /*!< 0x00000008 */\n#define GPIO_IDR_IDR3                        GPIO_IDR_IDR3_Msk                 /*!< Port input data, bit 3 */\n#define GPIO_IDR_IDR4_Pos                    (4U)                              \n#define GPIO_IDR_IDR4_Msk                    (0x1UL << GPIO_IDR_IDR4_Pos)       /*!< 0x00000010 */\n#define GPIO_IDR_IDR4                        GPIO_IDR_IDR4_Msk                 /*!< Port input data, bit 4 */\n#define GPIO_IDR_IDR5_Pos                    (5U)                              \n#define GPIO_IDR_IDR5_Msk                    (0x1UL << GPIO_IDR_IDR5_Pos)       /*!< 0x00000020 */\n#define GPIO_IDR_IDR5                        GPIO_IDR_IDR5_Msk                 /*!< Port input data, bit 5 */\n#define GPIO_IDR_IDR6_Pos                    (6U)                              \n#define GPIO_IDR_IDR6_Msk                    (0x1UL << GPIO_IDR_IDR6_Pos)       /*!< 0x00000040 */\n#define GPIO_IDR_IDR6                        GPIO_IDR_IDR6_Msk                 /*!< Port input data, bit 6 */\n#define GPIO_IDR_IDR7_Pos                    (7U)                              \n#define GPIO_IDR_IDR7_Msk                    (0x1UL << GPIO_IDR_IDR7_Pos)       /*!< 0x00000080 */\n#define GPIO_IDR_IDR7                        GPIO_IDR_IDR7_Msk                 /*!< Port input data, bit 7 */\n#define GPIO_IDR_IDR8_Pos                    (8U)                              \n#define GPIO_IDR_IDR8_Msk                    (0x1UL << GPIO_IDR_IDR8_Pos)       /*!< 0x00000100 */\n#define GPIO_IDR_IDR8                        GPIO_IDR_IDR8_Msk                 /*!< Port input data, bit 8 */\n#define GPIO_IDR_IDR9_Pos                    (9U)                              \n#define GPIO_IDR_IDR9_Msk                    (0x1UL << GPIO_IDR_IDR9_Pos)       /*!< 0x00000200 */\n#define GPIO_IDR_IDR9                        GPIO_IDR_IDR9_Msk                 /*!< Port input data, bit 9 */\n#define GPIO_IDR_IDR10_Pos                   (10U)                             \n#define GPIO_IDR_IDR10_Msk                   (0x1UL << GPIO_IDR_IDR10_Pos)      /*!< 0x00000400 */\n#define GPIO_IDR_IDR10                       GPIO_IDR_IDR10_Msk                /*!< Port input data, bit 10 */\n#define GPIO_IDR_IDR11_Pos                   (11U)                             \n#define GPIO_IDR_IDR11_Msk                   (0x1UL << GPIO_IDR_IDR11_Pos)      /*!< 0x00000800 */\n#define GPIO_IDR_IDR11                       GPIO_IDR_IDR11_Msk                /*!< Port input data, bit 11 */\n#define GPIO_IDR_IDR12_Pos                   (12U)                             \n#define GPIO_IDR_IDR12_Msk                   (0x1UL << GPIO_IDR_IDR12_Pos)      /*!< 0x00001000 */\n#define GPIO_IDR_IDR12                       GPIO_IDR_IDR12_Msk                /*!< Port input data, bit 12 */\n#define GPIO_IDR_IDR13_Pos                   (13U)                             \n#define GPIO_IDR_IDR13_Msk                   (0x1UL << GPIO_IDR_IDR13_Pos)      /*!< 0x00002000 */\n#define GPIO_IDR_IDR13                       GPIO_IDR_IDR13_Msk                /*!< Port input data, bit 13 */\n#define GPIO_IDR_IDR14_Pos                   (14U)                             \n#define GPIO_IDR_IDR14_Msk                   (0x1UL << GPIO_IDR_IDR14_Pos)      /*!< 0x00004000 */\n#define GPIO_IDR_IDR14                       GPIO_IDR_IDR14_Msk                /*!< Port input data, bit 14 */\n#define GPIO_IDR_IDR15_Pos                   (15U)                             \n#define GPIO_IDR_IDR15_Msk                   (0x1UL << GPIO_IDR_IDR15_Pos)      /*!< 0x00008000 */\n#define GPIO_IDR_IDR15                       GPIO_IDR_IDR15_Msk                /*!< Port input data, bit 15 */\n\n/*******************  Bit definition for GPIO_ODR register  *******************/\n#define GPIO_ODR_ODR0_Pos                    (0U)                              \n#define GPIO_ODR_ODR0_Msk                    (0x1UL << GPIO_ODR_ODR0_Pos)       /*!< 0x00000001 */\n#define GPIO_ODR_ODR0                        GPIO_ODR_ODR0_Msk                 /*!< Port output data, bit 0 */\n#define GPIO_ODR_ODR1_Pos                    (1U)                              \n#define GPIO_ODR_ODR1_Msk                    (0x1UL << GPIO_ODR_ODR1_Pos)       /*!< 0x00000002 */\n#define GPIO_ODR_ODR1                        GPIO_ODR_ODR1_Msk                 /*!< Port output data, bit 1 */\n#define GPIO_ODR_ODR2_Pos                    (2U)                              \n#define GPIO_ODR_ODR2_Msk                    (0x1UL << GPIO_ODR_ODR2_Pos)       /*!< 0x00000004 */\n#define GPIO_ODR_ODR2                        GPIO_ODR_ODR2_Msk                 /*!< Port output data, bit 2 */\n#define GPIO_ODR_ODR3_Pos                    (3U)                              \n#define GPIO_ODR_ODR3_Msk                    (0x1UL << GPIO_ODR_ODR3_Pos)       /*!< 0x00000008 */\n#define GPIO_ODR_ODR3                        GPIO_ODR_ODR3_Msk                 /*!< Port output data, bit 3 */\n#define GPIO_ODR_ODR4_Pos                    (4U)                              \n#define GPIO_ODR_ODR4_Msk                    (0x1UL << GPIO_ODR_ODR4_Pos)       /*!< 0x00000010 */\n#define GPIO_ODR_ODR4                        GPIO_ODR_ODR4_Msk                 /*!< Port output data, bit 4 */\n#define GPIO_ODR_ODR5_Pos                    (5U)                              \n#define GPIO_ODR_ODR5_Msk                    (0x1UL << GPIO_ODR_ODR5_Pos)       /*!< 0x00000020 */\n#define GPIO_ODR_ODR5                        GPIO_ODR_ODR5_Msk                 /*!< Port output data, bit 5 */\n#define GPIO_ODR_ODR6_Pos                    (6U)                              \n#define GPIO_ODR_ODR6_Msk                    (0x1UL << GPIO_ODR_ODR6_Pos)       /*!< 0x00000040 */\n#define GPIO_ODR_ODR6                        GPIO_ODR_ODR6_Msk                 /*!< Port output data, bit 6 */\n#define GPIO_ODR_ODR7_Pos                    (7U)                              \n#define GPIO_ODR_ODR7_Msk                    (0x1UL << GPIO_ODR_ODR7_Pos)       /*!< 0x00000080 */\n#define GPIO_ODR_ODR7                        GPIO_ODR_ODR7_Msk                 /*!< Port output data, bit 7 */\n#define GPIO_ODR_ODR8_Pos                    (8U)                              \n#define GPIO_ODR_ODR8_Msk                    (0x1UL << GPIO_ODR_ODR8_Pos)       /*!< 0x00000100 */\n#define GPIO_ODR_ODR8                        GPIO_ODR_ODR8_Msk                 /*!< Port output data, bit 8 */\n#define GPIO_ODR_ODR9_Pos                    (9U)                              \n#define GPIO_ODR_ODR9_Msk                    (0x1UL << GPIO_ODR_ODR9_Pos)       /*!< 0x00000200 */\n#define GPIO_ODR_ODR9                        GPIO_ODR_ODR9_Msk                 /*!< Port output data, bit 9 */\n#define GPIO_ODR_ODR10_Pos                   (10U)                             \n#define GPIO_ODR_ODR10_Msk                   (0x1UL << GPIO_ODR_ODR10_Pos)      /*!< 0x00000400 */\n#define GPIO_ODR_ODR10                       GPIO_ODR_ODR10_Msk                /*!< Port output data, bit 10 */\n#define GPIO_ODR_ODR11_Pos                   (11U)                             \n#define GPIO_ODR_ODR11_Msk                   (0x1UL << GPIO_ODR_ODR11_Pos)      /*!< 0x00000800 */\n#define GPIO_ODR_ODR11                       GPIO_ODR_ODR11_Msk                /*!< Port output data, bit 11 */\n#define GPIO_ODR_ODR12_Pos                   (12U)                             \n#define GPIO_ODR_ODR12_Msk                   (0x1UL << GPIO_ODR_ODR12_Pos)      /*!< 0x00001000 */\n#define GPIO_ODR_ODR12                       GPIO_ODR_ODR12_Msk                /*!< Port output data, bit 12 */\n#define GPIO_ODR_ODR13_Pos                   (13U)                             \n#define GPIO_ODR_ODR13_Msk                   (0x1UL << GPIO_ODR_ODR13_Pos)      /*!< 0x00002000 */\n#define GPIO_ODR_ODR13                       GPIO_ODR_ODR13_Msk                /*!< Port output data, bit 13 */\n#define GPIO_ODR_ODR14_Pos                   (14U)                             \n#define GPIO_ODR_ODR14_Msk                   (0x1UL << GPIO_ODR_ODR14_Pos)      /*!< 0x00004000 */\n#define GPIO_ODR_ODR14                       GPIO_ODR_ODR14_Msk                /*!< Port output data, bit 14 */\n#define GPIO_ODR_ODR15_Pos                   (15U)                             \n#define GPIO_ODR_ODR15_Msk                   (0x1UL << GPIO_ODR_ODR15_Pos)      /*!< 0x00008000 */\n#define GPIO_ODR_ODR15                       GPIO_ODR_ODR15_Msk                /*!< Port output data, bit 15 */\n\n/******************  Bit definition for GPIO_BSRR register  *******************/\n#define GPIO_BSRR_BS0_Pos                    (0U)                              \n#define GPIO_BSRR_BS0_Msk                    (0x1UL << GPIO_BSRR_BS0_Pos)       /*!< 0x00000001 */\n#define GPIO_BSRR_BS0                        GPIO_BSRR_BS0_Msk                 /*!< Port x Set bit 0 */\n#define GPIO_BSRR_BS1_Pos                    (1U)                              \n#define GPIO_BSRR_BS1_Msk                    (0x1UL << GPIO_BSRR_BS1_Pos)       /*!< 0x00000002 */\n#define GPIO_BSRR_BS1                        GPIO_BSRR_BS1_Msk                 /*!< Port x Set bit 1 */\n#define GPIO_BSRR_BS2_Pos                    (2U)                              \n#define GPIO_BSRR_BS2_Msk                    (0x1UL << GPIO_BSRR_BS2_Pos)       /*!< 0x00000004 */\n#define GPIO_BSRR_BS2                        GPIO_BSRR_BS2_Msk                 /*!< Port x Set bit 2 */\n#define GPIO_BSRR_BS3_Pos                    (3U)                              \n#define GPIO_BSRR_BS3_Msk                    (0x1UL << GPIO_BSRR_BS3_Pos)       /*!< 0x00000008 */\n#define GPIO_BSRR_BS3                        GPIO_BSRR_BS3_Msk                 /*!< Port x Set bit 3 */\n#define GPIO_BSRR_BS4_Pos                    (4U)                              \n#define GPIO_BSRR_BS4_Msk                    (0x1UL << GPIO_BSRR_BS4_Pos)       /*!< 0x00000010 */\n#define GPIO_BSRR_BS4                        GPIO_BSRR_BS4_Msk                 /*!< Port x Set bit 4 */\n#define GPIO_BSRR_BS5_Pos                    (5U)                              \n#define GPIO_BSRR_BS5_Msk                    (0x1UL << GPIO_BSRR_BS5_Pos)       /*!< 0x00000020 */\n#define GPIO_BSRR_BS5                        GPIO_BSRR_BS5_Msk                 /*!< Port x Set bit 5 */\n#define GPIO_BSRR_BS6_Pos                    (6U)                              \n#define GPIO_BSRR_BS6_Msk                    (0x1UL << GPIO_BSRR_BS6_Pos)       /*!< 0x00000040 */\n#define GPIO_BSRR_BS6                        GPIO_BSRR_BS6_Msk                 /*!< Port x Set bit 6 */\n#define GPIO_BSRR_BS7_Pos                    (7U)                              \n#define GPIO_BSRR_BS7_Msk                    (0x1UL << GPIO_BSRR_BS7_Pos)       /*!< 0x00000080 */\n#define GPIO_BSRR_BS7                        GPIO_BSRR_BS7_Msk                 /*!< Port x Set bit 7 */\n#define GPIO_BSRR_BS8_Pos                    (8U)                              \n#define GPIO_BSRR_BS8_Msk                    (0x1UL << GPIO_BSRR_BS8_Pos)       /*!< 0x00000100 */\n#define GPIO_BSRR_BS8                        GPIO_BSRR_BS8_Msk                 /*!< Port x Set bit 8 */\n#define GPIO_BSRR_BS9_Pos                    (9U)                              \n#define GPIO_BSRR_BS9_Msk                    (0x1UL << GPIO_BSRR_BS9_Pos)       /*!< 0x00000200 */\n#define GPIO_BSRR_BS9                        GPIO_BSRR_BS9_Msk                 /*!< Port x Set bit 9 */\n#define GPIO_BSRR_BS10_Pos                   (10U)                             \n#define GPIO_BSRR_BS10_Msk                   (0x1UL << GPIO_BSRR_BS10_Pos)      /*!< 0x00000400 */\n#define GPIO_BSRR_BS10                       GPIO_BSRR_BS10_Msk                /*!< Port x Set bit 10 */\n#define GPIO_BSRR_BS11_Pos                   (11U)                             \n#define GPIO_BSRR_BS11_Msk                   (0x1UL << GPIO_BSRR_BS11_Pos)      /*!< 0x00000800 */\n#define GPIO_BSRR_BS11                       GPIO_BSRR_BS11_Msk                /*!< Port x Set bit 11 */\n#define GPIO_BSRR_BS12_Pos                   (12U)                             \n#define GPIO_BSRR_BS12_Msk                   (0x1UL << GPIO_BSRR_BS12_Pos)      /*!< 0x00001000 */\n#define GPIO_BSRR_BS12                       GPIO_BSRR_BS12_Msk                /*!< Port x Set bit 12 */\n#define GPIO_BSRR_BS13_Pos                   (13U)                             \n#define GPIO_BSRR_BS13_Msk                   (0x1UL << GPIO_BSRR_BS13_Pos)      /*!< 0x00002000 */\n#define GPIO_BSRR_BS13                       GPIO_BSRR_BS13_Msk                /*!< Port x Set bit 13 */\n#define GPIO_BSRR_BS14_Pos                   (14U)                             \n#define GPIO_BSRR_BS14_Msk                   (0x1UL << GPIO_BSRR_BS14_Pos)      /*!< 0x00004000 */\n#define GPIO_BSRR_BS14                       GPIO_BSRR_BS14_Msk                /*!< Port x Set bit 14 */\n#define GPIO_BSRR_BS15_Pos                   (15U)                             \n#define GPIO_BSRR_BS15_Msk                   (0x1UL << GPIO_BSRR_BS15_Pos)      /*!< 0x00008000 */\n#define GPIO_BSRR_BS15                       GPIO_BSRR_BS15_Msk                /*!< Port x Set bit 15 */\n\n#define GPIO_BSRR_BR0_Pos                    (16U)                             \n#define GPIO_BSRR_BR0_Msk                    (0x1UL << GPIO_BSRR_BR0_Pos)       /*!< 0x00010000 */\n#define GPIO_BSRR_BR0                        GPIO_BSRR_BR0_Msk                 /*!< Port x Reset bit 0 */\n#define GPIO_BSRR_BR1_Pos                    (17U)                             \n#define GPIO_BSRR_BR1_Msk                    (0x1UL << GPIO_BSRR_BR1_Pos)       /*!< 0x00020000 */\n#define GPIO_BSRR_BR1                        GPIO_BSRR_BR1_Msk                 /*!< Port x Reset bit 1 */\n#define GPIO_BSRR_BR2_Pos                    (18U)                             \n#define GPIO_BSRR_BR2_Msk                    (0x1UL << GPIO_BSRR_BR2_Pos)       /*!< 0x00040000 */\n#define GPIO_BSRR_BR2                        GPIO_BSRR_BR2_Msk                 /*!< Port x Reset bit 2 */\n#define GPIO_BSRR_BR3_Pos                    (19U)                             \n#define GPIO_BSRR_BR3_Msk                    (0x1UL << GPIO_BSRR_BR3_Pos)       /*!< 0x00080000 */\n#define GPIO_BSRR_BR3                        GPIO_BSRR_BR3_Msk                 /*!< Port x Reset bit 3 */\n#define GPIO_BSRR_BR4_Pos                    (20U)                             \n#define GPIO_BSRR_BR4_Msk                    (0x1UL << GPIO_BSRR_BR4_Pos)       /*!< 0x00100000 */\n#define GPIO_BSRR_BR4                        GPIO_BSRR_BR4_Msk                 /*!< Port x Reset bit 4 */\n#define GPIO_BSRR_BR5_Pos                    (21U)                             \n#define GPIO_BSRR_BR5_Msk                    (0x1UL << GPIO_BSRR_BR5_Pos)       /*!< 0x00200000 */\n#define GPIO_BSRR_BR5                        GPIO_BSRR_BR5_Msk                 /*!< Port x Reset bit 5 */\n#define GPIO_BSRR_BR6_Pos                    (22U)                             \n#define GPIO_BSRR_BR6_Msk                    (0x1UL << GPIO_BSRR_BR6_Pos)       /*!< 0x00400000 */\n#define GPIO_BSRR_BR6                        GPIO_BSRR_BR6_Msk                 /*!< Port x Reset bit 6 */\n#define GPIO_BSRR_BR7_Pos                    (23U)                             \n#define GPIO_BSRR_BR7_Msk                    (0x1UL << GPIO_BSRR_BR7_Pos)       /*!< 0x00800000 */\n#define GPIO_BSRR_BR7                        GPIO_BSRR_BR7_Msk                 /*!< Port x Reset bit 7 */\n#define GPIO_BSRR_BR8_Pos                    (24U)                             \n#define GPIO_BSRR_BR8_Msk                    (0x1UL << GPIO_BSRR_BR8_Pos)       /*!< 0x01000000 */\n#define GPIO_BSRR_BR8                        GPIO_BSRR_BR8_Msk                 /*!< Port x Reset bit 8 */\n#define GPIO_BSRR_BR9_Pos                    (25U)                             \n#define GPIO_BSRR_BR9_Msk                    (0x1UL << GPIO_BSRR_BR9_Pos)       /*!< 0x02000000 */\n#define GPIO_BSRR_BR9                        GPIO_BSRR_BR9_Msk                 /*!< Port x Reset bit 9 */\n#define GPIO_BSRR_BR10_Pos                   (26U)                             \n#define GPIO_BSRR_BR10_Msk                   (0x1UL << GPIO_BSRR_BR10_Pos)      /*!< 0x04000000 */\n#define GPIO_BSRR_BR10                       GPIO_BSRR_BR10_Msk                /*!< Port x Reset bit 10 */\n#define GPIO_BSRR_BR11_Pos                   (27U)                             \n#define GPIO_BSRR_BR11_Msk                   (0x1UL << GPIO_BSRR_BR11_Pos)      /*!< 0x08000000 */\n#define GPIO_BSRR_BR11                       GPIO_BSRR_BR11_Msk                /*!< Port x Reset bit 11 */\n#define GPIO_BSRR_BR12_Pos                   (28U)                             \n#define GPIO_BSRR_BR12_Msk                   (0x1UL << GPIO_BSRR_BR12_Pos)      /*!< 0x10000000 */\n#define GPIO_BSRR_BR12                       GPIO_BSRR_BR12_Msk                /*!< Port x Reset bit 12 */\n#define GPIO_BSRR_BR13_Pos                   (29U)                             \n#define GPIO_BSRR_BR13_Msk                   (0x1UL << GPIO_BSRR_BR13_Pos)      /*!< 0x20000000 */\n#define GPIO_BSRR_BR13                       GPIO_BSRR_BR13_Msk                /*!< Port x Reset bit 13 */\n#define GPIO_BSRR_BR14_Pos                   (30U)                             \n#define GPIO_BSRR_BR14_Msk                   (0x1UL << GPIO_BSRR_BR14_Pos)      /*!< 0x40000000 */\n#define GPIO_BSRR_BR14                       GPIO_BSRR_BR14_Msk                /*!< Port x Reset bit 14 */\n#define GPIO_BSRR_BR15_Pos                   (31U)                             \n#define GPIO_BSRR_BR15_Msk                   (0x1UL << GPIO_BSRR_BR15_Pos)      /*!< 0x80000000 */\n#define GPIO_BSRR_BR15                       GPIO_BSRR_BR15_Msk                /*!< Port x Reset bit 15 */\n\n/*******************  Bit definition for GPIO_BRR register  *******************/\n#define GPIO_BRR_BR0_Pos                     (0U)                              \n#define GPIO_BRR_BR0_Msk                     (0x1UL << GPIO_BRR_BR0_Pos)        /*!< 0x00000001 */\n#define GPIO_BRR_BR0                         GPIO_BRR_BR0_Msk                  /*!< Port x Reset bit 0 */\n#define GPIO_BRR_BR1_Pos                     (1U)                              \n#define GPIO_BRR_BR1_Msk                     (0x1UL << GPIO_BRR_BR1_Pos)        /*!< 0x00000002 */\n#define GPIO_BRR_BR1                         GPIO_BRR_BR1_Msk                  /*!< Port x Reset bit 1 */\n#define GPIO_BRR_BR2_Pos                     (2U)                              \n#define GPIO_BRR_BR2_Msk                     (0x1UL << GPIO_BRR_BR2_Pos)        /*!< 0x00000004 */\n#define GPIO_BRR_BR2                         GPIO_BRR_BR2_Msk                  /*!< Port x Reset bit 2 */\n#define GPIO_BRR_BR3_Pos                     (3U)                              \n#define GPIO_BRR_BR3_Msk                     (0x1UL << GPIO_BRR_BR3_Pos)        /*!< 0x00000008 */\n#define GPIO_BRR_BR3                         GPIO_BRR_BR3_Msk                  /*!< Port x Reset bit 3 */\n#define GPIO_BRR_BR4_Pos                     (4U)                              \n#define GPIO_BRR_BR4_Msk                     (0x1UL << GPIO_BRR_BR4_Pos)        /*!< 0x00000010 */\n#define GPIO_BRR_BR4                         GPIO_BRR_BR4_Msk                  /*!< Port x Reset bit 4 */\n#define GPIO_BRR_BR5_Pos                     (5U)                              \n#define GPIO_BRR_BR5_Msk                     (0x1UL << GPIO_BRR_BR5_Pos)        /*!< 0x00000020 */\n#define GPIO_BRR_BR5                         GPIO_BRR_BR5_Msk                  /*!< Port x Reset bit 5 */\n#define GPIO_BRR_BR6_Pos                     (6U)                              \n#define GPIO_BRR_BR6_Msk                     (0x1UL << GPIO_BRR_BR6_Pos)        /*!< 0x00000040 */\n#define GPIO_BRR_BR6                         GPIO_BRR_BR6_Msk                  /*!< Port x Reset bit 6 */\n#define GPIO_BRR_BR7_Pos                     (7U)                              \n#define GPIO_BRR_BR7_Msk                     (0x1UL << GPIO_BRR_BR7_Pos)        /*!< 0x00000080 */\n#define GPIO_BRR_BR7                         GPIO_BRR_BR7_Msk                  /*!< Port x Reset bit 7 */\n#define GPIO_BRR_BR8_Pos                     (8U)                              \n#define GPIO_BRR_BR8_Msk                     (0x1UL << GPIO_BRR_BR8_Pos)        /*!< 0x00000100 */\n#define GPIO_BRR_BR8                         GPIO_BRR_BR8_Msk                  /*!< Port x Reset bit 8 */\n#define GPIO_BRR_BR9_Pos                     (9U)                              \n#define GPIO_BRR_BR9_Msk                     (0x1UL << GPIO_BRR_BR9_Pos)        /*!< 0x00000200 */\n#define GPIO_BRR_BR9                         GPIO_BRR_BR9_Msk                  /*!< Port x Reset bit 9 */\n#define GPIO_BRR_BR10_Pos                    (10U)                             \n#define GPIO_BRR_BR10_Msk                    (0x1UL << GPIO_BRR_BR10_Pos)       /*!< 0x00000400 */\n#define GPIO_BRR_BR10                        GPIO_BRR_BR10_Msk                 /*!< Port x Reset bit 10 */\n#define GPIO_BRR_BR11_Pos                    (11U)                             \n#define GPIO_BRR_BR11_Msk                    (0x1UL << GPIO_BRR_BR11_Pos)       /*!< 0x00000800 */\n#define GPIO_BRR_BR11                        GPIO_BRR_BR11_Msk                 /*!< Port x Reset bit 11 */\n#define GPIO_BRR_BR12_Pos                    (12U)                             \n#define GPIO_BRR_BR12_Msk                    (0x1UL << GPIO_BRR_BR12_Pos)       /*!< 0x00001000 */\n#define GPIO_BRR_BR12                        GPIO_BRR_BR12_Msk                 /*!< Port x Reset bit 12 */\n#define GPIO_BRR_BR13_Pos                    (13U)                             \n#define GPIO_BRR_BR13_Msk                    (0x1UL << GPIO_BRR_BR13_Pos)       /*!< 0x00002000 */\n#define GPIO_BRR_BR13                        GPIO_BRR_BR13_Msk                 /*!< Port x Reset bit 13 */\n#define GPIO_BRR_BR14_Pos                    (14U)                             \n#define GPIO_BRR_BR14_Msk                    (0x1UL << GPIO_BRR_BR14_Pos)       /*!< 0x00004000 */\n#define GPIO_BRR_BR14                        GPIO_BRR_BR14_Msk                 /*!< Port x Reset bit 14 */\n#define GPIO_BRR_BR15_Pos                    (15U)                             \n#define GPIO_BRR_BR15_Msk                    (0x1UL << GPIO_BRR_BR15_Pos)       /*!< 0x00008000 */\n#define GPIO_BRR_BR15                        GPIO_BRR_BR15_Msk                 /*!< Port x Reset bit 15 */\n\n/******************  Bit definition for GPIO_LCKR register  *******************/\n#define GPIO_LCKR_LCK0_Pos                   (0U)                              \n#define GPIO_LCKR_LCK0_Msk                   (0x1UL << GPIO_LCKR_LCK0_Pos)      /*!< 0x00000001 */\n#define GPIO_LCKR_LCK0                       GPIO_LCKR_LCK0_Msk                /*!< Port x Lock bit 0 */\n#define GPIO_LCKR_LCK1_Pos                   (1U)                              \n#define GPIO_LCKR_LCK1_Msk                   (0x1UL << GPIO_LCKR_LCK1_Pos)      /*!< 0x00000002 */\n#define GPIO_LCKR_LCK1                       GPIO_LCKR_LCK1_Msk                /*!< Port x Lock bit 1 */\n#define GPIO_LCKR_LCK2_Pos                   (2U)                              \n#define GPIO_LCKR_LCK2_Msk                   (0x1UL << GPIO_LCKR_LCK2_Pos)      /*!< 0x00000004 */\n#define GPIO_LCKR_LCK2                       GPIO_LCKR_LCK2_Msk                /*!< Port x Lock bit 2 */\n#define GPIO_LCKR_LCK3_Pos                   (3U)                              \n#define GPIO_LCKR_LCK3_Msk                   (0x1UL << GPIO_LCKR_LCK3_Pos)      /*!< 0x00000008 */\n#define GPIO_LCKR_LCK3                       GPIO_LCKR_LCK3_Msk                /*!< Port x Lock bit 3 */\n#define GPIO_LCKR_LCK4_Pos                   (4U)                              \n#define GPIO_LCKR_LCK4_Msk                   (0x1UL << GPIO_LCKR_LCK4_Pos)      /*!< 0x00000010 */\n#define GPIO_LCKR_LCK4                       GPIO_LCKR_LCK4_Msk                /*!< Port x Lock bit 4 */\n#define GPIO_LCKR_LCK5_Pos                   (5U)                              \n#define GPIO_LCKR_LCK5_Msk                   (0x1UL << GPIO_LCKR_LCK5_Pos)      /*!< 0x00000020 */\n#define GPIO_LCKR_LCK5                       GPIO_LCKR_LCK5_Msk                /*!< Port x Lock bit 5 */\n#define GPIO_LCKR_LCK6_Pos                   (6U)                              \n#define GPIO_LCKR_LCK6_Msk                   (0x1UL << GPIO_LCKR_LCK6_Pos)      /*!< 0x00000040 */\n#define GPIO_LCKR_LCK6                       GPIO_LCKR_LCK6_Msk                /*!< Port x Lock bit 6 */\n#define GPIO_LCKR_LCK7_Pos                   (7U)                              \n#define GPIO_LCKR_LCK7_Msk                   (0x1UL << GPIO_LCKR_LCK7_Pos)      /*!< 0x00000080 */\n#define GPIO_LCKR_LCK7                       GPIO_LCKR_LCK7_Msk                /*!< Port x Lock bit 7 */\n#define GPIO_LCKR_LCK8_Pos                   (8U)                              \n#define GPIO_LCKR_LCK8_Msk                   (0x1UL << GPIO_LCKR_LCK8_Pos)      /*!< 0x00000100 */\n#define GPIO_LCKR_LCK8                       GPIO_LCKR_LCK8_Msk                /*!< Port x Lock bit 8 */\n#define GPIO_LCKR_LCK9_Pos                   (9U)                              \n#define GPIO_LCKR_LCK9_Msk                   (0x1UL << GPIO_LCKR_LCK9_Pos)      /*!< 0x00000200 */\n#define GPIO_LCKR_LCK9                       GPIO_LCKR_LCK9_Msk                /*!< Port x Lock bit 9 */\n#define GPIO_LCKR_LCK10_Pos                  (10U)                             \n#define GPIO_LCKR_LCK10_Msk                  (0x1UL << GPIO_LCKR_LCK10_Pos)     /*!< 0x00000400 */\n#define GPIO_LCKR_LCK10                      GPIO_LCKR_LCK10_Msk               /*!< Port x Lock bit 10 */\n#define GPIO_LCKR_LCK11_Pos                  (11U)                             \n#define GPIO_LCKR_LCK11_Msk                  (0x1UL << GPIO_LCKR_LCK11_Pos)     /*!< 0x00000800 */\n#define GPIO_LCKR_LCK11                      GPIO_LCKR_LCK11_Msk               /*!< Port x Lock bit 11 */\n#define GPIO_LCKR_LCK12_Pos                  (12U)                             \n#define GPIO_LCKR_LCK12_Msk                  (0x1UL << GPIO_LCKR_LCK12_Pos)     /*!< 0x00001000 */\n#define GPIO_LCKR_LCK12                      GPIO_LCKR_LCK12_Msk               /*!< Port x Lock bit 12 */\n#define GPIO_LCKR_LCK13_Pos                  (13U)                             \n#define GPIO_LCKR_LCK13_Msk                  (0x1UL << GPIO_LCKR_LCK13_Pos)     /*!< 0x00002000 */\n#define GPIO_LCKR_LCK13                      GPIO_LCKR_LCK13_Msk               /*!< Port x Lock bit 13 */\n#define GPIO_LCKR_LCK14_Pos                  (14U)                             \n#define GPIO_LCKR_LCK14_Msk                  (0x1UL << GPIO_LCKR_LCK14_Pos)     /*!< 0x00004000 */\n#define GPIO_LCKR_LCK14                      GPIO_LCKR_LCK14_Msk               /*!< Port x Lock bit 14 */\n#define GPIO_LCKR_LCK15_Pos                  (15U)                             \n#define GPIO_LCKR_LCK15_Msk                  (0x1UL << GPIO_LCKR_LCK15_Pos)     /*!< 0x00008000 */\n#define GPIO_LCKR_LCK15                      GPIO_LCKR_LCK15_Msk               /*!< Port x Lock bit 15 */\n#define GPIO_LCKR_LCKK_Pos                   (16U)                             \n#define GPIO_LCKR_LCKK_Msk                   (0x1UL << GPIO_LCKR_LCKK_Pos)      /*!< 0x00010000 */\n#define GPIO_LCKR_LCKK                       GPIO_LCKR_LCKK_Msk                /*!< Lock key */\n\n/*----------------------------------------------------------------------------*/\n\n/******************  Bit definition for AFIO_EVCR register  *******************/\n#define AFIO_EVCR_PIN_Pos                    (0U)                              \n#define AFIO_EVCR_PIN_Msk                    (0xFUL << AFIO_EVCR_PIN_Pos)       /*!< 0x0000000F */\n#define AFIO_EVCR_PIN                        AFIO_EVCR_PIN_Msk                 /*!< PIN[3:0] bits (Pin selection) */\n#define AFIO_EVCR_PIN_0                      (0x1UL << AFIO_EVCR_PIN_Pos)       /*!< 0x00000001 */\n#define AFIO_EVCR_PIN_1                      (0x2UL << AFIO_EVCR_PIN_Pos)       /*!< 0x00000002 */\n#define AFIO_EVCR_PIN_2                      (0x4UL << AFIO_EVCR_PIN_Pos)       /*!< 0x00000004 */\n#define AFIO_EVCR_PIN_3                      (0x8UL << AFIO_EVCR_PIN_Pos)       /*!< 0x00000008 */\n\n/*!< PIN configuration */\n#define AFIO_EVCR_PIN_PX0                    0x00000000U                       /*!< Pin 0 selected */\n#define AFIO_EVCR_PIN_PX1_Pos                (0U)                              \n#define AFIO_EVCR_PIN_PX1_Msk                (0x1UL << AFIO_EVCR_PIN_PX1_Pos)   /*!< 0x00000001 */\n#define AFIO_EVCR_PIN_PX1                    AFIO_EVCR_PIN_PX1_Msk             /*!< Pin 1 selected */\n#define AFIO_EVCR_PIN_PX2_Pos                (1U)                              \n#define AFIO_EVCR_PIN_PX2_Msk                (0x1UL << AFIO_EVCR_PIN_PX2_Pos)   /*!< 0x00000002 */\n#define AFIO_EVCR_PIN_PX2                    AFIO_EVCR_PIN_PX2_Msk             /*!< Pin 2 selected */\n#define AFIO_EVCR_PIN_PX3_Pos                (0U)                              \n#define AFIO_EVCR_PIN_PX3_Msk                (0x3UL << AFIO_EVCR_PIN_PX3_Pos)   /*!< 0x00000003 */\n#define AFIO_EVCR_PIN_PX3                    AFIO_EVCR_PIN_PX3_Msk             /*!< Pin 3 selected */\n#define AFIO_EVCR_PIN_PX4_Pos                (2U)                              \n#define AFIO_EVCR_PIN_PX4_Msk                (0x1UL << AFIO_EVCR_PIN_PX4_Pos)   /*!< 0x00000004 */\n#define AFIO_EVCR_PIN_PX4                    AFIO_EVCR_PIN_PX4_Msk             /*!< Pin 4 selected */\n#define AFIO_EVCR_PIN_PX5_Pos                (0U)                              \n#define AFIO_EVCR_PIN_PX5_Msk                (0x5UL << AFIO_EVCR_PIN_PX5_Pos)   /*!< 0x00000005 */\n#define AFIO_EVCR_PIN_PX5                    AFIO_EVCR_PIN_PX5_Msk             /*!< Pin 5 selected */\n#define AFIO_EVCR_PIN_PX6_Pos                (1U)                              \n#define AFIO_EVCR_PIN_PX6_Msk                (0x3UL << AFIO_EVCR_PIN_PX6_Pos)   /*!< 0x00000006 */\n#define AFIO_EVCR_PIN_PX6                    AFIO_EVCR_PIN_PX6_Msk             /*!< Pin 6 selected */\n#define AFIO_EVCR_PIN_PX7_Pos                (0U)                              \n#define AFIO_EVCR_PIN_PX7_Msk                (0x7UL << AFIO_EVCR_PIN_PX7_Pos)   /*!< 0x00000007 */\n#define AFIO_EVCR_PIN_PX7                    AFIO_EVCR_PIN_PX7_Msk             /*!< Pin 7 selected */\n#define AFIO_EVCR_PIN_PX8_Pos                (3U)                              \n#define AFIO_EVCR_PIN_PX8_Msk                (0x1UL << AFIO_EVCR_PIN_PX8_Pos)   /*!< 0x00000008 */\n#define AFIO_EVCR_PIN_PX8                    AFIO_EVCR_PIN_PX8_Msk             /*!< Pin 8 selected */\n#define AFIO_EVCR_PIN_PX9_Pos                (0U)                              \n#define AFIO_EVCR_PIN_PX9_Msk                (0x9UL << AFIO_EVCR_PIN_PX9_Pos)   /*!< 0x00000009 */\n#define AFIO_EVCR_PIN_PX9                    AFIO_EVCR_PIN_PX9_Msk             /*!< Pin 9 selected */\n#define AFIO_EVCR_PIN_PX10_Pos               (1U)                              \n#define AFIO_EVCR_PIN_PX10_Msk               (0x5UL << AFIO_EVCR_PIN_PX10_Pos)  /*!< 0x0000000A */\n#define AFIO_EVCR_PIN_PX10                   AFIO_EVCR_PIN_PX10_Msk            /*!< Pin 10 selected */\n#define AFIO_EVCR_PIN_PX11_Pos               (0U)                              \n#define AFIO_EVCR_PIN_PX11_Msk               (0xBUL << AFIO_EVCR_PIN_PX11_Pos)  /*!< 0x0000000B */\n#define AFIO_EVCR_PIN_PX11                   AFIO_EVCR_PIN_PX11_Msk            /*!< Pin 11 selected */\n#define AFIO_EVCR_PIN_PX12_Pos               (2U)                              \n#define AFIO_EVCR_PIN_PX12_Msk               (0x3UL << AFIO_EVCR_PIN_PX12_Pos)  /*!< 0x0000000C */\n#define AFIO_EVCR_PIN_PX12                   AFIO_EVCR_PIN_PX12_Msk            /*!< Pin 12 selected */\n#define AFIO_EVCR_PIN_PX13_Pos               (0U)                              \n#define AFIO_EVCR_PIN_PX13_Msk               (0xDUL << AFIO_EVCR_PIN_PX13_Pos)  /*!< 0x0000000D */\n#define AFIO_EVCR_PIN_PX13                   AFIO_EVCR_PIN_PX13_Msk            /*!< Pin 13 selected */\n#define AFIO_EVCR_PIN_PX14_Pos               (1U)                              \n#define AFIO_EVCR_PIN_PX14_Msk               (0x7UL << AFIO_EVCR_PIN_PX14_Pos)  /*!< 0x0000000E */\n#define AFIO_EVCR_PIN_PX14                   AFIO_EVCR_PIN_PX14_Msk            /*!< Pin 14 selected */\n#define AFIO_EVCR_PIN_PX15_Pos               (0U)                              \n#define AFIO_EVCR_PIN_PX15_Msk               (0xFUL << AFIO_EVCR_PIN_PX15_Pos)  /*!< 0x0000000F */\n#define AFIO_EVCR_PIN_PX15                   AFIO_EVCR_PIN_PX15_Msk            /*!< Pin 15 selected */\n\n#define AFIO_EVCR_PORT_Pos                   (4U)                              \n#define AFIO_EVCR_PORT_Msk                   (0x7UL << AFIO_EVCR_PORT_Pos)      /*!< 0x00000070 */\n#define AFIO_EVCR_PORT                       AFIO_EVCR_PORT_Msk                /*!< PORT[2:0] bits (Port selection) */\n#define AFIO_EVCR_PORT_0                     (0x1UL << AFIO_EVCR_PORT_Pos)      /*!< 0x00000010 */\n#define AFIO_EVCR_PORT_1                     (0x2UL << AFIO_EVCR_PORT_Pos)      /*!< 0x00000020 */\n#define AFIO_EVCR_PORT_2                     (0x4UL << AFIO_EVCR_PORT_Pos)      /*!< 0x00000040 */\n\n/*!< PORT configuration */\n#define AFIO_EVCR_PORT_PA                    0x00000000                        /*!< Port A selected */\n#define AFIO_EVCR_PORT_PB_Pos                (4U)                              \n#define AFIO_EVCR_PORT_PB_Msk                (0x1UL << AFIO_EVCR_PORT_PB_Pos)   /*!< 0x00000010 */\n#define AFIO_EVCR_PORT_PB                    AFIO_EVCR_PORT_PB_Msk             /*!< Port B selected */\n#define AFIO_EVCR_PORT_PC_Pos                (5U)                              \n#define AFIO_EVCR_PORT_PC_Msk                (0x1UL << AFIO_EVCR_PORT_PC_Pos)   /*!< 0x00000020 */\n#define AFIO_EVCR_PORT_PC                    AFIO_EVCR_PORT_PC_Msk             /*!< Port C selected */\n#define AFIO_EVCR_PORT_PD_Pos                (4U)                              \n#define AFIO_EVCR_PORT_PD_Msk                (0x3UL << AFIO_EVCR_PORT_PD_Pos)   /*!< 0x00000030 */\n#define AFIO_EVCR_PORT_PD                    AFIO_EVCR_PORT_PD_Msk             /*!< Port D selected */\n#define AFIO_EVCR_PORT_PE_Pos                (6U)                              \n#define AFIO_EVCR_PORT_PE_Msk                (0x1UL << AFIO_EVCR_PORT_PE_Pos)   /*!< 0x00000040 */\n#define AFIO_EVCR_PORT_PE                    AFIO_EVCR_PORT_PE_Msk             /*!< Port E selected */\n\n#define AFIO_EVCR_EVOE_Pos                   (7U)                              \n#define AFIO_EVCR_EVOE_Msk                   (0x1UL << AFIO_EVCR_EVOE_Pos)      /*!< 0x00000080 */\n#define AFIO_EVCR_EVOE                       AFIO_EVCR_EVOE_Msk                /*!< Event Output Enable */\n\n/******************  Bit definition for AFIO_MAPR register  *******************/\n#define AFIO_MAPR_SPI1_REMAP_Pos             (0U)                              \n#define AFIO_MAPR_SPI1_REMAP_Msk             (0x1UL << AFIO_MAPR_SPI1_REMAP_Pos) /*!< 0x00000001 */\n#define AFIO_MAPR_SPI1_REMAP                 AFIO_MAPR_SPI1_REMAP_Msk          /*!< SPI1 remapping */\n#define AFIO_MAPR_I2C1_REMAP_Pos             (1U)                              \n#define AFIO_MAPR_I2C1_REMAP_Msk             (0x1UL << AFIO_MAPR_I2C1_REMAP_Pos) /*!< 0x00000002 */\n#define AFIO_MAPR_I2C1_REMAP                 AFIO_MAPR_I2C1_REMAP_Msk          /*!< I2C1 remapping */\n#define AFIO_MAPR_USART1_REMAP_Pos           (2U)                              \n#define AFIO_MAPR_USART1_REMAP_Msk           (0x1UL << AFIO_MAPR_USART1_REMAP_Pos) /*!< 0x00000004 */\n#define AFIO_MAPR_USART1_REMAP               AFIO_MAPR_USART1_REMAP_Msk        /*!< USART1 remapping */\n#define AFIO_MAPR_USART2_REMAP_Pos           (3U)                              \n#define AFIO_MAPR_USART2_REMAP_Msk           (0x1UL << AFIO_MAPR_USART2_REMAP_Pos) /*!< 0x00000008 */\n#define AFIO_MAPR_USART2_REMAP               AFIO_MAPR_USART2_REMAP_Msk        /*!< USART2 remapping */\n\n#define AFIO_MAPR_USART3_REMAP_Pos           (4U)                              \n#define AFIO_MAPR_USART3_REMAP_Msk           (0x3UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000030 */\n#define AFIO_MAPR_USART3_REMAP               AFIO_MAPR_USART3_REMAP_Msk        /*!< USART3_REMAP[1:0] bits (USART3 remapping) */\n#define AFIO_MAPR_USART3_REMAP_0             (0x1UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000010 */\n#define AFIO_MAPR_USART3_REMAP_1             (0x2UL << AFIO_MAPR_USART3_REMAP_Pos) /*!< 0x00000020 */\n\n/* USART3_REMAP configuration */\n#define AFIO_MAPR_USART3_REMAP_NOREMAP       0x00000000U                          /*!< No remap (TX/PB10, RX/PB11, CK/PB12, CTS/PB13, RTS/PB14) */\n#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Pos (4U)                           \n#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Pos) /*!< 0x00000010 */\n#define AFIO_MAPR_USART3_REMAP_PARTIALREMAP  AFIO_MAPR_USART3_REMAP_PARTIALREMAP_Msk /*!< Partial remap (TX/PC10, RX/PC11, CK/PC12, CTS/PB13, RTS/PB14) */\n#define AFIO_MAPR_USART3_REMAP_FULLREMAP_Pos (4U)                              \n#define AFIO_MAPR_USART3_REMAP_FULLREMAP_Msk (0x3UL << AFIO_MAPR_USART3_REMAP_FULLREMAP_Pos) /*!< 0x00000030 */\n#define AFIO_MAPR_USART3_REMAP_FULLREMAP     AFIO_MAPR_USART3_REMAP_FULLREMAP_Msk /*!< Full remap (TX/PD8, RX/PD9, CK/PD10, CTS/PD11, RTS/PD12) */\n\n#define AFIO_MAPR_TIM1_REMAP_Pos             (6U)                              \n#define AFIO_MAPR_TIM1_REMAP_Msk             (0x3UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x000000C0 */\n#define AFIO_MAPR_TIM1_REMAP                 AFIO_MAPR_TIM1_REMAP_Msk          /*!< TIM1_REMAP[1:0] bits (TIM1 remapping) */\n#define AFIO_MAPR_TIM1_REMAP_0               (0x1UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x00000040 */\n#define AFIO_MAPR_TIM1_REMAP_1               (0x2UL << AFIO_MAPR_TIM1_REMAP_Pos) /*!< 0x00000080 */\n\n/*!< TIM1_REMAP configuration */\n#define AFIO_MAPR_TIM1_REMAP_NOREMAP         0x00000000U                          /*!< No remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PB12, CH1N/PB13, CH2N/PB14, CH3N/PB15) */\n#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Pos (6U)                             \n#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Pos) /*!< 0x00000040 */\n#define AFIO_MAPR_TIM1_REMAP_PARTIALREMAP    AFIO_MAPR_TIM1_REMAP_PARTIALREMAP_Msk /*!< Partial remap (ETR/PA12, CH1/PA8, CH2/PA9, CH3/PA10, CH4/PA11, BKIN/PA6, CH1N/PA7, CH2N/PB0, CH3N/PB1) */\n#define AFIO_MAPR_TIM1_REMAP_FULLREMAP_Pos   (6U)                              \n#define AFIO_MAPR_TIM1_REMAP_FULLREMAP_Msk   (0x3UL << AFIO_MAPR_TIM1_REMAP_FULLREMAP_Pos) /*!< 0x000000C0 */\n#define AFIO_MAPR_TIM1_REMAP_FULLREMAP       AFIO_MAPR_TIM1_REMAP_FULLREMAP_Msk /*!< Full remap (ETR/PE7, CH1/PE9, CH2/PE11, CH3/PE13, CH4/PE14, BKIN/PE15, CH1N/PE8, CH2N/PE10, CH3N/PE12) */\n\n#define AFIO_MAPR_TIM2_REMAP_Pos             (8U)                              \n#define AFIO_MAPR_TIM2_REMAP_Msk             (0x3UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000300 */\n#define AFIO_MAPR_TIM2_REMAP                 AFIO_MAPR_TIM2_REMAP_Msk          /*!< TIM2_REMAP[1:0] bits (TIM2 remapping) */\n#define AFIO_MAPR_TIM2_REMAP_0               (0x1UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000100 */\n#define AFIO_MAPR_TIM2_REMAP_1               (0x2UL << AFIO_MAPR_TIM2_REMAP_Pos) /*!< 0x00000200 */\n\n/*!< TIM2_REMAP configuration */\n#define AFIO_MAPR_TIM2_REMAP_NOREMAP         0x00000000U                          /*!< No remap (CH1/ETR/PA0, CH2/PA1, CH3/PA2, CH4/PA3) */\n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Pos (8U)                            \n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Msk (0x1UL << AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Pos) /*!< 0x00000100 */\n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1   AFIO_MAPR_TIM2_REMAP_PARTIALREMAP1_Msk /*!< Partial remap (CH1/ETR/PA15, CH2/PB3, CH3/PA2, CH4/PA3) */\n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Pos (9U)                            \n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Msk (0x1UL << AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Pos) /*!< 0x00000200 */\n#define AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2   AFIO_MAPR_TIM2_REMAP_PARTIALREMAP2_Msk /*!< Partial remap (CH1/ETR/PA0, CH2/PA1, CH3/PB10, CH4/PB11) */\n#define AFIO_MAPR_TIM2_REMAP_FULLREMAP_Pos   (8U)                              \n#define AFIO_MAPR_TIM2_REMAP_FULLREMAP_Msk   (0x3UL << AFIO_MAPR_TIM2_REMAP_FULLREMAP_Pos) /*!< 0x00000300 */\n#define AFIO_MAPR_TIM2_REMAP_FULLREMAP       AFIO_MAPR_TIM2_REMAP_FULLREMAP_Msk /*!< Full remap (CH1/ETR/PA15, CH2/PB3, CH3/PB10, CH4/PB11) */\n\n#define AFIO_MAPR_TIM3_REMAP_Pos             (10U)                             \n#define AFIO_MAPR_TIM3_REMAP_Msk             (0x3UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000C00 */\n#define AFIO_MAPR_TIM3_REMAP                 AFIO_MAPR_TIM3_REMAP_Msk          /*!< TIM3_REMAP[1:0] bits (TIM3 remapping) */\n#define AFIO_MAPR_TIM3_REMAP_0               (0x1UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000400 */\n#define AFIO_MAPR_TIM3_REMAP_1               (0x2UL << AFIO_MAPR_TIM3_REMAP_Pos) /*!< 0x00000800 */\n\n/*!< TIM3_REMAP configuration */\n#define AFIO_MAPR_TIM3_REMAP_NOREMAP         0x00000000U                          /*!< No remap (CH1/PA6, CH2/PA7, CH3/PB0, CH4/PB1) */\n#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Pos (11U)                            \n#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Msk (0x1UL << AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Pos) /*!< 0x00000800 */\n#define AFIO_MAPR_TIM3_REMAP_PARTIALREMAP    AFIO_MAPR_TIM3_REMAP_PARTIALREMAP_Msk /*!< Partial remap (CH1/PB4, CH2/PB5, CH3/PB0, CH4/PB1) */\n#define AFIO_MAPR_TIM3_REMAP_FULLREMAP_Pos   (10U)                             \n#define AFIO_MAPR_TIM3_REMAP_FULLREMAP_Msk   (0x3UL << AFIO_MAPR_TIM3_REMAP_FULLREMAP_Pos) /*!< 0x00000C00 */\n#define AFIO_MAPR_TIM3_REMAP_FULLREMAP       AFIO_MAPR_TIM3_REMAP_FULLREMAP_Msk /*!< Full remap (CH1/PC6, CH2/PC7, CH3/PC8, CH4/PC9) */\n\n#define AFIO_MAPR_TIM4_REMAP_Pos             (12U)                             \n#define AFIO_MAPR_TIM4_REMAP_Msk             (0x1UL << AFIO_MAPR_TIM4_REMAP_Pos) /*!< 0x00001000 */\n#define AFIO_MAPR_TIM4_REMAP                 AFIO_MAPR_TIM4_REMAP_Msk          /*!< TIM4_REMAP bit (TIM4 remapping) */\n\n#define AFIO_MAPR_CAN_REMAP_Pos              (13U)                             \n#define AFIO_MAPR_CAN_REMAP_Msk              (0x3UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00006000 */\n#define AFIO_MAPR_CAN_REMAP                  AFIO_MAPR_CAN_REMAP_Msk           /*!< CAN_REMAP[1:0] bits (CAN Alternate function remapping) */\n#define AFIO_MAPR_CAN_REMAP_0                (0x1UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00002000 */\n#define AFIO_MAPR_CAN_REMAP_1                (0x2UL << AFIO_MAPR_CAN_REMAP_Pos) /*!< 0x00004000 */\n\n/*!< CAN_REMAP configuration */\n#define AFIO_MAPR_CAN_REMAP_REMAP1           0x00000000U                          /*!< CANRX mapped to PA11, CANTX mapped to PA12 */\n#define AFIO_MAPR_CAN_REMAP_REMAP2_Pos       (14U)                             \n#define AFIO_MAPR_CAN_REMAP_REMAP2_Msk       (0x1UL << AFIO_MAPR_CAN_REMAP_REMAP2_Pos) /*!< 0x00004000 */\n#define AFIO_MAPR_CAN_REMAP_REMAP2           AFIO_MAPR_CAN_REMAP_REMAP2_Msk    /*!< CANRX mapped to PB8, CANTX mapped to PB9 */\n#define AFIO_MAPR_CAN_REMAP_REMAP3_Pos       (13U)                             \n#define AFIO_MAPR_CAN_REMAP_REMAP3_Msk       (0x3UL << AFIO_MAPR_CAN_REMAP_REMAP3_Pos) /*!< 0x00006000 */\n#define AFIO_MAPR_CAN_REMAP_REMAP3           AFIO_MAPR_CAN_REMAP_REMAP3_Msk    /*!< CANRX mapped to PD0, CANTX mapped to PD1 */\n\n#define AFIO_MAPR_PD01_REMAP_Pos             (15U)                             \n#define AFIO_MAPR_PD01_REMAP_Msk             (0x1UL << AFIO_MAPR_PD01_REMAP_Pos) /*!< 0x00008000 */\n#define AFIO_MAPR_PD01_REMAP                 AFIO_MAPR_PD01_REMAP_Msk          /*!< Port D0/Port D1 mapping on OSC_IN/OSC_OUT */\n#define AFIO_MAPR_TIM5CH4_IREMAP_Pos         (16U)                             \n#define AFIO_MAPR_TIM5CH4_IREMAP_Msk         (0x1UL << AFIO_MAPR_TIM5CH4_IREMAP_Pos) /*!< 0x00010000 */\n#define AFIO_MAPR_TIM5CH4_IREMAP             AFIO_MAPR_TIM5CH4_IREMAP_Msk      /*!< TIM5 Channel4 Internal Remap */\n#define AFIO_MAPR_ADC1_ETRGINJ_REMAP_Pos     (17U)                             \n#define AFIO_MAPR_ADC1_ETRGINJ_REMAP_Msk     (0x1UL << AFIO_MAPR_ADC1_ETRGINJ_REMAP_Pos) /*!< 0x00020000 */\n#define AFIO_MAPR_ADC1_ETRGINJ_REMAP         AFIO_MAPR_ADC1_ETRGINJ_REMAP_Msk  /*!< ADC 1 External Trigger Injected Conversion remapping */\n#define AFIO_MAPR_ADC1_ETRGREG_REMAP_Pos     (18U)                             \n#define AFIO_MAPR_ADC1_ETRGREG_REMAP_Msk     (0x1UL << AFIO_MAPR_ADC1_ETRGREG_REMAP_Pos) /*!< 0x00040000 */\n#define AFIO_MAPR_ADC1_ETRGREG_REMAP         AFIO_MAPR_ADC1_ETRGREG_REMAP_Msk  /*!< ADC 1 External Trigger Regular Conversion remapping */\n#define AFIO_MAPR_ADC2_ETRGINJ_REMAP_Pos     (19U)                             \n#define AFIO_MAPR_ADC2_ETRGINJ_REMAP_Msk     (0x1UL << AFIO_MAPR_ADC2_ETRGINJ_REMAP_Pos) /*!< 0x00080000 */\n#define AFIO_MAPR_ADC2_ETRGINJ_REMAP         AFIO_MAPR_ADC2_ETRGINJ_REMAP_Msk  /*!< ADC 2 External Trigger Injected Conversion remapping */\n#define AFIO_MAPR_ADC2_ETRGREG_REMAP_Pos     (20U)                             \n#define AFIO_MAPR_ADC2_ETRGREG_REMAP_Msk     (0x1UL << AFIO_MAPR_ADC2_ETRGREG_REMAP_Pos) /*!< 0x00100000 */\n#define AFIO_MAPR_ADC2_ETRGREG_REMAP         AFIO_MAPR_ADC2_ETRGREG_REMAP_Msk  /*!< ADC 2 External Trigger Regular Conversion remapping */\n\n/*!< SWJ_CFG configuration */\n#define AFIO_MAPR_SWJ_CFG_Pos                (24U)                             \n#define AFIO_MAPR_SWJ_CFG_Msk                (0x7UL << AFIO_MAPR_SWJ_CFG_Pos)   /*!< 0x07000000 */\n#define AFIO_MAPR_SWJ_CFG                    AFIO_MAPR_SWJ_CFG_Msk             /*!< SWJ_CFG[2:0] bits (Serial Wire JTAG configuration) */\n#define AFIO_MAPR_SWJ_CFG_0                  (0x1UL << AFIO_MAPR_SWJ_CFG_Pos)   /*!< 0x01000000 */\n#define AFIO_MAPR_SWJ_CFG_1                  (0x2UL << AFIO_MAPR_SWJ_CFG_Pos)   /*!< 0x02000000 */\n#define AFIO_MAPR_SWJ_CFG_2                  (0x4UL << AFIO_MAPR_SWJ_CFG_Pos)   /*!< 0x04000000 */\n\n#define AFIO_MAPR_SWJ_CFG_RESET              0x00000000U                          /*!< Full SWJ (JTAG-DP + SW-DP) : Reset State */\n#define AFIO_MAPR_SWJ_CFG_NOJNTRST_Pos       (24U)                             \n#define AFIO_MAPR_SWJ_CFG_NOJNTRST_Msk       (0x1UL << AFIO_MAPR_SWJ_CFG_NOJNTRST_Pos) /*!< 0x01000000 */\n#define AFIO_MAPR_SWJ_CFG_NOJNTRST           AFIO_MAPR_SWJ_CFG_NOJNTRST_Msk    /*!< Full SWJ (JTAG-DP + SW-DP) but without JNTRST */\n#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos    (25U)                             \n#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk    (0x1UL << AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Pos) /*!< 0x02000000 */\n#define AFIO_MAPR_SWJ_CFG_JTAGDISABLE        AFIO_MAPR_SWJ_CFG_JTAGDISABLE_Msk /*!< JTAG-DP Disabled and SW-DP Enabled */\n#define AFIO_MAPR_SWJ_CFG_DISABLE_Pos        (26U)                             \n#define AFIO_MAPR_SWJ_CFG_DISABLE_Msk        (0x1UL << AFIO_MAPR_SWJ_CFG_DISABLE_Pos) /*!< 0x04000000 */\n#define AFIO_MAPR_SWJ_CFG_DISABLE            AFIO_MAPR_SWJ_CFG_DISABLE_Msk     /*!< JTAG-DP Disabled and SW-DP Disabled */\n\n\n/*****************  Bit definition for AFIO_EXTICR1 register  *****************/\n#define AFIO_EXTICR1_EXTI0_Pos               (0U)                              \n#define AFIO_EXTICR1_EXTI0_Msk               (0xFUL << AFIO_EXTICR1_EXTI0_Pos)  /*!< 0x0000000F */\n#define AFIO_EXTICR1_EXTI0                   AFIO_EXTICR1_EXTI0_Msk            /*!< EXTI 0 configuration */\n#define AFIO_EXTICR1_EXTI1_Pos               (4U)                              \n#define AFIO_EXTICR1_EXTI1_Msk               (0xFUL << AFIO_EXTICR1_EXTI1_Pos)  /*!< 0x000000F0 */\n#define AFIO_EXTICR1_EXTI1                   AFIO_EXTICR1_EXTI1_Msk            /*!< EXTI 1 configuration */\n#define AFIO_EXTICR1_EXTI2_Pos               (8U)                              \n#define AFIO_EXTICR1_EXTI2_Msk               (0xFUL << AFIO_EXTICR1_EXTI2_Pos)  /*!< 0x00000F00 */\n#define AFIO_EXTICR1_EXTI2                   AFIO_EXTICR1_EXTI2_Msk            /*!< EXTI 2 configuration */\n#define AFIO_EXTICR1_EXTI3_Pos               (12U)                             \n#define AFIO_EXTICR1_EXTI3_Msk               (0xFUL << AFIO_EXTICR1_EXTI3_Pos)  /*!< 0x0000F000 */\n#define AFIO_EXTICR1_EXTI3                   AFIO_EXTICR1_EXTI3_Msk            /*!< EXTI 3 configuration */\n\n/*!< EXTI0 configuration */\n#define AFIO_EXTICR1_EXTI0_PA                0x00000000U                          /*!< PA[0] pin */\n#define AFIO_EXTICR1_EXTI0_PB_Pos            (0U)                              \n#define AFIO_EXTICR1_EXTI0_PB_Msk            (0x1UL << AFIO_EXTICR1_EXTI0_PB_Pos) /*!< 0x00000001 */\n#define AFIO_EXTICR1_EXTI0_PB                AFIO_EXTICR1_EXTI0_PB_Msk         /*!< PB[0] pin */\n#define AFIO_EXTICR1_EXTI0_PC_Pos            (1U)                              \n#define AFIO_EXTICR1_EXTI0_PC_Msk            (0x1UL << AFIO_EXTICR1_EXTI0_PC_Pos) /*!< 0x00000002 */\n#define AFIO_EXTICR1_EXTI0_PC                AFIO_EXTICR1_EXTI0_PC_Msk         /*!< PC[0] pin */\n#define AFIO_EXTICR1_EXTI0_PD_Pos            (0U)                              \n#define AFIO_EXTICR1_EXTI0_PD_Msk            (0x3UL << AFIO_EXTICR1_EXTI0_PD_Pos) /*!< 0x00000003 */\n#define AFIO_EXTICR1_EXTI0_PD                AFIO_EXTICR1_EXTI0_PD_Msk         /*!< PD[0] pin */\n#define AFIO_EXTICR1_EXTI0_PE_Pos            (2U)                              \n#define AFIO_EXTICR1_EXTI0_PE_Msk            (0x1UL << AFIO_EXTICR1_EXTI0_PE_Pos) /*!< 0x00000004 */\n#define AFIO_EXTICR1_EXTI0_PE                AFIO_EXTICR1_EXTI0_PE_Msk         /*!< PE[0] pin */\n#define AFIO_EXTICR1_EXTI0_PF_Pos            (0U)                              \n#define AFIO_EXTICR1_EXTI0_PF_Msk            (0x5UL << AFIO_EXTICR1_EXTI0_PF_Pos) /*!< 0x00000005 */\n#define AFIO_EXTICR1_EXTI0_PF                AFIO_EXTICR1_EXTI0_PF_Msk         /*!< PF[0] pin */\n#define AFIO_EXTICR1_EXTI0_PG_Pos            (1U)                              \n#define AFIO_EXTICR1_EXTI0_PG_Msk            (0x3UL << AFIO_EXTICR1_EXTI0_PG_Pos) /*!< 0x00000006 */\n#define AFIO_EXTICR1_EXTI0_PG                AFIO_EXTICR1_EXTI0_PG_Msk         /*!< PG[0] pin */\n\n/*!< EXTI1 configuration */\n#define AFIO_EXTICR1_EXTI1_PA                0x00000000U                          /*!< PA[1] pin */\n#define AFIO_EXTICR1_EXTI1_PB_Pos            (4U)                              \n#define AFIO_EXTICR1_EXTI1_PB_Msk            (0x1UL << AFIO_EXTICR1_EXTI1_PB_Pos) /*!< 0x00000010 */\n#define AFIO_EXTICR1_EXTI1_PB                AFIO_EXTICR1_EXTI1_PB_Msk         /*!< PB[1] pin */\n#define AFIO_EXTICR1_EXTI1_PC_Pos            (5U)                              \n#define AFIO_EXTICR1_EXTI1_PC_Msk            (0x1UL << AFIO_EXTICR1_EXTI1_PC_Pos) /*!< 0x00000020 */\n#define AFIO_EXTICR1_EXTI1_PC                AFIO_EXTICR1_EXTI1_PC_Msk         /*!< PC[1] pin */\n#define AFIO_EXTICR1_EXTI1_PD_Pos            (4U)                              \n#define AFIO_EXTICR1_EXTI1_PD_Msk            (0x3UL << AFIO_EXTICR1_EXTI1_PD_Pos) /*!< 0x00000030 */\n#define AFIO_EXTICR1_EXTI1_PD                AFIO_EXTICR1_EXTI1_PD_Msk         /*!< PD[1] pin */\n#define AFIO_EXTICR1_EXTI1_PE_Pos            (6U)                              \n#define AFIO_EXTICR1_EXTI1_PE_Msk            (0x1UL << AFIO_EXTICR1_EXTI1_PE_Pos) /*!< 0x00000040 */\n#define AFIO_EXTICR1_EXTI1_PE                AFIO_EXTICR1_EXTI1_PE_Msk         /*!< PE[1] pin */\n#define AFIO_EXTICR1_EXTI1_PF_Pos            (4U)                              \n#define AFIO_EXTICR1_EXTI1_PF_Msk            (0x5UL << AFIO_EXTICR1_EXTI1_PF_Pos) /*!< 0x00000050 */\n#define AFIO_EXTICR1_EXTI1_PF                AFIO_EXTICR1_EXTI1_PF_Msk         /*!< PF[1] pin */\n#define AFIO_EXTICR1_EXTI1_PG_Pos            (5U)                              \n#define AFIO_EXTICR1_EXTI1_PG_Msk            (0x3UL << AFIO_EXTICR1_EXTI1_PG_Pos) /*!< 0x00000060 */\n#define AFIO_EXTICR1_EXTI1_PG                AFIO_EXTICR1_EXTI1_PG_Msk         /*!< PG[1] pin */\n\n/*!< EXTI2 configuration */  \n#define AFIO_EXTICR1_EXTI2_PA                0x00000000U                          /*!< PA[2] pin */\n#define AFIO_EXTICR1_EXTI2_PB_Pos            (8U)                              \n#define AFIO_EXTICR1_EXTI2_PB_Msk            (0x1UL << AFIO_EXTICR1_EXTI2_PB_Pos) /*!< 0x00000100 */\n#define AFIO_EXTICR1_EXTI2_PB                AFIO_EXTICR1_EXTI2_PB_Msk         /*!< PB[2] pin */\n#define AFIO_EXTICR1_EXTI2_PC_Pos            (9U)                              \n#define AFIO_EXTICR1_EXTI2_PC_Msk            (0x1UL << AFIO_EXTICR1_EXTI2_PC_Pos) /*!< 0x00000200 */\n#define AFIO_EXTICR1_EXTI2_PC                AFIO_EXTICR1_EXTI2_PC_Msk         /*!< PC[2] pin */\n#define AFIO_EXTICR1_EXTI2_PD_Pos            (8U)                              \n#define AFIO_EXTICR1_EXTI2_PD_Msk            (0x3UL << AFIO_EXTICR1_EXTI2_PD_Pos) /*!< 0x00000300 */\n#define AFIO_EXTICR1_EXTI2_PD                AFIO_EXTICR1_EXTI2_PD_Msk         /*!< PD[2] pin */\n#define AFIO_EXTICR1_EXTI2_PE_Pos            (10U)                             \n#define AFIO_EXTICR1_EXTI2_PE_Msk            (0x1UL << AFIO_EXTICR1_EXTI2_PE_Pos) /*!< 0x00000400 */\n#define AFIO_EXTICR1_EXTI2_PE                AFIO_EXTICR1_EXTI2_PE_Msk         /*!< PE[2] pin */\n#define AFIO_EXTICR1_EXTI2_PF_Pos            (8U)                              \n#define AFIO_EXTICR1_EXTI2_PF_Msk            (0x5UL << AFIO_EXTICR1_EXTI2_PF_Pos) /*!< 0x00000500 */\n#define AFIO_EXTICR1_EXTI2_PF                AFIO_EXTICR1_EXTI2_PF_Msk         /*!< PF[2] pin */\n#define AFIO_EXTICR1_EXTI2_PG_Pos            (9U)                              \n#define AFIO_EXTICR1_EXTI2_PG_Msk            (0x3UL << AFIO_EXTICR1_EXTI2_PG_Pos) /*!< 0x00000600 */\n#define AFIO_EXTICR1_EXTI2_PG                AFIO_EXTICR1_EXTI2_PG_Msk         /*!< PG[2] pin */\n\n/*!< EXTI3 configuration */\n#define AFIO_EXTICR1_EXTI3_PA                0x00000000U                          /*!< PA[3] pin */\n#define AFIO_EXTICR1_EXTI3_PB_Pos            (12U)                             \n#define AFIO_EXTICR1_EXTI3_PB_Msk            (0x1UL << AFIO_EXTICR1_EXTI3_PB_Pos) /*!< 0x00001000 */\n#define AFIO_EXTICR1_EXTI3_PB                AFIO_EXTICR1_EXTI3_PB_Msk         /*!< PB[3] pin */\n#define AFIO_EXTICR1_EXTI3_PC_Pos            (13U)                             \n#define AFIO_EXTICR1_EXTI3_PC_Msk            (0x1UL << AFIO_EXTICR1_EXTI3_PC_Pos) /*!< 0x00002000 */\n#define AFIO_EXTICR1_EXTI3_PC                AFIO_EXTICR1_EXTI3_PC_Msk         /*!< PC[3] pin */\n#define AFIO_EXTICR1_EXTI3_PD_Pos            (12U)                             \n#define AFIO_EXTICR1_EXTI3_PD_Msk            (0x3UL << AFIO_EXTICR1_EXTI3_PD_Pos) /*!< 0x00003000 */\n#define AFIO_EXTICR1_EXTI3_PD                AFIO_EXTICR1_EXTI3_PD_Msk         /*!< PD[3] pin */\n#define AFIO_EXTICR1_EXTI3_PE_Pos            (14U)                             \n#define AFIO_EXTICR1_EXTI3_PE_Msk            (0x1UL << AFIO_EXTICR1_EXTI3_PE_Pos) /*!< 0x00004000 */\n#define AFIO_EXTICR1_EXTI3_PE                AFIO_EXTICR1_EXTI3_PE_Msk         /*!< PE[3] pin */\n#define AFIO_EXTICR1_EXTI3_PF_Pos            (12U)                             \n#define AFIO_EXTICR1_EXTI3_PF_Msk            (0x5UL << AFIO_EXTICR1_EXTI3_PF_Pos) /*!< 0x00005000 */\n#define AFIO_EXTICR1_EXTI3_PF                AFIO_EXTICR1_EXTI3_PF_Msk         /*!< PF[3] pin */\n#define AFIO_EXTICR1_EXTI3_PG_Pos            (13U)                             \n#define AFIO_EXTICR1_EXTI3_PG_Msk            (0x3UL << AFIO_EXTICR1_EXTI3_PG_Pos) /*!< 0x00006000 */\n#define AFIO_EXTICR1_EXTI3_PG                AFIO_EXTICR1_EXTI3_PG_Msk         /*!< PG[3] pin */\n\n/*****************  Bit definition for AFIO_EXTICR2 register  *****************/\n#define AFIO_EXTICR2_EXTI4_Pos               (0U)                              \n#define AFIO_EXTICR2_EXTI4_Msk               (0xFUL << AFIO_EXTICR2_EXTI4_Pos)  /*!< 0x0000000F */\n#define AFIO_EXTICR2_EXTI4                   AFIO_EXTICR2_EXTI4_Msk            /*!< EXTI 4 configuration */\n#define AFIO_EXTICR2_EXTI5_Pos               (4U)                              \n#define AFIO_EXTICR2_EXTI5_Msk               (0xFUL << AFIO_EXTICR2_EXTI5_Pos)  /*!< 0x000000F0 */\n#define AFIO_EXTICR2_EXTI5                   AFIO_EXTICR2_EXTI5_Msk            /*!< EXTI 5 configuration */\n#define AFIO_EXTICR2_EXTI6_Pos               (8U)                              \n#define AFIO_EXTICR2_EXTI6_Msk               (0xFUL << AFIO_EXTICR2_EXTI6_Pos)  /*!< 0x00000F00 */\n#define AFIO_EXTICR2_EXTI6                   AFIO_EXTICR2_EXTI6_Msk            /*!< EXTI 6 configuration */\n#define AFIO_EXTICR2_EXTI7_Pos               (12U)                             \n#define AFIO_EXTICR2_EXTI7_Msk               (0xFUL << AFIO_EXTICR2_EXTI7_Pos)  /*!< 0x0000F000 */\n#define AFIO_EXTICR2_EXTI7                   AFIO_EXTICR2_EXTI7_Msk            /*!< EXTI 7 configuration */\n\n/*!< EXTI4 configuration */\n#define AFIO_EXTICR2_EXTI4_PA                0x00000000U                          /*!< PA[4] pin */\n#define AFIO_EXTICR2_EXTI4_PB_Pos            (0U)                              \n#define AFIO_EXTICR2_EXTI4_PB_Msk            (0x1UL << AFIO_EXTICR2_EXTI4_PB_Pos) /*!< 0x00000001 */\n#define AFIO_EXTICR2_EXTI4_PB                AFIO_EXTICR2_EXTI4_PB_Msk         /*!< PB[4] pin */\n#define AFIO_EXTICR2_EXTI4_PC_Pos            (1U)                              \n#define AFIO_EXTICR2_EXTI4_PC_Msk            (0x1UL << AFIO_EXTICR2_EXTI4_PC_Pos) /*!< 0x00000002 */\n#define AFIO_EXTICR2_EXTI4_PC                AFIO_EXTICR2_EXTI4_PC_Msk         /*!< PC[4] pin */\n#define AFIO_EXTICR2_EXTI4_PD_Pos            (0U)                              \n#define AFIO_EXTICR2_EXTI4_PD_Msk            (0x3UL << AFIO_EXTICR2_EXTI4_PD_Pos) /*!< 0x00000003 */\n#define AFIO_EXTICR2_EXTI4_PD                AFIO_EXTICR2_EXTI4_PD_Msk         /*!< PD[4] pin */\n#define AFIO_EXTICR2_EXTI4_PE_Pos            (2U)                              \n#define AFIO_EXTICR2_EXTI4_PE_Msk            (0x1UL << AFIO_EXTICR2_EXTI4_PE_Pos) /*!< 0x00000004 */\n#define AFIO_EXTICR2_EXTI4_PE                AFIO_EXTICR2_EXTI4_PE_Msk         /*!< PE[4] pin */\n#define AFIO_EXTICR2_EXTI4_PF_Pos            (0U)                              \n#define AFIO_EXTICR2_EXTI4_PF_Msk            (0x5UL << AFIO_EXTICR2_EXTI4_PF_Pos) /*!< 0x00000005 */\n#define AFIO_EXTICR2_EXTI4_PF                AFIO_EXTICR2_EXTI4_PF_Msk         /*!< PF[4] pin */\n#define AFIO_EXTICR2_EXTI4_PG_Pos            (1U)                              \n#define AFIO_EXTICR2_EXTI4_PG_Msk            (0x3UL << AFIO_EXTICR2_EXTI4_PG_Pos) /*!< 0x00000006 */\n#define AFIO_EXTICR2_EXTI4_PG                AFIO_EXTICR2_EXTI4_PG_Msk         /*!< PG[4] pin */\n\n/* EXTI5 configuration */\n#define AFIO_EXTICR2_EXTI5_PA                0x00000000U                          /*!< PA[5] pin */\n#define AFIO_EXTICR2_EXTI5_PB_Pos            (4U)                              \n#define AFIO_EXTICR2_EXTI5_PB_Msk            (0x1UL << AFIO_EXTICR2_EXTI5_PB_Pos) /*!< 0x00000010 */\n#define AFIO_EXTICR2_EXTI5_PB                AFIO_EXTICR2_EXTI5_PB_Msk         /*!< PB[5] pin */\n#define AFIO_EXTICR2_EXTI5_PC_Pos            (5U)                              \n#define AFIO_EXTICR2_EXTI5_PC_Msk            (0x1UL << AFIO_EXTICR2_EXTI5_PC_Pos) /*!< 0x00000020 */\n#define AFIO_EXTICR2_EXTI5_PC                AFIO_EXTICR2_EXTI5_PC_Msk         /*!< PC[5] pin */\n#define AFIO_EXTICR2_EXTI5_PD_Pos            (4U)                              \n#define AFIO_EXTICR2_EXTI5_PD_Msk            (0x3UL << AFIO_EXTICR2_EXTI5_PD_Pos) /*!< 0x00000030 */\n#define AFIO_EXTICR2_EXTI5_PD                AFIO_EXTICR2_EXTI5_PD_Msk         /*!< PD[5] pin */\n#define AFIO_EXTICR2_EXTI5_PE_Pos            (6U)                              \n#define AFIO_EXTICR2_EXTI5_PE_Msk            (0x1UL << AFIO_EXTICR2_EXTI5_PE_Pos) /*!< 0x00000040 */\n#define AFIO_EXTICR2_EXTI5_PE                AFIO_EXTICR2_EXTI5_PE_Msk         /*!< PE[5] pin */\n#define AFIO_EXTICR2_EXTI5_PF_Pos            (4U)                              \n#define AFIO_EXTICR2_EXTI5_PF_Msk            (0x5UL << AFIO_EXTICR2_EXTI5_PF_Pos) /*!< 0x00000050 */\n#define AFIO_EXTICR2_EXTI5_PF                AFIO_EXTICR2_EXTI5_PF_Msk         /*!< PF[5] pin */\n#define AFIO_EXTICR2_EXTI5_PG_Pos            (5U)                              \n#define AFIO_EXTICR2_EXTI5_PG_Msk            (0x3UL << AFIO_EXTICR2_EXTI5_PG_Pos) /*!< 0x00000060 */\n#define AFIO_EXTICR2_EXTI5_PG                AFIO_EXTICR2_EXTI5_PG_Msk         /*!< PG[5] pin */\n\n/*!< EXTI6 configuration */  \n#define AFIO_EXTICR2_EXTI6_PA                0x00000000U                          /*!< PA[6] pin */\n#define AFIO_EXTICR2_EXTI6_PB_Pos            (8U)                              \n#define AFIO_EXTICR2_EXTI6_PB_Msk            (0x1UL << AFIO_EXTICR2_EXTI6_PB_Pos) /*!< 0x00000100 */\n#define AFIO_EXTICR2_EXTI6_PB                AFIO_EXTICR2_EXTI6_PB_Msk         /*!< PB[6] pin */\n#define AFIO_EXTICR2_EXTI6_PC_Pos            (9U)                              \n#define AFIO_EXTICR2_EXTI6_PC_Msk            (0x1UL << AFIO_EXTICR2_EXTI6_PC_Pos) /*!< 0x00000200 */\n#define AFIO_EXTICR2_EXTI6_PC                AFIO_EXTICR2_EXTI6_PC_Msk         /*!< PC[6] pin */\n#define AFIO_EXTICR2_EXTI6_PD_Pos            (8U)                              \n#define AFIO_EXTICR2_EXTI6_PD_Msk            (0x3UL << AFIO_EXTICR2_EXTI6_PD_Pos) /*!< 0x00000300 */\n#define AFIO_EXTICR2_EXTI6_PD                AFIO_EXTICR2_EXTI6_PD_Msk         /*!< PD[6] pin */\n#define AFIO_EXTICR2_EXTI6_PE_Pos            (10U)                             \n#define AFIO_EXTICR2_EXTI6_PE_Msk            (0x1UL << AFIO_EXTICR2_EXTI6_PE_Pos) /*!< 0x00000400 */\n#define AFIO_EXTICR2_EXTI6_PE                AFIO_EXTICR2_EXTI6_PE_Msk         /*!< PE[6] pin */\n#define AFIO_EXTICR2_EXTI6_PF_Pos            (8U)                              \n#define AFIO_EXTICR2_EXTI6_PF_Msk            (0x5UL << AFIO_EXTICR2_EXTI6_PF_Pos) /*!< 0x00000500 */\n#define AFIO_EXTICR2_EXTI6_PF                AFIO_EXTICR2_EXTI6_PF_Msk         /*!< PF[6] pin */\n#define AFIO_EXTICR2_EXTI6_PG_Pos            (9U)                              \n#define AFIO_EXTICR2_EXTI6_PG_Msk            (0x3UL << AFIO_EXTICR2_EXTI6_PG_Pos) /*!< 0x00000600 */\n#define AFIO_EXTICR2_EXTI6_PG                AFIO_EXTICR2_EXTI6_PG_Msk         /*!< PG[6] pin */\n\n/*!< EXTI7 configuration */\n#define AFIO_EXTICR2_EXTI7_PA                0x00000000U                          /*!< PA[7] pin */\n#define AFIO_EXTICR2_EXTI7_PB_Pos            (12U)                             \n#define AFIO_EXTICR2_EXTI7_PB_Msk            (0x1UL << AFIO_EXTICR2_EXTI7_PB_Pos) /*!< 0x00001000 */\n#define AFIO_EXTICR2_EXTI7_PB                AFIO_EXTICR2_EXTI7_PB_Msk         /*!< PB[7] pin */\n#define AFIO_EXTICR2_EXTI7_PC_Pos            (13U)                             \n#define AFIO_EXTICR2_EXTI7_PC_Msk            (0x1UL << AFIO_EXTICR2_EXTI7_PC_Pos) /*!< 0x00002000 */\n#define AFIO_EXTICR2_EXTI7_PC                AFIO_EXTICR2_EXTI7_PC_Msk         /*!< PC[7] pin */\n#define AFIO_EXTICR2_EXTI7_PD_Pos            (12U)                             \n#define AFIO_EXTICR2_EXTI7_PD_Msk            (0x3UL << AFIO_EXTICR2_EXTI7_PD_Pos) /*!< 0x00003000 */\n#define AFIO_EXTICR2_EXTI7_PD                AFIO_EXTICR2_EXTI7_PD_Msk         /*!< PD[7] pin */\n#define AFIO_EXTICR2_EXTI7_PE_Pos            (14U)                             \n#define AFIO_EXTICR2_EXTI7_PE_Msk            (0x1UL << AFIO_EXTICR2_EXTI7_PE_Pos) /*!< 0x00004000 */\n#define AFIO_EXTICR2_EXTI7_PE                AFIO_EXTICR2_EXTI7_PE_Msk         /*!< PE[7] pin */\n#define AFIO_EXTICR2_EXTI7_PF_Pos            (12U)                             \n#define AFIO_EXTICR2_EXTI7_PF_Msk            (0x5UL << AFIO_EXTICR2_EXTI7_PF_Pos) /*!< 0x00005000 */\n#define AFIO_EXTICR2_EXTI7_PF                AFIO_EXTICR2_EXTI7_PF_Msk         /*!< PF[7] pin */\n#define AFIO_EXTICR2_EXTI7_PG_Pos            (13U)                             \n#define AFIO_EXTICR2_EXTI7_PG_Msk            (0x3UL << AFIO_EXTICR2_EXTI7_PG_Pos) /*!< 0x00006000 */\n#define AFIO_EXTICR2_EXTI7_PG                AFIO_EXTICR2_EXTI7_PG_Msk         /*!< PG[7] pin */\n\n/*****************  Bit definition for AFIO_EXTICR3 register  *****************/\n#define AFIO_EXTICR3_EXTI8_Pos               (0U)                              \n#define AFIO_EXTICR3_EXTI8_Msk               (0xFUL << AFIO_EXTICR3_EXTI8_Pos)  /*!< 0x0000000F */\n#define AFIO_EXTICR3_EXTI8                   AFIO_EXTICR3_EXTI8_Msk            /*!< EXTI 8 configuration */\n#define AFIO_EXTICR3_EXTI9_Pos               (4U)                              \n#define AFIO_EXTICR3_EXTI9_Msk               (0xFUL << AFIO_EXTICR3_EXTI9_Pos)  /*!< 0x000000F0 */\n#define AFIO_EXTICR3_EXTI9                   AFIO_EXTICR3_EXTI9_Msk            /*!< EXTI 9 configuration */\n#define AFIO_EXTICR3_EXTI10_Pos              (8U)                              \n#define AFIO_EXTICR3_EXTI10_Msk              (0xFUL << AFIO_EXTICR3_EXTI10_Pos) /*!< 0x00000F00 */\n#define AFIO_EXTICR3_EXTI10                  AFIO_EXTICR3_EXTI10_Msk           /*!< EXTI 10 configuration */\n#define AFIO_EXTICR3_EXTI11_Pos              (12U)                             \n#define AFIO_EXTICR3_EXTI11_Msk              (0xFUL << AFIO_EXTICR3_EXTI11_Pos) /*!< 0x0000F000 */\n#define AFIO_EXTICR3_EXTI11                  AFIO_EXTICR3_EXTI11_Msk           /*!< EXTI 11 configuration */\n\n/*!< EXTI8 configuration */\n#define AFIO_EXTICR3_EXTI8_PA                0x00000000U                          /*!< PA[8] pin */\n#define AFIO_EXTICR3_EXTI8_PB_Pos            (0U)                              \n#define AFIO_EXTICR3_EXTI8_PB_Msk            (0x1UL << AFIO_EXTICR3_EXTI8_PB_Pos) /*!< 0x00000001 */\n#define AFIO_EXTICR3_EXTI8_PB                AFIO_EXTICR3_EXTI8_PB_Msk         /*!< PB[8] pin */\n#define AFIO_EXTICR3_EXTI8_PC_Pos            (1U)                              \n#define AFIO_EXTICR3_EXTI8_PC_Msk            (0x1UL << AFIO_EXTICR3_EXTI8_PC_Pos) /*!< 0x00000002 */\n#define AFIO_EXTICR3_EXTI8_PC                AFIO_EXTICR3_EXTI8_PC_Msk         /*!< PC[8] pin */\n#define AFIO_EXTICR3_EXTI8_PD_Pos            (0U)                              \n#define AFIO_EXTICR3_EXTI8_PD_Msk            (0x3UL << AFIO_EXTICR3_EXTI8_PD_Pos) /*!< 0x00000003 */\n#define AFIO_EXTICR3_EXTI8_PD                AFIO_EXTICR3_EXTI8_PD_Msk         /*!< PD[8] pin */\n#define AFIO_EXTICR3_EXTI8_PE_Pos            (2U)                              \n#define AFIO_EXTICR3_EXTI8_PE_Msk            (0x1UL << AFIO_EXTICR3_EXTI8_PE_Pos) /*!< 0x00000004 */\n#define AFIO_EXTICR3_EXTI8_PE                AFIO_EXTICR3_EXTI8_PE_Msk         /*!< PE[8] pin */\n#define AFIO_EXTICR3_EXTI8_PF_Pos            (0U)                              \n#define AFIO_EXTICR3_EXTI8_PF_Msk            (0x5UL << AFIO_EXTICR3_EXTI8_PF_Pos) /*!< 0x00000005 */\n#define AFIO_EXTICR3_EXTI8_PF                AFIO_EXTICR3_EXTI8_PF_Msk         /*!< PF[8] pin */\n#define AFIO_EXTICR3_EXTI8_PG_Pos            (1U)                              \n#define AFIO_EXTICR3_EXTI8_PG_Msk            (0x3UL << AFIO_EXTICR3_EXTI8_PG_Pos) /*!< 0x00000006 */\n#define AFIO_EXTICR3_EXTI8_PG                AFIO_EXTICR3_EXTI8_PG_Msk         /*!< PG[8] pin */\n\n/*!< EXTI9 configuration */\n#define AFIO_EXTICR3_EXTI9_PA                0x00000000U                          /*!< PA[9] pin */\n#define AFIO_EXTICR3_EXTI9_PB_Pos            (4U)                              \n#define AFIO_EXTICR3_EXTI9_PB_Msk            (0x1UL << AFIO_EXTICR3_EXTI9_PB_Pos) /*!< 0x00000010 */\n#define AFIO_EXTICR3_EXTI9_PB                AFIO_EXTICR3_EXTI9_PB_Msk         /*!< PB[9] pin */\n#define AFIO_EXTICR3_EXTI9_PC_Pos            (5U)                              \n#define AFIO_EXTICR3_EXTI9_PC_Msk            (0x1UL << AFIO_EXTICR3_EXTI9_PC_Pos) /*!< 0x00000020 */\n#define AFIO_EXTICR3_EXTI9_PC                AFIO_EXTICR3_EXTI9_PC_Msk         /*!< PC[9] pin */\n#define AFIO_EXTICR3_EXTI9_PD_Pos            (4U)                              \n#define AFIO_EXTICR3_EXTI9_PD_Msk            (0x3UL << AFIO_EXTICR3_EXTI9_PD_Pos) /*!< 0x00000030 */\n#define AFIO_EXTICR3_EXTI9_PD                AFIO_EXTICR3_EXTI9_PD_Msk         /*!< PD[9] pin */\n#define AFIO_EXTICR3_EXTI9_PE_Pos            (6U)                              \n#define AFIO_EXTICR3_EXTI9_PE_Msk            (0x1UL << AFIO_EXTICR3_EXTI9_PE_Pos) /*!< 0x00000040 */\n#define AFIO_EXTICR3_EXTI9_PE                AFIO_EXTICR3_EXTI9_PE_Msk         /*!< PE[9] pin */\n#define AFIO_EXTICR3_EXTI9_PF_Pos            (4U)                              \n#define AFIO_EXTICR3_EXTI9_PF_Msk            (0x5UL << AFIO_EXTICR3_EXTI9_PF_Pos) /*!< 0x00000050 */\n#define AFIO_EXTICR3_EXTI9_PF                AFIO_EXTICR3_EXTI9_PF_Msk         /*!< PF[9] pin */\n#define AFIO_EXTICR3_EXTI9_PG_Pos            (5U)                              \n#define AFIO_EXTICR3_EXTI9_PG_Msk            (0x3UL << AFIO_EXTICR3_EXTI9_PG_Pos) /*!< 0x00000060 */\n#define AFIO_EXTICR3_EXTI9_PG                AFIO_EXTICR3_EXTI9_PG_Msk         /*!< PG[9] pin */\n\n/*!< EXTI10 configuration */  \n#define AFIO_EXTICR3_EXTI10_PA               0x00000000U                          /*!< PA[10] pin */\n#define AFIO_EXTICR3_EXTI10_PB_Pos           (8U)                              \n#define AFIO_EXTICR3_EXTI10_PB_Msk           (0x1UL << AFIO_EXTICR3_EXTI10_PB_Pos) /*!< 0x00000100 */\n#define AFIO_EXTICR3_EXTI10_PB               AFIO_EXTICR3_EXTI10_PB_Msk        /*!< PB[10] pin */\n#define AFIO_EXTICR3_EXTI10_PC_Pos           (9U)                              \n#define AFIO_EXTICR3_EXTI10_PC_Msk           (0x1UL << AFIO_EXTICR3_EXTI10_PC_Pos) /*!< 0x00000200 */\n#define AFIO_EXTICR3_EXTI10_PC               AFIO_EXTICR3_EXTI10_PC_Msk        /*!< PC[10] pin */\n#define AFIO_EXTICR3_EXTI10_PD_Pos           (8U)                              \n#define AFIO_EXTICR3_EXTI10_PD_Msk           (0x3UL << AFIO_EXTICR3_EXTI10_PD_Pos) /*!< 0x00000300 */\n#define AFIO_EXTICR3_EXTI10_PD               AFIO_EXTICR3_EXTI10_PD_Msk        /*!< PD[10] pin */\n#define AFIO_EXTICR3_EXTI10_PE_Pos           (10U)                             \n#define AFIO_EXTICR3_EXTI10_PE_Msk           (0x1UL << AFIO_EXTICR3_EXTI10_PE_Pos) /*!< 0x00000400 */\n#define AFIO_EXTICR3_EXTI10_PE               AFIO_EXTICR3_EXTI10_PE_Msk        /*!< PE[10] pin */\n#define AFIO_EXTICR3_EXTI10_PF_Pos           (8U)                              \n#define AFIO_EXTICR3_EXTI10_PF_Msk           (0x5UL << AFIO_EXTICR3_EXTI10_PF_Pos) /*!< 0x00000500 */\n#define AFIO_EXTICR3_EXTI10_PF               AFIO_EXTICR3_EXTI10_PF_Msk        /*!< PF[10] pin */\n#define AFIO_EXTICR3_EXTI10_PG_Pos           (9U)                              \n#define AFIO_EXTICR3_EXTI10_PG_Msk           (0x3UL << AFIO_EXTICR3_EXTI10_PG_Pos) /*!< 0x00000600 */\n#define AFIO_EXTICR3_EXTI10_PG               AFIO_EXTICR3_EXTI10_PG_Msk        /*!< PG[10] pin */\n\n/*!< EXTI11 configuration */\n#define AFIO_EXTICR3_EXTI11_PA               0x00000000U                          /*!< PA[11] pin */\n#define AFIO_EXTICR3_EXTI11_PB_Pos           (12U)                             \n#define AFIO_EXTICR3_EXTI11_PB_Msk           (0x1UL << AFIO_EXTICR3_EXTI11_PB_Pos) /*!< 0x00001000 */\n#define AFIO_EXTICR3_EXTI11_PB               AFIO_EXTICR3_EXTI11_PB_Msk        /*!< PB[11] pin */\n#define AFIO_EXTICR3_EXTI11_PC_Pos           (13U)                             \n#define AFIO_EXTICR3_EXTI11_PC_Msk           (0x1UL << AFIO_EXTICR3_EXTI11_PC_Pos) /*!< 0x00002000 */\n#define AFIO_EXTICR3_EXTI11_PC               AFIO_EXTICR3_EXTI11_PC_Msk        /*!< PC[11] pin */\n#define AFIO_EXTICR3_EXTI11_PD_Pos           (12U)                             \n#define AFIO_EXTICR3_EXTI11_PD_Msk           (0x3UL << AFIO_EXTICR3_EXTI11_PD_Pos) /*!< 0x00003000 */\n#define AFIO_EXTICR3_EXTI11_PD               AFIO_EXTICR3_EXTI11_PD_Msk        /*!< PD[11] pin */\n#define AFIO_EXTICR3_EXTI11_PE_Pos           (14U)                             \n#define AFIO_EXTICR3_EXTI11_PE_Msk           (0x1UL << AFIO_EXTICR3_EXTI11_PE_Pos) /*!< 0x00004000 */\n#define AFIO_EXTICR3_EXTI11_PE               AFIO_EXTICR3_EXTI11_PE_Msk        /*!< PE[11] pin */\n#define AFIO_EXTICR3_EXTI11_PF_Pos           (12U)                             \n#define AFIO_EXTICR3_EXTI11_PF_Msk           (0x5UL << AFIO_EXTICR3_EXTI11_PF_Pos) /*!< 0x00005000 */\n#define AFIO_EXTICR3_EXTI11_PF               AFIO_EXTICR3_EXTI11_PF_Msk        /*!< PF[11] pin */\n#define AFIO_EXTICR3_EXTI11_PG_Pos           (13U)                             \n#define AFIO_EXTICR3_EXTI11_PG_Msk           (0x3UL << AFIO_EXTICR3_EXTI11_PG_Pos) /*!< 0x00006000 */\n#define AFIO_EXTICR3_EXTI11_PG               AFIO_EXTICR3_EXTI11_PG_Msk        /*!< PG[11] pin */\n\n/*****************  Bit definition for AFIO_EXTICR4 register  *****************/\n#define AFIO_EXTICR4_EXTI12_Pos              (0U)                              \n#define AFIO_EXTICR4_EXTI12_Msk              (0xFUL << AFIO_EXTICR4_EXTI12_Pos) /*!< 0x0000000F */\n#define AFIO_EXTICR4_EXTI12                  AFIO_EXTICR4_EXTI12_Msk           /*!< EXTI 12 configuration */\n#define AFIO_EXTICR4_EXTI13_Pos              (4U)                              \n#define AFIO_EXTICR4_EXTI13_Msk              (0xFUL << AFIO_EXTICR4_EXTI13_Pos) /*!< 0x000000F0 */\n#define AFIO_EXTICR4_EXTI13                  AFIO_EXTICR4_EXTI13_Msk           /*!< EXTI 13 configuration */\n#define AFIO_EXTICR4_EXTI14_Pos              (8U)                              \n#define AFIO_EXTICR4_EXTI14_Msk              (0xFUL << AFIO_EXTICR4_EXTI14_Pos) /*!< 0x00000F00 */\n#define AFIO_EXTICR4_EXTI14                  AFIO_EXTICR4_EXTI14_Msk           /*!< EXTI 14 configuration */\n#define AFIO_EXTICR4_EXTI15_Pos              (12U)                             \n#define AFIO_EXTICR4_EXTI15_Msk              (0xFUL << AFIO_EXTICR4_EXTI15_Pos) /*!< 0x0000F000 */\n#define AFIO_EXTICR4_EXTI15                  AFIO_EXTICR4_EXTI15_Msk           /*!< EXTI 15 configuration */\n\n/* EXTI12 configuration */\n#define AFIO_EXTICR4_EXTI12_PA               0x00000000U                          /*!< PA[12] pin */\n#define AFIO_EXTICR4_EXTI12_PB_Pos           (0U)                              \n#define AFIO_EXTICR4_EXTI12_PB_Msk           (0x1UL << AFIO_EXTICR4_EXTI12_PB_Pos) /*!< 0x00000001 */\n#define AFIO_EXTICR4_EXTI12_PB               AFIO_EXTICR4_EXTI12_PB_Msk        /*!< PB[12] pin */\n#define AFIO_EXTICR4_EXTI12_PC_Pos           (1U)                              \n#define AFIO_EXTICR4_EXTI12_PC_Msk           (0x1UL << AFIO_EXTICR4_EXTI12_PC_Pos) /*!< 0x00000002 */\n#define AFIO_EXTICR4_EXTI12_PC               AFIO_EXTICR4_EXTI12_PC_Msk        /*!< PC[12] pin */\n#define AFIO_EXTICR4_EXTI12_PD_Pos           (0U)                              \n#define AFIO_EXTICR4_EXTI12_PD_Msk           (0x3UL << AFIO_EXTICR4_EXTI12_PD_Pos) /*!< 0x00000003 */\n#define AFIO_EXTICR4_EXTI12_PD               AFIO_EXTICR4_EXTI12_PD_Msk        /*!< PD[12] pin */\n#define AFIO_EXTICR4_EXTI12_PE_Pos           (2U)                              \n#define AFIO_EXTICR4_EXTI12_PE_Msk           (0x1UL << AFIO_EXTICR4_EXTI12_PE_Pos) /*!< 0x00000004 */\n#define AFIO_EXTICR4_EXTI12_PE               AFIO_EXTICR4_EXTI12_PE_Msk        /*!< PE[12] pin */\n#define AFIO_EXTICR4_EXTI12_PF_Pos           (0U)                              \n#define AFIO_EXTICR4_EXTI12_PF_Msk           (0x5UL << AFIO_EXTICR4_EXTI12_PF_Pos) /*!< 0x00000005 */\n#define AFIO_EXTICR4_EXTI12_PF               AFIO_EXTICR4_EXTI12_PF_Msk        /*!< PF[12] pin */\n#define AFIO_EXTICR4_EXTI12_PG_Pos           (1U)                              \n#define AFIO_EXTICR4_EXTI12_PG_Msk           (0x3UL << AFIO_EXTICR4_EXTI12_PG_Pos) /*!< 0x00000006 */\n#define AFIO_EXTICR4_EXTI12_PG               AFIO_EXTICR4_EXTI12_PG_Msk        /*!< PG[12] pin */\n\n/* EXTI13 configuration */\n#define AFIO_EXTICR4_EXTI13_PA               0x00000000U                          /*!< PA[13] pin */\n#define AFIO_EXTICR4_EXTI13_PB_Pos           (4U)                              \n#define AFIO_EXTICR4_EXTI13_PB_Msk           (0x1UL << AFIO_EXTICR4_EXTI13_PB_Pos) /*!< 0x00000010 */\n#define AFIO_EXTICR4_EXTI13_PB               AFIO_EXTICR4_EXTI13_PB_Msk        /*!< PB[13] pin */\n#define AFIO_EXTICR4_EXTI13_PC_Pos           (5U)                              \n#define AFIO_EXTICR4_EXTI13_PC_Msk           (0x1UL << AFIO_EXTICR4_EXTI13_PC_Pos) /*!< 0x00000020 */\n#define AFIO_EXTICR4_EXTI13_PC               AFIO_EXTICR4_EXTI13_PC_Msk        /*!< PC[13] pin */\n#define AFIO_EXTICR4_EXTI13_PD_Pos           (4U)                              \n#define AFIO_EXTICR4_EXTI13_PD_Msk           (0x3UL << AFIO_EXTICR4_EXTI13_PD_Pos) /*!< 0x00000030 */\n#define AFIO_EXTICR4_EXTI13_PD               AFIO_EXTICR4_EXTI13_PD_Msk        /*!< PD[13] pin */\n#define AFIO_EXTICR4_EXTI13_PE_Pos           (6U)                              \n#define AFIO_EXTICR4_EXTI13_PE_Msk           (0x1UL << AFIO_EXTICR4_EXTI13_PE_Pos) /*!< 0x00000040 */\n#define AFIO_EXTICR4_EXTI13_PE               AFIO_EXTICR4_EXTI13_PE_Msk        /*!< PE[13] pin */\n#define AFIO_EXTICR4_EXTI13_PF_Pos           (4U)                              \n#define AFIO_EXTICR4_EXTI13_PF_Msk           (0x5UL << AFIO_EXTICR4_EXTI13_PF_Pos) /*!< 0x00000050 */\n#define AFIO_EXTICR4_EXTI13_PF               AFIO_EXTICR4_EXTI13_PF_Msk        /*!< PF[13] pin */\n#define AFIO_EXTICR4_EXTI13_PG_Pos           (5U)                              \n#define AFIO_EXTICR4_EXTI13_PG_Msk           (0x3UL << AFIO_EXTICR4_EXTI13_PG_Pos) /*!< 0x00000060 */\n#define AFIO_EXTICR4_EXTI13_PG               AFIO_EXTICR4_EXTI13_PG_Msk        /*!< PG[13] pin */\n\n/*!< EXTI14 configuration */  \n#define AFIO_EXTICR4_EXTI14_PA               0x00000000U                          /*!< PA[14] pin */\n#define AFIO_EXTICR4_EXTI14_PB_Pos           (8U)                              \n#define AFIO_EXTICR4_EXTI14_PB_Msk           (0x1UL << AFIO_EXTICR4_EXTI14_PB_Pos) /*!< 0x00000100 */\n#define AFIO_EXTICR4_EXTI14_PB               AFIO_EXTICR4_EXTI14_PB_Msk        /*!< PB[14] pin */\n#define AFIO_EXTICR4_EXTI14_PC_Pos           (9U)                              \n#define AFIO_EXTICR4_EXTI14_PC_Msk           (0x1UL << AFIO_EXTICR4_EXTI14_PC_Pos) /*!< 0x00000200 */\n#define AFIO_EXTICR4_EXTI14_PC               AFIO_EXTICR4_EXTI14_PC_Msk        /*!< PC[14] pin */\n#define AFIO_EXTICR4_EXTI14_PD_Pos           (8U)                              \n#define AFIO_EXTICR4_EXTI14_PD_Msk           (0x3UL << AFIO_EXTICR4_EXTI14_PD_Pos) /*!< 0x00000300 */\n#define AFIO_EXTICR4_EXTI14_PD               AFIO_EXTICR4_EXTI14_PD_Msk        /*!< PD[14] pin */\n#define AFIO_EXTICR4_EXTI14_PE_Pos           (10U)                             \n#define AFIO_EXTICR4_EXTI14_PE_Msk           (0x1UL << AFIO_EXTICR4_EXTI14_PE_Pos) /*!< 0x00000400 */\n#define AFIO_EXTICR4_EXTI14_PE               AFIO_EXTICR4_EXTI14_PE_Msk        /*!< PE[14] pin */\n#define AFIO_EXTICR4_EXTI14_PF_Pos           (8U)                              \n#define AFIO_EXTICR4_EXTI14_PF_Msk           (0x5UL << AFIO_EXTICR4_EXTI14_PF_Pos) /*!< 0x00000500 */\n#define AFIO_EXTICR4_EXTI14_PF               AFIO_EXTICR4_EXTI14_PF_Msk        /*!< PF[14] pin */\n#define AFIO_EXTICR4_EXTI14_PG_Pos           (9U)                              \n#define AFIO_EXTICR4_EXTI14_PG_Msk           (0x3UL << AFIO_EXTICR4_EXTI14_PG_Pos) /*!< 0x00000600 */\n#define AFIO_EXTICR4_EXTI14_PG               AFIO_EXTICR4_EXTI14_PG_Msk        /*!< PG[14] pin */\n\n/*!< EXTI15 configuration */\n#define AFIO_EXTICR4_EXTI15_PA               0x00000000U                          /*!< PA[15] pin */\n#define AFIO_EXTICR4_EXTI15_PB_Pos           (12U)                             \n#define AFIO_EXTICR4_EXTI15_PB_Msk           (0x1UL << AFIO_EXTICR4_EXTI15_PB_Pos) /*!< 0x00001000 */\n#define AFIO_EXTICR4_EXTI15_PB               AFIO_EXTICR4_EXTI15_PB_Msk        /*!< PB[15] pin */\n#define AFIO_EXTICR4_EXTI15_PC_Pos           (13U)                             \n#define AFIO_EXTICR4_EXTI15_PC_Msk           (0x1UL << AFIO_EXTICR4_EXTI15_PC_Pos) /*!< 0x00002000 */\n#define AFIO_EXTICR4_EXTI15_PC               AFIO_EXTICR4_EXTI15_PC_Msk        /*!< PC[15] pin */\n#define AFIO_EXTICR4_EXTI15_PD_Pos           (12U)                             \n#define AFIO_EXTICR4_EXTI15_PD_Msk           (0x3UL << AFIO_EXTICR4_EXTI15_PD_Pos) /*!< 0x00003000 */\n#define AFIO_EXTICR4_EXTI15_PD               AFIO_EXTICR4_EXTI15_PD_Msk        /*!< PD[15] pin */\n#define AFIO_EXTICR4_EXTI15_PE_Pos           (14U)                             \n#define AFIO_EXTICR4_EXTI15_PE_Msk           (0x1UL << AFIO_EXTICR4_EXTI15_PE_Pos) /*!< 0x00004000 */\n#define AFIO_EXTICR4_EXTI15_PE               AFIO_EXTICR4_EXTI15_PE_Msk        /*!< PE[15] pin */\n#define AFIO_EXTICR4_EXTI15_PF_Pos           (12U)                             \n#define AFIO_EXTICR4_EXTI15_PF_Msk           (0x5UL << AFIO_EXTICR4_EXTI15_PF_Pos) /*!< 0x00005000 */\n#define AFIO_EXTICR4_EXTI15_PF               AFIO_EXTICR4_EXTI15_PF_Msk        /*!< PF[15] pin */\n#define AFIO_EXTICR4_EXTI15_PG_Pos           (13U)                             \n#define AFIO_EXTICR4_EXTI15_PG_Msk           (0x3UL << AFIO_EXTICR4_EXTI15_PG_Pos) /*!< 0x00006000 */\n#define AFIO_EXTICR4_EXTI15_PG               AFIO_EXTICR4_EXTI15_PG_Msk        /*!< PG[15] pin */\n\n/******************  Bit definition for AFIO_MAPR2 register  ******************/\n\n\n#define AFIO_MAPR2_FSMC_NADV_REMAP_Pos       (10U)                             \n#define AFIO_MAPR2_FSMC_NADV_REMAP_Msk       (0x1UL << AFIO_MAPR2_FSMC_NADV_REMAP_Pos) /*!< 0x00000400 */\n#define AFIO_MAPR2_FSMC_NADV_REMAP           AFIO_MAPR2_FSMC_NADV_REMAP_Msk    /*!< FSMC NADV remapping */\n\n/******************************************************************************/\n/*                                                                            */\n/*                    External Interrupt/Event Controller                     */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for EXTI_IMR register  *******************/\n#define EXTI_IMR_MR0_Pos                    (0U)                               \n#define EXTI_IMR_MR0_Msk                    (0x1UL << EXTI_IMR_MR0_Pos)         /*!< 0x00000001 */\n#define EXTI_IMR_MR0                        EXTI_IMR_MR0_Msk                   /*!< Interrupt Mask on line 0 */\n#define EXTI_IMR_MR1_Pos                    (1U)                               \n#define EXTI_IMR_MR1_Msk                    (0x1UL << EXTI_IMR_MR1_Pos)         /*!< 0x00000002 */\n#define EXTI_IMR_MR1                        EXTI_IMR_MR1_Msk                   /*!< Interrupt Mask on line 1 */\n#define EXTI_IMR_MR2_Pos                    (2U)                               \n#define EXTI_IMR_MR2_Msk                    (0x1UL << EXTI_IMR_MR2_Pos)         /*!< 0x00000004 */\n#define EXTI_IMR_MR2                        EXTI_IMR_MR2_Msk                   /*!< Interrupt Mask on line 2 */\n#define EXTI_IMR_MR3_Pos                    (3U)                               \n#define EXTI_IMR_MR3_Msk                    (0x1UL << EXTI_IMR_MR3_Pos)         /*!< 0x00000008 */\n#define EXTI_IMR_MR3                        EXTI_IMR_MR3_Msk                   /*!< Interrupt Mask on line 3 */\n#define EXTI_IMR_MR4_Pos                    (4U)                               \n#define EXTI_IMR_MR4_Msk                    (0x1UL << EXTI_IMR_MR4_Pos)         /*!< 0x00000010 */\n#define EXTI_IMR_MR4                        EXTI_IMR_MR4_Msk                   /*!< Interrupt Mask on line 4 */\n#define EXTI_IMR_MR5_Pos                    (5U)                               \n#define EXTI_IMR_MR5_Msk                    (0x1UL << EXTI_IMR_MR5_Pos)         /*!< 0x00000020 */\n#define EXTI_IMR_MR5                        EXTI_IMR_MR5_Msk                   /*!< Interrupt Mask on line 5 */\n#define EXTI_IMR_MR6_Pos                    (6U)                               \n#define EXTI_IMR_MR6_Msk                    (0x1UL << EXTI_IMR_MR6_Pos)         /*!< 0x00000040 */\n#define EXTI_IMR_MR6                        EXTI_IMR_MR6_Msk                   /*!< Interrupt Mask on line 6 */\n#define EXTI_IMR_MR7_Pos                    (7U)                               \n#define EXTI_IMR_MR7_Msk                    (0x1UL << EXTI_IMR_MR7_Pos)         /*!< 0x00000080 */\n#define EXTI_IMR_MR7                        EXTI_IMR_MR7_Msk                   /*!< Interrupt Mask on line 7 */\n#define EXTI_IMR_MR8_Pos                    (8U)                               \n#define EXTI_IMR_MR8_Msk                    (0x1UL << EXTI_IMR_MR8_Pos)         /*!< 0x00000100 */\n#define EXTI_IMR_MR8                        EXTI_IMR_MR8_Msk                   /*!< Interrupt Mask on line 8 */\n#define EXTI_IMR_MR9_Pos                    (9U)                               \n#define EXTI_IMR_MR9_Msk                    (0x1UL << EXTI_IMR_MR9_Pos)         /*!< 0x00000200 */\n#define EXTI_IMR_MR9                        EXTI_IMR_MR9_Msk                   /*!< Interrupt Mask on line 9 */\n#define EXTI_IMR_MR10_Pos                   (10U)                              \n#define EXTI_IMR_MR10_Msk                   (0x1UL << EXTI_IMR_MR10_Pos)        /*!< 0x00000400 */\n#define EXTI_IMR_MR10                       EXTI_IMR_MR10_Msk                  /*!< Interrupt Mask on line 10 */\n#define EXTI_IMR_MR11_Pos                   (11U)                              \n#define EXTI_IMR_MR11_Msk                   (0x1UL << EXTI_IMR_MR11_Pos)        /*!< 0x00000800 */\n#define EXTI_IMR_MR11                       EXTI_IMR_MR11_Msk                  /*!< Interrupt Mask on line 11 */\n#define EXTI_IMR_MR12_Pos                   (12U)                              \n#define EXTI_IMR_MR12_Msk                   (0x1UL << EXTI_IMR_MR12_Pos)        /*!< 0x00001000 */\n#define EXTI_IMR_MR12                       EXTI_IMR_MR12_Msk                  /*!< Interrupt Mask on line 12 */\n#define EXTI_IMR_MR13_Pos                   (13U)                              \n#define EXTI_IMR_MR13_Msk                   (0x1UL << EXTI_IMR_MR13_Pos)        /*!< 0x00002000 */\n#define EXTI_IMR_MR13                       EXTI_IMR_MR13_Msk                  /*!< Interrupt Mask on line 13 */\n#define EXTI_IMR_MR14_Pos                   (14U)                              \n#define EXTI_IMR_MR14_Msk                   (0x1UL << EXTI_IMR_MR14_Pos)        /*!< 0x00004000 */\n#define EXTI_IMR_MR14                       EXTI_IMR_MR14_Msk                  /*!< Interrupt Mask on line 14 */\n#define EXTI_IMR_MR15_Pos                   (15U)                              \n#define EXTI_IMR_MR15_Msk                   (0x1UL << EXTI_IMR_MR15_Pos)        /*!< 0x00008000 */\n#define EXTI_IMR_MR15                       EXTI_IMR_MR15_Msk                  /*!< Interrupt Mask on line 15 */\n#define EXTI_IMR_MR16_Pos                   (16U)                              \n#define EXTI_IMR_MR16_Msk                   (0x1UL << EXTI_IMR_MR16_Pos)        /*!< 0x00010000 */\n#define EXTI_IMR_MR16                       EXTI_IMR_MR16_Msk                  /*!< Interrupt Mask on line 16 */\n#define EXTI_IMR_MR17_Pos                   (17U)                              \n#define EXTI_IMR_MR17_Msk                   (0x1UL << EXTI_IMR_MR17_Pos)        /*!< 0x00020000 */\n#define EXTI_IMR_MR17                       EXTI_IMR_MR17_Msk                  /*!< Interrupt Mask on line 17 */\n#define EXTI_IMR_MR18_Pos                   (18U)                              \n#define EXTI_IMR_MR18_Msk                   (0x1UL << EXTI_IMR_MR18_Pos)        /*!< 0x00040000 */\n#define EXTI_IMR_MR18                       EXTI_IMR_MR18_Msk                  /*!< Interrupt Mask on line 18 */\n\n/* References Defines */\n#define  EXTI_IMR_IM0 EXTI_IMR_MR0\n#define  EXTI_IMR_IM1 EXTI_IMR_MR1\n#define  EXTI_IMR_IM2 EXTI_IMR_MR2\n#define  EXTI_IMR_IM3 EXTI_IMR_MR3\n#define  EXTI_IMR_IM4 EXTI_IMR_MR4\n#define  EXTI_IMR_IM5 EXTI_IMR_MR5\n#define  EXTI_IMR_IM6 EXTI_IMR_MR6\n#define  EXTI_IMR_IM7 EXTI_IMR_MR7\n#define  EXTI_IMR_IM8 EXTI_IMR_MR8\n#define  EXTI_IMR_IM9 EXTI_IMR_MR9\n#define  EXTI_IMR_IM10 EXTI_IMR_MR10\n#define  EXTI_IMR_IM11 EXTI_IMR_MR11\n#define  EXTI_IMR_IM12 EXTI_IMR_MR12\n#define  EXTI_IMR_IM13 EXTI_IMR_MR13\n#define  EXTI_IMR_IM14 EXTI_IMR_MR14\n#define  EXTI_IMR_IM15 EXTI_IMR_MR15\n#define  EXTI_IMR_IM16 EXTI_IMR_MR16\n#define  EXTI_IMR_IM17 EXTI_IMR_MR17\n#define  EXTI_IMR_IM18 EXTI_IMR_MR18\n#define  EXTI_IMR_IM   0x0007FFFFU        /*!< Interrupt Mask All */\n \n/*******************  Bit definition for EXTI_EMR register  *******************/\n#define EXTI_EMR_MR0_Pos                    (0U)                               \n#define EXTI_EMR_MR0_Msk                    (0x1UL << EXTI_EMR_MR0_Pos)         /*!< 0x00000001 */\n#define EXTI_EMR_MR0                        EXTI_EMR_MR0_Msk                   /*!< Event Mask on line 0 */\n#define EXTI_EMR_MR1_Pos                    (1U)                               \n#define EXTI_EMR_MR1_Msk                    (0x1UL << EXTI_EMR_MR1_Pos)         /*!< 0x00000002 */\n#define EXTI_EMR_MR1                        EXTI_EMR_MR1_Msk                   /*!< Event Mask on line 1 */\n#define EXTI_EMR_MR2_Pos                    (2U)                               \n#define EXTI_EMR_MR2_Msk                    (0x1UL << EXTI_EMR_MR2_Pos)         /*!< 0x00000004 */\n#define EXTI_EMR_MR2                        EXTI_EMR_MR2_Msk                   /*!< Event Mask on line 2 */\n#define EXTI_EMR_MR3_Pos                    (3U)                               \n#define EXTI_EMR_MR3_Msk                    (0x1UL << EXTI_EMR_MR3_Pos)         /*!< 0x00000008 */\n#define EXTI_EMR_MR3                        EXTI_EMR_MR3_Msk                   /*!< Event Mask on line 3 */\n#define EXTI_EMR_MR4_Pos                    (4U)                               \n#define EXTI_EMR_MR4_Msk                    (0x1UL << EXTI_EMR_MR4_Pos)         /*!< 0x00000010 */\n#define EXTI_EMR_MR4                        EXTI_EMR_MR4_Msk                   /*!< Event Mask on line 4 */\n#define EXTI_EMR_MR5_Pos                    (5U)                               \n#define EXTI_EMR_MR5_Msk                    (0x1UL << EXTI_EMR_MR5_Pos)         /*!< 0x00000020 */\n#define EXTI_EMR_MR5                        EXTI_EMR_MR5_Msk                   /*!< Event Mask on line 5 */\n#define EXTI_EMR_MR6_Pos                    (6U)                               \n#define EXTI_EMR_MR6_Msk                    (0x1UL << EXTI_EMR_MR6_Pos)         /*!< 0x00000040 */\n#define EXTI_EMR_MR6                        EXTI_EMR_MR6_Msk                   /*!< Event Mask on line 6 */\n#define EXTI_EMR_MR7_Pos                    (7U)                               \n#define EXTI_EMR_MR7_Msk                    (0x1UL << EXTI_EMR_MR7_Pos)         /*!< 0x00000080 */\n#define EXTI_EMR_MR7                        EXTI_EMR_MR7_Msk                   /*!< Event Mask on line 7 */\n#define EXTI_EMR_MR8_Pos                    (8U)                               \n#define EXTI_EMR_MR8_Msk                    (0x1UL << EXTI_EMR_MR8_Pos)         /*!< 0x00000100 */\n#define EXTI_EMR_MR8                        EXTI_EMR_MR8_Msk                   /*!< Event Mask on line 8 */\n#define EXTI_EMR_MR9_Pos                    (9U)                               \n#define EXTI_EMR_MR9_Msk                    (0x1UL << EXTI_EMR_MR9_Pos)         /*!< 0x00000200 */\n#define EXTI_EMR_MR9                        EXTI_EMR_MR9_Msk                   /*!< Event Mask on line 9 */\n#define EXTI_EMR_MR10_Pos                   (10U)                              \n#define EXTI_EMR_MR10_Msk                   (0x1UL << EXTI_EMR_MR10_Pos)        /*!< 0x00000400 */\n#define EXTI_EMR_MR10                       EXTI_EMR_MR10_Msk                  /*!< Event Mask on line 10 */\n#define EXTI_EMR_MR11_Pos                   (11U)                              \n#define EXTI_EMR_MR11_Msk                   (0x1UL << EXTI_EMR_MR11_Pos)        /*!< 0x00000800 */\n#define EXTI_EMR_MR11                       EXTI_EMR_MR11_Msk                  /*!< Event Mask on line 11 */\n#define EXTI_EMR_MR12_Pos                   (12U)                              \n#define EXTI_EMR_MR12_Msk                   (0x1UL << EXTI_EMR_MR12_Pos)        /*!< 0x00001000 */\n#define EXTI_EMR_MR12                       EXTI_EMR_MR12_Msk                  /*!< Event Mask on line 12 */\n#define EXTI_EMR_MR13_Pos                   (13U)                              \n#define EXTI_EMR_MR13_Msk                   (0x1UL << EXTI_EMR_MR13_Pos)        /*!< 0x00002000 */\n#define EXTI_EMR_MR13                       EXTI_EMR_MR13_Msk                  /*!< Event Mask on line 13 */\n#define EXTI_EMR_MR14_Pos                   (14U)                              \n#define EXTI_EMR_MR14_Msk                   (0x1UL << EXTI_EMR_MR14_Pos)        /*!< 0x00004000 */\n#define EXTI_EMR_MR14                       EXTI_EMR_MR14_Msk                  /*!< Event Mask on line 14 */\n#define EXTI_EMR_MR15_Pos                   (15U)                              \n#define EXTI_EMR_MR15_Msk                   (0x1UL << EXTI_EMR_MR15_Pos)        /*!< 0x00008000 */\n#define EXTI_EMR_MR15                       EXTI_EMR_MR15_Msk                  /*!< Event Mask on line 15 */\n#define EXTI_EMR_MR16_Pos                   (16U)                              \n#define EXTI_EMR_MR16_Msk                   (0x1UL << EXTI_EMR_MR16_Pos)        /*!< 0x00010000 */\n#define EXTI_EMR_MR16                       EXTI_EMR_MR16_Msk                  /*!< Event Mask on line 16 */\n#define EXTI_EMR_MR17_Pos                   (17U)                              \n#define EXTI_EMR_MR17_Msk                   (0x1UL << EXTI_EMR_MR17_Pos)        /*!< 0x00020000 */\n#define EXTI_EMR_MR17                       EXTI_EMR_MR17_Msk                  /*!< Event Mask on line 17 */\n#define EXTI_EMR_MR18_Pos                   (18U)                              \n#define EXTI_EMR_MR18_Msk                   (0x1UL << EXTI_EMR_MR18_Pos)        /*!< 0x00040000 */\n#define EXTI_EMR_MR18                       EXTI_EMR_MR18_Msk                  /*!< Event Mask on line 18 */\n\n/* References Defines */\n#define  EXTI_EMR_EM0 EXTI_EMR_MR0\n#define  EXTI_EMR_EM1 EXTI_EMR_MR1\n#define  EXTI_EMR_EM2 EXTI_EMR_MR2\n#define  EXTI_EMR_EM3 EXTI_EMR_MR3\n#define  EXTI_EMR_EM4 EXTI_EMR_MR4\n#define  EXTI_EMR_EM5 EXTI_EMR_MR5\n#define  EXTI_EMR_EM6 EXTI_EMR_MR6\n#define  EXTI_EMR_EM7 EXTI_EMR_MR7\n#define  EXTI_EMR_EM8 EXTI_EMR_MR8\n#define  EXTI_EMR_EM9 EXTI_EMR_MR9\n#define  EXTI_EMR_EM10 EXTI_EMR_MR10\n#define  EXTI_EMR_EM11 EXTI_EMR_MR11\n#define  EXTI_EMR_EM12 EXTI_EMR_MR12\n#define  EXTI_EMR_EM13 EXTI_EMR_MR13\n#define  EXTI_EMR_EM14 EXTI_EMR_MR14\n#define  EXTI_EMR_EM15 EXTI_EMR_MR15\n#define  EXTI_EMR_EM16 EXTI_EMR_MR16\n#define  EXTI_EMR_EM17 EXTI_EMR_MR17\n#define  EXTI_EMR_EM18 EXTI_EMR_MR18\n\n/******************  Bit definition for EXTI_RTSR register  *******************/\n#define EXTI_RTSR_TR0_Pos                   (0U)                               \n#define EXTI_RTSR_TR0_Msk                   (0x1UL << EXTI_RTSR_TR0_Pos)        /*!< 0x00000001 */\n#define EXTI_RTSR_TR0                       EXTI_RTSR_TR0_Msk                  /*!< Rising trigger event configuration bit of line 0 */\n#define EXTI_RTSR_TR1_Pos                   (1U)                               \n#define EXTI_RTSR_TR1_Msk                   (0x1UL << EXTI_RTSR_TR1_Pos)        /*!< 0x00000002 */\n#define EXTI_RTSR_TR1                       EXTI_RTSR_TR1_Msk                  /*!< Rising trigger event configuration bit of line 1 */\n#define EXTI_RTSR_TR2_Pos                   (2U)                               \n#define EXTI_RTSR_TR2_Msk                   (0x1UL << EXTI_RTSR_TR2_Pos)        /*!< 0x00000004 */\n#define EXTI_RTSR_TR2                       EXTI_RTSR_TR2_Msk                  /*!< Rising trigger event configuration bit of line 2 */\n#define EXTI_RTSR_TR3_Pos                   (3U)                               \n#define EXTI_RTSR_TR3_Msk                   (0x1UL << EXTI_RTSR_TR3_Pos)        /*!< 0x00000008 */\n#define EXTI_RTSR_TR3                       EXTI_RTSR_TR3_Msk                  /*!< Rising trigger event configuration bit of line 3 */\n#define EXTI_RTSR_TR4_Pos                   (4U)                               \n#define EXTI_RTSR_TR4_Msk                   (0x1UL << EXTI_RTSR_TR4_Pos)        /*!< 0x00000010 */\n#define EXTI_RTSR_TR4                       EXTI_RTSR_TR4_Msk                  /*!< Rising trigger event configuration bit of line 4 */\n#define EXTI_RTSR_TR5_Pos                   (5U)                               \n#define EXTI_RTSR_TR5_Msk                   (0x1UL << EXTI_RTSR_TR5_Pos)        /*!< 0x00000020 */\n#define EXTI_RTSR_TR5                       EXTI_RTSR_TR5_Msk                  /*!< Rising trigger event configuration bit of line 5 */\n#define EXTI_RTSR_TR6_Pos                   (6U)                               \n#define EXTI_RTSR_TR6_Msk                   (0x1UL << EXTI_RTSR_TR6_Pos)        /*!< 0x00000040 */\n#define EXTI_RTSR_TR6                       EXTI_RTSR_TR6_Msk                  /*!< Rising trigger event configuration bit of line 6 */\n#define EXTI_RTSR_TR7_Pos                   (7U)                               \n#define EXTI_RTSR_TR7_Msk                   (0x1UL << EXTI_RTSR_TR7_Pos)        /*!< 0x00000080 */\n#define EXTI_RTSR_TR7                       EXTI_RTSR_TR7_Msk                  /*!< Rising trigger event configuration bit of line 7 */\n#define EXTI_RTSR_TR8_Pos                   (8U)                               \n#define EXTI_RTSR_TR8_Msk                   (0x1UL << EXTI_RTSR_TR8_Pos)        /*!< 0x00000100 */\n#define EXTI_RTSR_TR8                       EXTI_RTSR_TR8_Msk                  /*!< Rising trigger event configuration bit of line 8 */\n#define EXTI_RTSR_TR9_Pos                   (9U)                               \n#define EXTI_RTSR_TR9_Msk                   (0x1UL << EXTI_RTSR_TR9_Pos)        /*!< 0x00000200 */\n#define EXTI_RTSR_TR9                       EXTI_RTSR_TR9_Msk                  /*!< Rising trigger event configuration bit of line 9 */\n#define EXTI_RTSR_TR10_Pos                  (10U)                              \n#define EXTI_RTSR_TR10_Msk                  (0x1UL << EXTI_RTSR_TR10_Pos)       /*!< 0x00000400 */\n#define EXTI_RTSR_TR10                      EXTI_RTSR_TR10_Msk                 /*!< Rising trigger event configuration bit of line 10 */\n#define EXTI_RTSR_TR11_Pos                  (11U)                              \n#define EXTI_RTSR_TR11_Msk                  (0x1UL << EXTI_RTSR_TR11_Pos)       /*!< 0x00000800 */\n#define EXTI_RTSR_TR11                      EXTI_RTSR_TR11_Msk                 /*!< Rising trigger event configuration bit of line 11 */\n#define EXTI_RTSR_TR12_Pos                  (12U)                              \n#define EXTI_RTSR_TR12_Msk                  (0x1UL << EXTI_RTSR_TR12_Pos)       /*!< 0x00001000 */\n#define EXTI_RTSR_TR12                      EXTI_RTSR_TR12_Msk                 /*!< Rising trigger event configuration bit of line 12 */\n#define EXTI_RTSR_TR13_Pos                  (13U)                              \n#define EXTI_RTSR_TR13_Msk                  (0x1UL << EXTI_RTSR_TR13_Pos)       /*!< 0x00002000 */\n#define EXTI_RTSR_TR13                      EXTI_RTSR_TR13_Msk                 /*!< Rising trigger event configuration bit of line 13 */\n#define EXTI_RTSR_TR14_Pos                  (14U)                              \n#define EXTI_RTSR_TR14_Msk                  (0x1UL << EXTI_RTSR_TR14_Pos)       /*!< 0x00004000 */\n#define EXTI_RTSR_TR14                      EXTI_RTSR_TR14_Msk                 /*!< Rising trigger event configuration bit of line 14 */\n#define EXTI_RTSR_TR15_Pos                  (15U)                              \n#define EXTI_RTSR_TR15_Msk                  (0x1UL << EXTI_RTSR_TR15_Pos)       /*!< 0x00008000 */\n#define EXTI_RTSR_TR15                      EXTI_RTSR_TR15_Msk                 /*!< Rising trigger event configuration bit of line 15 */\n#define EXTI_RTSR_TR16_Pos                  (16U)                              \n#define EXTI_RTSR_TR16_Msk                  (0x1UL << EXTI_RTSR_TR16_Pos)       /*!< 0x00010000 */\n#define EXTI_RTSR_TR16                      EXTI_RTSR_TR16_Msk                 /*!< Rising trigger event configuration bit of line 16 */\n#define EXTI_RTSR_TR17_Pos                  (17U)                              \n#define EXTI_RTSR_TR17_Msk                  (0x1UL << EXTI_RTSR_TR17_Pos)       /*!< 0x00020000 */\n#define EXTI_RTSR_TR17                      EXTI_RTSR_TR17_Msk                 /*!< Rising trigger event configuration bit of line 17 */\n#define EXTI_RTSR_TR18_Pos                  (18U)                              \n#define EXTI_RTSR_TR18_Msk                  (0x1UL << EXTI_RTSR_TR18_Pos)       /*!< 0x00040000 */\n#define EXTI_RTSR_TR18                      EXTI_RTSR_TR18_Msk                 /*!< Rising trigger event configuration bit of line 18 */\n\n/* References Defines */\n#define  EXTI_RTSR_RT0 EXTI_RTSR_TR0\n#define  EXTI_RTSR_RT1 EXTI_RTSR_TR1\n#define  EXTI_RTSR_RT2 EXTI_RTSR_TR2\n#define  EXTI_RTSR_RT3 EXTI_RTSR_TR3\n#define  EXTI_RTSR_RT4 EXTI_RTSR_TR4\n#define  EXTI_RTSR_RT5 EXTI_RTSR_TR5\n#define  EXTI_RTSR_RT6 EXTI_RTSR_TR6\n#define  EXTI_RTSR_RT7 EXTI_RTSR_TR7\n#define  EXTI_RTSR_RT8 EXTI_RTSR_TR8\n#define  EXTI_RTSR_RT9 EXTI_RTSR_TR9\n#define  EXTI_RTSR_RT10 EXTI_RTSR_TR10\n#define  EXTI_RTSR_RT11 EXTI_RTSR_TR11\n#define  EXTI_RTSR_RT12 EXTI_RTSR_TR12\n#define  EXTI_RTSR_RT13 EXTI_RTSR_TR13\n#define  EXTI_RTSR_RT14 EXTI_RTSR_TR14\n#define  EXTI_RTSR_RT15 EXTI_RTSR_TR15\n#define  EXTI_RTSR_RT16 EXTI_RTSR_TR16\n#define  EXTI_RTSR_RT17 EXTI_RTSR_TR17\n#define  EXTI_RTSR_RT18 EXTI_RTSR_TR18\n\n/******************  Bit definition for EXTI_FTSR register  *******************/\n#define EXTI_FTSR_TR0_Pos                   (0U)                               \n#define EXTI_FTSR_TR0_Msk                   (0x1UL << EXTI_FTSR_TR0_Pos)        /*!< 0x00000001 */\n#define EXTI_FTSR_TR0                       EXTI_FTSR_TR0_Msk                  /*!< Falling trigger event configuration bit of line 0 */\n#define EXTI_FTSR_TR1_Pos                   (1U)                               \n#define EXTI_FTSR_TR1_Msk                   (0x1UL << EXTI_FTSR_TR1_Pos)        /*!< 0x00000002 */\n#define EXTI_FTSR_TR1                       EXTI_FTSR_TR1_Msk                  /*!< Falling trigger event configuration bit of line 1 */\n#define EXTI_FTSR_TR2_Pos                   (2U)                               \n#define EXTI_FTSR_TR2_Msk                   (0x1UL << EXTI_FTSR_TR2_Pos)        /*!< 0x00000004 */\n#define EXTI_FTSR_TR2                       EXTI_FTSR_TR2_Msk                  /*!< Falling trigger event configuration bit of line 2 */\n#define EXTI_FTSR_TR3_Pos                   (3U)                               \n#define EXTI_FTSR_TR3_Msk                   (0x1UL << EXTI_FTSR_TR3_Pos)        /*!< 0x00000008 */\n#define EXTI_FTSR_TR3                       EXTI_FTSR_TR3_Msk                  /*!< Falling trigger event configuration bit of line 3 */\n#define EXTI_FTSR_TR4_Pos                   (4U)                               \n#define EXTI_FTSR_TR4_Msk                   (0x1UL << EXTI_FTSR_TR4_Pos)        /*!< 0x00000010 */\n#define EXTI_FTSR_TR4                       EXTI_FTSR_TR4_Msk                  /*!< Falling trigger event configuration bit of line 4 */\n#define EXTI_FTSR_TR5_Pos                   (5U)                               \n#define EXTI_FTSR_TR5_Msk                   (0x1UL << EXTI_FTSR_TR5_Pos)        /*!< 0x00000020 */\n#define EXTI_FTSR_TR5                       EXTI_FTSR_TR5_Msk                  /*!< Falling trigger event configuration bit of line 5 */\n#define EXTI_FTSR_TR6_Pos                   (6U)                               \n#define EXTI_FTSR_TR6_Msk                   (0x1UL << EXTI_FTSR_TR6_Pos)        /*!< 0x00000040 */\n#define EXTI_FTSR_TR6                       EXTI_FTSR_TR6_Msk                  /*!< Falling trigger event configuration bit of line 6 */\n#define EXTI_FTSR_TR7_Pos                   (7U)                               \n#define EXTI_FTSR_TR7_Msk                   (0x1UL << EXTI_FTSR_TR7_Pos)        /*!< 0x00000080 */\n#define EXTI_FTSR_TR7                       EXTI_FTSR_TR7_Msk                  /*!< Falling trigger event configuration bit of line 7 */\n#define EXTI_FTSR_TR8_Pos                   (8U)                               \n#define EXTI_FTSR_TR8_Msk                   (0x1UL << EXTI_FTSR_TR8_Pos)        /*!< 0x00000100 */\n#define EXTI_FTSR_TR8                       EXTI_FTSR_TR8_Msk                  /*!< Falling trigger event configuration bit of line 8 */\n#define EXTI_FTSR_TR9_Pos                   (9U)                               \n#define EXTI_FTSR_TR9_Msk                   (0x1UL << EXTI_FTSR_TR9_Pos)        /*!< 0x00000200 */\n#define EXTI_FTSR_TR9                       EXTI_FTSR_TR9_Msk                  /*!< Falling trigger event configuration bit of line 9 */\n#define EXTI_FTSR_TR10_Pos                  (10U)                              \n#define EXTI_FTSR_TR10_Msk                  (0x1UL << EXTI_FTSR_TR10_Pos)       /*!< 0x00000400 */\n#define EXTI_FTSR_TR10                      EXTI_FTSR_TR10_Msk                 /*!< Falling trigger event configuration bit of line 10 */\n#define EXTI_FTSR_TR11_Pos                  (11U)                              \n#define EXTI_FTSR_TR11_Msk                  (0x1UL << EXTI_FTSR_TR11_Pos)       /*!< 0x00000800 */\n#define EXTI_FTSR_TR11                      EXTI_FTSR_TR11_Msk                 /*!< Falling trigger event configuration bit of line 11 */\n#define EXTI_FTSR_TR12_Pos                  (12U)                              \n#define EXTI_FTSR_TR12_Msk                  (0x1UL << EXTI_FTSR_TR12_Pos)       /*!< 0x00001000 */\n#define EXTI_FTSR_TR12                      EXTI_FTSR_TR12_Msk                 /*!< Falling trigger event configuration bit of line 12 */\n#define EXTI_FTSR_TR13_Pos                  (13U)                              \n#define EXTI_FTSR_TR13_Msk                  (0x1UL << EXTI_FTSR_TR13_Pos)       /*!< 0x00002000 */\n#define EXTI_FTSR_TR13                      EXTI_FTSR_TR13_Msk                 /*!< Falling trigger event configuration bit of line 13 */\n#define EXTI_FTSR_TR14_Pos                  (14U)                              \n#define EXTI_FTSR_TR14_Msk                  (0x1UL << EXTI_FTSR_TR14_Pos)       /*!< 0x00004000 */\n#define EXTI_FTSR_TR14                      EXTI_FTSR_TR14_Msk                 /*!< Falling trigger event configuration bit of line 14 */\n#define EXTI_FTSR_TR15_Pos                  (15U)                              \n#define EXTI_FTSR_TR15_Msk                  (0x1UL << EXTI_FTSR_TR15_Pos)       /*!< 0x00008000 */\n#define EXTI_FTSR_TR15                      EXTI_FTSR_TR15_Msk                 /*!< Falling trigger event configuration bit of line 15 */\n#define EXTI_FTSR_TR16_Pos                  (16U)                              \n#define EXTI_FTSR_TR16_Msk                  (0x1UL << EXTI_FTSR_TR16_Pos)       /*!< 0x00010000 */\n#define EXTI_FTSR_TR16                      EXTI_FTSR_TR16_Msk                 /*!< Falling trigger event configuration bit of line 16 */\n#define EXTI_FTSR_TR17_Pos                  (17U)                              \n#define EXTI_FTSR_TR17_Msk                  (0x1UL << EXTI_FTSR_TR17_Pos)       /*!< 0x00020000 */\n#define EXTI_FTSR_TR17                      EXTI_FTSR_TR17_Msk                 /*!< Falling trigger event configuration bit of line 17 */\n#define EXTI_FTSR_TR18_Pos                  (18U)                              \n#define EXTI_FTSR_TR18_Msk                  (0x1UL << EXTI_FTSR_TR18_Pos)       /*!< 0x00040000 */\n#define EXTI_FTSR_TR18                      EXTI_FTSR_TR18_Msk                 /*!< Falling trigger event configuration bit of line 18 */\n\n/* References Defines */\n#define  EXTI_FTSR_FT0 EXTI_FTSR_TR0\n#define  EXTI_FTSR_FT1 EXTI_FTSR_TR1\n#define  EXTI_FTSR_FT2 EXTI_FTSR_TR2\n#define  EXTI_FTSR_FT3 EXTI_FTSR_TR3\n#define  EXTI_FTSR_FT4 EXTI_FTSR_TR4\n#define  EXTI_FTSR_FT5 EXTI_FTSR_TR5\n#define  EXTI_FTSR_FT6 EXTI_FTSR_TR6\n#define  EXTI_FTSR_FT7 EXTI_FTSR_TR7\n#define  EXTI_FTSR_FT8 EXTI_FTSR_TR8\n#define  EXTI_FTSR_FT9 EXTI_FTSR_TR9\n#define  EXTI_FTSR_FT10 EXTI_FTSR_TR10\n#define  EXTI_FTSR_FT11 EXTI_FTSR_TR11\n#define  EXTI_FTSR_FT12 EXTI_FTSR_TR12\n#define  EXTI_FTSR_FT13 EXTI_FTSR_TR13\n#define  EXTI_FTSR_FT14 EXTI_FTSR_TR14\n#define  EXTI_FTSR_FT15 EXTI_FTSR_TR15\n#define  EXTI_FTSR_FT16 EXTI_FTSR_TR16\n#define  EXTI_FTSR_FT17 EXTI_FTSR_TR17\n#define  EXTI_FTSR_FT18 EXTI_FTSR_TR18\n\n/******************  Bit definition for EXTI_SWIER register  ******************/\n#define EXTI_SWIER_SWIER0_Pos               (0U)                               \n#define EXTI_SWIER_SWIER0_Msk               (0x1UL << EXTI_SWIER_SWIER0_Pos)    /*!< 0x00000001 */\n#define EXTI_SWIER_SWIER0                   EXTI_SWIER_SWIER0_Msk              /*!< Software Interrupt on line 0 */\n#define EXTI_SWIER_SWIER1_Pos               (1U)                               \n#define EXTI_SWIER_SWIER1_Msk               (0x1UL << EXTI_SWIER_SWIER1_Pos)    /*!< 0x00000002 */\n#define EXTI_SWIER_SWIER1                   EXTI_SWIER_SWIER1_Msk              /*!< Software Interrupt on line 1 */\n#define EXTI_SWIER_SWIER2_Pos               (2U)                               \n#define EXTI_SWIER_SWIER2_Msk               (0x1UL << EXTI_SWIER_SWIER2_Pos)    /*!< 0x00000004 */\n#define EXTI_SWIER_SWIER2                   EXTI_SWIER_SWIER2_Msk              /*!< Software Interrupt on line 2 */\n#define EXTI_SWIER_SWIER3_Pos               (3U)                               \n#define EXTI_SWIER_SWIER3_Msk               (0x1UL << EXTI_SWIER_SWIER3_Pos)    /*!< 0x00000008 */\n#define EXTI_SWIER_SWIER3                   EXTI_SWIER_SWIER3_Msk              /*!< Software Interrupt on line 3 */\n#define EXTI_SWIER_SWIER4_Pos               (4U)                               \n#define EXTI_SWIER_SWIER4_Msk               (0x1UL << EXTI_SWIER_SWIER4_Pos)    /*!< 0x00000010 */\n#define EXTI_SWIER_SWIER4                   EXTI_SWIER_SWIER4_Msk              /*!< Software Interrupt on line 4 */\n#define EXTI_SWIER_SWIER5_Pos               (5U)                               \n#define EXTI_SWIER_SWIER5_Msk               (0x1UL << EXTI_SWIER_SWIER5_Pos)    /*!< 0x00000020 */\n#define EXTI_SWIER_SWIER5                   EXTI_SWIER_SWIER5_Msk              /*!< Software Interrupt on line 5 */\n#define EXTI_SWIER_SWIER6_Pos               (6U)                               \n#define EXTI_SWIER_SWIER6_Msk               (0x1UL << EXTI_SWIER_SWIER6_Pos)    /*!< 0x00000040 */\n#define EXTI_SWIER_SWIER6                   EXTI_SWIER_SWIER6_Msk              /*!< Software Interrupt on line 6 */\n#define EXTI_SWIER_SWIER7_Pos               (7U)                               \n#define EXTI_SWIER_SWIER7_Msk               (0x1UL << EXTI_SWIER_SWIER7_Pos)    /*!< 0x00000080 */\n#define EXTI_SWIER_SWIER7                   EXTI_SWIER_SWIER7_Msk              /*!< Software Interrupt on line 7 */\n#define EXTI_SWIER_SWIER8_Pos               (8U)                               \n#define EXTI_SWIER_SWIER8_Msk               (0x1UL << EXTI_SWIER_SWIER8_Pos)    /*!< 0x00000100 */\n#define EXTI_SWIER_SWIER8                   EXTI_SWIER_SWIER8_Msk              /*!< Software Interrupt on line 8 */\n#define EXTI_SWIER_SWIER9_Pos               (9U)                               \n#define EXTI_SWIER_SWIER9_Msk               (0x1UL << EXTI_SWIER_SWIER9_Pos)    /*!< 0x00000200 */\n#define EXTI_SWIER_SWIER9                   EXTI_SWIER_SWIER9_Msk              /*!< Software Interrupt on line 9 */\n#define EXTI_SWIER_SWIER10_Pos              (10U)                              \n#define EXTI_SWIER_SWIER10_Msk              (0x1UL << EXTI_SWIER_SWIER10_Pos)   /*!< 0x00000400 */\n#define EXTI_SWIER_SWIER10                  EXTI_SWIER_SWIER10_Msk             /*!< Software Interrupt on line 10 */\n#define EXTI_SWIER_SWIER11_Pos              (11U)                              \n#define EXTI_SWIER_SWIER11_Msk              (0x1UL << EXTI_SWIER_SWIER11_Pos)   /*!< 0x00000800 */\n#define EXTI_SWIER_SWIER11                  EXTI_SWIER_SWIER11_Msk             /*!< Software Interrupt on line 11 */\n#define EXTI_SWIER_SWIER12_Pos              (12U)                              \n#define EXTI_SWIER_SWIER12_Msk              (0x1UL << EXTI_SWIER_SWIER12_Pos)   /*!< 0x00001000 */\n#define EXTI_SWIER_SWIER12                  EXTI_SWIER_SWIER12_Msk             /*!< Software Interrupt on line 12 */\n#define EXTI_SWIER_SWIER13_Pos              (13U)                              \n#define EXTI_SWIER_SWIER13_Msk              (0x1UL << EXTI_SWIER_SWIER13_Pos)   /*!< 0x00002000 */\n#define EXTI_SWIER_SWIER13                  EXTI_SWIER_SWIER13_Msk             /*!< Software Interrupt on line 13 */\n#define EXTI_SWIER_SWIER14_Pos              (14U)                              \n#define EXTI_SWIER_SWIER14_Msk              (0x1UL << EXTI_SWIER_SWIER14_Pos)   /*!< 0x00004000 */\n#define EXTI_SWIER_SWIER14                  EXTI_SWIER_SWIER14_Msk             /*!< Software Interrupt on line 14 */\n#define EXTI_SWIER_SWIER15_Pos              (15U)                              \n#define EXTI_SWIER_SWIER15_Msk              (0x1UL << EXTI_SWIER_SWIER15_Pos)   /*!< 0x00008000 */\n#define EXTI_SWIER_SWIER15                  EXTI_SWIER_SWIER15_Msk             /*!< Software Interrupt on line 15 */\n#define EXTI_SWIER_SWIER16_Pos              (16U)                              \n#define EXTI_SWIER_SWIER16_Msk              (0x1UL << EXTI_SWIER_SWIER16_Pos)   /*!< 0x00010000 */\n#define EXTI_SWIER_SWIER16                  EXTI_SWIER_SWIER16_Msk             /*!< Software Interrupt on line 16 */\n#define EXTI_SWIER_SWIER17_Pos              (17U)                              \n#define EXTI_SWIER_SWIER17_Msk              (0x1UL << EXTI_SWIER_SWIER17_Pos)   /*!< 0x00020000 */\n#define EXTI_SWIER_SWIER17                  EXTI_SWIER_SWIER17_Msk             /*!< Software Interrupt on line 17 */\n#define EXTI_SWIER_SWIER18_Pos              (18U)                              \n#define EXTI_SWIER_SWIER18_Msk              (0x1UL << EXTI_SWIER_SWIER18_Pos)   /*!< 0x00040000 */\n#define EXTI_SWIER_SWIER18                  EXTI_SWIER_SWIER18_Msk             /*!< Software Interrupt on line 18 */\n\n/* References Defines */\n#define  EXTI_SWIER_SWI0 EXTI_SWIER_SWIER0\n#define  EXTI_SWIER_SWI1 EXTI_SWIER_SWIER1\n#define  EXTI_SWIER_SWI2 EXTI_SWIER_SWIER2\n#define  EXTI_SWIER_SWI3 EXTI_SWIER_SWIER3\n#define  EXTI_SWIER_SWI4 EXTI_SWIER_SWIER4\n#define  EXTI_SWIER_SWI5 EXTI_SWIER_SWIER5\n#define  EXTI_SWIER_SWI6 EXTI_SWIER_SWIER6\n#define  EXTI_SWIER_SWI7 EXTI_SWIER_SWIER7\n#define  EXTI_SWIER_SWI8 EXTI_SWIER_SWIER8\n#define  EXTI_SWIER_SWI9 EXTI_SWIER_SWIER9\n#define  EXTI_SWIER_SWI10 EXTI_SWIER_SWIER10\n#define  EXTI_SWIER_SWI11 EXTI_SWIER_SWIER11\n#define  EXTI_SWIER_SWI12 EXTI_SWIER_SWIER12\n#define  EXTI_SWIER_SWI13 EXTI_SWIER_SWIER13\n#define  EXTI_SWIER_SWI14 EXTI_SWIER_SWIER14\n#define  EXTI_SWIER_SWI15 EXTI_SWIER_SWIER15\n#define  EXTI_SWIER_SWI16 EXTI_SWIER_SWIER16\n#define  EXTI_SWIER_SWI17 EXTI_SWIER_SWIER17\n#define  EXTI_SWIER_SWI18 EXTI_SWIER_SWIER18\n\n/*******************  Bit definition for EXTI_PR register  ********************/\n#define EXTI_PR_PR0_Pos                     (0U)                               \n#define EXTI_PR_PR0_Msk                     (0x1UL << EXTI_PR_PR0_Pos)          /*!< 0x00000001 */\n#define EXTI_PR_PR0                         EXTI_PR_PR0_Msk                    /*!< Pending bit for line 0 */\n#define EXTI_PR_PR1_Pos                     (1U)                               \n#define EXTI_PR_PR1_Msk                     (0x1UL << EXTI_PR_PR1_Pos)          /*!< 0x00000002 */\n#define EXTI_PR_PR1                         EXTI_PR_PR1_Msk                    /*!< Pending bit for line 1 */\n#define EXTI_PR_PR2_Pos                     (2U)                               \n#define EXTI_PR_PR2_Msk                     (0x1UL << EXTI_PR_PR2_Pos)          /*!< 0x00000004 */\n#define EXTI_PR_PR2                         EXTI_PR_PR2_Msk                    /*!< Pending bit for line 2 */\n#define EXTI_PR_PR3_Pos                     (3U)                               \n#define EXTI_PR_PR3_Msk                     (0x1UL << EXTI_PR_PR3_Pos)          /*!< 0x00000008 */\n#define EXTI_PR_PR3                         EXTI_PR_PR3_Msk                    /*!< Pending bit for line 3 */\n#define EXTI_PR_PR4_Pos                     (4U)                               \n#define EXTI_PR_PR4_Msk                     (0x1UL << EXTI_PR_PR4_Pos)          /*!< 0x00000010 */\n#define EXTI_PR_PR4                         EXTI_PR_PR4_Msk                    /*!< Pending bit for line 4 */\n#define EXTI_PR_PR5_Pos                     (5U)                               \n#define EXTI_PR_PR5_Msk                     (0x1UL << EXTI_PR_PR5_Pos)          /*!< 0x00000020 */\n#define EXTI_PR_PR5                         EXTI_PR_PR5_Msk                    /*!< Pending bit for line 5 */\n#define EXTI_PR_PR6_Pos                     (6U)                               \n#define EXTI_PR_PR6_Msk                     (0x1UL << EXTI_PR_PR6_Pos)          /*!< 0x00000040 */\n#define EXTI_PR_PR6                         EXTI_PR_PR6_Msk                    /*!< Pending bit for line 6 */\n#define EXTI_PR_PR7_Pos                     (7U)                               \n#define EXTI_PR_PR7_Msk                     (0x1UL << EXTI_PR_PR7_Pos)          /*!< 0x00000080 */\n#define EXTI_PR_PR7                         EXTI_PR_PR7_Msk                    /*!< Pending bit for line 7 */\n#define EXTI_PR_PR8_Pos                     (8U)                               \n#define EXTI_PR_PR8_Msk                     (0x1UL << EXTI_PR_PR8_Pos)          /*!< 0x00000100 */\n#define EXTI_PR_PR8                         EXTI_PR_PR8_Msk                    /*!< Pending bit for line 8 */\n#define EXTI_PR_PR9_Pos                     (9U)                               \n#define EXTI_PR_PR9_Msk                     (0x1UL << EXTI_PR_PR9_Pos)          /*!< 0x00000200 */\n#define EXTI_PR_PR9                         EXTI_PR_PR9_Msk                    /*!< Pending bit for line 9 */\n#define EXTI_PR_PR10_Pos                    (10U)                              \n#define EXTI_PR_PR10_Msk                    (0x1UL << EXTI_PR_PR10_Pos)         /*!< 0x00000400 */\n#define EXTI_PR_PR10                        EXTI_PR_PR10_Msk                   /*!< Pending bit for line 10 */\n#define EXTI_PR_PR11_Pos                    (11U)                              \n#define EXTI_PR_PR11_Msk                    (0x1UL << EXTI_PR_PR11_Pos)         /*!< 0x00000800 */\n#define EXTI_PR_PR11                        EXTI_PR_PR11_Msk                   /*!< Pending bit for line 11 */\n#define EXTI_PR_PR12_Pos                    (12U)                              \n#define EXTI_PR_PR12_Msk                    (0x1UL << EXTI_PR_PR12_Pos)         /*!< 0x00001000 */\n#define EXTI_PR_PR12                        EXTI_PR_PR12_Msk                   /*!< Pending bit for line 12 */\n#define EXTI_PR_PR13_Pos                    (13U)                              \n#define EXTI_PR_PR13_Msk                    (0x1UL << EXTI_PR_PR13_Pos)         /*!< 0x00002000 */\n#define EXTI_PR_PR13                        EXTI_PR_PR13_Msk                   /*!< Pending bit for line 13 */\n#define EXTI_PR_PR14_Pos                    (14U)                              \n#define EXTI_PR_PR14_Msk                    (0x1UL << EXTI_PR_PR14_Pos)         /*!< 0x00004000 */\n#define EXTI_PR_PR14                        EXTI_PR_PR14_Msk                   /*!< Pending bit for line 14 */\n#define EXTI_PR_PR15_Pos                    (15U)                              \n#define EXTI_PR_PR15_Msk                    (0x1UL << EXTI_PR_PR15_Pos)         /*!< 0x00008000 */\n#define EXTI_PR_PR15                        EXTI_PR_PR15_Msk                   /*!< Pending bit for line 15 */\n#define EXTI_PR_PR16_Pos                    (16U)                              \n#define EXTI_PR_PR16_Msk                    (0x1UL << EXTI_PR_PR16_Pos)         /*!< 0x00010000 */\n#define EXTI_PR_PR16                        EXTI_PR_PR16_Msk                   /*!< Pending bit for line 16 */\n#define EXTI_PR_PR17_Pos                    (17U)                              \n#define EXTI_PR_PR17_Msk                    (0x1UL << EXTI_PR_PR17_Pos)         /*!< 0x00020000 */\n#define EXTI_PR_PR17                        EXTI_PR_PR17_Msk                   /*!< Pending bit for line 17 */\n#define EXTI_PR_PR18_Pos                    (18U)                              \n#define EXTI_PR_PR18_Msk                    (0x1UL << EXTI_PR_PR18_Pos)         /*!< 0x00040000 */\n#define EXTI_PR_PR18                        EXTI_PR_PR18_Msk                   /*!< Pending bit for line 18 */\n\n/* References Defines */\n#define  EXTI_PR_PIF0 EXTI_PR_PR0\n#define  EXTI_PR_PIF1 EXTI_PR_PR1\n#define  EXTI_PR_PIF2 EXTI_PR_PR2\n#define  EXTI_PR_PIF3 EXTI_PR_PR3\n#define  EXTI_PR_PIF4 EXTI_PR_PR4\n#define  EXTI_PR_PIF5 EXTI_PR_PR5\n#define  EXTI_PR_PIF6 EXTI_PR_PR6\n#define  EXTI_PR_PIF7 EXTI_PR_PR7\n#define  EXTI_PR_PIF8 EXTI_PR_PR8\n#define  EXTI_PR_PIF9 EXTI_PR_PR9\n#define  EXTI_PR_PIF10 EXTI_PR_PR10\n#define  EXTI_PR_PIF11 EXTI_PR_PR11\n#define  EXTI_PR_PIF12 EXTI_PR_PR12\n#define  EXTI_PR_PIF13 EXTI_PR_PR13\n#define  EXTI_PR_PIF14 EXTI_PR_PR14\n#define  EXTI_PR_PIF15 EXTI_PR_PR15\n#define  EXTI_PR_PIF16 EXTI_PR_PR16\n#define  EXTI_PR_PIF17 EXTI_PR_PR17\n#define  EXTI_PR_PIF18 EXTI_PR_PR18\n\n/******************************************************************************/\n/*                                                                            */\n/*                             DMA Controller                                 */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for DMA_ISR register  ********************/\n#define DMA_ISR_GIF1_Pos                    (0U)                               \n#define DMA_ISR_GIF1_Msk                    (0x1UL << DMA_ISR_GIF1_Pos)         /*!< 0x00000001 */\n#define DMA_ISR_GIF1                        DMA_ISR_GIF1_Msk                   /*!< Channel 1 Global interrupt flag */\n#define DMA_ISR_TCIF1_Pos                   (1U)                               \n#define DMA_ISR_TCIF1_Msk                   (0x1UL << DMA_ISR_TCIF1_Pos)        /*!< 0x00000002 */\n#define DMA_ISR_TCIF1                       DMA_ISR_TCIF1_Msk                  /*!< Channel 1 Transfer Complete flag */\n#define DMA_ISR_HTIF1_Pos                   (2U)                               \n#define DMA_ISR_HTIF1_Msk                   (0x1UL << DMA_ISR_HTIF1_Pos)        /*!< 0x00000004 */\n#define DMA_ISR_HTIF1                       DMA_ISR_HTIF1_Msk                  /*!< Channel 1 Half Transfer flag */\n#define DMA_ISR_TEIF1_Pos                   (3U)                               \n#define DMA_ISR_TEIF1_Msk                   (0x1UL << DMA_ISR_TEIF1_Pos)        /*!< 0x00000008 */\n#define DMA_ISR_TEIF1                       DMA_ISR_TEIF1_Msk                  /*!< Channel 1 Transfer Error flag */\n#define DMA_ISR_GIF2_Pos                    (4U)                               \n#define DMA_ISR_GIF2_Msk                    (0x1UL << DMA_ISR_GIF2_Pos)         /*!< 0x00000010 */\n#define DMA_ISR_GIF2                        DMA_ISR_GIF2_Msk                   /*!< Channel 2 Global interrupt flag */\n#define DMA_ISR_TCIF2_Pos                   (5U)                               \n#define DMA_ISR_TCIF2_Msk                   (0x1UL << DMA_ISR_TCIF2_Pos)        /*!< 0x00000020 */\n#define DMA_ISR_TCIF2                       DMA_ISR_TCIF2_Msk                  /*!< Channel 2 Transfer Complete flag */\n#define DMA_ISR_HTIF2_Pos                   (6U)                               \n#define DMA_ISR_HTIF2_Msk                   (0x1UL << DMA_ISR_HTIF2_Pos)        /*!< 0x00000040 */\n#define DMA_ISR_HTIF2                       DMA_ISR_HTIF2_Msk                  /*!< Channel 2 Half Transfer flag */\n#define DMA_ISR_TEIF2_Pos                   (7U)                               \n#define DMA_ISR_TEIF2_Msk                   (0x1UL << DMA_ISR_TEIF2_Pos)        /*!< 0x00000080 */\n#define DMA_ISR_TEIF2                       DMA_ISR_TEIF2_Msk                  /*!< Channel 2 Transfer Error flag */\n#define DMA_ISR_GIF3_Pos                    (8U)                               \n#define DMA_ISR_GIF3_Msk                    (0x1UL << DMA_ISR_GIF3_Pos)         /*!< 0x00000100 */\n#define DMA_ISR_GIF3                        DMA_ISR_GIF3_Msk                   /*!< Channel 3 Global interrupt flag */\n#define DMA_ISR_TCIF3_Pos                   (9U)                               \n#define DMA_ISR_TCIF3_Msk                   (0x1UL << DMA_ISR_TCIF3_Pos)        /*!< 0x00000200 */\n#define DMA_ISR_TCIF3                       DMA_ISR_TCIF3_Msk                  /*!< Channel 3 Transfer Complete flag */\n#define DMA_ISR_HTIF3_Pos                   (10U)                              \n#define DMA_ISR_HTIF3_Msk                   (0x1UL << DMA_ISR_HTIF3_Pos)        /*!< 0x00000400 */\n#define DMA_ISR_HTIF3                       DMA_ISR_HTIF3_Msk                  /*!< Channel 3 Half Transfer flag */\n#define DMA_ISR_TEIF3_Pos                   (11U)                              \n#define DMA_ISR_TEIF3_Msk                   (0x1UL << DMA_ISR_TEIF3_Pos)        /*!< 0x00000800 */\n#define DMA_ISR_TEIF3                       DMA_ISR_TEIF3_Msk                  /*!< Channel 3 Transfer Error flag */\n#define DMA_ISR_GIF4_Pos                    (12U)                              \n#define DMA_ISR_GIF4_Msk                    (0x1UL << DMA_ISR_GIF4_Pos)         /*!< 0x00001000 */\n#define DMA_ISR_GIF4                        DMA_ISR_GIF4_Msk                   /*!< Channel 4 Global interrupt flag */\n#define DMA_ISR_TCIF4_Pos                   (13U)                              \n#define DMA_ISR_TCIF4_Msk                   (0x1UL << DMA_ISR_TCIF4_Pos)        /*!< 0x00002000 */\n#define DMA_ISR_TCIF4                       DMA_ISR_TCIF4_Msk                  /*!< Channel 4 Transfer Complete flag */\n#define DMA_ISR_HTIF4_Pos                   (14U)                              \n#define DMA_ISR_HTIF4_Msk                   (0x1UL << DMA_ISR_HTIF4_Pos)        /*!< 0x00004000 */\n#define DMA_ISR_HTIF4                       DMA_ISR_HTIF4_Msk                  /*!< Channel 4 Half Transfer flag */\n#define DMA_ISR_TEIF4_Pos                   (15U)                              \n#define DMA_ISR_TEIF4_Msk                   (0x1UL << DMA_ISR_TEIF4_Pos)        /*!< 0x00008000 */\n#define DMA_ISR_TEIF4                       DMA_ISR_TEIF4_Msk                  /*!< Channel 4 Transfer Error flag */\n#define DMA_ISR_GIF5_Pos                    (16U)                              \n#define DMA_ISR_GIF5_Msk                    (0x1UL << DMA_ISR_GIF5_Pos)         /*!< 0x00010000 */\n#define DMA_ISR_GIF5                        DMA_ISR_GIF5_Msk                   /*!< Channel 5 Global interrupt flag */\n#define DMA_ISR_TCIF5_Pos                   (17U)                              \n#define DMA_ISR_TCIF5_Msk                   (0x1UL << DMA_ISR_TCIF5_Pos)        /*!< 0x00020000 */\n#define DMA_ISR_TCIF5                       DMA_ISR_TCIF5_Msk                  /*!< Channel 5 Transfer Complete flag */\n#define DMA_ISR_HTIF5_Pos                   (18U)                              \n#define DMA_ISR_HTIF5_Msk                   (0x1UL << DMA_ISR_HTIF5_Pos)        /*!< 0x00040000 */\n#define DMA_ISR_HTIF5                       DMA_ISR_HTIF5_Msk                  /*!< Channel 5 Half Transfer flag */\n#define DMA_ISR_TEIF5_Pos                   (19U)                              \n#define DMA_ISR_TEIF5_Msk                   (0x1UL << DMA_ISR_TEIF5_Pos)        /*!< 0x00080000 */\n#define DMA_ISR_TEIF5                       DMA_ISR_TEIF5_Msk                  /*!< Channel 5 Transfer Error flag */\n#define DMA_ISR_GIF6_Pos                    (20U)                              \n#define DMA_ISR_GIF6_Msk                    (0x1UL << DMA_ISR_GIF6_Pos)         /*!< 0x00100000 */\n#define DMA_ISR_GIF6                        DMA_ISR_GIF6_Msk                   /*!< Channel 6 Global interrupt flag */\n#define DMA_ISR_TCIF6_Pos                   (21U)                              \n#define DMA_ISR_TCIF6_Msk                   (0x1UL << DMA_ISR_TCIF6_Pos)        /*!< 0x00200000 */\n#define DMA_ISR_TCIF6                       DMA_ISR_TCIF6_Msk                  /*!< Channel 6 Transfer Complete flag */\n#define DMA_ISR_HTIF6_Pos                   (22U)                              \n#define DMA_ISR_HTIF6_Msk                   (0x1UL << DMA_ISR_HTIF6_Pos)        /*!< 0x00400000 */\n#define DMA_ISR_HTIF6                       DMA_ISR_HTIF6_Msk                  /*!< Channel 6 Half Transfer flag */\n#define DMA_ISR_TEIF6_Pos                   (23U)                              \n#define DMA_ISR_TEIF6_Msk                   (0x1UL << DMA_ISR_TEIF6_Pos)        /*!< 0x00800000 */\n#define DMA_ISR_TEIF6                       DMA_ISR_TEIF6_Msk                  /*!< Channel 6 Transfer Error flag */\n#define DMA_ISR_GIF7_Pos                    (24U)                              \n#define DMA_ISR_GIF7_Msk                    (0x1UL << DMA_ISR_GIF7_Pos)         /*!< 0x01000000 */\n#define DMA_ISR_GIF7                        DMA_ISR_GIF7_Msk                   /*!< Channel 7 Global interrupt flag */\n#define DMA_ISR_TCIF7_Pos                   (25U)                              \n#define DMA_ISR_TCIF7_Msk                   (0x1UL << DMA_ISR_TCIF7_Pos)        /*!< 0x02000000 */\n#define DMA_ISR_TCIF7                       DMA_ISR_TCIF7_Msk                  /*!< Channel 7 Transfer Complete flag */\n#define DMA_ISR_HTIF7_Pos                   (26U)                              \n#define DMA_ISR_HTIF7_Msk                   (0x1UL << DMA_ISR_HTIF7_Pos)        /*!< 0x04000000 */\n#define DMA_ISR_HTIF7                       DMA_ISR_HTIF7_Msk                  /*!< Channel 7 Half Transfer flag */\n#define DMA_ISR_TEIF7_Pos                   (27U)                              \n#define DMA_ISR_TEIF7_Msk                   (0x1UL << DMA_ISR_TEIF7_Pos)        /*!< 0x08000000 */\n#define DMA_ISR_TEIF7                       DMA_ISR_TEIF7_Msk                  /*!< Channel 7 Transfer Error flag */\n\n/*******************  Bit definition for DMA_IFCR register  *******************/\n#define DMA_IFCR_CGIF1_Pos                  (0U)                               \n#define DMA_IFCR_CGIF1_Msk                  (0x1UL << DMA_IFCR_CGIF1_Pos)       /*!< 0x00000001 */\n#define DMA_IFCR_CGIF1                      DMA_IFCR_CGIF1_Msk                 /*!< Channel 1 Global interrupt clear */\n#define DMA_IFCR_CTCIF1_Pos                 (1U)                               \n#define DMA_IFCR_CTCIF1_Msk                 (0x1UL << DMA_IFCR_CTCIF1_Pos)      /*!< 0x00000002 */\n#define DMA_IFCR_CTCIF1                     DMA_IFCR_CTCIF1_Msk                /*!< Channel 1 Transfer Complete clear */\n#define DMA_IFCR_CHTIF1_Pos                 (2U)                               \n#define DMA_IFCR_CHTIF1_Msk                 (0x1UL << DMA_IFCR_CHTIF1_Pos)      /*!< 0x00000004 */\n#define DMA_IFCR_CHTIF1                     DMA_IFCR_CHTIF1_Msk                /*!< Channel 1 Half Transfer clear */\n#define DMA_IFCR_CTEIF1_Pos                 (3U)                               \n#define DMA_IFCR_CTEIF1_Msk                 (0x1UL << DMA_IFCR_CTEIF1_Pos)      /*!< 0x00000008 */\n#define DMA_IFCR_CTEIF1                     DMA_IFCR_CTEIF1_Msk                /*!< Channel 1 Transfer Error clear */\n#define DMA_IFCR_CGIF2_Pos                  (4U)                               \n#define DMA_IFCR_CGIF2_Msk                  (0x1UL << DMA_IFCR_CGIF2_Pos)       /*!< 0x00000010 */\n#define DMA_IFCR_CGIF2                      DMA_IFCR_CGIF2_Msk                 /*!< Channel 2 Global interrupt clear */\n#define DMA_IFCR_CTCIF2_Pos                 (5U)                               \n#define DMA_IFCR_CTCIF2_Msk                 (0x1UL << DMA_IFCR_CTCIF2_Pos)      /*!< 0x00000020 */\n#define DMA_IFCR_CTCIF2                     DMA_IFCR_CTCIF2_Msk                /*!< Channel 2 Transfer Complete clear */\n#define DMA_IFCR_CHTIF2_Pos                 (6U)                               \n#define DMA_IFCR_CHTIF2_Msk                 (0x1UL << DMA_IFCR_CHTIF2_Pos)      /*!< 0x00000040 */\n#define DMA_IFCR_CHTIF2                     DMA_IFCR_CHTIF2_Msk                /*!< Channel 2 Half Transfer clear */\n#define DMA_IFCR_CTEIF2_Pos                 (7U)                               \n#define DMA_IFCR_CTEIF2_Msk                 (0x1UL << DMA_IFCR_CTEIF2_Pos)      /*!< 0x00000080 */\n#define DMA_IFCR_CTEIF2                     DMA_IFCR_CTEIF2_Msk                /*!< Channel 2 Transfer Error clear */\n#define DMA_IFCR_CGIF3_Pos                  (8U)                               \n#define DMA_IFCR_CGIF3_Msk                  (0x1UL << DMA_IFCR_CGIF3_Pos)       /*!< 0x00000100 */\n#define DMA_IFCR_CGIF3                      DMA_IFCR_CGIF3_Msk                 /*!< Channel 3 Global interrupt clear */\n#define DMA_IFCR_CTCIF3_Pos                 (9U)                               \n#define DMA_IFCR_CTCIF3_Msk                 (0x1UL << DMA_IFCR_CTCIF3_Pos)      /*!< 0x00000200 */\n#define DMA_IFCR_CTCIF3                     DMA_IFCR_CTCIF3_Msk                /*!< Channel 3 Transfer Complete clear */\n#define DMA_IFCR_CHTIF3_Pos                 (10U)                              \n#define DMA_IFCR_CHTIF3_Msk                 (0x1UL << DMA_IFCR_CHTIF3_Pos)      /*!< 0x00000400 */\n#define DMA_IFCR_CHTIF3                     DMA_IFCR_CHTIF3_Msk                /*!< Channel 3 Half Transfer clear */\n#define DMA_IFCR_CTEIF3_Pos                 (11U)                              \n#define DMA_IFCR_CTEIF3_Msk                 (0x1UL << DMA_IFCR_CTEIF3_Pos)      /*!< 0x00000800 */\n#define DMA_IFCR_CTEIF3                     DMA_IFCR_CTEIF3_Msk                /*!< Channel 3 Transfer Error clear */\n#define DMA_IFCR_CGIF4_Pos                  (12U)                              \n#define DMA_IFCR_CGIF4_Msk                  (0x1UL << DMA_IFCR_CGIF4_Pos)       /*!< 0x00001000 */\n#define DMA_IFCR_CGIF4                      DMA_IFCR_CGIF4_Msk                 /*!< Channel 4 Global interrupt clear */\n#define DMA_IFCR_CTCIF4_Pos                 (13U)                              \n#define DMA_IFCR_CTCIF4_Msk                 (0x1UL << DMA_IFCR_CTCIF4_Pos)      /*!< 0x00002000 */\n#define DMA_IFCR_CTCIF4                     DMA_IFCR_CTCIF4_Msk                /*!< Channel 4 Transfer Complete clear */\n#define DMA_IFCR_CHTIF4_Pos                 (14U)                              \n#define DMA_IFCR_CHTIF4_Msk                 (0x1UL << DMA_IFCR_CHTIF4_Pos)      /*!< 0x00004000 */\n#define DMA_IFCR_CHTIF4                     DMA_IFCR_CHTIF4_Msk                /*!< Channel 4 Half Transfer clear */\n#define DMA_IFCR_CTEIF4_Pos                 (15U)                              \n#define DMA_IFCR_CTEIF4_Msk                 (0x1UL << DMA_IFCR_CTEIF4_Pos)      /*!< 0x00008000 */\n#define DMA_IFCR_CTEIF4                     DMA_IFCR_CTEIF4_Msk                /*!< Channel 4 Transfer Error clear */\n#define DMA_IFCR_CGIF5_Pos                  (16U)                              \n#define DMA_IFCR_CGIF5_Msk                  (0x1UL << DMA_IFCR_CGIF5_Pos)       /*!< 0x00010000 */\n#define DMA_IFCR_CGIF5                      DMA_IFCR_CGIF5_Msk                 /*!< Channel 5 Global interrupt clear */\n#define DMA_IFCR_CTCIF5_Pos                 (17U)                              \n#define DMA_IFCR_CTCIF5_Msk                 (0x1UL << DMA_IFCR_CTCIF5_Pos)      /*!< 0x00020000 */\n#define DMA_IFCR_CTCIF5                     DMA_IFCR_CTCIF5_Msk                /*!< Channel 5 Transfer Complete clear */\n#define DMA_IFCR_CHTIF5_Pos                 (18U)                              \n#define DMA_IFCR_CHTIF5_Msk                 (0x1UL << DMA_IFCR_CHTIF5_Pos)      /*!< 0x00040000 */\n#define DMA_IFCR_CHTIF5                     DMA_IFCR_CHTIF5_Msk                /*!< Channel 5 Half Transfer clear */\n#define DMA_IFCR_CTEIF5_Pos                 (19U)                              \n#define DMA_IFCR_CTEIF5_Msk                 (0x1UL << DMA_IFCR_CTEIF5_Pos)      /*!< 0x00080000 */\n#define DMA_IFCR_CTEIF5                     DMA_IFCR_CTEIF5_Msk                /*!< Channel 5 Transfer Error clear */\n#define DMA_IFCR_CGIF6_Pos                  (20U)                              \n#define DMA_IFCR_CGIF6_Msk                  (0x1UL << DMA_IFCR_CGIF6_Pos)       /*!< 0x00100000 */\n#define DMA_IFCR_CGIF6                      DMA_IFCR_CGIF6_Msk                 /*!< Channel 6 Global interrupt clear */\n#define DMA_IFCR_CTCIF6_Pos                 (21U)                              \n#define DMA_IFCR_CTCIF6_Msk                 (0x1UL << DMA_IFCR_CTCIF6_Pos)      /*!< 0x00200000 */\n#define DMA_IFCR_CTCIF6                     DMA_IFCR_CTCIF6_Msk                /*!< Channel 6 Transfer Complete clear */\n#define DMA_IFCR_CHTIF6_Pos                 (22U)                              \n#define DMA_IFCR_CHTIF6_Msk                 (0x1UL << DMA_IFCR_CHTIF6_Pos)      /*!< 0x00400000 */\n#define DMA_IFCR_CHTIF6                     DMA_IFCR_CHTIF6_Msk                /*!< Channel 6 Half Transfer clear */\n#define DMA_IFCR_CTEIF6_Pos                 (23U)                              \n#define DMA_IFCR_CTEIF6_Msk                 (0x1UL << DMA_IFCR_CTEIF6_Pos)      /*!< 0x00800000 */\n#define DMA_IFCR_CTEIF6                     DMA_IFCR_CTEIF6_Msk                /*!< Channel 6 Transfer Error clear */\n#define DMA_IFCR_CGIF7_Pos                  (24U)                              \n#define DMA_IFCR_CGIF7_Msk                  (0x1UL << DMA_IFCR_CGIF7_Pos)       /*!< 0x01000000 */\n#define DMA_IFCR_CGIF7                      DMA_IFCR_CGIF7_Msk                 /*!< Channel 7 Global interrupt clear */\n#define DMA_IFCR_CTCIF7_Pos                 (25U)                              \n#define DMA_IFCR_CTCIF7_Msk                 (0x1UL << DMA_IFCR_CTCIF7_Pos)      /*!< 0x02000000 */\n#define DMA_IFCR_CTCIF7                     DMA_IFCR_CTCIF7_Msk                /*!< Channel 7 Transfer Complete clear */\n#define DMA_IFCR_CHTIF7_Pos                 (26U)                              \n#define DMA_IFCR_CHTIF7_Msk                 (0x1UL << DMA_IFCR_CHTIF7_Pos)      /*!< 0x04000000 */\n#define DMA_IFCR_CHTIF7                     DMA_IFCR_CHTIF7_Msk                /*!< Channel 7 Half Transfer clear */\n#define DMA_IFCR_CTEIF7_Pos                 (27U)                              \n#define DMA_IFCR_CTEIF7_Msk                 (0x1UL << DMA_IFCR_CTEIF7_Pos)      /*!< 0x08000000 */\n#define DMA_IFCR_CTEIF7                     DMA_IFCR_CTEIF7_Msk                /*!< Channel 7 Transfer Error clear */\n\n/*******************  Bit definition for DMA_CCR register   *******************/\n#define DMA_CCR_EN_Pos                      (0U)                               \n#define DMA_CCR_EN_Msk                      (0x1UL << DMA_CCR_EN_Pos)           /*!< 0x00000001 */\n#define DMA_CCR_EN                          DMA_CCR_EN_Msk                     /*!< Channel enable */\n#define DMA_CCR_TCIE_Pos                    (1U)                               \n#define DMA_CCR_TCIE_Msk                    (0x1UL << DMA_CCR_TCIE_Pos)         /*!< 0x00000002 */\n#define DMA_CCR_TCIE                        DMA_CCR_TCIE_Msk                   /*!< Transfer complete interrupt enable */\n#define DMA_CCR_HTIE_Pos                    (2U)                               \n#define DMA_CCR_HTIE_Msk                    (0x1UL << DMA_CCR_HTIE_Pos)         /*!< 0x00000004 */\n#define DMA_CCR_HTIE                        DMA_CCR_HTIE_Msk                   /*!< Half Transfer interrupt enable */\n#define DMA_CCR_TEIE_Pos                    (3U)                               \n#define DMA_CCR_TEIE_Msk                    (0x1UL << DMA_CCR_TEIE_Pos)         /*!< 0x00000008 */\n#define DMA_CCR_TEIE                        DMA_CCR_TEIE_Msk                   /*!< Transfer error interrupt enable */\n#define DMA_CCR_DIR_Pos                     (4U)                               \n#define DMA_CCR_DIR_Msk                     (0x1UL << DMA_CCR_DIR_Pos)          /*!< 0x00000010 */\n#define DMA_CCR_DIR                         DMA_CCR_DIR_Msk                    /*!< Data transfer direction */\n#define DMA_CCR_CIRC_Pos                    (5U)                               \n#define DMA_CCR_CIRC_Msk                    (0x1UL << DMA_CCR_CIRC_Pos)         /*!< 0x00000020 */\n#define DMA_CCR_CIRC                        DMA_CCR_CIRC_Msk                   /*!< Circular mode */\n#define DMA_CCR_PINC_Pos                    (6U)                               \n#define DMA_CCR_PINC_Msk                    (0x1UL << DMA_CCR_PINC_Pos)         /*!< 0x00000040 */\n#define DMA_CCR_PINC                        DMA_CCR_PINC_Msk                   /*!< Peripheral increment mode */\n#define DMA_CCR_MINC_Pos                    (7U)                               \n#define DMA_CCR_MINC_Msk                    (0x1UL << DMA_CCR_MINC_Pos)         /*!< 0x00000080 */\n#define DMA_CCR_MINC                        DMA_CCR_MINC_Msk                   /*!< Memory increment mode */\n\n#define DMA_CCR_PSIZE_Pos                   (8U)                               \n#define DMA_CCR_PSIZE_Msk                   (0x3UL << DMA_CCR_PSIZE_Pos)        /*!< 0x00000300 */\n#define DMA_CCR_PSIZE                       DMA_CCR_PSIZE_Msk                  /*!< PSIZE[1:0] bits (Peripheral size) */\n#define DMA_CCR_PSIZE_0                     (0x1UL << DMA_CCR_PSIZE_Pos)        /*!< 0x00000100 */\n#define DMA_CCR_PSIZE_1                     (0x2UL << DMA_CCR_PSIZE_Pos)        /*!< 0x00000200 */\n\n#define DMA_CCR_MSIZE_Pos                   (10U)                              \n#define DMA_CCR_MSIZE_Msk                   (0x3UL << DMA_CCR_MSIZE_Pos)        /*!< 0x00000C00 */\n#define DMA_CCR_MSIZE                       DMA_CCR_MSIZE_Msk                  /*!< MSIZE[1:0] bits (Memory size) */\n#define DMA_CCR_MSIZE_0                     (0x1UL << DMA_CCR_MSIZE_Pos)        /*!< 0x00000400 */\n#define DMA_CCR_MSIZE_1                     (0x2UL << DMA_CCR_MSIZE_Pos)        /*!< 0x00000800 */\n\n#define DMA_CCR_PL_Pos                      (12U)                              \n#define DMA_CCR_PL_Msk                      (0x3UL << DMA_CCR_PL_Pos)           /*!< 0x00003000 */\n#define DMA_CCR_PL                          DMA_CCR_PL_Msk                     /*!< PL[1:0] bits(Channel Priority level) */\n#define DMA_CCR_PL_0                        (0x1UL << DMA_CCR_PL_Pos)           /*!< 0x00001000 */\n#define DMA_CCR_PL_1                        (0x2UL << DMA_CCR_PL_Pos)           /*!< 0x00002000 */\n\n#define DMA_CCR_MEM2MEM_Pos                 (14U)                              \n#define DMA_CCR_MEM2MEM_Msk                 (0x1UL << DMA_CCR_MEM2MEM_Pos)      /*!< 0x00004000 */\n#define DMA_CCR_MEM2MEM                     DMA_CCR_MEM2MEM_Msk                /*!< Memory to memory mode */\n\n/******************  Bit definition for DMA_CNDTR  register  ******************/\n#define DMA_CNDTR_NDT_Pos                   (0U)                               \n#define DMA_CNDTR_NDT_Msk                   (0xFFFFUL << DMA_CNDTR_NDT_Pos)     /*!< 0x0000FFFF */\n#define DMA_CNDTR_NDT                       DMA_CNDTR_NDT_Msk                  /*!< Number of data to Transfer */\n\n/******************  Bit definition for DMA_CPAR  register  *******************/\n#define DMA_CPAR_PA_Pos                     (0U)                               \n#define DMA_CPAR_PA_Msk                     (0xFFFFFFFFUL << DMA_CPAR_PA_Pos)   /*!< 0xFFFFFFFF */\n#define DMA_CPAR_PA                         DMA_CPAR_PA_Msk                    /*!< Peripheral Address */\n\n/******************  Bit definition for DMA_CMAR  register  *******************/\n#define DMA_CMAR_MA_Pos                     (0U)                               \n#define DMA_CMAR_MA_Msk                     (0xFFFFFFFFUL << DMA_CMAR_MA_Pos)   /*!< 0xFFFFFFFF */\n#define DMA_CMAR_MA                         DMA_CMAR_MA_Msk                    /*!< Memory Address */\n\n/******************************************************************************/\n/*                                                                            */\n/*                      Analog to Digital Converter (ADC)                     */\n/*                                                                            */\n/******************************************************************************/\n\n/*\n * @brief Specific device feature definitions (not present on all devices in the STM32F1 family)\n */\n#define ADC_MULTIMODE_SUPPORT                          /*!< ADC feature available only on specific devices: multimode available on devices with several ADC instances */\n\n/********************  Bit definition for ADC_SR register  ********************/\n#define ADC_SR_AWD_Pos                      (0U)                               \n#define ADC_SR_AWD_Msk                      (0x1UL << ADC_SR_AWD_Pos)           /*!< 0x00000001 */\n#define ADC_SR_AWD                          ADC_SR_AWD_Msk                     /*!< ADC analog watchdog 1 flag */\n#define ADC_SR_EOS_Pos                      (1U)                               \n#define ADC_SR_EOS_Msk                      (0x1UL << ADC_SR_EOS_Pos)           /*!< 0x00000002 */\n#define ADC_SR_EOS                          ADC_SR_EOS_Msk                     /*!< ADC group regular end of sequence conversions flag */\n#define ADC_SR_JEOS_Pos                     (2U)                               \n#define ADC_SR_JEOS_Msk                     (0x1UL << ADC_SR_JEOS_Pos)          /*!< 0x00000004 */\n#define ADC_SR_JEOS                         ADC_SR_JEOS_Msk                    /*!< ADC group injected end of sequence conversions flag */\n#define ADC_SR_JSTRT_Pos                    (3U)                               \n#define ADC_SR_JSTRT_Msk                    (0x1UL << ADC_SR_JSTRT_Pos)         /*!< 0x00000008 */\n#define ADC_SR_JSTRT                        ADC_SR_JSTRT_Msk                   /*!< ADC group injected conversion start flag */\n#define ADC_SR_STRT_Pos                     (4U)                               \n#define ADC_SR_STRT_Msk                     (0x1UL << ADC_SR_STRT_Pos)          /*!< 0x00000010 */\n#define ADC_SR_STRT                         ADC_SR_STRT_Msk                    /*!< ADC group regular conversion start flag */\n\n/* Legacy defines */\n#define  ADC_SR_EOC                          (ADC_SR_EOS)\n#define  ADC_SR_JEOC                         (ADC_SR_JEOS)\n\n/*******************  Bit definition for ADC_CR1 register  ********************/\n#define ADC_CR1_AWDCH_Pos                   (0U)                               \n#define ADC_CR1_AWDCH_Msk                   (0x1FUL << ADC_CR1_AWDCH_Pos)       /*!< 0x0000001F */\n#define ADC_CR1_AWDCH                       ADC_CR1_AWDCH_Msk                  /*!< ADC analog watchdog 1 monitored channel selection */\n#define ADC_CR1_AWDCH_0                     (0x01UL << ADC_CR1_AWDCH_Pos)       /*!< 0x00000001 */\n#define ADC_CR1_AWDCH_1                     (0x02UL << ADC_CR1_AWDCH_Pos)       /*!< 0x00000002 */\n#define ADC_CR1_AWDCH_2                     (0x04UL << ADC_CR1_AWDCH_Pos)       /*!< 0x00000004 */\n#define ADC_CR1_AWDCH_3                     (0x08UL << ADC_CR1_AWDCH_Pos)       /*!< 0x00000008 */\n#define ADC_CR1_AWDCH_4                     (0x10UL << ADC_CR1_AWDCH_Pos)       /*!< 0x00000010 */\n\n#define ADC_CR1_EOSIE_Pos                   (5U)                               \n#define ADC_CR1_EOSIE_Msk                   (0x1UL << ADC_CR1_EOSIE_Pos)        /*!< 0x00000020 */\n#define ADC_CR1_EOSIE                       ADC_CR1_EOSIE_Msk                  /*!< ADC group regular end of sequence conversions interrupt */\n#define ADC_CR1_AWDIE_Pos                   (6U)                               \n#define ADC_CR1_AWDIE_Msk                   (0x1UL << ADC_CR1_AWDIE_Pos)        /*!< 0x00000040 */\n#define ADC_CR1_AWDIE                       ADC_CR1_AWDIE_Msk                  /*!< ADC analog watchdog 1 interrupt */\n#define ADC_CR1_JEOSIE_Pos                  (7U)                               \n#define ADC_CR1_JEOSIE_Msk                  (0x1UL << ADC_CR1_JEOSIE_Pos)       /*!< 0x00000080 */\n#define ADC_CR1_JEOSIE                      ADC_CR1_JEOSIE_Msk                 /*!< ADC group injected end of sequence conversions interrupt */\n#define ADC_CR1_SCAN_Pos                    (8U)                               \n#define ADC_CR1_SCAN_Msk                    (0x1UL << ADC_CR1_SCAN_Pos)         /*!< 0x00000100 */\n#define ADC_CR1_SCAN                        ADC_CR1_SCAN_Msk                   /*!< ADC scan mode */\n#define ADC_CR1_AWDSGL_Pos                  (9U)                               \n#define ADC_CR1_AWDSGL_Msk                  (0x1UL << ADC_CR1_AWDSGL_Pos)       /*!< 0x00000200 */\n#define ADC_CR1_AWDSGL                      ADC_CR1_AWDSGL_Msk                 /*!< ADC analog watchdog 1 monitoring a single channel or all channels */\n#define ADC_CR1_JAUTO_Pos                   (10U)                              \n#define ADC_CR1_JAUTO_Msk                   (0x1UL << ADC_CR1_JAUTO_Pos)        /*!< 0x00000400 */\n#define ADC_CR1_JAUTO                       ADC_CR1_JAUTO_Msk                  /*!< ADC group injected automatic trigger mode */\n#define ADC_CR1_DISCEN_Pos                  (11U)                              \n#define ADC_CR1_DISCEN_Msk                  (0x1UL << ADC_CR1_DISCEN_Pos)       /*!< 0x00000800 */\n#define ADC_CR1_DISCEN                      ADC_CR1_DISCEN_Msk                 /*!< ADC group regular sequencer discontinuous mode */\n#define ADC_CR1_JDISCEN_Pos                 (12U)                              \n#define ADC_CR1_JDISCEN_Msk                 (0x1UL << ADC_CR1_JDISCEN_Pos)      /*!< 0x00001000 */\n#define ADC_CR1_JDISCEN                     ADC_CR1_JDISCEN_Msk                /*!< ADC group injected sequencer discontinuous mode */\n\n#define ADC_CR1_DISCNUM_Pos                 (13U)                              \n#define ADC_CR1_DISCNUM_Msk                 (0x7UL << ADC_CR1_DISCNUM_Pos)      /*!< 0x0000E000 */\n#define ADC_CR1_DISCNUM                     ADC_CR1_DISCNUM_Msk                /*!< ADC group regular sequencer discontinuous number of ranks */\n#define ADC_CR1_DISCNUM_0                   (0x1UL << ADC_CR1_DISCNUM_Pos)      /*!< 0x00002000 */\n#define ADC_CR1_DISCNUM_1                   (0x2UL << ADC_CR1_DISCNUM_Pos)      /*!< 0x00004000 */\n#define ADC_CR1_DISCNUM_2                   (0x4UL << ADC_CR1_DISCNUM_Pos)      /*!< 0x00008000 */\n\n#define ADC_CR1_DUALMOD_Pos                 (16U)                              \n#define ADC_CR1_DUALMOD_Msk                 (0xFUL << ADC_CR1_DUALMOD_Pos)      /*!< 0x000F0000 */\n#define ADC_CR1_DUALMOD                     ADC_CR1_DUALMOD_Msk                /*!< ADC multimode mode selection */\n#define ADC_CR1_DUALMOD_0                   (0x1UL << ADC_CR1_DUALMOD_Pos)      /*!< 0x00010000 */\n#define ADC_CR1_DUALMOD_1                   (0x2UL << ADC_CR1_DUALMOD_Pos)      /*!< 0x00020000 */\n#define ADC_CR1_DUALMOD_2                   (0x4UL << ADC_CR1_DUALMOD_Pos)      /*!< 0x00040000 */\n#define ADC_CR1_DUALMOD_3                   (0x8UL << ADC_CR1_DUALMOD_Pos)      /*!< 0x00080000 */\n\n#define ADC_CR1_JAWDEN_Pos                  (22U)                              \n#define ADC_CR1_JAWDEN_Msk                  (0x1UL << ADC_CR1_JAWDEN_Pos)       /*!< 0x00400000 */\n#define ADC_CR1_JAWDEN                      ADC_CR1_JAWDEN_Msk                 /*!< ADC analog watchdog 1 enable on scope ADC group injected */\n#define ADC_CR1_AWDEN_Pos                   (23U)                              \n#define ADC_CR1_AWDEN_Msk                   (0x1UL << ADC_CR1_AWDEN_Pos)        /*!< 0x00800000 */\n#define ADC_CR1_AWDEN                       ADC_CR1_AWDEN_Msk                  /*!< ADC analog watchdog 1 enable on scope ADC group regular */\n\n/* Legacy defines */\n#define  ADC_CR1_EOCIE                       (ADC_CR1_EOSIE)\n#define  ADC_CR1_JEOCIE                      (ADC_CR1_JEOSIE)\n\n/*******************  Bit definition for ADC_CR2 register  ********************/\n#define ADC_CR2_ADON_Pos                    (0U)                               \n#define ADC_CR2_ADON_Msk                    (0x1UL << ADC_CR2_ADON_Pos)         /*!< 0x00000001 */\n#define ADC_CR2_ADON                        ADC_CR2_ADON_Msk                   /*!< ADC enable */\n#define ADC_CR2_CONT_Pos                    (1U)                               \n#define ADC_CR2_CONT_Msk                    (0x1UL << ADC_CR2_CONT_Pos)         /*!< 0x00000002 */\n#define ADC_CR2_CONT                        ADC_CR2_CONT_Msk                   /*!< ADC group regular continuous conversion mode */\n#define ADC_CR2_CAL_Pos                     (2U)                               \n#define ADC_CR2_CAL_Msk                     (0x1UL << ADC_CR2_CAL_Pos)          /*!< 0x00000004 */\n#define ADC_CR2_CAL                         ADC_CR2_CAL_Msk                    /*!< ADC calibration start */\n#define ADC_CR2_RSTCAL_Pos                  (3U)                               \n#define ADC_CR2_RSTCAL_Msk                  (0x1UL << ADC_CR2_RSTCAL_Pos)       /*!< 0x00000008 */\n#define ADC_CR2_RSTCAL                      ADC_CR2_RSTCAL_Msk                 /*!< ADC calibration reset */\n#define ADC_CR2_DMA_Pos                     (8U)                               \n#define ADC_CR2_DMA_Msk                     (0x1UL << ADC_CR2_DMA_Pos)          /*!< 0x00000100 */\n#define ADC_CR2_DMA                         ADC_CR2_DMA_Msk                    /*!< ADC DMA transfer enable */\n#define ADC_CR2_ALIGN_Pos                   (11U)                              \n#define ADC_CR2_ALIGN_Msk                   (0x1UL << ADC_CR2_ALIGN_Pos)        /*!< 0x00000800 */\n#define ADC_CR2_ALIGN                       ADC_CR2_ALIGN_Msk                  /*!< ADC data alignement */\n\n#define ADC_CR2_JEXTSEL_Pos                 (12U)                              \n#define ADC_CR2_JEXTSEL_Msk                 (0x7UL << ADC_CR2_JEXTSEL_Pos)      /*!< 0x00007000 */\n#define ADC_CR2_JEXTSEL                     ADC_CR2_JEXTSEL_Msk                /*!< ADC group injected external trigger source */\n#define ADC_CR2_JEXTSEL_0                   (0x1UL << ADC_CR2_JEXTSEL_Pos)      /*!< 0x00001000 */\n#define ADC_CR2_JEXTSEL_1                   (0x2UL << ADC_CR2_JEXTSEL_Pos)      /*!< 0x00002000 */\n#define ADC_CR2_JEXTSEL_2                   (0x4UL << ADC_CR2_JEXTSEL_Pos)      /*!< 0x00004000 */\n\n#define ADC_CR2_JEXTTRIG_Pos                (15U)                              \n#define ADC_CR2_JEXTTRIG_Msk                (0x1UL << ADC_CR2_JEXTTRIG_Pos)     /*!< 0x00008000 */\n#define ADC_CR2_JEXTTRIG                    ADC_CR2_JEXTTRIG_Msk               /*!< ADC group injected external trigger enable */\n\n#define ADC_CR2_EXTSEL_Pos                  (17U)                              \n#define ADC_CR2_EXTSEL_Msk                  (0x7UL << ADC_CR2_EXTSEL_Pos)       /*!< 0x000E0000 */\n#define ADC_CR2_EXTSEL                      ADC_CR2_EXTSEL_Msk                 /*!< ADC group regular external trigger source */\n#define ADC_CR2_EXTSEL_0                    (0x1UL << ADC_CR2_EXTSEL_Pos)       /*!< 0x00020000 */\n#define ADC_CR2_EXTSEL_1                    (0x2UL << ADC_CR2_EXTSEL_Pos)       /*!< 0x00040000 */\n#define ADC_CR2_EXTSEL_2                    (0x4UL << ADC_CR2_EXTSEL_Pos)       /*!< 0x00080000 */\n\n#define ADC_CR2_EXTTRIG_Pos                 (20U)                              \n#define ADC_CR2_EXTTRIG_Msk                 (0x1UL << ADC_CR2_EXTTRIG_Pos)      /*!< 0x00100000 */\n#define ADC_CR2_EXTTRIG                     ADC_CR2_EXTTRIG_Msk                /*!< ADC group regular external trigger enable */\n#define ADC_CR2_JSWSTART_Pos                (21U)                              \n#define ADC_CR2_JSWSTART_Msk                (0x1UL << ADC_CR2_JSWSTART_Pos)     /*!< 0x00200000 */\n#define ADC_CR2_JSWSTART                    ADC_CR2_JSWSTART_Msk               /*!< ADC group injected conversion start */\n#define ADC_CR2_SWSTART_Pos                 (22U)                              \n#define ADC_CR2_SWSTART_Msk                 (0x1UL << ADC_CR2_SWSTART_Pos)      /*!< 0x00400000 */\n#define ADC_CR2_SWSTART                     ADC_CR2_SWSTART_Msk                /*!< ADC group regular conversion start */\n#define ADC_CR2_TSVREFE_Pos                 (23U)                              \n#define ADC_CR2_TSVREFE_Msk                 (0x1UL << ADC_CR2_TSVREFE_Pos)      /*!< 0x00800000 */\n#define ADC_CR2_TSVREFE                     ADC_CR2_TSVREFE_Msk                /*!< ADC internal path to VrefInt and temperature sensor enable */\n\n/******************  Bit definition for ADC_SMPR1 register  *******************/\n#define ADC_SMPR1_SMP10_Pos                 (0U)                               \n#define ADC_SMPR1_SMP10_Msk                 (0x7UL << ADC_SMPR1_SMP10_Pos)      /*!< 0x00000007 */\n#define ADC_SMPR1_SMP10                     ADC_SMPR1_SMP10_Msk                /*!< ADC channel 10 sampling time selection  */\n#define ADC_SMPR1_SMP10_0                   (0x1UL << ADC_SMPR1_SMP10_Pos)      /*!< 0x00000001 */\n#define ADC_SMPR1_SMP10_1                   (0x2UL << ADC_SMPR1_SMP10_Pos)      /*!< 0x00000002 */\n#define ADC_SMPR1_SMP10_2                   (0x4UL << ADC_SMPR1_SMP10_Pos)      /*!< 0x00000004 */\n\n#define ADC_SMPR1_SMP11_Pos                 (3U)                               \n#define ADC_SMPR1_SMP11_Msk                 (0x7UL << ADC_SMPR1_SMP11_Pos)      /*!< 0x00000038 */\n#define ADC_SMPR1_SMP11                     ADC_SMPR1_SMP11_Msk                /*!< ADC channel 11 sampling time selection  */\n#define ADC_SMPR1_SMP11_0                   (0x1UL << ADC_SMPR1_SMP11_Pos)      /*!< 0x00000008 */\n#define ADC_SMPR1_SMP11_1                   (0x2UL << ADC_SMPR1_SMP11_Pos)      /*!< 0x00000010 */\n#define ADC_SMPR1_SMP11_2                   (0x4UL << ADC_SMPR1_SMP11_Pos)      /*!< 0x00000020 */\n\n#define ADC_SMPR1_SMP12_Pos                 (6U)                               \n#define ADC_SMPR1_SMP12_Msk                 (0x7UL << ADC_SMPR1_SMP12_Pos)      /*!< 0x000001C0 */\n#define ADC_SMPR1_SMP12                     ADC_SMPR1_SMP12_Msk                /*!< ADC channel 12 sampling time selection  */\n#define ADC_SMPR1_SMP12_0                   (0x1UL << ADC_SMPR1_SMP12_Pos)      /*!< 0x00000040 */\n#define ADC_SMPR1_SMP12_1                   (0x2UL << ADC_SMPR1_SMP12_Pos)      /*!< 0x00000080 */\n#define ADC_SMPR1_SMP12_2                   (0x4UL << ADC_SMPR1_SMP12_Pos)      /*!< 0x00000100 */\n\n#define ADC_SMPR1_SMP13_Pos                 (9U)                               \n#define ADC_SMPR1_SMP13_Msk                 (0x7UL << ADC_SMPR1_SMP13_Pos)      /*!< 0x00000E00 */\n#define ADC_SMPR1_SMP13                     ADC_SMPR1_SMP13_Msk                /*!< ADC channel 13 sampling time selection  */\n#define ADC_SMPR1_SMP13_0                   (0x1UL << ADC_SMPR1_SMP13_Pos)      /*!< 0x00000200 */\n#define ADC_SMPR1_SMP13_1                   (0x2UL << ADC_SMPR1_SMP13_Pos)      /*!< 0x00000400 */\n#define ADC_SMPR1_SMP13_2                   (0x4UL << ADC_SMPR1_SMP13_Pos)      /*!< 0x00000800 */\n\n#define ADC_SMPR1_SMP14_Pos                 (12U)                              \n#define ADC_SMPR1_SMP14_Msk                 (0x7UL << ADC_SMPR1_SMP14_Pos)      /*!< 0x00007000 */\n#define ADC_SMPR1_SMP14                     ADC_SMPR1_SMP14_Msk                /*!< ADC channel 14 sampling time selection  */\n#define ADC_SMPR1_SMP14_0                   (0x1UL << ADC_SMPR1_SMP14_Pos)      /*!< 0x00001000 */\n#define ADC_SMPR1_SMP14_1                   (0x2UL << ADC_SMPR1_SMP14_Pos)      /*!< 0x00002000 */\n#define ADC_SMPR1_SMP14_2                   (0x4UL << ADC_SMPR1_SMP14_Pos)      /*!< 0x00004000 */\n\n#define ADC_SMPR1_SMP15_Pos                 (15U)                              \n#define ADC_SMPR1_SMP15_Msk                 (0x7UL << ADC_SMPR1_SMP15_Pos)      /*!< 0x00038000 */\n#define ADC_SMPR1_SMP15                     ADC_SMPR1_SMP15_Msk                /*!< ADC channel 15 sampling time selection  */\n#define ADC_SMPR1_SMP15_0                   (0x1UL << ADC_SMPR1_SMP15_Pos)      /*!< 0x00008000 */\n#define ADC_SMPR1_SMP15_1                   (0x2UL << ADC_SMPR1_SMP15_Pos)      /*!< 0x00010000 */\n#define ADC_SMPR1_SMP15_2                   (0x4UL << ADC_SMPR1_SMP15_Pos)      /*!< 0x00020000 */\n\n#define ADC_SMPR1_SMP16_Pos                 (18U)                              \n#define ADC_SMPR1_SMP16_Msk                 (0x7UL << ADC_SMPR1_SMP16_Pos)      /*!< 0x001C0000 */\n#define ADC_SMPR1_SMP16                     ADC_SMPR1_SMP16_Msk                /*!< ADC channel 16 sampling time selection  */\n#define ADC_SMPR1_SMP16_0                   (0x1UL << ADC_SMPR1_SMP16_Pos)      /*!< 0x00040000 */\n#define ADC_SMPR1_SMP16_1                   (0x2UL << ADC_SMPR1_SMP16_Pos)      /*!< 0x00080000 */\n#define ADC_SMPR1_SMP16_2                   (0x4UL << ADC_SMPR1_SMP16_Pos)      /*!< 0x00100000 */\n\n#define ADC_SMPR1_SMP17_Pos                 (21U)                              \n#define ADC_SMPR1_SMP17_Msk                 (0x7UL << ADC_SMPR1_SMP17_Pos)      /*!< 0x00E00000 */\n#define ADC_SMPR1_SMP17                     ADC_SMPR1_SMP17_Msk                /*!< ADC channel 17 sampling time selection  */\n#define ADC_SMPR1_SMP17_0                   (0x1UL << ADC_SMPR1_SMP17_Pos)      /*!< 0x00200000 */\n#define ADC_SMPR1_SMP17_1                   (0x2UL << ADC_SMPR1_SMP17_Pos)      /*!< 0x00400000 */\n#define ADC_SMPR1_SMP17_2                   (0x4UL << ADC_SMPR1_SMP17_Pos)      /*!< 0x00800000 */\n\n/******************  Bit definition for ADC_SMPR2 register  *******************/\n#define ADC_SMPR2_SMP0_Pos                  (0U)                               \n#define ADC_SMPR2_SMP0_Msk                  (0x7UL << ADC_SMPR2_SMP0_Pos)       /*!< 0x00000007 */\n#define ADC_SMPR2_SMP0                      ADC_SMPR2_SMP0_Msk                 /*!< ADC channel 0 sampling time selection  */\n#define ADC_SMPR2_SMP0_0                    (0x1UL << ADC_SMPR2_SMP0_Pos)       /*!< 0x00000001 */\n#define ADC_SMPR2_SMP0_1                    (0x2UL << ADC_SMPR2_SMP0_Pos)       /*!< 0x00000002 */\n#define ADC_SMPR2_SMP0_2                    (0x4UL << ADC_SMPR2_SMP0_Pos)       /*!< 0x00000004 */\n\n#define ADC_SMPR2_SMP1_Pos                  (3U)                               \n#define ADC_SMPR2_SMP1_Msk                  (0x7UL << ADC_SMPR2_SMP1_Pos)       /*!< 0x00000038 */\n#define ADC_SMPR2_SMP1                      ADC_SMPR2_SMP1_Msk                 /*!< ADC channel 1 sampling time selection  */\n#define ADC_SMPR2_SMP1_0                    (0x1UL << ADC_SMPR2_SMP1_Pos)       /*!< 0x00000008 */\n#define ADC_SMPR2_SMP1_1                    (0x2UL << ADC_SMPR2_SMP1_Pos)       /*!< 0x00000010 */\n#define ADC_SMPR2_SMP1_2                    (0x4UL << ADC_SMPR2_SMP1_Pos)       /*!< 0x00000020 */\n\n#define ADC_SMPR2_SMP2_Pos                  (6U)                               \n#define ADC_SMPR2_SMP2_Msk                  (0x7UL << ADC_SMPR2_SMP2_Pos)       /*!< 0x000001C0 */\n#define ADC_SMPR2_SMP2                      ADC_SMPR2_SMP2_Msk                 /*!< ADC channel 2 sampling time selection  */\n#define ADC_SMPR2_SMP2_0                    (0x1UL << ADC_SMPR2_SMP2_Pos)       /*!< 0x00000040 */\n#define ADC_SMPR2_SMP2_1                    (0x2UL << ADC_SMPR2_SMP2_Pos)       /*!< 0x00000080 */\n#define ADC_SMPR2_SMP2_2                    (0x4UL << ADC_SMPR2_SMP2_Pos)       /*!< 0x00000100 */\n\n#define ADC_SMPR2_SMP3_Pos                  (9U)                               \n#define ADC_SMPR2_SMP3_Msk                  (0x7UL << ADC_SMPR2_SMP3_Pos)       /*!< 0x00000E00 */\n#define ADC_SMPR2_SMP3                      ADC_SMPR2_SMP3_Msk                 /*!< ADC channel 3 sampling time selection  */\n#define ADC_SMPR2_SMP3_0                    (0x1UL << ADC_SMPR2_SMP3_Pos)       /*!< 0x00000200 */\n#define ADC_SMPR2_SMP3_1                    (0x2UL << ADC_SMPR2_SMP3_Pos)       /*!< 0x00000400 */\n#define ADC_SMPR2_SMP3_2                    (0x4UL << ADC_SMPR2_SMP3_Pos)       /*!< 0x00000800 */\n\n#define ADC_SMPR2_SMP4_Pos                  (12U)                              \n#define ADC_SMPR2_SMP4_Msk                  (0x7UL << ADC_SMPR2_SMP4_Pos)       /*!< 0x00007000 */\n#define ADC_SMPR2_SMP4                      ADC_SMPR2_SMP4_Msk                 /*!< ADC channel 4 sampling time selection  */\n#define ADC_SMPR2_SMP4_0                    (0x1UL << ADC_SMPR2_SMP4_Pos)       /*!< 0x00001000 */\n#define ADC_SMPR2_SMP4_1                    (0x2UL << ADC_SMPR2_SMP4_Pos)       /*!< 0x00002000 */\n#define ADC_SMPR2_SMP4_2                    (0x4UL << ADC_SMPR2_SMP4_Pos)       /*!< 0x00004000 */\n\n#define ADC_SMPR2_SMP5_Pos                  (15U)                              \n#define ADC_SMPR2_SMP5_Msk                  (0x7UL << ADC_SMPR2_SMP5_Pos)       /*!< 0x00038000 */\n#define ADC_SMPR2_SMP5                      ADC_SMPR2_SMP5_Msk                 /*!< ADC channel 5 sampling time selection  */\n#define ADC_SMPR2_SMP5_0                    (0x1UL << ADC_SMPR2_SMP5_Pos)       /*!< 0x00008000 */\n#define ADC_SMPR2_SMP5_1                    (0x2UL << ADC_SMPR2_SMP5_Pos)       /*!< 0x00010000 */\n#define ADC_SMPR2_SMP5_2                    (0x4UL << ADC_SMPR2_SMP5_Pos)       /*!< 0x00020000 */\n\n#define ADC_SMPR2_SMP6_Pos                  (18U)                              \n#define ADC_SMPR2_SMP6_Msk                  (0x7UL << ADC_SMPR2_SMP6_Pos)       /*!< 0x001C0000 */\n#define ADC_SMPR2_SMP6                      ADC_SMPR2_SMP6_Msk                 /*!< ADC channel 6 sampling time selection  */\n#define ADC_SMPR2_SMP6_0                    (0x1UL << ADC_SMPR2_SMP6_Pos)       /*!< 0x00040000 */\n#define ADC_SMPR2_SMP6_1                    (0x2UL << ADC_SMPR2_SMP6_Pos)       /*!< 0x00080000 */\n#define ADC_SMPR2_SMP6_2                    (0x4UL << ADC_SMPR2_SMP6_Pos)       /*!< 0x00100000 */\n\n#define ADC_SMPR2_SMP7_Pos                  (21U)                              \n#define ADC_SMPR2_SMP7_Msk                  (0x7UL << ADC_SMPR2_SMP7_Pos)       /*!< 0x00E00000 */\n#define ADC_SMPR2_SMP7                      ADC_SMPR2_SMP7_Msk                 /*!< ADC channel 7 sampling time selection  */\n#define ADC_SMPR2_SMP7_0                    (0x1UL << ADC_SMPR2_SMP7_Pos)       /*!< 0x00200000 */\n#define ADC_SMPR2_SMP7_1                    (0x2UL << ADC_SMPR2_SMP7_Pos)       /*!< 0x00400000 */\n#define ADC_SMPR2_SMP7_2                    (0x4UL << ADC_SMPR2_SMP7_Pos)       /*!< 0x00800000 */\n\n#define ADC_SMPR2_SMP8_Pos                  (24U)                              \n#define ADC_SMPR2_SMP8_Msk                  (0x7UL << ADC_SMPR2_SMP8_Pos)       /*!< 0x07000000 */\n#define ADC_SMPR2_SMP8                      ADC_SMPR2_SMP8_Msk                 /*!< ADC channel 8 sampling time selection  */\n#define ADC_SMPR2_SMP8_0                    (0x1UL << ADC_SMPR2_SMP8_Pos)       /*!< 0x01000000 */\n#define ADC_SMPR2_SMP8_1                    (0x2UL << ADC_SMPR2_SMP8_Pos)       /*!< 0x02000000 */\n#define ADC_SMPR2_SMP8_2                    (0x4UL << ADC_SMPR2_SMP8_Pos)       /*!< 0x04000000 */\n\n#define ADC_SMPR2_SMP9_Pos                  (27U)                              \n#define ADC_SMPR2_SMP9_Msk                  (0x7UL << ADC_SMPR2_SMP9_Pos)       /*!< 0x38000000 */\n#define ADC_SMPR2_SMP9                      ADC_SMPR2_SMP9_Msk                 /*!< ADC channel 9 sampling time selection  */\n#define ADC_SMPR2_SMP9_0                    (0x1UL << ADC_SMPR2_SMP9_Pos)       /*!< 0x08000000 */\n#define ADC_SMPR2_SMP9_1                    (0x2UL << ADC_SMPR2_SMP9_Pos)       /*!< 0x10000000 */\n#define ADC_SMPR2_SMP9_2                    (0x4UL << ADC_SMPR2_SMP9_Pos)       /*!< 0x20000000 */\n\n/******************  Bit definition for ADC_JOFR1 register  *******************/\n#define ADC_JOFR1_JOFFSET1_Pos              (0U)                               \n#define ADC_JOFR1_JOFFSET1_Msk              (0xFFFUL << ADC_JOFR1_JOFFSET1_Pos) /*!< 0x00000FFF */\n#define ADC_JOFR1_JOFFSET1                  ADC_JOFR1_JOFFSET1_Msk             /*!< ADC group injected sequencer rank 1 offset value */\n\n/******************  Bit definition for ADC_JOFR2 register  *******************/\n#define ADC_JOFR2_JOFFSET2_Pos              (0U)                               \n#define ADC_JOFR2_JOFFSET2_Msk              (0xFFFUL << ADC_JOFR2_JOFFSET2_Pos) /*!< 0x00000FFF */\n#define ADC_JOFR2_JOFFSET2                  ADC_JOFR2_JOFFSET2_Msk             /*!< ADC group injected sequencer rank 2 offset value */\n\n/******************  Bit definition for ADC_JOFR3 register  *******************/\n#define ADC_JOFR3_JOFFSET3_Pos              (0U)                               \n#define ADC_JOFR3_JOFFSET3_Msk              (0xFFFUL << ADC_JOFR3_JOFFSET3_Pos) /*!< 0x00000FFF */\n#define ADC_JOFR3_JOFFSET3                  ADC_JOFR3_JOFFSET3_Msk             /*!< ADC group injected sequencer rank 3 offset value */\n\n/******************  Bit definition for ADC_JOFR4 register  *******************/\n#define ADC_JOFR4_JOFFSET4_Pos              (0U)                               \n#define ADC_JOFR4_JOFFSET4_Msk              (0xFFFUL << ADC_JOFR4_JOFFSET4_Pos) /*!< 0x00000FFF */\n#define ADC_JOFR4_JOFFSET4                  ADC_JOFR4_JOFFSET4_Msk             /*!< ADC group injected sequencer rank 4 offset value */\n\n/*******************  Bit definition for ADC_HTR register  ********************/\n#define ADC_HTR_HT_Pos                      (0U)                               \n#define ADC_HTR_HT_Msk                      (0xFFFUL << ADC_HTR_HT_Pos)         /*!< 0x00000FFF */\n#define ADC_HTR_HT                          ADC_HTR_HT_Msk                     /*!< ADC analog watchdog 1 threshold high */\n\n/*******************  Bit definition for ADC_LTR register  ********************/\n#define ADC_LTR_LT_Pos                      (0U)                               \n#define ADC_LTR_LT_Msk                      (0xFFFUL << ADC_LTR_LT_Pos)         /*!< 0x00000FFF */\n#define ADC_LTR_LT                          ADC_LTR_LT_Msk                     /*!< ADC analog watchdog 1 threshold low */\n\n/*******************  Bit definition for ADC_SQR1 register  *******************/\n#define ADC_SQR1_SQ13_Pos                   (0U)                               \n#define ADC_SQR1_SQ13_Msk                   (0x1FUL << ADC_SQR1_SQ13_Pos)       /*!< 0x0000001F */\n#define ADC_SQR1_SQ13                       ADC_SQR1_SQ13_Msk                  /*!< ADC group regular sequencer rank 13 */\n#define ADC_SQR1_SQ13_0                     (0x01UL << ADC_SQR1_SQ13_Pos)       /*!< 0x00000001 */\n#define ADC_SQR1_SQ13_1                     (0x02UL << ADC_SQR1_SQ13_Pos)       /*!< 0x00000002 */\n#define ADC_SQR1_SQ13_2                     (0x04UL << ADC_SQR1_SQ13_Pos)       /*!< 0x00000004 */\n#define ADC_SQR1_SQ13_3                     (0x08UL << ADC_SQR1_SQ13_Pos)       /*!< 0x00000008 */\n#define ADC_SQR1_SQ13_4                     (0x10UL << ADC_SQR1_SQ13_Pos)       /*!< 0x00000010 */\n\n#define ADC_SQR1_SQ14_Pos                   (5U)                               \n#define ADC_SQR1_SQ14_Msk                   (0x1FUL << ADC_SQR1_SQ14_Pos)       /*!< 0x000003E0 */\n#define ADC_SQR1_SQ14                       ADC_SQR1_SQ14_Msk                  /*!< ADC group regular sequencer rank 14 */\n#define ADC_SQR1_SQ14_0                     (0x01UL << ADC_SQR1_SQ14_Pos)       /*!< 0x00000020 */\n#define ADC_SQR1_SQ14_1                     (0x02UL << ADC_SQR1_SQ14_Pos)       /*!< 0x00000040 */\n#define ADC_SQR1_SQ14_2                     (0x04UL << ADC_SQR1_SQ14_Pos)       /*!< 0x00000080 */\n#define ADC_SQR1_SQ14_3                     (0x08UL << ADC_SQR1_SQ14_Pos)       /*!< 0x00000100 */\n#define ADC_SQR1_SQ14_4                     (0x10UL << ADC_SQR1_SQ14_Pos)       /*!< 0x00000200 */\n\n#define ADC_SQR1_SQ15_Pos                   (10U)                              \n#define ADC_SQR1_SQ15_Msk                   (0x1FUL << ADC_SQR1_SQ15_Pos)       /*!< 0x00007C00 */\n#define ADC_SQR1_SQ15                       ADC_SQR1_SQ15_Msk                  /*!< ADC group regular sequencer rank 15 */\n#define ADC_SQR1_SQ15_0                     (0x01UL << ADC_SQR1_SQ15_Pos)       /*!< 0x00000400 */\n#define ADC_SQR1_SQ15_1                     (0x02UL << ADC_SQR1_SQ15_Pos)       /*!< 0x00000800 */\n#define ADC_SQR1_SQ15_2                     (0x04UL << ADC_SQR1_SQ15_Pos)       /*!< 0x00001000 */\n#define ADC_SQR1_SQ15_3                     (0x08UL << ADC_SQR1_SQ15_Pos)       /*!< 0x00002000 */\n#define ADC_SQR1_SQ15_4                     (0x10UL << ADC_SQR1_SQ15_Pos)       /*!< 0x00004000 */\n\n#define ADC_SQR1_SQ16_Pos                   (15U)                              \n#define ADC_SQR1_SQ16_Msk                   (0x1FUL << ADC_SQR1_SQ16_Pos)       /*!< 0x000F8000 */\n#define ADC_SQR1_SQ16                       ADC_SQR1_SQ16_Msk                  /*!< ADC group regular sequencer rank 16 */\n#define ADC_SQR1_SQ16_0                     (0x01UL << ADC_SQR1_SQ16_Pos)       /*!< 0x00008000 */\n#define ADC_SQR1_SQ16_1                     (0x02UL << ADC_SQR1_SQ16_Pos)       /*!< 0x00010000 */\n#define ADC_SQR1_SQ16_2                     (0x04UL << ADC_SQR1_SQ16_Pos)       /*!< 0x00020000 */\n#define ADC_SQR1_SQ16_3                     (0x08UL << ADC_SQR1_SQ16_Pos)       /*!< 0x00040000 */\n#define ADC_SQR1_SQ16_4                     (0x10UL << ADC_SQR1_SQ16_Pos)       /*!< 0x00080000 */\n\n#define ADC_SQR1_L_Pos                      (20U)                              \n#define ADC_SQR1_L_Msk                      (0xFUL << ADC_SQR1_L_Pos)           /*!< 0x00F00000 */\n#define ADC_SQR1_L                          ADC_SQR1_L_Msk                     /*!< ADC group regular sequencer scan length */\n#define ADC_SQR1_L_0                        (0x1UL << ADC_SQR1_L_Pos)           /*!< 0x00100000 */\n#define ADC_SQR1_L_1                        (0x2UL << ADC_SQR1_L_Pos)           /*!< 0x00200000 */\n#define ADC_SQR1_L_2                        (0x4UL << ADC_SQR1_L_Pos)           /*!< 0x00400000 */\n#define ADC_SQR1_L_3                        (0x8UL << ADC_SQR1_L_Pos)           /*!< 0x00800000 */\n\n/*******************  Bit definition for ADC_SQR2 register  *******************/\n#define ADC_SQR2_SQ7_Pos                    (0U)                               \n#define ADC_SQR2_SQ7_Msk                    (0x1FUL << ADC_SQR2_SQ7_Pos)        /*!< 0x0000001F */\n#define ADC_SQR2_SQ7                        ADC_SQR2_SQ7_Msk                   /*!< ADC group regular sequencer rank 7 */\n#define ADC_SQR2_SQ7_0                      (0x01UL << ADC_SQR2_SQ7_Pos)        /*!< 0x00000001 */\n#define ADC_SQR2_SQ7_1                      (0x02UL << ADC_SQR2_SQ7_Pos)        /*!< 0x00000002 */\n#define ADC_SQR2_SQ7_2                      (0x04UL << ADC_SQR2_SQ7_Pos)        /*!< 0x00000004 */\n#define ADC_SQR2_SQ7_3                      (0x08UL << ADC_SQR2_SQ7_Pos)        /*!< 0x00000008 */\n#define ADC_SQR2_SQ7_4                      (0x10UL << ADC_SQR2_SQ7_Pos)        /*!< 0x00000010 */\n\n#define ADC_SQR2_SQ8_Pos                    (5U)                               \n#define ADC_SQR2_SQ8_Msk                    (0x1FUL << ADC_SQR2_SQ8_Pos)        /*!< 0x000003E0 */\n#define ADC_SQR2_SQ8                        ADC_SQR2_SQ8_Msk                   /*!< ADC group regular sequencer rank 8 */\n#define ADC_SQR2_SQ8_0                      (0x01UL << ADC_SQR2_SQ8_Pos)        /*!< 0x00000020 */\n#define ADC_SQR2_SQ8_1                      (0x02UL << ADC_SQR2_SQ8_Pos)        /*!< 0x00000040 */\n#define ADC_SQR2_SQ8_2                      (0x04UL << ADC_SQR2_SQ8_Pos)        /*!< 0x00000080 */\n#define ADC_SQR2_SQ8_3                      (0x08UL << ADC_SQR2_SQ8_Pos)        /*!< 0x00000100 */\n#define ADC_SQR2_SQ8_4                      (0x10UL << ADC_SQR2_SQ8_Pos)        /*!< 0x00000200 */\n\n#define ADC_SQR2_SQ9_Pos                    (10U)                              \n#define ADC_SQR2_SQ9_Msk                    (0x1FUL << ADC_SQR2_SQ9_Pos)        /*!< 0x00007C00 */\n#define ADC_SQR2_SQ9                        ADC_SQR2_SQ9_Msk                   /*!< ADC group regular sequencer rank 9 */\n#define ADC_SQR2_SQ9_0                      (0x01UL << ADC_SQR2_SQ9_Pos)        /*!< 0x00000400 */\n#define ADC_SQR2_SQ9_1                      (0x02UL << ADC_SQR2_SQ9_Pos)        /*!< 0x00000800 */\n#define ADC_SQR2_SQ9_2                      (0x04UL << ADC_SQR2_SQ9_Pos)        /*!< 0x00001000 */\n#define ADC_SQR2_SQ9_3                      (0x08UL << ADC_SQR2_SQ9_Pos)        /*!< 0x00002000 */\n#define ADC_SQR2_SQ9_4                      (0x10UL << ADC_SQR2_SQ9_Pos)        /*!< 0x00004000 */\n\n#define ADC_SQR2_SQ10_Pos                   (15U)                              \n#define ADC_SQR2_SQ10_Msk                   (0x1FUL << ADC_SQR2_SQ10_Pos)       /*!< 0x000F8000 */\n#define ADC_SQR2_SQ10                       ADC_SQR2_SQ10_Msk                  /*!< ADC group regular sequencer rank 10 */\n#define ADC_SQR2_SQ10_0                     (0x01UL << ADC_SQR2_SQ10_Pos)       /*!< 0x00008000 */\n#define ADC_SQR2_SQ10_1                     (0x02UL << ADC_SQR2_SQ10_Pos)       /*!< 0x00010000 */\n#define ADC_SQR2_SQ10_2                     (0x04UL << ADC_SQR2_SQ10_Pos)       /*!< 0x00020000 */\n#define ADC_SQR2_SQ10_3                     (0x08UL << ADC_SQR2_SQ10_Pos)       /*!< 0x00040000 */\n#define ADC_SQR2_SQ10_4                     (0x10UL << ADC_SQR2_SQ10_Pos)       /*!< 0x00080000 */\n\n#define ADC_SQR2_SQ11_Pos                   (20U)                              \n#define ADC_SQR2_SQ11_Msk                   (0x1FUL << ADC_SQR2_SQ11_Pos)       /*!< 0x01F00000 */\n#define ADC_SQR2_SQ11                       ADC_SQR2_SQ11_Msk                  /*!< ADC group regular sequencer rank 1 */\n#define ADC_SQR2_SQ11_0                     (0x01UL << ADC_SQR2_SQ11_Pos)       /*!< 0x00100000 */\n#define ADC_SQR2_SQ11_1                     (0x02UL << ADC_SQR2_SQ11_Pos)       /*!< 0x00200000 */\n#define ADC_SQR2_SQ11_2                     (0x04UL << ADC_SQR2_SQ11_Pos)       /*!< 0x00400000 */\n#define ADC_SQR2_SQ11_3                     (0x08UL << ADC_SQR2_SQ11_Pos)       /*!< 0x00800000 */\n#define ADC_SQR2_SQ11_4                     (0x10UL << ADC_SQR2_SQ11_Pos)       /*!< 0x01000000 */\n\n#define ADC_SQR2_SQ12_Pos                   (25U)                              \n#define ADC_SQR2_SQ12_Msk                   (0x1FUL << ADC_SQR2_SQ12_Pos)       /*!< 0x3E000000 */\n#define ADC_SQR2_SQ12                       ADC_SQR2_SQ12_Msk                  /*!< ADC group regular sequencer rank 12 */\n#define ADC_SQR2_SQ12_0                     (0x01UL << ADC_SQR2_SQ12_Pos)       /*!< 0x02000000 */\n#define ADC_SQR2_SQ12_1                     (0x02UL << ADC_SQR2_SQ12_Pos)       /*!< 0x04000000 */\n#define ADC_SQR2_SQ12_2                     (0x04UL << ADC_SQR2_SQ12_Pos)       /*!< 0x08000000 */\n#define ADC_SQR2_SQ12_3                     (0x08UL << ADC_SQR2_SQ12_Pos)       /*!< 0x10000000 */\n#define ADC_SQR2_SQ12_4                     (0x10UL << ADC_SQR2_SQ12_Pos)       /*!< 0x20000000 */\n\n/*******************  Bit definition for ADC_SQR3 register  *******************/\n#define ADC_SQR3_SQ1_Pos                    (0U)                               \n#define ADC_SQR3_SQ1_Msk                    (0x1FUL << ADC_SQR3_SQ1_Pos)        /*!< 0x0000001F */\n#define ADC_SQR3_SQ1                        ADC_SQR3_SQ1_Msk                   /*!< ADC group regular sequencer rank 1 */\n#define ADC_SQR3_SQ1_0                      (0x01UL << ADC_SQR3_SQ1_Pos)        /*!< 0x00000001 */\n#define ADC_SQR3_SQ1_1                      (0x02UL << ADC_SQR3_SQ1_Pos)        /*!< 0x00000002 */\n#define ADC_SQR3_SQ1_2                      (0x04UL << ADC_SQR3_SQ1_Pos)        /*!< 0x00000004 */\n#define ADC_SQR3_SQ1_3                      (0x08UL << ADC_SQR3_SQ1_Pos)        /*!< 0x00000008 */\n#define ADC_SQR3_SQ1_4                      (0x10UL << ADC_SQR3_SQ1_Pos)        /*!< 0x00000010 */\n\n#define ADC_SQR3_SQ2_Pos                    (5U)                               \n#define ADC_SQR3_SQ2_Msk                    (0x1FUL << ADC_SQR3_SQ2_Pos)        /*!< 0x000003E0 */\n#define ADC_SQR3_SQ2                        ADC_SQR3_SQ2_Msk                   /*!< ADC group regular sequencer rank 2 */\n#define ADC_SQR3_SQ2_0                      (0x01UL << ADC_SQR3_SQ2_Pos)        /*!< 0x00000020 */\n#define ADC_SQR3_SQ2_1                      (0x02UL << ADC_SQR3_SQ2_Pos)        /*!< 0x00000040 */\n#define ADC_SQR3_SQ2_2                      (0x04UL << ADC_SQR3_SQ2_Pos)        /*!< 0x00000080 */\n#define ADC_SQR3_SQ2_3                      (0x08UL << ADC_SQR3_SQ2_Pos)        /*!< 0x00000100 */\n#define ADC_SQR3_SQ2_4                      (0x10UL << ADC_SQR3_SQ2_Pos)        /*!< 0x00000200 */\n\n#define ADC_SQR3_SQ3_Pos                    (10U)                              \n#define ADC_SQR3_SQ3_Msk                    (0x1FUL << ADC_SQR3_SQ3_Pos)        /*!< 0x00007C00 */\n#define ADC_SQR3_SQ3                        ADC_SQR3_SQ3_Msk                   /*!< ADC group regular sequencer rank 3 */\n#define ADC_SQR3_SQ3_0                      (0x01UL << ADC_SQR3_SQ3_Pos)        /*!< 0x00000400 */\n#define ADC_SQR3_SQ3_1                      (0x02UL << ADC_SQR3_SQ3_Pos)        /*!< 0x00000800 */\n#define ADC_SQR3_SQ3_2                      (0x04UL << ADC_SQR3_SQ3_Pos)        /*!< 0x00001000 */\n#define ADC_SQR3_SQ3_3                      (0x08UL << ADC_SQR3_SQ3_Pos)        /*!< 0x00002000 */\n#define ADC_SQR3_SQ3_4                      (0x10UL << ADC_SQR3_SQ3_Pos)        /*!< 0x00004000 */\n\n#define ADC_SQR3_SQ4_Pos                    (15U)                              \n#define ADC_SQR3_SQ4_Msk                    (0x1FUL << ADC_SQR3_SQ4_Pos)        /*!< 0x000F8000 */\n#define ADC_SQR3_SQ4                        ADC_SQR3_SQ4_Msk                   /*!< ADC group regular sequencer rank 4 */\n#define ADC_SQR3_SQ4_0                      (0x01UL << ADC_SQR3_SQ4_Pos)        /*!< 0x00008000 */\n#define ADC_SQR3_SQ4_1                      (0x02UL << ADC_SQR3_SQ4_Pos)        /*!< 0x00010000 */\n#define ADC_SQR3_SQ4_2                      (0x04UL << ADC_SQR3_SQ4_Pos)        /*!< 0x00020000 */\n#define ADC_SQR3_SQ4_3                      (0x08UL << ADC_SQR3_SQ4_Pos)        /*!< 0x00040000 */\n#define ADC_SQR3_SQ4_4                      (0x10UL << ADC_SQR3_SQ4_Pos)        /*!< 0x00080000 */\n\n#define ADC_SQR3_SQ5_Pos                    (20U)                              \n#define ADC_SQR3_SQ5_Msk                    (0x1FUL << ADC_SQR3_SQ5_Pos)        /*!< 0x01F00000 */\n#define ADC_SQR3_SQ5                        ADC_SQR3_SQ5_Msk                   /*!< ADC group regular sequencer rank 5 */\n#define ADC_SQR3_SQ5_0                      (0x01UL << ADC_SQR3_SQ5_Pos)        /*!< 0x00100000 */\n#define ADC_SQR3_SQ5_1                      (0x02UL << ADC_SQR3_SQ5_Pos)        /*!< 0x00200000 */\n#define ADC_SQR3_SQ5_2                      (0x04UL << ADC_SQR3_SQ5_Pos)        /*!< 0x00400000 */\n#define ADC_SQR3_SQ5_3                      (0x08UL << ADC_SQR3_SQ5_Pos)        /*!< 0x00800000 */\n#define ADC_SQR3_SQ5_4                      (0x10UL << ADC_SQR3_SQ5_Pos)        /*!< 0x01000000 */\n\n#define ADC_SQR3_SQ6_Pos                    (25U)                              \n#define ADC_SQR3_SQ6_Msk                    (0x1FUL << ADC_SQR3_SQ6_Pos)        /*!< 0x3E000000 */\n#define ADC_SQR3_SQ6                        ADC_SQR3_SQ6_Msk                   /*!< ADC group regular sequencer rank 6 */\n#define ADC_SQR3_SQ6_0                      (0x01UL << ADC_SQR3_SQ6_Pos)        /*!< 0x02000000 */\n#define ADC_SQR3_SQ6_1                      (0x02UL << ADC_SQR3_SQ6_Pos)        /*!< 0x04000000 */\n#define ADC_SQR3_SQ6_2                      (0x04UL << ADC_SQR3_SQ6_Pos)        /*!< 0x08000000 */\n#define ADC_SQR3_SQ6_3                      (0x08UL << ADC_SQR3_SQ6_Pos)        /*!< 0x10000000 */\n#define ADC_SQR3_SQ6_4                      (0x10UL << ADC_SQR3_SQ6_Pos)        /*!< 0x20000000 */\n\n/*******************  Bit definition for ADC_JSQR register  *******************/\n#define ADC_JSQR_JSQ1_Pos                   (0U)                               \n#define ADC_JSQR_JSQ1_Msk                   (0x1FUL << ADC_JSQR_JSQ1_Pos)       /*!< 0x0000001F */\n#define ADC_JSQR_JSQ1                       ADC_JSQR_JSQ1_Msk                  /*!< ADC group injected sequencer rank 1 */\n#define ADC_JSQR_JSQ1_0                     (0x01UL << ADC_JSQR_JSQ1_Pos)       /*!< 0x00000001 */\n#define ADC_JSQR_JSQ1_1                     (0x02UL << ADC_JSQR_JSQ1_Pos)       /*!< 0x00000002 */\n#define ADC_JSQR_JSQ1_2                     (0x04UL << ADC_JSQR_JSQ1_Pos)       /*!< 0x00000004 */\n#define ADC_JSQR_JSQ1_3                     (0x08UL << ADC_JSQR_JSQ1_Pos)       /*!< 0x00000008 */\n#define ADC_JSQR_JSQ1_4                     (0x10UL << ADC_JSQR_JSQ1_Pos)       /*!< 0x00000010 */\n\n#define ADC_JSQR_JSQ2_Pos                   (5U)                               \n#define ADC_JSQR_JSQ2_Msk                   (0x1FUL << ADC_JSQR_JSQ2_Pos)       /*!< 0x000003E0 */\n#define ADC_JSQR_JSQ2                       ADC_JSQR_JSQ2_Msk                  /*!< ADC group injected sequencer rank 2 */\n#define ADC_JSQR_JSQ2_0                     (0x01UL << ADC_JSQR_JSQ2_Pos)       /*!< 0x00000020 */\n#define ADC_JSQR_JSQ2_1                     (0x02UL << ADC_JSQR_JSQ2_Pos)       /*!< 0x00000040 */\n#define ADC_JSQR_JSQ2_2                     (0x04UL << ADC_JSQR_JSQ2_Pos)       /*!< 0x00000080 */\n#define ADC_JSQR_JSQ2_3                     (0x08UL << ADC_JSQR_JSQ2_Pos)       /*!< 0x00000100 */\n#define ADC_JSQR_JSQ2_4                     (0x10UL << ADC_JSQR_JSQ2_Pos)       /*!< 0x00000200 */\n\n#define ADC_JSQR_JSQ3_Pos                   (10U)                              \n#define ADC_JSQR_JSQ3_Msk                   (0x1FUL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00007C00 */\n#define ADC_JSQR_JSQ3                       ADC_JSQR_JSQ3_Msk                  /*!< ADC group injected sequencer rank 3 */\n#define ADC_JSQR_JSQ3_0                     (0x01UL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00000400 */\n#define ADC_JSQR_JSQ3_1                     (0x02UL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00000800 */\n#define ADC_JSQR_JSQ3_2                     (0x04UL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00001000 */\n#define ADC_JSQR_JSQ3_3                     (0x08UL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00002000 */\n#define ADC_JSQR_JSQ3_4                     (0x10UL << ADC_JSQR_JSQ3_Pos)       /*!< 0x00004000 */\n\n#define ADC_JSQR_JSQ4_Pos                   (15U)                              \n#define ADC_JSQR_JSQ4_Msk                   (0x1FUL << ADC_JSQR_JSQ4_Pos)       /*!< 0x000F8000 */\n#define ADC_JSQR_JSQ4                       ADC_JSQR_JSQ4_Msk                  /*!< ADC group injected sequencer rank 4 */\n#define ADC_JSQR_JSQ4_0                     (0x01UL << ADC_JSQR_JSQ4_Pos)       /*!< 0x00008000 */\n#define ADC_JSQR_JSQ4_1                     (0x02UL << ADC_JSQR_JSQ4_Pos)       /*!< 0x00010000 */\n#define ADC_JSQR_JSQ4_2                     (0x04UL << ADC_JSQR_JSQ4_Pos)       /*!< 0x00020000 */\n#define ADC_JSQR_JSQ4_3                     (0x08UL << ADC_JSQR_JSQ4_Pos)       /*!< 0x00040000 */\n#define ADC_JSQR_JSQ4_4                     (0x10UL << ADC_JSQR_JSQ4_Pos)       /*!< 0x00080000 */\n\n#define ADC_JSQR_JL_Pos                     (20U)                              \n#define ADC_JSQR_JL_Msk                     (0x3UL << ADC_JSQR_JL_Pos)          /*!< 0x00300000 */\n#define ADC_JSQR_JL                         ADC_JSQR_JL_Msk                    /*!< ADC group injected sequencer scan length */\n#define ADC_JSQR_JL_0                       (0x1UL << ADC_JSQR_JL_Pos)          /*!< 0x00100000 */\n#define ADC_JSQR_JL_1                       (0x2UL << ADC_JSQR_JL_Pos)          /*!< 0x00200000 */\n\n/*******************  Bit definition for ADC_JDR1 register  *******************/\n#define ADC_JDR1_JDATA_Pos                  (0U)                               \n#define ADC_JDR1_JDATA_Msk                  (0xFFFFUL << ADC_JDR1_JDATA_Pos)    /*!< 0x0000FFFF */\n#define ADC_JDR1_JDATA                      ADC_JDR1_JDATA_Msk                 /*!< ADC group injected sequencer rank 1 conversion data */\n\n/*******************  Bit definition for ADC_JDR2 register  *******************/\n#define ADC_JDR2_JDATA_Pos                  (0U)                               \n#define ADC_JDR2_JDATA_Msk                  (0xFFFFUL << ADC_JDR2_JDATA_Pos)    /*!< 0x0000FFFF */\n#define ADC_JDR2_JDATA                      ADC_JDR2_JDATA_Msk                 /*!< ADC group injected sequencer rank 2 conversion data */\n\n/*******************  Bit definition for ADC_JDR3 register  *******************/\n#define ADC_JDR3_JDATA_Pos                  (0U)                               \n#define ADC_JDR3_JDATA_Msk                  (0xFFFFUL << ADC_JDR3_JDATA_Pos)    /*!< 0x0000FFFF */\n#define ADC_JDR3_JDATA                      ADC_JDR3_JDATA_Msk                 /*!< ADC group injected sequencer rank 3 conversion data */\n\n/*******************  Bit definition for ADC_JDR4 register  *******************/\n#define ADC_JDR4_JDATA_Pos                  (0U)                               \n#define ADC_JDR4_JDATA_Msk                  (0xFFFFUL << ADC_JDR4_JDATA_Pos)    /*!< 0x0000FFFF */\n#define ADC_JDR4_JDATA                      ADC_JDR4_JDATA_Msk                 /*!< ADC group injected sequencer rank 4 conversion data */\n\n/********************  Bit definition for ADC_DR register  ********************/\n#define ADC_DR_DATA_Pos                     (0U)                               \n#define ADC_DR_DATA_Msk                     (0xFFFFUL << ADC_DR_DATA_Pos)       /*!< 0x0000FFFF */\n#define ADC_DR_DATA                         ADC_DR_DATA_Msk                    /*!< ADC group regular conversion data */\n#define ADC_DR_ADC2DATA_Pos                 (16U)                              \n#define ADC_DR_ADC2DATA_Msk                 (0xFFFFUL << ADC_DR_ADC2DATA_Pos)   /*!< 0xFFFF0000 */\n#define ADC_DR_ADC2DATA                     ADC_DR_ADC2DATA_Msk                /*!< ADC group regular conversion data for ADC slave, in multimode */\n/******************************************************************************/\n/*                                                                            */\n/*                      Digital to Analog Converter                           */\n/*                                                                            */\n/******************************************************************************/\n\n/********************  Bit definition for DAC_CR register  ********************/\n#define DAC_CR_EN1_Pos                      (0U)                               \n#define DAC_CR_EN1_Msk                      (0x1UL << DAC_CR_EN1_Pos)           /*!< 0x00000001 */\n#define DAC_CR_EN1                          DAC_CR_EN1_Msk                     /*!< DAC channel1 enable */\n#define DAC_CR_BOFF1_Pos                    (1U)                               \n#define DAC_CR_BOFF1_Msk                    (0x1UL << DAC_CR_BOFF1_Pos)         /*!< 0x00000002 */\n#define DAC_CR_BOFF1                        DAC_CR_BOFF1_Msk                   /*!< DAC channel1 output buffer disable */\n#define DAC_CR_TEN1_Pos                     (2U)                               \n#define DAC_CR_TEN1_Msk                     (0x1UL << DAC_CR_TEN1_Pos)          /*!< 0x00000004 */\n#define DAC_CR_TEN1                         DAC_CR_TEN1_Msk                    /*!< DAC channel1 Trigger enable */\n\n#define DAC_CR_TSEL1_Pos                    (3U)                               \n#define DAC_CR_TSEL1_Msk                    (0x7UL << DAC_CR_TSEL1_Pos)         /*!< 0x00000038 */\n#define DAC_CR_TSEL1                        DAC_CR_TSEL1_Msk                   /*!< TSEL1[2:0] (DAC channel1 Trigger selection) */\n#define DAC_CR_TSEL1_0                      (0x1UL << DAC_CR_TSEL1_Pos)         /*!< 0x00000008 */\n#define DAC_CR_TSEL1_1                      (0x2UL << DAC_CR_TSEL1_Pos)         /*!< 0x00000010 */\n#define DAC_CR_TSEL1_2                      (0x4UL << DAC_CR_TSEL1_Pos)         /*!< 0x00000020 */\n\n#define DAC_CR_WAVE1_Pos                    (6U)                               \n#define DAC_CR_WAVE1_Msk                    (0x3UL << DAC_CR_WAVE1_Pos)         /*!< 0x000000C0 */\n#define DAC_CR_WAVE1                        DAC_CR_WAVE1_Msk                   /*!< WAVE1[1:0] (DAC channel1 noise/triangle wave generation enable) */\n#define DAC_CR_WAVE1_0                      (0x1UL << DAC_CR_WAVE1_Pos)         /*!< 0x00000040 */\n#define DAC_CR_WAVE1_1                      (0x2UL << DAC_CR_WAVE1_Pos)         /*!< 0x00000080 */\n\n#define DAC_CR_MAMP1_Pos                    (8U)                               \n#define DAC_CR_MAMP1_Msk                    (0xFUL << DAC_CR_MAMP1_Pos)         /*!< 0x00000F00 */\n#define DAC_CR_MAMP1                        DAC_CR_MAMP1_Msk                   /*!< MAMP1[3:0] (DAC channel1 Mask/Amplitude selector) */\n#define DAC_CR_MAMP1_0                      (0x1UL << DAC_CR_MAMP1_Pos)         /*!< 0x00000100 */\n#define DAC_CR_MAMP1_1                      (0x2UL << DAC_CR_MAMP1_Pos)         /*!< 0x00000200 */\n#define DAC_CR_MAMP1_2                      (0x4UL << DAC_CR_MAMP1_Pos)         /*!< 0x00000400 */\n#define DAC_CR_MAMP1_3                      (0x8UL << DAC_CR_MAMP1_Pos)         /*!< 0x00000800 */\n\n#define DAC_CR_DMAEN1_Pos                   (12U)                              \n#define DAC_CR_DMAEN1_Msk                   (0x1UL << DAC_CR_DMAEN1_Pos)        /*!< 0x00001000 */\n#define DAC_CR_DMAEN1                       DAC_CR_DMAEN1_Msk                  /*!< DAC channel1 DMA enable */\n#define DAC_CR_EN2_Pos                      (16U)                              \n#define DAC_CR_EN2_Msk                      (0x1UL << DAC_CR_EN2_Pos)           /*!< 0x00010000 */\n#define DAC_CR_EN2                          DAC_CR_EN2_Msk                     /*!< DAC channel2 enable */\n#define DAC_CR_BOFF2_Pos                    (17U)                              \n#define DAC_CR_BOFF2_Msk                    (0x1UL << DAC_CR_BOFF2_Pos)         /*!< 0x00020000 */\n#define DAC_CR_BOFF2                        DAC_CR_BOFF2_Msk                   /*!< DAC channel2 output buffer disable */\n#define DAC_CR_TEN2_Pos                     (18U)                              \n#define DAC_CR_TEN2_Msk                     (0x1UL << DAC_CR_TEN2_Pos)          /*!< 0x00040000 */\n#define DAC_CR_TEN2                         DAC_CR_TEN2_Msk                    /*!< DAC channel2 Trigger enable */\n\n#define DAC_CR_TSEL2_Pos                    (19U)                              \n#define DAC_CR_TSEL2_Msk                    (0x7UL << DAC_CR_TSEL2_Pos)         /*!< 0x00380000 */\n#define DAC_CR_TSEL2                        DAC_CR_TSEL2_Msk                   /*!< TSEL2[2:0] (DAC channel2 Trigger selection) */\n#define DAC_CR_TSEL2_0                      (0x1UL << DAC_CR_TSEL2_Pos)         /*!< 0x00080000 */\n#define DAC_CR_TSEL2_1                      (0x2UL << DAC_CR_TSEL2_Pos)         /*!< 0x00100000 */\n#define DAC_CR_TSEL2_2                      (0x4UL << DAC_CR_TSEL2_Pos)         /*!< 0x00200000 */\n\n#define DAC_CR_WAVE2_Pos                    (22U)                              \n#define DAC_CR_WAVE2_Msk                    (0x3UL << DAC_CR_WAVE2_Pos)         /*!< 0x00C00000 */\n#define DAC_CR_WAVE2                        DAC_CR_WAVE2_Msk                   /*!< WAVE2[1:0] (DAC channel2 noise/triangle wave generation enable) */\n#define DAC_CR_WAVE2_0                      (0x1UL << DAC_CR_WAVE2_Pos)         /*!< 0x00400000 */\n#define DAC_CR_WAVE2_1                      (0x2UL << DAC_CR_WAVE2_Pos)         /*!< 0x00800000 */\n\n#define DAC_CR_MAMP2_Pos                    (24U)                              \n#define DAC_CR_MAMP2_Msk                    (0xFUL << DAC_CR_MAMP2_Pos)         /*!< 0x0F000000 */\n#define DAC_CR_MAMP2                        DAC_CR_MAMP2_Msk                   /*!< MAMP2[3:0] (DAC channel2 Mask/Amplitude selector) */\n#define DAC_CR_MAMP2_0                      (0x1UL << DAC_CR_MAMP2_Pos)         /*!< 0x01000000 */\n#define DAC_CR_MAMP2_1                      (0x2UL << DAC_CR_MAMP2_Pos)         /*!< 0x02000000 */\n#define DAC_CR_MAMP2_2                      (0x4UL << DAC_CR_MAMP2_Pos)         /*!< 0x04000000 */\n#define DAC_CR_MAMP2_3                      (0x8UL << DAC_CR_MAMP2_Pos)         /*!< 0x08000000 */\n\n#define DAC_CR_DMAEN2_Pos                   (28U)                              \n#define DAC_CR_DMAEN2_Msk                   (0x1UL << DAC_CR_DMAEN2_Pos)        /*!< 0x10000000 */\n#define DAC_CR_DMAEN2                       DAC_CR_DMAEN2_Msk                  /*!< DAC channel2 DMA enabled */\n\n\n/*****************  Bit definition for DAC_SWTRIGR register  ******************/\n#define DAC_SWTRIGR_SWTRIG1_Pos             (0U)                               \n#define DAC_SWTRIGR_SWTRIG1_Msk             (0x1UL << DAC_SWTRIGR_SWTRIG1_Pos)  /*!< 0x00000001 */\n#define DAC_SWTRIGR_SWTRIG1                 DAC_SWTRIGR_SWTRIG1_Msk            /*!< DAC channel1 software trigger */\n#define DAC_SWTRIGR_SWTRIG2_Pos             (1U)                               \n#define DAC_SWTRIGR_SWTRIG2_Msk             (0x1UL << DAC_SWTRIGR_SWTRIG2_Pos)  /*!< 0x00000002 */\n#define DAC_SWTRIGR_SWTRIG2                 DAC_SWTRIGR_SWTRIG2_Msk            /*!< DAC channel2 software trigger */\n\n/*****************  Bit definition for DAC_DHR12R1 register  ******************/\n#define DAC_DHR12R1_DACC1DHR_Pos            (0U)                               \n#define DAC_DHR12R1_DACC1DHR_Msk            (0xFFFUL << DAC_DHR12R1_DACC1DHR_Pos) /*!< 0x00000FFF */\n#define DAC_DHR12R1_DACC1DHR                DAC_DHR12R1_DACC1DHR_Msk           /*!< DAC channel1 12-bit Right aligned data */\n\n/*****************  Bit definition for DAC_DHR12L1 register  ******************/\n#define DAC_DHR12L1_DACC1DHR_Pos            (4U)                               \n#define DAC_DHR12L1_DACC1DHR_Msk            (0xFFFUL << DAC_DHR12L1_DACC1DHR_Pos) /*!< 0x0000FFF0 */\n#define DAC_DHR12L1_DACC1DHR                DAC_DHR12L1_DACC1DHR_Msk           /*!< DAC channel1 12-bit Left aligned data */\n\n/******************  Bit definition for DAC_DHR8R1 register  ******************/\n#define DAC_DHR8R1_DACC1DHR_Pos             (0U)                               \n#define DAC_DHR8R1_DACC1DHR_Msk             (0xFFUL << DAC_DHR8R1_DACC1DHR_Pos) /*!< 0x000000FF */\n#define DAC_DHR8R1_DACC1DHR                 DAC_DHR8R1_DACC1DHR_Msk            /*!< DAC channel1 8-bit Right aligned data */\n\n/*****************  Bit definition for DAC_DHR12R2 register  ******************/\n#define DAC_DHR12R2_DACC2DHR_Pos            (0U)                               \n#define DAC_DHR12R2_DACC2DHR_Msk            (0xFFFUL << DAC_DHR12R2_DACC2DHR_Pos) /*!< 0x00000FFF */\n#define DAC_DHR12R2_DACC2DHR                DAC_DHR12R2_DACC2DHR_Msk           /*!< DAC channel2 12-bit Right aligned data */\n\n/*****************  Bit definition for DAC_DHR12L2 register  ******************/\n#define DAC_DHR12L2_DACC2DHR_Pos            (4U)                               \n#define DAC_DHR12L2_DACC2DHR_Msk            (0xFFFUL << DAC_DHR12L2_DACC2DHR_Pos) /*!< 0x0000FFF0 */\n#define DAC_DHR12L2_DACC2DHR                DAC_DHR12L2_DACC2DHR_Msk           /*!< DAC channel2 12-bit Left aligned data */\n\n/******************  Bit definition for DAC_DHR8R2 register  ******************/\n#define DAC_DHR8R2_DACC2DHR_Pos             (0U)                               \n#define DAC_DHR8R2_DACC2DHR_Msk             (0xFFUL << DAC_DHR8R2_DACC2DHR_Pos) /*!< 0x000000FF */\n#define DAC_DHR8R2_DACC2DHR                 DAC_DHR8R2_DACC2DHR_Msk            /*!< DAC channel2 8-bit Right aligned data */\n\n/*****************  Bit definition for DAC_DHR12RD register  ******************/\n#define DAC_DHR12RD_DACC1DHR_Pos            (0U)                               \n#define DAC_DHR12RD_DACC1DHR_Msk            (0xFFFUL << DAC_DHR12RD_DACC1DHR_Pos) /*!< 0x00000FFF */\n#define DAC_DHR12RD_DACC1DHR                DAC_DHR12RD_DACC1DHR_Msk           /*!< DAC channel1 12-bit Right aligned data */\n#define DAC_DHR12RD_DACC2DHR_Pos            (16U)                              \n#define DAC_DHR12RD_DACC2DHR_Msk            (0xFFFUL << DAC_DHR12RD_DACC2DHR_Pos) /*!< 0x0FFF0000 */\n#define DAC_DHR12RD_DACC2DHR                DAC_DHR12RD_DACC2DHR_Msk           /*!< DAC channel2 12-bit Right aligned data */\n\n/*****************  Bit definition for DAC_DHR12LD register  ******************/\n#define DAC_DHR12LD_DACC1DHR_Pos            (4U)                               \n#define DAC_DHR12LD_DACC1DHR_Msk            (0xFFFUL << DAC_DHR12LD_DACC1DHR_Pos) /*!< 0x0000FFF0 */\n#define DAC_DHR12LD_DACC1DHR                DAC_DHR12LD_DACC1DHR_Msk           /*!< DAC channel1 12-bit Left aligned data */\n#define DAC_DHR12LD_DACC2DHR_Pos            (20U)                              \n#define DAC_DHR12LD_DACC2DHR_Msk            (0xFFFUL << DAC_DHR12LD_DACC2DHR_Pos) /*!< 0xFFF00000 */\n#define DAC_DHR12LD_DACC2DHR                DAC_DHR12LD_DACC2DHR_Msk           /*!< DAC channel2 12-bit Left aligned data */\n\n/******************  Bit definition for DAC_DHR8RD register  ******************/\n#define DAC_DHR8RD_DACC1DHR_Pos             (0U)                               \n#define DAC_DHR8RD_DACC1DHR_Msk             (0xFFUL << DAC_DHR8RD_DACC1DHR_Pos) /*!< 0x000000FF */\n#define DAC_DHR8RD_DACC1DHR                 DAC_DHR8RD_DACC1DHR_Msk            /*!< DAC channel1 8-bit Right aligned data */\n#define DAC_DHR8RD_DACC2DHR_Pos             (8U)                               \n#define DAC_DHR8RD_DACC2DHR_Msk             (0xFFUL << DAC_DHR8RD_DACC2DHR_Pos) /*!< 0x0000FF00 */\n#define DAC_DHR8RD_DACC2DHR                 DAC_DHR8RD_DACC2DHR_Msk            /*!< DAC channel2 8-bit Right aligned data */\n\n/*******************  Bit definition for DAC_DOR1 register  *******************/\n#define DAC_DOR1_DACC1DOR_Pos               (0U)                               \n#define DAC_DOR1_DACC1DOR_Msk               (0xFFFUL << DAC_DOR1_DACC1DOR_Pos)  /*!< 0x00000FFF */\n#define DAC_DOR1_DACC1DOR                   DAC_DOR1_DACC1DOR_Msk              /*!< DAC channel1 data output */\n\n/*******************  Bit definition for DAC_DOR2 register  *******************/\n#define DAC_DOR2_DACC2DOR_Pos               (0U)                               \n#define DAC_DOR2_DACC2DOR_Msk               (0xFFFUL << DAC_DOR2_DACC2DOR_Pos)  /*!< 0x00000FFF */\n#define DAC_DOR2_DACC2DOR                   DAC_DOR2_DACC2DOR_Msk              /*!< DAC channel2 data output */\n\n\n\n/*****************************************************************************/\n/*                                                                           */\n/*                               Timers (TIM)                                */\n/*                                                                           */\n/*****************************************************************************/\n/*******************  Bit definition for TIM_CR1 register  *******************/\n#define TIM_CR1_CEN_Pos                     (0U)                               \n#define TIM_CR1_CEN_Msk                     (0x1UL << TIM_CR1_CEN_Pos)          /*!< 0x00000001 */\n#define TIM_CR1_CEN                         TIM_CR1_CEN_Msk                    /*!<Counter enable */\n#define TIM_CR1_UDIS_Pos                    (1U)                               \n#define TIM_CR1_UDIS_Msk                    (0x1UL << TIM_CR1_UDIS_Pos)         /*!< 0x00000002 */\n#define TIM_CR1_UDIS                        TIM_CR1_UDIS_Msk                   /*!<Update disable */\n#define TIM_CR1_URS_Pos                     (2U)                               \n#define TIM_CR1_URS_Msk                     (0x1UL << TIM_CR1_URS_Pos)          /*!< 0x00000004 */\n#define TIM_CR1_URS                         TIM_CR1_URS_Msk                    /*!<Update request source */\n#define TIM_CR1_OPM_Pos                     (3U)                               \n#define TIM_CR1_OPM_Msk                     (0x1UL << TIM_CR1_OPM_Pos)          /*!< 0x00000008 */\n#define TIM_CR1_OPM                         TIM_CR1_OPM_Msk                    /*!<One pulse mode */\n#define TIM_CR1_DIR_Pos                     (4U)                               \n#define TIM_CR1_DIR_Msk                     (0x1UL << TIM_CR1_DIR_Pos)          /*!< 0x00000010 */\n#define TIM_CR1_DIR                         TIM_CR1_DIR_Msk                    /*!<Direction */\n\n#define TIM_CR1_CMS_Pos                     (5U)                               \n#define TIM_CR1_CMS_Msk                     (0x3UL << TIM_CR1_CMS_Pos)          /*!< 0x00000060 */\n#define TIM_CR1_CMS                         TIM_CR1_CMS_Msk                    /*!<CMS[1:0] bits (Center-aligned mode selection) */\n#define TIM_CR1_CMS_0                       (0x1UL << TIM_CR1_CMS_Pos)          /*!< 0x00000020 */\n#define TIM_CR1_CMS_1                       (0x2UL << TIM_CR1_CMS_Pos)          /*!< 0x00000040 */\n\n#define TIM_CR1_ARPE_Pos                    (7U)                               \n#define TIM_CR1_ARPE_Msk                    (0x1UL << TIM_CR1_ARPE_Pos)         /*!< 0x00000080 */\n#define TIM_CR1_ARPE                        TIM_CR1_ARPE_Msk                   /*!<Auto-reload preload enable */\n\n#define TIM_CR1_CKD_Pos                     (8U)                               \n#define TIM_CR1_CKD_Msk                     (0x3UL << TIM_CR1_CKD_Pos)          /*!< 0x00000300 */\n#define TIM_CR1_CKD                         TIM_CR1_CKD_Msk                    /*!<CKD[1:0] bits (clock division) */\n#define TIM_CR1_CKD_0                       (0x1UL << TIM_CR1_CKD_Pos)          /*!< 0x00000100 */\n#define TIM_CR1_CKD_1                       (0x2UL << TIM_CR1_CKD_Pos)          /*!< 0x00000200 */\n\n/*******************  Bit definition for TIM_CR2 register  *******************/\n#define TIM_CR2_CCPC_Pos                    (0U)                               \n#define TIM_CR2_CCPC_Msk                    (0x1UL << TIM_CR2_CCPC_Pos)         /*!< 0x00000001 */\n#define TIM_CR2_CCPC                        TIM_CR2_CCPC_Msk                   /*!<Capture/Compare Preloaded Control */\n#define TIM_CR2_CCUS_Pos                    (2U)                               \n#define TIM_CR2_CCUS_Msk                    (0x1UL << TIM_CR2_CCUS_Pos)         /*!< 0x00000004 */\n#define TIM_CR2_CCUS                        TIM_CR2_CCUS_Msk                   /*!<Capture/Compare Control Update Selection */\n#define TIM_CR2_CCDS_Pos                    (3U)                               \n#define TIM_CR2_CCDS_Msk                    (0x1UL << TIM_CR2_CCDS_Pos)         /*!< 0x00000008 */\n#define TIM_CR2_CCDS                        TIM_CR2_CCDS_Msk                   /*!<Capture/Compare DMA Selection */\n\n#define TIM_CR2_MMS_Pos                     (4U)                               \n#define TIM_CR2_MMS_Msk                     (0x7UL << TIM_CR2_MMS_Pos)          /*!< 0x00000070 */\n#define TIM_CR2_MMS                         TIM_CR2_MMS_Msk                    /*!<MMS[2:0] bits (Master Mode Selection) */\n#define TIM_CR2_MMS_0                       (0x1UL << TIM_CR2_MMS_Pos)          /*!< 0x00000010 */\n#define TIM_CR2_MMS_1                       (0x2UL << TIM_CR2_MMS_Pos)          /*!< 0x00000020 */\n#define TIM_CR2_MMS_2                       (0x4UL << TIM_CR2_MMS_Pos)          /*!< 0x00000040 */\n\n#define TIM_CR2_TI1S_Pos                    (7U)                               \n#define TIM_CR2_TI1S_Msk                    (0x1UL << TIM_CR2_TI1S_Pos)         /*!< 0x00000080 */\n#define TIM_CR2_TI1S                        TIM_CR2_TI1S_Msk                   /*!<TI1 Selection */\n#define TIM_CR2_OIS1_Pos                    (8U)                               \n#define TIM_CR2_OIS1_Msk                    (0x1UL << TIM_CR2_OIS1_Pos)         /*!< 0x00000100 */\n#define TIM_CR2_OIS1                        TIM_CR2_OIS1_Msk                   /*!<Output Idle state 1 (OC1 output) */\n#define TIM_CR2_OIS1N_Pos                   (9U)                               \n#define TIM_CR2_OIS1N_Msk                   (0x1UL << TIM_CR2_OIS1N_Pos)        /*!< 0x00000200 */\n#define TIM_CR2_OIS1N                       TIM_CR2_OIS1N_Msk                  /*!<Output Idle state 1 (OC1N output) */\n#define TIM_CR2_OIS2_Pos                    (10U)                              \n#define TIM_CR2_OIS2_Msk                    (0x1UL << TIM_CR2_OIS2_Pos)         /*!< 0x00000400 */\n#define TIM_CR2_OIS2                        TIM_CR2_OIS2_Msk                   /*!<Output Idle state 2 (OC2 output) */\n#define TIM_CR2_OIS2N_Pos                   (11U)                              \n#define TIM_CR2_OIS2N_Msk                   (0x1UL << TIM_CR2_OIS2N_Pos)        /*!< 0x00000800 */\n#define TIM_CR2_OIS2N                       TIM_CR2_OIS2N_Msk                  /*!<Output Idle state 2 (OC2N output) */\n#define TIM_CR2_OIS3_Pos                    (12U)                              \n#define TIM_CR2_OIS3_Msk                    (0x1UL << TIM_CR2_OIS3_Pos)         /*!< 0x00001000 */\n#define TIM_CR2_OIS3                        TIM_CR2_OIS3_Msk                   /*!<Output Idle state 3 (OC3 output) */\n#define TIM_CR2_OIS3N_Pos                   (13U)                              \n#define TIM_CR2_OIS3N_Msk                   (0x1UL << TIM_CR2_OIS3N_Pos)        /*!< 0x00002000 */\n#define TIM_CR2_OIS3N                       TIM_CR2_OIS3N_Msk                  /*!<Output Idle state 3 (OC3N output) */\n#define TIM_CR2_OIS4_Pos                    (14U)                              \n#define TIM_CR2_OIS4_Msk                    (0x1UL << TIM_CR2_OIS4_Pos)         /*!< 0x00004000 */\n#define TIM_CR2_OIS4                        TIM_CR2_OIS4_Msk                   /*!<Output Idle state 4 (OC4 output) */\n\n/*******************  Bit definition for TIM_SMCR register  ******************/\n#define TIM_SMCR_SMS_Pos                    (0U)                               \n#define TIM_SMCR_SMS_Msk                    (0x7UL << TIM_SMCR_SMS_Pos)         /*!< 0x00000007 */\n#define TIM_SMCR_SMS                        TIM_SMCR_SMS_Msk                   /*!<SMS[2:0] bits (Slave mode selection) */\n#define TIM_SMCR_SMS_0                      (0x1UL << TIM_SMCR_SMS_Pos)         /*!< 0x00000001 */\n#define TIM_SMCR_SMS_1                      (0x2UL << TIM_SMCR_SMS_Pos)         /*!< 0x00000002 */\n#define TIM_SMCR_SMS_2                      (0x4UL << TIM_SMCR_SMS_Pos)         /*!< 0x00000004 */\n\n#define TIM_SMCR_TS_Pos                     (4U)                               \n#define TIM_SMCR_TS_Msk                     (0x7UL << TIM_SMCR_TS_Pos)          /*!< 0x00000070 */\n#define TIM_SMCR_TS                         TIM_SMCR_TS_Msk                    /*!<TS[2:0] bits (Trigger selection) */\n#define TIM_SMCR_TS_0                       (0x1UL << TIM_SMCR_TS_Pos)          /*!< 0x00000010 */\n#define TIM_SMCR_TS_1                       (0x2UL << TIM_SMCR_TS_Pos)          /*!< 0x00000020 */\n#define TIM_SMCR_TS_2                       (0x4UL << TIM_SMCR_TS_Pos)          /*!< 0x00000040 */\n\n#define TIM_SMCR_MSM_Pos                    (7U)                               \n#define TIM_SMCR_MSM_Msk                    (0x1UL << TIM_SMCR_MSM_Pos)         /*!< 0x00000080 */\n#define TIM_SMCR_MSM                        TIM_SMCR_MSM_Msk                   /*!<Master/slave mode */\n\n#define TIM_SMCR_ETF_Pos                    (8U)                               \n#define TIM_SMCR_ETF_Msk                    (0xFUL << TIM_SMCR_ETF_Pos)         /*!< 0x00000F00 */\n#define TIM_SMCR_ETF                        TIM_SMCR_ETF_Msk                   /*!<ETF[3:0] bits (External trigger filter) */\n#define TIM_SMCR_ETF_0                      (0x1UL << TIM_SMCR_ETF_Pos)         /*!< 0x00000100 */\n#define TIM_SMCR_ETF_1                      (0x2UL << TIM_SMCR_ETF_Pos)         /*!< 0x00000200 */\n#define TIM_SMCR_ETF_2                      (0x4UL << TIM_SMCR_ETF_Pos)         /*!< 0x00000400 */\n#define TIM_SMCR_ETF_3                      (0x8UL << TIM_SMCR_ETF_Pos)         /*!< 0x00000800 */\n\n#define TIM_SMCR_ETPS_Pos                   (12U)                              \n#define TIM_SMCR_ETPS_Msk                   (0x3UL << TIM_SMCR_ETPS_Pos)        /*!< 0x00003000 */\n#define TIM_SMCR_ETPS                       TIM_SMCR_ETPS_Msk                  /*!<ETPS[1:0] bits (External trigger prescaler) */\n#define TIM_SMCR_ETPS_0                     (0x1UL << TIM_SMCR_ETPS_Pos)        /*!< 0x00001000 */\n#define TIM_SMCR_ETPS_1                     (0x2UL << TIM_SMCR_ETPS_Pos)        /*!< 0x00002000 */\n\n#define TIM_SMCR_ECE_Pos                    (14U)                              \n#define TIM_SMCR_ECE_Msk                    (0x1UL << TIM_SMCR_ECE_Pos)         /*!< 0x00004000 */\n#define TIM_SMCR_ECE                        TIM_SMCR_ECE_Msk                   /*!<External clock enable */\n#define TIM_SMCR_ETP_Pos                    (15U)                              \n#define TIM_SMCR_ETP_Msk                    (0x1UL << TIM_SMCR_ETP_Pos)         /*!< 0x00008000 */\n#define TIM_SMCR_ETP                        TIM_SMCR_ETP_Msk                   /*!<External trigger polarity */\n\n/*******************  Bit definition for TIM_DIER register  ******************/\n#define TIM_DIER_UIE_Pos                    (0U)                               \n#define TIM_DIER_UIE_Msk                    (0x1UL << TIM_DIER_UIE_Pos)         /*!< 0x00000001 */\n#define TIM_DIER_UIE                        TIM_DIER_UIE_Msk                   /*!<Update interrupt enable */\n#define TIM_DIER_CC1IE_Pos                  (1U)                               \n#define TIM_DIER_CC1IE_Msk                  (0x1UL << TIM_DIER_CC1IE_Pos)       /*!< 0x00000002 */\n#define TIM_DIER_CC1IE                      TIM_DIER_CC1IE_Msk                 /*!<Capture/Compare 1 interrupt enable */\n#define TIM_DIER_CC2IE_Pos                  (2U)                               \n#define TIM_DIER_CC2IE_Msk                  (0x1UL << TIM_DIER_CC2IE_Pos)       /*!< 0x00000004 */\n#define TIM_DIER_CC2IE                      TIM_DIER_CC2IE_Msk                 /*!<Capture/Compare 2 interrupt enable */\n#define TIM_DIER_CC3IE_Pos                  (3U)                               \n#define TIM_DIER_CC3IE_Msk                  (0x1UL << TIM_DIER_CC3IE_Pos)       /*!< 0x00000008 */\n#define TIM_DIER_CC3IE                      TIM_DIER_CC3IE_Msk                 /*!<Capture/Compare 3 interrupt enable */\n#define TIM_DIER_CC4IE_Pos                  (4U)                               \n#define TIM_DIER_CC4IE_Msk                  (0x1UL << TIM_DIER_CC4IE_Pos)       /*!< 0x00000010 */\n#define TIM_DIER_CC4IE                      TIM_DIER_CC4IE_Msk                 /*!<Capture/Compare 4 interrupt enable */\n#define TIM_DIER_COMIE_Pos                  (5U)                               \n#define TIM_DIER_COMIE_Msk                  (0x1UL << TIM_DIER_COMIE_Pos)       /*!< 0x00000020 */\n#define TIM_DIER_COMIE                      TIM_DIER_COMIE_Msk                 /*!<COM interrupt enable */\n#define TIM_DIER_TIE_Pos                    (6U)                               \n#define TIM_DIER_TIE_Msk                    (0x1UL << TIM_DIER_TIE_Pos)         /*!< 0x00000040 */\n#define TIM_DIER_TIE                        TIM_DIER_TIE_Msk                   /*!<Trigger interrupt enable */\n#define TIM_DIER_BIE_Pos                    (7U)                               \n#define TIM_DIER_BIE_Msk                    (0x1UL << TIM_DIER_BIE_Pos)         /*!< 0x00000080 */\n#define TIM_DIER_BIE                        TIM_DIER_BIE_Msk                   /*!<Break interrupt enable */\n#define TIM_DIER_UDE_Pos                    (8U)                               \n#define TIM_DIER_UDE_Msk                    (0x1UL << TIM_DIER_UDE_Pos)         /*!< 0x00000100 */\n#define TIM_DIER_UDE                        TIM_DIER_UDE_Msk                   /*!<Update DMA request enable */\n#define TIM_DIER_CC1DE_Pos                  (9U)                               \n#define TIM_DIER_CC1DE_Msk                  (0x1UL << TIM_DIER_CC1DE_Pos)       /*!< 0x00000200 */\n#define TIM_DIER_CC1DE                      TIM_DIER_CC1DE_Msk                 /*!<Capture/Compare 1 DMA request enable */\n#define TIM_DIER_CC2DE_Pos                  (10U)                              \n#define TIM_DIER_CC2DE_Msk                  (0x1UL << TIM_DIER_CC2DE_Pos)       /*!< 0x00000400 */\n#define TIM_DIER_CC2DE                      TIM_DIER_CC2DE_Msk                 /*!<Capture/Compare 2 DMA request enable */\n#define TIM_DIER_CC3DE_Pos                  (11U)                              \n#define TIM_DIER_CC3DE_Msk                  (0x1UL << TIM_DIER_CC3DE_Pos)       /*!< 0x00000800 */\n#define TIM_DIER_CC3DE                      TIM_DIER_CC3DE_Msk                 /*!<Capture/Compare 3 DMA request enable */\n#define TIM_DIER_CC4DE_Pos                  (12U)                              \n#define TIM_DIER_CC4DE_Msk                  (0x1UL << TIM_DIER_CC4DE_Pos)       /*!< 0x00001000 */\n#define TIM_DIER_CC4DE                      TIM_DIER_CC4DE_Msk                 /*!<Capture/Compare 4 DMA request enable */\n#define TIM_DIER_COMDE_Pos                  (13U)                              \n#define TIM_DIER_COMDE_Msk                  (0x1UL << TIM_DIER_COMDE_Pos)       /*!< 0x00002000 */\n#define TIM_DIER_COMDE                      TIM_DIER_COMDE_Msk                 /*!<COM DMA request enable */\n#define TIM_DIER_TDE_Pos                    (14U)                              \n#define TIM_DIER_TDE_Msk                    (0x1UL << TIM_DIER_TDE_Pos)         /*!< 0x00004000 */\n#define TIM_DIER_TDE                        TIM_DIER_TDE_Msk                   /*!<Trigger DMA request enable */\n\n/********************  Bit definition for TIM_SR register  *******************/\n#define TIM_SR_UIF_Pos                      (0U)                               \n#define TIM_SR_UIF_Msk                      (0x1UL << TIM_SR_UIF_Pos)           /*!< 0x00000001 */\n#define TIM_SR_UIF                          TIM_SR_UIF_Msk                     /*!<Update interrupt Flag */\n#define TIM_SR_CC1IF_Pos                    (1U)                               \n#define TIM_SR_CC1IF_Msk                    (0x1UL << TIM_SR_CC1IF_Pos)         /*!< 0x00000002 */\n#define TIM_SR_CC1IF                        TIM_SR_CC1IF_Msk                   /*!<Capture/Compare 1 interrupt Flag */\n#define TIM_SR_CC2IF_Pos                    (2U)                               \n#define TIM_SR_CC2IF_Msk                    (0x1UL << TIM_SR_CC2IF_Pos)         /*!< 0x00000004 */\n#define TIM_SR_CC2IF                        TIM_SR_CC2IF_Msk                   /*!<Capture/Compare 2 interrupt Flag */\n#define TIM_SR_CC3IF_Pos                    (3U)                               \n#define TIM_SR_CC3IF_Msk                    (0x1UL << TIM_SR_CC3IF_Pos)         /*!< 0x00000008 */\n#define TIM_SR_CC3IF                        TIM_SR_CC3IF_Msk                   /*!<Capture/Compare 3 interrupt Flag */\n#define TIM_SR_CC4IF_Pos                    (4U)                               \n#define TIM_SR_CC4IF_Msk                    (0x1UL << TIM_SR_CC4IF_Pos)         /*!< 0x00000010 */\n#define TIM_SR_CC4IF                        TIM_SR_CC4IF_Msk                   /*!<Capture/Compare 4 interrupt Flag */\n#define TIM_SR_COMIF_Pos                    (5U)                               \n#define TIM_SR_COMIF_Msk                    (0x1UL << TIM_SR_COMIF_Pos)         /*!< 0x00000020 */\n#define TIM_SR_COMIF                        TIM_SR_COMIF_Msk                   /*!<COM interrupt Flag */\n#define TIM_SR_TIF_Pos                      (6U)                               \n#define TIM_SR_TIF_Msk                      (0x1UL << TIM_SR_TIF_Pos)           /*!< 0x00000040 */\n#define TIM_SR_TIF                          TIM_SR_TIF_Msk                     /*!<Trigger interrupt Flag */\n#define TIM_SR_BIF_Pos                      (7U)                               \n#define TIM_SR_BIF_Msk                      (0x1UL << TIM_SR_BIF_Pos)           /*!< 0x00000080 */\n#define TIM_SR_BIF                          TIM_SR_BIF_Msk                     /*!<Break interrupt Flag */\n#define TIM_SR_CC1OF_Pos                    (9U)                               \n#define TIM_SR_CC1OF_Msk                    (0x1UL << TIM_SR_CC1OF_Pos)         /*!< 0x00000200 */\n#define TIM_SR_CC1OF                        TIM_SR_CC1OF_Msk                   /*!<Capture/Compare 1 Overcapture Flag */\n#define TIM_SR_CC2OF_Pos                    (10U)                              \n#define TIM_SR_CC2OF_Msk                    (0x1UL << TIM_SR_CC2OF_Pos)         /*!< 0x00000400 */\n#define TIM_SR_CC2OF                        TIM_SR_CC2OF_Msk                   /*!<Capture/Compare 2 Overcapture Flag */\n#define TIM_SR_CC3OF_Pos                    (11U)                              \n#define TIM_SR_CC3OF_Msk                    (0x1UL << TIM_SR_CC3OF_Pos)         /*!< 0x00000800 */\n#define TIM_SR_CC3OF                        TIM_SR_CC3OF_Msk                   /*!<Capture/Compare 3 Overcapture Flag */\n#define TIM_SR_CC4OF_Pos                    (12U)                              \n#define TIM_SR_CC4OF_Msk                    (0x1UL << TIM_SR_CC4OF_Pos)         /*!< 0x00001000 */\n#define TIM_SR_CC4OF                        TIM_SR_CC4OF_Msk                   /*!<Capture/Compare 4 Overcapture Flag */\n\n/*******************  Bit definition for TIM_EGR register  *******************/\n#define TIM_EGR_UG_Pos                      (0U)                               \n#define TIM_EGR_UG_Msk                      (0x1UL << TIM_EGR_UG_Pos)           /*!< 0x00000001 */\n#define TIM_EGR_UG                          TIM_EGR_UG_Msk                     /*!<Update Generation */\n#define TIM_EGR_CC1G_Pos                    (1U)                               \n#define TIM_EGR_CC1G_Msk                    (0x1UL << TIM_EGR_CC1G_Pos)         /*!< 0x00000002 */\n#define TIM_EGR_CC1G                        TIM_EGR_CC1G_Msk                   /*!<Capture/Compare 1 Generation */\n#define TIM_EGR_CC2G_Pos                    (2U)                               \n#define TIM_EGR_CC2G_Msk                    (0x1UL << TIM_EGR_CC2G_Pos)         /*!< 0x00000004 */\n#define TIM_EGR_CC2G                        TIM_EGR_CC2G_Msk                   /*!<Capture/Compare 2 Generation */\n#define TIM_EGR_CC3G_Pos                    (3U)                               \n#define TIM_EGR_CC3G_Msk                    (0x1UL << TIM_EGR_CC3G_Pos)         /*!< 0x00000008 */\n#define TIM_EGR_CC3G                        TIM_EGR_CC3G_Msk                   /*!<Capture/Compare 3 Generation */\n#define TIM_EGR_CC4G_Pos                    (4U)                               \n#define TIM_EGR_CC4G_Msk                    (0x1UL << TIM_EGR_CC4G_Pos)         /*!< 0x00000010 */\n#define TIM_EGR_CC4G                        TIM_EGR_CC4G_Msk                   /*!<Capture/Compare 4 Generation */\n#define TIM_EGR_COMG_Pos                    (5U)                               \n#define TIM_EGR_COMG_Msk                    (0x1UL << TIM_EGR_COMG_Pos)         /*!< 0x00000020 */\n#define TIM_EGR_COMG                        TIM_EGR_COMG_Msk                   /*!<Capture/Compare Control Update Generation */\n#define TIM_EGR_TG_Pos                      (6U)                               \n#define TIM_EGR_TG_Msk                      (0x1UL << TIM_EGR_TG_Pos)           /*!< 0x00000040 */\n#define TIM_EGR_TG                          TIM_EGR_TG_Msk                     /*!<Trigger Generation */\n#define TIM_EGR_BG_Pos                      (7U)                               \n#define TIM_EGR_BG_Msk                      (0x1UL << TIM_EGR_BG_Pos)           /*!< 0x00000080 */\n#define TIM_EGR_BG                          TIM_EGR_BG_Msk                     /*!<Break Generation */\n\n/******************  Bit definition for TIM_CCMR1 register  ******************/\n#define TIM_CCMR1_CC1S_Pos                  (0U)                               \n#define TIM_CCMR1_CC1S_Msk                  (0x3UL << TIM_CCMR1_CC1S_Pos)       /*!< 0x00000003 */\n#define TIM_CCMR1_CC1S                      TIM_CCMR1_CC1S_Msk                 /*!<CC1S[1:0] bits (Capture/Compare 1 Selection) */\n#define TIM_CCMR1_CC1S_0                    (0x1UL << TIM_CCMR1_CC1S_Pos)       /*!< 0x00000001 */\n#define TIM_CCMR1_CC1S_1                    (0x2UL << TIM_CCMR1_CC1S_Pos)       /*!< 0x00000002 */\n\n#define TIM_CCMR1_OC1FE_Pos                 (2U)                               \n#define TIM_CCMR1_OC1FE_Msk                 (0x1UL << TIM_CCMR1_OC1FE_Pos)      /*!< 0x00000004 */\n#define TIM_CCMR1_OC1FE                     TIM_CCMR1_OC1FE_Msk                /*!<Output Compare 1 Fast enable */\n#define TIM_CCMR1_OC1PE_Pos                 (3U)                               \n#define TIM_CCMR1_OC1PE_Msk                 (0x1UL << TIM_CCMR1_OC1PE_Pos)      /*!< 0x00000008 */\n#define TIM_CCMR1_OC1PE                     TIM_CCMR1_OC1PE_Msk                /*!<Output Compare 1 Preload enable */\n\n#define TIM_CCMR1_OC1M_Pos                  (4U)                               \n#define TIM_CCMR1_OC1M_Msk                  (0x7UL << TIM_CCMR1_OC1M_Pos)       /*!< 0x00000070 */\n#define TIM_CCMR1_OC1M                      TIM_CCMR1_OC1M_Msk                 /*!<OC1M[2:0] bits (Output Compare 1 Mode) */\n#define TIM_CCMR1_OC1M_0                    (0x1UL << TIM_CCMR1_OC1M_Pos)       /*!< 0x00000010 */\n#define TIM_CCMR1_OC1M_1                    (0x2UL << TIM_CCMR1_OC1M_Pos)       /*!< 0x00000020 */\n#define TIM_CCMR1_OC1M_2                    (0x4UL << TIM_CCMR1_OC1M_Pos)       /*!< 0x00000040 */\n\n#define TIM_CCMR1_OC1CE_Pos                 (7U)                               \n#define TIM_CCMR1_OC1CE_Msk                 (0x1UL << TIM_CCMR1_OC1CE_Pos)      /*!< 0x00000080 */\n#define TIM_CCMR1_OC1CE                     TIM_CCMR1_OC1CE_Msk                /*!<Output Compare 1Clear Enable */\n\n#define TIM_CCMR1_CC2S_Pos                  (8U)                               \n#define TIM_CCMR1_CC2S_Msk                  (0x3UL << TIM_CCMR1_CC2S_Pos)       /*!< 0x00000300 */\n#define TIM_CCMR1_CC2S                      TIM_CCMR1_CC2S_Msk                 /*!<CC2S[1:0] bits (Capture/Compare 2 Selection) */\n#define TIM_CCMR1_CC2S_0                    (0x1UL << TIM_CCMR1_CC2S_Pos)       /*!< 0x00000100 */\n#define TIM_CCMR1_CC2S_1                    (0x2UL << TIM_CCMR1_CC2S_Pos)       /*!< 0x00000200 */\n\n#define TIM_CCMR1_OC2FE_Pos                 (10U)                              \n#define TIM_CCMR1_OC2FE_Msk                 (0x1UL << TIM_CCMR1_OC2FE_Pos)      /*!< 0x00000400 */\n#define TIM_CCMR1_OC2FE                     TIM_CCMR1_OC2FE_Msk                /*!<Output Compare 2 Fast enable */\n#define TIM_CCMR1_OC2PE_Pos                 (11U)                              \n#define TIM_CCMR1_OC2PE_Msk                 (0x1UL << TIM_CCMR1_OC2PE_Pos)      /*!< 0x00000800 */\n#define TIM_CCMR1_OC2PE                     TIM_CCMR1_OC2PE_Msk                /*!<Output Compare 2 Preload enable */\n\n#define TIM_CCMR1_OC2M_Pos                  (12U)                              \n#define TIM_CCMR1_OC2M_Msk                  (0x7UL << TIM_CCMR1_OC2M_Pos)       /*!< 0x00007000 */\n#define TIM_CCMR1_OC2M                      TIM_CCMR1_OC2M_Msk                 /*!<OC2M[2:0] bits (Output Compare 2 Mode) */\n#define TIM_CCMR1_OC2M_0                    (0x1UL << TIM_CCMR1_OC2M_Pos)       /*!< 0x00001000 */\n#define TIM_CCMR1_OC2M_1                    (0x2UL << TIM_CCMR1_OC2M_Pos)       /*!< 0x00002000 */\n#define TIM_CCMR1_OC2M_2                    (0x4UL << TIM_CCMR1_OC2M_Pos)       /*!< 0x00004000 */\n\n#define TIM_CCMR1_OC2CE_Pos                 (15U)                              \n#define TIM_CCMR1_OC2CE_Msk                 (0x1UL << TIM_CCMR1_OC2CE_Pos)      /*!< 0x00008000 */\n#define TIM_CCMR1_OC2CE                     TIM_CCMR1_OC2CE_Msk                /*!<Output Compare 2 Clear Enable */\n\n/*---------------------------------------------------------------------------*/\n\n#define TIM_CCMR1_IC1PSC_Pos                (2U)                               \n#define TIM_CCMR1_IC1PSC_Msk                (0x3UL << TIM_CCMR1_IC1PSC_Pos)     /*!< 0x0000000C */\n#define TIM_CCMR1_IC1PSC                    TIM_CCMR1_IC1PSC_Msk               /*!<IC1PSC[1:0] bits (Input Capture 1 Prescaler) */\n#define TIM_CCMR1_IC1PSC_0                  (0x1UL << TIM_CCMR1_IC1PSC_Pos)     /*!< 0x00000004 */\n#define TIM_CCMR1_IC1PSC_1                  (0x2UL << TIM_CCMR1_IC1PSC_Pos)     /*!< 0x00000008 */\n\n#define TIM_CCMR1_IC1F_Pos                  (4U)                               \n#define TIM_CCMR1_IC1F_Msk                  (0xFUL << TIM_CCMR1_IC1F_Pos)       /*!< 0x000000F0 */\n#define TIM_CCMR1_IC1F                      TIM_CCMR1_IC1F_Msk                 /*!<IC1F[3:0] bits (Input Capture 1 Filter) */\n#define TIM_CCMR1_IC1F_0                    (0x1UL << TIM_CCMR1_IC1F_Pos)       /*!< 0x00000010 */\n#define TIM_CCMR1_IC1F_1                    (0x2UL << TIM_CCMR1_IC1F_Pos)       /*!< 0x00000020 */\n#define TIM_CCMR1_IC1F_2                    (0x4UL << TIM_CCMR1_IC1F_Pos)       /*!< 0x00000040 */\n#define TIM_CCMR1_IC1F_3                    (0x8UL << TIM_CCMR1_IC1F_Pos)       /*!< 0x00000080 */\n\n#define TIM_CCMR1_IC2PSC_Pos                (10U)                              \n#define TIM_CCMR1_IC2PSC_Msk                (0x3UL << TIM_CCMR1_IC2PSC_Pos)     /*!< 0x00000C00 */\n#define TIM_CCMR1_IC2PSC                    TIM_CCMR1_IC2PSC_Msk               /*!<IC2PSC[1:0] bits (Input Capture 2 Prescaler) */\n#define TIM_CCMR1_IC2PSC_0                  (0x1UL << TIM_CCMR1_IC2PSC_Pos)     /*!< 0x00000400 */\n#define TIM_CCMR1_IC2PSC_1                  (0x2UL << TIM_CCMR1_IC2PSC_Pos)     /*!< 0x00000800 */\n\n#define TIM_CCMR1_IC2F_Pos                  (12U)                              \n#define TIM_CCMR1_IC2F_Msk                  (0xFUL << TIM_CCMR1_IC2F_Pos)       /*!< 0x0000F000 */\n#define TIM_CCMR1_IC2F                      TIM_CCMR1_IC2F_Msk                 /*!<IC2F[3:0] bits (Input Capture 2 Filter) */\n#define TIM_CCMR1_IC2F_0                    (0x1UL << TIM_CCMR1_IC2F_Pos)       /*!< 0x00001000 */\n#define TIM_CCMR1_IC2F_1                    (0x2UL << TIM_CCMR1_IC2F_Pos)       /*!< 0x00002000 */\n#define TIM_CCMR1_IC2F_2                    (0x4UL << TIM_CCMR1_IC2F_Pos)       /*!< 0x00004000 */\n#define TIM_CCMR1_IC2F_3                    (0x8UL << TIM_CCMR1_IC2F_Pos)       /*!< 0x00008000 */\n\n/******************  Bit definition for TIM_CCMR2 register  ******************/\n#define TIM_CCMR2_CC3S_Pos                  (0U)                               \n#define TIM_CCMR2_CC3S_Msk                  (0x3UL << TIM_CCMR2_CC3S_Pos)       /*!< 0x00000003 */\n#define TIM_CCMR2_CC3S                      TIM_CCMR2_CC3S_Msk                 /*!<CC3S[1:0] bits (Capture/Compare 3 Selection) */\n#define TIM_CCMR2_CC3S_0                    (0x1UL << TIM_CCMR2_CC3S_Pos)       /*!< 0x00000001 */\n#define TIM_CCMR2_CC3S_1                    (0x2UL << TIM_CCMR2_CC3S_Pos)       /*!< 0x00000002 */\n\n#define TIM_CCMR2_OC3FE_Pos                 (2U)                               \n#define TIM_CCMR2_OC3FE_Msk                 (0x1UL << TIM_CCMR2_OC3FE_Pos)      /*!< 0x00000004 */\n#define TIM_CCMR2_OC3FE                     TIM_CCMR2_OC3FE_Msk                /*!<Output Compare 3 Fast enable */\n#define TIM_CCMR2_OC3PE_Pos                 (3U)                               \n#define TIM_CCMR2_OC3PE_Msk                 (0x1UL << TIM_CCMR2_OC3PE_Pos)      /*!< 0x00000008 */\n#define TIM_CCMR2_OC3PE                     TIM_CCMR2_OC3PE_Msk                /*!<Output Compare 3 Preload enable */\n\n#define TIM_CCMR2_OC3M_Pos                  (4U)                               \n#define TIM_CCMR2_OC3M_Msk                  (0x7UL << TIM_CCMR2_OC3M_Pos)       /*!< 0x00000070 */\n#define TIM_CCMR2_OC3M                      TIM_CCMR2_OC3M_Msk                 /*!<OC3M[2:0] bits (Output Compare 3 Mode) */\n#define TIM_CCMR2_OC3M_0                    (0x1UL << TIM_CCMR2_OC3M_Pos)       /*!< 0x00000010 */\n#define TIM_CCMR2_OC3M_1                    (0x2UL << TIM_CCMR2_OC3M_Pos)       /*!< 0x00000020 */\n#define TIM_CCMR2_OC3M_2                    (0x4UL << TIM_CCMR2_OC3M_Pos)       /*!< 0x00000040 */\n\n#define TIM_CCMR2_OC3CE_Pos                 (7U)                               \n#define TIM_CCMR2_OC3CE_Msk                 (0x1UL << TIM_CCMR2_OC3CE_Pos)      /*!< 0x00000080 */\n#define TIM_CCMR2_OC3CE                     TIM_CCMR2_OC3CE_Msk                /*!<Output Compare 3 Clear Enable */\n\n#define TIM_CCMR2_CC4S_Pos                  (8U)                               \n#define TIM_CCMR2_CC4S_Msk                  (0x3UL << TIM_CCMR2_CC4S_Pos)       /*!< 0x00000300 */\n#define TIM_CCMR2_CC4S                      TIM_CCMR2_CC4S_Msk                 /*!<CC4S[1:0] bits (Capture/Compare 4 Selection) */\n#define TIM_CCMR2_CC4S_0                    (0x1UL << TIM_CCMR2_CC4S_Pos)       /*!< 0x00000100 */\n#define TIM_CCMR2_CC4S_1                    (0x2UL << TIM_CCMR2_CC4S_Pos)       /*!< 0x00000200 */\n\n#define TIM_CCMR2_OC4FE_Pos                 (10U)                              \n#define TIM_CCMR2_OC4FE_Msk                 (0x1UL << TIM_CCMR2_OC4FE_Pos)      /*!< 0x00000400 */\n#define TIM_CCMR2_OC4FE                     TIM_CCMR2_OC4FE_Msk                /*!<Output Compare 4 Fast enable */\n#define TIM_CCMR2_OC4PE_Pos                 (11U)                              \n#define TIM_CCMR2_OC4PE_Msk                 (0x1UL << TIM_CCMR2_OC4PE_Pos)      /*!< 0x00000800 */\n#define TIM_CCMR2_OC4PE                     TIM_CCMR2_OC4PE_Msk                /*!<Output Compare 4 Preload enable */\n\n#define TIM_CCMR2_OC4M_Pos                  (12U)                              \n#define TIM_CCMR2_OC4M_Msk                  (0x7UL << TIM_CCMR2_OC4M_Pos)       /*!< 0x00007000 */\n#define TIM_CCMR2_OC4M                      TIM_CCMR2_OC4M_Msk                 /*!<OC4M[2:0] bits (Output Compare 4 Mode) */\n#define TIM_CCMR2_OC4M_0                    (0x1UL << TIM_CCMR2_OC4M_Pos)       /*!< 0x00001000 */\n#define TIM_CCMR2_OC4M_1                    (0x2UL << TIM_CCMR2_OC4M_Pos)       /*!< 0x00002000 */\n#define TIM_CCMR2_OC4M_2                    (0x4UL << TIM_CCMR2_OC4M_Pos)       /*!< 0x00004000 */\n\n#define TIM_CCMR2_OC4CE_Pos                 (15U)                              \n#define TIM_CCMR2_OC4CE_Msk                 (0x1UL << TIM_CCMR2_OC4CE_Pos)      /*!< 0x00008000 */\n#define TIM_CCMR2_OC4CE                     TIM_CCMR2_OC4CE_Msk                /*!<Output Compare 4 Clear Enable */\n\n/*---------------------------------------------------------------------------*/\n\n#define TIM_CCMR2_IC3PSC_Pos                (2U)                               \n#define TIM_CCMR2_IC3PSC_Msk                (0x3UL << TIM_CCMR2_IC3PSC_Pos)     /*!< 0x0000000C */\n#define TIM_CCMR2_IC3PSC                    TIM_CCMR2_IC3PSC_Msk               /*!<IC3PSC[1:0] bits (Input Capture 3 Prescaler) */\n#define TIM_CCMR2_IC3PSC_0                  (0x1UL << TIM_CCMR2_IC3PSC_Pos)     /*!< 0x00000004 */\n#define TIM_CCMR2_IC3PSC_1                  (0x2UL << TIM_CCMR2_IC3PSC_Pos)     /*!< 0x00000008 */\n\n#define TIM_CCMR2_IC3F_Pos                  (4U)                               \n#define TIM_CCMR2_IC3F_Msk                  (0xFUL << TIM_CCMR2_IC3F_Pos)       /*!< 0x000000F0 */\n#define TIM_CCMR2_IC3F                      TIM_CCMR2_IC3F_Msk                 /*!<IC3F[3:0] bits (Input Capture 3 Filter) */\n#define TIM_CCMR2_IC3F_0                    (0x1UL << TIM_CCMR2_IC3F_Pos)       /*!< 0x00000010 */\n#define TIM_CCMR2_IC3F_1                    (0x2UL << TIM_CCMR2_IC3F_Pos)       /*!< 0x00000020 */\n#define TIM_CCMR2_IC3F_2                    (0x4UL << TIM_CCMR2_IC3F_Pos)       /*!< 0x00000040 */\n#define TIM_CCMR2_IC3F_3                    (0x8UL << TIM_CCMR2_IC3F_Pos)       /*!< 0x00000080 */\n\n#define TIM_CCMR2_IC4PSC_Pos                (10U)                              \n#define TIM_CCMR2_IC4PSC_Msk                (0x3UL << TIM_CCMR2_IC4PSC_Pos)     /*!< 0x00000C00 */\n#define TIM_CCMR2_IC4PSC                    TIM_CCMR2_IC4PSC_Msk               /*!<IC4PSC[1:0] bits (Input Capture 4 Prescaler) */\n#define TIM_CCMR2_IC4PSC_0                  (0x1UL << TIM_CCMR2_IC4PSC_Pos)     /*!< 0x00000400 */\n#define TIM_CCMR2_IC4PSC_1                  (0x2UL << TIM_CCMR2_IC4PSC_Pos)     /*!< 0x00000800 */\n\n#define TIM_CCMR2_IC4F_Pos                  (12U)                              \n#define TIM_CCMR2_IC4F_Msk                  (0xFUL << TIM_CCMR2_IC4F_Pos)       /*!< 0x0000F000 */\n#define TIM_CCMR2_IC4F                      TIM_CCMR2_IC4F_Msk                 /*!<IC4F[3:0] bits (Input Capture 4 Filter) */\n#define TIM_CCMR2_IC4F_0                    (0x1UL << TIM_CCMR2_IC4F_Pos)       /*!< 0x00001000 */\n#define TIM_CCMR2_IC4F_1                    (0x2UL << TIM_CCMR2_IC4F_Pos)       /*!< 0x00002000 */\n#define TIM_CCMR2_IC4F_2                    (0x4UL << TIM_CCMR2_IC4F_Pos)       /*!< 0x00004000 */\n#define TIM_CCMR2_IC4F_3                    (0x8UL << TIM_CCMR2_IC4F_Pos)       /*!< 0x00008000 */\n\n/*******************  Bit definition for TIM_CCER register  ******************/\n#define TIM_CCER_CC1E_Pos                   (0U)                               \n#define TIM_CCER_CC1E_Msk                   (0x1UL << TIM_CCER_CC1E_Pos)        /*!< 0x00000001 */\n#define TIM_CCER_CC1E                       TIM_CCER_CC1E_Msk                  /*!<Capture/Compare 1 output enable */\n#define TIM_CCER_CC1P_Pos                   (1U)                               \n#define TIM_CCER_CC1P_Msk                   (0x1UL << TIM_CCER_CC1P_Pos)        /*!< 0x00000002 */\n#define TIM_CCER_CC1P                       TIM_CCER_CC1P_Msk                  /*!<Capture/Compare 1 output Polarity */\n#define TIM_CCER_CC1NE_Pos                  (2U)                               \n#define TIM_CCER_CC1NE_Msk                  (0x1UL << TIM_CCER_CC1NE_Pos)       /*!< 0x00000004 */\n#define TIM_CCER_CC1NE                      TIM_CCER_CC1NE_Msk                 /*!<Capture/Compare 1 Complementary output enable */\n#define TIM_CCER_CC1NP_Pos                  (3U)                               \n#define TIM_CCER_CC1NP_Msk                  (0x1UL << TIM_CCER_CC1NP_Pos)       /*!< 0x00000008 */\n#define TIM_CCER_CC1NP                      TIM_CCER_CC1NP_Msk                 /*!<Capture/Compare 1 Complementary output Polarity */\n#define TIM_CCER_CC2E_Pos                   (4U)                               \n#define TIM_CCER_CC2E_Msk                   (0x1UL << TIM_CCER_CC2E_Pos)        /*!< 0x00000010 */\n#define TIM_CCER_CC2E                       TIM_CCER_CC2E_Msk                  /*!<Capture/Compare 2 output enable */\n#define TIM_CCER_CC2P_Pos                   (5U)                               \n#define TIM_CCER_CC2P_Msk                   (0x1UL << TIM_CCER_CC2P_Pos)        /*!< 0x00000020 */\n#define TIM_CCER_CC2P                       TIM_CCER_CC2P_Msk                  /*!<Capture/Compare 2 output Polarity */\n#define TIM_CCER_CC2NE_Pos                  (6U)                               \n#define TIM_CCER_CC2NE_Msk                  (0x1UL << TIM_CCER_CC2NE_Pos)       /*!< 0x00000040 */\n#define TIM_CCER_CC2NE                      TIM_CCER_CC2NE_Msk                 /*!<Capture/Compare 2 Complementary output enable */\n#define TIM_CCER_CC2NP_Pos                  (7U)                               \n#define TIM_CCER_CC2NP_Msk                  (0x1UL << TIM_CCER_CC2NP_Pos)       /*!< 0x00000080 */\n#define TIM_CCER_CC2NP                      TIM_CCER_CC2NP_Msk                 /*!<Capture/Compare 2 Complementary output Polarity */\n#define TIM_CCER_CC3E_Pos                   (8U)                               \n#define TIM_CCER_CC3E_Msk                   (0x1UL << TIM_CCER_CC3E_Pos)        /*!< 0x00000100 */\n#define TIM_CCER_CC3E                       TIM_CCER_CC3E_Msk                  /*!<Capture/Compare 3 output enable */\n#define TIM_CCER_CC3P_Pos                   (9U)                               \n#define TIM_CCER_CC3P_Msk                   (0x1UL << TIM_CCER_CC3P_Pos)        /*!< 0x00000200 */\n#define TIM_CCER_CC3P                       TIM_CCER_CC3P_Msk                  /*!<Capture/Compare 3 output Polarity */\n#define TIM_CCER_CC3NE_Pos                  (10U)                              \n#define TIM_CCER_CC3NE_Msk                  (0x1UL << TIM_CCER_CC3NE_Pos)       /*!< 0x00000400 */\n#define TIM_CCER_CC3NE                      TIM_CCER_CC3NE_Msk                 /*!<Capture/Compare 3 Complementary output enable */\n#define TIM_CCER_CC3NP_Pos                  (11U)                              \n#define TIM_CCER_CC3NP_Msk                  (0x1UL << TIM_CCER_CC3NP_Pos)       /*!< 0x00000800 */\n#define TIM_CCER_CC3NP                      TIM_CCER_CC3NP_Msk                 /*!<Capture/Compare 3 Complementary output Polarity */\n#define TIM_CCER_CC4E_Pos                   (12U)                              \n#define TIM_CCER_CC4E_Msk                   (0x1UL << TIM_CCER_CC4E_Pos)        /*!< 0x00001000 */\n#define TIM_CCER_CC4E                       TIM_CCER_CC4E_Msk                  /*!<Capture/Compare 4 output enable */\n#define TIM_CCER_CC4P_Pos                   (13U)                              \n#define TIM_CCER_CC4P_Msk                   (0x1UL << TIM_CCER_CC4P_Pos)        /*!< 0x00002000 */\n#define TIM_CCER_CC4P                       TIM_CCER_CC4P_Msk                  /*!<Capture/Compare 4 output Polarity */\n\n/*******************  Bit definition for TIM_CNT register  *******************/\n#define TIM_CNT_CNT_Pos                     (0U)                               \n#define TIM_CNT_CNT_Msk                     (0xFFFFFFFFUL << TIM_CNT_CNT_Pos)   /*!< 0xFFFFFFFF */\n#define TIM_CNT_CNT                         TIM_CNT_CNT_Msk                    /*!<Counter Value */\n\n/*******************  Bit definition for TIM_PSC register  *******************/\n#define TIM_PSC_PSC_Pos                     (0U)                               \n#define TIM_PSC_PSC_Msk                     (0xFFFFUL << TIM_PSC_PSC_Pos)       /*!< 0x0000FFFF */\n#define TIM_PSC_PSC                         TIM_PSC_PSC_Msk                    /*!<Prescaler Value */\n\n/*******************  Bit definition for TIM_ARR register  *******************/\n#define TIM_ARR_ARR_Pos                     (0U)                               \n#define TIM_ARR_ARR_Msk                     (0xFFFFFFFFUL << TIM_ARR_ARR_Pos)   /*!< 0xFFFFFFFF */\n#define TIM_ARR_ARR                         TIM_ARR_ARR_Msk                    /*!<actual auto-reload Value */\n\n/*******************  Bit definition for TIM_RCR register  *******************/\n#define TIM_RCR_REP_Pos                     (0U)                               \n#define TIM_RCR_REP_Msk                     (0xFFUL << TIM_RCR_REP_Pos)         /*!< 0x000000FF */\n#define TIM_RCR_REP                         TIM_RCR_REP_Msk                    /*!<Repetition Counter Value */\n\n/*******************  Bit definition for TIM_CCR1 register  ******************/\n#define TIM_CCR1_CCR1_Pos                   (0U)                               \n#define TIM_CCR1_CCR1_Msk                   (0xFFFFUL << TIM_CCR1_CCR1_Pos)     /*!< 0x0000FFFF */\n#define TIM_CCR1_CCR1                       TIM_CCR1_CCR1_Msk                  /*!<Capture/Compare 1 Value */\n\n/*******************  Bit definition for TIM_CCR2 register  ******************/\n#define TIM_CCR2_CCR2_Pos                   (0U)                               \n#define TIM_CCR2_CCR2_Msk                   (0xFFFFUL << TIM_CCR2_CCR2_Pos)     /*!< 0x0000FFFF */\n#define TIM_CCR2_CCR2                       TIM_CCR2_CCR2_Msk                  /*!<Capture/Compare 2 Value */\n\n/*******************  Bit definition for TIM_CCR3 register  ******************/\n#define TIM_CCR3_CCR3_Pos                   (0U)                               \n#define TIM_CCR3_CCR3_Msk                   (0xFFFFUL << TIM_CCR3_CCR3_Pos)     /*!< 0x0000FFFF */\n#define TIM_CCR3_CCR3                       TIM_CCR3_CCR3_Msk                  /*!<Capture/Compare 3 Value */\n\n/*******************  Bit definition for TIM_CCR4 register  ******************/\n#define TIM_CCR4_CCR4_Pos                   (0U)                               \n#define TIM_CCR4_CCR4_Msk                   (0xFFFFUL << TIM_CCR4_CCR4_Pos)     /*!< 0x0000FFFF */\n#define TIM_CCR4_CCR4                       TIM_CCR4_CCR4_Msk                  /*!<Capture/Compare 4 Value */\n\n/*******************  Bit definition for TIM_BDTR register  ******************/\n#define TIM_BDTR_DTG_Pos                    (0U)                               \n#define TIM_BDTR_DTG_Msk                    (0xFFUL << TIM_BDTR_DTG_Pos)        /*!< 0x000000FF */\n#define TIM_BDTR_DTG                        TIM_BDTR_DTG_Msk                   /*!<DTG[0:7] bits (Dead-Time Generator set-up) */\n#define TIM_BDTR_DTG_0                      (0x01UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000001 */\n#define TIM_BDTR_DTG_1                      (0x02UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000002 */\n#define TIM_BDTR_DTG_2                      (0x04UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000004 */\n#define TIM_BDTR_DTG_3                      (0x08UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000008 */\n#define TIM_BDTR_DTG_4                      (0x10UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000010 */\n#define TIM_BDTR_DTG_5                      (0x20UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000020 */\n#define TIM_BDTR_DTG_6                      (0x40UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000040 */\n#define TIM_BDTR_DTG_7                      (0x80UL << TIM_BDTR_DTG_Pos)        /*!< 0x00000080 */\n\n#define TIM_BDTR_LOCK_Pos                   (8U)                               \n#define TIM_BDTR_LOCK_Msk                   (0x3UL << TIM_BDTR_LOCK_Pos)        /*!< 0x00000300 */\n#define TIM_BDTR_LOCK                       TIM_BDTR_LOCK_Msk                  /*!<LOCK[1:0] bits (Lock Configuration) */\n#define TIM_BDTR_LOCK_0                     (0x1UL << TIM_BDTR_LOCK_Pos)        /*!< 0x00000100 */\n#define TIM_BDTR_LOCK_1                     (0x2UL << TIM_BDTR_LOCK_Pos)        /*!< 0x00000200 */\n\n#define TIM_BDTR_OSSI_Pos                   (10U)                              \n#define TIM_BDTR_OSSI_Msk                   (0x1UL << TIM_BDTR_OSSI_Pos)        /*!< 0x00000400 */\n#define TIM_BDTR_OSSI                       TIM_BDTR_OSSI_Msk                  /*!<Off-State Selection for Idle mode */\n#define TIM_BDTR_OSSR_Pos                   (11U)                              \n#define TIM_BDTR_OSSR_Msk                   (0x1UL << TIM_BDTR_OSSR_Pos)        /*!< 0x00000800 */\n#define TIM_BDTR_OSSR                       TIM_BDTR_OSSR_Msk                  /*!<Off-State Selection for Run mode */\n#define TIM_BDTR_BKE_Pos                    (12U)                              \n#define TIM_BDTR_BKE_Msk                    (0x1UL << TIM_BDTR_BKE_Pos)         /*!< 0x00001000 */\n#define TIM_BDTR_BKE                        TIM_BDTR_BKE_Msk                   /*!<Break enable */\n#define TIM_BDTR_BKP_Pos                    (13U)                              \n#define TIM_BDTR_BKP_Msk                    (0x1UL << TIM_BDTR_BKP_Pos)         /*!< 0x00002000 */\n#define TIM_BDTR_BKP                        TIM_BDTR_BKP_Msk                   /*!<Break Polarity */\n#define TIM_BDTR_AOE_Pos                    (14U)                              \n#define TIM_BDTR_AOE_Msk                    (0x1UL << TIM_BDTR_AOE_Pos)         /*!< 0x00004000 */\n#define TIM_BDTR_AOE                        TIM_BDTR_AOE_Msk                   /*!<Automatic Output enable */\n#define TIM_BDTR_MOE_Pos                    (15U)                              \n#define TIM_BDTR_MOE_Msk                    (0x1UL << TIM_BDTR_MOE_Pos)         /*!< 0x00008000 */\n#define TIM_BDTR_MOE                        TIM_BDTR_MOE_Msk                   /*!<Main Output enable */\n\n/*******************  Bit definition for TIM_DCR register  *******************/\n#define TIM_DCR_DBA_Pos                     (0U)                               \n#define TIM_DCR_DBA_Msk                     (0x1FUL << TIM_DCR_DBA_Pos)         /*!< 0x0000001F */\n#define TIM_DCR_DBA                         TIM_DCR_DBA_Msk                    /*!<DBA[4:0] bits (DMA Base Address) */\n#define TIM_DCR_DBA_0                       (0x01UL << TIM_DCR_DBA_Pos)         /*!< 0x00000001 */\n#define TIM_DCR_DBA_1                       (0x02UL << TIM_DCR_DBA_Pos)         /*!< 0x00000002 */\n#define TIM_DCR_DBA_2                       (0x04UL << TIM_DCR_DBA_Pos)         /*!< 0x00000004 */\n#define TIM_DCR_DBA_3                       (0x08UL << TIM_DCR_DBA_Pos)         /*!< 0x00000008 */\n#define TIM_DCR_DBA_4                       (0x10UL << TIM_DCR_DBA_Pos)         /*!< 0x00000010 */\n\n#define TIM_DCR_DBL_Pos                     (8U)                               \n#define TIM_DCR_DBL_Msk                     (0x1FUL << TIM_DCR_DBL_Pos)         /*!< 0x00001F00 */\n#define TIM_DCR_DBL                         TIM_DCR_DBL_Msk                    /*!<DBL[4:0] bits (DMA Burst Length) */\n#define TIM_DCR_DBL_0                       (0x01UL << TIM_DCR_DBL_Pos)         /*!< 0x00000100 */\n#define TIM_DCR_DBL_1                       (0x02UL << TIM_DCR_DBL_Pos)         /*!< 0x00000200 */\n#define TIM_DCR_DBL_2                       (0x04UL << TIM_DCR_DBL_Pos)         /*!< 0x00000400 */\n#define TIM_DCR_DBL_3                       (0x08UL << TIM_DCR_DBL_Pos)         /*!< 0x00000800 */\n#define TIM_DCR_DBL_4                       (0x10UL << TIM_DCR_DBL_Pos)         /*!< 0x00001000 */\n\n/*******************  Bit definition for TIM_DMAR register  ******************/\n#define TIM_DMAR_DMAB_Pos                   (0U)                               \n#define TIM_DMAR_DMAB_Msk                   (0xFFFFUL << TIM_DMAR_DMAB_Pos)     /*!< 0x0000FFFF */\n#define TIM_DMAR_DMAB                       TIM_DMAR_DMAB_Msk                  /*!<DMA register for burst accesses */\n\n/******************************************************************************/\n/*                                                                            */\n/*                             Real-Time Clock                                */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for RTC_CRH register  ********************/\n#define RTC_CRH_SECIE_Pos                   (0U)                               \n#define RTC_CRH_SECIE_Msk                   (0x1UL << RTC_CRH_SECIE_Pos)        /*!< 0x00000001 */\n#define RTC_CRH_SECIE                       RTC_CRH_SECIE_Msk                  /*!< Second Interrupt Enable */\n#define RTC_CRH_ALRIE_Pos                   (1U)                               \n#define RTC_CRH_ALRIE_Msk                   (0x1UL << RTC_CRH_ALRIE_Pos)        /*!< 0x00000002 */\n#define RTC_CRH_ALRIE                       RTC_CRH_ALRIE_Msk                  /*!< Alarm Interrupt Enable */\n#define RTC_CRH_OWIE_Pos                    (2U)                               \n#define RTC_CRH_OWIE_Msk                    (0x1UL << RTC_CRH_OWIE_Pos)         /*!< 0x00000004 */\n#define RTC_CRH_OWIE                        RTC_CRH_OWIE_Msk                   /*!< OverfloW Interrupt Enable */\n\n/*******************  Bit definition for RTC_CRL register  ********************/\n#define RTC_CRL_SECF_Pos                    (0U)                               \n#define RTC_CRL_SECF_Msk                    (0x1UL << RTC_CRL_SECF_Pos)         /*!< 0x00000001 */\n#define RTC_CRL_SECF                        RTC_CRL_SECF_Msk                   /*!< Second Flag */\n#define RTC_CRL_ALRF_Pos                    (1U)                               \n#define RTC_CRL_ALRF_Msk                    (0x1UL << RTC_CRL_ALRF_Pos)         /*!< 0x00000002 */\n#define RTC_CRL_ALRF                        RTC_CRL_ALRF_Msk                   /*!< Alarm Flag */\n#define RTC_CRL_OWF_Pos                     (2U)                               \n#define RTC_CRL_OWF_Msk                     (0x1UL << RTC_CRL_OWF_Pos)          /*!< 0x00000004 */\n#define RTC_CRL_OWF                         RTC_CRL_OWF_Msk                    /*!< OverfloW Flag */\n#define RTC_CRL_RSF_Pos                     (3U)                               \n#define RTC_CRL_RSF_Msk                     (0x1UL << RTC_CRL_RSF_Pos)          /*!< 0x00000008 */\n#define RTC_CRL_RSF                         RTC_CRL_RSF_Msk                    /*!< Registers Synchronized Flag */\n#define RTC_CRL_CNF_Pos                     (4U)                               \n#define RTC_CRL_CNF_Msk                     (0x1UL << RTC_CRL_CNF_Pos)          /*!< 0x00000010 */\n#define RTC_CRL_CNF                         RTC_CRL_CNF_Msk                    /*!< Configuration Flag */\n#define RTC_CRL_RTOFF_Pos                   (5U)                               \n#define RTC_CRL_RTOFF_Msk                   (0x1UL << RTC_CRL_RTOFF_Pos)        /*!< 0x00000020 */\n#define RTC_CRL_RTOFF                       RTC_CRL_RTOFF_Msk                  /*!< RTC operation OFF */\n\n/*******************  Bit definition for RTC_PRLH register  *******************/\n#define RTC_PRLH_PRL_Pos                    (0U)                               \n#define RTC_PRLH_PRL_Msk                    (0xFUL << RTC_PRLH_PRL_Pos)         /*!< 0x0000000F */\n#define RTC_PRLH_PRL                        RTC_PRLH_PRL_Msk                   /*!< RTC Prescaler Reload Value High */\n\n/*******************  Bit definition for RTC_PRLL register  *******************/\n#define RTC_PRLL_PRL_Pos                    (0U)                               \n#define RTC_PRLL_PRL_Msk                    (0xFFFFUL << RTC_PRLL_PRL_Pos)      /*!< 0x0000FFFF */\n#define RTC_PRLL_PRL                        RTC_PRLL_PRL_Msk                   /*!< RTC Prescaler Reload Value Low */\n\n/*******************  Bit definition for RTC_DIVH register  *******************/\n#define RTC_DIVH_RTC_DIV_Pos                (0U)                               \n#define RTC_DIVH_RTC_DIV_Msk                (0xFUL << RTC_DIVH_RTC_DIV_Pos)     /*!< 0x0000000F */\n#define RTC_DIVH_RTC_DIV                    RTC_DIVH_RTC_DIV_Msk               /*!< RTC Clock Divider High */\n\n/*******************  Bit definition for RTC_DIVL register  *******************/\n#define RTC_DIVL_RTC_DIV_Pos                (0U)                               \n#define RTC_DIVL_RTC_DIV_Msk                (0xFFFFUL << RTC_DIVL_RTC_DIV_Pos)  /*!< 0x0000FFFF */\n#define RTC_DIVL_RTC_DIV                    RTC_DIVL_RTC_DIV_Msk               /*!< RTC Clock Divider Low */\n\n/*******************  Bit definition for RTC_CNTH register  *******************/\n#define RTC_CNTH_RTC_CNT_Pos                (0U)                               \n#define RTC_CNTH_RTC_CNT_Msk                (0xFFFFUL << RTC_CNTH_RTC_CNT_Pos)  /*!< 0x0000FFFF */\n#define RTC_CNTH_RTC_CNT                    RTC_CNTH_RTC_CNT_Msk               /*!< RTC Counter High */\n\n/*******************  Bit definition for RTC_CNTL register  *******************/\n#define RTC_CNTL_RTC_CNT_Pos                (0U)                               \n#define RTC_CNTL_RTC_CNT_Msk                (0xFFFFUL << RTC_CNTL_RTC_CNT_Pos)  /*!< 0x0000FFFF */\n#define RTC_CNTL_RTC_CNT                    RTC_CNTL_RTC_CNT_Msk               /*!< RTC Counter Low */\n\n/*******************  Bit definition for RTC_ALRH register  *******************/\n#define RTC_ALRH_RTC_ALR_Pos                (0U)                               \n#define RTC_ALRH_RTC_ALR_Msk                (0xFFFFUL << RTC_ALRH_RTC_ALR_Pos)  /*!< 0x0000FFFF */\n#define RTC_ALRH_RTC_ALR                    RTC_ALRH_RTC_ALR_Msk               /*!< RTC Alarm High */\n\n/*******************  Bit definition for RTC_ALRL register  *******************/\n#define RTC_ALRL_RTC_ALR_Pos                (0U)                               \n#define RTC_ALRL_RTC_ALR_Msk                (0xFFFFUL << RTC_ALRL_RTC_ALR_Pos)  /*!< 0x0000FFFF */\n#define RTC_ALRL_RTC_ALR                    RTC_ALRL_RTC_ALR_Msk               /*!< RTC Alarm Low */\n\n/******************************************************************************/\n/*                                                                            */\n/*                        Independent WATCHDOG (IWDG)                         */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for IWDG_KR register  ********************/\n#define IWDG_KR_KEY_Pos                     (0U)                               \n#define IWDG_KR_KEY_Msk                     (0xFFFFUL << IWDG_KR_KEY_Pos)       /*!< 0x0000FFFF */\n#define IWDG_KR_KEY                         IWDG_KR_KEY_Msk                    /*!< Key value (write only, read 0000h) */\n\n/*******************  Bit definition for IWDG_PR register  ********************/\n#define IWDG_PR_PR_Pos                      (0U)                               \n#define IWDG_PR_PR_Msk                      (0x7UL << IWDG_PR_PR_Pos)           /*!< 0x00000007 */\n#define IWDG_PR_PR                          IWDG_PR_PR_Msk                     /*!< PR[2:0] (Prescaler divider) */\n#define IWDG_PR_PR_0                        (0x1UL << IWDG_PR_PR_Pos)           /*!< 0x00000001 */\n#define IWDG_PR_PR_1                        (0x2UL << IWDG_PR_PR_Pos)           /*!< 0x00000002 */\n#define IWDG_PR_PR_2                        (0x4UL << IWDG_PR_PR_Pos)           /*!< 0x00000004 */\n\n/*******************  Bit definition for IWDG_RLR register  *******************/\n#define IWDG_RLR_RL_Pos                     (0U)                               \n#define IWDG_RLR_RL_Msk                     (0xFFFUL << IWDG_RLR_RL_Pos)        /*!< 0x00000FFF */\n#define IWDG_RLR_RL                         IWDG_RLR_RL_Msk                    /*!< Watchdog counter reload value */\n\n/*******************  Bit definition for IWDG_SR register  ********************/\n#define IWDG_SR_PVU_Pos                     (0U)                               \n#define IWDG_SR_PVU_Msk                     (0x1UL << IWDG_SR_PVU_Pos)          /*!< 0x00000001 */\n#define IWDG_SR_PVU                         IWDG_SR_PVU_Msk                    /*!< Watchdog prescaler value update */\n#define IWDG_SR_RVU_Pos                     (1U)                               \n#define IWDG_SR_RVU_Msk                     (0x1UL << IWDG_SR_RVU_Pos)          /*!< 0x00000002 */\n#define IWDG_SR_RVU                         IWDG_SR_RVU_Msk                    /*!< Watchdog counter reload value update */\n\n/******************************************************************************/\n/*                                                                            */\n/*                         Window WATCHDOG (WWDG)                             */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for WWDG_CR register  ********************/\n#define WWDG_CR_T_Pos                       (0U)                               \n#define WWDG_CR_T_Msk                       (0x7FUL << WWDG_CR_T_Pos)           /*!< 0x0000007F */\n#define WWDG_CR_T                           WWDG_CR_T_Msk                      /*!< T[6:0] bits (7-Bit counter (MSB to LSB)) */\n#define WWDG_CR_T_0                         (0x01UL << WWDG_CR_T_Pos)           /*!< 0x00000001 */\n#define WWDG_CR_T_1                         (0x02UL << WWDG_CR_T_Pos)           /*!< 0x00000002 */\n#define WWDG_CR_T_2                         (0x04UL << WWDG_CR_T_Pos)           /*!< 0x00000004 */\n#define WWDG_CR_T_3                         (0x08UL << WWDG_CR_T_Pos)           /*!< 0x00000008 */\n#define WWDG_CR_T_4                         (0x10UL << WWDG_CR_T_Pos)           /*!< 0x00000010 */\n#define WWDG_CR_T_5                         (0x20UL << WWDG_CR_T_Pos)           /*!< 0x00000020 */\n#define WWDG_CR_T_6                         (0x40UL << WWDG_CR_T_Pos)           /*!< 0x00000040 */\n\n/* Legacy defines */\n#define  WWDG_CR_T0 WWDG_CR_T_0\n#define  WWDG_CR_T1 WWDG_CR_T_1\n#define  WWDG_CR_T2 WWDG_CR_T_2\n#define  WWDG_CR_T3 WWDG_CR_T_3\n#define  WWDG_CR_T4 WWDG_CR_T_4\n#define  WWDG_CR_T5 WWDG_CR_T_5\n#define  WWDG_CR_T6 WWDG_CR_T_6\n\n#define WWDG_CR_WDGA_Pos                    (7U)                               \n#define WWDG_CR_WDGA_Msk                    (0x1UL << WWDG_CR_WDGA_Pos)         /*!< 0x00000080 */\n#define WWDG_CR_WDGA                        WWDG_CR_WDGA_Msk                   /*!< Activation bit */\n\n/*******************  Bit definition for WWDG_CFR register  *******************/\n#define WWDG_CFR_W_Pos                      (0U)                               \n#define WWDG_CFR_W_Msk                      (0x7FUL << WWDG_CFR_W_Pos)          /*!< 0x0000007F */\n#define WWDG_CFR_W                          WWDG_CFR_W_Msk                     /*!< W[6:0] bits (7-bit window value) */\n#define WWDG_CFR_W_0                        (0x01UL << WWDG_CFR_W_Pos)          /*!< 0x00000001 */\n#define WWDG_CFR_W_1                        (0x02UL << WWDG_CFR_W_Pos)          /*!< 0x00000002 */\n#define WWDG_CFR_W_2                        (0x04UL << WWDG_CFR_W_Pos)          /*!< 0x00000004 */\n#define WWDG_CFR_W_3                        (0x08UL << WWDG_CFR_W_Pos)          /*!< 0x00000008 */\n#define WWDG_CFR_W_4                        (0x10UL << WWDG_CFR_W_Pos)          /*!< 0x00000010 */\n#define WWDG_CFR_W_5                        (0x20UL << WWDG_CFR_W_Pos)          /*!< 0x00000020 */\n#define WWDG_CFR_W_6                        (0x40UL << WWDG_CFR_W_Pos)          /*!< 0x00000040 */\n\n/* Legacy defines */\n#define  WWDG_CFR_W0 WWDG_CFR_W_0\n#define  WWDG_CFR_W1 WWDG_CFR_W_1\n#define  WWDG_CFR_W2 WWDG_CFR_W_2\n#define  WWDG_CFR_W3 WWDG_CFR_W_3\n#define  WWDG_CFR_W4 WWDG_CFR_W_4\n#define  WWDG_CFR_W5 WWDG_CFR_W_5\n#define  WWDG_CFR_W6 WWDG_CFR_W_6\n\n#define WWDG_CFR_WDGTB_Pos                  (7U)                               \n#define WWDG_CFR_WDGTB_Msk                  (0x3UL << WWDG_CFR_WDGTB_Pos)       /*!< 0x00000180 */\n#define WWDG_CFR_WDGTB                      WWDG_CFR_WDGTB_Msk                 /*!< WDGTB[1:0] bits (Timer Base) */\n#define WWDG_CFR_WDGTB_0                    (0x1UL << WWDG_CFR_WDGTB_Pos)       /*!< 0x00000080 */\n#define WWDG_CFR_WDGTB_1                    (0x2UL << WWDG_CFR_WDGTB_Pos)       /*!< 0x00000100 */\n\n/* Legacy defines */\n#define  WWDG_CFR_WDGTB0 WWDG_CFR_WDGTB_0\n#define  WWDG_CFR_WDGTB1 WWDG_CFR_WDGTB_1\n\n#define WWDG_CFR_EWI_Pos                    (9U)                               \n#define WWDG_CFR_EWI_Msk                    (0x1UL << WWDG_CFR_EWI_Pos)         /*!< 0x00000200 */\n#define WWDG_CFR_EWI                        WWDG_CFR_EWI_Msk                   /*!< Early Wakeup Interrupt */\n\n/*******************  Bit definition for WWDG_SR register  ********************/\n#define WWDG_SR_EWIF_Pos                    (0U)                               \n#define WWDG_SR_EWIF_Msk                    (0x1UL << WWDG_SR_EWIF_Pos)         /*!< 0x00000001 */\n#define WWDG_SR_EWIF                        WWDG_SR_EWIF_Msk                   /*!< Early Wakeup Interrupt Flag */\n\n/******************************************************************************/\n/*                                                                            */\n/*                       Flexible Static Memory Controller                    */\n/*                                                                            */\n/******************************************************************************/\n\n/******************  Bit definition for FSMC_BCRx (x=1..4) register  **********/\n#define FSMC_BCRx_MBKEN_Pos                 (0U)                               \n#define FSMC_BCRx_MBKEN_Msk                 (0x1UL << FSMC_BCRx_MBKEN_Pos)      /*!< 0x00000001 */\n#define FSMC_BCRx_MBKEN                     FSMC_BCRx_MBKEN_Msk                /*!< Memory bank enable bit */\n#define FSMC_BCRx_MUXEN_Pos                 (1U)                               \n#define FSMC_BCRx_MUXEN_Msk                 (0x1UL << FSMC_BCRx_MUXEN_Pos)      /*!< 0x00000002 */\n#define FSMC_BCRx_MUXEN                     FSMC_BCRx_MUXEN_Msk                /*!< Address/data multiplexing enable bit */\n\n#define FSMC_BCRx_MTYP_Pos                  (2U)                               \n#define FSMC_BCRx_MTYP_Msk                  (0x3UL << FSMC_BCRx_MTYP_Pos)       /*!< 0x0000000C */\n#define FSMC_BCRx_MTYP                      FSMC_BCRx_MTYP_Msk                 /*!< MTYP[1:0] bits (Memory type) */\n#define FSMC_BCRx_MTYP_0                    (0x1UL << FSMC_BCRx_MTYP_Pos)       /*!< 0x00000004 */\n#define FSMC_BCRx_MTYP_1                    (0x2UL << FSMC_BCRx_MTYP_Pos)       /*!< 0x00000008 */\n\n#define FSMC_BCRx_MWID_Pos                  (4U)                               \n#define FSMC_BCRx_MWID_Msk                  (0x3UL << FSMC_BCRx_MWID_Pos)       /*!< 0x00000030 */\n#define FSMC_BCRx_MWID                      FSMC_BCRx_MWID_Msk                 /*!< MWID[1:0] bits (Memory data bus width) */\n#define FSMC_BCRx_MWID_0                    (0x1UL << FSMC_BCRx_MWID_Pos)       /*!< 0x00000010 */\n#define FSMC_BCRx_MWID_1                    (0x2UL << FSMC_BCRx_MWID_Pos)       /*!< 0x00000020 */\n\n#define FSMC_BCRx_FACCEN_Pos                (6U)                               \n#define FSMC_BCRx_FACCEN_Msk                (0x1UL << FSMC_BCRx_FACCEN_Pos)     /*!< 0x00000040 */\n#define FSMC_BCRx_FACCEN                    FSMC_BCRx_FACCEN_Msk               /*!< Flash access enable */\n#define FSMC_BCRx_BURSTEN_Pos               (8U)                               \n#define FSMC_BCRx_BURSTEN_Msk               (0x1UL << FSMC_BCRx_BURSTEN_Pos)    /*!< 0x00000100 */\n#define FSMC_BCRx_BURSTEN                   FSMC_BCRx_BURSTEN_Msk              /*!< Burst enable bit */\n#define FSMC_BCRx_WAITPOL_Pos               (9U)                               \n#define FSMC_BCRx_WAITPOL_Msk               (0x1UL << FSMC_BCRx_WAITPOL_Pos)    /*!< 0x00000200 */\n#define FSMC_BCRx_WAITPOL                   FSMC_BCRx_WAITPOL_Msk              /*!< Wait signal polarity bit */\n#define FSMC_BCRx_WRAPMOD_Pos               (10U)                              \n#define FSMC_BCRx_WRAPMOD_Msk               (0x1UL << FSMC_BCRx_WRAPMOD_Pos)    /*!< 0x00000400 */\n#define FSMC_BCRx_WRAPMOD                   FSMC_BCRx_WRAPMOD_Msk              /*!< Wrapped burst mode support */\n#define FSMC_BCRx_WAITCFG_Pos               (11U)                              \n#define FSMC_BCRx_WAITCFG_Msk               (0x1UL << FSMC_BCRx_WAITCFG_Pos)    /*!< 0x00000800 */\n#define FSMC_BCRx_WAITCFG                   FSMC_BCRx_WAITCFG_Msk              /*!< Wait timing configuration */\n#define FSMC_BCRx_WREN_Pos                  (12U)                              \n#define FSMC_BCRx_WREN_Msk                  (0x1UL << FSMC_BCRx_WREN_Pos)       /*!< 0x00001000 */\n#define FSMC_BCRx_WREN                      FSMC_BCRx_WREN_Msk                 /*!< Write enable bit */\n#define FSMC_BCRx_WAITEN_Pos                (13U)                              \n#define FSMC_BCRx_WAITEN_Msk                (0x1UL << FSMC_BCRx_WAITEN_Pos)     /*!< 0x00002000 */\n#define FSMC_BCRx_WAITEN                    FSMC_BCRx_WAITEN_Msk               /*!< Wait enable bit */\n#define FSMC_BCRx_EXTMOD_Pos                (14U)                              \n#define FSMC_BCRx_EXTMOD_Msk                (0x1UL << FSMC_BCRx_EXTMOD_Pos)     /*!< 0x00004000 */\n#define FSMC_BCRx_EXTMOD                    FSMC_BCRx_EXTMOD_Msk               /*!< Extended mode enable */\n#define FSMC_BCRx_ASYNCWAIT_Pos             (15U)                              \n#define FSMC_BCRx_ASYNCWAIT_Msk             (0x1UL << FSMC_BCRx_ASYNCWAIT_Pos)  /*!< 0x00008000 */\n#define FSMC_BCRx_ASYNCWAIT                 FSMC_BCRx_ASYNCWAIT_Msk            /*!< Asynchronous wait */\n#define FSMC_BCRx_CBURSTRW_Pos              (19U)                              \n#define FSMC_BCRx_CBURSTRW_Msk              (0x1UL << FSMC_BCRx_CBURSTRW_Pos)   /*!< 0x00080000 */\n#define FSMC_BCRx_CBURSTRW                  FSMC_BCRx_CBURSTRW_Msk             /*!< Write burst enable */\n\n/******************  Bit definition for FSMC_BTRx (x=1..4) register  ******/\n#define FSMC_BTRx_ADDSET_Pos                (0U)                               \n#define FSMC_BTRx_ADDSET_Msk                (0xFUL << FSMC_BTRx_ADDSET_Pos)     /*!< 0x0000000F */\n#define FSMC_BTRx_ADDSET                    FSMC_BTRx_ADDSET_Msk               /*!< ADDSET[3:0] bits (Address setup phase duration) */\n#define FSMC_BTRx_ADDSET_0                  (0x1UL << FSMC_BTRx_ADDSET_Pos)     /*!< 0x00000001 */\n#define FSMC_BTRx_ADDSET_1                  (0x2UL << FSMC_BTRx_ADDSET_Pos)     /*!< 0x00000002 */\n#define FSMC_BTRx_ADDSET_2                  (0x4UL << FSMC_BTRx_ADDSET_Pos)     /*!< 0x00000004 */\n#define FSMC_BTRx_ADDSET_3                  (0x8UL << FSMC_BTRx_ADDSET_Pos)     /*!< 0x00000008 */\n\n#define FSMC_BTRx_ADDHLD_Pos                (4U)                               \n#define FSMC_BTRx_ADDHLD_Msk                (0xFUL << FSMC_BTRx_ADDHLD_Pos)     /*!< 0x000000F0 */\n#define FSMC_BTRx_ADDHLD                    FSMC_BTRx_ADDHLD_Msk               /*!< ADDHLD[3:0] bits (Address-hold phase duration) */\n#define FSMC_BTRx_ADDHLD_0                  (0x1UL << FSMC_BTRx_ADDHLD_Pos)     /*!< 0x00000010 */\n#define FSMC_BTRx_ADDHLD_1                  (0x2UL << FSMC_BTRx_ADDHLD_Pos)     /*!< 0x00000020 */\n#define FSMC_BTRx_ADDHLD_2                  (0x4UL << FSMC_BTRx_ADDHLD_Pos)     /*!< 0x00000040 */\n#define FSMC_BTRx_ADDHLD_3                  (0x8UL << FSMC_BTRx_ADDHLD_Pos)     /*!< 0x00000080 */\n\n#define FSMC_BTRx_DATAST_Pos                (8U)                               \n#define FSMC_BTRx_DATAST_Msk                (0xFFUL << FSMC_BTRx_DATAST_Pos)    /*!< 0x0000FF00 */\n#define FSMC_BTRx_DATAST                    FSMC_BTRx_DATAST_Msk               /*!< DATAST [3:0] bits (Data-phase duration) */\n#define FSMC_BTRx_DATAST_0                  (0x01UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00000100 */\n#define FSMC_BTRx_DATAST_1                  (0x02UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00000200 */\n#define FSMC_BTRx_DATAST_2                  (0x04UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00000400 */\n#define FSMC_BTRx_DATAST_3                  (0x08UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00000800 */\n#define FSMC_BTRx_DATAST_4                  (0x10UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00001000 */\n#define FSMC_BTRx_DATAST_5                  (0x20UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00002000 */\n#define FSMC_BTRx_DATAST_6                  (0x40UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00004000 */\n#define FSMC_BTRx_DATAST_7                  (0x80UL << FSMC_BTRx_DATAST_Pos)    /*!< 0x00008000 */\n\n#define FSMC_BTRx_BUSTURN_Pos               (16U)                              \n#define FSMC_BTRx_BUSTURN_Msk               (0xFUL << FSMC_BTRx_BUSTURN_Pos)    /*!< 0x000F0000 */\n#define FSMC_BTRx_BUSTURN                   FSMC_BTRx_BUSTURN_Msk              /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */\n#define FSMC_BTRx_BUSTURN_0                 (0x1UL << FSMC_BTRx_BUSTURN_Pos)    /*!< 0x00010000 */\n#define FSMC_BTRx_BUSTURN_1                 (0x2UL << FSMC_BTRx_BUSTURN_Pos)    /*!< 0x00020000 */\n#define FSMC_BTRx_BUSTURN_2                 (0x4UL << FSMC_BTRx_BUSTURN_Pos)    /*!< 0x00040000 */\n#define FSMC_BTRx_BUSTURN_3                 (0x8UL << FSMC_BTRx_BUSTURN_Pos)    /*!< 0x00080000 */\n\n#define FSMC_BTRx_CLKDIV_Pos                (20U)                              \n#define FSMC_BTRx_CLKDIV_Msk                (0xFUL << FSMC_BTRx_CLKDIV_Pos)     /*!< 0x00F00000 */\n#define FSMC_BTRx_CLKDIV                    FSMC_BTRx_CLKDIV_Msk               /*!< CLKDIV[3:0] bits (Clock divide ratio) */\n#define FSMC_BTRx_CLKDIV_0                  (0x1UL << FSMC_BTRx_CLKDIV_Pos)     /*!< 0x00100000 */\n#define FSMC_BTRx_CLKDIV_1                  (0x2UL << FSMC_BTRx_CLKDIV_Pos)     /*!< 0x00200000 */\n#define FSMC_BTRx_CLKDIV_2                  (0x4UL << FSMC_BTRx_CLKDIV_Pos)     /*!< 0x00400000 */\n#define FSMC_BTRx_CLKDIV_3                  (0x8UL << FSMC_BTRx_CLKDIV_Pos)     /*!< 0x00800000 */\n\n#define FSMC_BTRx_DATLAT_Pos                (24U)                              \n#define FSMC_BTRx_DATLAT_Msk                (0xFUL << FSMC_BTRx_DATLAT_Pos)     /*!< 0x0F000000 */\n#define FSMC_BTRx_DATLAT                    FSMC_BTRx_DATLAT_Msk               /*!< DATLA[3:0] bits (Data latency) */\n#define FSMC_BTRx_DATLAT_0                  (0x1UL << FSMC_BTRx_DATLAT_Pos)     /*!< 0x01000000 */\n#define FSMC_BTRx_DATLAT_1                  (0x2UL << FSMC_BTRx_DATLAT_Pos)     /*!< 0x02000000 */\n#define FSMC_BTRx_DATLAT_2                  (0x4UL << FSMC_BTRx_DATLAT_Pos)     /*!< 0x04000000 */\n#define FSMC_BTRx_DATLAT_3                  (0x8UL << FSMC_BTRx_DATLAT_Pos)     /*!< 0x08000000 */\n\n#define FSMC_BTRx_ACCMOD_Pos                (28U)                              \n#define FSMC_BTRx_ACCMOD_Msk                (0x3UL << FSMC_BTRx_ACCMOD_Pos)     /*!< 0x30000000 */\n#define FSMC_BTRx_ACCMOD                    FSMC_BTRx_ACCMOD_Msk               /*!< ACCMOD[1:0] bits (Access mode) */\n#define FSMC_BTRx_ACCMOD_0                  (0x1UL << FSMC_BTRx_ACCMOD_Pos)     /*!< 0x10000000 */\n#define FSMC_BTRx_ACCMOD_1                  (0x2UL << FSMC_BTRx_ACCMOD_Pos)     /*!< 0x20000000 */\n\n/******************  Bit definition for FSMC_BWTRx (x=1..4) register  ******/\n#define FSMC_BWTRx_ADDSET_Pos               (0U)                               \n#define FSMC_BWTRx_ADDSET_Msk               (0xFUL << FSMC_BWTRx_ADDSET_Pos)    /*!< 0x0000000F */\n#define FSMC_BWTRx_ADDSET                   FSMC_BWTRx_ADDSET_Msk              /*!< ADDSET[3:0] bits (Address setup phase duration) */\n#define FSMC_BWTRx_ADDSET_0                 (0x1UL << FSMC_BWTRx_ADDSET_Pos)    /*!< 0x00000001 */\n#define FSMC_BWTRx_ADDSET_1                 (0x2UL << FSMC_BWTRx_ADDSET_Pos)    /*!< 0x00000002 */\n#define FSMC_BWTRx_ADDSET_2                 (0x4UL << FSMC_BWTRx_ADDSET_Pos)    /*!< 0x00000004 */\n#define FSMC_BWTRx_ADDSET_3                 (0x8UL << FSMC_BWTRx_ADDSET_Pos)    /*!< 0x00000008 */\n\n#define FSMC_BWTRx_ADDHLD_Pos               (4U)                               \n#define FSMC_BWTRx_ADDHLD_Msk               (0xFUL << FSMC_BWTRx_ADDHLD_Pos)    /*!< 0x000000F0 */\n#define FSMC_BWTRx_ADDHLD                   FSMC_BWTRx_ADDHLD_Msk              /*!< ADDHLD[3:0] bits (Address-hold phase duration) */\n#define FSMC_BWTRx_ADDHLD_0                 (0x1UL << FSMC_BWTRx_ADDHLD_Pos)    /*!< 0x00000010 */\n#define FSMC_BWTRx_ADDHLD_1                 (0x2UL << FSMC_BWTRx_ADDHLD_Pos)    /*!< 0x00000020 */\n#define FSMC_BWTRx_ADDHLD_2                 (0x4UL << FSMC_BWTRx_ADDHLD_Pos)    /*!< 0x00000040 */\n#define FSMC_BWTRx_ADDHLD_3                 (0x8UL << FSMC_BWTRx_ADDHLD_Pos)    /*!< 0x00000080 */\n\n#define FSMC_BWTRx_DATAST_Pos               (8U)                               \n#define FSMC_BWTRx_DATAST_Msk               (0xFFUL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x0000FF00 */\n#define FSMC_BWTRx_DATAST                   FSMC_BWTRx_DATAST_Msk              /*!< DATAST [3:0] bits (Data-phase duration) */\n#define FSMC_BWTRx_DATAST_0                 (0x01UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00000100 */\n#define FSMC_BWTRx_DATAST_1                 (0x02UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00000200 */\n#define FSMC_BWTRx_DATAST_2                 (0x04UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00000400 */\n#define FSMC_BWTRx_DATAST_3                 (0x08UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00000800 */\n#define FSMC_BWTRx_DATAST_4                 (0x10UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00001000 */\n#define FSMC_BWTRx_DATAST_5                 (0x20UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00002000 */\n#define FSMC_BWTRx_DATAST_6                 (0x40UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00004000 */\n#define FSMC_BWTRx_DATAST_7                 (0x80UL << FSMC_BWTRx_DATAST_Pos)   /*!< 0x00008000 */\n\n#define FSMC_BWTRx_BUSTURN_Pos              (16U)                              \n#define FSMC_BWTRx_BUSTURN_Msk              (0xFUL << FSMC_BWTRx_BUSTURN_Pos)   /*!< 0x000F0000 */\n#define FSMC_BWTRx_BUSTURN                  FSMC_BWTRx_BUSTURN_Msk             /*!< BUSTURN[3:0] bits (Bus turnaround phase duration) */\n#define FSMC_BWTRx_BUSTURN_0                (0x1UL << FSMC_BWTRx_BUSTURN_Pos)   /*!< 0x00010000 */\n#define FSMC_BWTRx_BUSTURN_1                (0x2UL << FSMC_BWTRx_BUSTURN_Pos)   /*!< 0x00020000 */\n#define FSMC_BWTRx_BUSTURN_2                (0x4UL << FSMC_BWTRx_BUSTURN_Pos)   /*!< 0x00040000 */\n#define FSMC_BWTRx_BUSTURN_3                (0x8UL << FSMC_BWTRx_BUSTURN_Pos)   /*!< 0x00080000 */\n\n#define FSMC_BWTRx_ACCMOD_Pos               (28U)                              \n#define FSMC_BWTRx_ACCMOD_Msk               (0x3UL << FSMC_BWTRx_ACCMOD_Pos)    /*!< 0x30000000 */\n#define FSMC_BWTRx_ACCMOD                   FSMC_BWTRx_ACCMOD_Msk              /*!< ACCMOD[1:0] bits (Access mode) */\n#define FSMC_BWTRx_ACCMOD_0                 (0x1UL << FSMC_BWTRx_ACCMOD_Pos)    /*!< 0x10000000 */\n#define FSMC_BWTRx_ACCMOD_1                 (0x2UL << FSMC_BWTRx_ACCMOD_Pos)    /*!< 0x20000000 */\n\n/******************  Bit definition for FSMC_PCRx (x = 2 to 4) register  *******************/\n#define FSMC_PCRx_PWAITEN_Pos               (1U)                               \n#define FSMC_PCRx_PWAITEN_Msk               (0x1UL << FSMC_PCRx_PWAITEN_Pos)    /*!< 0x00000002 */\n#define FSMC_PCRx_PWAITEN                   FSMC_PCRx_PWAITEN_Msk              /*!< Wait feature enable bit */\n#define FSMC_PCRx_PBKEN_Pos                 (2U)                               \n#define FSMC_PCRx_PBKEN_Msk                 (0x1UL << FSMC_PCRx_PBKEN_Pos)      /*!< 0x00000004 */\n#define FSMC_PCRx_PBKEN                     FSMC_PCRx_PBKEN_Msk                /*!< PC Card/NAND Flash memory bank enable bit */\n#define FSMC_PCRx_PTYP_Pos                  (3U)                               \n#define FSMC_PCRx_PTYP_Msk                  (0x1UL << FSMC_PCRx_PTYP_Pos)       /*!< 0x00000008 */\n#define FSMC_PCRx_PTYP                      FSMC_PCRx_PTYP_Msk                 /*!< Memory type */\n\n#define FSMC_PCRx_PWID_Pos                  (4U)                               \n#define FSMC_PCRx_PWID_Msk                  (0x3UL << FSMC_PCRx_PWID_Pos)       /*!< 0x00000030 */\n#define FSMC_PCRx_PWID                      FSMC_PCRx_PWID_Msk                 /*!< PWID[1:0] bits (NAND Flash databus width) */\n#define FSMC_PCRx_PWID_0                    (0x1UL << FSMC_PCRx_PWID_Pos)       /*!< 0x00000010 */\n#define FSMC_PCRx_PWID_1                    (0x2UL << FSMC_PCRx_PWID_Pos)       /*!< 0x00000020 */\n\n#define FSMC_PCRx_ECCEN_Pos                 (6U)                               \n#define FSMC_PCRx_ECCEN_Msk                 (0x1UL << FSMC_PCRx_ECCEN_Pos)      /*!< 0x00000040 */\n#define FSMC_PCRx_ECCEN                     FSMC_PCRx_ECCEN_Msk                /*!< ECC computation logic enable bit */\n\n#define FSMC_PCRx_TCLR_Pos                  (9U)                               \n#define FSMC_PCRx_TCLR_Msk                  (0xFUL << FSMC_PCRx_TCLR_Pos)       /*!< 0x00001E00 */\n#define FSMC_PCRx_TCLR                      FSMC_PCRx_TCLR_Msk                 /*!< TCLR[3:0] bits (CLE to RE delay) */\n#define FSMC_PCRx_TCLR_0                    (0x1UL << FSMC_PCRx_TCLR_Pos)       /*!< 0x00000200 */\n#define FSMC_PCRx_TCLR_1                    (0x2UL << FSMC_PCRx_TCLR_Pos)       /*!< 0x00000400 */\n#define FSMC_PCRx_TCLR_2                    (0x4UL << FSMC_PCRx_TCLR_Pos)       /*!< 0x00000800 */\n#define FSMC_PCRx_TCLR_3                    (0x8UL << FSMC_PCRx_TCLR_Pos)       /*!< 0x00001000 */\n\n#define FSMC_PCRx_TAR_Pos                   (13U)                              \n#define FSMC_PCRx_TAR_Msk                   (0xFUL << FSMC_PCRx_TAR_Pos)        /*!< 0x0001E000 */\n#define FSMC_PCRx_TAR                       FSMC_PCRx_TAR_Msk                  /*!< TAR[3:0] bits (ALE to RE delay) */\n#define FSMC_PCRx_TAR_0                     (0x1UL << FSMC_PCRx_TAR_Pos)        /*!< 0x00002000 */\n#define FSMC_PCRx_TAR_1                     (0x2UL << FSMC_PCRx_TAR_Pos)        /*!< 0x00004000 */\n#define FSMC_PCRx_TAR_2                     (0x4UL << FSMC_PCRx_TAR_Pos)        /*!< 0x00008000 */\n#define FSMC_PCRx_TAR_3                     (0x8UL << FSMC_PCRx_TAR_Pos)        /*!< 0x00010000 */\n\n#define FSMC_PCRx_ECCPS_Pos                 (17U)                              \n#define FSMC_PCRx_ECCPS_Msk                 (0x7UL << FSMC_PCRx_ECCPS_Pos)      /*!< 0x000E0000 */\n#define FSMC_PCRx_ECCPS                     FSMC_PCRx_ECCPS_Msk                /*!< ECCPS[1:0] bits (ECC page size) */\n#define FSMC_PCRx_ECCPS_0                   (0x1UL << FSMC_PCRx_ECCPS_Pos)      /*!< 0x00020000 */\n#define FSMC_PCRx_ECCPS_1                   (0x2UL << FSMC_PCRx_ECCPS_Pos)      /*!< 0x00040000 */\n#define FSMC_PCRx_ECCPS_2                   (0x4UL << FSMC_PCRx_ECCPS_Pos)      /*!< 0x00080000 */\n\n/*******************  Bit definition for FSMC_SRx (x = 2 to 4) register  *******************/\n#define FSMC_SRx_IRS_Pos                    (0U)                               \n#define FSMC_SRx_IRS_Msk                    (0x1UL << FSMC_SRx_IRS_Pos)         /*!< 0x00000001 */\n#define FSMC_SRx_IRS                        FSMC_SRx_IRS_Msk                   /*!< Interrupt Rising Edge status */\n#define FSMC_SRx_ILS_Pos                    (1U)                               \n#define FSMC_SRx_ILS_Msk                    (0x1UL << FSMC_SRx_ILS_Pos)         /*!< 0x00000002 */\n#define FSMC_SRx_ILS                        FSMC_SRx_ILS_Msk                   /*!< Interrupt Level status */\n#define FSMC_SRx_IFS_Pos                    (2U)                               \n#define FSMC_SRx_IFS_Msk                    (0x1UL << FSMC_SRx_IFS_Pos)         /*!< 0x00000004 */\n#define FSMC_SRx_IFS                        FSMC_SRx_IFS_Msk                   /*!< Interrupt Falling Edge status */\n#define FSMC_SRx_IREN_Pos                   (3U)                               \n#define FSMC_SRx_IREN_Msk                   (0x1UL << FSMC_SRx_IREN_Pos)        /*!< 0x00000008 */\n#define FSMC_SRx_IREN                       FSMC_SRx_IREN_Msk                  /*!< Interrupt Rising Edge detection Enable bit */\n#define FSMC_SRx_ILEN_Pos                   (4U)                               \n#define FSMC_SRx_ILEN_Msk                   (0x1UL << FSMC_SRx_ILEN_Pos)        /*!< 0x00000010 */\n#define FSMC_SRx_ILEN                       FSMC_SRx_ILEN_Msk                  /*!< Interrupt Level detection Enable bit */\n#define FSMC_SRx_IFEN_Pos                   (5U)                               \n#define FSMC_SRx_IFEN_Msk                   (0x1UL << FSMC_SRx_IFEN_Pos)        /*!< 0x00000020 */\n#define FSMC_SRx_IFEN                       FSMC_SRx_IFEN_Msk                  /*!< Interrupt Falling Edge detection Enable bit */\n#define FSMC_SRx_FEMPT_Pos                  (6U)                               \n#define FSMC_SRx_FEMPT_Msk                  (0x1UL << FSMC_SRx_FEMPT_Pos)       /*!< 0x00000040 */\n#define FSMC_SRx_FEMPT                      FSMC_SRx_FEMPT_Msk                 /*!< FIFO empty */\n\n/******************  Bit definition for FSMC_PMEMx (x = 2 to 4) register  ******************/\n#define FSMC_PMEMx_MEMSETx_Pos              (0U)                               \n#define FSMC_PMEMx_MEMSETx_Msk              (0xFFUL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x000000FF */\n#define FSMC_PMEMx_MEMSETx                  FSMC_PMEMx_MEMSETx_Msk             /*!< MEMSETx[7:0] bits (Common memory x setup time) */\n#define FSMC_PMEMx_MEMSETx_0                (0x01UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000001 */\n#define FSMC_PMEMx_MEMSETx_1                (0x02UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000002 */\n#define FSMC_PMEMx_MEMSETx_2                (0x04UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000004 */\n#define FSMC_PMEMx_MEMSETx_3                (0x08UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000008 */\n#define FSMC_PMEMx_MEMSETx_4                (0x10UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000010 */\n#define FSMC_PMEMx_MEMSETx_5                (0x20UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000020 */\n#define FSMC_PMEMx_MEMSETx_6                (0x40UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000040 */\n#define FSMC_PMEMx_MEMSETx_7                (0x80UL << FSMC_PMEMx_MEMSETx_Pos)  /*!< 0x00000080 */\n\n#define FSMC_PMEMx_MEMWAITx_Pos             (8U)                               \n#define FSMC_PMEMx_MEMWAITx_Msk             (0xFFUL << FSMC_PMEMx_MEMWAITx_Pos) /*!< 0x0000FF00 */\n#define FSMC_PMEMx_MEMWAITx                 FSMC_PMEMx_MEMWAITx_Msk            /*!< MEMWAITx[7:0] bits (Common memory x wait time) */\n#define FSMC_PMEMx_MEMWAIT2_0               0x00000100U                        /*!< Bit 0 */\n#define FSMC_PMEMx_MEMWAITx_1               0x00000200U                        /*!< Bit 1 */\n#define FSMC_PMEMx_MEMWAITx_2               0x00000400U                        /*!< Bit 2 */\n#define FSMC_PMEMx_MEMWAITx_3               0x00000800U                        /*!< Bit 3 */\n#define FSMC_PMEMx_MEMWAITx_4               0x00001000U                        /*!< Bit 4 */\n#define FSMC_PMEMx_MEMWAITx_5               0x00002000U                        /*!< Bit 5 */\n#define FSMC_PMEMx_MEMWAITx_6               0x00004000U                        /*!< Bit 6 */\n#define FSMC_PMEMx_MEMWAITx_7               0x00008000U                        /*!< Bit 7 */\n\n#define FSMC_PMEMx_MEMHOLDx_Pos             (16U)                              \n#define FSMC_PMEMx_MEMHOLDx_Msk             (0xFFUL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00FF0000 */\n#define FSMC_PMEMx_MEMHOLDx                 FSMC_PMEMx_MEMHOLDx_Msk            /*!< MEMHOLDx[7:0] bits (Common memory x hold time) */\n#define FSMC_PMEMx_MEMHOLDx_0               (0x01UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00010000 */\n#define FSMC_PMEMx_MEMHOLDx_1               (0x02UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00020000 */\n#define FSMC_PMEMx_MEMHOLDx_2               (0x04UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00040000 */\n#define FSMC_PMEMx_MEMHOLDx_3               (0x08UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00080000 */\n#define FSMC_PMEMx_MEMHOLDx_4               (0x10UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00100000 */\n#define FSMC_PMEMx_MEMHOLDx_5               (0x20UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00200000 */\n#define FSMC_PMEMx_MEMHOLDx_6               (0x40UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00400000 */\n#define FSMC_PMEMx_MEMHOLDx_7               (0x80UL << FSMC_PMEMx_MEMHOLDx_Pos) /*!< 0x00800000 */\n\n#define FSMC_PMEMx_MEMHIZx_Pos              (24U)                              \n#define FSMC_PMEMx_MEMHIZx_Msk              (0xFFUL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0xFF000000 */\n#define FSMC_PMEMx_MEMHIZx                  FSMC_PMEMx_MEMHIZx_Msk             /*!< MEMHIZx[7:0] bits (Common memory x databus HiZ time) */\n#define FSMC_PMEMx_MEMHIZx_0                (0x01UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x01000000 */\n#define FSMC_PMEMx_MEMHIZx_1                (0x02UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x02000000 */\n#define FSMC_PMEMx_MEMHIZx_2                (0x04UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x04000000 */\n#define FSMC_PMEMx_MEMHIZx_3                (0x08UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x08000000 */\n#define FSMC_PMEMx_MEMHIZx_4                (0x10UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x10000000 */\n#define FSMC_PMEMx_MEMHIZx_5                (0x20UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x20000000 */\n#define FSMC_PMEMx_MEMHIZx_6                (0x40UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x40000000 */\n#define FSMC_PMEMx_MEMHIZx_7                (0x80UL << FSMC_PMEMx_MEMHIZx_Pos)  /*!< 0x80000000 */\n\n/******************  Bit definition for FSMC_PATTx (x = 2 to 4) register  ******************/\n#define FSMC_PATTx_ATTSETx_Pos              (0U)                               \n#define FSMC_PATTx_ATTSETx_Msk              (0xFFUL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x000000FF */\n#define FSMC_PATTx_ATTSETx                  FSMC_PATTx_ATTSETx_Msk             /*!< ATTSETx[7:0] bits (Attribute memory x setup time) */\n#define FSMC_PATTx_ATTSETx_0                (0x01UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000001 */\n#define FSMC_PATTx_ATTSETx_1                (0x02UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000002 */\n#define FSMC_PATTx_ATTSETx_2                (0x04UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000004 */\n#define FSMC_PATTx_ATTSETx_3                (0x08UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000008 */\n#define FSMC_PATTx_ATTSETx_4                (0x10UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000010 */\n#define FSMC_PATTx_ATTSETx_5                (0x20UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000020 */\n#define FSMC_PATTx_ATTSETx_6                (0x40UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000040 */\n#define FSMC_PATTx_ATTSETx_7                (0x80UL << FSMC_PATTx_ATTSETx_Pos)  /*!< 0x00000080 */\n\n#define FSMC_PATTx_ATTWAITx_Pos             (8U)                               \n#define FSMC_PATTx_ATTWAITx_Msk             (0xFFUL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x0000FF00 */\n#define FSMC_PATTx_ATTWAITx                 FSMC_PATTx_ATTWAITx_Msk            /*!< ATTWAITx[7:0] bits (Attribute memory x wait time) */\n#define FSMC_PATTx_ATTWAITx_0               (0x01UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00000100 */\n#define FSMC_PATTx_ATTWAITx_1               (0x02UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00000200 */\n#define FSMC_PATTx_ATTWAITx_2               (0x04UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00000400 */\n#define FSMC_PATTx_ATTWAITx_3               (0x08UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00000800 */\n#define FSMC_PATTx_ATTWAITx_4               (0x10UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00001000 */\n#define FSMC_PATTx_ATTWAITx_5               (0x20UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00002000 */\n#define FSMC_PATTx_ATTWAITx_6               (0x40UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00004000 */\n#define FSMC_PATTx_ATTWAITx_7               (0x80UL << FSMC_PATTx_ATTWAITx_Pos) /*!< 0x00008000 */\n\n#define FSMC_PATTx_ATTHOLDx_Pos             (16U)                              \n#define FSMC_PATTx_ATTHOLDx_Msk             (0xFFUL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00FF0000 */\n#define FSMC_PATTx_ATTHOLDx                 FSMC_PATTx_ATTHOLDx_Msk            /*!< ATTHOLDx[7:0] bits (Attribute memory x hold time) */\n#define FSMC_PATTx_ATTHOLDx_0               (0x01UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00010000 */\n#define FSMC_PATTx_ATTHOLDx_1               (0x02UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00020000 */\n#define FSMC_PATTx_ATTHOLDx_2               (0x04UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00040000 */\n#define FSMC_PATTx_ATTHOLDx_3               (0x08UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00080000 */\n#define FSMC_PATTx_ATTHOLDx_4               (0x10UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00100000 */\n#define FSMC_PATTx_ATTHOLDx_5               (0x20UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00200000 */\n#define FSMC_PATTx_ATTHOLDx_6               (0x40UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00400000 */\n#define FSMC_PATTx_ATTHOLDx_7               (0x80UL << FSMC_PATTx_ATTHOLDx_Pos) /*!< 0x00800000 */\n\n#define FSMC_PATTx_ATTHIZx_Pos              (24U)                              \n#define FSMC_PATTx_ATTHIZx_Msk              (0xFFUL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0xFF000000 */\n#define FSMC_PATTx_ATTHIZx                  FSMC_PATTx_ATTHIZx_Msk             /*!< ATTHIZx[7:0] bits (Attribute memory x databus HiZ time) */\n#define FSMC_PATTx_ATTHIZx_0                (0x01UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x01000000 */\n#define FSMC_PATTx_ATTHIZx_1                (0x02UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x02000000 */\n#define FSMC_PATTx_ATTHIZx_2                (0x04UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x04000000 */\n#define FSMC_PATTx_ATTHIZx_3                (0x08UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x08000000 */\n#define FSMC_PATTx_ATTHIZx_4                (0x10UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x10000000 */\n#define FSMC_PATTx_ATTHIZx_5                (0x20UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x20000000 */\n#define FSMC_PATTx_ATTHIZx_6                (0x40UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x40000000 */\n#define FSMC_PATTx_ATTHIZx_7                (0x80UL << FSMC_PATTx_ATTHIZx_Pos)  /*!< 0x80000000 */\n\n/******************  Bit definition for FSMC_PIO4 register  *******************/\n#define FSMC_PIO4_IOSET4_Pos                (0U)                               \n#define FSMC_PIO4_IOSET4_Msk                (0xFFUL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x000000FF */\n#define FSMC_PIO4_IOSET4                    FSMC_PIO4_IOSET4_Msk               /*!< IOSET4[7:0] bits (I/O 4 setup time) */\n#define FSMC_PIO4_IOSET4_0                  (0x01UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000001 */\n#define FSMC_PIO4_IOSET4_1                  (0x02UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000002 */\n#define FSMC_PIO4_IOSET4_2                  (0x04UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000004 */\n#define FSMC_PIO4_IOSET4_3                  (0x08UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000008 */\n#define FSMC_PIO4_IOSET4_4                  (0x10UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000010 */\n#define FSMC_PIO4_IOSET4_5                  (0x20UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000020 */\n#define FSMC_PIO4_IOSET4_6                  (0x40UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000040 */\n#define FSMC_PIO4_IOSET4_7                  (0x80UL << FSMC_PIO4_IOSET4_Pos)    /*!< 0x00000080 */\n\n#define FSMC_PIO4_IOWAIT4_Pos               (8U)                               \n#define FSMC_PIO4_IOWAIT4_Msk               (0xFFUL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x0000FF00 */\n#define FSMC_PIO4_IOWAIT4                   FSMC_PIO4_IOWAIT4_Msk              /*!< IOWAIT4[7:0] bits (I/O 4 wait time) */\n#define FSMC_PIO4_IOWAIT4_0                 (0x01UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00000100 */\n#define FSMC_PIO4_IOWAIT4_1                 (0x02UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00000200 */\n#define FSMC_PIO4_IOWAIT4_2                 (0x04UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00000400 */\n#define FSMC_PIO4_IOWAIT4_3                 (0x08UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00000800 */\n#define FSMC_PIO4_IOWAIT4_4                 (0x10UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00001000 */\n#define FSMC_PIO4_IOWAIT4_5                 (0x20UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00002000 */\n#define FSMC_PIO4_IOWAIT4_6                 (0x40UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00004000 */\n#define FSMC_PIO4_IOWAIT4_7                 (0x80UL << FSMC_PIO4_IOWAIT4_Pos)   /*!< 0x00008000 */\n\n#define FSMC_PIO4_IOHOLD4_Pos               (16U)                              \n#define FSMC_PIO4_IOHOLD4_Msk               (0xFFUL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00FF0000 */\n#define FSMC_PIO4_IOHOLD4                   FSMC_PIO4_IOHOLD4_Msk              /*!< IOHOLD4[7:0] bits (I/O 4 hold time) */\n#define FSMC_PIO4_IOHOLD4_0                 (0x01UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00010000 */\n#define FSMC_PIO4_IOHOLD4_1                 (0x02UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00020000 */\n#define FSMC_PIO4_IOHOLD4_2                 (0x04UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00040000 */\n#define FSMC_PIO4_IOHOLD4_3                 (0x08UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00080000 */\n#define FSMC_PIO4_IOHOLD4_4                 (0x10UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00100000 */\n#define FSMC_PIO4_IOHOLD4_5                 (0x20UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00200000 */\n#define FSMC_PIO4_IOHOLD4_6                 (0x40UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00400000 */\n#define FSMC_PIO4_IOHOLD4_7                 (0x80UL << FSMC_PIO4_IOHOLD4_Pos)   /*!< 0x00800000 */\n\n#define FSMC_PIO4_IOHIZ4_Pos                (24U)                              \n#define FSMC_PIO4_IOHIZ4_Msk                (0xFFUL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0xFF000000 */\n#define FSMC_PIO4_IOHIZ4                    FSMC_PIO4_IOHIZ4_Msk               /*!< IOHIZ4[7:0] bits (I/O 4 databus HiZ time) */\n#define FSMC_PIO4_IOHIZ4_0                  (0x01UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x01000000 */\n#define FSMC_PIO4_IOHIZ4_1                  (0x02UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x02000000 */\n#define FSMC_PIO4_IOHIZ4_2                  (0x04UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x04000000 */\n#define FSMC_PIO4_IOHIZ4_3                  (0x08UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x08000000 */\n#define FSMC_PIO4_IOHIZ4_4                  (0x10UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x10000000 */\n#define FSMC_PIO4_IOHIZ4_5                  (0x20UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x20000000 */\n#define FSMC_PIO4_IOHIZ4_6                  (0x40UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x40000000 */\n#define FSMC_PIO4_IOHIZ4_7                  (0x80UL << FSMC_PIO4_IOHIZ4_Pos)    /*!< 0x80000000 */\n\n/******************  Bit definition for FSMC_ECCR2 register  ******************/\n#define FSMC_ECCR2_ECC2_Pos                 (0U)                               \n#define FSMC_ECCR2_ECC2_Msk                 (0xFFFFFFFFUL << FSMC_ECCR2_ECC2_Pos) /*!< 0xFFFFFFFF */\n#define FSMC_ECCR2_ECC2                     FSMC_ECCR2_ECC2_Msk                /*!< ECC result */\n\n/******************  Bit definition for FSMC_ECCR3 register  ******************/\n#define FSMC_ECCR3_ECC3_Pos                 (0U)                               \n#define FSMC_ECCR3_ECC3_Msk                 (0xFFFFFFFFUL << FSMC_ECCR3_ECC3_Pos) /*!< 0xFFFFFFFF */\n#define FSMC_ECCR3_ECC3                     FSMC_ECCR3_ECC3_Msk                /*!< ECC result */\n\n/******************************************************************************/\n/*                                                                            */\n/*                          SD host Interface                                 */\n/*                                                                            */\n/******************************************************************************/\n\n/******************  Bit definition for SDIO_POWER register  ******************/\n#define SDIO_POWER_PWRCTRL_Pos              (0U)                               \n#define SDIO_POWER_PWRCTRL_Msk              (0x3UL << SDIO_POWER_PWRCTRL_Pos)   /*!< 0x00000003 */\n#define SDIO_POWER_PWRCTRL                  SDIO_POWER_PWRCTRL_Msk             /*!< PWRCTRL[1:0] bits (Power supply control bits) */\n#define SDIO_POWER_PWRCTRL_0                (0x1UL << SDIO_POWER_PWRCTRL_Pos)   /*!< 0x01 */\n#define SDIO_POWER_PWRCTRL_1                (0x2UL << SDIO_POWER_PWRCTRL_Pos)   /*!< 0x02 */\n\n/******************  Bit definition for SDIO_CLKCR register  ******************/\n#define SDIO_CLKCR_CLKDIV_Pos               (0U)                               \n#define SDIO_CLKCR_CLKDIV_Msk               (0xFFUL << SDIO_CLKCR_CLKDIV_Pos)   /*!< 0x000000FF */\n#define SDIO_CLKCR_CLKDIV                   SDIO_CLKCR_CLKDIV_Msk              /*!< Clock divide factor */\n#define SDIO_CLKCR_CLKEN_Pos                (8U)                               \n#define SDIO_CLKCR_CLKEN_Msk                (0x1UL << SDIO_CLKCR_CLKEN_Pos)     /*!< 0x00000100 */\n#define SDIO_CLKCR_CLKEN                    SDIO_CLKCR_CLKEN_Msk               /*!< Clock enable bit */\n#define SDIO_CLKCR_PWRSAV_Pos               (9U)                               \n#define SDIO_CLKCR_PWRSAV_Msk               (0x1UL << SDIO_CLKCR_PWRSAV_Pos)    /*!< 0x00000200 */\n#define SDIO_CLKCR_PWRSAV                   SDIO_CLKCR_PWRSAV_Msk              /*!< Power saving configuration bit */\n#define SDIO_CLKCR_BYPASS_Pos               (10U)                              \n#define SDIO_CLKCR_BYPASS_Msk               (0x1UL << SDIO_CLKCR_BYPASS_Pos)    /*!< 0x00000400 */\n#define SDIO_CLKCR_BYPASS                   SDIO_CLKCR_BYPASS_Msk              /*!< Clock divider bypass enable bit */\n\n#define SDIO_CLKCR_WIDBUS_Pos               (11U)                              \n#define SDIO_CLKCR_WIDBUS_Msk               (0x3UL << SDIO_CLKCR_WIDBUS_Pos)    /*!< 0x00001800 */\n#define SDIO_CLKCR_WIDBUS                   SDIO_CLKCR_WIDBUS_Msk              /*!< WIDBUS[1:0] bits (Wide bus mode enable bit) */\n#define SDIO_CLKCR_WIDBUS_0                 (0x1UL << SDIO_CLKCR_WIDBUS_Pos)    /*!< 0x0800 */\n#define SDIO_CLKCR_WIDBUS_1                 (0x2UL << SDIO_CLKCR_WIDBUS_Pos)    /*!< 0x1000 */\n\n#define SDIO_CLKCR_NEGEDGE_Pos              (13U)                              \n#define SDIO_CLKCR_NEGEDGE_Msk              (0x1UL << SDIO_CLKCR_NEGEDGE_Pos)   /*!< 0x00002000 */\n#define SDIO_CLKCR_NEGEDGE                  SDIO_CLKCR_NEGEDGE_Msk             /*!< SDIO_CK dephasing selection bit */\n#define SDIO_CLKCR_HWFC_EN_Pos              (14U)                              \n#define SDIO_CLKCR_HWFC_EN_Msk              (0x1UL << SDIO_CLKCR_HWFC_EN_Pos)   /*!< 0x00004000 */\n#define SDIO_CLKCR_HWFC_EN                  SDIO_CLKCR_HWFC_EN_Msk             /*!< HW Flow Control enable */\n\n/*******************  Bit definition for SDIO_ARG register  *******************/\n#define SDIO_ARG_CMDARG_Pos                 (0U)                               \n#define SDIO_ARG_CMDARG_Msk                 (0xFFFFFFFFUL << SDIO_ARG_CMDARG_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_ARG_CMDARG                     SDIO_ARG_CMDARG_Msk                /*!< Command argument */\n\n/*******************  Bit definition for SDIO_CMD register  *******************/\n#define SDIO_CMD_CMDINDEX_Pos               (0U)                               \n#define SDIO_CMD_CMDINDEX_Msk               (0x3FUL << SDIO_CMD_CMDINDEX_Pos)   /*!< 0x0000003F */\n#define SDIO_CMD_CMDINDEX                   SDIO_CMD_CMDINDEX_Msk              /*!< Command Index */\n\n#define SDIO_CMD_WAITRESP_Pos               (6U)                               \n#define SDIO_CMD_WAITRESP_Msk               (0x3UL << SDIO_CMD_WAITRESP_Pos)    /*!< 0x000000C0 */\n#define SDIO_CMD_WAITRESP                   SDIO_CMD_WAITRESP_Msk              /*!< WAITRESP[1:0] bits (Wait for response bits) */\n#define SDIO_CMD_WAITRESP_0                 (0x1UL << SDIO_CMD_WAITRESP_Pos)    /*!< 0x0040 */\n#define SDIO_CMD_WAITRESP_1                 (0x2UL << SDIO_CMD_WAITRESP_Pos)    /*!< 0x0080 */\n\n#define SDIO_CMD_WAITINT_Pos                (8U)                               \n#define SDIO_CMD_WAITINT_Msk                (0x1UL << SDIO_CMD_WAITINT_Pos)     /*!< 0x00000100 */\n#define SDIO_CMD_WAITINT                    SDIO_CMD_WAITINT_Msk               /*!< CPSM Waits for Interrupt Request */\n#define SDIO_CMD_WAITPEND_Pos               (9U)                               \n#define SDIO_CMD_WAITPEND_Msk               (0x1UL << SDIO_CMD_WAITPEND_Pos)    /*!< 0x00000200 */\n#define SDIO_CMD_WAITPEND                   SDIO_CMD_WAITPEND_Msk              /*!< CPSM Waits for ends of data transfer (CmdPend internal signal) */\n#define SDIO_CMD_CPSMEN_Pos                 (10U)                              \n#define SDIO_CMD_CPSMEN_Msk                 (0x1UL << SDIO_CMD_CPSMEN_Pos)      /*!< 0x00000400 */\n#define SDIO_CMD_CPSMEN                     SDIO_CMD_CPSMEN_Msk                /*!< Command path state machine (CPSM) Enable bit */\n#define SDIO_CMD_SDIOSUSPEND_Pos            (11U)                              \n#define SDIO_CMD_SDIOSUSPEND_Msk            (0x1UL << SDIO_CMD_SDIOSUSPEND_Pos) /*!< 0x00000800 */\n#define SDIO_CMD_SDIOSUSPEND                SDIO_CMD_SDIOSUSPEND_Msk           /*!< SD I/O suspend command */\n#define SDIO_CMD_ENCMDCOMPL_Pos             (12U)                              \n#define SDIO_CMD_ENCMDCOMPL_Msk             (0x1UL << SDIO_CMD_ENCMDCOMPL_Pos)  /*!< 0x00001000 */\n#define SDIO_CMD_ENCMDCOMPL                 SDIO_CMD_ENCMDCOMPL_Msk            /*!< Enable CMD completion */\n#define SDIO_CMD_NIEN_Pos                   (13U)                              \n#define SDIO_CMD_NIEN_Msk                   (0x1UL << SDIO_CMD_NIEN_Pos)        /*!< 0x00002000 */\n#define SDIO_CMD_NIEN                       SDIO_CMD_NIEN_Msk                  /*!< Not Interrupt Enable */\n#define SDIO_CMD_CEATACMD_Pos               (14U)                              \n#define SDIO_CMD_CEATACMD_Msk               (0x1UL << SDIO_CMD_CEATACMD_Pos)    /*!< 0x00004000 */\n#define SDIO_CMD_CEATACMD                   SDIO_CMD_CEATACMD_Msk              /*!< CE-ATA command */\n\n/*****************  Bit definition for SDIO_RESPCMD register  *****************/\n#define SDIO_RESPCMD_RESPCMD_Pos            (0U)                               \n#define SDIO_RESPCMD_RESPCMD_Msk            (0x3FUL << SDIO_RESPCMD_RESPCMD_Pos) /*!< 0x0000003F */\n#define SDIO_RESPCMD_RESPCMD                SDIO_RESPCMD_RESPCMD_Msk           /*!< Response command index */\n\n/******************  Bit definition for SDIO_RESP0 register  ******************/\n#define SDIO_RESP0_CARDSTATUS0_Pos          (0U)                               \n#define SDIO_RESP0_CARDSTATUS0_Msk          (0xFFFFFFFFUL << SDIO_RESP0_CARDSTATUS0_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_RESP0_CARDSTATUS0              SDIO_RESP0_CARDSTATUS0_Msk         /*!< Card Status */\n\n/******************  Bit definition for SDIO_RESP1 register  ******************/\n#define SDIO_RESP1_CARDSTATUS1_Pos          (0U)                               \n#define SDIO_RESP1_CARDSTATUS1_Msk          (0xFFFFFFFFUL << SDIO_RESP1_CARDSTATUS1_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_RESP1_CARDSTATUS1              SDIO_RESP1_CARDSTATUS1_Msk         /*!< Card Status */\n\n/******************  Bit definition for SDIO_RESP2 register  ******************/\n#define SDIO_RESP2_CARDSTATUS2_Pos          (0U)                               \n#define SDIO_RESP2_CARDSTATUS2_Msk          (0xFFFFFFFFUL << SDIO_RESP2_CARDSTATUS2_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_RESP2_CARDSTATUS2              SDIO_RESP2_CARDSTATUS2_Msk         /*!< Card Status */\n\n/******************  Bit definition for SDIO_RESP3 register  ******************/\n#define SDIO_RESP3_CARDSTATUS3_Pos          (0U)                               \n#define SDIO_RESP3_CARDSTATUS3_Msk          (0xFFFFFFFFUL << SDIO_RESP3_CARDSTATUS3_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_RESP3_CARDSTATUS3              SDIO_RESP3_CARDSTATUS3_Msk         /*!< Card Status */\n\n/******************  Bit definition for SDIO_RESP4 register  ******************/\n#define SDIO_RESP4_CARDSTATUS4_Pos          (0U)                               \n#define SDIO_RESP4_CARDSTATUS4_Msk          (0xFFFFFFFFUL << SDIO_RESP4_CARDSTATUS4_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_RESP4_CARDSTATUS4              SDIO_RESP4_CARDSTATUS4_Msk         /*!< Card Status */\n\n/******************  Bit definition for SDIO_DTIMER register  *****************/\n#define SDIO_DTIMER_DATATIME_Pos            (0U)                               \n#define SDIO_DTIMER_DATATIME_Msk            (0xFFFFFFFFUL << SDIO_DTIMER_DATATIME_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_DTIMER_DATATIME                SDIO_DTIMER_DATATIME_Msk           /*!< Data timeout period. */\n\n/******************  Bit definition for SDIO_DLEN register  *******************/\n#define SDIO_DLEN_DATALENGTH_Pos            (0U)                               \n#define SDIO_DLEN_DATALENGTH_Msk            (0x1FFFFFFUL << SDIO_DLEN_DATALENGTH_Pos) /*!< 0x01FFFFFF */\n#define SDIO_DLEN_DATALENGTH                SDIO_DLEN_DATALENGTH_Msk           /*!< Data length value */\n\n/******************  Bit definition for SDIO_DCTRL register  ******************/\n#define SDIO_DCTRL_DTEN_Pos                 (0U)                               \n#define SDIO_DCTRL_DTEN_Msk                 (0x1UL << SDIO_DCTRL_DTEN_Pos)      /*!< 0x00000001 */\n#define SDIO_DCTRL_DTEN                     SDIO_DCTRL_DTEN_Msk                /*!< Data transfer enabled bit */\n#define SDIO_DCTRL_DTDIR_Pos                (1U)                               \n#define SDIO_DCTRL_DTDIR_Msk                (0x1UL << SDIO_DCTRL_DTDIR_Pos)     /*!< 0x00000002 */\n#define SDIO_DCTRL_DTDIR                    SDIO_DCTRL_DTDIR_Msk               /*!< Data transfer direction selection */\n#define SDIO_DCTRL_DTMODE_Pos               (2U)                               \n#define SDIO_DCTRL_DTMODE_Msk               (0x1UL << SDIO_DCTRL_DTMODE_Pos)    /*!< 0x00000004 */\n#define SDIO_DCTRL_DTMODE                   SDIO_DCTRL_DTMODE_Msk              /*!< Data transfer mode selection */\n#define SDIO_DCTRL_DMAEN_Pos                (3U)                               \n#define SDIO_DCTRL_DMAEN_Msk                (0x1UL << SDIO_DCTRL_DMAEN_Pos)     /*!< 0x00000008 */\n#define SDIO_DCTRL_DMAEN                    SDIO_DCTRL_DMAEN_Msk               /*!< DMA enabled bit */\n\n#define SDIO_DCTRL_DBLOCKSIZE_Pos           (4U)                               \n#define SDIO_DCTRL_DBLOCKSIZE_Msk           (0xFUL << SDIO_DCTRL_DBLOCKSIZE_Pos) /*!< 0x000000F0 */\n#define SDIO_DCTRL_DBLOCKSIZE               SDIO_DCTRL_DBLOCKSIZE_Msk          /*!< DBLOCKSIZE[3:0] bits (Data block size) */\n#define SDIO_DCTRL_DBLOCKSIZE_0             (0x1UL << SDIO_DCTRL_DBLOCKSIZE_Pos) /*!< 0x0010 */\n#define SDIO_DCTRL_DBLOCKSIZE_1             (0x2UL << SDIO_DCTRL_DBLOCKSIZE_Pos) /*!< 0x0020 */\n#define SDIO_DCTRL_DBLOCKSIZE_2             (0x4UL << SDIO_DCTRL_DBLOCKSIZE_Pos) /*!< 0x0040 */\n#define SDIO_DCTRL_DBLOCKSIZE_3             (0x8UL << SDIO_DCTRL_DBLOCKSIZE_Pos) /*!< 0x0080 */\n\n#define SDIO_DCTRL_RWSTART_Pos              (8U)                               \n#define SDIO_DCTRL_RWSTART_Msk              (0x1UL << SDIO_DCTRL_RWSTART_Pos)   /*!< 0x00000100 */\n#define SDIO_DCTRL_RWSTART                  SDIO_DCTRL_RWSTART_Msk             /*!< Read wait start */\n#define SDIO_DCTRL_RWSTOP_Pos               (9U)                               \n#define SDIO_DCTRL_RWSTOP_Msk               (0x1UL << SDIO_DCTRL_RWSTOP_Pos)    /*!< 0x00000200 */\n#define SDIO_DCTRL_RWSTOP                   SDIO_DCTRL_RWSTOP_Msk              /*!< Read wait stop */\n#define SDIO_DCTRL_RWMOD_Pos                (10U)                              \n#define SDIO_DCTRL_RWMOD_Msk                (0x1UL << SDIO_DCTRL_RWMOD_Pos)     /*!< 0x00000400 */\n#define SDIO_DCTRL_RWMOD                    SDIO_DCTRL_RWMOD_Msk               /*!< Read wait mode */\n#define SDIO_DCTRL_SDIOEN_Pos               (11U)                              \n#define SDIO_DCTRL_SDIOEN_Msk               (0x1UL << SDIO_DCTRL_SDIOEN_Pos)    /*!< 0x00000800 */\n#define SDIO_DCTRL_SDIOEN                   SDIO_DCTRL_SDIOEN_Msk              /*!< SD I/O enable functions */\n\n/******************  Bit definition for SDIO_DCOUNT register  *****************/\n#define SDIO_DCOUNT_DATACOUNT_Pos           (0U)                               \n#define SDIO_DCOUNT_DATACOUNT_Msk           (0x1FFFFFFUL << SDIO_DCOUNT_DATACOUNT_Pos) /*!< 0x01FFFFFF */\n#define SDIO_DCOUNT_DATACOUNT               SDIO_DCOUNT_DATACOUNT_Msk          /*!< Data count value */\n\n/******************  Bit definition for SDIO_STA register  ********************/\n#define SDIO_STA_CCRCFAIL_Pos               (0U)                               \n#define SDIO_STA_CCRCFAIL_Msk               (0x1UL << SDIO_STA_CCRCFAIL_Pos)    /*!< 0x00000001 */\n#define SDIO_STA_CCRCFAIL                   SDIO_STA_CCRCFAIL_Msk              /*!< Command response received (CRC check failed) */\n#define SDIO_STA_DCRCFAIL_Pos               (1U)                               \n#define SDIO_STA_DCRCFAIL_Msk               (0x1UL << SDIO_STA_DCRCFAIL_Pos)    /*!< 0x00000002 */\n#define SDIO_STA_DCRCFAIL                   SDIO_STA_DCRCFAIL_Msk              /*!< Data block sent/received (CRC check failed) */\n#define SDIO_STA_CTIMEOUT_Pos               (2U)                               \n#define SDIO_STA_CTIMEOUT_Msk               (0x1UL << SDIO_STA_CTIMEOUT_Pos)    /*!< 0x00000004 */\n#define SDIO_STA_CTIMEOUT                   SDIO_STA_CTIMEOUT_Msk              /*!< Command response timeout */\n#define SDIO_STA_DTIMEOUT_Pos               (3U)                               \n#define SDIO_STA_DTIMEOUT_Msk               (0x1UL << SDIO_STA_DTIMEOUT_Pos)    /*!< 0x00000008 */\n#define SDIO_STA_DTIMEOUT                   SDIO_STA_DTIMEOUT_Msk              /*!< Data timeout */\n#define SDIO_STA_TXUNDERR_Pos               (4U)                               \n#define SDIO_STA_TXUNDERR_Msk               (0x1UL << SDIO_STA_TXUNDERR_Pos)    /*!< 0x00000010 */\n#define SDIO_STA_TXUNDERR                   SDIO_STA_TXUNDERR_Msk              /*!< Transmit FIFO underrun error */\n#define SDIO_STA_RXOVERR_Pos                (5U)                               \n#define SDIO_STA_RXOVERR_Msk                (0x1UL << SDIO_STA_RXOVERR_Pos)     /*!< 0x00000020 */\n#define SDIO_STA_RXOVERR                    SDIO_STA_RXOVERR_Msk               /*!< Received FIFO overrun error */\n#define SDIO_STA_CMDREND_Pos                (6U)                               \n#define SDIO_STA_CMDREND_Msk                (0x1UL << SDIO_STA_CMDREND_Pos)     /*!< 0x00000040 */\n#define SDIO_STA_CMDREND                    SDIO_STA_CMDREND_Msk               /*!< Command response received (CRC check passed) */\n#define SDIO_STA_CMDSENT_Pos                (7U)                               \n#define SDIO_STA_CMDSENT_Msk                (0x1UL << SDIO_STA_CMDSENT_Pos)     /*!< 0x00000080 */\n#define SDIO_STA_CMDSENT                    SDIO_STA_CMDSENT_Msk               /*!< Command sent (no response required) */\n#define SDIO_STA_DATAEND_Pos                (8U)                               \n#define SDIO_STA_DATAEND_Msk                (0x1UL << SDIO_STA_DATAEND_Pos)     /*!< 0x00000100 */\n#define SDIO_STA_DATAEND                    SDIO_STA_DATAEND_Msk               /*!< Data end (data counter, SDIDCOUNT, is zero) */\n#define SDIO_STA_STBITERR_Pos               (9U)                               \n#define SDIO_STA_STBITERR_Msk               (0x1UL << SDIO_STA_STBITERR_Pos)    /*!< 0x00000200 */\n#define SDIO_STA_STBITERR                   SDIO_STA_STBITERR_Msk              /*!< Start bit not detected on all data signals in wide bus mode */\n#define SDIO_STA_DBCKEND_Pos                (10U)                              \n#define SDIO_STA_DBCKEND_Msk                (0x1UL << SDIO_STA_DBCKEND_Pos)     /*!< 0x00000400 */\n#define SDIO_STA_DBCKEND                    SDIO_STA_DBCKEND_Msk               /*!< Data block sent/received (CRC check passed) */\n#define SDIO_STA_CMDACT_Pos                 (11U)                              \n#define SDIO_STA_CMDACT_Msk                 (0x1UL << SDIO_STA_CMDACT_Pos)      /*!< 0x00000800 */\n#define SDIO_STA_CMDACT                     SDIO_STA_CMDACT_Msk                /*!< Command transfer in progress */\n#define SDIO_STA_TXACT_Pos                  (12U)                              \n#define SDIO_STA_TXACT_Msk                  (0x1UL << SDIO_STA_TXACT_Pos)       /*!< 0x00001000 */\n#define SDIO_STA_TXACT                      SDIO_STA_TXACT_Msk                 /*!< Data transmit in progress */\n#define SDIO_STA_RXACT_Pos                  (13U)                              \n#define SDIO_STA_RXACT_Msk                  (0x1UL << SDIO_STA_RXACT_Pos)       /*!< 0x00002000 */\n#define SDIO_STA_RXACT                      SDIO_STA_RXACT_Msk                 /*!< Data receive in progress */\n#define SDIO_STA_TXFIFOHE_Pos               (14U)                              \n#define SDIO_STA_TXFIFOHE_Msk               (0x1UL << SDIO_STA_TXFIFOHE_Pos)    /*!< 0x00004000 */\n#define SDIO_STA_TXFIFOHE                   SDIO_STA_TXFIFOHE_Msk              /*!< Transmit FIFO Half Empty: at least 8 words can be written into the FIFO */\n#define SDIO_STA_RXFIFOHF_Pos               (15U)                              \n#define SDIO_STA_RXFIFOHF_Msk               (0x1UL << SDIO_STA_RXFIFOHF_Pos)    /*!< 0x00008000 */\n#define SDIO_STA_RXFIFOHF                   SDIO_STA_RXFIFOHF_Msk              /*!< Receive FIFO Half Full: there are at least 8 words in the FIFO */\n#define SDIO_STA_TXFIFOF_Pos                (16U)                              \n#define SDIO_STA_TXFIFOF_Msk                (0x1UL << SDIO_STA_TXFIFOF_Pos)     /*!< 0x00010000 */\n#define SDIO_STA_TXFIFOF                    SDIO_STA_TXFIFOF_Msk               /*!< Transmit FIFO full */\n#define SDIO_STA_RXFIFOF_Pos                (17U)                              \n#define SDIO_STA_RXFIFOF_Msk                (0x1UL << SDIO_STA_RXFIFOF_Pos)     /*!< 0x00020000 */\n#define SDIO_STA_RXFIFOF                    SDIO_STA_RXFIFOF_Msk               /*!< Receive FIFO full */\n#define SDIO_STA_TXFIFOE_Pos                (18U)                              \n#define SDIO_STA_TXFIFOE_Msk                (0x1UL << SDIO_STA_TXFIFOE_Pos)     /*!< 0x00040000 */\n#define SDIO_STA_TXFIFOE                    SDIO_STA_TXFIFOE_Msk               /*!< Transmit FIFO empty */\n#define SDIO_STA_RXFIFOE_Pos                (19U)                              \n#define SDIO_STA_RXFIFOE_Msk                (0x1UL << SDIO_STA_RXFIFOE_Pos)     /*!< 0x00080000 */\n#define SDIO_STA_RXFIFOE                    SDIO_STA_RXFIFOE_Msk               /*!< Receive FIFO empty */\n#define SDIO_STA_TXDAVL_Pos                 (20U)                              \n#define SDIO_STA_TXDAVL_Msk                 (0x1UL << SDIO_STA_TXDAVL_Pos)      /*!< 0x00100000 */\n#define SDIO_STA_TXDAVL                     SDIO_STA_TXDAVL_Msk                /*!< Data available in transmit FIFO */\n#define SDIO_STA_RXDAVL_Pos                 (21U)                              \n#define SDIO_STA_RXDAVL_Msk                 (0x1UL << SDIO_STA_RXDAVL_Pos)      /*!< 0x00200000 */\n#define SDIO_STA_RXDAVL                     SDIO_STA_RXDAVL_Msk                /*!< Data available in receive FIFO */\n#define SDIO_STA_SDIOIT_Pos                 (22U)                              \n#define SDIO_STA_SDIOIT_Msk                 (0x1UL << SDIO_STA_SDIOIT_Pos)      /*!< 0x00400000 */\n#define SDIO_STA_SDIOIT                     SDIO_STA_SDIOIT_Msk                /*!< SDIO interrupt received */\n#define SDIO_STA_CEATAEND_Pos               (23U)                              \n#define SDIO_STA_CEATAEND_Msk               (0x1UL << SDIO_STA_CEATAEND_Pos)    /*!< 0x00800000 */\n#define SDIO_STA_CEATAEND                   SDIO_STA_CEATAEND_Msk              /*!< CE-ATA command completion signal received for CMD61 */\n\n/*******************  Bit definition for SDIO_ICR register  *******************/\n#define SDIO_ICR_CCRCFAILC_Pos              (0U)                               \n#define SDIO_ICR_CCRCFAILC_Msk              (0x1UL << SDIO_ICR_CCRCFAILC_Pos)   /*!< 0x00000001 */\n#define SDIO_ICR_CCRCFAILC                  SDIO_ICR_CCRCFAILC_Msk             /*!< CCRCFAIL flag clear bit */\n#define SDIO_ICR_DCRCFAILC_Pos              (1U)                               \n#define SDIO_ICR_DCRCFAILC_Msk              (0x1UL << SDIO_ICR_DCRCFAILC_Pos)   /*!< 0x00000002 */\n#define SDIO_ICR_DCRCFAILC                  SDIO_ICR_DCRCFAILC_Msk             /*!< DCRCFAIL flag clear bit */\n#define SDIO_ICR_CTIMEOUTC_Pos              (2U)                               \n#define SDIO_ICR_CTIMEOUTC_Msk              (0x1UL << SDIO_ICR_CTIMEOUTC_Pos)   /*!< 0x00000004 */\n#define SDIO_ICR_CTIMEOUTC                  SDIO_ICR_CTIMEOUTC_Msk             /*!< CTIMEOUT flag clear bit */\n#define SDIO_ICR_DTIMEOUTC_Pos              (3U)                               \n#define SDIO_ICR_DTIMEOUTC_Msk              (0x1UL << SDIO_ICR_DTIMEOUTC_Pos)   /*!< 0x00000008 */\n#define SDIO_ICR_DTIMEOUTC                  SDIO_ICR_DTIMEOUTC_Msk             /*!< DTIMEOUT flag clear bit */\n#define SDIO_ICR_TXUNDERRC_Pos              (4U)                               \n#define SDIO_ICR_TXUNDERRC_Msk              (0x1UL << SDIO_ICR_TXUNDERRC_Pos)   /*!< 0x00000010 */\n#define SDIO_ICR_TXUNDERRC                  SDIO_ICR_TXUNDERRC_Msk             /*!< TXUNDERR flag clear bit */\n#define SDIO_ICR_RXOVERRC_Pos               (5U)                               \n#define SDIO_ICR_RXOVERRC_Msk               (0x1UL << SDIO_ICR_RXOVERRC_Pos)    /*!< 0x00000020 */\n#define SDIO_ICR_RXOVERRC                   SDIO_ICR_RXOVERRC_Msk              /*!< RXOVERR flag clear bit */\n#define SDIO_ICR_CMDRENDC_Pos               (6U)                               \n#define SDIO_ICR_CMDRENDC_Msk               (0x1UL << SDIO_ICR_CMDRENDC_Pos)    /*!< 0x00000040 */\n#define SDIO_ICR_CMDRENDC                   SDIO_ICR_CMDRENDC_Msk              /*!< CMDREND flag clear bit */\n#define SDIO_ICR_CMDSENTC_Pos               (7U)                               \n#define SDIO_ICR_CMDSENTC_Msk               (0x1UL << SDIO_ICR_CMDSENTC_Pos)    /*!< 0x00000080 */\n#define SDIO_ICR_CMDSENTC                   SDIO_ICR_CMDSENTC_Msk              /*!< CMDSENT flag clear bit */\n#define SDIO_ICR_DATAENDC_Pos               (8U)                               \n#define SDIO_ICR_DATAENDC_Msk               (0x1UL << SDIO_ICR_DATAENDC_Pos)    /*!< 0x00000100 */\n#define SDIO_ICR_DATAENDC                   SDIO_ICR_DATAENDC_Msk              /*!< DATAEND flag clear bit */\n#define SDIO_ICR_STBITERRC_Pos              (9U)                               \n#define SDIO_ICR_STBITERRC_Msk              (0x1UL << SDIO_ICR_STBITERRC_Pos)   /*!< 0x00000200 */\n#define SDIO_ICR_STBITERRC                  SDIO_ICR_STBITERRC_Msk             /*!< STBITERR flag clear bit */\n#define SDIO_ICR_DBCKENDC_Pos               (10U)                              \n#define SDIO_ICR_DBCKENDC_Msk               (0x1UL << SDIO_ICR_DBCKENDC_Pos)    /*!< 0x00000400 */\n#define SDIO_ICR_DBCKENDC                   SDIO_ICR_DBCKENDC_Msk              /*!< DBCKEND flag clear bit */\n#define SDIO_ICR_SDIOITC_Pos                (22U)                              \n#define SDIO_ICR_SDIOITC_Msk                (0x1UL << SDIO_ICR_SDIOITC_Pos)     /*!< 0x00400000 */\n#define SDIO_ICR_SDIOITC                    SDIO_ICR_SDIOITC_Msk               /*!< SDIOIT flag clear bit */\n#define SDIO_ICR_CEATAENDC_Pos              (23U)                              \n#define SDIO_ICR_CEATAENDC_Msk              (0x1UL << SDIO_ICR_CEATAENDC_Pos)   /*!< 0x00800000 */\n#define SDIO_ICR_CEATAENDC                  SDIO_ICR_CEATAENDC_Msk             /*!< CEATAEND flag clear bit */\n\n/******************  Bit definition for SDIO_MASK register  *******************/\n#define SDIO_MASK_CCRCFAILIE_Pos            (0U)                               \n#define SDIO_MASK_CCRCFAILIE_Msk            (0x1UL << SDIO_MASK_CCRCFAILIE_Pos) /*!< 0x00000001 */\n#define SDIO_MASK_CCRCFAILIE                SDIO_MASK_CCRCFAILIE_Msk           /*!< Command CRC Fail Interrupt Enable */\n#define SDIO_MASK_DCRCFAILIE_Pos            (1U)                               \n#define SDIO_MASK_DCRCFAILIE_Msk            (0x1UL << SDIO_MASK_DCRCFAILIE_Pos) /*!< 0x00000002 */\n#define SDIO_MASK_DCRCFAILIE                SDIO_MASK_DCRCFAILIE_Msk           /*!< Data CRC Fail Interrupt Enable */\n#define SDIO_MASK_CTIMEOUTIE_Pos            (2U)                               \n#define SDIO_MASK_CTIMEOUTIE_Msk            (0x1UL << SDIO_MASK_CTIMEOUTIE_Pos) /*!< 0x00000004 */\n#define SDIO_MASK_CTIMEOUTIE                SDIO_MASK_CTIMEOUTIE_Msk           /*!< Command TimeOut Interrupt Enable */\n#define SDIO_MASK_DTIMEOUTIE_Pos            (3U)                               \n#define SDIO_MASK_DTIMEOUTIE_Msk            (0x1UL << SDIO_MASK_DTIMEOUTIE_Pos) /*!< 0x00000008 */\n#define SDIO_MASK_DTIMEOUTIE                SDIO_MASK_DTIMEOUTIE_Msk           /*!< Data TimeOut Interrupt Enable */\n#define SDIO_MASK_TXUNDERRIE_Pos            (4U)                               \n#define SDIO_MASK_TXUNDERRIE_Msk            (0x1UL << SDIO_MASK_TXUNDERRIE_Pos) /*!< 0x00000010 */\n#define SDIO_MASK_TXUNDERRIE                SDIO_MASK_TXUNDERRIE_Msk           /*!< Tx FIFO UnderRun Error Interrupt Enable */\n#define SDIO_MASK_RXOVERRIE_Pos             (5U)                               \n#define SDIO_MASK_RXOVERRIE_Msk             (0x1UL << SDIO_MASK_RXOVERRIE_Pos)  /*!< 0x00000020 */\n#define SDIO_MASK_RXOVERRIE                 SDIO_MASK_RXOVERRIE_Msk            /*!< Rx FIFO OverRun Error Interrupt Enable */\n#define SDIO_MASK_CMDRENDIE_Pos             (6U)                               \n#define SDIO_MASK_CMDRENDIE_Msk             (0x1UL << SDIO_MASK_CMDRENDIE_Pos)  /*!< 0x00000040 */\n#define SDIO_MASK_CMDRENDIE                 SDIO_MASK_CMDRENDIE_Msk            /*!< Command Response Received Interrupt Enable */\n#define SDIO_MASK_CMDSENTIE_Pos             (7U)                               \n#define SDIO_MASK_CMDSENTIE_Msk             (0x1UL << SDIO_MASK_CMDSENTIE_Pos)  /*!< 0x00000080 */\n#define SDIO_MASK_CMDSENTIE                 SDIO_MASK_CMDSENTIE_Msk            /*!< Command Sent Interrupt Enable */\n#define SDIO_MASK_DATAENDIE_Pos             (8U)                               \n#define SDIO_MASK_DATAENDIE_Msk             (0x1UL << SDIO_MASK_DATAENDIE_Pos)  /*!< 0x00000100 */\n#define SDIO_MASK_DATAENDIE                 SDIO_MASK_DATAENDIE_Msk            /*!< Data End Interrupt Enable */\n#define SDIO_MASK_STBITERRIE_Pos            (9U)                               \n#define SDIO_MASK_STBITERRIE_Msk            (0x1UL << SDIO_MASK_STBITERRIE_Pos) /*!< 0x00000200 */\n#define SDIO_MASK_STBITERRIE                SDIO_MASK_STBITERRIE_Msk           /*!< Start Bit Error Interrupt Enable */\n#define SDIO_MASK_DBCKENDIE_Pos             (10U)                              \n#define SDIO_MASK_DBCKENDIE_Msk             (0x1UL << SDIO_MASK_DBCKENDIE_Pos)  /*!< 0x00000400 */\n#define SDIO_MASK_DBCKENDIE                 SDIO_MASK_DBCKENDIE_Msk            /*!< Data Block End Interrupt Enable */\n#define SDIO_MASK_CMDACTIE_Pos              (11U)                              \n#define SDIO_MASK_CMDACTIE_Msk              (0x1UL << SDIO_MASK_CMDACTIE_Pos)   /*!< 0x00000800 */\n#define SDIO_MASK_CMDACTIE                  SDIO_MASK_CMDACTIE_Msk             /*!< Command Acting Interrupt Enable */\n#define SDIO_MASK_TXACTIE_Pos               (12U)                              \n#define SDIO_MASK_TXACTIE_Msk               (0x1UL << SDIO_MASK_TXACTIE_Pos)    /*!< 0x00001000 */\n#define SDIO_MASK_TXACTIE                   SDIO_MASK_TXACTIE_Msk              /*!< Data Transmit Acting Interrupt Enable */\n#define SDIO_MASK_RXACTIE_Pos               (13U)                              \n#define SDIO_MASK_RXACTIE_Msk               (0x1UL << SDIO_MASK_RXACTIE_Pos)    /*!< 0x00002000 */\n#define SDIO_MASK_RXACTIE                   SDIO_MASK_RXACTIE_Msk              /*!< Data receive acting interrupt enabled */\n#define SDIO_MASK_TXFIFOHEIE_Pos            (14U)                              \n#define SDIO_MASK_TXFIFOHEIE_Msk            (0x1UL << SDIO_MASK_TXFIFOHEIE_Pos) /*!< 0x00004000 */\n#define SDIO_MASK_TXFIFOHEIE                SDIO_MASK_TXFIFOHEIE_Msk           /*!< Tx FIFO Half Empty interrupt Enable */\n#define SDIO_MASK_RXFIFOHFIE_Pos            (15U)                              \n#define SDIO_MASK_RXFIFOHFIE_Msk            (0x1UL << SDIO_MASK_RXFIFOHFIE_Pos) /*!< 0x00008000 */\n#define SDIO_MASK_RXFIFOHFIE                SDIO_MASK_RXFIFOHFIE_Msk           /*!< Rx FIFO Half Full interrupt Enable */\n#define SDIO_MASK_TXFIFOFIE_Pos             (16U)                              \n#define SDIO_MASK_TXFIFOFIE_Msk             (0x1UL << SDIO_MASK_TXFIFOFIE_Pos)  /*!< 0x00010000 */\n#define SDIO_MASK_TXFIFOFIE                 SDIO_MASK_TXFIFOFIE_Msk            /*!< Tx FIFO Full interrupt Enable */\n#define SDIO_MASK_RXFIFOFIE_Pos             (17U)                              \n#define SDIO_MASK_RXFIFOFIE_Msk             (0x1UL << SDIO_MASK_RXFIFOFIE_Pos)  /*!< 0x00020000 */\n#define SDIO_MASK_RXFIFOFIE                 SDIO_MASK_RXFIFOFIE_Msk            /*!< Rx FIFO Full interrupt Enable */\n#define SDIO_MASK_TXFIFOEIE_Pos             (18U)                              \n#define SDIO_MASK_TXFIFOEIE_Msk             (0x1UL << SDIO_MASK_TXFIFOEIE_Pos)  /*!< 0x00040000 */\n#define SDIO_MASK_TXFIFOEIE                 SDIO_MASK_TXFIFOEIE_Msk            /*!< Tx FIFO Empty interrupt Enable */\n#define SDIO_MASK_RXFIFOEIE_Pos             (19U)                              \n#define SDIO_MASK_RXFIFOEIE_Msk             (0x1UL << SDIO_MASK_RXFIFOEIE_Pos)  /*!< 0x00080000 */\n#define SDIO_MASK_RXFIFOEIE                 SDIO_MASK_RXFIFOEIE_Msk            /*!< Rx FIFO Empty interrupt Enable */\n#define SDIO_MASK_TXDAVLIE_Pos              (20U)                              \n#define SDIO_MASK_TXDAVLIE_Msk              (0x1UL << SDIO_MASK_TXDAVLIE_Pos)   /*!< 0x00100000 */\n#define SDIO_MASK_TXDAVLIE                  SDIO_MASK_TXDAVLIE_Msk             /*!< Data available in Tx FIFO interrupt Enable */\n#define SDIO_MASK_RXDAVLIE_Pos              (21U)                              \n#define SDIO_MASK_RXDAVLIE_Msk              (0x1UL << SDIO_MASK_RXDAVLIE_Pos)   /*!< 0x00200000 */\n#define SDIO_MASK_RXDAVLIE                  SDIO_MASK_RXDAVLIE_Msk             /*!< Data available in Rx FIFO interrupt Enable */\n#define SDIO_MASK_SDIOITIE_Pos              (22U)                              \n#define SDIO_MASK_SDIOITIE_Msk              (0x1UL << SDIO_MASK_SDIOITIE_Pos)   /*!< 0x00400000 */\n#define SDIO_MASK_SDIOITIE                  SDIO_MASK_SDIOITIE_Msk             /*!< SDIO Mode Interrupt Received interrupt Enable */\n#define SDIO_MASK_CEATAENDIE_Pos            (23U)                              \n#define SDIO_MASK_CEATAENDIE_Msk            (0x1UL << SDIO_MASK_CEATAENDIE_Pos) /*!< 0x00800000 */\n#define SDIO_MASK_CEATAENDIE                SDIO_MASK_CEATAENDIE_Msk           /*!< CE-ATA command completion signal received Interrupt Enable */\n\n/*****************  Bit definition for SDIO_FIFOCNT register  *****************/\n#define SDIO_FIFOCNT_FIFOCOUNT_Pos          (0U)                               \n#define SDIO_FIFOCNT_FIFOCOUNT_Msk          (0xFFFFFFUL << SDIO_FIFOCNT_FIFOCOUNT_Pos) /*!< 0x00FFFFFF */\n#define SDIO_FIFOCNT_FIFOCOUNT              SDIO_FIFOCNT_FIFOCOUNT_Msk         /*!< Remaining number of words to be written to or read from the FIFO */\n\n/******************  Bit definition for SDIO_FIFO register  *******************/\n#define SDIO_FIFO_FIFODATA_Pos              (0U)                               \n#define SDIO_FIFO_FIFODATA_Msk              (0xFFFFFFFFUL << SDIO_FIFO_FIFODATA_Pos) /*!< 0xFFFFFFFF */\n#define SDIO_FIFO_FIFODATA                  SDIO_FIFO_FIFODATA_Msk             /*!< Receive and transmit FIFO data */\n\n/******************************************************************************/\n/*                                                                            */\n/*                                   USB Device FS                            */\n/*                                                                            */\n/******************************************************************************/\n\n/*!< Endpoint-specific registers */\n#define  USB_EP0R                            USB_BASE                      /*!< Endpoint 0 register address */\n#define  USB_EP1R                            (USB_BASE + 0x00000004)       /*!< Endpoint 1 register address */\n#define  USB_EP2R                            (USB_BASE + 0x00000008)       /*!< Endpoint 2 register address */\n#define  USB_EP3R                            (USB_BASE + 0x0000000C)       /*!< Endpoint 3 register address */\n#define  USB_EP4R                            (USB_BASE + 0x00000010)       /*!< Endpoint 4 register address */\n#define  USB_EP5R                            (USB_BASE + 0x00000014)       /*!< Endpoint 5 register address */\n#define  USB_EP6R                            (USB_BASE + 0x00000018)       /*!< Endpoint 6 register address */\n#define  USB_EP7R                            (USB_BASE + 0x0000001C)       /*!< Endpoint 7 register address */\n\n/* bit positions */ \n#define USB_EP_CTR_RX_Pos                       (15U)                          \n#define USB_EP_CTR_RX_Msk                       (0x1UL << USB_EP_CTR_RX_Pos)    /*!< 0x00008000 */\n#define USB_EP_CTR_RX                           USB_EP_CTR_RX_Msk              /*!< EndPoint Correct TRansfer RX */\n#define USB_EP_DTOG_RX_Pos                      (14U)                          \n#define USB_EP_DTOG_RX_Msk                      (0x1UL << USB_EP_DTOG_RX_Pos)   /*!< 0x00004000 */\n#define USB_EP_DTOG_RX                          USB_EP_DTOG_RX_Msk             /*!< EndPoint Data TOGGLE RX */\n#define USB_EPRX_STAT_Pos                       (12U)                          \n#define USB_EPRX_STAT_Msk                       (0x3UL << USB_EPRX_STAT_Pos)    /*!< 0x00003000 */\n#define USB_EPRX_STAT                           USB_EPRX_STAT_Msk              /*!< EndPoint RX STATus bit field */\n#define USB_EP_SETUP_Pos                        (11U)                          \n#define USB_EP_SETUP_Msk                        (0x1UL << USB_EP_SETUP_Pos)     /*!< 0x00000800 */\n#define USB_EP_SETUP                            USB_EP_SETUP_Msk               /*!< EndPoint SETUP */\n#define USB_EP_T_FIELD_Pos                      (9U)                           \n#define USB_EP_T_FIELD_Msk                      (0x3UL << USB_EP_T_FIELD_Pos)   /*!< 0x00000600 */\n#define USB_EP_T_FIELD                          USB_EP_T_FIELD_Msk             /*!< EndPoint TYPE */\n#define USB_EP_KIND_Pos                         (8U)                           \n#define USB_EP_KIND_Msk                         (0x1UL << USB_EP_KIND_Pos)      /*!< 0x00000100 */\n#define USB_EP_KIND                             USB_EP_KIND_Msk                /*!< EndPoint KIND */\n#define USB_EP_CTR_TX_Pos                       (7U)                           \n#define USB_EP_CTR_TX_Msk                       (0x1UL << USB_EP_CTR_TX_Pos)    /*!< 0x00000080 */\n#define USB_EP_CTR_TX                           USB_EP_CTR_TX_Msk              /*!< EndPoint Correct TRansfer TX */\n#define USB_EP_DTOG_TX_Pos                      (6U)                           \n#define USB_EP_DTOG_TX_Msk                      (0x1UL << USB_EP_DTOG_TX_Pos)   /*!< 0x00000040 */\n#define USB_EP_DTOG_TX                          USB_EP_DTOG_TX_Msk             /*!< EndPoint Data TOGGLE TX */\n#define USB_EPTX_STAT_Pos                       (4U)                           \n#define USB_EPTX_STAT_Msk                       (0x3UL << USB_EPTX_STAT_Pos)    /*!< 0x00000030 */\n#define USB_EPTX_STAT                           USB_EPTX_STAT_Msk              /*!< EndPoint TX STATus bit field */\n#define USB_EPADDR_FIELD_Pos                    (0U)                           \n#define USB_EPADDR_FIELD_Msk                    (0xFUL << USB_EPADDR_FIELD_Pos) /*!< 0x0000000F */\n#define USB_EPADDR_FIELD                        USB_EPADDR_FIELD_Msk           /*!< EndPoint ADDRess FIELD */\n\n/* EndPoint REGister MASK (no toggle fields) */\n#define  USB_EPREG_MASK                      (USB_EP_CTR_RX|USB_EP_SETUP|USB_EP_T_FIELD|USB_EP_KIND|USB_EP_CTR_TX|USB_EPADDR_FIELD)\n                                                                           /*!< EP_TYPE[1:0] EndPoint TYPE */\n#define USB_EP_TYPE_MASK_Pos                    (9U)                           \n#define USB_EP_TYPE_MASK_Msk                    (0x3UL << USB_EP_TYPE_MASK_Pos) /*!< 0x00000600 */\n#define USB_EP_TYPE_MASK                        USB_EP_TYPE_MASK_Msk           /*!< EndPoint TYPE Mask */\n#define USB_EP_BULK                             0x00000000U                    /*!< EndPoint BULK */\n#define USB_EP_CONTROL                          0x00000200U                    /*!< EndPoint CONTROL */\n#define USB_EP_ISOCHRONOUS                      0x00000400U                    /*!< EndPoint ISOCHRONOUS */\n#define USB_EP_INTERRUPT                        0x00000600U                    /*!< EndPoint INTERRUPT */\n#define  USB_EP_T_MASK                          (~USB_EP_T_FIELD & USB_EPREG_MASK)\n\n#define  USB_EPKIND_MASK                        (~USB_EP_KIND & USB_EPREG_MASK)  /*!< EP_KIND EndPoint KIND */\n                                                                               /*!< STAT_TX[1:0] STATus for TX transfer */\n#define USB_EP_TX_DIS                           0x00000000U                    /*!< EndPoint TX DISabled */\n#define USB_EP_TX_STALL                         0x00000010U                    /*!< EndPoint TX STALLed */\n#define USB_EP_TX_NAK                           0x00000020U                    /*!< EndPoint TX NAKed */\n#define USB_EP_TX_VALID                         0x00000030U                    /*!< EndPoint TX VALID */\n#define USB_EPTX_DTOG1                          0x00000010U                    /*!< EndPoint TX Data TOGgle bit1 */\n#define USB_EPTX_DTOG2                          0x00000020U                    /*!< EndPoint TX Data TOGgle bit2 */\n#define  USB_EPTX_DTOGMASK  (USB_EPTX_STAT|USB_EPREG_MASK)\n                                                                               /*!< STAT_RX[1:0] STATus for RX transfer */\n#define USB_EP_RX_DIS                           0x00000000U                    /*!< EndPoint RX DISabled */\n#define USB_EP_RX_STALL                         0x00001000U                    /*!< EndPoint RX STALLed */\n#define USB_EP_RX_NAK                           0x00002000U                    /*!< EndPoint RX NAKed */\n#define USB_EP_RX_VALID                         0x00003000U                    /*!< EndPoint RX VALID */\n#define USB_EPRX_DTOG1                          0x00001000U                    /*!< EndPoint RX Data TOGgle bit1 */\n#define USB_EPRX_DTOG2                          0x00002000U                    /*!< EndPoint RX Data TOGgle bit1 */\n#define  USB_EPRX_DTOGMASK  (USB_EPRX_STAT|USB_EPREG_MASK)\n\n/*******************  Bit definition for USB_EP0R register  *******************/\n#define USB_EP0R_EA_Pos                         (0U)                           \n#define USB_EP0R_EA_Msk                         (0xFUL << USB_EP0R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP0R_EA                             USB_EP0R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP0R_STAT_TX_Pos                    (4U)                           \n#define USB_EP0R_STAT_TX_Msk                    (0x3UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP0R_STAT_TX                        USB_EP0R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP0R_STAT_TX_0                      (0x1UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP0R_STAT_TX_1                      (0x2UL << USB_EP0R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP0R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP0R_DTOG_TX_Msk                    (0x1UL << USB_EP0R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP0R_DTOG_TX                        USB_EP0R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP0R_CTR_TX_Pos                     (7U)                           \n#define USB_EP0R_CTR_TX_Msk                     (0x1UL << USB_EP0R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP0R_CTR_TX                         USB_EP0R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP0R_EP_KIND_Pos                    (8U)                           \n#define USB_EP0R_EP_KIND_Msk                    (0x1UL << USB_EP0R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP0R_EP_KIND                        USB_EP0R_EP_KIND_Msk           /*!< Endpoint Kind */\n                                                                           \n#define USB_EP0R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP0R_EP_TYPE_Msk                    (0x3UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP0R_EP_TYPE                        USB_EP0R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP0R_EP_TYPE_0                      (0x1UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP0R_EP_TYPE_1                      (0x2UL << USB_EP0R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP0R_SETUP_Pos                      (11U)                          \n#define USB_EP0R_SETUP_Msk                      (0x1UL << USB_EP0R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP0R_SETUP                          USB_EP0R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP0R_STAT_RX_Pos                    (12U)                          \n#define USB_EP0R_STAT_RX_Msk                    (0x3UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP0R_STAT_RX                        USB_EP0R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP0R_STAT_RX_0                      (0x1UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP0R_STAT_RX_1                      (0x2UL << USB_EP0R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP0R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP0R_DTOG_RX_Msk                    (0x1UL << USB_EP0R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP0R_DTOG_RX                        USB_EP0R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP0R_CTR_RX_Pos                     (15U)                          \n#define USB_EP0R_CTR_RX_Msk                     (0x1UL << USB_EP0R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP0R_CTR_RX                         USB_EP0R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP1R register  *******************/\n#define USB_EP1R_EA_Pos                         (0U)                           \n#define USB_EP1R_EA_Msk                         (0xFUL << USB_EP1R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP1R_EA                             USB_EP1R_EA_Msk                /*!< Endpoint Address */\n                                                                          \n#define USB_EP1R_STAT_TX_Pos                    (4U)                           \n#define USB_EP1R_STAT_TX_Msk                    (0x3UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP1R_STAT_TX                        USB_EP1R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP1R_STAT_TX_0                      (0x1UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP1R_STAT_TX_1                      (0x2UL << USB_EP1R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP1R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP1R_DTOG_TX_Msk                    (0x1UL << USB_EP1R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP1R_DTOG_TX                        USB_EP1R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP1R_CTR_TX_Pos                     (7U)                           \n#define USB_EP1R_CTR_TX_Msk                     (0x1UL << USB_EP1R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP1R_CTR_TX                         USB_EP1R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP1R_EP_KIND_Pos                    (8U)                           \n#define USB_EP1R_EP_KIND_Msk                    (0x1UL << USB_EP1R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP1R_EP_KIND                        USB_EP1R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP1R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP1R_EP_TYPE_Msk                    (0x3UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP1R_EP_TYPE                        USB_EP1R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP1R_EP_TYPE_0                      (0x1UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP1R_EP_TYPE_1                      (0x2UL << USB_EP1R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP1R_SETUP_Pos                      (11U)                          \n#define USB_EP1R_SETUP_Msk                      (0x1UL << USB_EP1R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP1R_SETUP                          USB_EP1R_SETUP_Msk             /*!< Setup transaction completed */\n                                                                           \n#define USB_EP1R_STAT_RX_Pos                    (12U)                          \n#define USB_EP1R_STAT_RX_Msk                    (0x3UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP1R_STAT_RX                        USB_EP1R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP1R_STAT_RX_0                      (0x1UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP1R_STAT_RX_1                      (0x2UL << USB_EP1R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP1R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP1R_DTOG_RX_Msk                    (0x1UL << USB_EP1R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP1R_DTOG_RX                        USB_EP1R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP1R_CTR_RX_Pos                     (15U)                          \n#define USB_EP1R_CTR_RX_Msk                     (0x1UL << USB_EP1R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP1R_CTR_RX                         USB_EP1R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP2R register  *******************/\n#define USB_EP2R_EA_Pos                         (0U)                           \n#define USB_EP2R_EA_Msk                         (0xFUL << USB_EP2R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP2R_EA                             USB_EP2R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP2R_STAT_TX_Pos                    (4U)                           \n#define USB_EP2R_STAT_TX_Msk                    (0x3UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP2R_STAT_TX                        USB_EP2R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP2R_STAT_TX_0                      (0x1UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP2R_STAT_TX_1                      (0x2UL << USB_EP2R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP2R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP2R_DTOG_TX_Msk                    (0x1UL << USB_EP2R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP2R_DTOG_TX                        USB_EP2R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP2R_CTR_TX_Pos                     (7U)                           \n#define USB_EP2R_CTR_TX_Msk                     (0x1UL << USB_EP2R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP2R_CTR_TX                         USB_EP2R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP2R_EP_KIND_Pos                    (8U)                           \n#define USB_EP2R_EP_KIND_Msk                    (0x1UL << USB_EP2R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP2R_EP_KIND                        USB_EP2R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP2R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP2R_EP_TYPE_Msk                    (0x3UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP2R_EP_TYPE                        USB_EP2R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP2R_EP_TYPE_0                      (0x1UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP2R_EP_TYPE_1                      (0x2UL << USB_EP2R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP2R_SETUP_Pos                      (11U)                          \n#define USB_EP2R_SETUP_Msk                      (0x1UL << USB_EP2R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP2R_SETUP                          USB_EP2R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP2R_STAT_RX_Pos                    (12U)                          \n#define USB_EP2R_STAT_RX_Msk                    (0x3UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP2R_STAT_RX                        USB_EP2R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP2R_STAT_RX_0                      (0x1UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP2R_STAT_RX_1                      (0x2UL << USB_EP2R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP2R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP2R_DTOG_RX_Msk                    (0x1UL << USB_EP2R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP2R_DTOG_RX                        USB_EP2R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP2R_CTR_RX_Pos                     (15U)                          \n#define USB_EP2R_CTR_RX_Msk                     (0x1UL << USB_EP2R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP2R_CTR_RX                         USB_EP2R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP3R register  *******************/\n#define USB_EP3R_EA_Pos                         (0U)                           \n#define USB_EP3R_EA_Msk                         (0xFUL << USB_EP3R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP3R_EA                             USB_EP3R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP3R_STAT_TX_Pos                    (4U)                           \n#define USB_EP3R_STAT_TX_Msk                    (0x3UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP3R_STAT_TX                        USB_EP3R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP3R_STAT_TX_0                      (0x1UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP3R_STAT_TX_1                      (0x2UL << USB_EP3R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP3R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP3R_DTOG_TX_Msk                    (0x1UL << USB_EP3R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP3R_DTOG_TX                        USB_EP3R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP3R_CTR_TX_Pos                     (7U)                           \n#define USB_EP3R_CTR_TX_Msk                     (0x1UL << USB_EP3R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP3R_CTR_TX                         USB_EP3R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP3R_EP_KIND_Pos                    (8U)                           \n#define USB_EP3R_EP_KIND_Msk                    (0x1UL << USB_EP3R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP3R_EP_KIND                        USB_EP3R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP3R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP3R_EP_TYPE_Msk                    (0x3UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP3R_EP_TYPE                        USB_EP3R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP3R_EP_TYPE_0                      (0x1UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP3R_EP_TYPE_1                      (0x2UL << USB_EP3R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP3R_SETUP_Pos                      (11U)                          \n#define USB_EP3R_SETUP_Msk                      (0x1UL << USB_EP3R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP3R_SETUP                          USB_EP3R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP3R_STAT_RX_Pos                    (12U)                          \n#define USB_EP3R_STAT_RX_Msk                    (0x3UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP3R_STAT_RX                        USB_EP3R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP3R_STAT_RX_0                      (0x1UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP3R_STAT_RX_1                      (0x2UL << USB_EP3R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP3R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP3R_DTOG_RX_Msk                    (0x1UL << USB_EP3R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP3R_DTOG_RX                        USB_EP3R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP3R_CTR_RX_Pos                     (15U)                          \n#define USB_EP3R_CTR_RX_Msk                     (0x1UL << USB_EP3R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP3R_CTR_RX                         USB_EP3R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP4R register  *******************/\n#define USB_EP4R_EA_Pos                         (0U)                           \n#define USB_EP4R_EA_Msk                         (0xFUL << USB_EP4R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP4R_EA                             USB_EP4R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP4R_STAT_TX_Pos                    (4U)                           \n#define USB_EP4R_STAT_TX_Msk                    (0x3UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP4R_STAT_TX                        USB_EP4R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP4R_STAT_TX_0                      (0x1UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP4R_STAT_TX_1                      (0x2UL << USB_EP4R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP4R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP4R_DTOG_TX_Msk                    (0x1UL << USB_EP4R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP4R_DTOG_TX                        USB_EP4R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP4R_CTR_TX_Pos                     (7U)                           \n#define USB_EP4R_CTR_TX_Msk                     (0x1UL << USB_EP4R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP4R_CTR_TX                         USB_EP4R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP4R_EP_KIND_Pos                    (8U)                           \n#define USB_EP4R_EP_KIND_Msk                    (0x1UL << USB_EP4R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP4R_EP_KIND                        USB_EP4R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP4R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP4R_EP_TYPE_Msk                    (0x3UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP4R_EP_TYPE                        USB_EP4R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP4R_EP_TYPE_0                      (0x1UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP4R_EP_TYPE_1                      (0x2UL << USB_EP4R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP4R_SETUP_Pos                      (11U)                          \n#define USB_EP4R_SETUP_Msk                      (0x1UL << USB_EP4R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP4R_SETUP                          USB_EP4R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP4R_STAT_RX_Pos                    (12U)                          \n#define USB_EP4R_STAT_RX_Msk                    (0x3UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP4R_STAT_RX                        USB_EP4R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP4R_STAT_RX_0                      (0x1UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP4R_STAT_RX_1                      (0x2UL << USB_EP4R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP4R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP4R_DTOG_RX_Msk                    (0x1UL << USB_EP4R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP4R_DTOG_RX                        USB_EP4R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP4R_CTR_RX_Pos                     (15U)                          \n#define USB_EP4R_CTR_RX_Msk                     (0x1UL << USB_EP4R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP4R_CTR_RX                         USB_EP4R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP5R register  *******************/\n#define USB_EP5R_EA_Pos                         (0U)                           \n#define USB_EP5R_EA_Msk                         (0xFUL << USB_EP5R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP5R_EA                             USB_EP5R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP5R_STAT_TX_Pos                    (4U)                           \n#define USB_EP5R_STAT_TX_Msk                    (0x3UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP5R_STAT_TX                        USB_EP5R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP5R_STAT_TX_0                      (0x1UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP5R_STAT_TX_1                      (0x2UL << USB_EP5R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP5R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP5R_DTOG_TX_Msk                    (0x1UL << USB_EP5R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP5R_DTOG_TX                        USB_EP5R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP5R_CTR_TX_Pos                     (7U)                           \n#define USB_EP5R_CTR_TX_Msk                     (0x1UL << USB_EP5R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP5R_CTR_TX                         USB_EP5R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP5R_EP_KIND_Pos                    (8U)                           \n#define USB_EP5R_EP_KIND_Msk                    (0x1UL << USB_EP5R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP5R_EP_KIND                        USB_EP5R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP5R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP5R_EP_TYPE_Msk                    (0x3UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP5R_EP_TYPE                        USB_EP5R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP5R_EP_TYPE_0                      (0x1UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP5R_EP_TYPE_1                      (0x2UL << USB_EP5R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP5R_SETUP_Pos                      (11U)                          \n#define USB_EP5R_SETUP_Msk                      (0x1UL << USB_EP5R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP5R_SETUP                          USB_EP5R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP5R_STAT_RX_Pos                    (12U)                          \n#define USB_EP5R_STAT_RX_Msk                    (0x3UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP5R_STAT_RX                        USB_EP5R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP5R_STAT_RX_0                      (0x1UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP5R_STAT_RX_1                      (0x2UL << USB_EP5R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP5R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP5R_DTOG_RX_Msk                    (0x1UL << USB_EP5R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP5R_DTOG_RX                        USB_EP5R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP5R_CTR_RX_Pos                     (15U)                          \n#define USB_EP5R_CTR_RX_Msk                     (0x1UL << USB_EP5R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP5R_CTR_RX                         USB_EP5R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP6R register  *******************/\n#define USB_EP6R_EA_Pos                         (0U)                           \n#define USB_EP6R_EA_Msk                         (0xFUL << USB_EP6R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP6R_EA                             USB_EP6R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP6R_STAT_TX_Pos                    (4U)                           \n#define USB_EP6R_STAT_TX_Msk                    (0x3UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP6R_STAT_TX                        USB_EP6R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP6R_STAT_TX_0                      (0x1UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP6R_STAT_TX_1                      (0x2UL << USB_EP6R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP6R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP6R_DTOG_TX_Msk                    (0x1UL << USB_EP6R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP6R_DTOG_TX                        USB_EP6R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP6R_CTR_TX_Pos                     (7U)                           \n#define USB_EP6R_CTR_TX_Msk                     (0x1UL << USB_EP6R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP6R_CTR_TX                         USB_EP6R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP6R_EP_KIND_Pos                    (8U)                           \n#define USB_EP6R_EP_KIND_Msk                    (0x1UL << USB_EP6R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP6R_EP_KIND                        USB_EP6R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP6R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP6R_EP_TYPE_Msk                    (0x3UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP6R_EP_TYPE                        USB_EP6R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP6R_EP_TYPE_0                      (0x1UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP6R_EP_TYPE_1                      (0x2UL << USB_EP6R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP6R_SETUP_Pos                      (11U)                          \n#define USB_EP6R_SETUP_Msk                      (0x1UL << USB_EP6R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP6R_SETUP                          USB_EP6R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP6R_STAT_RX_Pos                    (12U)                          \n#define USB_EP6R_STAT_RX_Msk                    (0x3UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP6R_STAT_RX                        USB_EP6R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP6R_STAT_RX_0                      (0x1UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP6R_STAT_RX_1                      (0x2UL << USB_EP6R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP6R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP6R_DTOG_RX_Msk                    (0x1UL << USB_EP6R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP6R_DTOG_RX                        USB_EP6R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP6R_CTR_RX_Pos                     (15U)                          \n#define USB_EP6R_CTR_RX_Msk                     (0x1UL << USB_EP6R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP6R_CTR_RX                         USB_EP6R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*******************  Bit definition for USB_EP7R register  *******************/\n#define USB_EP7R_EA_Pos                         (0U)                           \n#define USB_EP7R_EA_Msk                         (0xFUL << USB_EP7R_EA_Pos)      /*!< 0x0000000F */\n#define USB_EP7R_EA                             USB_EP7R_EA_Msk                /*!< Endpoint Address */\n\n#define USB_EP7R_STAT_TX_Pos                    (4U)                           \n#define USB_EP7R_STAT_TX_Msk                    (0x3UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000030 */\n#define USB_EP7R_STAT_TX                        USB_EP7R_STAT_TX_Msk           /*!< STAT_TX[1:0] bits (Status bits, for transmission transfers) */\n#define USB_EP7R_STAT_TX_0                      (0x1UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000010 */\n#define USB_EP7R_STAT_TX_1                      (0x2UL << USB_EP7R_STAT_TX_Pos) /*!< 0x00000020 */\n\n#define USB_EP7R_DTOG_TX_Pos                    (6U)                           \n#define USB_EP7R_DTOG_TX_Msk                    (0x1UL << USB_EP7R_DTOG_TX_Pos) /*!< 0x00000040 */\n#define USB_EP7R_DTOG_TX                        USB_EP7R_DTOG_TX_Msk           /*!< Data Toggle, for transmission transfers */\n#define USB_EP7R_CTR_TX_Pos                     (7U)                           \n#define USB_EP7R_CTR_TX_Msk                     (0x1UL << USB_EP7R_CTR_TX_Pos)  /*!< 0x00000080 */\n#define USB_EP7R_CTR_TX                         USB_EP7R_CTR_TX_Msk            /*!< Correct Transfer for transmission */\n#define USB_EP7R_EP_KIND_Pos                    (8U)                           \n#define USB_EP7R_EP_KIND_Msk                    (0x1UL << USB_EP7R_EP_KIND_Pos) /*!< 0x00000100 */\n#define USB_EP7R_EP_KIND                        USB_EP7R_EP_KIND_Msk           /*!< Endpoint Kind */\n\n#define USB_EP7R_EP_TYPE_Pos                    (9U)                           \n#define USB_EP7R_EP_TYPE_Msk                    (0x3UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000600 */\n#define USB_EP7R_EP_TYPE                        USB_EP7R_EP_TYPE_Msk           /*!< EP_TYPE[1:0] bits (Endpoint type) */\n#define USB_EP7R_EP_TYPE_0                      (0x1UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000200 */\n#define USB_EP7R_EP_TYPE_1                      (0x2UL << USB_EP7R_EP_TYPE_Pos) /*!< 0x00000400 */\n\n#define USB_EP7R_SETUP_Pos                      (11U)                          \n#define USB_EP7R_SETUP_Msk                      (0x1UL << USB_EP7R_SETUP_Pos)   /*!< 0x00000800 */\n#define USB_EP7R_SETUP                          USB_EP7R_SETUP_Msk             /*!< Setup transaction completed */\n\n#define USB_EP7R_STAT_RX_Pos                    (12U)                          \n#define USB_EP7R_STAT_RX_Msk                    (0x3UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00003000 */\n#define USB_EP7R_STAT_RX                        USB_EP7R_STAT_RX_Msk           /*!< STAT_RX[1:0] bits (Status bits, for reception transfers) */\n#define USB_EP7R_STAT_RX_0                      (0x1UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00001000 */\n#define USB_EP7R_STAT_RX_1                      (0x2UL << USB_EP7R_STAT_RX_Pos) /*!< 0x00002000 */\n\n#define USB_EP7R_DTOG_RX_Pos                    (14U)                          \n#define USB_EP7R_DTOG_RX_Msk                    (0x1UL << USB_EP7R_DTOG_RX_Pos) /*!< 0x00004000 */\n#define USB_EP7R_DTOG_RX                        USB_EP7R_DTOG_RX_Msk           /*!< Data Toggle, for reception transfers */\n#define USB_EP7R_CTR_RX_Pos                     (15U)                          \n#define USB_EP7R_CTR_RX_Msk                     (0x1UL << USB_EP7R_CTR_RX_Pos)  /*!< 0x00008000 */\n#define USB_EP7R_CTR_RX                         USB_EP7R_CTR_RX_Msk            /*!< Correct Transfer for reception */\n\n/*!< Common registers */\n/*******************  Bit definition for USB_CNTR register  *******************/\n#define USB_CNTR_FRES_Pos                       (0U)                           \n#define USB_CNTR_FRES_Msk                       (0x1UL << USB_CNTR_FRES_Pos)    /*!< 0x00000001 */\n#define USB_CNTR_FRES                           USB_CNTR_FRES_Msk              /*!< Force USB Reset */\n#define USB_CNTR_PDWN_Pos                       (1U)                           \n#define USB_CNTR_PDWN_Msk                       (0x1UL << USB_CNTR_PDWN_Pos)    /*!< 0x00000002 */\n#define USB_CNTR_PDWN                           USB_CNTR_PDWN_Msk              /*!< Power down */\n#define USB_CNTR_LP_MODE_Pos                    (2U)                           \n#define USB_CNTR_LP_MODE_Msk                    (0x1UL << USB_CNTR_LP_MODE_Pos) /*!< 0x00000004 */\n#define USB_CNTR_LP_MODE                        USB_CNTR_LP_MODE_Msk           /*!< Low-power mode */\n#define USB_CNTR_FSUSP_Pos                      (3U)                           \n#define USB_CNTR_FSUSP_Msk                      (0x1UL << USB_CNTR_FSUSP_Pos)   /*!< 0x00000008 */\n#define USB_CNTR_FSUSP                          USB_CNTR_FSUSP_Msk             /*!< Force suspend */\n#define USB_CNTR_RESUME_Pos                     (4U)                           \n#define USB_CNTR_RESUME_Msk                     (0x1UL << USB_CNTR_RESUME_Pos)  /*!< 0x00000010 */\n#define USB_CNTR_RESUME                         USB_CNTR_RESUME_Msk            /*!< Resume request */\n#define USB_CNTR_ESOFM_Pos                      (8U)                           \n#define USB_CNTR_ESOFM_Msk                      (0x1UL << USB_CNTR_ESOFM_Pos)   /*!< 0x00000100 */\n#define USB_CNTR_ESOFM                          USB_CNTR_ESOFM_Msk             /*!< Expected Start Of Frame Interrupt Mask */\n#define USB_CNTR_SOFM_Pos                       (9U)                           \n#define USB_CNTR_SOFM_Msk                       (0x1UL << USB_CNTR_SOFM_Pos)    /*!< 0x00000200 */\n#define USB_CNTR_SOFM                           USB_CNTR_SOFM_Msk              /*!< Start Of Frame Interrupt Mask */\n#define USB_CNTR_RESETM_Pos                     (10U)                          \n#define USB_CNTR_RESETM_Msk                     (0x1UL << USB_CNTR_RESETM_Pos)  /*!< 0x00000400 */\n#define USB_CNTR_RESETM                         USB_CNTR_RESETM_Msk            /*!< RESET Interrupt Mask */\n#define USB_CNTR_SUSPM_Pos                      (11U)                          \n#define USB_CNTR_SUSPM_Msk                      (0x1UL << USB_CNTR_SUSPM_Pos)   /*!< 0x00000800 */\n#define USB_CNTR_SUSPM                          USB_CNTR_SUSPM_Msk             /*!< Suspend mode Interrupt Mask */\n#define USB_CNTR_WKUPM_Pos                      (12U)                          \n#define USB_CNTR_WKUPM_Msk                      (0x1UL << USB_CNTR_WKUPM_Pos)   /*!< 0x00001000 */\n#define USB_CNTR_WKUPM                          USB_CNTR_WKUPM_Msk             /*!< Wakeup Interrupt Mask */\n#define USB_CNTR_ERRM_Pos                       (13U)                          \n#define USB_CNTR_ERRM_Msk                       (0x1UL << USB_CNTR_ERRM_Pos)    /*!< 0x00002000 */\n#define USB_CNTR_ERRM                           USB_CNTR_ERRM_Msk              /*!< Error Interrupt Mask */\n#define USB_CNTR_PMAOVRM_Pos                    (14U)                          \n#define USB_CNTR_PMAOVRM_Msk                    (0x1UL << USB_CNTR_PMAOVRM_Pos) /*!< 0x00004000 */\n#define USB_CNTR_PMAOVRM                        USB_CNTR_PMAOVRM_Msk           /*!< Packet Memory Area Over / Underrun Interrupt Mask */\n#define USB_CNTR_CTRM_Pos                       (15U)                          \n#define USB_CNTR_CTRM_Msk                       (0x1UL << USB_CNTR_CTRM_Pos)    /*!< 0x00008000 */\n#define USB_CNTR_CTRM                           USB_CNTR_CTRM_Msk              /*!< Correct Transfer Interrupt Mask */\n\n/*******************  Bit definition for USB_ISTR register  *******************/\n#define USB_ISTR_EP_ID_Pos                      (0U)                           \n#define USB_ISTR_EP_ID_Msk                      (0xFUL << USB_ISTR_EP_ID_Pos)   /*!< 0x0000000F */\n#define USB_ISTR_EP_ID                          USB_ISTR_EP_ID_Msk             /*!< Endpoint Identifier */\n#define USB_ISTR_DIR_Pos                        (4U)                           \n#define USB_ISTR_DIR_Msk                        (0x1UL << USB_ISTR_DIR_Pos)     /*!< 0x00000010 */\n#define USB_ISTR_DIR                            USB_ISTR_DIR_Msk               /*!< Direction of transaction */\n#define USB_ISTR_ESOF_Pos                       (8U)                           \n#define USB_ISTR_ESOF_Msk                       (0x1UL << USB_ISTR_ESOF_Pos)    /*!< 0x00000100 */\n#define USB_ISTR_ESOF                           USB_ISTR_ESOF_Msk              /*!< Expected Start Of Frame */\n#define USB_ISTR_SOF_Pos                        (9U)                           \n#define USB_ISTR_SOF_Msk                        (0x1UL << USB_ISTR_SOF_Pos)     /*!< 0x00000200 */\n#define USB_ISTR_SOF                            USB_ISTR_SOF_Msk               /*!< Start Of Frame */\n#define USB_ISTR_RESET_Pos                      (10U)                          \n#define USB_ISTR_RESET_Msk                      (0x1UL << USB_ISTR_RESET_Pos)   /*!< 0x00000400 */\n#define USB_ISTR_RESET                          USB_ISTR_RESET_Msk             /*!< USB RESET request */\n#define USB_ISTR_SUSP_Pos                       (11U)                          \n#define USB_ISTR_SUSP_Msk                       (0x1UL << USB_ISTR_SUSP_Pos)    /*!< 0x00000800 */\n#define USB_ISTR_SUSP                           USB_ISTR_SUSP_Msk              /*!< Suspend mode request */\n#define USB_ISTR_WKUP_Pos                       (12U)                          \n#define USB_ISTR_WKUP_Msk                       (0x1UL << USB_ISTR_WKUP_Pos)    /*!< 0x00001000 */\n#define USB_ISTR_WKUP                           USB_ISTR_WKUP_Msk              /*!< Wake up */\n#define USB_ISTR_ERR_Pos                        (13U)                          \n#define USB_ISTR_ERR_Msk                        (0x1UL << USB_ISTR_ERR_Pos)     /*!< 0x00002000 */\n#define USB_ISTR_ERR                            USB_ISTR_ERR_Msk               /*!< Error */\n#define USB_ISTR_PMAOVR_Pos                     (14U)                          \n#define USB_ISTR_PMAOVR_Msk                     (0x1UL << USB_ISTR_PMAOVR_Pos)  /*!< 0x00004000 */\n#define USB_ISTR_PMAOVR                         USB_ISTR_PMAOVR_Msk            /*!< Packet Memory Area Over / Underrun */\n#define USB_ISTR_CTR_Pos                        (15U)                          \n#define USB_ISTR_CTR_Msk                        (0x1UL << USB_ISTR_CTR_Pos)     /*!< 0x00008000 */\n#define USB_ISTR_CTR                            USB_ISTR_CTR_Msk               /*!< Correct Transfer */\n\n/*******************  Bit definition for USB_FNR register  ********************/\n#define USB_FNR_FN_Pos                          (0U)                           \n#define USB_FNR_FN_Msk                          (0x7FFUL << USB_FNR_FN_Pos)     /*!< 0x000007FF */\n#define USB_FNR_FN                              USB_FNR_FN_Msk                 /*!< Frame Number */\n#define USB_FNR_LSOF_Pos                        (11U)                          \n#define USB_FNR_LSOF_Msk                        (0x3UL << USB_FNR_LSOF_Pos)     /*!< 0x00001800 */\n#define USB_FNR_LSOF                            USB_FNR_LSOF_Msk               /*!< Lost SOF */\n#define USB_FNR_LCK_Pos                         (13U)                          \n#define USB_FNR_LCK_Msk                         (0x1UL << USB_FNR_LCK_Pos)      /*!< 0x00002000 */\n#define USB_FNR_LCK                             USB_FNR_LCK_Msk                /*!< Locked */\n#define USB_FNR_RXDM_Pos                        (14U)                          \n#define USB_FNR_RXDM_Msk                        (0x1UL << USB_FNR_RXDM_Pos)     /*!< 0x00004000 */\n#define USB_FNR_RXDM                            USB_FNR_RXDM_Msk               /*!< Receive Data - Line Status */\n#define USB_FNR_RXDP_Pos                        (15U)                          \n#define USB_FNR_RXDP_Msk                        (0x1UL << USB_FNR_RXDP_Pos)     /*!< 0x00008000 */\n#define USB_FNR_RXDP                            USB_FNR_RXDP_Msk               /*!< Receive Data + Line Status */\n\n/******************  Bit definition for USB_DADDR register  *******************/\n#define USB_DADDR_ADD_Pos                       (0U)                           \n#define USB_DADDR_ADD_Msk                       (0x7FUL << USB_DADDR_ADD_Pos)   /*!< 0x0000007F */\n#define USB_DADDR_ADD                           USB_DADDR_ADD_Msk              /*!< ADD[6:0] bits (Device Address) */\n#define USB_DADDR_ADD0_Pos                      (0U)                           \n#define USB_DADDR_ADD0_Msk                      (0x1UL << USB_DADDR_ADD0_Pos)   /*!< 0x00000001 */\n#define USB_DADDR_ADD0                          USB_DADDR_ADD0_Msk             /*!< Bit 0 */\n#define USB_DADDR_ADD1_Pos                      (1U)                           \n#define USB_DADDR_ADD1_Msk                      (0x1UL << USB_DADDR_ADD1_Pos)   /*!< 0x00000002 */\n#define USB_DADDR_ADD1                          USB_DADDR_ADD1_Msk             /*!< Bit 1 */\n#define USB_DADDR_ADD2_Pos                      (2U)                           \n#define USB_DADDR_ADD2_Msk                      (0x1UL << USB_DADDR_ADD2_Pos)   /*!< 0x00000004 */\n#define USB_DADDR_ADD2                          USB_DADDR_ADD2_Msk             /*!< Bit 2 */\n#define USB_DADDR_ADD3_Pos                      (3U)                           \n#define USB_DADDR_ADD3_Msk                      (0x1UL << USB_DADDR_ADD3_Pos)   /*!< 0x00000008 */\n#define USB_DADDR_ADD3                          USB_DADDR_ADD3_Msk             /*!< Bit 3 */\n#define USB_DADDR_ADD4_Pos                      (4U)                           \n#define USB_DADDR_ADD4_Msk                      (0x1UL << USB_DADDR_ADD4_Pos)   /*!< 0x00000010 */\n#define USB_DADDR_ADD4                          USB_DADDR_ADD4_Msk             /*!< Bit 4 */\n#define USB_DADDR_ADD5_Pos                      (5U)                           \n#define USB_DADDR_ADD5_Msk                      (0x1UL << USB_DADDR_ADD5_Pos)   /*!< 0x00000020 */\n#define USB_DADDR_ADD5                          USB_DADDR_ADD5_Msk             /*!< Bit 5 */\n#define USB_DADDR_ADD6_Pos                      (6U)                           \n#define USB_DADDR_ADD6_Msk                      (0x1UL << USB_DADDR_ADD6_Pos)   /*!< 0x00000040 */\n#define USB_DADDR_ADD6                          USB_DADDR_ADD6_Msk             /*!< Bit 6 */\n\n#define USB_DADDR_EF_Pos                        (7U)                           \n#define USB_DADDR_EF_Msk                        (0x1UL << USB_DADDR_EF_Pos)     /*!< 0x00000080 */\n#define USB_DADDR_EF                            USB_DADDR_EF_Msk               /*!< Enable Function */\n\n/******************  Bit definition for USB_BTABLE register  ******************/    \n#define USB_BTABLE_BTABLE_Pos                   (3U)                           \n#define USB_BTABLE_BTABLE_Msk                   (0x1FFFUL << USB_BTABLE_BTABLE_Pos) /*!< 0x0000FFF8 */\n#define USB_BTABLE_BTABLE                       USB_BTABLE_BTABLE_Msk          /*!< Buffer Table */\n\n/*!< Buffer descriptor table */\n/*****************  Bit definition for USB_ADDR0_TX register  *****************/\n#define USB_ADDR0_TX_ADDR0_TX_Pos               (1U)                           \n#define USB_ADDR0_TX_ADDR0_TX_Msk               (0x7FFFUL << USB_ADDR0_TX_ADDR0_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR0_TX_ADDR0_TX                   USB_ADDR0_TX_ADDR0_TX_Msk      /*!< Transmission Buffer Address 0 */\n\n/*****************  Bit definition for USB_ADDR1_TX register  *****************/\n#define USB_ADDR1_TX_ADDR1_TX_Pos               (1U)                           \n#define USB_ADDR1_TX_ADDR1_TX_Msk               (0x7FFFUL << USB_ADDR1_TX_ADDR1_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR1_TX_ADDR1_TX                   USB_ADDR1_TX_ADDR1_TX_Msk      /*!< Transmission Buffer Address 1 */\n\n/*****************  Bit definition for USB_ADDR2_TX register  *****************/\n#define USB_ADDR2_TX_ADDR2_TX_Pos               (1U)                           \n#define USB_ADDR2_TX_ADDR2_TX_Msk               (0x7FFFUL << USB_ADDR2_TX_ADDR2_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR2_TX_ADDR2_TX                   USB_ADDR2_TX_ADDR2_TX_Msk      /*!< Transmission Buffer Address 2 */\n\n/*****************  Bit definition for USB_ADDR3_TX register  *****************/\n#define USB_ADDR3_TX_ADDR3_TX_Pos               (1U)                           \n#define USB_ADDR3_TX_ADDR3_TX_Msk               (0x7FFFUL << USB_ADDR3_TX_ADDR3_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR3_TX_ADDR3_TX                   USB_ADDR3_TX_ADDR3_TX_Msk      /*!< Transmission Buffer Address 3 */\n\n/*****************  Bit definition for USB_ADDR4_TX register  *****************/\n#define USB_ADDR4_TX_ADDR4_TX_Pos               (1U)                           \n#define USB_ADDR4_TX_ADDR4_TX_Msk               (0x7FFFUL << USB_ADDR4_TX_ADDR4_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR4_TX_ADDR4_TX                   USB_ADDR4_TX_ADDR4_TX_Msk      /*!< Transmission Buffer Address 4 */\n\n/*****************  Bit definition for USB_ADDR5_TX register  *****************/\n#define USB_ADDR5_TX_ADDR5_TX_Pos               (1U)                           \n#define USB_ADDR5_TX_ADDR5_TX_Msk               (0x7FFFUL << USB_ADDR5_TX_ADDR5_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR5_TX_ADDR5_TX                   USB_ADDR5_TX_ADDR5_TX_Msk      /*!< Transmission Buffer Address 5 */\n\n/*****************  Bit definition for USB_ADDR6_TX register  *****************/\n#define USB_ADDR6_TX_ADDR6_TX_Pos               (1U)                           \n#define USB_ADDR6_TX_ADDR6_TX_Msk               (0x7FFFUL << USB_ADDR6_TX_ADDR6_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR6_TX_ADDR6_TX                   USB_ADDR6_TX_ADDR6_TX_Msk      /*!< Transmission Buffer Address 6 */\n\n/*****************  Bit definition for USB_ADDR7_TX register  *****************/\n#define USB_ADDR7_TX_ADDR7_TX_Pos               (1U)                           \n#define USB_ADDR7_TX_ADDR7_TX_Msk               (0x7FFFUL << USB_ADDR7_TX_ADDR7_TX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR7_TX_ADDR7_TX                   USB_ADDR7_TX_ADDR7_TX_Msk      /*!< Transmission Buffer Address 7 */\n\n/*----------------------------------------------------------------------------*/\n\n/*****************  Bit definition for USB_COUNT0_TX register  ****************/\n#define USB_COUNT0_TX_COUNT0_TX_Pos             (0U)                           \n#define USB_COUNT0_TX_COUNT0_TX_Msk             (0x3FFUL << USB_COUNT0_TX_COUNT0_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT0_TX_COUNT0_TX                 USB_COUNT0_TX_COUNT0_TX_Msk    /*!< Transmission Byte Count 0 */\n\n/*****************  Bit definition for USB_COUNT1_TX register  ****************/\n#define USB_COUNT1_TX_COUNT1_TX_Pos             (0U)                           \n#define USB_COUNT1_TX_COUNT1_TX_Msk             (0x3FFUL << USB_COUNT1_TX_COUNT1_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT1_TX_COUNT1_TX                 USB_COUNT1_TX_COUNT1_TX_Msk    /*!< Transmission Byte Count 1 */\n\n/*****************  Bit definition for USB_COUNT2_TX register  ****************/\n#define USB_COUNT2_TX_COUNT2_TX_Pos             (0U)                           \n#define USB_COUNT2_TX_COUNT2_TX_Msk             (0x3FFUL << USB_COUNT2_TX_COUNT2_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT2_TX_COUNT2_TX                 USB_COUNT2_TX_COUNT2_TX_Msk    /*!< Transmission Byte Count 2 */\n\n/*****************  Bit definition for USB_COUNT3_TX register  ****************/\n#define USB_COUNT3_TX_COUNT3_TX_Pos             (0U)                           \n#define USB_COUNT3_TX_COUNT3_TX_Msk             (0x3FFUL << USB_COUNT3_TX_COUNT3_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT3_TX_COUNT3_TX                 USB_COUNT3_TX_COUNT3_TX_Msk    /*!< Transmission Byte Count 3 */\n\n/*****************  Bit definition for USB_COUNT4_TX register  ****************/\n#define USB_COUNT4_TX_COUNT4_TX_Pos             (0U)                           \n#define USB_COUNT4_TX_COUNT4_TX_Msk             (0x3FFUL << USB_COUNT4_TX_COUNT4_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT4_TX_COUNT4_TX                 USB_COUNT4_TX_COUNT4_TX_Msk    /*!< Transmission Byte Count 4 */\n\n/*****************  Bit definition for USB_COUNT5_TX register  ****************/\n#define USB_COUNT5_TX_COUNT5_TX_Pos             (0U)                           \n#define USB_COUNT5_TX_COUNT5_TX_Msk             (0x3FFUL << USB_COUNT5_TX_COUNT5_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT5_TX_COUNT5_TX                 USB_COUNT5_TX_COUNT5_TX_Msk    /*!< Transmission Byte Count 5 */\n\n/*****************  Bit definition for USB_COUNT6_TX register  ****************/\n#define USB_COUNT6_TX_COUNT6_TX_Pos             (0U)                           \n#define USB_COUNT6_TX_COUNT6_TX_Msk             (0x3FFUL << USB_COUNT6_TX_COUNT6_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT6_TX_COUNT6_TX                 USB_COUNT6_TX_COUNT6_TX_Msk    /*!< Transmission Byte Count 6 */\n\n/*****************  Bit definition for USB_COUNT7_TX register  ****************/\n#define USB_COUNT7_TX_COUNT7_TX_Pos             (0U)                           \n#define USB_COUNT7_TX_COUNT7_TX_Msk             (0x3FFUL << USB_COUNT7_TX_COUNT7_TX_Pos) /*!< 0x000003FF */\n#define USB_COUNT7_TX_COUNT7_TX                 USB_COUNT7_TX_COUNT7_TX_Msk    /*!< Transmission Byte Count 7 */\n\n/*----------------------------------------------------------------------------*/\n\n/****************  Bit definition for USB_COUNT0_TX_0 register  ***************/\n#define USB_COUNT0_TX_0_COUNT0_TX_0             0x000003FFU         /*!< Transmission Byte Count 0 (low) */\n\n/****************  Bit definition for USB_COUNT0_TX_1 register  ***************/\n#define USB_COUNT0_TX_1_COUNT0_TX_1             0x03FF0000U         /*!< Transmission Byte Count 0 (high) */\n\n/****************  Bit definition for USB_COUNT1_TX_0 register  ***************/\n#define USB_COUNT1_TX_0_COUNT1_TX_0             0x000003FFU         /*!< Transmission Byte Count 1 (low) */\n\n/****************  Bit definition for USB_COUNT1_TX_1 register  ***************/\n#define USB_COUNT1_TX_1_COUNT1_TX_1             0x03FF0000U         /*!< Transmission Byte Count 1 (high) */\n\n/****************  Bit definition for USB_COUNT2_TX_0 register  ***************/\n#define USB_COUNT2_TX_0_COUNT2_TX_0             0x000003FFU         /*!< Transmission Byte Count 2 (low) */\n\n/****************  Bit definition for USB_COUNT2_TX_1 register  ***************/\n#define USB_COUNT2_TX_1_COUNT2_TX_1             0x03FF0000U         /*!< Transmission Byte Count 2 (high) */\n\n/****************  Bit definition for USB_COUNT3_TX_0 register  ***************/\n#define USB_COUNT3_TX_0_COUNT3_TX_0             0x000003FFU         /*!< Transmission Byte Count 3 (low) */\n\n/****************  Bit definition for USB_COUNT3_TX_1 register  ***************/\n#define USB_COUNT3_TX_1_COUNT3_TX_1             0x03FF0000U         /*!< Transmission Byte Count 3 (high) */\n\n/****************  Bit definition for USB_COUNT4_TX_0 register  ***************/\n#define USB_COUNT4_TX_0_COUNT4_TX_0             0x000003FFU         /*!< Transmission Byte Count 4 (low) */\n\n/****************  Bit definition for USB_COUNT4_TX_1 register  ***************/\n#define USB_COUNT4_TX_1_COUNT4_TX_1             0x03FF0000U         /*!< Transmission Byte Count 4 (high) */\n\n/****************  Bit definition for USB_COUNT5_TX_0 register  ***************/\n#define USB_COUNT5_TX_0_COUNT5_TX_0             0x000003FFU         /*!< Transmission Byte Count 5 (low) */\n\n/****************  Bit definition for USB_COUNT5_TX_1 register  ***************/\n#define USB_COUNT5_TX_1_COUNT5_TX_1             0x03FF0000U         /*!< Transmission Byte Count 5 (high) */\n\n/****************  Bit definition for USB_COUNT6_TX_0 register  ***************/\n#define USB_COUNT6_TX_0_COUNT6_TX_0             0x000003FFU         /*!< Transmission Byte Count 6 (low) */\n\n/****************  Bit definition for USB_COUNT6_TX_1 register  ***************/\n#define USB_COUNT6_TX_1_COUNT6_TX_1             0x03FF0000U         /*!< Transmission Byte Count 6 (high) */\n\n/****************  Bit definition for USB_COUNT7_TX_0 register  ***************/\n#define USB_COUNT7_TX_0_COUNT7_TX_0             0x000003FFU         /*!< Transmission Byte Count 7 (low) */\n\n/****************  Bit definition for USB_COUNT7_TX_1 register  ***************/\n#define USB_COUNT7_TX_1_COUNT7_TX_1             0x03FF0000U         /*!< Transmission Byte Count 7 (high) */\n\n/*----------------------------------------------------------------------------*/\n\n/*****************  Bit definition for USB_ADDR0_RX register  *****************/\n#define USB_ADDR0_RX_ADDR0_RX_Pos               (1U)                           \n#define USB_ADDR0_RX_ADDR0_RX_Msk               (0x7FFFUL << USB_ADDR0_RX_ADDR0_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR0_RX_ADDR0_RX                   USB_ADDR0_RX_ADDR0_RX_Msk      /*!< Reception Buffer Address 0 */\n\n/*****************  Bit definition for USB_ADDR1_RX register  *****************/\n#define USB_ADDR1_RX_ADDR1_RX_Pos               (1U)                           \n#define USB_ADDR1_RX_ADDR1_RX_Msk               (0x7FFFUL << USB_ADDR1_RX_ADDR1_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR1_RX_ADDR1_RX                   USB_ADDR1_RX_ADDR1_RX_Msk      /*!< Reception Buffer Address 1 */\n\n/*****************  Bit definition for USB_ADDR2_RX register  *****************/\n#define USB_ADDR2_RX_ADDR2_RX_Pos               (1U)                           \n#define USB_ADDR2_RX_ADDR2_RX_Msk               (0x7FFFUL << USB_ADDR2_RX_ADDR2_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR2_RX_ADDR2_RX                   USB_ADDR2_RX_ADDR2_RX_Msk      /*!< Reception Buffer Address 2 */\n\n/*****************  Bit definition for USB_ADDR3_RX register  *****************/\n#define USB_ADDR3_RX_ADDR3_RX_Pos               (1U)                           \n#define USB_ADDR3_RX_ADDR3_RX_Msk               (0x7FFFUL << USB_ADDR3_RX_ADDR3_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR3_RX_ADDR3_RX                   USB_ADDR3_RX_ADDR3_RX_Msk      /*!< Reception Buffer Address 3 */\n\n/*****************  Bit definition for USB_ADDR4_RX register  *****************/\n#define USB_ADDR4_RX_ADDR4_RX_Pos               (1U)                           \n#define USB_ADDR4_RX_ADDR4_RX_Msk               (0x7FFFUL << USB_ADDR4_RX_ADDR4_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR4_RX_ADDR4_RX                   USB_ADDR4_RX_ADDR4_RX_Msk      /*!< Reception Buffer Address 4 */\n\n/*****************  Bit definition for USB_ADDR5_RX register  *****************/\n#define USB_ADDR5_RX_ADDR5_RX_Pos               (1U)                           \n#define USB_ADDR5_RX_ADDR5_RX_Msk               (0x7FFFUL << USB_ADDR5_RX_ADDR5_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR5_RX_ADDR5_RX                   USB_ADDR5_RX_ADDR5_RX_Msk      /*!< Reception Buffer Address 5 */\n\n/*****************  Bit definition for USB_ADDR6_RX register  *****************/\n#define USB_ADDR6_RX_ADDR6_RX_Pos               (1U)                           \n#define USB_ADDR6_RX_ADDR6_RX_Msk               (0x7FFFUL << USB_ADDR6_RX_ADDR6_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR6_RX_ADDR6_RX                   USB_ADDR6_RX_ADDR6_RX_Msk      /*!< Reception Buffer Address 6 */\n\n/*****************  Bit definition for USB_ADDR7_RX register  *****************/\n#define USB_ADDR7_RX_ADDR7_RX_Pos               (1U)                           \n#define USB_ADDR7_RX_ADDR7_RX_Msk               (0x7FFFUL << USB_ADDR7_RX_ADDR7_RX_Pos) /*!< 0x0000FFFE */\n#define USB_ADDR7_RX_ADDR7_RX                   USB_ADDR7_RX_ADDR7_RX_Msk      /*!< Reception Buffer Address 7 */\n\n/*----------------------------------------------------------------------------*/\n\n/*****************  Bit definition for USB_COUNT0_RX register  ****************/\n#define USB_COUNT0_RX_COUNT0_RX_Pos             (0U)                           \n#define USB_COUNT0_RX_COUNT0_RX_Msk             (0x3FFUL << USB_COUNT0_RX_COUNT0_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT0_RX_COUNT0_RX                 USB_COUNT0_RX_COUNT0_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT0_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT0_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT0_RX_NUM_BLOCK                 USB_COUNT0_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT0_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT0_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT0_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT0_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT0_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT0_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT0_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT0_RX_BLSIZE_Msk                (0x1UL << USB_COUNT0_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT0_RX_BLSIZE                    USB_COUNT0_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT1_RX register  ****************/\n#define USB_COUNT1_RX_COUNT1_RX_Pos             (0U)                           \n#define USB_COUNT1_RX_COUNT1_RX_Msk             (0x3FFUL << USB_COUNT1_RX_COUNT1_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT1_RX_COUNT1_RX                 USB_COUNT1_RX_COUNT1_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT1_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT1_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT1_RX_NUM_BLOCK                 USB_COUNT1_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT1_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT1_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT1_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT1_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT1_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT1_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT1_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT1_RX_BLSIZE_Msk                (0x1UL << USB_COUNT1_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT1_RX_BLSIZE                    USB_COUNT1_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT2_RX register  ****************/\n#define USB_COUNT2_RX_COUNT2_RX_Pos             (0U)                           \n#define USB_COUNT2_RX_COUNT2_RX_Msk             (0x3FFUL << USB_COUNT2_RX_COUNT2_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT2_RX_COUNT2_RX                 USB_COUNT2_RX_COUNT2_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT2_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT2_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT2_RX_NUM_BLOCK                 USB_COUNT2_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT2_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT2_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT2_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT2_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT2_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT2_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT2_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT2_RX_BLSIZE_Msk                (0x1UL << USB_COUNT2_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT2_RX_BLSIZE                    USB_COUNT2_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT3_RX register  ****************/\n#define USB_COUNT3_RX_COUNT3_RX_Pos             (0U)                           \n#define USB_COUNT3_RX_COUNT3_RX_Msk             (0x3FFUL << USB_COUNT3_RX_COUNT3_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT3_RX_COUNT3_RX                 USB_COUNT3_RX_COUNT3_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT3_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT3_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT3_RX_NUM_BLOCK                 USB_COUNT3_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT3_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT3_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT3_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT3_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT3_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT3_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT3_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT3_RX_BLSIZE_Msk                (0x1UL << USB_COUNT3_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT3_RX_BLSIZE                    USB_COUNT3_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT4_RX register  ****************/\n#define USB_COUNT4_RX_COUNT4_RX_Pos             (0U)                           \n#define USB_COUNT4_RX_COUNT4_RX_Msk             (0x3FFUL << USB_COUNT4_RX_COUNT4_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT4_RX_COUNT4_RX                 USB_COUNT4_RX_COUNT4_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT4_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT4_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT4_RX_NUM_BLOCK                 USB_COUNT4_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT4_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT4_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT4_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT4_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT4_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT4_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT4_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT4_RX_BLSIZE_Msk                (0x1UL << USB_COUNT4_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT4_RX_BLSIZE                    USB_COUNT4_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT5_RX register  ****************/\n#define USB_COUNT5_RX_COUNT5_RX_Pos             (0U)                           \n#define USB_COUNT5_RX_COUNT5_RX_Msk             (0x3FFUL << USB_COUNT5_RX_COUNT5_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT5_RX_COUNT5_RX                 USB_COUNT5_RX_COUNT5_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT5_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT5_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT5_RX_NUM_BLOCK                 USB_COUNT5_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT5_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT5_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT5_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT5_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT5_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT5_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT5_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT5_RX_BLSIZE_Msk                (0x1UL << USB_COUNT5_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT5_RX_BLSIZE                    USB_COUNT5_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT6_RX register  ****************/\n#define USB_COUNT6_RX_COUNT6_RX_Pos             (0U)                           \n#define USB_COUNT6_RX_COUNT6_RX_Msk             (0x3FFUL << USB_COUNT6_RX_COUNT6_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT6_RX_COUNT6_RX                 USB_COUNT6_RX_COUNT6_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT6_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT6_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT6_RX_NUM_BLOCK                 USB_COUNT6_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT6_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT6_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT6_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT6_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT6_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT6_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT6_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT6_RX_BLSIZE_Msk                (0x1UL << USB_COUNT6_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT6_RX_BLSIZE                    USB_COUNT6_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*****************  Bit definition for USB_COUNT7_RX register  ****************/\n#define USB_COUNT7_RX_COUNT7_RX_Pos             (0U)                           \n#define USB_COUNT7_RX_COUNT7_RX_Msk             (0x3FFUL << USB_COUNT7_RX_COUNT7_RX_Pos) /*!< 0x000003FF */\n#define USB_COUNT7_RX_COUNT7_RX                 USB_COUNT7_RX_COUNT7_RX_Msk    /*!< Reception Byte Count */\n\n#define USB_COUNT7_RX_NUM_BLOCK_Pos             (10U)                          \n#define USB_COUNT7_RX_NUM_BLOCK_Msk             (0x1FUL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00007C00 */\n#define USB_COUNT7_RX_NUM_BLOCK                 USB_COUNT7_RX_NUM_BLOCK_Msk    /*!< NUM_BLOCK[4:0] bits (Number of blocks) */\n#define USB_COUNT7_RX_NUM_BLOCK_0               (0x01UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00000400 */\n#define USB_COUNT7_RX_NUM_BLOCK_1               (0x02UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00000800 */\n#define USB_COUNT7_RX_NUM_BLOCK_2               (0x04UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00001000 */\n#define USB_COUNT7_RX_NUM_BLOCK_3               (0x08UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00002000 */\n#define USB_COUNT7_RX_NUM_BLOCK_4               (0x10UL << USB_COUNT7_RX_NUM_BLOCK_Pos) /*!< 0x00004000 */\n\n#define USB_COUNT7_RX_BLSIZE_Pos                (15U)                          \n#define USB_COUNT7_RX_BLSIZE_Msk                (0x1UL << USB_COUNT7_RX_BLSIZE_Pos) /*!< 0x00008000 */\n#define USB_COUNT7_RX_BLSIZE                    USB_COUNT7_RX_BLSIZE_Msk       /*!< BLock SIZE */\n\n/*----------------------------------------------------------------------------*/\n\n/****************  Bit definition for USB_COUNT0_RX_0 register  ***************/\n#define USB_COUNT0_RX_0_COUNT0_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT0_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT0_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT0_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT0_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT0_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT0_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT0_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT0_RX_1 register  ***************/\n#define USB_COUNT0_RX_1_COUNT0_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT0_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT0_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 1 */\n#define USB_COUNT0_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT0_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT0_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT0_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT0_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/****************  Bit definition for USB_COUNT1_RX_0 register  ***************/\n#define USB_COUNT1_RX_0_COUNT1_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT1_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT1_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT1_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT1_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT1_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT1_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT1_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT1_RX_1 register  ***************/\n#define USB_COUNT1_RX_1_COUNT1_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT1_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT1_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT1_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT1_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT1_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT1_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT1_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/****************  Bit definition for USB_COUNT2_RX_0 register  ***************/\n#define USB_COUNT2_RX_0_COUNT2_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT2_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT2_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT2_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT2_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT2_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT2_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT2_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT2_RX_1 register  ***************/\n#define USB_COUNT2_RX_1_COUNT2_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT2_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT2_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT2_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT2_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT2_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT2_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT2_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/****************  Bit definition for USB_COUNT3_RX_0 register  ***************/\n#define USB_COUNT3_RX_0_COUNT3_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT3_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT3_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT3_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT3_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT3_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT3_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT3_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT3_RX_1 register  ***************/\n#define USB_COUNT3_RX_1_COUNT3_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT3_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT3_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT3_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT3_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT3_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT3_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT3_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/****************  Bit definition for USB_COUNT4_RX_0 register  ***************/\n#define USB_COUNT4_RX_0_COUNT4_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT4_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT4_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT4_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT4_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT4_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT4_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT4_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT4_RX_1 register  ***************/\n#define USB_COUNT4_RX_1_COUNT4_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT4_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT4_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT4_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT4_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT4_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT4_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT4_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/****************  Bit definition for USB_COUNT5_RX_0 register  ***************/\n#define USB_COUNT5_RX_0_COUNT5_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT5_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT5_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT5_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT5_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT5_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT5_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT5_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT5_RX_1 register  ***************/\n#define USB_COUNT5_RX_1_COUNT5_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT5_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT5_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT5_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT5_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT5_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT5_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT5_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/***************  Bit definition for USB_COUNT6_RX_0  register  ***************/\n#define USB_COUNT6_RX_0_COUNT6_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT6_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT6_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT6_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT6_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT6_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT6_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT6_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/****************  Bit definition for USB_COUNT6_RX_1 register  ***************/\n#define USB_COUNT6_RX_1_COUNT6_RX_1             0x03FF0000U                   /*!< Reception Byte Count (high) */\n\n#define USB_COUNT6_RX_1_NUM_BLOCK_1             0x7C000000U                   /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT6_RX_1_NUM_BLOCK_1_0           0x04000000U                   /*!< Bit 0 */\n#define USB_COUNT6_RX_1_NUM_BLOCK_1_1           0x08000000U                   /*!< Bit 1 */\n#define USB_COUNT6_RX_1_NUM_BLOCK_1_2           0x10000000U                   /*!< Bit 2 */\n#define USB_COUNT6_RX_1_NUM_BLOCK_1_3           0x20000000U                   /*!< Bit 3 */\n#define USB_COUNT6_RX_1_NUM_BLOCK_1_4           0x40000000U                   /*!< Bit 4 */\n\n#define USB_COUNT6_RX_1_BLSIZE_1                0x80000000U                   /*!< BLock SIZE (high) */\n\n/***************  Bit definition for USB_COUNT7_RX_0 register  ****************/\n#define USB_COUNT7_RX_0_COUNT7_RX_0             0x000003FFU                    /*!< Reception Byte Count (low) */\n\n#define USB_COUNT7_RX_0_NUM_BLOCK_0             0x00007C00U                    /*!< NUM_BLOCK_0[4:0] bits (Number of blocks) (low) */\n#define USB_COUNT7_RX_0_NUM_BLOCK_0_0           0x00000400U                    /*!< Bit 0 */\n#define USB_COUNT7_RX_0_NUM_BLOCK_0_1           0x00000800U                    /*!< Bit 1 */\n#define USB_COUNT7_RX_0_NUM_BLOCK_0_2           0x00001000U                    /*!< Bit 2 */\n#define USB_COUNT7_RX_0_NUM_BLOCK_0_3           0x00002000U                    /*!< Bit 3 */\n#define USB_COUNT7_RX_0_NUM_BLOCK_0_4           0x00004000U                    /*!< Bit 4 */\n\n#define USB_COUNT7_RX_0_BLSIZE_0                0x00008000U                    /*!< BLock SIZE (low) */\n\n/***************  Bit definition for USB_COUNT7_RX_1 register  ****************/\n#define USB_COUNT7_RX_1_COUNT7_RX_1             0x03FF0000U                    /*!< Reception Byte Count (high) */\n\n#define USB_COUNT7_RX_1_NUM_BLOCK_1             0x7C000000U                    /*!< NUM_BLOCK_1[4:0] bits (Number of blocks) (high) */\n#define USB_COUNT7_RX_1_NUM_BLOCK_1_0           0x04000000U                    /*!< Bit 0 */\n#define USB_COUNT7_RX_1_NUM_BLOCK_1_1           0x08000000U                    /*!< Bit 1 */\n#define USB_COUNT7_RX_1_NUM_BLOCK_1_2           0x10000000U                    /*!< Bit 2 */\n#define USB_COUNT7_RX_1_NUM_BLOCK_1_3           0x20000000U                    /*!< Bit 3 */\n#define USB_COUNT7_RX_1_NUM_BLOCK_1_4           0x40000000U                    /*!< Bit 4 */\n\n#define USB_COUNT7_RX_1_BLSIZE_1                0x80000000U                    /*!< BLock SIZE (high) */\n\n/******************************************************************************/\n/*                                                                            */\n/*                         Controller Area Network                            */\n/*                                                                            */\n/******************************************************************************/\n\n/*!< CAN control and status registers */\n/*******************  Bit definition for CAN_MCR register  ********************/\n#define CAN_MCR_INRQ_Pos                     (0U)                              \n#define CAN_MCR_INRQ_Msk                     (0x1UL << CAN_MCR_INRQ_Pos)        /*!< 0x00000001 */\n#define CAN_MCR_INRQ                         CAN_MCR_INRQ_Msk                  /*!< Initialization Request */\n#define CAN_MCR_SLEEP_Pos                    (1U)                              \n#define CAN_MCR_SLEEP_Msk                    (0x1UL << CAN_MCR_SLEEP_Pos)       /*!< 0x00000002 */\n#define CAN_MCR_SLEEP                        CAN_MCR_SLEEP_Msk                 /*!< Sleep Mode Request */\n#define CAN_MCR_TXFP_Pos                     (2U)                              \n#define CAN_MCR_TXFP_Msk                     (0x1UL << CAN_MCR_TXFP_Pos)        /*!< 0x00000004 */\n#define CAN_MCR_TXFP                         CAN_MCR_TXFP_Msk                  /*!< Transmit FIFO Priority */\n#define CAN_MCR_RFLM_Pos                     (3U)                              \n#define CAN_MCR_RFLM_Msk                     (0x1UL << CAN_MCR_RFLM_Pos)        /*!< 0x00000008 */\n#define CAN_MCR_RFLM                         CAN_MCR_RFLM_Msk                  /*!< Receive FIFO Locked Mode */\n#define CAN_MCR_NART_Pos                     (4U)                              \n#define CAN_MCR_NART_Msk                     (0x1UL << CAN_MCR_NART_Pos)        /*!< 0x00000010 */\n#define CAN_MCR_NART                         CAN_MCR_NART_Msk                  /*!< No Automatic Retransmission */\n#define CAN_MCR_AWUM_Pos                     (5U)                              \n#define CAN_MCR_AWUM_Msk                     (0x1UL << CAN_MCR_AWUM_Pos)        /*!< 0x00000020 */\n#define CAN_MCR_AWUM                         CAN_MCR_AWUM_Msk                  /*!< Automatic Wakeup Mode */\n#define CAN_MCR_ABOM_Pos                     (6U)                              \n#define CAN_MCR_ABOM_Msk                     (0x1UL << CAN_MCR_ABOM_Pos)        /*!< 0x00000040 */\n#define CAN_MCR_ABOM                         CAN_MCR_ABOM_Msk                  /*!< Automatic Bus-Off Management */\n#define CAN_MCR_TTCM_Pos                     (7U)                              \n#define CAN_MCR_TTCM_Msk                     (0x1UL << CAN_MCR_TTCM_Pos)        /*!< 0x00000080 */\n#define CAN_MCR_TTCM                         CAN_MCR_TTCM_Msk                  /*!< Time Triggered Communication Mode */\n#define CAN_MCR_RESET_Pos                    (15U)                             \n#define CAN_MCR_RESET_Msk                    (0x1UL << CAN_MCR_RESET_Pos)       /*!< 0x00008000 */\n#define CAN_MCR_RESET                        CAN_MCR_RESET_Msk                 /*!< CAN software master reset */\n#define CAN_MCR_DBF_Pos                      (16U)                             \n#define CAN_MCR_DBF_Msk                      (0x1UL << CAN_MCR_DBF_Pos)         /*!< 0x00010000 */\n#define CAN_MCR_DBF                          CAN_MCR_DBF_Msk                   /*!< CAN Debug freeze */\n\n/*******************  Bit definition for CAN_MSR register  ********************/\n#define CAN_MSR_INAK_Pos                     (0U)                              \n#define CAN_MSR_INAK_Msk                     (0x1UL << CAN_MSR_INAK_Pos)        /*!< 0x00000001 */\n#define CAN_MSR_INAK                         CAN_MSR_INAK_Msk                  /*!< Initialization Acknowledge */\n#define CAN_MSR_SLAK_Pos                     (1U)                              \n#define CAN_MSR_SLAK_Msk                     (0x1UL << CAN_MSR_SLAK_Pos)        /*!< 0x00000002 */\n#define CAN_MSR_SLAK                         CAN_MSR_SLAK_Msk                  /*!< Sleep Acknowledge */\n#define CAN_MSR_ERRI_Pos                     (2U)                              \n#define CAN_MSR_ERRI_Msk                     (0x1UL << CAN_MSR_ERRI_Pos)        /*!< 0x00000004 */\n#define CAN_MSR_ERRI                         CAN_MSR_ERRI_Msk                  /*!< Error Interrupt */\n#define CAN_MSR_WKUI_Pos                     (3U)                              \n#define CAN_MSR_WKUI_Msk                     (0x1UL << CAN_MSR_WKUI_Pos)        /*!< 0x00000008 */\n#define CAN_MSR_WKUI                         CAN_MSR_WKUI_Msk                  /*!< Wakeup Interrupt */\n#define CAN_MSR_SLAKI_Pos                    (4U)                              \n#define CAN_MSR_SLAKI_Msk                    (0x1UL << CAN_MSR_SLAKI_Pos)       /*!< 0x00000010 */\n#define CAN_MSR_SLAKI                        CAN_MSR_SLAKI_Msk                 /*!< Sleep Acknowledge Interrupt */\n#define CAN_MSR_TXM_Pos                      (8U)                              \n#define CAN_MSR_TXM_Msk                      (0x1UL << CAN_MSR_TXM_Pos)         /*!< 0x00000100 */\n#define CAN_MSR_TXM                          CAN_MSR_TXM_Msk                   /*!< Transmit Mode */\n#define CAN_MSR_RXM_Pos                      (9U)                              \n#define CAN_MSR_RXM_Msk                      (0x1UL << CAN_MSR_RXM_Pos)         /*!< 0x00000200 */\n#define CAN_MSR_RXM                          CAN_MSR_RXM_Msk                   /*!< Receive Mode */\n#define CAN_MSR_SAMP_Pos                     (10U)                             \n#define CAN_MSR_SAMP_Msk                     (0x1UL << CAN_MSR_SAMP_Pos)        /*!< 0x00000400 */\n#define CAN_MSR_SAMP                         CAN_MSR_SAMP_Msk                  /*!< Last Sample Point */\n#define CAN_MSR_RX_Pos                       (11U)                             \n#define CAN_MSR_RX_Msk                       (0x1UL << CAN_MSR_RX_Pos)          /*!< 0x00000800 */\n#define CAN_MSR_RX                           CAN_MSR_RX_Msk                    /*!< CAN Rx Signal */\n\n/*******************  Bit definition for CAN_TSR register  ********************/\n#define CAN_TSR_RQCP0_Pos                    (0U)                              \n#define CAN_TSR_RQCP0_Msk                    (0x1UL << CAN_TSR_RQCP0_Pos)       /*!< 0x00000001 */\n#define CAN_TSR_RQCP0                        CAN_TSR_RQCP0_Msk                 /*!< Request Completed Mailbox0 */\n#define CAN_TSR_TXOK0_Pos                    (1U)                              \n#define CAN_TSR_TXOK0_Msk                    (0x1UL << CAN_TSR_TXOK0_Pos)       /*!< 0x00000002 */\n#define CAN_TSR_TXOK0                        CAN_TSR_TXOK0_Msk                 /*!< Transmission OK of Mailbox0 */\n#define CAN_TSR_ALST0_Pos                    (2U)                              \n#define CAN_TSR_ALST0_Msk                    (0x1UL << CAN_TSR_ALST0_Pos)       /*!< 0x00000004 */\n#define CAN_TSR_ALST0                        CAN_TSR_ALST0_Msk                 /*!< Arbitration Lost for Mailbox0 */\n#define CAN_TSR_TERR0_Pos                    (3U)                              \n#define CAN_TSR_TERR0_Msk                    (0x1UL << CAN_TSR_TERR0_Pos)       /*!< 0x00000008 */\n#define CAN_TSR_TERR0                        CAN_TSR_TERR0_Msk                 /*!< Transmission Error of Mailbox0 */\n#define CAN_TSR_ABRQ0_Pos                    (7U)                              \n#define CAN_TSR_ABRQ0_Msk                    (0x1UL << CAN_TSR_ABRQ0_Pos)       /*!< 0x00000080 */\n#define CAN_TSR_ABRQ0                        CAN_TSR_ABRQ0_Msk                 /*!< Abort Request for Mailbox0 */\n#define CAN_TSR_RQCP1_Pos                    (8U)                              \n#define CAN_TSR_RQCP1_Msk                    (0x1UL << CAN_TSR_RQCP1_Pos)       /*!< 0x00000100 */\n#define CAN_TSR_RQCP1                        CAN_TSR_RQCP1_Msk                 /*!< Request Completed Mailbox1 */\n#define CAN_TSR_TXOK1_Pos                    (9U)                              \n#define CAN_TSR_TXOK1_Msk                    (0x1UL << CAN_TSR_TXOK1_Pos)       /*!< 0x00000200 */\n#define CAN_TSR_TXOK1                        CAN_TSR_TXOK1_Msk                 /*!< Transmission OK of Mailbox1 */\n#define CAN_TSR_ALST1_Pos                    (10U)                             \n#define CAN_TSR_ALST1_Msk                    (0x1UL << CAN_TSR_ALST1_Pos)       /*!< 0x00000400 */\n#define CAN_TSR_ALST1                        CAN_TSR_ALST1_Msk                 /*!< Arbitration Lost for Mailbox1 */\n#define CAN_TSR_TERR1_Pos                    (11U)                             \n#define CAN_TSR_TERR1_Msk                    (0x1UL << CAN_TSR_TERR1_Pos)       /*!< 0x00000800 */\n#define CAN_TSR_TERR1                        CAN_TSR_TERR1_Msk                 /*!< Transmission Error of Mailbox1 */\n#define CAN_TSR_ABRQ1_Pos                    (15U)                             \n#define CAN_TSR_ABRQ1_Msk                    (0x1UL << CAN_TSR_ABRQ1_Pos)       /*!< 0x00008000 */\n#define CAN_TSR_ABRQ1                        CAN_TSR_ABRQ1_Msk                 /*!< Abort Request for Mailbox 1 */\n#define CAN_TSR_RQCP2_Pos                    (16U)                             \n#define CAN_TSR_RQCP2_Msk                    (0x1UL << CAN_TSR_RQCP2_Pos)       /*!< 0x00010000 */\n#define CAN_TSR_RQCP2                        CAN_TSR_RQCP2_Msk                 /*!< Request Completed Mailbox2 */\n#define CAN_TSR_TXOK2_Pos                    (17U)                             \n#define CAN_TSR_TXOK2_Msk                    (0x1UL << CAN_TSR_TXOK2_Pos)       /*!< 0x00020000 */\n#define CAN_TSR_TXOK2                        CAN_TSR_TXOK2_Msk                 /*!< Transmission OK of Mailbox 2 */\n#define CAN_TSR_ALST2_Pos                    (18U)                             \n#define CAN_TSR_ALST2_Msk                    (0x1UL << CAN_TSR_ALST2_Pos)       /*!< 0x00040000 */\n#define CAN_TSR_ALST2                        CAN_TSR_ALST2_Msk                 /*!< Arbitration Lost for mailbox 2 */\n#define CAN_TSR_TERR2_Pos                    (19U)                             \n#define CAN_TSR_TERR2_Msk                    (0x1UL << CAN_TSR_TERR2_Pos)       /*!< 0x00080000 */\n#define CAN_TSR_TERR2                        CAN_TSR_TERR2_Msk                 /*!< Transmission Error of Mailbox 2 */\n#define CAN_TSR_ABRQ2_Pos                    (23U)                             \n#define CAN_TSR_ABRQ2_Msk                    (0x1UL << CAN_TSR_ABRQ2_Pos)       /*!< 0x00800000 */\n#define CAN_TSR_ABRQ2                        CAN_TSR_ABRQ2_Msk                 /*!< Abort Request for Mailbox 2 */\n#define CAN_TSR_CODE_Pos                     (24U)                             \n#define CAN_TSR_CODE_Msk                     (0x3UL << CAN_TSR_CODE_Pos)        /*!< 0x03000000 */\n#define CAN_TSR_CODE                         CAN_TSR_CODE_Msk                  /*!< Mailbox Code */\n\n#define CAN_TSR_TME_Pos                      (26U)                             \n#define CAN_TSR_TME_Msk                      (0x7UL << CAN_TSR_TME_Pos)         /*!< 0x1C000000 */\n#define CAN_TSR_TME                          CAN_TSR_TME_Msk                   /*!< TME[2:0] bits */\n#define CAN_TSR_TME0_Pos                     (26U)                             \n#define CAN_TSR_TME0_Msk                     (0x1UL << CAN_TSR_TME0_Pos)        /*!< 0x04000000 */\n#define CAN_TSR_TME0                         CAN_TSR_TME0_Msk                  /*!< Transmit Mailbox 0 Empty */\n#define CAN_TSR_TME1_Pos                     (27U)                             \n#define CAN_TSR_TME1_Msk                     (0x1UL << CAN_TSR_TME1_Pos)        /*!< 0x08000000 */\n#define CAN_TSR_TME1                         CAN_TSR_TME1_Msk                  /*!< Transmit Mailbox 1 Empty */\n#define CAN_TSR_TME2_Pos                     (28U)                             \n#define CAN_TSR_TME2_Msk                     (0x1UL << CAN_TSR_TME2_Pos)        /*!< 0x10000000 */\n#define CAN_TSR_TME2                         CAN_TSR_TME2_Msk                  /*!< Transmit Mailbox 2 Empty */\n\n#define CAN_TSR_LOW_Pos                      (29U)                             \n#define CAN_TSR_LOW_Msk                      (0x7UL << CAN_TSR_LOW_Pos)         /*!< 0xE0000000 */\n#define CAN_TSR_LOW                          CAN_TSR_LOW_Msk                   /*!< LOW[2:0] bits */\n#define CAN_TSR_LOW0_Pos                     (29U)                             \n#define CAN_TSR_LOW0_Msk                     (0x1UL << CAN_TSR_LOW0_Pos)        /*!< 0x20000000 */\n#define CAN_TSR_LOW0                         CAN_TSR_LOW0_Msk                  /*!< Lowest Priority Flag for Mailbox 0 */\n#define CAN_TSR_LOW1_Pos                     (30U)                             \n#define CAN_TSR_LOW1_Msk                     (0x1UL << CAN_TSR_LOW1_Pos)        /*!< 0x40000000 */\n#define CAN_TSR_LOW1                         CAN_TSR_LOW1_Msk                  /*!< Lowest Priority Flag for Mailbox 1 */\n#define CAN_TSR_LOW2_Pos                     (31U)                             \n#define CAN_TSR_LOW2_Msk                     (0x1UL << CAN_TSR_LOW2_Pos)        /*!< 0x80000000 */\n#define CAN_TSR_LOW2                         CAN_TSR_LOW2_Msk                  /*!< Lowest Priority Flag for Mailbox 2 */\n\n/*******************  Bit definition for CAN_RF0R register  *******************/\n#define CAN_RF0R_FMP0_Pos                    (0U)                              \n#define CAN_RF0R_FMP0_Msk                    (0x3UL << CAN_RF0R_FMP0_Pos)       /*!< 0x00000003 */\n#define CAN_RF0R_FMP0                        CAN_RF0R_FMP0_Msk                 /*!< FIFO 0 Message Pending */\n#define CAN_RF0R_FULL0_Pos                   (3U)                              \n#define CAN_RF0R_FULL0_Msk                   (0x1UL << CAN_RF0R_FULL0_Pos)      /*!< 0x00000008 */\n#define CAN_RF0R_FULL0                       CAN_RF0R_FULL0_Msk                /*!< FIFO 0 Full */\n#define CAN_RF0R_FOVR0_Pos                   (4U)                              \n#define CAN_RF0R_FOVR0_Msk                   (0x1UL << CAN_RF0R_FOVR0_Pos)      /*!< 0x00000010 */\n#define CAN_RF0R_FOVR0                       CAN_RF0R_FOVR0_Msk                /*!< FIFO 0 Overrun */\n#define CAN_RF0R_RFOM0_Pos                   (5U)                              \n#define CAN_RF0R_RFOM0_Msk                   (0x1UL << CAN_RF0R_RFOM0_Pos)      /*!< 0x00000020 */\n#define CAN_RF0R_RFOM0                       CAN_RF0R_RFOM0_Msk                /*!< Release FIFO 0 Output Mailbox */\n\n/*******************  Bit definition for CAN_RF1R register  *******************/\n#define CAN_RF1R_FMP1_Pos                    (0U)                              \n#define CAN_RF1R_FMP1_Msk                    (0x3UL << CAN_RF1R_FMP1_Pos)       /*!< 0x00000003 */\n#define CAN_RF1R_FMP1                        CAN_RF1R_FMP1_Msk                 /*!< FIFO 1 Message Pending */\n#define CAN_RF1R_FULL1_Pos                   (3U)                              \n#define CAN_RF1R_FULL1_Msk                   (0x1UL << CAN_RF1R_FULL1_Pos)      /*!< 0x00000008 */\n#define CAN_RF1R_FULL1                       CAN_RF1R_FULL1_Msk                /*!< FIFO 1 Full */\n#define CAN_RF1R_FOVR1_Pos                   (4U)                              \n#define CAN_RF1R_FOVR1_Msk                   (0x1UL << CAN_RF1R_FOVR1_Pos)      /*!< 0x00000010 */\n#define CAN_RF1R_FOVR1                       CAN_RF1R_FOVR1_Msk                /*!< FIFO 1 Overrun */\n#define CAN_RF1R_RFOM1_Pos                   (5U)                              \n#define CAN_RF1R_RFOM1_Msk                   (0x1UL << CAN_RF1R_RFOM1_Pos)      /*!< 0x00000020 */\n#define CAN_RF1R_RFOM1                       CAN_RF1R_RFOM1_Msk                /*!< Release FIFO 1 Output Mailbox */\n\n/********************  Bit definition for CAN_IER register  *******************/\n#define CAN_IER_TMEIE_Pos                    (0U)                              \n#define CAN_IER_TMEIE_Msk                    (0x1UL << CAN_IER_TMEIE_Pos)       /*!< 0x00000001 */\n#define CAN_IER_TMEIE                        CAN_IER_TMEIE_Msk                 /*!< Transmit Mailbox Empty Interrupt Enable */\n#define CAN_IER_FMPIE0_Pos                   (1U)                              \n#define CAN_IER_FMPIE0_Msk                   (0x1UL << CAN_IER_FMPIE0_Pos)      /*!< 0x00000002 */\n#define CAN_IER_FMPIE0                       CAN_IER_FMPIE0_Msk                /*!< FIFO Message Pending Interrupt Enable */\n#define CAN_IER_FFIE0_Pos                    (2U)                              \n#define CAN_IER_FFIE0_Msk                    (0x1UL << CAN_IER_FFIE0_Pos)       /*!< 0x00000004 */\n#define CAN_IER_FFIE0                        CAN_IER_FFIE0_Msk                 /*!< FIFO Full Interrupt Enable */\n#define CAN_IER_FOVIE0_Pos                   (3U)                              \n#define CAN_IER_FOVIE0_Msk                   (0x1UL << CAN_IER_FOVIE0_Pos)      /*!< 0x00000008 */\n#define CAN_IER_FOVIE0                       CAN_IER_FOVIE0_Msk                /*!< FIFO Overrun Interrupt Enable */\n#define CAN_IER_FMPIE1_Pos                   (4U)                              \n#define CAN_IER_FMPIE1_Msk                   (0x1UL << CAN_IER_FMPIE1_Pos)      /*!< 0x00000010 */\n#define CAN_IER_FMPIE1                       CAN_IER_FMPIE1_Msk                /*!< FIFO Message Pending Interrupt Enable */\n#define CAN_IER_FFIE1_Pos                    (5U)                              \n#define CAN_IER_FFIE1_Msk                    (0x1UL << CAN_IER_FFIE1_Pos)       /*!< 0x00000020 */\n#define CAN_IER_FFIE1                        CAN_IER_FFIE1_Msk                 /*!< FIFO Full Interrupt Enable */\n#define CAN_IER_FOVIE1_Pos                   (6U)                              \n#define CAN_IER_FOVIE1_Msk                   (0x1UL << CAN_IER_FOVIE1_Pos)      /*!< 0x00000040 */\n#define CAN_IER_FOVIE1                       CAN_IER_FOVIE1_Msk                /*!< FIFO Overrun Interrupt Enable */\n#define CAN_IER_EWGIE_Pos                    (8U)                              \n#define CAN_IER_EWGIE_Msk                    (0x1UL << CAN_IER_EWGIE_Pos)       /*!< 0x00000100 */\n#define CAN_IER_EWGIE                        CAN_IER_EWGIE_Msk                 /*!< Error Warning Interrupt Enable */\n#define CAN_IER_EPVIE_Pos                    (9U)                              \n#define CAN_IER_EPVIE_Msk                    (0x1UL << CAN_IER_EPVIE_Pos)       /*!< 0x00000200 */\n#define CAN_IER_EPVIE                        CAN_IER_EPVIE_Msk                 /*!< Error Passive Interrupt Enable */\n#define CAN_IER_BOFIE_Pos                    (10U)                             \n#define CAN_IER_BOFIE_Msk                    (0x1UL << CAN_IER_BOFIE_Pos)       /*!< 0x00000400 */\n#define CAN_IER_BOFIE                        CAN_IER_BOFIE_Msk                 /*!< Bus-Off Interrupt Enable */\n#define CAN_IER_LECIE_Pos                    (11U)                             \n#define CAN_IER_LECIE_Msk                    (0x1UL << CAN_IER_LECIE_Pos)       /*!< 0x00000800 */\n#define CAN_IER_LECIE                        CAN_IER_LECIE_Msk                 /*!< Last Error Code Interrupt Enable */\n#define CAN_IER_ERRIE_Pos                    (15U)                             \n#define CAN_IER_ERRIE_Msk                    (0x1UL << CAN_IER_ERRIE_Pos)       /*!< 0x00008000 */\n#define CAN_IER_ERRIE                        CAN_IER_ERRIE_Msk                 /*!< Error Interrupt Enable */\n#define CAN_IER_WKUIE_Pos                    (16U)                             \n#define CAN_IER_WKUIE_Msk                    (0x1UL << CAN_IER_WKUIE_Pos)       /*!< 0x00010000 */\n#define CAN_IER_WKUIE                        CAN_IER_WKUIE_Msk                 /*!< Wakeup Interrupt Enable */\n#define CAN_IER_SLKIE_Pos                    (17U)                             \n#define CAN_IER_SLKIE_Msk                    (0x1UL << CAN_IER_SLKIE_Pos)       /*!< 0x00020000 */\n#define CAN_IER_SLKIE                        CAN_IER_SLKIE_Msk                 /*!< Sleep Interrupt Enable */\n\n/********************  Bit definition for CAN_ESR register  *******************/\n#define CAN_ESR_EWGF_Pos                     (0U)                              \n#define CAN_ESR_EWGF_Msk                     (0x1UL << CAN_ESR_EWGF_Pos)        /*!< 0x00000001 */\n#define CAN_ESR_EWGF                         CAN_ESR_EWGF_Msk                  /*!< Error Warning Flag */\n#define CAN_ESR_EPVF_Pos                     (1U)                              \n#define CAN_ESR_EPVF_Msk                     (0x1UL << CAN_ESR_EPVF_Pos)        /*!< 0x00000002 */\n#define CAN_ESR_EPVF                         CAN_ESR_EPVF_Msk                  /*!< Error Passive Flag */\n#define CAN_ESR_BOFF_Pos                     (2U)                              \n#define CAN_ESR_BOFF_Msk                     (0x1UL << CAN_ESR_BOFF_Pos)        /*!< 0x00000004 */\n#define CAN_ESR_BOFF                         CAN_ESR_BOFF_Msk                  /*!< Bus-Off Flag */\n\n#define CAN_ESR_LEC_Pos                      (4U)                              \n#define CAN_ESR_LEC_Msk                      (0x7UL << CAN_ESR_LEC_Pos)         /*!< 0x00000070 */\n#define CAN_ESR_LEC                          CAN_ESR_LEC_Msk                   /*!< LEC[2:0] bits (Last Error Code) */\n#define CAN_ESR_LEC_0                        (0x1UL << CAN_ESR_LEC_Pos)         /*!< 0x00000010 */\n#define CAN_ESR_LEC_1                        (0x2UL << CAN_ESR_LEC_Pos)         /*!< 0x00000020 */\n#define CAN_ESR_LEC_2                        (0x4UL << CAN_ESR_LEC_Pos)         /*!< 0x00000040 */\n\n#define CAN_ESR_TEC_Pos                      (16U)                             \n#define CAN_ESR_TEC_Msk                      (0xFFUL << CAN_ESR_TEC_Pos)        /*!< 0x00FF0000 */\n#define CAN_ESR_TEC                          CAN_ESR_TEC_Msk                   /*!< Least significant byte of the 9-bit Transmit Error Counter */\n#define CAN_ESR_REC_Pos                      (24U)                             \n#define CAN_ESR_REC_Msk                      (0xFFUL << CAN_ESR_REC_Pos)        /*!< 0xFF000000 */\n#define CAN_ESR_REC                          CAN_ESR_REC_Msk                   /*!< Receive Error Counter */\n\n/*******************  Bit definition for CAN_BTR register  ********************/\n#define CAN_BTR_BRP_Pos                      (0U)                              \n#define CAN_BTR_BRP_Msk                      (0x3FFUL << CAN_BTR_BRP_Pos)       /*!< 0x000003FF */\n#define CAN_BTR_BRP                          CAN_BTR_BRP_Msk                   /*!<Baud Rate Prescaler */\n#define CAN_BTR_TS1_Pos                      (16U)                             \n#define CAN_BTR_TS1_Msk                      (0xFUL << CAN_BTR_TS1_Pos)         /*!< 0x000F0000 */\n#define CAN_BTR_TS1                          CAN_BTR_TS1_Msk                   /*!<Time Segment 1 */\n#define CAN_BTR_TS1_0                        (0x1UL << CAN_BTR_TS1_Pos)         /*!< 0x00010000 */\n#define CAN_BTR_TS1_1                        (0x2UL << CAN_BTR_TS1_Pos)         /*!< 0x00020000 */\n#define CAN_BTR_TS1_2                        (0x4UL << CAN_BTR_TS1_Pos)         /*!< 0x00040000 */\n#define CAN_BTR_TS1_3                        (0x8UL << CAN_BTR_TS1_Pos)         /*!< 0x00080000 */\n#define CAN_BTR_TS2_Pos                      (20U)                             \n#define CAN_BTR_TS2_Msk                      (0x7UL << CAN_BTR_TS2_Pos)         /*!< 0x00700000 */\n#define CAN_BTR_TS2                          CAN_BTR_TS2_Msk                   /*!<Time Segment 2 */\n#define CAN_BTR_TS2_0                        (0x1UL << CAN_BTR_TS2_Pos)         /*!< 0x00100000 */\n#define CAN_BTR_TS2_1                        (0x2UL << CAN_BTR_TS2_Pos)         /*!< 0x00200000 */\n#define CAN_BTR_TS2_2                        (0x4UL << CAN_BTR_TS2_Pos)         /*!< 0x00400000 */\n#define CAN_BTR_SJW_Pos                      (24U)                             \n#define CAN_BTR_SJW_Msk                      (0x3UL << CAN_BTR_SJW_Pos)         /*!< 0x03000000 */\n#define CAN_BTR_SJW                          CAN_BTR_SJW_Msk                   /*!<Resynchronization Jump Width */\n#define CAN_BTR_SJW_0                        (0x1UL << CAN_BTR_SJW_Pos)         /*!< 0x01000000 */\n#define CAN_BTR_SJW_1                        (0x2UL << CAN_BTR_SJW_Pos)         /*!< 0x02000000 */\n#define CAN_BTR_LBKM_Pos                     (30U)                             \n#define CAN_BTR_LBKM_Msk                     (0x1UL << CAN_BTR_LBKM_Pos)        /*!< 0x40000000 */\n#define CAN_BTR_LBKM                         CAN_BTR_LBKM_Msk                  /*!<Loop Back Mode (Debug) */\n#define CAN_BTR_SILM_Pos                     (31U)                             \n#define CAN_BTR_SILM_Msk                     (0x1UL << CAN_BTR_SILM_Pos)        /*!< 0x80000000 */\n#define CAN_BTR_SILM                         CAN_BTR_SILM_Msk                  /*!<Silent Mode */\n\n/*!< Mailbox registers */\n/******************  Bit definition for CAN_TI0R register  ********************/\n#define CAN_TI0R_TXRQ_Pos                    (0U)                              \n#define CAN_TI0R_TXRQ_Msk                    (0x1UL << CAN_TI0R_TXRQ_Pos)       /*!< 0x00000001 */\n#define CAN_TI0R_TXRQ                        CAN_TI0R_TXRQ_Msk                 /*!< Transmit Mailbox Request */\n#define CAN_TI0R_RTR_Pos                     (1U)                              \n#define CAN_TI0R_RTR_Msk                     (0x1UL << CAN_TI0R_RTR_Pos)        /*!< 0x00000002 */\n#define CAN_TI0R_RTR                         CAN_TI0R_RTR_Msk                  /*!< Remote Transmission Request */\n#define CAN_TI0R_IDE_Pos                     (2U)                              \n#define CAN_TI0R_IDE_Msk                     (0x1UL << CAN_TI0R_IDE_Pos)        /*!< 0x00000004 */\n#define CAN_TI0R_IDE                         CAN_TI0R_IDE_Msk                  /*!< Identifier Extension */\n#define CAN_TI0R_EXID_Pos                    (3U)                              \n#define CAN_TI0R_EXID_Msk                    (0x3FFFFUL << CAN_TI0R_EXID_Pos)   /*!< 0x001FFFF8 */\n#define CAN_TI0R_EXID                        CAN_TI0R_EXID_Msk                 /*!< Extended Identifier */\n#define CAN_TI0R_STID_Pos                    (21U)                             \n#define CAN_TI0R_STID_Msk                    (0x7FFUL << CAN_TI0R_STID_Pos)     /*!< 0xFFE00000 */\n#define CAN_TI0R_STID                        CAN_TI0R_STID_Msk                 /*!< Standard Identifier or Extended Identifier */\n\n/******************  Bit definition for CAN_TDT0R register  *******************/\n#define CAN_TDT0R_DLC_Pos                    (0U)                              \n#define CAN_TDT0R_DLC_Msk                    (0xFUL << CAN_TDT0R_DLC_Pos)       /*!< 0x0000000F */\n#define CAN_TDT0R_DLC                        CAN_TDT0R_DLC_Msk                 /*!< Data Length Code */\n#define CAN_TDT0R_TGT_Pos                    (8U)                              \n#define CAN_TDT0R_TGT_Msk                    (0x1UL << CAN_TDT0R_TGT_Pos)       /*!< 0x00000100 */\n#define CAN_TDT0R_TGT                        CAN_TDT0R_TGT_Msk                 /*!< Transmit Global Time */\n#define CAN_TDT0R_TIME_Pos                   (16U)                             \n#define CAN_TDT0R_TIME_Msk                   (0xFFFFUL << CAN_TDT0R_TIME_Pos)   /*!< 0xFFFF0000 */\n#define CAN_TDT0R_TIME                       CAN_TDT0R_TIME_Msk                /*!< Message Time Stamp */\n\n/******************  Bit definition for CAN_TDL0R register  *******************/\n#define CAN_TDL0R_DATA0_Pos                  (0U)                              \n#define CAN_TDL0R_DATA0_Msk                  (0xFFUL << CAN_TDL0R_DATA0_Pos)    /*!< 0x000000FF */\n#define CAN_TDL0R_DATA0                      CAN_TDL0R_DATA0_Msk               /*!< Data byte 0 */\n#define CAN_TDL0R_DATA1_Pos                  (8U)                              \n#define CAN_TDL0R_DATA1_Msk                  (0xFFUL << CAN_TDL0R_DATA1_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDL0R_DATA1                      CAN_TDL0R_DATA1_Msk               /*!< Data byte 1 */\n#define CAN_TDL0R_DATA2_Pos                  (16U)                             \n#define CAN_TDL0R_DATA2_Msk                  (0xFFUL << CAN_TDL0R_DATA2_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDL0R_DATA2                      CAN_TDL0R_DATA2_Msk               /*!< Data byte 2 */\n#define CAN_TDL0R_DATA3_Pos                  (24U)                             \n#define CAN_TDL0R_DATA3_Msk                  (0xFFUL << CAN_TDL0R_DATA3_Pos)    /*!< 0xFF000000 */\n#define CAN_TDL0R_DATA3                      CAN_TDL0R_DATA3_Msk               /*!< Data byte 3 */\n\n/******************  Bit definition for CAN_TDH0R register  *******************/\n#define CAN_TDH0R_DATA4_Pos                  (0U)                              \n#define CAN_TDH0R_DATA4_Msk                  (0xFFUL << CAN_TDH0R_DATA4_Pos)    /*!< 0x000000FF */\n#define CAN_TDH0R_DATA4                      CAN_TDH0R_DATA4_Msk               /*!< Data byte 4 */\n#define CAN_TDH0R_DATA5_Pos                  (8U)                              \n#define CAN_TDH0R_DATA5_Msk                  (0xFFUL << CAN_TDH0R_DATA5_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDH0R_DATA5                      CAN_TDH0R_DATA5_Msk               /*!< Data byte 5 */\n#define CAN_TDH0R_DATA6_Pos                  (16U)                             \n#define CAN_TDH0R_DATA6_Msk                  (0xFFUL << CAN_TDH0R_DATA6_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDH0R_DATA6                      CAN_TDH0R_DATA6_Msk               /*!< Data byte 6 */\n#define CAN_TDH0R_DATA7_Pos                  (24U)                             \n#define CAN_TDH0R_DATA7_Msk                  (0xFFUL << CAN_TDH0R_DATA7_Pos)    /*!< 0xFF000000 */\n#define CAN_TDH0R_DATA7                      CAN_TDH0R_DATA7_Msk               /*!< Data byte 7 */\n\n/*******************  Bit definition for CAN_TI1R register  *******************/\n#define CAN_TI1R_TXRQ_Pos                    (0U)                              \n#define CAN_TI1R_TXRQ_Msk                    (0x1UL << CAN_TI1R_TXRQ_Pos)       /*!< 0x00000001 */\n#define CAN_TI1R_TXRQ                        CAN_TI1R_TXRQ_Msk                 /*!< Transmit Mailbox Request */\n#define CAN_TI1R_RTR_Pos                     (1U)                              \n#define CAN_TI1R_RTR_Msk                     (0x1UL << CAN_TI1R_RTR_Pos)        /*!< 0x00000002 */\n#define CAN_TI1R_RTR                         CAN_TI1R_RTR_Msk                  /*!< Remote Transmission Request */\n#define CAN_TI1R_IDE_Pos                     (2U)                              \n#define CAN_TI1R_IDE_Msk                     (0x1UL << CAN_TI1R_IDE_Pos)        /*!< 0x00000004 */\n#define CAN_TI1R_IDE                         CAN_TI1R_IDE_Msk                  /*!< Identifier Extension */\n#define CAN_TI1R_EXID_Pos                    (3U)                              \n#define CAN_TI1R_EXID_Msk                    (0x3FFFFUL << CAN_TI1R_EXID_Pos)   /*!< 0x001FFFF8 */\n#define CAN_TI1R_EXID                        CAN_TI1R_EXID_Msk                 /*!< Extended Identifier */\n#define CAN_TI1R_STID_Pos                    (21U)                             \n#define CAN_TI1R_STID_Msk                    (0x7FFUL << CAN_TI1R_STID_Pos)     /*!< 0xFFE00000 */\n#define CAN_TI1R_STID                        CAN_TI1R_STID_Msk                 /*!< Standard Identifier or Extended Identifier */\n\n/*******************  Bit definition for CAN_TDT1R register  ******************/\n#define CAN_TDT1R_DLC_Pos                    (0U)                              \n#define CAN_TDT1R_DLC_Msk                    (0xFUL << CAN_TDT1R_DLC_Pos)       /*!< 0x0000000F */\n#define CAN_TDT1R_DLC                        CAN_TDT1R_DLC_Msk                 /*!< Data Length Code */\n#define CAN_TDT1R_TGT_Pos                    (8U)                              \n#define CAN_TDT1R_TGT_Msk                    (0x1UL << CAN_TDT1R_TGT_Pos)       /*!< 0x00000100 */\n#define CAN_TDT1R_TGT                        CAN_TDT1R_TGT_Msk                 /*!< Transmit Global Time */\n#define CAN_TDT1R_TIME_Pos                   (16U)                             \n#define CAN_TDT1R_TIME_Msk                   (0xFFFFUL << CAN_TDT1R_TIME_Pos)   /*!< 0xFFFF0000 */\n#define CAN_TDT1R_TIME                       CAN_TDT1R_TIME_Msk                /*!< Message Time Stamp */\n\n/*******************  Bit definition for CAN_TDL1R register  ******************/\n#define CAN_TDL1R_DATA0_Pos                  (0U)                              \n#define CAN_TDL1R_DATA0_Msk                  (0xFFUL << CAN_TDL1R_DATA0_Pos)    /*!< 0x000000FF */\n#define CAN_TDL1R_DATA0                      CAN_TDL1R_DATA0_Msk               /*!< Data byte 0 */\n#define CAN_TDL1R_DATA1_Pos                  (8U)                              \n#define CAN_TDL1R_DATA1_Msk                  (0xFFUL << CAN_TDL1R_DATA1_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDL1R_DATA1                      CAN_TDL1R_DATA1_Msk               /*!< Data byte 1 */\n#define CAN_TDL1R_DATA2_Pos                  (16U)                             \n#define CAN_TDL1R_DATA2_Msk                  (0xFFUL << CAN_TDL1R_DATA2_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDL1R_DATA2                      CAN_TDL1R_DATA2_Msk               /*!< Data byte 2 */\n#define CAN_TDL1R_DATA3_Pos                  (24U)                             \n#define CAN_TDL1R_DATA3_Msk                  (0xFFUL << CAN_TDL1R_DATA3_Pos)    /*!< 0xFF000000 */\n#define CAN_TDL1R_DATA3                      CAN_TDL1R_DATA3_Msk               /*!< Data byte 3 */\n\n/*******************  Bit definition for CAN_TDH1R register  ******************/\n#define CAN_TDH1R_DATA4_Pos                  (0U)                              \n#define CAN_TDH1R_DATA4_Msk                  (0xFFUL << CAN_TDH1R_DATA4_Pos)    /*!< 0x000000FF */\n#define CAN_TDH1R_DATA4                      CAN_TDH1R_DATA4_Msk               /*!< Data byte 4 */\n#define CAN_TDH1R_DATA5_Pos                  (8U)                              \n#define CAN_TDH1R_DATA5_Msk                  (0xFFUL << CAN_TDH1R_DATA5_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDH1R_DATA5                      CAN_TDH1R_DATA5_Msk               /*!< Data byte 5 */\n#define CAN_TDH1R_DATA6_Pos                  (16U)                             \n#define CAN_TDH1R_DATA6_Msk                  (0xFFUL << CAN_TDH1R_DATA6_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDH1R_DATA6                      CAN_TDH1R_DATA6_Msk               /*!< Data byte 6 */\n#define CAN_TDH1R_DATA7_Pos                  (24U)                             \n#define CAN_TDH1R_DATA7_Msk                  (0xFFUL << CAN_TDH1R_DATA7_Pos)    /*!< 0xFF000000 */\n#define CAN_TDH1R_DATA7                      CAN_TDH1R_DATA7_Msk               /*!< Data byte 7 */\n\n/*******************  Bit definition for CAN_TI2R register  *******************/\n#define CAN_TI2R_TXRQ_Pos                    (0U)                              \n#define CAN_TI2R_TXRQ_Msk                    (0x1UL << CAN_TI2R_TXRQ_Pos)       /*!< 0x00000001 */\n#define CAN_TI2R_TXRQ                        CAN_TI2R_TXRQ_Msk                 /*!< Transmit Mailbox Request */\n#define CAN_TI2R_RTR_Pos                     (1U)                              \n#define CAN_TI2R_RTR_Msk                     (0x1UL << CAN_TI2R_RTR_Pos)        /*!< 0x00000002 */\n#define CAN_TI2R_RTR                         CAN_TI2R_RTR_Msk                  /*!< Remote Transmission Request */\n#define CAN_TI2R_IDE_Pos                     (2U)                              \n#define CAN_TI2R_IDE_Msk                     (0x1UL << CAN_TI2R_IDE_Pos)        /*!< 0x00000004 */\n#define CAN_TI2R_IDE                         CAN_TI2R_IDE_Msk                  /*!< Identifier Extension */\n#define CAN_TI2R_EXID_Pos                    (3U)                              \n#define CAN_TI2R_EXID_Msk                    (0x3FFFFUL << CAN_TI2R_EXID_Pos)   /*!< 0x001FFFF8 */\n#define CAN_TI2R_EXID                        CAN_TI2R_EXID_Msk                 /*!< Extended identifier */\n#define CAN_TI2R_STID_Pos                    (21U)                             \n#define CAN_TI2R_STID_Msk                    (0x7FFUL << CAN_TI2R_STID_Pos)     /*!< 0xFFE00000 */\n#define CAN_TI2R_STID                        CAN_TI2R_STID_Msk                 /*!< Standard Identifier or Extended Identifier */\n\n/*******************  Bit definition for CAN_TDT2R register  ******************/  \n#define CAN_TDT2R_DLC_Pos                    (0U)                              \n#define CAN_TDT2R_DLC_Msk                    (0xFUL << CAN_TDT2R_DLC_Pos)       /*!< 0x0000000F */\n#define CAN_TDT2R_DLC                        CAN_TDT2R_DLC_Msk                 /*!< Data Length Code */\n#define CAN_TDT2R_TGT_Pos                    (8U)                              \n#define CAN_TDT2R_TGT_Msk                    (0x1UL << CAN_TDT2R_TGT_Pos)       /*!< 0x00000100 */\n#define CAN_TDT2R_TGT                        CAN_TDT2R_TGT_Msk                 /*!< Transmit Global Time */\n#define CAN_TDT2R_TIME_Pos                   (16U)                             \n#define CAN_TDT2R_TIME_Msk                   (0xFFFFUL << CAN_TDT2R_TIME_Pos)   /*!< 0xFFFF0000 */\n#define CAN_TDT2R_TIME                       CAN_TDT2R_TIME_Msk                /*!< Message Time Stamp */\n\n/*******************  Bit definition for CAN_TDL2R register  ******************/\n#define CAN_TDL2R_DATA0_Pos                  (0U)                              \n#define CAN_TDL2R_DATA0_Msk                  (0xFFUL << CAN_TDL2R_DATA0_Pos)    /*!< 0x000000FF */\n#define CAN_TDL2R_DATA0                      CAN_TDL2R_DATA0_Msk               /*!< Data byte 0 */\n#define CAN_TDL2R_DATA1_Pos                  (8U)                              \n#define CAN_TDL2R_DATA1_Msk                  (0xFFUL << CAN_TDL2R_DATA1_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDL2R_DATA1                      CAN_TDL2R_DATA1_Msk               /*!< Data byte 1 */\n#define CAN_TDL2R_DATA2_Pos                  (16U)                             \n#define CAN_TDL2R_DATA2_Msk                  (0xFFUL << CAN_TDL2R_DATA2_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDL2R_DATA2                      CAN_TDL2R_DATA2_Msk               /*!< Data byte 2 */\n#define CAN_TDL2R_DATA3_Pos                  (24U)                             \n#define CAN_TDL2R_DATA3_Msk                  (0xFFUL << CAN_TDL2R_DATA3_Pos)    /*!< 0xFF000000 */\n#define CAN_TDL2R_DATA3                      CAN_TDL2R_DATA3_Msk               /*!< Data byte 3 */\n\n/*******************  Bit definition for CAN_TDH2R register  ******************/\n#define CAN_TDH2R_DATA4_Pos                  (0U)                              \n#define CAN_TDH2R_DATA4_Msk                  (0xFFUL << CAN_TDH2R_DATA4_Pos)    /*!< 0x000000FF */\n#define CAN_TDH2R_DATA4                      CAN_TDH2R_DATA4_Msk               /*!< Data byte 4 */\n#define CAN_TDH2R_DATA5_Pos                  (8U)                              \n#define CAN_TDH2R_DATA5_Msk                  (0xFFUL << CAN_TDH2R_DATA5_Pos)    /*!< 0x0000FF00 */\n#define CAN_TDH2R_DATA5                      CAN_TDH2R_DATA5_Msk               /*!< Data byte 5 */\n#define CAN_TDH2R_DATA6_Pos                  (16U)                             \n#define CAN_TDH2R_DATA6_Msk                  (0xFFUL << CAN_TDH2R_DATA6_Pos)    /*!< 0x00FF0000 */\n#define CAN_TDH2R_DATA6                      CAN_TDH2R_DATA6_Msk               /*!< Data byte 6 */\n#define CAN_TDH2R_DATA7_Pos                  (24U)                             \n#define CAN_TDH2R_DATA7_Msk                  (0xFFUL << CAN_TDH2R_DATA7_Pos)    /*!< 0xFF000000 */\n#define CAN_TDH2R_DATA7                      CAN_TDH2R_DATA7_Msk               /*!< Data byte 7 */\n\n/*******************  Bit definition for CAN_RI0R register  *******************/\n#define CAN_RI0R_RTR_Pos                     (1U)                              \n#define CAN_RI0R_RTR_Msk                     (0x1UL << CAN_RI0R_RTR_Pos)        /*!< 0x00000002 */\n#define CAN_RI0R_RTR                         CAN_RI0R_RTR_Msk                  /*!< Remote Transmission Request */\n#define CAN_RI0R_IDE_Pos                     (2U)                              \n#define CAN_RI0R_IDE_Msk                     (0x1UL << CAN_RI0R_IDE_Pos)        /*!< 0x00000004 */\n#define CAN_RI0R_IDE                         CAN_RI0R_IDE_Msk                  /*!< Identifier Extension */\n#define CAN_RI0R_EXID_Pos                    (3U)                              \n#define CAN_RI0R_EXID_Msk                    (0x3FFFFUL << CAN_RI0R_EXID_Pos)   /*!< 0x001FFFF8 */\n#define CAN_RI0R_EXID                        CAN_RI0R_EXID_Msk                 /*!< Extended Identifier */\n#define CAN_RI0R_STID_Pos                    (21U)                             \n#define CAN_RI0R_STID_Msk                    (0x7FFUL << CAN_RI0R_STID_Pos)     /*!< 0xFFE00000 */\n#define CAN_RI0R_STID                        CAN_RI0R_STID_Msk                 /*!< Standard Identifier or Extended Identifier */\n\n/*******************  Bit definition for CAN_RDT0R register  ******************/\n#define CAN_RDT0R_DLC_Pos                    (0U)                              \n#define CAN_RDT0R_DLC_Msk                    (0xFUL << CAN_RDT0R_DLC_Pos)       /*!< 0x0000000F */\n#define CAN_RDT0R_DLC                        CAN_RDT0R_DLC_Msk                 /*!< Data Length Code */\n#define CAN_RDT0R_FMI_Pos                    (8U)                              \n#define CAN_RDT0R_FMI_Msk                    (0xFFUL << CAN_RDT0R_FMI_Pos)      /*!< 0x0000FF00 */\n#define CAN_RDT0R_FMI                        CAN_RDT0R_FMI_Msk                 /*!< Filter Match Index */\n#define CAN_RDT0R_TIME_Pos                   (16U)                             \n#define CAN_RDT0R_TIME_Msk                   (0xFFFFUL << CAN_RDT0R_TIME_Pos)   /*!< 0xFFFF0000 */\n#define CAN_RDT0R_TIME                       CAN_RDT0R_TIME_Msk                /*!< Message Time Stamp */\n\n/*******************  Bit definition for CAN_RDL0R register  ******************/\n#define CAN_RDL0R_DATA0_Pos                  (0U)                              \n#define CAN_RDL0R_DATA0_Msk                  (0xFFUL << CAN_RDL0R_DATA0_Pos)    /*!< 0x000000FF */\n#define CAN_RDL0R_DATA0                      CAN_RDL0R_DATA0_Msk               /*!< Data byte 0 */\n#define CAN_RDL0R_DATA1_Pos                  (8U)                              \n#define CAN_RDL0R_DATA1_Msk                  (0xFFUL << CAN_RDL0R_DATA1_Pos)    /*!< 0x0000FF00 */\n#define CAN_RDL0R_DATA1                      CAN_RDL0R_DATA1_Msk               /*!< Data byte 1 */\n#define CAN_RDL0R_DATA2_Pos                  (16U)                             \n#define CAN_RDL0R_DATA2_Msk                  (0xFFUL << CAN_RDL0R_DATA2_Pos)    /*!< 0x00FF0000 */\n#define CAN_RDL0R_DATA2                      CAN_RDL0R_DATA2_Msk               /*!< Data byte 2 */\n#define CAN_RDL0R_DATA3_Pos                  (24U)                             \n#define CAN_RDL0R_DATA3_Msk                  (0xFFUL << CAN_RDL0R_DATA3_Pos)    /*!< 0xFF000000 */\n#define CAN_RDL0R_DATA3                      CAN_RDL0R_DATA3_Msk               /*!< Data byte 3 */\n\n/*******************  Bit definition for CAN_RDH0R register  ******************/\n#define CAN_RDH0R_DATA4_Pos                  (0U)                              \n#define CAN_RDH0R_DATA4_Msk                  (0xFFUL << CAN_RDH0R_DATA4_Pos)    /*!< 0x000000FF */\n#define CAN_RDH0R_DATA4                      CAN_RDH0R_DATA4_Msk               /*!< Data byte 4 */\n#define CAN_RDH0R_DATA5_Pos                  (8U)                              \n#define CAN_RDH0R_DATA5_Msk                  (0xFFUL << CAN_RDH0R_DATA5_Pos)    /*!< 0x0000FF00 */\n#define CAN_RDH0R_DATA5                      CAN_RDH0R_DATA5_Msk               /*!< Data byte 5 */\n#define CAN_RDH0R_DATA6_Pos                  (16U)                             \n#define CAN_RDH0R_DATA6_Msk                  (0xFFUL << CAN_RDH0R_DATA6_Pos)    /*!< 0x00FF0000 */\n#define CAN_RDH0R_DATA6                      CAN_RDH0R_DATA6_Msk               /*!< Data byte 6 */\n#define CAN_RDH0R_DATA7_Pos                  (24U)                             \n#define CAN_RDH0R_DATA7_Msk                  (0xFFUL << CAN_RDH0R_DATA7_Pos)    /*!< 0xFF000000 */\n#define CAN_RDH0R_DATA7                      CAN_RDH0R_DATA7_Msk               /*!< Data byte 7 */\n\n/*******************  Bit definition for CAN_RI1R register  *******************/\n#define CAN_RI1R_RTR_Pos                     (1U)                              \n#define CAN_RI1R_RTR_Msk                     (0x1UL << CAN_RI1R_RTR_Pos)        /*!< 0x00000002 */\n#define CAN_RI1R_RTR                         CAN_RI1R_RTR_Msk                  /*!< Remote Transmission Request */\n#define CAN_RI1R_IDE_Pos                     (2U)                              \n#define CAN_RI1R_IDE_Msk                     (0x1UL << CAN_RI1R_IDE_Pos)        /*!< 0x00000004 */\n#define CAN_RI1R_IDE                         CAN_RI1R_IDE_Msk                  /*!< Identifier Extension */\n#define CAN_RI1R_EXID_Pos                    (3U)                              \n#define CAN_RI1R_EXID_Msk                    (0x3FFFFUL << CAN_RI1R_EXID_Pos)   /*!< 0x001FFFF8 */\n#define CAN_RI1R_EXID                        CAN_RI1R_EXID_Msk                 /*!< Extended identifier */\n#define CAN_RI1R_STID_Pos                    (21U)                             \n#define CAN_RI1R_STID_Msk                    (0x7FFUL << CAN_RI1R_STID_Pos)     /*!< 0xFFE00000 */\n#define CAN_RI1R_STID                        CAN_RI1R_STID_Msk                 /*!< Standard Identifier or Extended Identifier */\n\n/*******************  Bit definition for CAN_RDT1R register  ******************/\n#define CAN_RDT1R_DLC_Pos                    (0U)                              \n#define CAN_RDT1R_DLC_Msk                    (0xFUL << CAN_RDT1R_DLC_Pos)       /*!< 0x0000000F */\n#define CAN_RDT1R_DLC                        CAN_RDT1R_DLC_Msk                 /*!< Data Length Code */\n#define CAN_RDT1R_FMI_Pos                    (8U)                              \n#define CAN_RDT1R_FMI_Msk                    (0xFFUL << CAN_RDT1R_FMI_Pos)      /*!< 0x0000FF00 */\n#define CAN_RDT1R_FMI                        CAN_RDT1R_FMI_Msk                 /*!< Filter Match Index */\n#define CAN_RDT1R_TIME_Pos                   (16U)                             \n#define CAN_RDT1R_TIME_Msk                   (0xFFFFUL << CAN_RDT1R_TIME_Pos)   /*!< 0xFFFF0000 */\n#define CAN_RDT1R_TIME                       CAN_RDT1R_TIME_Msk                /*!< Message Time Stamp */\n\n/*******************  Bit definition for CAN_RDL1R register  ******************/\n#define CAN_RDL1R_DATA0_Pos                  (0U)                              \n#define CAN_RDL1R_DATA0_Msk                  (0xFFUL << CAN_RDL1R_DATA0_Pos)    /*!< 0x000000FF */\n#define CAN_RDL1R_DATA0                      CAN_RDL1R_DATA0_Msk               /*!< Data byte 0 */\n#define CAN_RDL1R_DATA1_Pos                  (8U)                              \n#define CAN_RDL1R_DATA1_Msk                  (0xFFUL << CAN_RDL1R_DATA1_Pos)    /*!< 0x0000FF00 */\n#define CAN_RDL1R_DATA1                      CAN_RDL1R_DATA1_Msk               /*!< Data byte 1 */\n#define CAN_RDL1R_DATA2_Pos                  (16U)                             \n#define CAN_RDL1R_DATA2_Msk                  (0xFFUL << CAN_RDL1R_DATA2_Pos)    /*!< 0x00FF0000 */\n#define CAN_RDL1R_DATA2                      CAN_RDL1R_DATA2_Msk               /*!< Data byte 2 */\n#define CAN_RDL1R_DATA3_Pos                  (24U)                             \n#define CAN_RDL1R_DATA3_Msk                  (0xFFUL << CAN_RDL1R_DATA3_Pos)    /*!< 0xFF000000 */\n#define CAN_RDL1R_DATA3                      CAN_RDL1R_DATA3_Msk               /*!< Data byte 3 */\n\n/*******************  Bit definition for CAN_RDH1R register  ******************/\n#define CAN_RDH1R_DATA4_Pos                  (0U)                              \n#define CAN_RDH1R_DATA4_Msk                  (0xFFUL << CAN_RDH1R_DATA4_Pos)    /*!< 0x000000FF */\n#define CAN_RDH1R_DATA4                      CAN_RDH1R_DATA4_Msk               /*!< Data byte 4 */\n#define CAN_RDH1R_DATA5_Pos                  (8U)                              \n#define CAN_RDH1R_DATA5_Msk                  (0xFFUL << CAN_RDH1R_DATA5_Pos)    /*!< 0x0000FF00 */\n#define CAN_RDH1R_DATA5                      CAN_RDH1R_DATA5_Msk               /*!< Data byte 5 */\n#define CAN_RDH1R_DATA6_Pos                  (16U)                             \n#define CAN_RDH1R_DATA6_Msk                  (0xFFUL << CAN_RDH1R_DATA6_Pos)    /*!< 0x00FF0000 */\n#define CAN_RDH1R_DATA6                      CAN_RDH1R_DATA6_Msk               /*!< Data byte 6 */\n#define CAN_RDH1R_DATA7_Pos                  (24U)                             \n#define CAN_RDH1R_DATA7_Msk                  (0xFFUL << CAN_RDH1R_DATA7_Pos)    /*!< 0xFF000000 */\n#define CAN_RDH1R_DATA7                      CAN_RDH1R_DATA7_Msk               /*!< Data byte 7 */\n\n/*!< CAN filter registers */\n/*******************  Bit definition for CAN_FMR register  ********************/\n#define CAN_FMR_FINIT_Pos                    (0U)                              \n#define CAN_FMR_FINIT_Msk                    (0x1UL << CAN_FMR_FINIT_Pos)       /*!< 0x00000001 */\n#define CAN_FMR_FINIT                        CAN_FMR_FINIT_Msk                 /*!< Filter Init Mode */\n#define CAN_FMR_CAN2SB_Pos                   (8U)                              \n#define CAN_FMR_CAN2SB_Msk                   (0x3FUL << CAN_FMR_CAN2SB_Pos)     /*!< 0x00003F00 */\n#define CAN_FMR_CAN2SB                       CAN_FMR_CAN2SB_Msk                /*!< CAN2 start bank */\n\n/*******************  Bit definition for CAN_FM1R register  *******************/\n#define CAN_FM1R_FBM_Pos                     (0U)                              \n#define CAN_FM1R_FBM_Msk                     (0x3FFFUL << CAN_FM1R_FBM_Pos)     /*!< 0x00003FFF */\n#define CAN_FM1R_FBM                         CAN_FM1R_FBM_Msk                  /*!< Filter Mode */\n#define CAN_FM1R_FBM0_Pos                    (0U)                              \n#define CAN_FM1R_FBM0_Msk                    (0x1UL << CAN_FM1R_FBM0_Pos)       /*!< 0x00000001 */\n#define CAN_FM1R_FBM0                        CAN_FM1R_FBM0_Msk                 /*!< Filter Init Mode for filter 0 */\n#define CAN_FM1R_FBM1_Pos                    (1U)                              \n#define CAN_FM1R_FBM1_Msk                    (0x1UL << CAN_FM1R_FBM1_Pos)       /*!< 0x00000002 */\n#define CAN_FM1R_FBM1                        CAN_FM1R_FBM1_Msk                 /*!< Filter Init Mode for filter 1 */\n#define CAN_FM1R_FBM2_Pos                    (2U)                              \n#define CAN_FM1R_FBM2_Msk                    (0x1UL << CAN_FM1R_FBM2_Pos)       /*!< 0x00000004 */\n#define CAN_FM1R_FBM2                        CAN_FM1R_FBM2_Msk                 /*!< Filter Init Mode for filter 2 */\n#define CAN_FM1R_FBM3_Pos                    (3U)                              \n#define CAN_FM1R_FBM3_Msk                    (0x1UL << CAN_FM1R_FBM3_Pos)       /*!< 0x00000008 */\n#define CAN_FM1R_FBM3                        CAN_FM1R_FBM3_Msk                 /*!< Filter Init Mode for filter 3 */\n#define CAN_FM1R_FBM4_Pos                    (4U)                              \n#define CAN_FM1R_FBM4_Msk                    (0x1UL << CAN_FM1R_FBM4_Pos)       /*!< 0x00000010 */\n#define CAN_FM1R_FBM4                        CAN_FM1R_FBM4_Msk                 /*!< Filter Init Mode for filter 4 */\n#define CAN_FM1R_FBM5_Pos                    (5U)                              \n#define CAN_FM1R_FBM5_Msk                    (0x1UL << CAN_FM1R_FBM5_Pos)       /*!< 0x00000020 */\n#define CAN_FM1R_FBM5                        CAN_FM1R_FBM5_Msk                 /*!< Filter Init Mode for filter 5 */\n#define CAN_FM1R_FBM6_Pos                    (6U)                              \n#define CAN_FM1R_FBM6_Msk                    (0x1UL << CAN_FM1R_FBM6_Pos)       /*!< 0x00000040 */\n#define CAN_FM1R_FBM6                        CAN_FM1R_FBM6_Msk                 /*!< Filter Init Mode for filter 6 */\n#define CAN_FM1R_FBM7_Pos                    (7U)                              \n#define CAN_FM1R_FBM7_Msk                    (0x1UL << CAN_FM1R_FBM7_Pos)       /*!< 0x00000080 */\n#define CAN_FM1R_FBM7                        CAN_FM1R_FBM7_Msk                 /*!< Filter Init Mode for filter 7 */\n#define CAN_FM1R_FBM8_Pos                    (8U)                              \n#define CAN_FM1R_FBM8_Msk                    (0x1UL << CAN_FM1R_FBM8_Pos)       /*!< 0x00000100 */\n#define CAN_FM1R_FBM8                        CAN_FM1R_FBM8_Msk                 /*!< Filter Init Mode for filter 8 */\n#define CAN_FM1R_FBM9_Pos                    (9U)                              \n#define CAN_FM1R_FBM9_Msk                    (0x1UL << CAN_FM1R_FBM9_Pos)       /*!< 0x00000200 */\n#define CAN_FM1R_FBM9                        CAN_FM1R_FBM9_Msk                 /*!< Filter Init Mode for filter 9 */\n#define CAN_FM1R_FBM10_Pos                   (10U)                             \n#define CAN_FM1R_FBM10_Msk                   (0x1UL << CAN_FM1R_FBM10_Pos)      /*!< 0x00000400 */\n#define CAN_FM1R_FBM10                       CAN_FM1R_FBM10_Msk                /*!< Filter Init Mode for filter 10 */\n#define CAN_FM1R_FBM11_Pos                   (11U)                             \n#define CAN_FM1R_FBM11_Msk                   (0x1UL << CAN_FM1R_FBM11_Pos)      /*!< 0x00000800 */\n#define CAN_FM1R_FBM11                       CAN_FM1R_FBM11_Msk                /*!< Filter Init Mode for filter 11 */\n#define CAN_FM1R_FBM12_Pos                   (12U)                             \n#define CAN_FM1R_FBM12_Msk                   (0x1UL << CAN_FM1R_FBM12_Pos)      /*!< 0x00001000 */\n#define CAN_FM1R_FBM12                       CAN_FM1R_FBM12_Msk                /*!< Filter Init Mode for filter 12 */\n#define CAN_FM1R_FBM13_Pos                   (13U)                             \n#define CAN_FM1R_FBM13_Msk                   (0x1UL << CAN_FM1R_FBM13_Pos)      /*!< 0x00002000 */\n#define CAN_FM1R_FBM13                       CAN_FM1R_FBM13_Msk                /*!< Filter Init Mode for filter 13 */\n\n/*******************  Bit definition for CAN_FS1R register  *******************/\n#define CAN_FS1R_FSC_Pos                     (0U)                              \n#define CAN_FS1R_FSC_Msk                     (0x3FFFUL << CAN_FS1R_FSC_Pos)     /*!< 0x00003FFF */\n#define CAN_FS1R_FSC                         CAN_FS1R_FSC_Msk                  /*!< Filter Scale Configuration */\n#define CAN_FS1R_FSC0_Pos                    (0U)                              \n#define CAN_FS1R_FSC0_Msk                    (0x1UL << CAN_FS1R_FSC0_Pos)       /*!< 0x00000001 */\n#define CAN_FS1R_FSC0                        CAN_FS1R_FSC0_Msk                 /*!< Filter Scale Configuration for filter 0 */\n#define CAN_FS1R_FSC1_Pos                    (1U)                              \n#define CAN_FS1R_FSC1_Msk                    (0x1UL << CAN_FS1R_FSC1_Pos)       /*!< 0x00000002 */\n#define CAN_FS1R_FSC1                        CAN_FS1R_FSC1_Msk                 /*!< Filter Scale Configuration for filter 1 */\n#define CAN_FS1R_FSC2_Pos                    (2U)                              \n#define CAN_FS1R_FSC2_Msk                    (0x1UL << CAN_FS1R_FSC2_Pos)       /*!< 0x00000004 */\n#define CAN_FS1R_FSC2                        CAN_FS1R_FSC2_Msk                 /*!< Filter Scale Configuration for filter 2 */\n#define CAN_FS1R_FSC3_Pos                    (3U)                              \n#define CAN_FS1R_FSC3_Msk                    (0x1UL << CAN_FS1R_FSC3_Pos)       /*!< 0x00000008 */\n#define CAN_FS1R_FSC3                        CAN_FS1R_FSC3_Msk                 /*!< Filter Scale Configuration for filter 3 */\n#define CAN_FS1R_FSC4_Pos                    (4U)                              \n#define CAN_FS1R_FSC4_Msk                    (0x1UL << CAN_FS1R_FSC4_Pos)       /*!< 0x00000010 */\n#define CAN_FS1R_FSC4                        CAN_FS1R_FSC4_Msk                 /*!< Filter Scale Configuration for filter 4 */\n#define CAN_FS1R_FSC5_Pos                    (5U)                              \n#define CAN_FS1R_FSC5_Msk                    (0x1UL << CAN_FS1R_FSC5_Pos)       /*!< 0x00000020 */\n#define CAN_FS1R_FSC5                        CAN_FS1R_FSC5_Msk                 /*!< Filter Scale Configuration for filter 5 */\n#define CAN_FS1R_FSC6_Pos                    (6U)                              \n#define CAN_FS1R_FSC6_Msk                    (0x1UL << CAN_FS1R_FSC6_Pos)       /*!< 0x00000040 */\n#define CAN_FS1R_FSC6                        CAN_FS1R_FSC6_Msk                 /*!< Filter Scale Configuration for filter 6 */\n#define CAN_FS1R_FSC7_Pos                    (7U)                              \n#define CAN_FS1R_FSC7_Msk                    (0x1UL << CAN_FS1R_FSC7_Pos)       /*!< 0x00000080 */\n#define CAN_FS1R_FSC7                        CAN_FS1R_FSC7_Msk                 /*!< Filter Scale Configuration for filter 7 */\n#define CAN_FS1R_FSC8_Pos                    (8U)                              \n#define CAN_FS1R_FSC8_Msk                    (0x1UL << CAN_FS1R_FSC8_Pos)       /*!< 0x00000100 */\n#define CAN_FS1R_FSC8                        CAN_FS1R_FSC8_Msk                 /*!< Filter Scale Configuration for filter 8 */\n#define CAN_FS1R_FSC9_Pos                    (9U)                              \n#define CAN_FS1R_FSC9_Msk                    (0x1UL << CAN_FS1R_FSC9_Pos)       /*!< 0x00000200 */\n#define CAN_FS1R_FSC9                        CAN_FS1R_FSC9_Msk                 /*!< Filter Scale Configuration for filter 9 */\n#define CAN_FS1R_FSC10_Pos                   (10U)                             \n#define CAN_FS1R_FSC10_Msk                   (0x1UL << CAN_FS1R_FSC10_Pos)      /*!< 0x00000400 */\n#define CAN_FS1R_FSC10                       CAN_FS1R_FSC10_Msk                /*!< Filter Scale Configuration for filter 10 */\n#define CAN_FS1R_FSC11_Pos                   (11U)                             \n#define CAN_FS1R_FSC11_Msk                   (0x1UL << CAN_FS1R_FSC11_Pos)      /*!< 0x00000800 */\n#define CAN_FS1R_FSC11                       CAN_FS1R_FSC11_Msk                /*!< Filter Scale Configuration for filter 11 */\n#define CAN_FS1R_FSC12_Pos                   (12U)                             \n#define CAN_FS1R_FSC12_Msk                   (0x1UL << CAN_FS1R_FSC12_Pos)      /*!< 0x00001000 */\n#define CAN_FS1R_FSC12                       CAN_FS1R_FSC12_Msk                /*!< Filter Scale Configuration for filter 12 */\n#define CAN_FS1R_FSC13_Pos                   (13U)                             \n#define CAN_FS1R_FSC13_Msk                   (0x1UL << CAN_FS1R_FSC13_Pos)      /*!< 0x00002000 */\n#define CAN_FS1R_FSC13                       CAN_FS1R_FSC13_Msk                /*!< Filter Scale Configuration for filter 13 */\n\n/******************  Bit definition for CAN_FFA1R register  *******************/\n#define CAN_FFA1R_FFA_Pos                    (0U)                              \n#define CAN_FFA1R_FFA_Msk                    (0x3FFFUL << CAN_FFA1R_FFA_Pos)    /*!< 0x00003FFF */\n#define CAN_FFA1R_FFA                        CAN_FFA1R_FFA_Msk                 /*!< Filter FIFO Assignment */\n#define CAN_FFA1R_FFA0_Pos                   (0U)                              \n#define CAN_FFA1R_FFA0_Msk                   (0x1UL << CAN_FFA1R_FFA0_Pos)      /*!< 0x00000001 */\n#define CAN_FFA1R_FFA0                       CAN_FFA1R_FFA0_Msk                /*!< Filter FIFO Assignment for filter 0 */\n#define CAN_FFA1R_FFA1_Pos                   (1U)                              \n#define CAN_FFA1R_FFA1_Msk                   (0x1UL << CAN_FFA1R_FFA1_Pos)      /*!< 0x00000002 */\n#define CAN_FFA1R_FFA1                       CAN_FFA1R_FFA1_Msk                /*!< Filter FIFO Assignment for filter 1 */\n#define CAN_FFA1R_FFA2_Pos                   (2U)                              \n#define CAN_FFA1R_FFA2_Msk                   (0x1UL << CAN_FFA1R_FFA2_Pos)      /*!< 0x00000004 */\n#define CAN_FFA1R_FFA2                       CAN_FFA1R_FFA2_Msk                /*!< Filter FIFO Assignment for filter 2 */\n#define CAN_FFA1R_FFA3_Pos                   (3U)                              \n#define CAN_FFA1R_FFA3_Msk                   (0x1UL << CAN_FFA1R_FFA3_Pos)      /*!< 0x00000008 */\n#define CAN_FFA1R_FFA3                       CAN_FFA1R_FFA3_Msk                /*!< Filter FIFO Assignment for filter 3 */\n#define CAN_FFA1R_FFA4_Pos                   (4U)                              \n#define CAN_FFA1R_FFA4_Msk                   (0x1UL << CAN_FFA1R_FFA4_Pos)      /*!< 0x00000010 */\n#define CAN_FFA1R_FFA4                       CAN_FFA1R_FFA4_Msk                /*!< Filter FIFO Assignment for filter 4 */\n#define CAN_FFA1R_FFA5_Pos                   (5U)                              \n#define CAN_FFA1R_FFA5_Msk                   (0x1UL << CAN_FFA1R_FFA5_Pos)      /*!< 0x00000020 */\n#define CAN_FFA1R_FFA5                       CAN_FFA1R_FFA5_Msk                /*!< Filter FIFO Assignment for filter 5 */\n#define CAN_FFA1R_FFA6_Pos                   (6U)                              \n#define CAN_FFA1R_FFA6_Msk                   (0x1UL << CAN_FFA1R_FFA6_Pos)      /*!< 0x00000040 */\n#define CAN_FFA1R_FFA6                       CAN_FFA1R_FFA6_Msk                /*!< Filter FIFO Assignment for filter 6 */\n#define CAN_FFA1R_FFA7_Pos                   (7U)                              \n#define CAN_FFA1R_FFA7_Msk                   (0x1UL << CAN_FFA1R_FFA7_Pos)      /*!< 0x00000080 */\n#define CAN_FFA1R_FFA7                       CAN_FFA1R_FFA7_Msk                /*!< Filter FIFO Assignment for filter 7 */\n#define CAN_FFA1R_FFA8_Pos                   (8U)                              \n#define CAN_FFA1R_FFA8_Msk                   (0x1UL << CAN_FFA1R_FFA8_Pos)      /*!< 0x00000100 */\n#define CAN_FFA1R_FFA8                       CAN_FFA1R_FFA8_Msk                /*!< Filter FIFO Assignment for filter 8 */\n#define CAN_FFA1R_FFA9_Pos                   (9U)                              \n#define CAN_FFA1R_FFA9_Msk                   (0x1UL << CAN_FFA1R_FFA9_Pos)      /*!< 0x00000200 */\n#define CAN_FFA1R_FFA9                       CAN_FFA1R_FFA9_Msk                /*!< Filter FIFO Assignment for filter 9 */\n#define CAN_FFA1R_FFA10_Pos                  (10U)                             \n#define CAN_FFA1R_FFA10_Msk                  (0x1UL << CAN_FFA1R_FFA10_Pos)     /*!< 0x00000400 */\n#define CAN_FFA1R_FFA10                      CAN_FFA1R_FFA10_Msk               /*!< Filter FIFO Assignment for filter 10 */\n#define CAN_FFA1R_FFA11_Pos                  (11U)                             \n#define CAN_FFA1R_FFA11_Msk                  (0x1UL << CAN_FFA1R_FFA11_Pos)     /*!< 0x00000800 */\n#define CAN_FFA1R_FFA11                      CAN_FFA1R_FFA11_Msk               /*!< Filter FIFO Assignment for filter 11 */\n#define CAN_FFA1R_FFA12_Pos                  (12U)                             \n#define CAN_FFA1R_FFA12_Msk                  (0x1UL << CAN_FFA1R_FFA12_Pos)     /*!< 0x00001000 */\n#define CAN_FFA1R_FFA12                      CAN_FFA1R_FFA12_Msk               /*!< Filter FIFO Assignment for filter 12 */\n#define CAN_FFA1R_FFA13_Pos                  (13U)                             \n#define CAN_FFA1R_FFA13_Msk                  (0x1UL << CAN_FFA1R_FFA13_Pos)     /*!< 0x00002000 */\n#define CAN_FFA1R_FFA13                      CAN_FFA1R_FFA13_Msk               /*!< Filter FIFO Assignment for filter 13 */\n\n/*******************  Bit definition for CAN_FA1R register  *******************/\n#define CAN_FA1R_FACT_Pos                    (0U)                              \n#define CAN_FA1R_FACT_Msk                    (0x3FFFUL << CAN_FA1R_FACT_Pos)    /*!< 0x00003FFF */\n#define CAN_FA1R_FACT                        CAN_FA1R_FACT_Msk                 /*!< Filter Active */\n#define CAN_FA1R_FACT0_Pos                   (0U)                              \n#define CAN_FA1R_FACT0_Msk                   (0x1UL << CAN_FA1R_FACT0_Pos)      /*!< 0x00000001 */\n#define CAN_FA1R_FACT0                       CAN_FA1R_FACT0_Msk                /*!< Filter 0 Active */\n#define CAN_FA1R_FACT1_Pos                   (1U)                              \n#define CAN_FA1R_FACT1_Msk                   (0x1UL << CAN_FA1R_FACT1_Pos)      /*!< 0x00000002 */\n#define CAN_FA1R_FACT1                       CAN_FA1R_FACT1_Msk                /*!< Filter 1 Active */\n#define CAN_FA1R_FACT2_Pos                   (2U)                              \n#define CAN_FA1R_FACT2_Msk                   (0x1UL << CAN_FA1R_FACT2_Pos)      /*!< 0x00000004 */\n#define CAN_FA1R_FACT2                       CAN_FA1R_FACT2_Msk                /*!< Filter 2 Active */\n#define CAN_FA1R_FACT3_Pos                   (3U)                              \n#define CAN_FA1R_FACT3_Msk                   (0x1UL << CAN_FA1R_FACT3_Pos)      /*!< 0x00000008 */\n#define CAN_FA1R_FACT3                       CAN_FA1R_FACT3_Msk                /*!< Filter 3 Active */\n#define CAN_FA1R_FACT4_Pos                   (4U)                              \n#define CAN_FA1R_FACT4_Msk                   (0x1UL << CAN_FA1R_FACT4_Pos)      /*!< 0x00000010 */\n#define CAN_FA1R_FACT4                       CAN_FA1R_FACT4_Msk                /*!< Filter 4 Active */\n#define CAN_FA1R_FACT5_Pos                   (5U)                              \n#define CAN_FA1R_FACT5_Msk                   (0x1UL << CAN_FA1R_FACT5_Pos)      /*!< 0x00000020 */\n#define CAN_FA1R_FACT5                       CAN_FA1R_FACT5_Msk                /*!< Filter 5 Active */\n#define CAN_FA1R_FACT6_Pos                   (6U)                              \n#define CAN_FA1R_FACT6_Msk                   (0x1UL << CAN_FA1R_FACT6_Pos)      /*!< 0x00000040 */\n#define CAN_FA1R_FACT6                       CAN_FA1R_FACT6_Msk                /*!< Filter 6 Active */\n#define CAN_FA1R_FACT7_Pos                   (7U)                              \n#define CAN_FA1R_FACT7_Msk                   (0x1UL << CAN_FA1R_FACT7_Pos)      /*!< 0x00000080 */\n#define CAN_FA1R_FACT7                       CAN_FA1R_FACT7_Msk                /*!< Filter 7 Active */\n#define CAN_FA1R_FACT8_Pos                   (8U)                              \n#define CAN_FA1R_FACT8_Msk                   (0x1UL << CAN_FA1R_FACT8_Pos)      /*!< 0x00000100 */\n#define CAN_FA1R_FACT8                       CAN_FA1R_FACT8_Msk                /*!< Filter 8 Active */\n#define CAN_FA1R_FACT9_Pos                   (9U)                              \n#define CAN_FA1R_FACT9_Msk                   (0x1UL << CAN_FA1R_FACT9_Pos)      /*!< 0x00000200 */\n#define CAN_FA1R_FACT9                       CAN_FA1R_FACT9_Msk                /*!< Filter 9 Active */\n#define CAN_FA1R_FACT10_Pos                  (10U)                             \n#define CAN_FA1R_FACT10_Msk                  (0x1UL << CAN_FA1R_FACT10_Pos)     /*!< 0x00000400 */\n#define CAN_FA1R_FACT10                      CAN_FA1R_FACT10_Msk               /*!< Filter 10 Active */\n#define CAN_FA1R_FACT11_Pos                  (11U)                             \n#define CAN_FA1R_FACT11_Msk                  (0x1UL << CAN_FA1R_FACT11_Pos)     /*!< 0x00000800 */\n#define CAN_FA1R_FACT11                      CAN_FA1R_FACT11_Msk               /*!< Filter 11 Active */\n#define CAN_FA1R_FACT12_Pos                  (12U)                             \n#define CAN_FA1R_FACT12_Msk                  (0x1UL << CAN_FA1R_FACT12_Pos)     /*!< 0x00001000 */\n#define CAN_FA1R_FACT12                      CAN_FA1R_FACT12_Msk               /*!< Filter 12 Active */\n#define CAN_FA1R_FACT13_Pos                  (13U)                             \n#define CAN_FA1R_FACT13_Msk                  (0x1UL << CAN_FA1R_FACT13_Pos)     /*!< 0x00002000 */\n#define CAN_FA1R_FACT13                      CAN_FA1R_FACT13_Msk               /*!< Filter 13 Active */\n\n/*******************  Bit definition for CAN_F0R1 register  *******************/\n#define CAN_F0R1_FB0_Pos                     (0U)                              \n#define CAN_F0R1_FB0_Msk                     (0x1UL << CAN_F0R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F0R1_FB0                         CAN_F0R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F0R1_FB1_Pos                     (1U)                              \n#define CAN_F0R1_FB1_Msk                     (0x1UL << CAN_F0R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F0R1_FB1                         CAN_F0R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F0R1_FB2_Pos                     (2U)                              \n#define CAN_F0R1_FB2_Msk                     (0x1UL << CAN_F0R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F0R1_FB2                         CAN_F0R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F0R1_FB3_Pos                     (3U)                              \n#define CAN_F0R1_FB3_Msk                     (0x1UL << CAN_F0R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F0R1_FB3                         CAN_F0R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F0R1_FB4_Pos                     (4U)                              \n#define CAN_F0R1_FB4_Msk                     (0x1UL << CAN_F0R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F0R1_FB4                         CAN_F0R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F0R1_FB5_Pos                     (5U)                              \n#define CAN_F0R1_FB5_Msk                     (0x1UL << CAN_F0R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F0R1_FB5                         CAN_F0R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F0R1_FB6_Pos                     (6U)                              \n#define CAN_F0R1_FB6_Msk                     (0x1UL << CAN_F0R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F0R1_FB6                         CAN_F0R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F0R1_FB7_Pos                     (7U)                              \n#define CAN_F0R1_FB7_Msk                     (0x1UL << CAN_F0R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F0R1_FB7                         CAN_F0R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F0R1_FB8_Pos                     (8U)                              \n#define CAN_F0R1_FB8_Msk                     (0x1UL << CAN_F0R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F0R1_FB8                         CAN_F0R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F0R1_FB9_Pos                     (9U)                              \n#define CAN_F0R1_FB9_Msk                     (0x1UL << CAN_F0R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F0R1_FB9                         CAN_F0R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F0R1_FB10_Pos                    (10U)                             \n#define CAN_F0R1_FB10_Msk                    (0x1UL << CAN_F0R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F0R1_FB10                        CAN_F0R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F0R1_FB11_Pos                    (11U)                             \n#define CAN_F0R1_FB11_Msk                    (0x1UL << CAN_F0R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F0R1_FB11                        CAN_F0R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F0R1_FB12_Pos                    (12U)                             \n#define CAN_F0R1_FB12_Msk                    (0x1UL << CAN_F0R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F0R1_FB12                        CAN_F0R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F0R1_FB13_Pos                    (13U)                             \n#define CAN_F0R1_FB13_Msk                    (0x1UL << CAN_F0R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F0R1_FB13                        CAN_F0R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F0R1_FB14_Pos                    (14U)                             \n#define CAN_F0R1_FB14_Msk                    (0x1UL << CAN_F0R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F0R1_FB14                        CAN_F0R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F0R1_FB15_Pos                    (15U)                             \n#define CAN_F0R1_FB15_Msk                    (0x1UL << CAN_F0R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F0R1_FB15                        CAN_F0R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F0R1_FB16_Pos                    (16U)                             \n#define CAN_F0R1_FB16_Msk                    (0x1UL << CAN_F0R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F0R1_FB16                        CAN_F0R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F0R1_FB17_Pos                    (17U)                             \n#define CAN_F0R1_FB17_Msk                    (0x1UL << CAN_F0R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F0R1_FB17                        CAN_F0R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F0R1_FB18_Pos                    (18U)                             \n#define CAN_F0R1_FB18_Msk                    (0x1UL << CAN_F0R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F0R1_FB18                        CAN_F0R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F0R1_FB19_Pos                    (19U)                             \n#define CAN_F0R1_FB19_Msk                    (0x1UL << CAN_F0R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F0R1_FB19                        CAN_F0R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F0R1_FB20_Pos                    (20U)                             \n#define CAN_F0R1_FB20_Msk                    (0x1UL << CAN_F0R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F0R1_FB20                        CAN_F0R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F0R1_FB21_Pos                    (21U)                             \n#define CAN_F0R1_FB21_Msk                    (0x1UL << CAN_F0R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F0R1_FB21                        CAN_F0R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F0R1_FB22_Pos                    (22U)                             \n#define CAN_F0R1_FB22_Msk                    (0x1UL << CAN_F0R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F0R1_FB22                        CAN_F0R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F0R1_FB23_Pos                    (23U)                             \n#define CAN_F0R1_FB23_Msk                    (0x1UL << CAN_F0R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F0R1_FB23                        CAN_F0R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F0R1_FB24_Pos                    (24U)                             \n#define CAN_F0R1_FB24_Msk                    (0x1UL << CAN_F0R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F0R1_FB24                        CAN_F0R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F0R1_FB25_Pos                    (25U)                             \n#define CAN_F0R1_FB25_Msk                    (0x1UL << CAN_F0R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F0R1_FB25                        CAN_F0R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F0R1_FB26_Pos                    (26U)                             \n#define CAN_F0R1_FB26_Msk                    (0x1UL << CAN_F0R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F0R1_FB26                        CAN_F0R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F0R1_FB27_Pos                    (27U)                             \n#define CAN_F0R1_FB27_Msk                    (0x1UL << CAN_F0R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F0R1_FB27                        CAN_F0R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F0R1_FB28_Pos                    (28U)                             \n#define CAN_F0R1_FB28_Msk                    (0x1UL << CAN_F0R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F0R1_FB28                        CAN_F0R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F0R1_FB29_Pos                    (29U)                             \n#define CAN_F0R1_FB29_Msk                    (0x1UL << CAN_F0R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F0R1_FB29                        CAN_F0R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F0R1_FB30_Pos                    (30U)                             \n#define CAN_F0R1_FB30_Msk                    (0x1UL << CAN_F0R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F0R1_FB30                        CAN_F0R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F0R1_FB31_Pos                    (31U)                             \n#define CAN_F0R1_FB31_Msk                    (0x1UL << CAN_F0R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F0R1_FB31                        CAN_F0R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F1R1 register  *******************/\n#define CAN_F1R1_FB0_Pos                     (0U)                              \n#define CAN_F1R1_FB0_Msk                     (0x1UL << CAN_F1R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F1R1_FB0                         CAN_F1R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F1R1_FB1_Pos                     (1U)                              \n#define CAN_F1R1_FB1_Msk                     (0x1UL << CAN_F1R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F1R1_FB1                         CAN_F1R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F1R1_FB2_Pos                     (2U)                              \n#define CAN_F1R1_FB2_Msk                     (0x1UL << CAN_F1R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F1R1_FB2                         CAN_F1R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F1R1_FB3_Pos                     (3U)                              \n#define CAN_F1R1_FB3_Msk                     (0x1UL << CAN_F1R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F1R1_FB3                         CAN_F1R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F1R1_FB4_Pos                     (4U)                              \n#define CAN_F1R1_FB4_Msk                     (0x1UL << CAN_F1R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F1R1_FB4                         CAN_F1R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F1R1_FB5_Pos                     (5U)                              \n#define CAN_F1R1_FB5_Msk                     (0x1UL << CAN_F1R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F1R1_FB5                         CAN_F1R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F1R1_FB6_Pos                     (6U)                              \n#define CAN_F1R1_FB6_Msk                     (0x1UL << CAN_F1R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F1R1_FB6                         CAN_F1R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F1R1_FB7_Pos                     (7U)                              \n#define CAN_F1R1_FB7_Msk                     (0x1UL << CAN_F1R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F1R1_FB7                         CAN_F1R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F1R1_FB8_Pos                     (8U)                              \n#define CAN_F1R1_FB8_Msk                     (0x1UL << CAN_F1R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F1R1_FB8                         CAN_F1R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F1R1_FB9_Pos                     (9U)                              \n#define CAN_F1R1_FB9_Msk                     (0x1UL << CAN_F1R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F1R1_FB9                         CAN_F1R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F1R1_FB10_Pos                    (10U)                             \n#define CAN_F1R1_FB10_Msk                    (0x1UL << CAN_F1R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F1R1_FB10                        CAN_F1R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F1R1_FB11_Pos                    (11U)                             \n#define CAN_F1R1_FB11_Msk                    (0x1UL << CAN_F1R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F1R1_FB11                        CAN_F1R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F1R1_FB12_Pos                    (12U)                             \n#define CAN_F1R1_FB12_Msk                    (0x1UL << CAN_F1R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F1R1_FB12                        CAN_F1R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F1R1_FB13_Pos                    (13U)                             \n#define CAN_F1R1_FB13_Msk                    (0x1UL << CAN_F1R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F1R1_FB13                        CAN_F1R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F1R1_FB14_Pos                    (14U)                             \n#define CAN_F1R1_FB14_Msk                    (0x1UL << CAN_F1R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F1R1_FB14                        CAN_F1R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F1R1_FB15_Pos                    (15U)                             \n#define CAN_F1R1_FB15_Msk                    (0x1UL << CAN_F1R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F1R1_FB15                        CAN_F1R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F1R1_FB16_Pos                    (16U)                             \n#define CAN_F1R1_FB16_Msk                    (0x1UL << CAN_F1R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F1R1_FB16                        CAN_F1R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F1R1_FB17_Pos                    (17U)                             \n#define CAN_F1R1_FB17_Msk                    (0x1UL << CAN_F1R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F1R1_FB17                        CAN_F1R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F1R1_FB18_Pos                    (18U)                             \n#define CAN_F1R1_FB18_Msk                    (0x1UL << CAN_F1R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F1R1_FB18                        CAN_F1R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F1R1_FB19_Pos                    (19U)                             \n#define CAN_F1R1_FB19_Msk                    (0x1UL << CAN_F1R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F1R1_FB19                        CAN_F1R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F1R1_FB20_Pos                    (20U)                             \n#define CAN_F1R1_FB20_Msk                    (0x1UL << CAN_F1R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F1R1_FB20                        CAN_F1R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F1R1_FB21_Pos                    (21U)                             \n#define CAN_F1R1_FB21_Msk                    (0x1UL << CAN_F1R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F1R1_FB21                        CAN_F1R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F1R1_FB22_Pos                    (22U)                             \n#define CAN_F1R1_FB22_Msk                    (0x1UL << CAN_F1R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F1R1_FB22                        CAN_F1R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F1R1_FB23_Pos                    (23U)                             \n#define CAN_F1R1_FB23_Msk                    (0x1UL << CAN_F1R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F1R1_FB23                        CAN_F1R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F1R1_FB24_Pos                    (24U)                             \n#define CAN_F1R1_FB24_Msk                    (0x1UL << CAN_F1R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F1R1_FB24                        CAN_F1R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F1R1_FB25_Pos                    (25U)                             \n#define CAN_F1R1_FB25_Msk                    (0x1UL << CAN_F1R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F1R1_FB25                        CAN_F1R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F1R1_FB26_Pos                    (26U)                             \n#define CAN_F1R1_FB26_Msk                    (0x1UL << CAN_F1R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F1R1_FB26                        CAN_F1R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F1R1_FB27_Pos                    (27U)                             \n#define CAN_F1R1_FB27_Msk                    (0x1UL << CAN_F1R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F1R1_FB27                        CAN_F1R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F1R1_FB28_Pos                    (28U)                             \n#define CAN_F1R1_FB28_Msk                    (0x1UL << CAN_F1R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F1R1_FB28                        CAN_F1R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F1R1_FB29_Pos                    (29U)                             \n#define CAN_F1R1_FB29_Msk                    (0x1UL << CAN_F1R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F1R1_FB29                        CAN_F1R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F1R1_FB30_Pos                    (30U)                             \n#define CAN_F1R1_FB30_Msk                    (0x1UL << CAN_F1R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F1R1_FB30                        CAN_F1R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F1R1_FB31_Pos                    (31U)                             \n#define CAN_F1R1_FB31_Msk                    (0x1UL << CAN_F1R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F1R1_FB31                        CAN_F1R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F2R1 register  *******************/\n#define CAN_F2R1_FB0_Pos                     (0U)                              \n#define CAN_F2R1_FB0_Msk                     (0x1UL << CAN_F2R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F2R1_FB0                         CAN_F2R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F2R1_FB1_Pos                     (1U)                              \n#define CAN_F2R1_FB1_Msk                     (0x1UL << CAN_F2R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F2R1_FB1                         CAN_F2R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F2R1_FB2_Pos                     (2U)                              \n#define CAN_F2R1_FB2_Msk                     (0x1UL << CAN_F2R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F2R1_FB2                         CAN_F2R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F2R1_FB3_Pos                     (3U)                              \n#define CAN_F2R1_FB3_Msk                     (0x1UL << CAN_F2R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F2R1_FB3                         CAN_F2R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F2R1_FB4_Pos                     (4U)                              \n#define CAN_F2R1_FB4_Msk                     (0x1UL << CAN_F2R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F2R1_FB4                         CAN_F2R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F2R1_FB5_Pos                     (5U)                              \n#define CAN_F2R1_FB5_Msk                     (0x1UL << CAN_F2R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F2R1_FB5                         CAN_F2R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F2R1_FB6_Pos                     (6U)                              \n#define CAN_F2R1_FB6_Msk                     (0x1UL << CAN_F2R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F2R1_FB6                         CAN_F2R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F2R1_FB7_Pos                     (7U)                              \n#define CAN_F2R1_FB7_Msk                     (0x1UL << CAN_F2R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F2R1_FB7                         CAN_F2R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F2R1_FB8_Pos                     (8U)                              \n#define CAN_F2R1_FB8_Msk                     (0x1UL << CAN_F2R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F2R1_FB8                         CAN_F2R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F2R1_FB9_Pos                     (9U)                              \n#define CAN_F2R1_FB9_Msk                     (0x1UL << CAN_F2R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F2R1_FB9                         CAN_F2R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F2R1_FB10_Pos                    (10U)                             \n#define CAN_F2R1_FB10_Msk                    (0x1UL << CAN_F2R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F2R1_FB10                        CAN_F2R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F2R1_FB11_Pos                    (11U)                             \n#define CAN_F2R1_FB11_Msk                    (0x1UL << CAN_F2R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F2R1_FB11                        CAN_F2R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F2R1_FB12_Pos                    (12U)                             \n#define CAN_F2R1_FB12_Msk                    (0x1UL << CAN_F2R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F2R1_FB12                        CAN_F2R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F2R1_FB13_Pos                    (13U)                             \n#define CAN_F2R1_FB13_Msk                    (0x1UL << CAN_F2R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F2R1_FB13                        CAN_F2R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F2R1_FB14_Pos                    (14U)                             \n#define CAN_F2R1_FB14_Msk                    (0x1UL << CAN_F2R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F2R1_FB14                        CAN_F2R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F2R1_FB15_Pos                    (15U)                             \n#define CAN_F2R1_FB15_Msk                    (0x1UL << CAN_F2R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F2R1_FB15                        CAN_F2R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F2R1_FB16_Pos                    (16U)                             \n#define CAN_F2R1_FB16_Msk                    (0x1UL << CAN_F2R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F2R1_FB16                        CAN_F2R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F2R1_FB17_Pos                    (17U)                             \n#define CAN_F2R1_FB17_Msk                    (0x1UL << CAN_F2R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F2R1_FB17                        CAN_F2R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F2R1_FB18_Pos                    (18U)                             \n#define CAN_F2R1_FB18_Msk                    (0x1UL << CAN_F2R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F2R1_FB18                        CAN_F2R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F2R1_FB19_Pos                    (19U)                             \n#define CAN_F2R1_FB19_Msk                    (0x1UL << CAN_F2R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F2R1_FB19                        CAN_F2R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F2R1_FB20_Pos                    (20U)                             \n#define CAN_F2R1_FB20_Msk                    (0x1UL << CAN_F2R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F2R1_FB20                        CAN_F2R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F2R1_FB21_Pos                    (21U)                             \n#define CAN_F2R1_FB21_Msk                    (0x1UL << CAN_F2R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F2R1_FB21                        CAN_F2R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F2R1_FB22_Pos                    (22U)                             \n#define CAN_F2R1_FB22_Msk                    (0x1UL << CAN_F2R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F2R1_FB22                        CAN_F2R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F2R1_FB23_Pos                    (23U)                             \n#define CAN_F2R1_FB23_Msk                    (0x1UL << CAN_F2R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F2R1_FB23                        CAN_F2R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F2R1_FB24_Pos                    (24U)                             \n#define CAN_F2R1_FB24_Msk                    (0x1UL << CAN_F2R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F2R1_FB24                        CAN_F2R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F2R1_FB25_Pos                    (25U)                             \n#define CAN_F2R1_FB25_Msk                    (0x1UL << CAN_F2R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F2R1_FB25                        CAN_F2R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F2R1_FB26_Pos                    (26U)                             \n#define CAN_F2R1_FB26_Msk                    (0x1UL << CAN_F2R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F2R1_FB26                        CAN_F2R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F2R1_FB27_Pos                    (27U)                             \n#define CAN_F2R1_FB27_Msk                    (0x1UL << CAN_F2R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F2R1_FB27                        CAN_F2R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F2R1_FB28_Pos                    (28U)                             \n#define CAN_F2R1_FB28_Msk                    (0x1UL << CAN_F2R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F2R1_FB28                        CAN_F2R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F2R1_FB29_Pos                    (29U)                             \n#define CAN_F2R1_FB29_Msk                    (0x1UL << CAN_F2R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F2R1_FB29                        CAN_F2R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F2R1_FB30_Pos                    (30U)                             \n#define CAN_F2R1_FB30_Msk                    (0x1UL << CAN_F2R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F2R1_FB30                        CAN_F2R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F2R1_FB31_Pos                    (31U)                             \n#define CAN_F2R1_FB31_Msk                    (0x1UL << CAN_F2R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F2R1_FB31                        CAN_F2R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F3R1 register  *******************/\n#define CAN_F3R1_FB0_Pos                     (0U)                              \n#define CAN_F3R1_FB0_Msk                     (0x1UL << CAN_F3R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F3R1_FB0                         CAN_F3R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F3R1_FB1_Pos                     (1U)                              \n#define CAN_F3R1_FB1_Msk                     (0x1UL << CAN_F3R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F3R1_FB1                         CAN_F3R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F3R1_FB2_Pos                     (2U)                              \n#define CAN_F3R1_FB2_Msk                     (0x1UL << CAN_F3R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F3R1_FB2                         CAN_F3R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F3R1_FB3_Pos                     (3U)                              \n#define CAN_F3R1_FB3_Msk                     (0x1UL << CAN_F3R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F3R1_FB3                         CAN_F3R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F3R1_FB4_Pos                     (4U)                              \n#define CAN_F3R1_FB4_Msk                     (0x1UL << CAN_F3R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F3R1_FB4                         CAN_F3R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F3R1_FB5_Pos                     (5U)                              \n#define CAN_F3R1_FB5_Msk                     (0x1UL << CAN_F3R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F3R1_FB5                         CAN_F3R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F3R1_FB6_Pos                     (6U)                              \n#define CAN_F3R1_FB6_Msk                     (0x1UL << CAN_F3R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F3R1_FB6                         CAN_F3R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F3R1_FB7_Pos                     (7U)                              \n#define CAN_F3R1_FB7_Msk                     (0x1UL << CAN_F3R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F3R1_FB7                         CAN_F3R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F3R1_FB8_Pos                     (8U)                              \n#define CAN_F3R1_FB8_Msk                     (0x1UL << CAN_F3R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F3R1_FB8                         CAN_F3R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F3R1_FB9_Pos                     (9U)                              \n#define CAN_F3R1_FB9_Msk                     (0x1UL << CAN_F3R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F3R1_FB9                         CAN_F3R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F3R1_FB10_Pos                    (10U)                             \n#define CAN_F3R1_FB10_Msk                    (0x1UL << CAN_F3R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F3R1_FB10                        CAN_F3R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F3R1_FB11_Pos                    (11U)                             \n#define CAN_F3R1_FB11_Msk                    (0x1UL << CAN_F3R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F3R1_FB11                        CAN_F3R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F3R1_FB12_Pos                    (12U)                             \n#define CAN_F3R1_FB12_Msk                    (0x1UL << CAN_F3R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F3R1_FB12                        CAN_F3R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F3R1_FB13_Pos                    (13U)                             \n#define CAN_F3R1_FB13_Msk                    (0x1UL << CAN_F3R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F3R1_FB13                        CAN_F3R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F3R1_FB14_Pos                    (14U)                             \n#define CAN_F3R1_FB14_Msk                    (0x1UL << CAN_F3R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F3R1_FB14                        CAN_F3R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F3R1_FB15_Pos                    (15U)                             \n#define CAN_F3R1_FB15_Msk                    (0x1UL << CAN_F3R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F3R1_FB15                        CAN_F3R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F3R1_FB16_Pos                    (16U)                             \n#define CAN_F3R1_FB16_Msk                    (0x1UL << CAN_F3R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F3R1_FB16                        CAN_F3R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F3R1_FB17_Pos                    (17U)                             \n#define CAN_F3R1_FB17_Msk                    (0x1UL << CAN_F3R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F3R1_FB17                        CAN_F3R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F3R1_FB18_Pos                    (18U)                             \n#define CAN_F3R1_FB18_Msk                    (0x1UL << CAN_F3R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F3R1_FB18                        CAN_F3R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F3R1_FB19_Pos                    (19U)                             \n#define CAN_F3R1_FB19_Msk                    (0x1UL << CAN_F3R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F3R1_FB19                        CAN_F3R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F3R1_FB20_Pos                    (20U)                             \n#define CAN_F3R1_FB20_Msk                    (0x1UL << CAN_F3R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F3R1_FB20                        CAN_F3R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F3R1_FB21_Pos                    (21U)                             \n#define CAN_F3R1_FB21_Msk                    (0x1UL << CAN_F3R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F3R1_FB21                        CAN_F3R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F3R1_FB22_Pos                    (22U)                             \n#define CAN_F3R1_FB22_Msk                    (0x1UL << CAN_F3R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F3R1_FB22                        CAN_F3R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F3R1_FB23_Pos                    (23U)                             \n#define CAN_F3R1_FB23_Msk                    (0x1UL << CAN_F3R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F3R1_FB23                        CAN_F3R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F3R1_FB24_Pos                    (24U)                             \n#define CAN_F3R1_FB24_Msk                    (0x1UL << CAN_F3R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F3R1_FB24                        CAN_F3R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F3R1_FB25_Pos                    (25U)                             \n#define CAN_F3R1_FB25_Msk                    (0x1UL << CAN_F3R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F3R1_FB25                        CAN_F3R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F3R1_FB26_Pos                    (26U)                             \n#define CAN_F3R1_FB26_Msk                    (0x1UL << CAN_F3R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F3R1_FB26                        CAN_F3R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F3R1_FB27_Pos                    (27U)                             \n#define CAN_F3R1_FB27_Msk                    (0x1UL << CAN_F3R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F3R1_FB27                        CAN_F3R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F3R1_FB28_Pos                    (28U)                             \n#define CAN_F3R1_FB28_Msk                    (0x1UL << CAN_F3R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F3R1_FB28                        CAN_F3R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F3R1_FB29_Pos                    (29U)                             \n#define CAN_F3R1_FB29_Msk                    (0x1UL << CAN_F3R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F3R1_FB29                        CAN_F3R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F3R1_FB30_Pos                    (30U)                             \n#define CAN_F3R1_FB30_Msk                    (0x1UL << CAN_F3R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F3R1_FB30                        CAN_F3R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F3R1_FB31_Pos                    (31U)                             \n#define CAN_F3R1_FB31_Msk                    (0x1UL << CAN_F3R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F3R1_FB31                        CAN_F3R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F4R1 register  *******************/\n#define CAN_F4R1_FB0_Pos                     (0U)                              \n#define CAN_F4R1_FB0_Msk                     (0x1UL << CAN_F4R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F4R1_FB0                         CAN_F4R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F4R1_FB1_Pos                     (1U)                              \n#define CAN_F4R1_FB1_Msk                     (0x1UL << CAN_F4R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F4R1_FB1                         CAN_F4R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F4R1_FB2_Pos                     (2U)                              \n#define CAN_F4R1_FB2_Msk                     (0x1UL << CAN_F4R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F4R1_FB2                         CAN_F4R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F4R1_FB3_Pos                     (3U)                              \n#define CAN_F4R1_FB3_Msk                     (0x1UL << CAN_F4R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F4R1_FB3                         CAN_F4R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F4R1_FB4_Pos                     (4U)                              \n#define CAN_F4R1_FB4_Msk                     (0x1UL << CAN_F4R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F4R1_FB4                         CAN_F4R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F4R1_FB5_Pos                     (5U)                              \n#define CAN_F4R1_FB5_Msk                     (0x1UL << CAN_F4R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F4R1_FB5                         CAN_F4R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F4R1_FB6_Pos                     (6U)                              \n#define CAN_F4R1_FB6_Msk                     (0x1UL << CAN_F4R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F4R1_FB6                         CAN_F4R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F4R1_FB7_Pos                     (7U)                              \n#define CAN_F4R1_FB7_Msk                     (0x1UL << CAN_F4R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F4R1_FB7                         CAN_F4R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F4R1_FB8_Pos                     (8U)                              \n#define CAN_F4R1_FB8_Msk                     (0x1UL << CAN_F4R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F4R1_FB8                         CAN_F4R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F4R1_FB9_Pos                     (9U)                              \n#define CAN_F4R1_FB9_Msk                     (0x1UL << CAN_F4R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F4R1_FB9                         CAN_F4R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F4R1_FB10_Pos                    (10U)                             \n#define CAN_F4R1_FB10_Msk                    (0x1UL << CAN_F4R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F4R1_FB10                        CAN_F4R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F4R1_FB11_Pos                    (11U)                             \n#define CAN_F4R1_FB11_Msk                    (0x1UL << CAN_F4R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F4R1_FB11                        CAN_F4R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F4R1_FB12_Pos                    (12U)                             \n#define CAN_F4R1_FB12_Msk                    (0x1UL << CAN_F4R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F4R1_FB12                        CAN_F4R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F4R1_FB13_Pos                    (13U)                             \n#define CAN_F4R1_FB13_Msk                    (0x1UL << CAN_F4R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F4R1_FB13                        CAN_F4R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F4R1_FB14_Pos                    (14U)                             \n#define CAN_F4R1_FB14_Msk                    (0x1UL << CAN_F4R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F4R1_FB14                        CAN_F4R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F4R1_FB15_Pos                    (15U)                             \n#define CAN_F4R1_FB15_Msk                    (0x1UL << CAN_F4R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F4R1_FB15                        CAN_F4R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F4R1_FB16_Pos                    (16U)                             \n#define CAN_F4R1_FB16_Msk                    (0x1UL << CAN_F4R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F4R1_FB16                        CAN_F4R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F4R1_FB17_Pos                    (17U)                             \n#define CAN_F4R1_FB17_Msk                    (0x1UL << CAN_F4R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F4R1_FB17                        CAN_F4R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F4R1_FB18_Pos                    (18U)                             \n#define CAN_F4R1_FB18_Msk                    (0x1UL << CAN_F4R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F4R1_FB18                        CAN_F4R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F4R1_FB19_Pos                    (19U)                             \n#define CAN_F4R1_FB19_Msk                    (0x1UL << CAN_F4R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F4R1_FB19                        CAN_F4R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F4R1_FB20_Pos                    (20U)                             \n#define CAN_F4R1_FB20_Msk                    (0x1UL << CAN_F4R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F4R1_FB20                        CAN_F4R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F4R1_FB21_Pos                    (21U)                             \n#define CAN_F4R1_FB21_Msk                    (0x1UL << CAN_F4R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F4R1_FB21                        CAN_F4R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F4R1_FB22_Pos                    (22U)                             \n#define CAN_F4R1_FB22_Msk                    (0x1UL << CAN_F4R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F4R1_FB22                        CAN_F4R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F4R1_FB23_Pos                    (23U)                             \n#define CAN_F4R1_FB23_Msk                    (0x1UL << CAN_F4R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F4R1_FB23                        CAN_F4R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F4R1_FB24_Pos                    (24U)                             \n#define CAN_F4R1_FB24_Msk                    (0x1UL << CAN_F4R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F4R1_FB24                        CAN_F4R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F4R1_FB25_Pos                    (25U)                             \n#define CAN_F4R1_FB25_Msk                    (0x1UL << CAN_F4R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F4R1_FB25                        CAN_F4R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F4R1_FB26_Pos                    (26U)                             \n#define CAN_F4R1_FB26_Msk                    (0x1UL << CAN_F4R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F4R1_FB26                        CAN_F4R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F4R1_FB27_Pos                    (27U)                             \n#define CAN_F4R1_FB27_Msk                    (0x1UL << CAN_F4R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F4R1_FB27                        CAN_F4R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F4R1_FB28_Pos                    (28U)                             \n#define CAN_F4R1_FB28_Msk                    (0x1UL << CAN_F4R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F4R1_FB28                        CAN_F4R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F4R1_FB29_Pos                    (29U)                             \n#define CAN_F4R1_FB29_Msk                    (0x1UL << CAN_F4R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F4R1_FB29                        CAN_F4R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F4R1_FB30_Pos                    (30U)                             \n#define CAN_F4R1_FB30_Msk                    (0x1UL << CAN_F4R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F4R1_FB30                        CAN_F4R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F4R1_FB31_Pos                    (31U)                             \n#define CAN_F4R1_FB31_Msk                    (0x1UL << CAN_F4R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F4R1_FB31                        CAN_F4R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F5R1 register  *******************/\n#define CAN_F5R1_FB0_Pos                     (0U)                              \n#define CAN_F5R1_FB0_Msk                     (0x1UL << CAN_F5R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F5R1_FB0                         CAN_F5R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F5R1_FB1_Pos                     (1U)                              \n#define CAN_F5R1_FB1_Msk                     (0x1UL << CAN_F5R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F5R1_FB1                         CAN_F5R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F5R1_FB2_Pos                     (2U)                              \n#define CAN_F5R1_FB2_Msk                     (0x1UL << CAN_F5R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F5R1_FB2                         CAN_F5R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F5R1_FB3_Pos                     (3U)                              \n#define CAN_F5R1_FB3_Msk                     (0x1UL << CAN_F5R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F5R1_FB3                         CAN_F5R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F5R1_FB4_Pos                     (4U)                              \n#define CAN_F5R1_FB4_Msk                     (0x1UL << CAN_F5R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F5R1_FB4                         CAN_F5R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F5R1_FB5_Pos                     (5U)                              \n#define CAN_F5R1_FB5_Msk                     (0x1UL << CAN_F5R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F5R1_FB5                         CAN_F5R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F5R1_FB6_Pos                     (6U)                              \n#define CAN_F5R1_FB6_Msk                     (0x1UL << CAN_F5R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F5R1_FB6                         CAN_F5R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F5R1_FB7_Pos                     (7U)                              \n#define CAN_F5R1_FB7_Msk                     (0x1UL << CAN_F5R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F5R1_FB7                         CAN_F5R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F5R1_FB8_Pos                     (8U)                              \n#define CAN_F5R1_FB8_Msk                     (0x1UL << CAN_F5R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F5R1_FB8                         CAN_F5R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F5R1_FB9_Pos                     (9U)                              \n#define CAN_F5R1_FB9_Msk                     (0x1UL << CAN_F5R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F5R1_FB9                         CAN_F5R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F5R1_FB10_Pos                    (10U)                             \n#define CAN_F5R1_FB10_Msk                    (0x1UL << CAN_F5R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F5R1_FB10                        CAN_F5R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F5R1_FB11_Pos                    (11U)                             \n#define CAN_F5R1_FB11_Msk                    (0x1UL << CAN_F5R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F5R1_FB11                        CAN_F5R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F5R1_FB12_Pos                    (12U)                             \n#define CAN_F5R1_FB12_Msk                    (0x1UL << CAN_F5R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F5R1_FB12                        CAN_F5R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F5R1_FB13_Pos                    (13U)                             \n#define CAN_F5R1_FB13_Msk                    (0x1UL << CAN_F5R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F5R1_FB13                        CAN_F5R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F5R1_FB14_Pos                    (14U)                             \n#define CAN_F5R1_FB14_Msk                    (0x1UL << CAN_F5R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F5R1_FB14                        CAN_F5R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F5R1_FB15_Pos                    (15U)                             \n#define CAN_F5R1_FB15_Msk                    (0x1UL << CAN_F5R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F5R1_FB15                        CAN_F5R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F5R1_FB16_Pos                    (16U)                             \n#define CAN_F5R1_FB16_Msk                    (0x1UL << CAN_F5R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F5R1_FB16                        CAN_F5R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F5R1_FB17_Pos                    (17U)                             \n#define CAN_F5R1_FB17_Msk                    (0x1UL << CAN_F5R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F5R1_FB17                        CAN_F5R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F5R1_FB18_Pos                    (18U)                             \n#define CAN_F5R1_FB18_Msk                    (0x1UL << CAN_F5R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F5R1_FB18                        CAN_F5R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F5R1_FB19_Pos                    (19U)                             \n#define CAN_F5R1_FB19_Msk                    (0x1UL << CAN_F5R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F5R1_FB19                        CAN_F5R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F5R1_FB20_Pos                    (20U)                             \n#define CAN_F5R1_FB20_Msk                    (0x1UL << CAN_F5R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F5R1_FB20                        CAN_F5R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F5R1_FB21_Pos                    (21U)                             \n#define CAN_F5R1_FB21_Msk                    (0x1UL << CAN_F5R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F5R1_FB21                        CAN_F5R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F5R1_FB22_Pos                    (22U)                             \n#define CAN_F5R1_FB22_Msk                    (0x1UL << CAN_F5R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F5R1_FB22                        CAN_F5R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F5R1_FB23_Pos                    (23U)                             \n#define CAN_F5R1_FB23_Msk                    (0x1UL << CAN_F5R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F5R1_FB23                        CAN_F5R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F5R1_FB24_Pos                    (24U)                             \n#define CAN_F5R1_FB24_Msk                    (0x1UL << CAN_F5R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F5R1_FB24                        CAN_F5R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F5R1_FB25_Pos                    (25U)                             \n#define CAN_F5R1_FB25_Msk                    (0x1UL << CAN_F5R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F5R1_FB25                        CAN_F5R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F5R1_FB26_Pos                    (26U)                             \n#define CAN_F5R1_FB26_Msk                    (0x1UL << CAN_F5R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F5R1_FB26                        CAN_F5R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F5R1_FB27_Pos                    (27U)                             \n#define CAN_F5R1_FB27_Msk                    (0x1UL << CAN_F5R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F5R1_FB27                        CAN_F5R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F5R1_FB28_Pos                    (28U)                             \n#define CAN_F5R1_FB28_Msk                    (0x1UL << CAN_F5R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F5R1_FB28                        CAN_F5R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F5R1_FB29_Pos                    (29U)                             \n#define CAN_F5R1_FB29_Msk                    (0x1UL << CAN_F5R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F5R1_FB29                        CAN_F5R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F5R1_FB30_Pos                    (30U)                             \n#define CAN_F5R1_FB30_Msk                    (0x1UL << CAN_F5R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F5R1_FB30                        CAN_F5R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F5R1_FB31_Pos                    (31U)                             \n#define CAN_F5R1_FB31_Msk                    (0x1UL << CAN_F5R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F5R1_FB31                        CAN_F5R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F6R1 register  *******************/\n#define CAN_F6R1_FB0_Pos                     (0U)                              \n#define CAN_F6R1_FB0_Msk                     (0x1UL << CAN_F6R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F6R1_FB0                         CAN_F6R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F6R1_FB1_Pos                     (1U)                              \n#define CAN_F6R1_FB1_Msk                     (0x1UL << CAN_F6R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F6R1_FB1                         CAN_F6R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F6R1_FB2_Pos                     (2U)                              \n#define CAN_F6R1_FB2_Msk                     (0x1UL << CAN_F6R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F6R1_FB2                         CAN_F6R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F6R1_FB3_Pos                     (3U)                              \n#define CAN_F6R1_FB3_Msk                     (0x1UL << CAN_F6R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F6R1_FB3                         CAN_F6R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F6R1_FB4_Pos                     (4U)                              \n#define CAN_F6R1_FB4_Msk                     (0x1UL << CAN_F6R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F6R1_FB4                         CAN_F6R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F6R1_FB5_Pos                     (5U)                              \n#define CAN_F6R1_FB5_Msk                     (0x1UL << CAN_F6R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F6R1_FB5                         CAN_F6R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F6R1_FB6_Pos                     (6U)                              \n#define CAN_F6R1_FB6_Msk                     (0x1UL << CAN_F6R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F6R1_FB6                         CAN_F6R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F6R1_FB7_Pos                     (7U)                              \n#define CAN_F6R1_FB7_Msk                     (0x1UL << CAN_F6R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F6R1_FB7                         CAN_F6R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F6R1_FB8_Pos                     (8U)                              \n#define CAN_F6R1_FB8_Msk                     (0x1UL << CAN_F6R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F6R1_FB8                         CAN_F6R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F6R1_FB9_Pos                     (9U)                              \n#define CAN_F6R1_FB9_Msk                     (0x1UL << CAN_F6R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F6R1_FB9                         CAN_F6R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F6R1_FB10_Pos                    (10U)                             \n#define CAN_F6R1_FB10_Msk                    (0x1UL << CAN_F6R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F6R1_FB10                        CAN_F6R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F6R1_FB11_Pos                    (11U)                             \n#define CAN_F6R1_FB11_Msk                    (0x1UL << CAN_F6R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F6R1_FB11                        CAN_F6R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F6R1_FB12_Pos                    (12U)                             \n#define CAN_F6R1_FB12_Msk                    (0x1UL << CAN_F6R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F6R1_FB12                        CAN_F6R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F6R1_FB13_Pos                    (13U)                             \n#define CAN_F6R1_FB13_Msk                    (0x1UL << CAN_F6R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F6R1_FB13                        CAN_F6R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F6R1_FB14_Pos                    (14U)                             \n#define CAN_F6R1_FB14_Msk                    (0x1UL << CAN_F6R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F6R1_FB14                        CAN_F6R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F6R1_FB15_Pos                    (15U)                             \n#define CAN_F6R1_FB15_Msk                    (0x1UL << CAN_F6R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F6R1_FB15                        CAN_F6R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F6R1_FB16_Pos                    (16U)                             \n#define CAN_F6R1_FB16_Msk                    (0x1UL << CAN_F6R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F6R1_FB16                        CAN_F6R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F6R1_FB17_Pos                    (17U)                             \n#define CAN_F6R1_FB17_Msk                    (0x1UL << CAN_F6R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F6R1_FB17                        CAN_F6R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F6R1_FB18_Pos                    (18U)                             \n#define CAN_F6R1_FB18_Msk                    (0x1UL << CAN_F6R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F6R1_FB18                        CAN_F6R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F6R1_FB19_Pos                    (19U)                             \n#define CAN_F6R1_FB19_Msk                    (0x1UL << CAN_F6R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F6R1_FB19                        CAN_F6R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F6R1_FB20_Pos                    (20U)                             \n#define CAN_F6R1_FB20_Msk                    (0x1UL << CAN_F6R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F6R1_FB20                        CAN_F6R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F6R1_FB21_Pos                    (21U)                             \n#define CAN_F6R1_FB21_Msk                    (0x1UL << CAN_F6R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F6R1_FB21                        CAN_F6R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F6R1_FB22_Pos                    (22U)                             \n#define CAN_F6R1_FB22_Msk                    (0x1UL << CAN_F6R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F6R1_FB22                        CAN_F6R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F6R1_FB23_Pos                    (23U)                             \n#define CAN_F6R1_FB23_Msk                    (0x1UL << CAN_F6R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F6R1_FB23                        CAN_F6R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F6R1_FB24_Pos                    (24U)                             \n#define CAN_F6R1_FB24_Msk                    (0x1UL << CAN_F6R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F6R1_FB24                        CAN_F6R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F6R1_FB25_Pos                    (25U)                             \n#define CAN_F6R1_FB25_Msk                    (0x1UL << CAN_F6R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F6R1_FB25                        CAN_F6R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F6R1_FB26_Pos                    (26U)                             \n#define CAN_F6R1_FB26_Msk                    (0x1UL << CAN_F6R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F6R1_FB26                        CAN_F6R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F6R1_FB27_Pos                    (27U)                             \n#define CAN_F6R1_FB27_Msk                    (0x1UL << CAN_F6R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F6R1_FB27                        CAN_F6R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F6R1_FB28_Pos                    (28U)                             \n#define CAN_F6R1_FB28_Msk                    (0x1UL << CAN_F6R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F6R1_FB28                        CAN_F6R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F6R1_FB29_Pos                    (29U)                             \n#define CAN_F6R1_FB29_Msk                    (0x1UL << CAN_F6R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F6R1_FB29                        CAN_F6R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F6R1_FB30_Pos                    (30U)                             \n#define CAN_F6R1_FB30_Msk                    (0x1UL << CAN_F6R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F6R1_FB30                        CAN_F6R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F6R1_FB31_Pos                    (31U)                             \n#define CAN_F6R1_FB31_Msk                    (0x1UL << CAN_F6R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F6R1_FB31                        CAN_F6R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F7R1 register  *******************/\n#define CAN_F7R1_FB0_Pos                     (0U)                              \n#define CAN_F7R1_FB0_Msk                     (0x1UL << CAN_F7R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F7R1_FB0                         CAN_F7R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F7R1_FB1_Pos                     (1U)                              \n#define CAN_F7R1_FB1_Msk                     (0x1UL << CAN_F7R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F7R1_FB1                         CAN_F7R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F7R1_FB2_Pos                     (2U)                              \n#define CAN_F7R1_FB2_Msk                     (0x1UL << CAN_F7R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F7R1_FB2                         CAN_F7R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F7R1_FB3_Pos                     (3U)                              \n#define CAN_F7R1_FB3_Msk                     (0x1UL << CAN_F7R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F7R1_FB3                         CAN_F7R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F7R1_FB4_Pos                     (4U)                              \n#define CAN_F7R1_FB4_Msk                     (0x1UL << CAN_F7R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F7R1_FB4                         CAN_F7R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F7R1_FB5_Pos                     (5U)                              \n#define CAN_F7R1_FB5_Msk                     (0x1UL << CAN_F7R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F7R1_FB5                         CAN_F7R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F7R1_FB6_Pos                     (6U)                              \n#define CAN_F7R1_FB6_Msk                     (0x1UL << CAN_F7R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F7R1_FB6                         CAN_F7R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F7R1_FB7_Pos                     (7U)                              \n#define CAN_F7R1_FB7_Msk                     (0x1UL << CAN_F7R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F7R1_FB7                         CAN_F7R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F7R1_FB8_Pos                     (8U)                              \n#define CAN_F7R1_FB8_Msk                     (0x1UL << CAN_F7R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F7R1_FB8                         CAN_F7R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F7R1_FB9_Pos                     (9U)                              \n#define CAN_F7R1_FB9_Msk                     (0x1UL << CAN_F7R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F7R1_FB9                         CAN_F7R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F7R1_FB10_Pos                    (10U)                             \n#define CAN_F7R1_FB10_Msk                    (0x1UL << CAN_F7R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F7R1_FB10                        CAN_F7R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F7R1_FB11_Pos                    (11U)                             \n#define CAN_F7R1_FB11_Msk                    (0x1UL << CAN_F7R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F7R1_FB11                        CAN_F7R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F7R1_FB12_Pos                    (12U)                             \n#define CAN_F7R1_FB12_Msk                    (0x1UL << CAN_F7R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F7R1_FB12                        CAN_F7R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F7R1_FB13_Pos                    (13U)                             \n#define CAN_F7R1_FB13_Msk                    (0x1UL << CAN_F7R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F7R1_FB13                        CAN_F7R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F7R1_FB14_Pos                    (14U)                             \n#define CAN_F7R1_FB14_Msk                    (0x1UL << CAN_F7R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F7R1_FB14                        CAN_F7R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F7R1_FB15_Pos                    (15U)                             \n#define CAN_F7R1_FB15_Msk                    (0x1UL << CAN_F7R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F7R1_FB15                        CAN_F7R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F7R1_FB16_Pos                    (16U)                             \n#define CAN_F7R1_FB16_Msk                    (0x1UL << CAN_F7R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F7R1_FB16                        CAN_F7R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F7R1_FB17_Pos                    (17U)                             \n#define CAN_F7R1_FB17_Msk                    (0x1UL << CAN_F7R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F7R1_FB17                        CAN_F7R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F7R1_FB18_Pos                    (18U)                             \n#define CAN_F7R1_FB18_Msk                    (0x1UL << CAN_F7R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F7R1_FB18                        CAN_F7R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F7R1_FB19_Pos                    (19U)                             \n#define CAN_F7R1_FB19_Msk                    (0x1UL << CAN_F7R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F7R1_FB19                        CAN_F7R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F7R1_FB20_Pos                    (20U)                             \n#define CAN_F7R1_FB20_Msk                    (0x1UL << CAN_F7R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F7R1_FB20                        CAN_F7R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F7R1_FB21_Pos                    (21U)                             \n#define CAN_F7R1_FB21_Msk                    (0x1UL << CAN_F7R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F7R1_FB21                        CAN_F7R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F7R1_FB22_Pos                    (22U)                             \n#define CAN_F7R1_FB22_Msk                    (0x1UL << CAN_F7R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F7R1_FB22                        CAN_F7R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F7R1_FB23_Pos                    (23U)                             \n#define CAN_F7R1_FB23_Msk                    (0x1UL << CAN_F7R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F7R1_FB23                        CAN_F7R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F7R1_FB24_Pos                    (24U)                             \n#define CAN_F7R1_FB24_Msk                    (0x1UL << CAN_F7R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F7R1_FB24                        CAN_F7R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F7R1_FB25_Pos                    (25U)                             \n#define CAN_F7R1_FB25_Msk                    (0x1UL << CAN_F7R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F7R1_FB25                        CAN_F7R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F7R1_FB26_Pos                    (26U)                             \n#define CAN_F7R1_FB26_Msk                    (0x1UL << CAN_F7R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F7R1_FB26                        CAN_F7R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F7R1_FB27_Pos                    (27U)                             \n#define CAN_F7R1_FB27_Msk                    (0x1UL << CAN_F7R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F7R1_FB27                        CAN_F7R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F7R1_FB28_Pos                    (28U)                             \n#define CAN_F7R1_FB28_Msk                    (0x1UL << CAN_F7R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F7R1_FB28                        CAN_F7R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F7R1_FB29_Pos                    (29U)                             \n#define CAN_F7R1_FB29_Msk                    (0x1UL << CAN_F7R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F7R1_FB29                        CAN_F7R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F7R1_FB30_Pos                    (30U)                             \n#define CAN_F7R1_FB30_Msk                    (0x1UL << CAN_F7R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F7R1_FB30                        CAN_F7R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F7R1_FB31_Pos                    (31U)                             \n#define CAN_F7R1_FB31_Msk                    (0x1UL << CAN_F7R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F7R1_FB31                        CAN_F7R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F8R1 register  *******************/\n#define CAN_F8R1_FB0_Pos                     (0U)                              \n#define CAN_F8R1_FB0_Msk                     (0x1UL << CAN_F8R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F8R1_FB0                         CAN_F8R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F8R1_FB1_Pos                     (1U)                              \n#define CAN_F8R1_FB1_Msk                     (0x1UL << CAN_F8R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F8R1_FB1                         CAN_F8R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F8R1_FB2_Pos                     (2U)                              \n#define CAN_F8R1_FB2_Msk                     (0x1UL << CAN_F8R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F8R1_FB2                         CAN_F8R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F8R1_FB3_Pos                     (3U)                              \n#define CAN_F8R1_FB3_Msk                     (0x1UL << CAN_F8R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F8R1_FB3                         CAN_F8R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F8R1_FB4_Pos                     (4U)                              \n#define CAN_F8R1_FB4_Msk                     (0x1UL << CAN_F8R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F8R1_FB4                         CAN_F8R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F8R1_FB5_Pos                     (5U)                              \n#define CAN_F8R1_FB5_Msk                     (0x1UL << CAN_F8R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F8R1_FB5                         CAN_F8R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F8R1_FB6_Pos                     (6U)                              \n#define CAN_F8R1_FB6_Msk                     (0x1UL << CAN_F8R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F8R1_FB6                         CAN_F8R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F8R1_FB7_Pos                     (7U)                              \n#define CAN_F8R1_FB7_Msk                     (0x1UL << CAN_F8R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F8R1_FB7                         CAN_F8R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F8R1_FB8_Pos                     (8U)                              \n#define CAN_F8R1_FB8_Msk                     (0x1UL << CAN_F8R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F8R1_FB8                         CAN_F8R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F8R1_FB9_Pos                     (9U)                              \n#define CAN_F8R1_FB9_Msk                     (0x1UL << CAN_F8R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F8R1_FB9                         CAN_F8R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F8R1_FB10_Pos                    (10U)                             \n#define CAN_F8R1_FB10_Msk                    (0x1UL << CAN_F8R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F8R1_FB10                        CAN_F8R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F8R1_FB11_Pos                    (11U)                             \n#define CAN_F8R1_FB11_Msk                    (0x1UL << CAN_F8R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F8R1_FB11                        CAN_F8R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F8R1_FB12_Pos                    (12U)                             \n#define CAN_F8R1_FB12_Msk                    (0x1UL << CAN_F8R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F8R1_FB12                        CAN_F8R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F8R1_FB13_Pos                    (13U)                             \n#define CAN_F8R1_FB13_Msk                    (0x1UL << CAN_F8R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F8R1_FB13                        CAN_F8R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F8R1_FB14_Pos                    (14U)                             \n#define CAN_F8R1_FB14_Msk                    (0x1UL << CAN_F8R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F8R1_FB14                        CAN_F8R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F8R1_FB15_Pos                    (15U)                             \n#define CAN_F8R1_FB15_Msk                    (0x1UL << CAN_F8R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F8R1_FB15                        CAN_F8R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F8R1_FB16_Pos                    (16U)                             \n#define CAN_F8R1_FB16_Msk                    (0x1UL << CAN_F8R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F8R1_FB16                        CAN_F8R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F8R1_FB17_Pos                    (17U)                             \n#define CAN_F8R1_FB17_Msk                    (0x1UL << CAN_F8R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F8R1_FB17                        CAN_F8R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F8R1_FB18_Pos                    (18U)                             \n#define CAN_F8R1_FB18_Msk                    (0x1UL << CAN_F8R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F8R1_FB18                        CAN_F8R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F8R1_FB19_Pos                    (19U)                             \n#define CAN_F8R1_FB19_Msk                    (0x1UL << CAN_F8R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F8R1_FB19                        CAN_F8R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F8R1_FB20_Pos                    (20U)                             \n#define CAN_F8R1_FB20_Msk                    (0x1UL << CAN_F8R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F8R1_FB20                        CAN_F8R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F8R1_FB21_Pos                    (21U)                             \n#define CAN_F8R1_FB21_Msk                    (0x1UL << CAN_F8R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F8R1_FB21                        CAN_F8R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F8R1_FB22_Pos                    (22U)                             \n#define CAN_F8R1_FB22_Msk                    (0x1UL << CAN_F8R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F8R1_FB22                        CAN_F8R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F8R1_FB23_Pos                    (23U)                             \n#define CAN_F8R1_FB23_Msk                    (0x1UL << CAN_F8R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F8R1_FB23                        CAN_F8R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F8R1_FB24_Pos                    (24U)                             \n#define CAN_F8R1_FB24_Msk                    (0x1UL << CAN_F8R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F8R1_FB24                        CAN_F8R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F8R1_FB25_Pos                    (25U)                             \n#define CAN_F8R1_FB25_Msk                    (0x1UL << CAN_F8R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F8R1_FB25                        CAN_F8R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F8R1_FB26_Pos                    (26U)                             \n#define CAN_F8R1_FB26_Msk                    (0x1UL << CAN_F8R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F8R1_FB26                        CAN_F8R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F8R1_FB27_Pos                    (27U)                             \n#define CAN_F8R1_FB27_Msk                    (0x1UL << CAN_F8R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F8R1_FB27                        CAN_F8R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F8R1_FB28_Pos                    (28U)                             \n#define CAN_F8R1_FB28_Msk                    (0x1UL << CAN_F8R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F8R1_FB28                        CAN_F8R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F8R1_FB29_Pos                    (29U)                             \n#define CAN_F8R1_FB29_Msk                    (0x1UL << CAN_F8R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F8R1_FB29                        CAN_F8R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F8R1_FB30_Pos                    (30U)                             \n#define CAN_F8R1_FB30_Msk                    (0x1UL << CAN_F8R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F8R1_FB30                        CAN_F8R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F8R1_FB31_Pos                    (31U)                             \n#define CAN_F8R1_FB31_Msk                    (0x1UL << CAN_F8R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F8R1_FB31                        CAN_F8R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F9R1 register  *******************/\n#define CAN_F9R1_FB0_Pos                     (0U)                              \n#define CAN_F9R1_FB0_Msk                     (0x1UL << CAN_F9R1_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F9R1_FB0                         CAN_F9R1_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F9R1_FB1_Pos                     (1U)                              \n#define CAN_F9R1_FB1_Msk                     (0x1UL << CAN_F9R1_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F9R1_FB1                         CAN_F9R1_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F9R1_FB2_Pos                     (2U)                              \n#define CAN_F9R1_FB2_Msk                     (0x1UL << CAN_F9R1_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F9R1_FB2                         CAN_F9R1_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F9R1_FB3_Pos                     (3U)                              \n#define CAN_F9R1_FB3_Msk                     (0x1UL << CAN_F9R1_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F9R1_FB3                         CAN_F9R1_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F9R1_FB4_Pos                     (4U)                              \n#define CAN_F9R1_FB4_Msk                     (0x1UL << CAN_F9R1_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F9R1_FB4                         CAN_F9R1_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F9R1_FB5_Pos                     (5U)                              \n#define CAN_F9R1_FB5_Msk                     (0x1UL << CAN_F9R1_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F9R1_FB5                         CAN_F9R1_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F9R1_FB6_Pos                     (6U)                              \n#define CAN_F9R1_FB6_Msk                     (0x1UL << CAN_F9R1_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F9R1_FB6                         CAN_F9R1_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F9R1_FB7_Pos                     (7U)                              \n#define CAN_F9R1_FB7_Msk                     (0x1UL << CAN_F9R1_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F9R1_FB7                         CAN_F9R1_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F9R1_FB8_Pos                     (8U)                              \n#define CAN_F9R1_FB8_Msk                     (0x1UL << CAN_F9R1_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F9R1_FB8                         CAN_F9R1_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F9R1_FB9_Pos                     (9U)                              \n#define CAN_F9R1_FB9_Msk                     (0x1UL << CAN_F9R1_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F9R1_FB9                         CAN_F9R1_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F9R1_FB10_Pos                    (10U)                             \n#define CAN_F9R1_FB10_Msk                    (0x1UL << CAN_F9R1_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F9R1_FB10                        CAN_F9R1_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F9R1_FB11_Pos                    (11U)                             \n#define CAN_F9R1_FB11_Msk                    (0x1UL << CAN_F9R1_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F9R1_FB11                        CAN_F9R1_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F9R1_FB12_Pos                    (12U)                             \n#define CAN_F9R1_FB12_Msk                    (0x1UL << CAN_F9R1_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F9R1_FB12                        CAN_F9R1_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F9R1_FB13_Pos                    (13U)                             \n#define CAN_F9R1_FB13_Msk                    (0x1UL << CAN_F9R1_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F9R1_FB13                        CAN_F9R1_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F9R1_FB14_Pos                    (14U)                             \n#define CAN_F9R1_FB14_Msk                    (0x1UL << CAN_F9R1_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F9R1_FB14                        CAN_F9R1_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F9R1_FB15_Pos                    (15U)                             \n#define CAN_F9R1_FB15_Msk                    (0x1UL << CAN_F9R1_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F9R1_FB15                        CAN_F9R1_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F9R1_FB16_Pos                    (16U)                             \n#define CAN_F9R1_FB16_Msk                    (0x1UL << CAN_F9R1_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F9R1_FB16                        CAN_F9R1_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F9R1_FB17_Pos                    (17U)                             \n#define CAN_F9R1_FB17_Msk                    (0x1UL << CAN_F9R1_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F9R1_FB17                        CAN_F9R1_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F9R1_FB18_Pos                    (18U)                             \n#define CAN_F9R1_FB18_Msk                    (0x1UL << CAN_F9R1_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F9R1_FB18                        CAN_F9R1_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F9R1_FB19_Pos                    (19U)                             \n#define CAN_F9R1_FB19_Msk                    (0x1UL << CAN_F9R1_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F9R1_FB19                        CAN_F9R1_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F9R1_FB20_Pos                    (20U)                             \n#define CAN_F9R1_FB20_Msk                    (0x1UL << CAN_F9R1_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F9R1_FB20                        CAN_F9R1_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F9R1_FB21_Pos                    (21U)                             \n#define CAN_F9R1_FB21_Msk                    (0x1UL << CAN_F9R1_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F9R1_FB21                        CAN_F9R1_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F9R1_FB22_Pos                    (22U)                             \n#define CAN_F9R1_FB22_Msk                    (0x1UL << CAN_F9R1_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F9R1_FB22                        CAN_F9R1_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F9R1_FB23_Pos                    (23U)                             \n#define CAN_F9R1_FB23_Msk                    (0x1UL << CAN_F9R1_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F9R1_FB23                        CAN_F9R1_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F9R1_FB24_Pos                    (24U)                             \n#define CAN_F9R1_FB24_Msk                    (0x1UL << CAN_F9R1_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F9R1_FB24                        CAN_F9R1_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F9R1_FB25_Pos                    (25U)                             \n#define CAN_F9R1_FB25_Msk                    (0x1UL << CAN_F9R1_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F9R1_FB25                        CAN_F9R1_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F9R1_FB26_Pos                    (26U)                             \n#define CAN_F9R1_FB26_Msk                    (0x1UL << CAN_F9R1_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F9R1_FB26                        CAN_F9R1_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F9R1_FB27_Pos                    (27U)                             \n#define CAN_F9R1_FB27_Msk                    (0x1UL << CAN_F9R1_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F9R1_FB27                        CAN_F9R1_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F9R1_FB28_Pos                    (28U)                             \n#define CAN_F9R1_FB28_Msk                    (0x1UL << CAN_F9R1_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F9R1_FB28                        CAN_F9R1_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F9R1_FB29_Pos                    (29U)                             \n#define CAN_F9R1_FB29_Msk                    (0x1UL << CAN_F9R1_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F9R1_FB29                        CAN_F9R1_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F9R1_FB30_Pos                    (30U)                             \n#define CAN_F9R1_FB30_Msk                    (0x1UL << CAN_F9R1_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F9R1_FB30                        CAN_F9R1_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F9R1_FB31_Pos                    (31U)                             \n#define CAN_F9R1_FB31_Msk                    (0x1UL << CAN_F9R1_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F9R1_FB31                        CAN_F9R1_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F10R1 register  ******************/\n#define CAN_F10R1_FB0_Pos                    (0U)                              \n#define CAN_F10R1_FB0_Msk                    (0x1UL << CAN_F10R1_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F10R1_FB0                        CAN_F10R1_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F10R1_FB1_Pos                    (1U)                              \n#define CAN_F10R1_FB1_Msk                    (0x1UL << CAN_F10R1_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F10R1_FB1                        CAN_F10R1_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F10R1_FB2_Pos                    (2U)                              \n#define CAN_F10R1_FB2_Msk                    (0x1UL << CAN_F10R1_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F10R1_FB2                        CAN_F10R1_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F10R1_FB3_Pos                    (3U)                              \n#define CAN_F10R1_FB3_Msk                    (0x1UL << CAN_F10R1_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F10R1_FB3                        CAN_F10R1_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F10R1_FB4_Pos                    (4U)                              \n#define CAN_F10R1_FB4_Msk                    (0x1UL << CAN_F10R1_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F10R1_FB4                        CAN_F10R1_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F10R1_FB5_Pos                    (5U)                              \n#define CAN_F10R1_FB5_Msk                    (0x1UL << CAN_F10R1_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F10R1_FB5                        CAN_F10R1_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F10R1_FB6_Pos                    (6U)                              \n#define CAN_F10R1_FB6_Msk                    (0x1UL << CAN_F10R1_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F10R1_FB6                        CAN_F10R1_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F10R1_FB7_Pos                    (7U)                              \n#define CAN_F10R1_FB7_Msk                    (0x1UL << CAN_F10R1_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F10R1_FB7                        CAN_F10R1_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F10R1_FB8_Pos                    (8U)                              \n#define CAN_F10R1_FB8_Msk                    (0x1UL << CAN_F10R1_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F10R1_FB8                        CAN_F10R1_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F10R1_FB9_Pos                    (9U)                              \n#define CAN_F10R1_FB9_Msk                    (0x1UL << CAN_F10R1_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F10R1_FB9                        CAN_F10R1_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F10R1_FB10_Pos                   (10U)                             \n#define CAN_F10R1_FB10_Msk                   (0x1UL << CAN_F10R1_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F10R1_FB10                       CAN_F10R1_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F10R1_FB11_Pos                   (11U)                             \n#define CAN_F10R1_FB11_Msk                   (0x1UL << CAN_F10R1_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F10R1_FB11                       CAN_F10R1_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F10R1_FB12_Pos                   (12U)                             \n#define CAN_F10R1_FB12_Msk                   (0x1UL << CAN_F10R1_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F10R1_FB12                       CAN_F10R1_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F10R1_FB13_Pos                   (13U)                             \n#define CAN_F10R1_FB13_Msk                   (0x1UL << CAN_F10R1_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F10R1_FB13                       CAN_F10R1_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F10R1_FB14_Pos                   (14U)                             \n#define CAN_F10R1_FB14_Msk                   (0x1UL << CAN_F10R1_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F10R1_FB14                       CAN_F10R1_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F10R1_FB15_Pos                   (15U)                             \n#define CAN_F10R1_FB15_Msk                   (0x1UL << CAN_F10R1_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F10R1_FB15                       CAN_F10R1_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F10R1_FB16_Pos                   (16U)                             \n#define CAN_F10R1_FB16_Msk                   (0x1UL << CAN_F10R1_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F10R1_FB16                       CAN_F10R1_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F10R1_FB17_Pos                   (17U)                             \n#define CAN_F10R1_FB17_Msk                   (0x1UL << CAN_F10R1_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F10R1_FB17                       CAN_F10R1_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F10R1_FB18_Pos                   (18U)                             \n#define CAN_F10R1_FB18_Msk                   (0x1UL << CAN_F10R1_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F10R1_FB18                       CAN_F10R1_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F10R1_FB19_Pos                   (19U)                             \n#define CAN_F10R1_FB19_Msk                   (0x1UL << CAN_F10R1_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F10R1_FB19                       CAN_F10R1_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F10R1_FB20_Pos                   (20U)                             \n#define CAN_F10R1_FB20_Msk                   (0x1UL << CAN_F10R1_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F10R1_FB20                       CAN_F10R1_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F10R1_FB21_Pos                   (21U)                             \n#define CAN_F10R1_FB21_Msk                   (0x1UL << CAN_F10R1_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F10R1_FB21                       CAN_F10R1_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F10R1_FB22_Pos                   (22U)                             \n#define CAN_F10R1_FB22_Msk                   (0x1UL << CAN_F10R1_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F10R1_FB22                       CAN_F10R1_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F10R1_FB23_Pos                   (23U)                             \n#define CAN_F10R1_FB23_Msk                   (0x1UL << CAN_F10R1_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F10R1_FB23                       CAN_F10R1_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F10R1_FB24_Pos                   (24U)                             \n#define CAN_F10R1_FB24_Msk                   (0x1UL << CAN_F10R1_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F10R1_FB24                       CAN_F10R1_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F10R1_FB25_Pos                   (25U)                             \n#define CAN_F10R1_FB25_Msk                   (0x1UL << CAN_F10R1_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F10R1_FB25                       CAN_F10R1_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F10R1_FB26_Pos                   (26U)                             \n#define CAN_F10R1_FB26_Msk                   (0x1UL << CAN_F10R1_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F10R1_FB26                       CAN_F10R1_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F10R1_FB27_Pos                   (27U)                             \n#define CAN_F10R1_FB27_Msk                   (0x1UL << CAN_F10R1_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F10R1_FB27                       CAN_F10R1_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F10R1_FB28_Pos                   (28U)                             \n#define CAN_F10R1_FB28_Msk                   (0x1UL << CAN_F10R1_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F10R1_FB28                       CAN_F10R1_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F10R1_FB29_Pos                   (29U)                             \n#define CAN_F10R1_FB29_Msk                   (0x1UL << CAN_F10R1_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F10R1_FB29                       CAN_F10R1_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F10R1_FB30_Pos                   (30U)                             \n#define CAN_F10R1_FB30_Msk                   (0x1UL << CAN_F10R1_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F10R1_FB30                       CAN_F10R1_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F10R1_FB31_Pos                   (31U)                             \n#define CAN_F10R1_FB31_Msk                   (0x1UL << CAN_F10R1_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F10R1_FB31                       CAN_F10R1_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F11R1 register  ******************/\n#define CAN_F11R1_FB0_Pos                    (0U)                              \n#define CAN_F11R1_FB0_Msk                    (0x1UL << CAN_F11R1_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F11R1_FB0                        CAN_F11R1_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F11R1_FB1_Pos                    (1U)                              \n#define CAN_F11R1_FB1_Msk                    (0x1UL << CAN_F11R1_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F11R1_FB1                        CAN_F11R1_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F11R1_FB2_Pos                    (2U)                              \n#define CAN_F11R1_FB2_Msk                    (0x1UL << CAN_F11R1_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F11R1_FB2                        CAN_F11R1_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F11R1_FB3_Pos                    (3U)                              \n#define CAN_F11R1_FB3_Msk                    (0x1UL << CAN_F11R1_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F11R1_FB3                        CAN_F11R1_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F11R1_FB4_Pos                    (4U)                              \n#define CAN_F11R1_FB4_Msk                    (0x1UL << CAN_F11R1_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F11R1_FB4                        CAN_F11R1_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F11R1_FB5_Pos                    (5U)                              \n#define CAN_F11R1_FB5_Msk                    (0x1UL << CAN_F11R1_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F11R1_FB5                        CAN_F11R1_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F11R1_FB6_Pos                    (6U)                              \n#define CAN_F11R1_FB6_Msk                    (0x1UL << CAN_F11R1_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F11R1_FB6                        CAN_F11R1_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F11R1_FB7_Pos                    (7U)                              \n#define CAN_F11R1_FB7_Msk                    (0x1UL << CAN_F11R1_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F11R1_FB7                        CAN_F11R1_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F11R1_FB8_Pos                    (8U)                              \n#define CAN_F11R1_FB8_Msk                    (0x1UL << CAN_F11R1_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F11R1_FB8                        CAN_F11R1_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F11R1_FB9_Pos                    (9U)                              \n#define CAN_F11R1_FB9_Msk                    (0x1UL << CAN_F11R1_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F11R1_FB9                        CAN_F11R1_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F11R1_FB10_Pos                   (10U)                             \n#define CAN_F11R1_FB10_Msk                   (0x1UL << CAN_F11R1_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F11R1_FB10                       CAN_F11R1_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F11R1_FB11_Pos                   (11U)                             \n#define CAN_F11R1_FB11_Msk                   (0x1UL << CAN_F11R1_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F11R1_FB11                       CAN_F11R1_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F11R1_FB12_Pos                   (12U)                             \n#define CAN_F11R1_FB12_Msk                   (0x1UL << CAN_F11R1_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F11R1_FB12                       CAN_F11R1_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F11R1_FB13_Pos                   (13U)                             \n#define CAN_F11R1_FB13_Msk                   (0x1UL << CAN_F11R1_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F11R1_FB13                       CAN_F11R1_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F11R1_FB14_Pos                   (14U)                             \n#define CAN_F11R1_FB14_Msk                   (0x1UL << CAN_F11R1_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F11R1_FB14                       CAN_F11R1_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F11R1_FB15_Pos                   (15U)                             \n#define CAN_F11R1_FB15_Msk                   (0x1UL << CAN_F11R1_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F11R1_FB15                       CAN_F11R1_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F11R1_FB16_Pos                   (16U)                             \n#define CAN_F11R1_FB16_Msk                   (0x1UL << CAN_F11R1_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F11R1_FB16                       CAN_F11R1_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F11R1_FB17_Pos                   (17U)                             \n#define CAN_F11R1_FB17_Msk                   (0x1UL << CAN_F11R1_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F11R1_FB17                       CAN_F11R1_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F11R1_FB18_Pos                   (18U)                             \n#define CAN_F11R1_FB18_Msk                   (0x1UL << CAN_F11R1_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F11R1_FB18                       CAN_F11R1_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F11R1_FB19_Pos                   (19U)                             \n#define CAN_F11R1_FB19_Msk                   (0x1UL << CAN_F11R1_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F11R1_FB19                       CAN_F11R1_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F11R1_FB20_Pos                   (20U)                             \n#define CAN_F11R1_FB20_Msk                   (0x1UL << CAN_F11R1_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F11R1_FB20                       CAN_F11R1_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F11R1_FB21_Pos                   (21U)                             \n#define CAN_F11R1_FB21_Msk                   (0x1UL << CAN_F11R1_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F11R1_FB21                       CAN_F11R1_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F11R1_FB22_Pos                   (22U)                             \n#define CAN_F11R1_FB22_Msk                   (0x1UL << CAN_F11R1_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F11R1_FB22                       CAN_F11R1_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F11R1_FB23_Pos                   (23U)                             \n#define CAN_F11R1_FB23_Msk                   (0x1UL << CAN_F11R1_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F11R1_FB23                       CAN_F11R1_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F11R1_FB24_Pos                   (24U)                             \n#define CAN_F11R1_FB24_Msk                   (0x1UL << CAN_F11R1_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F11R1_FB24                       CAN_F11R1_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F11R1_FB25_Pos                   (25U)                             \n#define CAN_F11R1_FB25_Msk                   (0x1UL << CAN_F11R1_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F11R1_FB25                       CAN_F11R1_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F11R1_FB26_Pos                   (26U)                             \n#define CAN_F11R1_FB26_Msk                   (0x1UL << CAN_F11R1_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F11R1_FB26                       CAN_F11R1_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F11R1_FB27_Pos                   (27U)                             \n#define CAN_F11R1_FB27_Msk                   (0x1UL << CAN_F11R1_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F11R1_FB27                       CAN_F11R1_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F11R1_FB28_Pos                   (28U)                             \n#define CAN_F11R1_FB28_Msk                   (0x1UL << CAN_F11R1_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F11R1_FB28                       CAN_F11R1_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F11R1_FB29_Pos                   (29U)                             \n#define CAN_F11R1_FB29_Msk                   (0x1UL << CAN_F11R1_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F11R1_FB29                       CAN_F11R1_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F11R1_FB30_Pos                   (30U)                             \n#define CAN_F11R1_FB30_Msk                   (0x1UL << CAN_F11R1_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F11R1_FB30                       CAN_F11R1_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F11R1_FB31_Pos                   (31U)                             \n#define CAN_F11R1_FB31_Msk                   (0x1UL << CAN_F11R1_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F11R1_FB31                       CAN_F11R1_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F12R1 register  ******************/\n#define CAN_F12R1_FB0_Pos                    (0U)                              \n#define CAN_F12R1_FB0_Msk                    (0x1UL << CAN_F12R1_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F12R1_FB0                        CAN_F12R1_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F12R1_FB1_Pos                    (1U)                              \n#define CAN_F12R1_FB1_Msk                    (0x1UL << CAN_F12R1_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F12R1_FB1                        CAN_F12R1_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F12R1_FB2_Pos                    (2U)                              \n#define CAN_F12R1_FB2_Msk                    (0x1UL << CAN_F12R1_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F12R1_FB2                        CAN_F12R1_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F12R1_FB3_Pos                    (3U)                              \n#define CAN_F12R1_FB3_Msk                    (0x1UL << CAN_F12R1_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F12R1_FB3                        CAN_F12R1_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F12R1_FB4_Pos                    (4U)                              \n#define CAN_F12R1_FB4_Msk                    (0x1UL << CAN_F12R1_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F12R1_FB4                        CAN_F12R1_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F12R1_FB5_Pos                    (5U)                              \n#define CAN_F12R1_FB5_Msk                    (0x1UL << CAN_F12R1_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F12R1_FB5                        CAN_F12R1_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F12R1_FB6_Pos                    (6U)                              \n#define CAN_F12R1_FB6_Msk                    (0x1UL << CAN_F12R1_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F12R1_FB6                        CAN_F12R1_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F12R1_FB7_Pos                    (7U)                              \n#define CAN_F12R1_FB7_Msk                    (0x1UL << CAN_F12R1_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F12R1_FB7                        CAN_F12R1_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F12R1_FB8_Pos                    (8U)                              \n#define CAN_F12R1_FB8_Msk                    (0x1UL << CAN_F12R1_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F12R1_FB8                        CAN_F12R1_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F12R1_FB9_Pos                    (9U)                              \n#define CAN_F12R1_FB9_Msk                    (0x1UL << CAN_F12R1_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F12R1_FB9                        CAN_F12R1_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F12R1_FB10_Pos                   (10U)                             \n#define CAN_F12R1_FB10_Msk                   (0x1UL << CAN_F12R1_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F12R1_FB10                       CAN_F12R1_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F12R1_FB11_Pos                   (11U)                             \n#define CAN_F12R1_FB11_Msk                   (0x1UL << CAN_F12R1_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F12R1_FB11                       CAN_F12R1_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F12R1_FB12_Pos                   (12U)                             \n#define CAN_F12R1_FB12_Msk                   (0x1UL << CAN_F12R1_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F12R1_FB12                       CAN_F12R1_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F12R1_FB13_Pos                   (13U)                             \n#define CAN_F12R1_FB13_Msk                   (0x1UL << CAN_F12R1_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F12R1_FB13                       CAN_F12R1_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F12R1_FB14_Pos                   (14U)                             \n#define CAN_F12R1_FB14_Msk                   (0x1UL << CAN_F12R1_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F12R1_FB14                       CAN_F12R1_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F12R1_FB15_Pos                   (15U)                             \n#define CAN_F12R1_FB15_Msk                   (0x1UL << CAN_F12R1_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F12R1_FB15                       CAN_F12R1_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F12R1_FB16_Pos                   (16U)                             \n#define CAN_F12R1_FB16_Msk                   (0x1UL << CAN_F12R1_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F12R1_FB16                       CAN_F12R1_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F12R1_FB17_Pos                   (17U)                             \n#define CAN_F12R1_FB17_Msk                   (0x1UL << CAN_F12R1_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F12R1_FB17                       CAN_F12R1_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F12R1_FB18_Pos                   (18U)                             \n#define CAN_F12R1_FB18_Msk                   (0x1UL << CAN_F12R1_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F12R1_FB18                       CAN_F12R1_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F12R1_FB19_Pos                   (19U)                             \n#define CAN_F12R1_FB19_Msk                   (0x1UL << CAN_F12R1_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F12R1_FB19                       CAN_F12R1_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F12R1_FB20_Pos                   (20U)                             \n#define CAN_F12R1_FB20_Msk                   (0x1UL << CAN_F12R1_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F12R1_FB20                       CAN_F12R1_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F12R1_FB21_Pos                   (21U)                             \n#define CAN_F12R1_FB21_Msk                   (0x1UL << CAN_F12R1_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F12R1_FB21                       CAN_F12R1_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F12R1_FB22_Pos                   (22U)                             \n#define CAN_F12R1_FB22_Msk                   (0x1UL << CAN_F12R1_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F12R1_FB22                       CAN_F12R1_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F12R1_FB23_Pos                   (23U)                             \n#define CAN_F12R1_FB23_Msk                   (0x1UL << CAN_F12R1_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F12R1_FB23                       CAN_F12R1_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F12R1_FB24_Pos                   (24U)                             \n#define CAN_F12R1_FB24_Msk                   (0x1UL << CAN_F12R1_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F12R1_FB24                       CAN_F12R1_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F12R1_FB25_Pos                   (25U)                             \n#define CAN_F12R1_FB25_Msk                   (0x1UL << CAN_F12R1_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F12R1_FB25                       CAN_F12R1_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F12R1_FB26_Pos                   (26U)                             \n#define CAN_F12R1_FB26_Msk                   (0x1UL << CAN_F12R1_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F12R1_FB26                       CAN_F12R1_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F12R1_FB27_Pos                   (27U)                             \n#define CAN_F12R1_FB27_Msk                   (0x1UL << CAN_F12R1_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F12R1_FB27                       CAN_F12R1_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F12R1_FB28_Pos                   (28U)                             \n#define CAN_F12R1_FB28_Msk                   (0x1UL << CAN_F12R1_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F12R1_FB28                       CAN_F12R1_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F12R1_FB29_Pos                   (29U)                             \n#define CAN_F12R1_FB29_Msk                   (0x1UL << CAN_F12R1_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F12R1_FB29                       CAN_F12R1_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F12R1_FB30_Pos                   (30U)                             \n#define CAN_F12R1_FB30_Msk                   (0x1UL << CAN_F12R1_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F12R1_FB30                       CAN_F12R1_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F12R1_FB31_Pos                   (31U)                             \n#define CAN_F12R1_FB31_Msk                   (0x1UL << CAN_F12R1_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F12R1_FB31                       CAN_F12R1_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F13R1 register  ******************/\n#define CAN_F13R1_FB0_Pos                    (0U)                              \n#define CAN_F13R1_FB0_Msk                    (0x1UL << CAN_F13R1_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F13R1_FB0                        CAN_F13R1_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F13R1_FB1_Pos                    (1U)                              \n#define CAN_F13R1_FB1_Msk                    (0x1UL << CAN_F13R1_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F13R1_FB1                        CAN_F13R1_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F13R1_FB2_Pos                    (2U)                              \n#define CAN_F13R1_FB2_Msk                    (0x1UL << CAN_F13R1_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F13R1_FB2                        CAN_F13R1_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F13R1_FB3_Pos                    (3U)                              \n#define CAN_F13R1_FB3_Msk                    (0x1UL << CAN_F13R1_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F13R1_FB3                        CAN_F13R1_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F13R1_FB4_Pos                    (4U)                              \n#define CAN_F13R1_FB4_Msk                    (0x1UL << CAN_F13R1_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F13R1_FB4                        CAN_F13R1_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F13R1_FB5_Pos                    (5U)                              \n#define CAN_F13R1_FB5_Msk                    (0x1UL << CAN_F13R1_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F13R1_FB5                        CAN_F13R1_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F13R1_FB6_Pos                    (6U)                              \n#define CAN_F13R1_FB6_Msk                    (0x1UL << CAN_F13R1_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F13R1_FB6                        CAN_F13R1_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F13R1_FB7_Pos                    (7U)                              \n#define CAN_F13R1_FB7_Msk                    (0x1UL << CAN_F13R1_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F13R1_FB7                        CAN_F13R1_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F13R1_FB8_Pos                    (8U)                              \n#define CAN_F13R1_FB8_Msk                    (0x1UL << CAN_F13R1_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F13R1_FB8                        CAN_F13R1_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F13R1_FB9_Pos                    (9U)                              \n#define CAN_F13R1_FB9_Msk                    (0x1UL << CAN_F13R1_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F13R1_FB9                        CAN_F13R1_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F13R1_FB10_Pos                   (10U)                             \n#define CAN_F13R1_FB10_Msk                   (0x1UL << CAN_F13R1_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F13R1_FB10                       CAN_F13R1_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F13R1_FB11_Pos                   (11U)                             \n#define CAN_F13R1_FB11_Msk                   (0x1UL << CAN_F13R1_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F13R1_FB11                       CAN_F13R1_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F13R1_FB12_Pos                   (12U)                             \n#define CAN_F13R1_FB12_Msk                   (0x1UL << CAN_F13R1_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F13R1_FB12                       CAN_F13R1_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F13R1_FB13_Pos                   (13U)                             \n#define CAN_F13R1_FB13_Msk                   (0x1UL << CAN_F13R1_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F13R1_FB13                       CAN_F13R1_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F13R1_FB14_Pos                   (14U)                             \n#define CAN_F13R1_FB14_Msk                   (0x1UL << CAN_F13R1_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F13R1_FB14                       CAN_F13R1_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F13R1_FB15_Pos                   (15U)                             \n#define CAN_F13R1_FB15_Msk                   (0x1UL << CAN_F13R1_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F13R1_FB15                       CAN_F13R1_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F13R1_FB16_Pos                   (16U)                             \n#define CAN_F13R1_FB16_Msk                   (0x1UL << CAN_F13R1_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F13R1_FB16                       CAN_F13R1_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F13R1_FB17_Pos                   (17U)                             \n#define CAN_F13R1_FB17_Msk                   (0x1UL << CAN_F13R1_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F13R1_FB17                       CAN_F13R1_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F13R1_FB18_Pos                   (18U)                             \n#define CAN_F13R1_FB18_Msk                   (0x1UL << CAN_F13R1_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F13R1_FB18                       CAN_F13R1_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F13R1_FB19_Pos                   (19U)                             \n#define CAN_F13R1_FB19_Msk                   (0x1UL << CAN_F13R1_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F13R1_FB19                       CAN_F13R1_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F13R1_FB20_Pos                   (20U)                             \n#define CAN_F13R1_FB20_Msk                   (0x1UL << CAN_F13R1_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F13R1_FB20                       CAN_F13R1_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F13R1_FB21_Pos                   (21U)                             \n#define CAN_F13R1_FB21_Msk                   (0x1UL << CAN_F13R1_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F13R1_FB21                       CAN_F13R1_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F13R1_FB22_Pos                   (22U)                             \n#define CAN_F13R1_FB22_Msk                   (0x1UL << CAN_F13R1_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F13R1_FB22                       CAN_F13R1_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F13R1_FB23_Pos                   (23U)                             \n#define CAN_F13R1_FB23_Msk                   (0x1UL << CAN_F13R1_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F13R1_FB23                       CAN_F13R1_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F13R1_FB24_Pos                   (24U)                             \n#define CAN_F13R1_FB24_Msk                   (0x1UL << CAN_F13R1_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F13R1_FB24                       CAN_F13R1_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F13R1_FB25_Pos                   (25U)                             \n#define CAN_F13R1_FB25_Msk                   (0x1UL << CAN_F13R1_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F13R1_FB25                       CAN_F13R1_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F13R1_FB26_Pos                   (26U)                             \n#define CAN_F13R1_FB26_Msk                   (0x1UL << CAN_F13R1_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F13R1_FB26                       CAN_F13R1_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F13R1_FB27_Pos                   (27U)                             \n#define CAN_F13R1_FB27_Msk                   (0x1UL << CAN_F13R1_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F13R1_FB27                       CAN_F13R1_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F13R1_FB28_Pos                   (28U)                             \n#define CAN_F13R1_FB28_Msk                   (0x1UL << CAN_F13R1_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F13R1_FB28                       CAN_F13R1_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F13R1_FB29_Pos                   (29U)                             \n#define CAN_F13R1_FB29_Msk                   (0x1UL << CAN_F13R1_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F13R1_FB29                       CAN_F13R1_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F13R1_FB30_Pos                   (30U)                             \n#define CAN_F13R1_FB30_Msk                   (0x1UL << CAN_F13R1_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F13R1_FB30                       CAN_F13R1_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F13R1_FB31_Pos                   (31U)                             \n#define CAN_F13R1_FB31_Msk                   (0x1UL << CAN_F13R1_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F13R1_FB31                       CAN_F13R1_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F0R2 register  *******************/\n#define CAN_F0R2_FB0_Pos                     (0U)                              \n#define CAN_F0R2_FB0_Msk                     (0x1UL << CAN_F0R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F0R2_FB0                         CAN_F0R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F0R2_FB1_Pos                     (1U)                              \n#define CAN_F0R2_FB1_Msk                     (0x1UL << CAN_F0R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F0R2_FB1                         CAN_F0R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F0R2_FB2_Pos                     (2U)                              \n#define CAN_F0R2_FB2_Msk                     (0x1UL << CAN_F0R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F0R2_FB2                         CAN_F0R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F0R2_FB3_Pos                     (3U)                              \n#define CAN_F0R2_FB3_Msk                     (0x1UL << CAN_F0R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F0R2_FB3                         CAN_F0R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F0R2_FB4_Pos                     (4U)                              \n#define CAN_F0R2_FB4_Msk                     (0x1UL << CAN_F0R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F0R2_FB4                         CAN_F0R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F0R2_FB5_Pos                     (5U)                              \n#define CAN_F0R2_FB5_Msk                     (0x1UL << CAN_F0R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F0R2_FB5                         CAN_F0R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F0R2_FB6_Pos                     (6U)                              \n#define CAN_F0R2_FB6_Msk                     (0x1UL << CAN_F0R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F0R2_FB6                         CAN_F0R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F0R2_FB7_Pos                     (7U)                              \n#define CAN_F0R2_FB7_Msk                     (0x1UL << CAN_F0R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F0R2_FB7                         CAN_F0R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F0R2_FB8_Pos                     (8U)                              \n#define CAN_F0R2_FB8_Msk                     (0x1UL << CAN_F0R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F0R2_FB8                         CAN_F0R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F0R2_FB9_Pos                     (9U)                              \n#define CAN_F0R2_FB9_Msk                     (0x1UL << CAN_F0R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F0R2_FB9                         CAN_F0R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F0R2_FB10_Pos                    (10U)                             \n#define CAN_F0R2_FB10_Msk                    (0x1UL << CAN_F0R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F0R2_FB10                        CAN_F0R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F0R2_FB11_Pos                    (11U)                             \n#define CAN_F0R2_FB11_Msk                    (0x1UL << CAN_F0R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F0R2_FB11                        CAN_F0R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F0R2_FB12_Pos                    (12U)                             \n#define CAN_F0R2_FB12_Msk                    (0x1UL << CAN_F0R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F0R2_FB12                        CAN_F0R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F0R2_FB13_Pos                    (13U)                             \n#define CAN_F0R2_FB13_Msk                    (0x1UL << CAN_F0R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F0R2_FB13                        CAN_F0R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F0R2_FB14_Pos                    (14U)                             \n#define CAN_F0R2_FB14_Msk                    (0x1UL << CAN_F0R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F0R2_FB14                        CAN_F0R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F0R2_FB15_Pos                    (15U)                             \n#define CAN_F0R2_FB15_Msk                    (0x1UL << CAN_F0R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F0R2_FB15                        CAN_F0R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F0R2_FB16_Pos                    (16U)                             \n#define CAN_F0R2_FB16_Msk                    (0x1UL << CAN_F0R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F0R2_FB16                        CAN_F0R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F0R2_FB17_Pos                    (17U)                             \n#define CAN_F0R2_FB17_Msk                    (0x1UL << CAN_F0R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F0R2_FB17                        CAN_F0R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F0R2_FB18_Pos                    (18U)                             \n#define CAN_F0R2_FB18_Msk                    (0x1UL << CAN_F0R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F0R2_FB18                        CAN_F0R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F0R2_FB19_Pos                    (19U)                             \n#define CAN_F0R2_FB19_Msk                    (0x1UL << CAN_F0R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F0R2_FB19                        CAN_F0R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F0R2_FB20_Pos                    (20U)                             \n#define CAN_F0R2_FB20_Msk                    (0x1UL << CAN_F0R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F0R2_FB20                        CAN_F0R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F0R2_FB21_Pos                    (21U)                             \n#define CAN_F0R2_FB21_Msk                    (0x1UL << CAN_F0R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F0R2_FB21                        CAN_F0R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F0R2_FB22_Pos                    (22U)                             \n#define CAN_F0R2_FB22_Msk                    (0x1UL << CAN_F0R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F0R2_FB22                        CAN_F0R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F0R2_FB23_Pos                    (23U)                             \n#define CAN_F0R2_FB23_Msk                    (0x1UL << CAN_F0R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F0R2_FB23                        CAN_F0R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F0R2_FB24_Pos                    (24U)                             \n#define CAN_F0R2_FB24_Msk                    (0x1UL << CAN_F0R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F0R2_FB24                        CAN_F0R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F0R2_FB25_Pos                    (25U)                             \n#define CAN_F0R2_FB25_Msk                    (0x1UL << CAN_F0R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F0R2_FB25                        CAN_F0R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F0R2_FB26_Pos                    (26U)                             \n#define CAN_F0R2_FB26_Msk                    (0x1UL << CAN_F0R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F0R2_FB26                        CAN_F0R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F0R2_FB27_Pos                    (27U)                             \n#define CAN_F0R2_FB27_Msk                    (0x1UL << CAN_F0R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F0R2_FB27                        CAN_F0R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F0R2_FB28_Pos                    (28U)                             \n#define CAN_F0R2_FB28_Msk                    (0x1UL << CAN_F0R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F0R2_FB28                        CAN_F0R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F0R2_FB29_Pos                    (29U)                             \n#define CAN_F0R2_FB29_Msk                    (0x1UL << CAN_F0R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F0R2_FB29                        CAN_F0R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F0R2_FB30_Pos                    (30U)                             \n#define CAN_F0R2_FB30_Msk                    (0x1UL << CAN_F0R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F0R2_FB30                        CAN_F0R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F0R2_FB31_Pos                    (31U)                             \n#define CAN_F0R2_FB31_Msk                    (0x1UL << CAN_F0R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F0R2_FB31                        CAN_F0R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F1R2 register  *******************/\n#define CAN_F1R2_FB0_Pos                     (0U)                              \n#define CAN_F1R2_FB0_Msk                     (0x1UL << CAN_F1R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F1R2_FB0                         CAN_F1R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F1R2_FB1_Pos                     (1U)                              \n#define CAN_F1R2_FB1_Msk                     (0x1UL << CAN_F1R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F1R2_FB1                         CAN_F1R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F1R2_FB2_Pos                     (2U)                              \n#define CAN_F1R2_FB2_Msk                     (0x1UL << CAN_F1R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F1R2_FB2                         CAN_F1R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F1R2_FB3_Pos                     (3U)                              \n#define CAN_F1R2_FB3_Msk                     (0x1UL << CAN_F1R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F1R2_FB3                         CAN_F1R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F1R2_FB4_Pos                     (4U)                              \n#define CAN_F1R2_FB4_Msk                     (0x1UL << CAN_F1R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F1R2_FB4                         CAN_F1R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F1R2_FB5_Pos                     (5U)                              \n#define CAN_F1R2_FB5_Msk                     (0x1UL << CAN_F1R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F1R2_FB5                         CAN_F1R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F1R2_FB6_Pos                     (6U)                              \n#define CAN_F1R2_FB6_Msk                     (0x1UL << CAN_F1R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F1R2_FB6                         CAN_F1R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F1R2_FB7_Pos                     (7U)                              \n#define CAN_F1R2_FB7_Msk                     (0x1UL << CAN_F1R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F1R2_FB7                         CAN_F1R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F1R2_FB8_Pos                     (8U)                              \n#define CAN_F1R2_FB8_Msk                     (0x1UL << CAN_F1R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F1R2_FB8                         CAN_F1R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F1R2_FB9_Pos                     (9U)                              \n#define CAN_F1R2_FB9_Msk                     (0x1UL << CAN_F1R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F1R2_FB9                         CAN_F1R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F1R2_FB10_Pos                    (10U)                             \n#define CAN_F1R2_FB10_Msk                    (0x1UL << CAN_F1R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F1R2_FB10                        CAN_F1R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F1R2_FB11_Pos                    (11U)                             \n#define CAN_F1R2_FB11_Msk                    (0x1UL << CAN_F1R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F1R2_FB11                        CAN_F1R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F1R2_FB12_Pos                    (12U)                             \n#define CAN_F1R2_FB12_Msk                    (0x1UL << CAN_F1R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F1R2_FB12                        CAN_F1R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F1R2_FB13_Pos                    (13U)                             \n#define CAN_F1R2_FB13_Msk                    (0x1UL << CAN_F1R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F1R2_FB13                        CAN_F1R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F1R2_FB14_Pos                    (14U)                             \n#define CAN_F1R2_FB14_Msk                    (0x1UL << CAN_F1R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F1R2_FB14                        CAN_F1R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F1R2_FB15_Pos                    (15U)                             \n#define CAN_F1R2_FB15_Msk                    (0x1UL << CAN_F1R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F1R2_FB15                        CAN_F1R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F1R2_FB16_Pos                    (16U)                             \n#define CAN_F1R2_FB16_Msk                    (0x1UL << CAN_F1R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F1R2_FB16                        CAN_F1R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F1R2_FB17_Pos                    (17U)                             \n#define CAN_F1R2_FB17_Msk                    (0x1UL << CAN_F1R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F1R2_FB17                        CAN_F1R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F1R2_FB18_Pos                    (18U)                             \n#define CAN_F1R2_FB18_Msk                    (0x1UL << CAN_F1R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F1R2_FB18                        CAN_F1R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F1R2_FB19_Pos                    (19U)                             \n#define CAN_F1R2_FB19_Msk                    (0x1UL << CAN_F1R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F1R2_FB19                        CAN_F1R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F1R2_FB20_Pos                    (20U)                             \n#define CAN_F1R2_FB20_Msk                    (0x1UL << CAN_F1R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F1R2_FB20                        CAN_F1R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F1R2_FB21_Pos                    (21U)                             \n#define CAN_F1R2_FB21_Msk                    (0x1UL << CAN_F1R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F1R2_FB21                        CAN_F1R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F1R2_FB22_Pos                    (22U)                             \n#define CAN_F1R2_FB22_Msk                    (0x1UL << CAN_F1R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F1R2_FB22                        CAN_F1R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F1R2_FB23_Pos                    (23U)                             \n#define CAN_F1R2_FB23_Msk                    (0x1UL << CAN_F1R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F1R2_FB23                        CAN_F1R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F1R2_FB24_Pos                    (24U)                             \n#define CAN_F1R2_FB24_Msk                    (0x1UL << CAN_F1R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F1R2_FB24                        CAN_F1R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F1R2_FB25_Pos                    (25U)                             \n#define CAN_F1R2_FB25_Msk                    (0x1UL << CAN_F1R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F1R2_FB25                        CAN_F1R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F1R2_FB26_Pos                    (26U)                             \n#define CAN_F1R2_FB26_Msk                    (0x1UL << CAN_F1R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F1R2_FB26                        CAN_F1R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F1R2_FB27_Pos                    (27U)                             \n#define CAN_F1R2_FB27_Msk                    (0x1UL << CAN_F1R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F1R2_FB27                        CAN_F1R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F1R2_FB28_Pos                    (28U)                             \n#define CAN_F1R2_FB28_Msk                    (0x1UL << CAN_F1R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F1R2_FB28                        CAN_F1R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F1R2_FB29_Pos                    (29U)                             \n#define CAN_F1R2_FB29_Msk                    (0x1UL << CAN_F1R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F1R2_FB29                        CAN_F1R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F1R2_FB30_Pos                    (30U)                             \n#define CAN_F1R2_FB30_Msk                    (0x1UL << CAN_F1R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F1R2_FB30                        CAN_F1R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F1R2_FB31_Pos                    (31U)                             \n#define CAN_F1R2_FB31_Msk                    (0x1UL << CAN_F1R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F1R2_FB31                        CAN_F1R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F2R2 register  *******************/\n#define CAN_F2R2_FB0_Pos                     (0U)                              \n#define CAN_F2R2_FB0_Msk                     (0x1UL << CAN_F2R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F2R2_FB0                         CAN_F2R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F2R2_FB1_Pos                     (1U)                              \n#define CAN_F2R2_FB1_Msk                     (0x1UL << CAN_F2R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F2R2_FB1                         CAN_F2R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F2R2_FB2_Pos                     (2U)                              \n#define CAN_F2R2_FB2_Msk                     (0x1UL << CAN_F2R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F2R2_FB2                         CAN_F2R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F2R2_FB3_Pos                     (3U)                              \n#define CAN_F2R2_FB3_Msk                     (0x1UL << CAN_F2R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F2R2_FB3                         CAN_F2R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F2R2_FB4_Pos                     (4U)                              \n#define CAN_F2R2_FB4_Msk                     (0x1UL << CAN_F2R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F2R2_FB4                         CAN_F2R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F2R2_FB5_Pos                     (5U)                              \n#define CAN_F2R2_FB5_Msk                     (0x1UL << CAN_F2R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F2R2_FB5                         CAN_F2R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F2R2_FB6_Pos                     (6U)                              \n#define CAN_F2R2_FB6_Msk                     (0x1UL << CAN_F2R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F2R2_FB6                         CAN_F2R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F2R2_FB7_Pos                     (7U)                              \n#define CAN_F2R2_FB7_Msk                     (0x1UL << CAN_F2R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F2R2_FB7                         CAN_F2R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F2R2_FB8_Pos                     (8U)                              \n#define CAN_F2R2_FB8_Msk                     (0x1UL << CAN_F2R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F2R2_FB8                         CAN_F2R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F2R2_FB9_Pos                     (9U)                              \n#define CAN_F2R2_FB9_Msk                     (0x1UL << CAN_F2R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F2R2_FB9                         CAN_F2R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F2R2_FB10_Pos                    (10U)                             \n#define CAN_F2R2_FB10_Msk                    (0x1UL << CAN_F2R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F2R2_FB10                        CAN_F2R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F2R2_FB11_Pos                    (11U)                             \n#define CAN_F2R2_FB11_Msk                    (0x1UL << CAN_F2R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F2R2_FB11                        CAN_F2R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F2R2_FB12_Pos                    (12U)                             \n#define CAN_F2R2_FB12_Msk                    (0x1UL << CAN_F2R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F2R2_FB12                        CAN_F2R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F2R2_FB13_Pos                    (13U)                             \n#define CAN_F2R2_FB13_Msk                    (0x1UL << CAN_F2R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F2R2_FB13                        CAN_F2R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F2R2_FB14_Pos                    (14U)                             \n#define CAN_F2R2_FB14_Msk                    (0x1UL << CAN_F2R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F2R2_FB14                        CAN_F2R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F2R2_FB15_Pos                    (15U)                             \n#define CAN_F2R2_FB15_Msk                    (0x1UL << CAN_F2R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F2R2_FB15                        CAN_F2R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F2R2_FB16_Pos                    (16U)                             \n#define CAN_F2R2_FB16_Msk                    (0x1UL << CAN_F2R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F2R2_FB16                        CAN_F2R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F2R2_FB17_Pos                    (17U)                             \n#define CAN_F2R2_FB17_Msk                    (0x1UL << CAN_F2R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F2R2_FB17                        CAN_F2R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F2R2_FB18_Pos                    (18U)                             \n#define CAN_F2R2_FB18_Msk                    (0x1UL << CAN_F2R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F2R2_FB18                        CAN_F2R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F2R2_FB19_Pos                    (19U)                             \n#define CAN_F2R2_FB19_Msk                    (0x1UL << CAN_F2R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F2R2_FB19                        CAN_F2R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F2R2_FB20_Pos                    (20U)                             \n#define CAN_F2R2_FB20_Msk                    (0x1UL << CAN_F2R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F2R2_FB20                        CAN_F2R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F2R2_FB21_Pos                    (21U)                             \n#define CAN_F2R2_FB21_Msk                    (0x1UL << CAN_F2R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F2R2_FB21                        CAN_F2R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F2R2_FB22_Pos                    (22U)                             \n#define CAN_F2R2_FB22_Msk                    (0x1UL << CAN_F2R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F2R2_FB22                        CAN_F2R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F2R2_FB23_Pos                    (23U)                             \n#define CAN_F2R2_FB23_Msk                    (0x1UL << CAN_F2R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F2R2_FB23                        CAN_F2R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F2R2_FB24_Pos                    (24U)                             \n#define CAN_F2R2_FB24_Msk                    (0x1UL << CAN_F2R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F2R2_FB24                        CAN_F2R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F2R2_FB25_Pos                    (25U)                             \n#define CAN_F2R2_FB25_Msk                    (0x1UL << CAN_F2R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F2R2_FB25                        CAN_F2R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F2R2_FB26_Pos                    (26U)                             \n#define CAN_F2R2_FB26_Msk                    (0x1UL << CAN_F2R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F2R2_FB26                        CAN_F2R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F2R2_FB27_Pos                    (27U)                             \n#define CAN_F2R2_FB27_Msk                    (0x1UL << CAN_F2R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F2R2_FB27                        CAN_F2R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F2R2_FB28_Pos                    (28U)                             \n#define CAN_F2R2_FB28_Msk                    (0x1UL << CAN_F2R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F2R2_FB28                        CAN_F2R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F2R2_FB29_Pos                    (29U)                             \n#define CAN_F2R2_FB29_Msk                    (0x1UL << CAN_F2R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F2R2_FB29                        CAN_F2R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F2R2_FB30_Pos                    (30U)                             \n#define CAN_F2R2_FB30_Msk                    (0x1UL << CAN_F2R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F2R2_FB30                        CAN_F2R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F2R2_FB31_Pos                    (31U)                             \n#define CAN_F2R2_FB31_Msk                    (0x1UL << CAN_F2R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F2R2_FB31                        CAN_F2R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F3R2 register  *******************/\n#define CAN_F3R2_FB0_Pos                     (0U)                              \n#define CAN_F3R2_FB0_Msk                     (0x1UL << CAN_F3R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F3R2_FB0                         CAN_F3R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F3R2_FB1_Pos                     (1U)                              \n#define CAN_F3R2_FB1_Msk                     (0x1UL << CAN_F3R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F3R2_FB1                         CAN_F3R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F3R2_FB2_Pos                     (2U)                              \n#define CAN_F3R2_FB2_Msk                     (0x1UL << CAN_F3R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F3R2_FB2                         CAN_F3R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F3R2_FB3_Pos                     (3U)                              \n#define CAN_F3R2_FB3_Msk                     (0x1UL << CAN_F3R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F3R2_FB3                         CAN_F3R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F3R2_FB4_Pos                     (4U)                              \n#define CAN_F3R2_FB4_Msk                     (0x1UL << CAN_F3R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F3R2_FB4                         CAN_F3R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F3R2_FB5_Pos                     (5U)                              \n#define CAN_F3R2_FB5_Msk                     (0x1UL << CAN_F3R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F3R2_FB5                         CAN_F3R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F3R2_FB6_Pos                     (6U)                              \n#define CAN_F3R2_FB6_Msk                     (0x1UL << CAN_F3R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F3R2_FB6                         CAN_F3R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F3R2_FB7_Pos                     (7U)                              \n#define CAN_F3R2_FB7_Msk                     (0x1UL << CAN_F3R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F3R2_FB7                         CAN_F3R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F3R2_FB8_Pos                     (8U)                              \n#define CAN_F3R2_FB8_Msk                     (0x1UL << CAN_F3R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F3R2_FB8                         CAN_F3R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F3R2_FB9_Pos                     (9U)                              \n#define CAN_F3R2_FB9_Msk                     (0x1UL << CAN_F3R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F3R2_FB9                         CAN_F3R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F3R2_FB10_Pos                    (10U)                             \n#define CAN_F3R2_FB10_Msk                    (0x1UL << CAN_F3R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F3R2_FB10                        CAN_F3R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F3R2_FB11_Pos                    (11U)                             \n#define CAN_F3R2_FB11_Msk                    (0x1UL << CAN_F3R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F3R2_FB11                        CAN_F3R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F3R2_FB12_Pos                    (12U)                             \n#define CAN_F3R2_FB12_Msk                    (0x1UL << CAN_F3R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F3R2_FB12                        CAN_F3R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F3R2_FB13_Pos                    (13U)                             \n#define CAN_F3R2_FB13_Msk                    (0x1UL << CAN_F3R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F3R2_FB13                        CAN_F3R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F3R2_FB14_Pos                    (14U)                             \n#define CAN_F3R2_FB14_Msk                    (0x1UL << CAN_F3R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F3R2_FB14                        CAN_F3R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F3R2_FB15_Pos                    (15U)                             \n#define CAN_F3R2_FB15_Msk                    (0x1UL << CAN_F3R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F3R2_FB15                        CAN_F3R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F3R2_FB16_Pos                    (16U)                             \n#define CAN_F3R2_FB16_Msk                    (0x1UL << CAN_F3R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F3R2_FB16                        CAN_F3R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F3R2_FB17_Pos                    (17U)                             \n#define CAN_F3R2_FB17_Msk                    (0x1UL << CAN_F3R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F3R2_FB17                        CAN_F3R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F3R2_FB18_Pos                    (18U)                             \n#define CAN_F3R2_FB18_Msk                    (0x1UL << CAN_F3R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F3R2_FB18                        CAN_F3R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F3R2_FB19_Pos                    (19U)                             \n#define CAN_F3R2_FB19_Msk                    (0x1UL << CAN_F3R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F3R2_FB19                        CAN_F3R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F3R2_FB20_Pos                    (20U)                             \n#define CAN_F3R2_FB20_Msk                    (0x1UL << CAN_F3R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F3R2_FB20                        CAN_F3R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F3R2_FB21_Pos                    (21U)                             \n#define CAN_F3R2_FB21_Msk                    (0x1UL << CAN_F3R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F3R2_FB21                        CAN_F3R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F3R2_FB22_Pos                    (22U)                             \n#define CAN_F3R2_FB22_Msk                    (0x1UL << CAN_F3R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F3R2_FB22                        CAN_F3R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F3R2_FB23_Pos                    (23U)                             \n#define CAN_F3R2_FB23_Msk                    (0x1UL << CAN_F3R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F3R2_FB23                        CAN_F3R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F3R2_FB24_Pos                    (24U)                             \n#define CAN_F3R2_FB24_Msk                    (0x1UL << CAN_F3R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F3R2_FB24                        CAN_F3R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F3R2_FB25_Pos                    (25U)                             \n#define CAN_F3R2_FB25_Msk                    (0x1UL << CAN_F3R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F3R2_FB25                        CAN_F3R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F3R2_FB26_Pos                    (26U)                             \n#define CAN_F3R2_FB26_Msk                    (0x1UL << CAN_F3R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F3R2_FB26                        CAN_F3R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F3R2_FB27_Pos                    (27U)                             \n#define CAN_F3R2_FB27_Msk                    (0x1UL << CAN_F3R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F3R2_FB27                        CAN_F3R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F3R2_FB28_Pos                    (28U)                             \n#define CAN_F3R2_FB28_Msk                    (0x1UL << CAN_F3R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F3R2_FB28                        CAN_F3R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F3R2_FB29_Pos                    (29U)                             \n#define CAN_F3R2_FB29_Msk                    (0x1UL << CAN_F3R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F3R2_FB29                        CAN_F3R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F3R2_FB30_Pos                    (30U)                             \n#define CAN_F3R2_FB30_Msk                    (0x1UL << CAN_F3R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F3R2_FB30                        CAN_F3R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F3R2_FB31_Pos                    (31U)                             \n#define CAN_F3R2_FB31_Msk                    (0x1UL << CAN_F3R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F3R2_FB31                        CAN_F3R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F4R2 register  *******************/\n#define CAN_F4R2_FB0_Pos                     (0U)                              \n#define CAN_F4R2_FB0_Msk                     (0x1UL << CAN_F4R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F4R2_FB0                         CAN_F4R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F4R2_FB1_Pos                     (1U)                              \n#define CAN_F4R2_FB1_Msk                     (0x1UL << CAN_F4R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F4R2_FB1                         CAN_F4R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F4R2_FB2_Pos                     (2U)                              \n#define CAN_F4R2_FB2_Msk                     (0x1UL << CAN_F4R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F4R2_FB2                         CAN_F4R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F4R2_FB3_Pos                     (3U)                              \n#define CAN_F4R2_FB3_Msk                     (0x1UL << CAN_F4R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F4R2_FB3                         CAN_F4R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F4R2_FB4_Pos                     (4U)                              \n#define CAN_F4R2_FB4_Msk                     (0x1UL << CAN_F4R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F4R2_FB4                         CAN_F4R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F4R2_FB5_Pos                     (5U)                              \n#define CAN_F4R2_FB5_Msk                     (0x1UL << CAN_F4R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F4R2_FB5                         CAN_F4R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F4R2_FB6_Pos                     (6U)                              \n#define CAN_F4R2_FB6_Msk                     (0x1UL << CAN_F4R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F4R2_FB6                         CAN_F4R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F4R2_FB7_Pos                     (7U)                              \n#define CAN_F4R2_FB7_Msk                     (0x1UL << CAN_F4R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F4R2_FB7                         CAN_F4R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F4R2_FB8_Pos                     (8U)                              \n#define CAN_F4R2_FB8_Msk                     (0x1UL << CAN_F4R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F4R2_FB8                         CAN_F4R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F4R2_FB9_Pos                     (9U)                              \n#define CAN_F4R2_FB9_Msk                     (0x1UL << CAN_F4R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F4R2_FB9                         CAN_F4R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F4R2_FB10_Pos                    (10U)                             \n#define CAN_F4R2_FB10_Msk                    (0x1UL << CAN_F4R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F4R2_FB10                        CAN_F4R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F4R2_FB11_Pos                    (11U)                             \n#define CAN_F4R2_FB11_Msk                    (0x1UL << CAN_F4R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F4R2_FB11                        CAN_F4R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F4R2_FB12_Pos                    (12U)                             \n#define CAN_F4R2_FB12_Msk                    (0x1UL << CAN_F4R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F4R2_FB12                        CAN_F4R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F4R2_FB13_Pos                    (13U)                             \n#define CAN_F4R2_FB13_Msk                    (0x1UL << CAN_F4R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F4R2_FB13                        CAN_F4R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F4R2_FB14_Pos                    (14U)                             \n#define CAN_F4R2_FB14_Msk                    (0x1UL << CAN_F4R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F4R2_FB14                        CAN_F4R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F4R2_FB15_Pos                    (15U)                             \n#define CAN_F4R2_FB15_Msk                    (0x1UL << CAN_F4R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F4R2_FB15                        CAN_F4R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F4R2_FB16_Pos                    (16U)                             \n#define CAN_F4R2_FB16_Msk                    (0x1UL << CAN_F4R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F4R2_FB16                        CAN_F4R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F4R2_FB17_Pos                    (17U)                             \n#define CAN_F4R2_FB17_Msk                    (0x1UL << CAN_F4R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F4R2_FB17                        CAN_F4R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F4R2_FB18_Pos                    (18U)                             \n#define CAN_F4R2_FB18_Msk                    (0x1UL << CAN_F4R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F4R2_FB18                        CAN_F4R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F4R2_FB19_Pos                    (19U)                             \n#define CAN_F4R2_FB19_Msk                    (0x1UL << CAN_F4R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F4R2_FB19                        CAN_F4R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F4R2_FB20_Pos                    (20U)                             \n#define CAN_F4R2_FB20_Msk                    (0x1UL << CAN_F4R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F4R2_FB20                        CAN_F4R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F4R2_FB21_Pos                    (21U)                             \n#define CAN_F4R2_FB21_Msk                    (0x1UL << CAN_F4R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F4R2_FB21                        CAN_F4R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F4R2_FB22_Pos                    (22U)                             \n#define CAN_F4R2_FB22_Msk                    (0x1UL << CAN_F4R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F4R2_FB22                        CAN_F4R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F4R2_FB23_Pos                    (23U)                             \n#define CAN_F4R2_FB23_Msk                    (0x1UL << CAN_F4R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F4R2_FB23                        CAN_F4R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F4R2_FB24_Pos                    (24U)                             \n#define CAN_F4R2_FB24_Msk                    (0x1UL << CAN_F4R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F4R2_FB24                        CAN_F4R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F4R2_FB25_Pos                    (25U)                             \n#define CAN_F4R2_FB25_Msk                    (0x1UL << CAN_F4R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F4R2_FB25                        CAN_F4R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F4R2_FB26_Pos                    (26U)                             \n#define CAN_F4R2_FB26_Msk                    (0x1UL << CAN_F4R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F4R2_FB26                        CAN_F4R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F4R2_FB27_Pos                    (27U)                             \n#define CAN_F4R2_FB27_Msk                    (0x1UL << CAN_F4R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F4R2_FB27                        CAN_F4R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F4R2_FB28_Pos                    (28U)                             \n#define CAN_F4R2_FB28_Msk                    (0x1UL << CAN_F4R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F4R2_FB28                        CAN_F4R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F4R2_FB29_Pos                    (29U)                             \n#define CAN_F4R2_FB29_Msk                    (0x1UL << CAN_F4R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F4R2_FB29                        CAN_F4R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F4R2_FB30_Pos                    (30U)                             \n#define CAN_F4R2_FB30_Msk                    (0x1UL << CAN_F4R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F4R2_FB30                        CAN_F4R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F4R2_FB31_Pos                    (31U)                             \n#define CAN_F4R2_FB31_Msk                    (0x1UL << CAN_F4R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F4R2_FB31                        CAN_F4R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F5R2 register  *******************/\n#define CAN_F5R2_FB0_Pos                     (0U)                              \n#define CAN_F5R2_FB0_Msk                     (0x1UL << CAN_F5R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F5R2_FB0                         CAN_F5R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F5R2_FB1_Pos                     (1U)                              \n#define CAN_F5R2_FB1_Msk                     (0x1UL << CAN_F5R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F5R2_FB1                         CAN_F5R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F5R2_FB2_Pos                     (2U)                              \n#define CAN_F5R2_FB2_Msk                     (0x1UL << CAN_F5R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F5R2_FB2                         CAN_F5R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F5R2_FB3_Pos                     (3U)                              \n#define CAN_F5R2_FB3_Msk                     (0x1UL << CAN_F5R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F5R2_FB3                         CAN_F5R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F5R2_FB4_Pos                     (4U)                              \n#define CAN_F5R2_FB4_Msk                     (0x1UL << CAN_F5R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F5R2_FB4                         CAN_F5R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F5R2_FB5_Pos                     (5U)                              \n#define CAN_F5R2_FB5_Msk                     (0x1UL << CAN_F5R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F5R2_FB5                         CAN_F5R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F5R2_FB6_Pos                     (6U)                              \n#define CAN_F5R2_FB6_Msk                     (0x1UL << CAN_F5R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F5R2_FB6                         CAN_F5R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F5R2_FB7_Pos                     (7U)                              \n#define CAN_F5R2_FB7_Msk                     (0x1UL << CAN_F5R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F5R2_FB7                         CAN_F5R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F5R2_FB8_Pos                     (8U)                              \n#define CAN_F5R2_FB8_Msk                     (0x1UL << CAN_F5R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F5R2_FB8                         CAN_F5R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F5R2_FB9_Pos                     (9U)                              \n#define CAN_F5R2_FB9_Msk                     (0x1UL << CAN_F5R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F5R2_FB9                         CAN_F5R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F5R2_FB10_Pos                    (10U)                             \n#define CAN_F5R2_FB10_Msk                    (0x1UL << CAN_F5R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F5R2_FB10                        CAN_F5R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F5R2_FB11_Pos                    (11U)                             \n#define CAN_F5R2_FB11_Msk                    (0x1UL << CAN_F5R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F5R2_FB11                        CAN_F5R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F5R2_FB12_Pos                    (12U)                             \n#define CAN_F5R2_FB12_Msk                    (0x1UL << CAN_F5R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F5R2_FB12                        CAN_F5R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F5R2_FB13_Pos                    (13U)                             \n#define CAN_F5R2_FB13_Msk                    (0x1UL << CAN_F5R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F5R2_FB13                        CAN_F5R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F5R2_FB14_Pos                    (14U)                             \n#define CAN_F5R2_FB14_Msk                    (0x1UL << CAN_F5R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F5R2_FB14                        CAN_F5R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F5R2_FB15_Pos                    (15U)                             \n#define CAN_F5R2_FB15_Msk                    (0x1UL << CAN_F5R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F5R2_FB15                        CAN_F5R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F5R2_FB16_Pos                    (16U)                             \n#define CAN_F5R2_FB16_Msk                    (0x1UL << CAN_F5R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F5R2_FB16                        CAN_F5R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F5R2_FB17_Pos                    (17U)                             \n#define CAN_F5R2_FB17_Msk                    (0x1UL << CAN_F5R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F5R2_FB17                        CAN_F5R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F5R2_FB18_Pos                    (18U)                             \n#define CAN_F5R2_FB18_Msk                    (0x1UL << CAN_F5R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F5R2_FB18                        CAN_F5R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F5R2_FB19_Pos                    (19U)                             \n#define CAN_F5R2_FB19_Msk                    (0x1UL << CAN_F5R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F5R2_FB19                        CAN_F5R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F5R2_FB20_Pos                    (20U)                             \n#define CAN_F5R2_FB20_Msk                    (0x1UL << CAN_F5R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F5R2_FB20                        CAN_F5R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F5R2_FB21_Pos                    (21U)                             \n#define CAN_F5R2_FB21_Msk                    (0x1UL << CAN_F5R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F5R2_FB21                        CAN_F5R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F5R2_FB22_Pos                    (22U)                             \n#define CAN_F5R2_FB22_Msk                    (0x1UL << CAN_F5R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F5R2_FB22                        CAN_F5R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F5R2_FB23_Pos                    (23U)                             \n#define CAN_F5R2_FB23_Msk                    (0x1UL << CAN_F5R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F5R2_FB23                        CAN_F5R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F5R2_FB24_Pos                    (24U)                             \n#define CAN_F5R2_FB24_Msk                    (0x1UL << CAN_F5R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F5R2_FB24                        CAN_F5R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F5R2_FB25_Pos                    (25U)                             \n#define CAN_F5R2_FB25_Msk                    (0x1UL << CAN_F5R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F5R2_FB25                        CAN_F5R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F5R2_FB26_Pos                    (26U)                             \n#define CAN_F5R2_FB26_Msk                    (0x1UL << CAN_F5R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F5R2_FB26                        CAN_F5R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F5R2_FB27_Pos                    (27U)                             \n#define CAN_F5R2_FB27_Msk                    (0x1UL << CAN_F5R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F5R2_FB27                        CAN_F5R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F5R2_FB28_Pos                    (28U)                             \n#define CAN_F5R2_FB28_Msk                    (0x1UL << CAN_F5R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F5R2_FB28                        CAN_F5R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F5R2_FB29_Pos                    (29U)                             \n#define CAN_F5R2_FB29_Msk                    (0x1UL << CAN_F5R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F5R2_FB29                        CAN_F5R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F5R2_FB30_Pos                    (30U)                             \n#define CAN_F5R2_FB30_Msk                    (0x1UL << CAN_F5R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F5R2_FB30                        CAN_F5R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F5R2_FB31_Pos                    (31U)                             \n#define CAN_F5R2_FB31_Msk                    (0x1UL << CAN_F5R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F5R2_FB31                        CAN_F5R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F6R2 register  *******************/\n#define CAN_F6R2_FB0_Pos                     (0U)                              \n#define CAN_F6R2_FB0_Msk                     (0x1UL << CAN_F6R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F6R2_FB0                         CAN_F6R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F6R2_FB1_Pos                     (1U)                              \n#define CAN_F6R2_FB1_Msk                     (0x1UL << CAN_F6R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F6R2_FB1                         CAN_F6R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F6R2_FB2_Pos                     (2U)                              \n#define CAN_F6R2_FB2_Msk                     (0x1UL << CAN_F6R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F6R2_FB2                         CAN_F6R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F6R2_FB3_Pos                     (3U)                              \n#define CAN_F6R2_FB3_Msk                     (0x1UL << CAN_F6R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F6R2_FB3                         CAN_F6R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F6R2_FB4_Pos                     (4U)                              \n#define CAN_F6R2_FB4_Msk                     (0x1UL << CAN_F6R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F6R2_FB4                         CAN_F6R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F6R2_FB5_Pos                     (5U)                              \n#define CAN_F6R2_FB5_Msk                     (0x1UL << CAN_F6R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F6R2_FB5                         CAN_F6R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F6R2_FB6_Pos                     (6U)                              \n#define CAN_F6R2_FB6_Msk                     (0x1UL << CAN_F6R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F6R2_FB6                         CAN_F6R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F6R2_FB7_Pos                     (7U)                              \n#define CAN_F6R2_FB7_Msk                     (0x1UL << CAN_F6R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F6R2_FB7                         CAN_F6R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F6R2_FB8_Pos                     (8U)                              \n#define CAN_F6R2_FB8_Msk                     (0x1UL << CAN_F6R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F6R2_FB8                         CAN_F6R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F6R2_FB9_Pos                     (9U)                              \n#define CAN_F6R2_FB9_Msk                     (0x1UL << CAN_F6R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F6R2_FB9                         CAN_F6R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F6R2_FB10_Pos                    (10U)                             \n#define CAN_F6R2_FB10_Msk                    (0x1UL << CAN_F6R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F6R2_FB10                        CAN_F6R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F6R2_FB11_Pos                    (11U)                             \n#define CAN_F6R2_FB11_Msk                    (0x1UL << CAN_F6R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F6R2_FB11                        CAN_F6R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F6R2_FB12_Pos                    (12U)                             \n#define CAN_F6R2_FB12_Msk                    (0x1UL << CAN_F6R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F6R2_FB12                        CAN_F6R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F6R2_FB13_Pos                    (13U)                             \n#define CAN_F6R2_FB13_Msk                    (0x1UL << CAN_F6R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F6R2_FB13                        CAN_F6R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F6R2_FB14_Pos                    (14U)                             \n#define CAN_F6R2_FB14_Msk                    (0x1UL << CAN_F6R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F6R2_FB14                        CAN_F6R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F6R2_FB15_Pos                    (15U)                             \n#define CAN_F6R2_FB15_Msk                    (0x1UL << CAN_F6R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F6R2_FB15                        CAN_F6R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F6R2_FB16_Pos                    (16U)                             \n#define CAN_F6R2_FB16_Msk                    (0x1UL << CAN_F6R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F6R2_FB16                        CAN_F6R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F6R2_FB17_Pos                    (17U)                             \n#define CAN_F6R2_FB17_Msk                    (0x1UL << CAN_F6R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F6R2_FB17                        CAN_F6R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F6R2_FB18_Pos                    (18U)                             \n#define CAN_F6R2_FB18_Msk                    (0x1UL << CAN_F6R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F6R2_FB18                        CAN_F6R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F6R2_FB19_Pos                    (19U)                             \n#define CAN_F6R2_FB19_Msk                    (0x1UL << CAN_F6R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F6R2_FB19                        CAN_F6R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F6R2_FB20_Pos                    (20U)                             \n#define CAN_F6R2_FB20_Msk                    (0x1UL << CAN_F6R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F6R2_FB20                        CAN_F6R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F6R2_FB21_Pos                    (21U)                             \n#define CAN_F6R2_FB21_Msk                    (0x1UL << CAN_F6R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F6R2_FB21                        CAN_F6R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F6R2_FB22_Pos                    (22U)                             \n#define CAN_F6R2_FB22_Msk                    (0x1UL << CAN_F6R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F6R2_FB22                        CAN_F6R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F6R2_FB23_Pos                    (23U)                             \n#define CAN_F6R2_FB23_Msk                    (0x1UL << CAN_F6R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F6R2_FB23                        CAN_F6R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F6R2_FB24_Pos                    (24U)                             \n#define CAN_F6R2_FB24_Msk                    (0x1UL << CAN_F6R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F6R2_FB24                        CAN_F6R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F6R2_FB25_Pos                    (25U)                             \n#define CAN_F6R2_FB25_Msk                    (0x1UL << CAN_F6R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F6R2_FB25                        CAN_F6R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F6R2_FB26_Pos                    (26U)                             \n#define CAN_F6R2_FB26_Msk                    (0x1UL << CAN_F6R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F6R2_FB26                        CAN_F6R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F6R2_FB27_Pos                    (27U)                             \n#define CAN_F6R2_FB27_Msk                    (0x1UL << CAN_F6R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F6R2_FB27                        CAN_F6R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F6R2_FB28_Pos                    (28U)                             \n#define CAN_F6R2_FB28_Msk                    (0x1UL << CAN_F6R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F6R2_FB28                        CAN_F6R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F6R2_FB29_Pos                    (29U)                             \n#define CAN_F6R2_FB29_Msk                    (0x1UL << CAN_F6R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F6R2_FB29                        CAN_F6R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F6R2_FB30_Pos                    (30U)                             \n#define CAN_F6R2_FB30_Msk                    (0x1UL << CAN_F6R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F6R2_FB30                        CAN_F6R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F6R2_FB31_Pos                    (31U)                             \n#define CAN_F6R2_FB31_Msk                    (0x1UL << CAN_F6R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F6R2_FB31                        CAN_F6R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F7R2 register  *******************/\n#define CAN_F7R2_FB0_Pos                     (0U)                              \n#define CAN_F7R2_FB0_Msk                     (0x1UL << CAN_F7R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F7R2_FB0                         CAN_F7R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F7R2_FB1_Pos                     (1U)                              \n#define CAN_F7R2_FB1_Msk                     (0x1UL << CAN_F7R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F7R2_FB1                         CAN_F7R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F7R2_FB2_Pos                     (2U)                              \n#define CAN_F7R2_FB2_Msk                     (0x1UL << CAN_F7R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F7R2_FB2                         CAN_F7R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F7R2_FB3_Pos                     (3U)                              \n#define CAN_F7R2_FB3_Msk                     (0x1UL << CAN_F7R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F7R2_FB3                         CAN_F7R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F7R2_FB4_Pos                     (4U)                              \n#define CAN_F7R2_FB4_Msk                     (0x1UL << CAN_F7R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F7R2_FB4                         CAN_F7R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F7R2_FB5_Pos                     (5U)                              \n#define CAN_F7R2_FB5_Msk                     (0x1UL << CAN_F7R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F7R2_FB5                         CAN_F7R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F7R2_FB6_Pos                     (6U)                              \n#define CAN_F7R2_FB6_Msk                     (0x1UL << CAN_F7R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F7R2_FB6                         CAN_F7R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F7R2_FB7_Pos                     (7U)                              \n#define CAN_F7R2_FB7_Msk                     (0x1UL << CAN_F7R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F7R2_FB7                         CAN_F7R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F7R2_FB8_Pos                     (8U)                              \n#define CAN_F7R2_FB8_Msk                     (0x1UL << CAN_F7R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F7R2_FB8                         CAN_F7R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F7R2_FB9_Pos                     (9U)                              \n#define CAN_F7R2_FB9_Msk                     (0x1UL << CAN_F7R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F7R2_FB9                         CAN_F7R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F7R2_FB10_Pos                    (10U)                             \n#define CAN_F7R2_FB10_Msk                    (0x1UL << CAN_F7R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F7R2_FB10                        CAN_F7R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F7R2_FB11_Pos                    (11U)                             \n#define CAN_F7R2_FB11_Msk                    (0x1UL << CAN_F7R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F7R2_FB11                        CAN_F7R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F7R2_FB12_Pos                    (12U)                             \n#define CAN_F7R2_FB12_Msk                    (0x1UL << CAN_F7R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F7R2_FB12                        CAN_F7R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F7R2_FB13_Pos                    (13U)                             \n#define CAN_F7R2_FB13_Msk                    (0x1UL << CAN_F7R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F7R2_FB13                        CAN_F7R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F7R2_FB14_Pos                    (14U)                             \n#define CAN_F7R2_FB14_Msk                    (0x1UL << CAN_F7R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F7R2_FB14                        CAN_F7R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F7R2_FB15_Pos                    (15U)                             \n#define CAN_F7R2_FB15_Msk                    (0x1UL << CAN_F7R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F7R2_FB15                        CAN_F7R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F7R2_FB16_Pos                    (16U)                             \n#define CAN_F7R2_FB16_Msk                    (0x1UL << CAN_F7R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F7R2_FB16                        CAN_F7R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F7R2_FB17_Pos                    (17U)                             \n#define CAN_F7R2_FB17_Msk                    (0x1UL << CAN_F7R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F7R2_FB17                        CAN_F7R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F7R2_FB18_Pos                    (18U)                             \n#define CAN_F7R2_FB18_Msk                    (0x1UL << CAN_F7R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F7R2_FB18                        CAN_F7R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F7R2_FB19_Pos                    (19U)                             \n#define CAN_F7R2_FB19_Msk                    (0x1UL << CAN_F7R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F7R2_FB19                        CAN_F7R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F7R2_FB20_Pos                    (20U)                             \n#define CAN_F7R2_FB20_Msk                    (0x1UL << CAN_F7R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F7R2_FB20                        CAN_F7R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F7R2_FB21_Pos                    (21U)                             \n#define CAN_F7R2_FB21_Msk                    (0x1UL << CAN_F7R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F7R2_FB21                        CAN_F7R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F7R2_FB22_Pos                    (22U)                             \n#define CAN_F7R2_FB22_Msk                    (0x1UL << CAN_F7R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F7R2_FB22                        CAN_F7R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F7R2_FB23_Pos                    (23U)                             \n#define CAN_F7R2_FB23_Msk                    (0x1UL << CAN_F7R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F7R2_FB23                        CAN_F7R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F7R2_FB24_Pos                    (24U)                             \n#define CAN_F7R2_FB24_Msk                    (0x1UL << CAN_F7R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F7R2_FB24                        CAN_F7R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F7R2_FB25_Pos                    (25U)                             \n#define CAN_F7R2_FB25_Msk                    (0x1UL << CAN_F7R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F7R2_FB25                        CAN_F7R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F7R2_FB26_Pos                    (26U)                             \n#define CAN_F7R2_FB26_Msk                    (0x1UL << CAN_F7R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F7R2_FB26                        CAN_F7R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F7R2_FB27_Pos                    (27U)                             \n#define CAN_F7R2_FB27_Msk                    (0x1UL << CAN_F7R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F7R2_FB27                        CAN_F7R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F7R2_FB28_Pos                    (28U)                             \n#define CAN_F7R2_FB28_Msk                    (0x1UL << CAN_F7R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F7R2_FB28                        CAN_F7R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F7R2_FB29_Pos                    (29U)                             \n#define CAN_F7R2_FB29_Msk                    (0x1UL << CAN_F7R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F7R2_FB29                        CAN_F7R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F7R2_FB30_Pos                    (30U)                             \n#define CAN_F7R2_FB30_Msk                    (0x1UL << CAN_F7R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F7R2_FB30                        CAN_F7R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F7R2_FB31_Pos                    (31U)                             \n#define CAN_F7R2_FB31_Msk                    (0x1UL << CAN_F7R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F7R2_FB31                        CAN_F7R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F8R2 register  *******************/\n#define CAN_F8R2_FB0_Pos                     (0U)                              \n#define CAN_F8R2_FB0_Msk                     (0x1UL << CAN_F8R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F8R2_FB0                         CAN_F8R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F8R2_FB1_Pos                     (1U)                              \n#define CAN_F8R2_FB1_Msk                     (0x1UL << CAN_F8R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F8R2_FB1                         CAN_F8R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F8R2_FB2_Pos                     (2U)                              \n#define CAN_F8R2_FB2_Msk                     (0x1UL << CAN_F8R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F8R2_FB2                         CAN_F8R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F8R2_FB3_Pos                     (3U)                              \n#define CAN_F8R2_FB3_Msk                     (0x1UL << CAN_F8R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F8R2_FB3                         CAN_F8R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F8R2_FB4_Pos                     (4U)                              \n#define CAN_F8R2_FB4_Msk                     (0x1UL << CAN_F8R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F8R2_FB4                         CAN_F8R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F8R2_FB5_Pos                     (5U)                              \n#define CAN_F8R2_FB5_Msk                     (0x1UL << CAN_F8R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F8R2_FB5                         CAN_F8R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F8R2_FB6_Pos                     (6U)                              \n#define CAN_F8R2_FB6_Msk                     (0x1UL << CAN_F8R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F8R2_FB6                         CAN_F8R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F8R2_FB7_Pos                     (7U)                              \n#define CAN_F8R2_FB7_Msk                     (0x1UL << CAN_F8R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F8R2_FB7                         CAN_F8R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F8R2_FB8_Pos                     (8U)                              \n#define CAN_F8R2_FB8_Msk                     (0x1UL << CAN_F8R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F8R2_FB8                         CAN_F8R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F8R2_FB9_Pos                     (9U)                              \n#define CAN_F8R2_FB9_Msk                     (0x1UL << CAN_F8R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F8R2_FB9                         CAN_F8R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F8R2_FB10_Pos                    (10U)                             \n#define CAN_F8R2_FB10_Msk                    (0x1UL << CAN_F8R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F8R2_FB10                        CAN_F8R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F8R2_FB11_Pos                    (11U)                             \n#define CAN_F8R2_FB11_Msk                    (0x1UL << CAN_F8R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F8R2_FB11                        CAN_F8R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F8R2_FB12_Pos                    (12U)                             \n#define CAN_F8R2_FB12_Msk                    (0x1UL << CAN_F8R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F8R2_FB12                        CAN_F8R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F8R2_FB13_Pos                    (13U)                             \n#define CAN_F8R2_FB13_Msk                    (0x1UL << CAN_F8R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F8R2_FB13                        CAN_F8R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F8R2_FB14_Pos                    (14U)                             \n#define CAN_F8R2_FB14_Msk                    (0x1UL << CAN_F8R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F8R2_FB14                        CAN_F8R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F8R2_FB15_Pos                    (15U)                             \n#define CAN_F8R2_FB15_Msk                    (0x1UL << CAN_F8R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F8R2_FB15                        CAN_F8R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F8R2_FB16_Pos                    (16U)                             \n#define CAN_F8R2_FB16_Msk                    (0x1UL << CAN_F8R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F8R2_FB16                        CAN_F8R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F8R2_FB17_Pos                    (17U)                             \n#define CAN_F8R2_FB17_Msk                    (0x1UL << CAN_F8R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F8R2_FB17                        CAN_F8R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F8R2_FB18_Pos                    (18U)                             \n#define CAN_F8R2_FB18_Msk                    (0x1UL << CAN_F8R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F8R2_FB18                        CAN_F8R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F8R2_FB19_Pos                    (19U)                             \n#define CAN_F8R2_FB19_Msk                    (0x1UL << CAN_F8R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F8R2_FB19                        CAN_F8R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F8R2_FB20_Pos                    (20U)                             \n#define CAN_F8R2_FB20_Msk                    (0x1UL << CAN_F8R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F8R2_FB20                        CAN_F8R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F8R2_FB21_Pos                    (21U)                             \n#define CAN_F8R2_FB21_Msk                    (0x1UL << CAN_F8R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F8R2_FB21                        CAN_F8R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F8R2_FB22_Pos                    (22U)                             \n#define CAN_F8R2_FB22_Msk                    (0x1UL << CAN_F8R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F8R2_FB22                        CAN_F8R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F8R2_FB23_Pos                    (23U)                             \n#define CAN_F8R2_FB23_Msk                    (0x1UL << CAN_F8R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F8R2_FB23                        CAN_F8R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F8R2_FB24_Pos                    (24U)                             \n#define CAN_F8R2_FB24_Msk                    (0x1UL << CAN_F8R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F8R2_FB24                        CAN_F8R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F8R2_FB25_Pos                    (25U)                             \n#define CAN_F8R2_FB25_Msk                    (0x1UL << CAN_F8R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F8R2_FB25                        CAN_F8R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F8R2_FB26_Pos                    (26U)                             \n#define CAN_F8R2_FB26_Msk                    (0x1UL << CAN_F8R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F8R2_FB26                        CAN_F8R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F8R2_FB27_Pos                    (27U)                             \n#define CAN_F8R2_FB27_Msk                    (0x1UL << CAN_F8R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F8R2_FB27                        CAN_F8R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F8R2_FB28_Pos                    (28U)                             \n#define CAN_F8R2_FB28_Msk                    (0x1UL << CAN_F8R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F8R2_FB28                        CAN_F8R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F8R2_FB29_Pos                    (29U)                             \n#define CAN_F8R2_FB29_Msk                    (0x1UL << CAN_F8R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F8R2_FB29                        CAN_F8R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F8R2_FB30_Pos                    (30U)                             \n#define CAN_F8R2_FB30_Msk                    (0x1UL << CAN_F8R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F8R2_FB30                        CAN_F8R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F8R2_FB31_Pos                    (31U)                             \n#define CAN_F8R2_FB31_Msk                    (0x1UL << CAN_F8R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F8R2_FB31                        CAN_F8R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F9R2 register  *******************/\n#define CAN_F9R2_FB0_Pos                     (0U)                              \n#define CAN_F9R2_FB0_Msk                     (0x1UL << CAN_F9R2_FB0_Pos)        /*!< 0x00000001 */\n#define CAN_F9R2_FB0                         CAN_F9R2_FB0_Msk                  /*!< Filter bit 0 */\n#define CAN_F9R2_FB1_Pos                     (1U)                              \n#define CAN_F9R2_FB1_Msk                     (0x1UL << CAN_F9R2_FB1_Pos)        /*!< 0x00000002 */\n#define CAN_F9R2_FB1                         CAN_F9R2_FB1_Msk                  /*!< Filter bit 1 */\n#define CAN_F9R2_FB2_Pos                     (2U)                              \n#define CAN_F9R2_FB2_Msk                     (0x1UL << CAN_F9R2_FB2_Pos)        /*!< 0x00000004 */\n#define CAN_F9R2_FB2                         CAN_F9R2_FB2_Msk                  /*!< Filter bit 2 */\n#define CAN_F9R2_FB3_Pos                     (3U)                              \n#define CAN_F9R2_FB3_Msk                     (0x1UL << CAN_F9R2_FB3_Pos)        /*!< 0x00000008 */\n#define CAN_F9R2_FB3                         CAN_F9R2_FB3_Msk                  /*!< Filter bit 3 */\n#define CAN_F9R2_FB4_Pos                     (4U)                              \n#define CAN_F9R2_FB4_Msk                     (0x1UL << CAN_F9R2_FB4_Pos)        /*!< 0x00000010 */\n#define CAN_F9R2_FB4                         CAN_F9R2_FB4_Msk                  /*!< Filter bit 4 */\n#define CAN_F9R2_FB5_Pos                     (5U)                              \n#define CAN_F9R2_FB5_Msk                     (0x1UL << CAN_F9R2_FB5_Pos)        /*!< 0x00000020 */\n#define CAN_F9R2_FB5                         CAN_F9R2_FB5_Msk                  /*!< Filter bit 5 */\n#define CAN_F9R2_FB6_Pos                     (6U)                              \n#define CAN_F9R2_FB6_Msk                     (0x1UL << CAN_F9R2_FB6_Pos)        /*!< 0x00000040 */\n#define CAN_F9R2_FB6                         CAN_F9R2_FB6_Msk                  /*!< Filter bit 6 */\n#define CAN_F9R2_FB7_Pos                     (7U)                              \n#define CAN_F9R2_FB7_Msk                     (0x1UL << CAN_F9R2_FB7_Pos)        /*!< 0x00000080 */\n#define CAN_F9R2_FB7                         CAN_F9R2_FB7_Msk                  /*!< Filter bit 7 */\n#define CAN_F9R2_FB8_Pos                     (8U)                              \n#define CAN_F9R2_FB8_Msk                     (0x1UL << CAN_F9R2_FB8_Pos)        /*!< 0x00000100 */\n#define CAN_F9R2_FB8                         CAN_F9R2_FB8_Msk                  /*!< Filter bit 8 */\n#define CAN_F9R2_FB9_Pos                     (9U)                              \n#define CAN_F9R2_FB9_Msk                     (0x1UL << CAN_F9R2_FB9_Pos)        /*!< 0x00000200 */\n#define CAN_F9R2_FB9                         CAN_F9R2_FB9_Msk                  /*!< Filter bit 9 */\n#define CAN_F9R2_FB10_Pos                    (10U)                             \n#define CAN_F9R2_FB10_Msk                    (0x1UL << CAN_F9R2_FB10_Pos)       /*!< 0x00000400 */\n#define CAN_F9R2_FB10                        CAN_F9R2_FB10_Msk                 /*!< Filter bit 10 */\n#define CAN_F9R2_FB11_Pos                    (11U)                             \n#define CAN_F9R2_FB11_Msk                    (0x1UL << CAN_F9R2_FB11_Pos)       /*!< 0x00000800 */\n#define CAN_F9R2_FB11                        CAN_F9R2_FB11_Msk                 /*!< Filter bit 11 */\n#define CAN_F9R2_FB12_Pos                    (12U)                             \n#define CAN_F9R2_FB12_Msk                    (0x1UL << CAN_F9R2_FB12_Pos)       /*!< 0x00001000 */\n#define CAN_F9R2_FB12                        CAN_F9R2_FB12_Msk                 /*!< Filter bit 12 */\n#define CAN_F9R2_FB13_Pos                    (13U)                             \n#define CAN_F9R2_FB13_Msk                    (0x1UL << CAN_F9R2_FB13_Pos)       /*!< 0x00002000 */\n#define CAN_F9R2_FB13                        CAN_F9R2_FB13_Msk                 /*!< Filter bit 13 */\n#define CAN_F9R2_FB14_Pos                    (14U)                             \n#define CAN_F9R2_FB14_Msk                    (0x1UL << CAN_F9R2_FB14_Pos)       /*!< 0x00004000 */\n#define CAN_F9R2_FB14                        CAN_F9R2_FB14_Msk                 /*!< Filter bit 14 */\n#define CAN_F9R2_FB15_Pos                    (15U)                             \n#define CAN_F9R2_FB15_Msk                    (0x1UL << CAN_F9R2_FB15_Pos)       /*!< 0x00008000 */\n#define CAN_F9R2_FB15                        CAN_F9R2_FB15_Msk                 /*!< Filter bit 15 */\n#define CAN_F9R2_FB16_Pos                    (16U)                             \n#define CAN_F9R2_FB16_Msk                    (0x1UL << CAN_F9R2_FB16_Pos)       /*!< 0x00010000 */\n#define CAN_F9R2_FB16                        CAN_F9R2_FB16_Msk                 /*!< Filter bit 16 */\n#define CAN_F9R2_FB17_Pos                    (17U)                             \n#define CAN_F9R2_FB17_Msk                    (0x1UL << CAN_F9R2_FB17_Pos)       /*!< 0x00020000 */\n#define CAN_F9R2_FB17                        CAN_F9R2_FB17_Msk                 /*!< Filter bit 17 */\n#define CAN_F9R2_FB18_Pos                    (18U)                             \n#define CAN_F9R2_FB18_Msk                    (0x1UL << CAN_F9R2_FB18_Pos)       /*!< 0x00040000 */\n#define CAN_F9R2_FB18                        CAN_F9R2_FB18_Msk                 /*!< Filter bit 18 */\n#define CAN_F9R2_FB19_Pos                    (19U)                             \n#define CAN_F9R2_FB19_Msk                    (0x1UL << CAN_F9R2_FB19_Pos)       /*!< 0x00080000 */\n#define CAN_F9R2_FB19                        CAN_F9R2_FB19_Msk                 /*!< Filter bit 19 */\n#define CAN_F9R2_FB20_Pos                    (20U)                             \n#define CAN_F9R2_FB20_Msk                    (0x1UL << CAN_F9R2_FB20_Pos)       /*!< 0x00100000 */\n#define CAN_F9R2_FB20                        CAN_F9R2_FB20_Msk                 /*!< Filter bit 20 */\n#define CAN_F9R2_FB21_Pos                    (21U)                             \n#define CAN_F9R2_FB21_Msk                    (0x1UL << CAN_F9R2_FB21_Pos)       /*!< 0x00200000 */\n#define CAN_F9R2_FB21                        CAN_F9R2_FB21_Msk                 /*!< Filter bit 21 */\n#define CAN_F9R2_FB22_Pos                    (22U)                             \n#define CAN_F9R2_FB22_Msk                    (0x1UL << CAN_F9R2_FB22_Pos)       /*!< 0x00400000 */\n#define CAN_F9R2_FB22                        CAN_F9R2_FB22_Msk                 /*!< Filter bit 22 */\n#define CAN_F9R2_FB23_Pos                    (23U)                             \n#define CAN_F9R2_FB23_Msk                    (0x1UL << CAN_F9R2_FB23_Pos)       /*!< 0x00800000 */\n#define CAN_F9R2_FB23                        CAN_F9R2_FB23_Msk                 /*!< Filter bit 23 */\n#define CAN_F9R2_FB24_Pos                    (24U)                             \n#define CAN_F9R2_FB24_Msk                    (0x1UL << CAN_F9R2_FB24_Pos)       /*!< 0x01000000 */\n#define CAN_F9R2_FB24                        CAN_F9R2_FB24_Msk                 /*!< Filter bit 24 */\n#define CAN_F9R2_FB25_Pos                    (25U)                             \n#define CAN_F9R2_FB25_Msk                    (0x1UL << CAN_F9R2_FB25_Pos)       /*!< 0x02000000 */\n#define CAN_F9R2_FB25                        CAN_F9R2_FB25_Msk                 /*!< Filter bit 25 */\n#define CAN_F9R2_FB26_Pos                    (26U)                             \n#define CAN_F9R2_FB26_Msk                    (0x1UL << CAN_F9R2_FB26_Pos)       /*!< 0x04000000 */\n#define CAN_F9R2_FB26                        CAN_F9R2_FB26_Msk                 /*!< Filter bit 26 */\n#define CAN_F9R2_FB27_Pos                    (27U)                             \n#define CAN_F9R2_FB27_Msk                    (0x1UL << CAN_F9R2_FB27_Pos)       /*!< 0x08000000 */\n#define CAN_F9R2_FB27                        CAN_F9R2_FB27_Msk                 /*!< Filter bit 27 */\n#define CAN_F9R2_FB28_Pos                    (28U)                             \n#define CAN_F9R2_FB28_Msk                    (0x1UL << CAN_F9R2_FB28_Pos)       /*!< 0x10000000 */\n#define CAN_F9R2_FB28                        CAN_F9R2_FB28_Msk                 /*!< Filter bit 28 */\n#define CAN_F9R2_FB29_Pos                    (29U)                             \n#define CAN_F9R2_FB29_Msk                    (0x1UL << CAN_F9R2_FB29_Pos)       /*!< 0x20000000 */\n#define CAN_F9R2_FB29                        CAN_F9R2_FB29_Msk                 /*!< Filter bit 29 */\n#define CAN_F9R2_FB30_Pos                    (30U)                             \n#define CAN_F9R2_FB30_Msk                    (0x1UL << CAN_F9R2_FB30_Pos)       /*!< 0x40000000 */\n#define CAN_F9R2_FB30                        CAN_F9R2_FB30_Msk                 /*!< Filter bit 30 */\n#define CAN_F9R2_FB31_Pos                    (31U)                             \n#define CAN_F9R2_FB31_Msk                    (0x1UL << CAN_F9R2_FB31_Pos)       /*!< 0x80000000 */\n#define CAN_F9R2_FB31                        CAN_F9R2_FB31_Msk                 /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F10R2 register  ******************/\n#define CAN_F10R2_FB0_Pos                    (0U)                              \n#define CAN_F10R2_FB0_Msk                    (0x1UL << CAN_F10R2_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F10R2_FB0                        CAN_F10R2_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F10R2_FB1_Pos                    (1U)                              \n#define CAN_F10R2_FB1_Msk                    (0x1UL << CAN_F10R2_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F10R2_FB1                        CAN_F10R2_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F10R2_FB2_Pos                    (2U)                              \n#define CAN_F10R2_FB2_Msk                    (0x1UL << CAN_F10R2_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F10R2_FB2                        CAN_F10R2_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F10R2_FB3_Pos                    (3U)                              \n#define CAN_F10R2_FB3_Msk                    (0x1UL << CAN_F10R2_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F10R2_FB3                        CAN_F10R2_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F10R2_FB4_Pos                    (4U)                              \n#define CAN_F10R2_FB4_Msk                    (0x1UL << CAN_F10R2_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F10R2_FB4                        CAN_F10R2_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F10R2_FB5_Pos                    (5U)                              \n#define CAN_F10R2_FB5_Msk                    (0x1UL << CAN_F10R2_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F10R2_FB5                        CAN_F10R2_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F10R2_FB6_Pos                    (6U)                              \n#define CAN_F10R2_FB6_Msk                    (0x1UL << CAN_F10R2_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F10R2_FB6                        CAN_F10R2_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F10R2_FB7_Pos                    (7U)                              \n#define CAN_F10R2_FB7_Msk                    (0x1UL << CAN_F10R2_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F10R2_FB7                        CAN_F10R2_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F10R2_FB8_Pos                    (8U)                              \n#define CAN_F10R2_FB8_Msk                    (0x1UL << CAN_F10R2_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F10R2_FB8                        CAN_F10R2_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F10R2_FB9_Pos                    (9U)                              \n#define CAN_F10R2_FB9_Msk                    (0x1UL << CAN_F10R2_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F10R2_FB9                        CAN_F10R2_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F10R2_FB10_Pos                   (10U)                             \n#define CAN_F10R2_FB10_Msk                   (0x1UL << CAN_F10R2_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F10R2_FB10                       CAN_F10R2_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F10R2_FB11_Pos                   (11U)                             \n#define CAN_F10R2_FB11_Msk                   (0x1UL << CAN_F10R2_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F10R2_FB11                       CAN_F10R2_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F10R2_FB12_Pos                   (12U)                             \n#define CAN_F10R2_FB12_Msk                   (0x1UL << CAN_F10R2_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F10R2_FB12                       CAN_F10R2_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F10R2_FB13_Pos                   (13U)                             \n#define CAN_F10R2_FB13_Msk                   (0x1UL << CAN_F10R2_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F10R2_FB13                       CAN_F10R2_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F10R2_FB14_Pos                   (14U)                             \n#define CAN_F10R2_FB14_Msk                   (0x1UL << CAN_F10R2_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F10R2_FB14                       CAN_F10R2_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F10R2_FB15_Pos                   (15U)                             \n#define CAN_F10R2_FB15_Msk                   (0x1UL << CAN_F10R2_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F10R2_FB15                       CAN_F10R2_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F10R2_FB16_Pos                   (16U)                             \n#define CAN_F10R2_FB16_Msk                   (0x1UL << CAN_F10R2_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F10R2_FB16                       CAN_F10R2_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F10R2_FB17_Pos                   (17U)                             \n#define CAN_F10R2_FB17_Msk                   (0x1UL << CAN_F10R2_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F10R2_FB17                       CAN_F10R2_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F10R2_FB18_Pos                   (18U)                             \n#define CAN_F10R2_FB18_Msk                   (0x1UL << CAN_F10R2_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F10R2_FB18                       CAN_F10R2_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F10R2_FB19_Pos                   (19U)                             \n#define CAN_F10R2_FB19_Msk                   (0x1UL << CAN_F10R2_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F10R2_FB19                       CAN_F10R2_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F10R2_FB20_Pos                   (20U)                             \n#define CAN_F10R2_FB20_Msk                   (0x1UL << CAN_F10R2_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F10R2_FB20                       CAN_F10R2_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F10R2_FB21_Pos                   (21U)                             \n#define CAN_F10R2_FB21_Msk                   (0x1UL << CAN_F10R2_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F10R2_FB21                       CAN_F10R2_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F10R2_FB22_Pos                   (22U)                             \n#define CAN_F10R2_FB22_Msk                   (0x1UL << CAN_F10R2_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F10R2_FB22                       CAN_F10R2_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F10R2_FB23_Pos                   (23U)                             \n#define CAN_F10R2_FB23_Msk                   (0x1UL << CAN_F10R2_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F10R2_FB23                       CAN_F10R2_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F10R2_FB24_Pos                   (24U)                             \n#define CAN_F10R2_FB24_Msk                   (0x1UL << CAN_F10R2_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F10R2_FB24                       CAN_F10R2_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F10R2_FB25_Pos                   (25U)                             \n#define CAN_F10R2_FB25_Msk                   (0x1UL << CAN_F10R2_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F10R2_FB25                       CAN_F10R2_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F10R2_FB26_Pos                   (26U)                             \n#define CAN_F10R2_FB26_Msk                   (0x1UL << CAN_F10R2_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F10R2_FB26                       CAN_F10R2_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F10R2_FB27_Pos                   (27U)                             \n#define CAN_F10R2_FB27_Msk                   (0x1UL << CAN_F10R2_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F10R2_FB27                       CAN_F10R2_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F10R2_FB28_Pos                   (28U)                             \n#define CAN_F10R2_FB28_Msk                   (0x1UL << CAN_F10R2_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F10R2_FB28                       CAN_F10R2_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F10R2_FB29_Pos                   (29U)                             \n#define CAN_F10R2_FB29_Msk                   (0x1UL << CAN_F10R2_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F10R2_FB29                       CAN_F10R2_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F10R2_FB30_Pos                   (30U)                             \n#define CAN_F10R2_FB30_Msk                   (0x1UL << CAN_F10R2_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F10R2_FB30                       CAN_F10R2_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F10R2_FB31_Pos                   (31U)                             \n#define CAN_F10R2_FB31_Msk                   (0x1UL << CAN_F10R2_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F10R2_FB31                       CAN_F10R2_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F11R2 register  ******************/\n#define CAN_F11R2_FB0_Pos                    (0U)                              \n#define CAN_F11R2_FB0_Msk                    (0x1UL << CAN_F11R2_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F11R2_FB0                        CAN_F11R2_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F11R2_FB1_Pos                    (1U)                              \n#define CAN_F11R2_FB1_Msk                    (0x1UL << CAN_F11R2_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F11R2_FB1                        CAN_F11R2_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F11R2_FB2_Pos                    (2U)                              \n#define CAN_F11R2_FB2_Msk                    (0x1UL << CAN_F11R2_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F11R2_FB2                        CAN_F11R2_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F11R2_FB3_Pos                    (3U)                              \n#define CAN_F11R2_FB3_Msk                    (0x1UL << CAN_F11R2_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F11R2_FB3                        CAN_F11R2_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F11R2_FB4_Pos                    (4U)                              \n#define CAN_F11R2_FB4_Msk                    (0x1UL << CAN_F11R2_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F11R2_FB4                        CAN_F11R2_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F11R2_FB5_Pos                    (5U)                              \n#define CAN_F11R2_FB5_Msk                    (0x1UL << CAN_F11R2_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F11R2_FB5                        CAN_F11R2_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F11R2_FB6_Pos                    (6U)                              \n#define CAN_F11R2_FB6_Msk                    (0x1UL << CAN_F11R2_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F11R2_FB6                        CAN_F11R2_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F11R2_FB7_Pos                    (7U)                              \n#define CAN_F11R2_FB7_Msk                    (0x1UL << CAN_F11R2_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F11R2_FB7                        CAN_F11R2_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F11R2_FB8_Pos                    (8U)                              \n#define CAN_F11R2_FB8_Msk                    (0x1UL << CAN_F11R2_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F11R2_FB8                        CAN_F11R2_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F11R2_FB9_Pos                    (9U)                              \n#define CAN_F11R2_FB9_Msk                    (0x1UL << CAN_F11R2_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F11R2_FB9                        CAN_F11R2_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F11R2_FB10_Pos                   (10U)                             \n#define CAN_F11R2_FB10_Msk                   (0x1UL << CAN_F11R2_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F11R2_FB10                       CAN_F11R2_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F11R2_FB11_Pos                   (11U)                             \n#define CAN_F11R2_FB11_Msk                   (0x1UL << CAN_F11R2_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F11R2_FB11                       CAN_F11R2_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F11R2_FB12_Pos                   (12U)                             \n#define CAN_F11R2_FB12_Msk                   (0x1UL << CAN_F11R2_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F11R2_FB12                       CAN_F11R2_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F11R2_FB13_Pos                   (13U)                             \n#define CAN_F11R2_FB13_Msk                   (0x1UL << CAN_F11R2_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F11R2_FB13                       CAN_F11R2_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F11R2_FB14_Pos                   (14U)                             \n#define CAN_F11R2_FB14_Msk                   (0x1UL << CAN_F11R2_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F11R2_FB14                       CAN_F11R2_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F11R2_FB15_Pos                   (15U)                             \n#define CAN_F11R2_FB15_Msk                   (0x1UL << CAN_F11R2_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F11R2_FB15                       CAN_F11R2_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F11R2_FB16_Pos                   (16U)                             \n#define CAN_F11R2_FB16_Msk                   (0x1UL << CAN_F11R2_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F11R2_FB16                       CAN_F11R2_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F11R2_FB17_Pos                   (17U)                             \n#define CAN_F11R2_FB17_Msk                   (0x1UL << CAN_F11R2_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F11R2_FB17                       CAN_F11R2_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F11R2_FB18_Pos                   (18U)                             \n#define CAN_F11R2_FB18_Msk                   (0x1UL << CAN_F11R2_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F11R2_FB18                       CAN_F11R2_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F11R2_FB19_Pos                   (19U)                             \n#define CAN_F11R2_FB19_Msk                   (0x1UL << CAN_F11R2_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F11R2_FB19                       CAN_F11R2_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F11R2_FB20_Pos                   (20U)                             \n#define CAN_F11R2_FB20_Msk                   (0x1UL << CAN_F11R2_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F11R2_FB20                       CAN_F11R2_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F11R2_FB21_Pos                   (21U)                             \n#define CAN_F11R2_FB21_Msk                   (0x1UL << CAN_F11R2_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F11R2_FB21                       CAN_F11R2_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F11R2_FB22_Pos                   (22U)                             \n#define CAN_F11R2_FB22_Msk                   (0x1UL << CAN_F11R2_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F11R2_FB22                       CAN_F11R2_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F11R2_FB23_Pos                   (23U)                             \n#define CAN_F11R2_FB23_Msk                   (0x1UL << CAN_F11R2_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F11R2_FB23                       CAN_F11R2_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F11R2_FB24_Pos                   (24U)                             \n#define CAN_F11R2_FB24_Msk                   (0x1UL << CAN_F11R2_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F11R2_FB24                       CAN_F11R2_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F11R2_FB25_Pos                   (25U)                             \n#define CAN_F11R2_FB25_Msk                   (0x1UL << CAN_F11R2_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F11R2_FB25                       CAN_F11R2_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F11R2_FB26_Pos                   (26U)                             \n#define CAN_F11R2_FB26_Msk                   (0x1UL << CAN_F11R2_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F11R2_FB26                       CAN_F11R2_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F11R2_FB27_Pos                   (27U)                             \n#define CAN_F11R2_FB27_Msk                   (0x1UL << CAN_F11R2_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F11R2_FB27                       CAN_F11R2_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F11R2_FB28_Pos                   (28U)                             \n#define CAN_F11R2_FB28_Msk                   (0x1UL << CAN_F11R2_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F11R2_FB28                       CAN_F11R2_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F11R2_FB29_Pos                   (29U)                             \n#define CAN_F11R2_FB29_Msk                   (0x1UL << CAN_F11R2_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F11R2_FB29                       CAN_F11R2_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F11R2_FB30_Pos                   (30U)                             \n#define CAN_F11R2_FB30_Msk                   (0x1UL << CAN_F11R2_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F11R2_FB30                       CAN_F11R2_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F11R2_FB31_Pos                   (31U)                             \n#define CAN_F11R2_FB31_Msk                   (0x1UL << CAN_F11R2_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F11R2_FB31                       CAN_F11R2_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F12R2 register  ******************/\n#define CAN_F12R2_FB0_Pos                    (0U)                              \n#define CAN_F12R2_FB0_Msk                    (0x1UL << CAN_F12R2_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F12R2_FB0                        CAN_F12R2_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F12R2_FB1_Pos                    (1U)                              \n#define CAN_F12R2_FB1_Msk                    (0x1UL << CAN_F12R2_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F12R2_FB1                        CAN_F12R2_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F12R2_FB2_Pos                    (2U)                              \n#define CAN_F12R2_FB2_Msk                    (0x1UL << CAN_F12R2_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F12R2_FB2                        CAN_F12R2_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F12R2_FB3_Pos                    (3U)                              \n#define CAN_F12R2_FB3_Msk                    (0x1UL << CAN_F12R2_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F12R2_FB3                        CAN_F12R2_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F12R2_FB4_Pos                    (4U)                              \n#define CAN_F12R2_FB4_Msk                    (0x1UL << CAN_F12R2_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F12R2_FB4                        CAN_F12R2_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F12R2_FB5_Pos                    (5U)                              \n#define CAN_F12R2_FB5_Msk                    (0x1UL << CAN_F12R2_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F12R2_FB5                        CAN_F12R2_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F12R2_FB6_Pos                    (6U)                              \n#define CAN_F12R2_FB6_Msk                    (0x1UL << CAN_F12R2_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F12R2_FB6                        CAN_F12R2_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F12R2_FB7_Pos                    (7U)                              \n#define CAN_F12R2_FB7_Msk                    (0x1UL << CAN_F12R2_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F12R2_FB7                        CAN_F12R2_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F12R2_FB8_Pos                    (8U)                              \n#define CAN_F12R2_FB8_Msk                    (0x1UL << CAN_F12R2_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F12R2_FB8                        CAN_F12R2_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F12R2_FB9_Pos                    (9U)                              \n#define CAN_F12R2_FB9_Msk                    (0x1UL << CAN_F12R2_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F12R2_FB9                        CAN_F12R2_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F12R2_FB10_Pos                   (10U)                             \n#define CAN_F12R2_FB10_Msk                   (0x1UL << CAN_F12R2_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F12R2_FB10                       CAN_F12R2_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F12R2_FB11_Pos                   (11U)                             \n#define CAN_F12R2_FB11_Msk                   (0x1UL << CAN_F12R2_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F12R2_FB11                       CAN_F12R2_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F12R2_FB12_Pos                   (12U)                             \n#define CAN_F12R2_FB12_Msk                   (0x1UL << CAN_F12R2_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F12R2_FB12                       CAN_F12R2_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F12R2_FB13_Pos                   (13U)                             \n#define CAN_F12R2_FB13_Msk                   (0x1UL << CAN_F12R2_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F12R2_FB13                       CAN_F12R2_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F12R2_FB14_Pos                   (14U)                             \n#define CAN_F12R2_FB14_Msk                   (0x1UL << CAN_F12R2_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F12R2_FB14                       CAN_F12R2_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F12R2_FB15_Pos                   (15U)                             \n#define CAN_F12R2_FB15_Msk                   (0x1UL << CAN_F12R2_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F12R2_FB15                       CAN_F12R2_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F12R2_FB16_Pos                   (16U)                             \n#define CAN_F12R2_FB16_Msk                   (0x1UL << CAN_F12R2_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F12R2_FB16                       CAN_F12R2_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F12R2_FB17_Pos                   (17U)                             \n#define CAN_F12R2_FB17_Msk                   (0x1UL << CAN_F12R2_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F12R2_FB17                       CAN_F12R2_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F12R2_FB18_Pos                   (18U)                             \n#define CAN_F12R2_FB18_Msk                   (0x1UL << CAN_F12R2_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F12R2_FB18                       CAN_F12R2_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F12R2_FB19_Pos                   (19U)                             \n#define CAN_F12R2_FB19_Msk                   (0x1UL << CAN_F12R2_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F12R2_FB19                       CAN_F12R2_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F12R2_FB20_Pos                   (20U)                             \n#define CAN_F12R2_FB20_Msk                   (0x1UL << CAN_F12R2_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F12R2_FB20                       CAN_F12R2_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F12R2_FB21_Pos                   (21U)                             \n#define CAN_F12R2_FB21_Msk                   (0x1UL << CAN_F12R2_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F12R2_FB21                       CAN_F12R2_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F12R2_FB22_Pos                   (22U)                             \n#define CAN_F12R2_FB22_Msk                   (0x1UL << CAN_F12R2_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F12R2_FB22                       CAN_F12R2_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F12R2_FB23_Pos                   (23U)                             \n#define CAN_F12R2_FB23_Msk                   (0x1UL << CAN_F12R2_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F12R2_FB23                       CAN_F12R2_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F12R2_FB24_Pos                   (24U)                             \n#define CAN_F12R2_FB24_Msk                   (0x1UL << CAN_F12R2_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F12R2_FB24                       CAN_F12R2_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F12R2_FB25_Pos                   (25U)                             \n#define CAN_F12R2_FB25_Msk                   (0x1UL << CAN_F12R2_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F12R2_FB25                       CAN_F12R2_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F12R2_FB26_Pos                   (26U)                             \n#define CAN_F12R2_FB26_Msk                   (0x1UL << CAN_F12R2_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F12R2_FB26                       CAN_F12R2_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F12R2_FB27_Pos                   (27U)                             \n#define CAN_F12R2_FB27_Msk                   (0x1UL << CAN_F12R2_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F12R2_FB27                       CAN_F12R2_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F12R2_FB28_Pos                   (28U)                             \n#define CAN_F12R2_FB28_Msk                   (0x1UL << CAN_F12R2_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F12R2_FB28                       CAN_F12R2_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F12R2_FB29_Pos                   (29U)                             \n#define CAN_F12R2_FB29_Msk                   (0x1UL << CAN_F12R2_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F12R2_FB29                       CAN_F12R2_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F12R2_FB30_Pos                   (30U)                             \n#define CAN_F12R2_FB30_Msk                   (0x1UL << CAN_F12R2_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F12R2_FB30                       CAN_F12R2_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F12R2_FB31_Pos                   (31U)                             \n#define CAN_F12R2_FB31_Msk                   (0x1UL << CAN_F12R2_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F12R2_FB31                       CAN_F12R2_FB31_Msk                /*!< Filter bit 31 */\n\n/*******************  Bit definition for CAN_F13R2 register  ******************/\n#define CAN_F13R2_FB0_Pos                    (0U)                              \n#define CAN_F13R2_FB0_Msk                    (0x1UL << CAN_F13R2_FB0_Pos)       /*!< 0x00000001 */\n#define CAN_F13R2_FB0                        CAN_F13R2_FB0_Msk                 /*!< Filter bit 0 */\n#define CAN_F13R2_FB1_Pos                    (1U)                              \n#define CAN_F13R2_FB1_Msk                    (0x1UL << CAN_F13R2_FB1_Pos)       /*!< 0x00000002 */\n#define CAN_F13R2_FB1                        CAN_F13R2_FB1_Msk                 /*!< Filter bit 1 */\n#define CAN_F13R2_FB2_Pos                    (2U)                              \n#define CAN_F13R2_FB2_Msk                    (0x1UL << CAN_F13R2_FB2_Pos)       /*!< 0x00000004 */\n#define CAN_F13R2_FB2                        CAN_F13R2_FB2_Msk                 /*!< Filter bit 2 */\n#define CAN_F13R2_FB3_Pos                    (3U)                              \n#define CAN_F13R2_FB3_Msk                    (0x1UL << CAN_F13R2_FB3_Pos)       /*!< 0x00000008 */\n#define CAN_F13R2_FB3                        CAN_F13R2_FB3_Msk                 /*!< Filter bit 3 */\n#define CAN_F13R2_FB4_Pos                    (4U)                              \n#define CAN_F13R2_FB4_Msk                    (0x1UL << CAN_F13R2_FB4_Pos)       /*!< 0x00000010 */\n#define CAN_F13R2_FB4                        CAN_F13R2_FB4_Msk                 /*!< Filter bit 4 */\n#define CAN_F13R2_FB5_Pos                    (5U)                              \n#define CAN_F13R2_FB5_Msk                    (0x1UL << CAN_F13R2_FB5_Pos)       /*!< 0x00000020 */\n#define CAN_F13R2_FB5                        CAN_F13R2_FB5_Msk                 /*!< Filter bit 5 */\n#define CAN_F13R2_FB6_Pos                    (6U)                              \n#define CAN_F13R2_FB6_Msk                    (0x1UL << CAN_F13R2_FB6_Pos)       /*!< 0x00000040 */\n#define CAN_F13R2_FB6                        CAN_F13R2_FB6_Msk                 /*!< Filter bit 6 */\n#define CAN_F13R2_FB7_Pos                    (7U)                              \n#define CAN_F13R2_FB7_Msk                    (0x1UL << CAN_F13R2_FB7_Pos)       /*!< 0x00000080 */\n#define CAN_F13R2_FB7                        CAN_F13R2_FB7_Msk                 /*!< Filter bit 7 */\n#define CAN_F13R2_FB8_Pos                    (8U)                              \n#define CAN_F13R2_FB8_Msk                    (0x1UL << CAN_F13R2_FB8_Pos)       /*!< 0x00000100 */\n#define CAN_F13R2_FB8                        CAN_F13R2_FB8_Msk                 /*!< Filter bit 8 */\n#define CAN_F13R2_FB9_Pos                    (9U)                              \n#define CAN_F13R2_FB9_Msk                    (0x1UL << CAN_F13R2_FB9_Pos)       /*!< 0x00000200 */\n#define CAN_F13R2_FB9                        CAN_F13R2_FB9_Msk                 /*!< Filter bit 9 */\n#define CAN_F13R2_FB10_Pos                   (10U)                             \n#define CAN_F13R2_FB10_Msk                   (0x1UL << CAN_F13R2_FB10_Pos)      /*!< 0x00000400 */\n#define CAN_F13R2_FB10                       CAN_F13R2_FB10_Msk                /*!< Filter bit 10 */\n#define CAN_F13R2_FB11_Pos                   (11U)                             \n#define CAN_F13R2_FB11_Msk                   (0x1UL << CAN_F13R2_FB11_Pos)      /*!< 0x00000800 */\n#define CAN_F13R2_FB11                       CAN_F13R2_FB11_Msk                /*!< Filter bit 11 */\n#define CAN_F13R2_FB12_Pos                   (12U)                             \n#define CAN_F13R2_FB12_Msk                   (0x1UL << CAN_F13R2_FB12_Pos)      /*!< 0x00001000 */\n#define CAN_F13R2_FB12                       CAN_F13R2_FB12_Msk                /*!< Filter bit 12 */\n#define CAN_F13R2_FB13_Pos                   (13U)                             \n#define CAN_F13R2_FB13_Msk                   (0x1UL << CAN_F13R2_FB13_Pos)      /*!< 0x00002000 */\n#define CAN_F13R2_FB13                       CAN_F13R2_FB13_Msk                /*!< Filter bit 13 */\n#define CAN_F13R2_FB14_Pos                   (14U)                             \n#define CAN_F13R2_FB14_Msk                   (0x1UL << CAN_F13R2_FB14_Pos)      /*!< 0x00004000 */\n#define CAN_F13R2_FB14                       CAN_F13R2_FB14_Msk                /*!< Filter bit 14 */\n#define CAN_F13R2_FB15_Pos                   (15U)                             \n#define CAN_F13R2_FB15_Msk                   (0x1UL << CAN_F13R2_FB15_Pos)      /*!< 0x00008000 */\n#define CAN_F13R2_FB15                       CAN_F13R2_FB15_Msk                /*!< Filter bit 15 */\n#define CAN_F13R2_FB16_Pos                   (16U)                             \n#define CAN_F13R2_FB16_Msk                   (0x1UL << CAN_F13R2_FB16_Pos)      /*!< 0x00010000 */\n#define CAN_F13R2_FB16                       CAN_F13R2_FB16_Msk                /*!< Filter bit 16 */\n#define CAN_F13R2_FB17_Pos                   (17U)                             \n#define CAN_F13R2_FB17_Msk                   (0x1UL << CAN_F13R2_FB17_Pos)      /*!< 0x00020000 */\n#define CAN_F13R2_FB17                       CAN_F13R2_FB17_Msk                /*!< Filter bit 17 */\n#define CAN_F13R2_FB18_Pos                   (18U)                             \n#define CAN_F13R2_FB18_Msk                   (0x1UL << CAN_F13R2_FB18_Pos)      /*!< 0x00040000 */\n#define CAN_F13R2_FB18                       CAN_F13R2_FB18_Msk                /*!< Filter bit 18 */\n#define CAN_F13R2_FB19_Pos                   (19U)                             \n#define CAN_F13R2_FB19_Msk                   (0x1UL << CAN_F13R2_FB19_Pos)      /*!< 0x00080000 */\n#define CAN_F13R2_FB19                       CAN_F13R2_FB19_Msk                /*!< Filter bit 19 */\n#define CAN_F13R2_FB20_Pos                   (20U)                             \n#define CAN_F13R2_FB20_Msk                   (0x1UL << CAN_F13R2_FB20_Pos)      /*!< 0x00100000 */\n#define CAN_F13R2_FB20                       CAN_F13R2_FB20_Msk                /*!< Filter bit 20 */\n#define CAN_F13R2_FB21_Pos                   (21U)                             \n#define CAN_F13R2_FB21_Msk                   (0x1UL << CAN_F13R2_FB21_Pos)      /*!< 0x00200000 */\n#define CAN_F13R2_FB21                       CAN_F13R2_FB21_Msk                /*!< Filter bit 21 */\n#define CAN_F13R2_FB22_Pos                   (22U)                             \n#define CAN_F13R2_FB22_Msk                   (0x1UL << CAN_F13R2_FB22_Pos)      /*!< 0x00400000 */\n#define CAN_F13R2_FB22                       CAN_F13R2_FB22_Msk                /*!< Filter bit 22 */\n#define CAN_F13R2_FB23_Pos                   (23U)                             \n#define CAN_F13R2_FB23_Msk                   (0x1UL << CAN_F13R2_FB23_Pos)      /*!< 0x00800000 */\n#define CAN_F13R2_FB23                       CAN_F13R2_FB23_Msk                /*!< Filter bit 23 */\n#define CAN_F13R2_FB24_Pos                   (24U)                             \n#define CAN_F13R2_FB24_Msk                   (0x1UL << CAN_F13R2_FB24_Pos)      /*!< 0x01000000 */\n#define CAN_F13R2_FB24                       CAN_F13R2_FB24_Msk                /*!< Filter bit 24 */\n#define CAN_F13R2_FB25_Pos                   (25U)                             \n#define CAN_F13R2_FB25_Msk                   (0x1UL << CAN_F13R2_FB25_Pos)      /*!< 0x02000000 */\n#define CAN_F13R2_FB25                       CAN_F13R2_FB25_Msk                /*!< Filter bit 25 */\n#define CAN_F13R2_FB26_Pos                   (26U)                             \n#define CAN_F13R2_FB26_Msk                   (0x1UL << CAN_F13R2_FB26_Pos)      /*!< 0x04000000 */\n#define CAN_F13R2_FB26                       CAN_F13R2_FB26_Msk                /*!< Filter bit 26 */\n#define CAN_F13R2_FB27_Pos                   (27U)                             \n#define CAN_F13R2_FB27_Msk                   (0x1UL << CAN_F13R2_FB27_Pos)      /*!< 0x08000000 */\n#define CAN_F13R2_FB27                       CAN_F13R2_FB27_Msk                /*!< Filter bit 27 */\n#define CAN_F13R2_FB28_Pos                   (28U)                             \n#define CAN_F13R2_FB28_Msk                   (0x1UL << CAN_F13R2_FB28_Pos)      /*!< 0x10000000 */\n#define CAN_F13R2_FB28                       CAN_F13R2_FB28_Msk                /*!< Filter bit 28 */\n#define CAN_F13R2_FB29_Pos                   (29U)                             \n#define CAN_F13R2_FB29_Msk                   (0x1UL << CAN_F13R2_FB29_Pos)      /*!< 0x20000000 */\n#define CAN_F13R2_FB29                       CAN_F13R2_FB29_Msk                /*!< Filter bit 29 */\n#define CAN_F13R2_FB30_Pos                   (30U)                             \n#define CAN_F13R2_FB30_Msk                   (0x1UL << CAN_F13R2_FB30_Pos)      /*!< 0x40000000 */\n#define CAN_F13R2_FB30                       CAN_F13R2_FB30_Msk                /*!< Filter bit 30 */\n#define CAN_F13R2_FB31_Pos                   (31U)                             \n#define CAN_F13R2_FB31_Msk                   (0x1UL << CAN_F13R2_FB31_Pos)      /*!< 0x80000000 */\n#define CAN_F13R2_FB31                       CAN_F13R2_FB31_Msk                /*!< Filter bit 31 */\n\n/******************************************************************************/\n/*                                                                            */\n/*                        Serial Peripheral Interface                         */\n/*                                                                            */\n/******************************************************************************/\n/*\n * @brief Specific device feature definitions (not present on all devices in the STM32F1 serie)\n */\n#define SPI_I2S_SUPPORT       /*!< I2S support */\n#define SPI_CRC_ERROR_WORKAROUND_FEATURE\n\n/*******************  Bit definition for SPI_CR1 register  ********************/\n#define SPI_CR1_CPHA_Pos                    (0U)                               \n#define SPI_CR1_CPHA_Msk                    (0x1UL << SPI_CR1_CPHA_Pos)         /*!< 0x00000001 */\n#define SPI_CR1_CPHA                        SPI_CR1_CPHA_Msk                   /*!< Clock Phase */\n#define SPI_CR1_CPOL_Pos                    (1U)                               \n#define SPI_CR1_CPOL_Msk                    (0x1UL << SPI_CR1_CPOL_Pos)         /*!< 0x00000002 */\n#define SPI_CR1_CPOL                        SPI_CR1_CPOL_Msk                   /*!< Clock Polarity */\n#define SPI_CR1_MSTR_Pos                    (2U)                               \n#define SPI_CR1_MSTR_Msk                    (0x1UL << SPI_CR1_MSTR_Pos)         /*!< 0x00000004 */\n#define SPI_CR1_MSTR                        SPI_CR1_MSTR_Msk                   /*!< Master Selection */\n\n#define SPI_CR1_BR_Pos                      (3U)                               \n#define SPI_CR1_BR_Msk                      (0x7UL << SPI_CR1_BR_Pos)           /*!< 0x00000038 */\n#define SPI_CR1_BR                          SPI_CR1_BR_Msk                     /*!< BR[2:0] bits (Baud Rate Control) */\n#define SPI_CR1_BR_0                        (0x1UL << SPI_CR1_BR_Pos)           /*!< 0x00000008 */\n#define SPI_CR1_BR_1                        (0x2UL << SPI_CR1_BR_Pos)           /*!< 0x00000010 */\n#define SPI_CR1_BR_2                        (0x4UL << SPI_CR1_BR_Pos)           /*!< 0x00000020 */\n\n#define SPI_CR1_SPE_Pos                     (6U)                               \n#define SPI_CR1_SPE_Msk                     (0x1UL << SPI_CR1_SPE_Pos)          /*!< 0x00000040 */\n#define SPI_CR1_SPE                         SPI_CR1_SPE_Msk                    /*!< SPI Enable */\n#define SPI_CR1_LSBFIRST_Pos                (7U)                               \n#define SPI_CR1_LSBFIRST_Msk                (0x1UL << SPI_CR1_LSBFIRST_Pos)     /*!< 0x00000080 */\n#define SPI_CR1_LSBFIRST                    SPI_CR1_LSBFIRST_Msk               /*!< Frame Format */\n#define SPI_CR1_SSI_Pos                     (8U)                               \n#define SPI_CR1_SSI_Msk                     (0x1UL << SPI_CR1_SSI_Pos)          /*!< 0x00000100 */\n#define SPI_CR1_SSI                         SPI_CR1_SSI_Msk                    /*!< Internal slave select */\n#define SPI_CR1_SSM_Pos                     (9U)                               \n#define SPI_CR1_SSM_Msk                     (0x1UL << SPI_CR1_SSM_Pos)          /*!< 0x00000200 */\n#define SPI_CR1_SSM                         SPI_CR1_SSM_Msk                    /*!< Software slave management */\n#define SPI_CR1_RXONLY_Pos                  (10U)                              \n#define SPI_CR1_RXONLY_Msk                  (0x1UL << SPI_CR1_RXONLY_Pos)       /*!< 0x00000400 */\n#define SPI_CR1_RXONLY                      SPI_CR1_RXONLY_Msk                 /*!< Receive only */\n#define SPI_CR1_DFF_Pos                     (11U)                              \n#define SPI_CR1_DFF_Msk                     (0x1UL << SPI_CR1_DFF_Pos)          /*!< 0x00000800 */\n#define SPI_CR1_DFF                         SPI_CR1_DFF_Msk                    /*!< Data Frame Format */\n#define SPI_CR1_CRCNEXT_Pos                 (12U)                              \n#define SPI_CR1_CRCNEXT_Msk                 (0x1UL << SPI_CR1_CRCNEXT_Pos)      /*!< 0x00001000 */\n#define SPI_CR1_CRCNEXT                     SPI_CR1_CRCNEXT_Msk                /*!< Transmit CRC next */\n#define SPI_CR1_CRCEN_Pos                   (13U)                              \n#define SPI_CR1_CRCEN_Msk                   (0x1UL << SPI_CR1_CRCEN_Pos)        /*!< 0x00002000 */\n#define SPI_CR1_CRCEN                       SPI_CR1_CRCEN_Msk                  /*!< Hardware CRC calculation enable */\n#define SPI_CR1_BIDIOE_Pos                  (14U)                              \n#define SPI_CR1_BIDIOE_Msk                  (0x1UL << SPI_CR1_BIDIOE_Pos)       /*!< 0x00004000 */\n#define SPI_CR1_BIDIOE                      SPI_CR1_BIDIOE_Msk                 /*!< Output enable in bidirectional mode */\n#define SPI_CR1_BIDIMODE_Pos                (15U)                              \n#define SPI_CR1_BIDIMODE_Msk                (0x1UL << SPI_CR1_BIDIMODE_Pos)     /*!< 0x00008000 */\n#define SPI_CR1_BIDIMODE                    SPI_CR1_BIDIMODE_Msk               /*!< Bidirectional data mode enable */\n\n/*******************  Bit definition for SPI_CR2 register  ********************/\n#define SPI_CR2_RXDMAEN_Pos                 (0U)                               \n#define SPI_CR2_RXDMAEN_Msk                 (0x1UL << SPI_CR2_RXDMAEN_Pos)      /*!< 0x00000001 */\n#define SPI_CR2_RXDMAEN                     SPI_CR2_RXDMAEN_Msk                /*!< Rx Buffer DMA Enable */\n#define SPI_CR2_TXDMAEN_Pos                 (1U)                               \n#define SPI_CR2_TXDMAEN_Msk                 (0x1UL << SPI_CR2_TXDMAEN_Pos)      /*!< 0x00000002 */\n#define SPI_CR2_TXDMAEN                     SPI_CR2_TXDMAEN_Msk                /*!< Tx Buffer DMA Enable */\n#define SPI_CR2_SSOE_Pos                    (2U)                               \n#define SPI_CR2_SSOE_Msk                    (0x1UL << SPI_CR2_SSOE_Pos)         /*!< 0x00000004 */\n#define SPI_CR2_SSOE                        SPI_CR2_SSOE_Msk                   /*!< SS Output Enable */\n#define SPI_CR2_ERRIE_Pos                   (5U)                               \n#define SPI_CR2_ERRIE_Msk                   (0x1UL << SPI_CR2_ERRIE_Pos)        /*!< 0x00000020 */\n#define SPI_CR2_ERRIE                       SPI_CR2_ERRIE_Msk                  /*!< Error Interrupt Enable */\n#define SPI_CR2_RXNEIE_Pos                  (6U)                               \n#define SPI_CR2_RXNEIE_Msk                  (0x1UL << SPI_CR2_RXNEIE_Pos)       /*!< 0x00000040 */\n#define SPI_CR2_RXNEIE                      SPI_CR2_RXNEIE_Msk                 /*!< RX buffer Not Empty Interrupt Enable */\n#define SPI_CR2_TXEIE_Pos                   (7U)                               \n#define SPI_CR2_TXEIE_Msk                   (0x1UL << SPI_CR2_TXEIE_Pos)        /*!< 0x00000080 */\n#define SPI_CR2_TXEIE                       SPI_CR2_TXEIE_Msk                  /*!< Tx buffer Empty Interrupt Enable */\n\n/********************  Bit definition for SPI_SR register  ********************/\n#define SPI_SR_RXNE_Pos                     (0U)                               \n#define SPI_SR_RXNE_Msk                     (0x1UL << SPI_SR_RXNE_Pos)          /*!< 0x00000001 */\n#define SPI_SR_RXNE                         SPI_SR_RXNE_Msk                    /*!< Receive buffer Not Empty */\n#define SPI_SR_TXE_Pos                      (1U)                               \n#define SPI_SR_TXE_Msk                      (0x1UL << SPI_SR_TXE_Pos)           /*!< 0x00000002 */\n#define SPI_SR_TXE                          SPI_SR_TXE_Msk                     /*!< Transmit buffer Empty */\n#define SPI_SR_CHSIDE_Pos                   (2U)                               \n#define SPI_SR_CHSIDE_Msk                   (0x1UL << SPI_SR_CHSIDE_Pos)        /*!< 0x00000004 */\n#define SPI_SR_CHSIDE                       SPI_SR_CHSIDE_Msk                  /*!< Channel side */\n#define SPI_SR_UDR_Pos                      (3U)                               \n#define SPI_SR_UDR_Msk                      (0x1UL << SPI_SR_UDR_Pos)           /*!< 0x00000008 */\n#define SPI_SR_UDR                          SPI_SR_UDR_Msk                     /*!< Underrun flag */\n#define SPI_SR_CRCERR_Pos                   (4U)                               \n#define SPI_SR_CRCERR_Msk                   (0x1UL << SPI_SR_CRCERR_Pos)        /*!< 0x00000010 */\n#define SPI_SR_CRCERR                       SPI_SR_CRCERR_Msk                  /*!< CRC Error flag */\n#define SPI_SR_MODF_Pos                     (5U)                               \n#define SPI_SR_MODF_Msk                     (0x1UL << SPI_SR_MODF_Pos)          /*!< 0x00000020 */\n#define SPI_SR_MODF                         SPI_SR_MODF_Msk                    /*!< Mode fault */\n#define SPI_SR_OVR_Pos                      (6U)                               \n#define SPI_SR_OVR_Msk                      (0x1UL << SPI_SR_OVR_Pos)           /*!< 0x00000040 */\n#define SPI_SR_OVR                          SPI_SR_OVR_Msk                     /*!< Overrun flag */\n#define SPI_SR_BSY_Pos                      (7U)                               \n#define SPI_SR_BSY_Msk                      (0x1UL << SPI_SR_BSY_Pos)           /*!< 0x00000080 */\n#define SPI_SR_BSY                          SPI_SR_BSY_Msk                     /*!< Busy flag */\n\n/********************  Bit definition for SPI_DR register  ********************/\n#define SPI_DR_DR_Pos                       (0U)                               \n#define SPI_DR_DR_Msk                       (0xFFFFUL << SPI_DR_DR_Pos)         /*!< 0x0000FFFF */\n#define SPI_DR_DR                           SPI_DR_DR_Msk                      /*!< Data Register */\n\n/*******************  Bit definition for SPI_CRCPR register  ******************/\n#define SPI_CRCPR_CRCPOLY_Pos               (0U)                               \n#define SPI_CRCPR_CRCPOLY_Msk               (0xFFFFUL << SPI_CRCPR_CRCPOLY_Pos) /*!< 0x0000FFFF */\n#define SPI_CRCPR_CRCPOLY                   SPI_CRCPR_CRCPOLY_Msk              /*!< CRC polynomial register */\n\n/******************  Bit definition for SPI_RXCRCR register  ******************/\n#define SPI_RXCRCR_RXCRC_Pos                (0U)                               \n#define SPI_RXCRCR_RXCRC_Msk                (0xFFFFUL << SPI_RXCRCR_RXCRC_Pos)  /*!< 0x0000FFFF */\n#define SPI_RXCRCR_RXCRC                    SPI_RXCRCR_RXCRC_Msk               /*!< Rx CRC Register */\n\n/******************  Bit definition for SPI_TXCRCR register  ******************/\n#define SPI_TXCRCR_TXCRC_Pos                (0U)                               \n#define SPI_TXCRCR_TXCRC_Msk                (0xFFFFUL << SPI_TXCRCR_TXCRC_Pos)  /*!< 0x0000FFFF */\n#define SPI_TXCRCR_TXCRC                    SPI_TXCRCR_TXCRC_Msk               /*!< Tx CRC Register */\n\n/******************  Bit definition for SPI_I2SCFGR register  *****************/\n#define SPI_I2SCFGR_CHLEN_Pos               (0U)                               \n#define SPI_I2SCFGR_CHLEN_Msk               (0x1UL << SPI_I2SCFGR_CHLEN_Pos)    /*!< 0x00000001 */\n#define SPI_I2SCFGR_CHLEN                   SPI_I2SCFGR_CHLEN_Msk              /*!< Channel length (number of bits per audio channel) */\n\n#define SPI_I2SCFGR_DATLEN_Pos              (1U)                               \n#define SPI_I2SCFGR_DATLEN_Msk              (0x3UL << SPI_I2SCFGR_DATLEN_Pos)   /*!< 0x00000006 */\n#define SPI_I2SCFGR_DATLEN                  SPI_I2SCFGR_DATLEN_Msk             /*!< DATLEN[1:0] bits (Data length to be transferred) */\n#define SPI_I2SCFGR_DATLEN_0                (0x1UL << SPI_I2SCFGR_DATLEN_Pos)   /*!< 0x00000002 */\n#define SPI_I2SCFGR_DATLEN_1                (0x2UL << SPI_I2SCFGR_DATLEN_Pos)   /*!< 0x00000004 */\n\n#define SPI_I2SCFGR_CKPOL_Pos               (3U)                               \n#define SPI_I2SCFGR_CKPOL_Msk               (0x1UL << SPI_I2SCFGR_CKPOL_Pos)    /*!< 0x00000008 */\n#define SPI_I2SCFGR_CKPOL                   SPI_I2SCFGR_CKPOL_Msk              /*!< steady state clock polarity */\n\n#define SPI_I2SCFGR_I2SSTD_Pos              (4U)                               \n#define SPI_I2SCFGR_I2SSTD_Msk              (0x3UL << SPI_I2SCFGR_I2SSTD_Pos)   /*!< 0x00000030 */\n#define SPI_I2SCFGR_I2SSTD                  SPI_I2SCFGR_I2SSTD_Msk             /*!< I2SSTD[1:0] bits (I2S standard selection) */\n#define SPI_I2SCFGR_I2SSTD_0                (0x1UL << SPI_I2SCFGR_I2SSTD_Pos)   /*!< 0x00000010 */\n#define SPI_I2SCFGR_I2SSTD_1                (0x2UL << SPI_I2SCFGR_I2SSTD_Pos)   /*!< 0x00000020 */\n\n#define SPI_I2SCFGR_PCMSYNC_Pos             (7U)                               \n#define SPI_I2SCFGR_PCMSYNC_Msk             (0x1UL << SPI_I2SCFGR_PCMSYNC_Pos)  /*!< 0x00000080 */\n#define SPI_I2SCFGR_PCMSYNC                 SPI_I2SCFGR_PCMSYNC_Msk            /*!< PCM frame synchronization */\n\n#define SPI_I2SCFGR_I2SCFG_Pos              (8U)                               \n#define SPI_I2SCFGR_I2SCFG_Msk              (0x3UL << SPI_I2SCFGR_I2SCFG_Pos)   /*!< 0x00000300 */\n#define SPI_I2SCFGR_I2SCFG                  SPI_I2SCFGR_I2SCFG_Msk             /*!< I2SCFG[1:0] bits (I2S configuration mode) */\n#define SPI_I2SCFGR_I2SCFG_0                (0x1UL << SPI_I2SCFGR_I2SCFG_Pos)   /*!< 0x00000100 */\n#define SPI_I2SCFGR_I2SCFG_1                (0x2UL << SPI_I2SCFGR_I2SCFG_Pos)   /*!< 0x00000200 */\n\n#define SPI_I2SCFGR_I2SE_Pos                (10U)                              \n#define SPI_I2SCFGR_I2SE_Msk                (0x1UL << SPI_I2SCFGR_I2SE_Pos)     /*!< 0x00000400 */\n#define SPI_I2SCFGR_I2SE                    SPI_I2SCFGR_I2SE_Msk               /*!< I2S Enable */\n#define SPI_I2SCFGR_I2SMOD_Pos              (11U)                              \n#define SPI_I2SCFGR_I2SMOD_Msk              (0x1UL << SPI_I2SCFGR_I2SMOD_Pos)   /*!< 0x00000800 */\n#define SPI_I2SCFGR_I2SMOD                  SPI_I2SCFGR_I2SMOD_Msk             /*!< I2S mode selection */\n\n/******************  Bit definition for SPI_I2SPR register  *******************/\n#define SPI_I2SPR_I2SDIV_Pos                (0U)                               \n#define SPI_I2SPR_I2SDIV_Msk                (0xFFUL << SPI_I2SPR_I2SDIV_Pos)    /*!< 0x000000FF */\n#define SPI_I2SPR_I2SDIV                    SPI_I2SPR_I2SDIV_Msk               /*!< I2S Linear prescaler */\n#define SPI_I2SPR_ODD_Pos                   (8U)                               \n#define SPI_I2SPR_ODD_Msk                   (0x1UL << SPI_I2SPR_ODD_Pos)        /*!< 0x00000100 */\n#define SPI_I2SPR_ODD                       SPI_I2SPR_ODD_Msk                  /*!< Odd factor for the prescaler */\n#define SPI_I2SPR_MCKOE_Pos                 (9U)                               \n#define SPI_I2SPR_MCKOE_Msk                 (0x1UL << SPI_I2SPR_MCKOE_Pos)      /*!< 0x00000200 */\n#define SPI_I2SPR_MCKOE                     SPI_I2SPR_MCKOE_Msk                /*!< Master Clock Output Enable */\n\n/******************************************************************************/\n/*                                                                            */\n/*                      Inter-integrated Circuit Interface                    */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for I2C_CR1 register  ********************/\n#define I2C_CR1_PE_Pos                      (0U)                               \n#define I2C_CR1_PE_Msk                      (0x1UL << I2C_CR1_PE_Pos)           /*!< 0x00000001 */\n#define I2C_CR1_PE                          I2C_CR1_PE_Msk                     /*!< Peripheral Enable */\n#define I2C_CR1_SMBUS_Pos                   (1U)                               \n#define I2C_CR1_SMBUS_Msk                   (0x1UL << I2C_CR1_SMBUS_Pos)        /*!< 0x00000002 */\n#define I2C_CR1_SMBUS                       I2C_CR1_SMBUS_Msk                  /*!< SMBus Mode */\n#define I2C_CR1_SMBTYPE_Pos                 (3U)                               \n#define I2C_CR1_SMBTYPE_Msk                 (0x1UL << I2C_CR1_SMBTYPE_Pos)      /*!< 0x00000008 */\n#define I2C_CR1_SMBTYPE                     I2C_CR1_SMBTYPE_Msk                /*!< SMBus Type */\n#define I2C_CR1_ENARP_Pos                   (4U)                               \n#define I2C_CR1_ENARP_Msk                   (0x1UL << I2C_CR1_ENARP_Pos)        /*!< 0x00000010 */\n#define I2C_CR1_ENARP                       I2C_CR1_ENARP_Msk                  /*!< ARP Enable */\n#define I2C_CR1_ENPEC_Pos                   (5U)                               \n#define I2C_CR1_ENPEC_Msk                   (0x1UL << I2C_CR1_ENPEC_Pos)        /*!< 0x00000020 */\n#define I2C_CR1_ENPEC                       I2C_CR1_ENPEC_Msk                  /*!< PEC Enable */\n#define I2C_CR1_ENGC_Pos                    (6U)                               \n#define I2C_CR1_ENGC_Msk                    (0x1UL << I2C_CR1_ENGC_Pos)         /*!< 0x00000040 */\n#define I2C_CR1_ENGC                        I2C_CR1_ENGC_Msk                   /*!< General Call Enable */\n#define I2C_CR1_NOSTRETCH_Pos               (7U)                               \n#define I2C_CR1_NOSTRETCH_Msk               (0x1UL << I2C_CR1_NOSTRETCH_Pos)    /*!< 0x00000080 */\n#define I2C_CR1_NOSTRETCH                   I2C_CR1_NOSTRETCH_Msk              /*!< Clock Stretching Disable (Slave mode) */\n#define I2C_CR1_START_Pos                   (8U)                               \n#define I2C_CR1_START_Msk                   (0x1UL << I2C_CR1_START_Pos)        /*!< 0x00000100 */\n#define I2C_CR1_START                       I2C_CR1_START_Msk                  /*!< Start Generation */\n#define I2C_CR1_STOP_Pos                    (9U)                               \n#define I2C_CR1_STOP_Msk                    (0x1UL << I2C_CR1_STOP_Pos)         /*!< 0x00000200 */\n#define I2C_CR1_STOP                        I2C_CR1_STOP_Msk                   /*!< Stop Generation */\n#define I2C_CR1_ACK_Pos                     (10U)                              \n#define I2C_CR1_ACK_Msk                     (0x1UL << I2C_CR1_ACK_Pos)          /*!< 0x00000400 */\n#define I2C_CR1_ACK                         I2C_CR1_ACK_Msk                    /*!< Acknowledge Enable */\n#define I2C_CR1_POS_Pos                     (11U)                              \n#define I2C_CR1_POS_Msk                     (0x1UL << I2C_CR1_POS_Pos)          /*!< 0x00000800 */\n#define I2C_CR1_POS                         I2C_CR1_POS_Msk                    /*!< Acknowledge/PEC Position (for data reception) */\n#define I2C_CR1_PEC_Pos                     (12U)                              \n#define I2C_CR1_PEC_Msk                     (0x1UL << I2C_CR1_PEC_Pos)          /*!< 0x00001000 */\n#define I2C_CR1_PEC                         I2C_CR1_PEC_Msk                    /*!< Packet Error Checking */\n#define I2C_CR1_ALERT_Pos                   (13U)                              \n#define I2C_CR1_ALERT_Msk                   (0x1UL << I2C_CR1_ALERT_Pos)        /*!< 0x00002000 */\n#define I2C_CR1_ALERT                       I2C_CR1_ALERT_Msk                  /*!< SMBus Alert */\n#define I2C_CR1_SWRST_Pos                   (15U)                              \n#define I2C_CR1_SWRST_Msk                   (0x1UL << I2C_CR1_SWRST_Pos)        /*!< 0x00008000 */\n#define I2C_CR1_SWRST                       I2C_CR1_SWRST_Msk                  /*!< Software Reset */\n\n/*******************  Bit definition for I2C_CR2 register  ********************/\n#define I2C_CR2_FREQ_Pos                    (0U)                               \n#define I2C_CR2_FREQ_Msk                    (0x3FUL << I2C_CR2_FREQ_Pos)        /*!< 0x0000003F */\n#define I2C_CR2_FREQ                        I2C_CR2_FREQ_Msk                   /*!< FREQ[5:0] bits (Peripheral Clock Frequency) */\n#define I2C_CR2_FREQ_0                      (0x01UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000001 */\n#define I2C_CR2_FREQ_1                      (0x02UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000002 */\n#define I2C_CR2_FREQ_2                      (0x04UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000004 */\n#define I2C_CR2_FREQ_3                      (0x08UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000008 */\n#define I2C_CR2_FREQ_4                      (0x10UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000010 */\n#define I2C_CR2_FREQ_5                      (0x20UL << I2C_CR2_FREQ_Pos)        /*!< 0x00000020 */\n\n#define I2C_CR2_ITERREN_Pos                 (8U)                               \n#define I2C_CR2_ITERREN_Msk                 (0x1UL << I2C_CR2_ITERREN_Pos)      /*!< 0x00000100 */\n#define I2C_CR2_ITERREN                     I2C_CR2_ITERREN_Msk                /*!< Error Interrupt Enable */\n#define I2C_CR2_ITEVTEN_Pos                 (9U)                               \n#define I2C_CR2_ITEVTEN_Msk                 (0x1UL << I2C_CR2_ITEVTEN_Pos)      /*!< 0x00000200 */\n#define I2C_CR2_ITEVTEN                     I2C_CR2_ITEVTEN_Msk                /*!< Event Interrupt Enable */\n#define I2C_CR2_ITBUFEN_Pos                 (10U)                              \n#define I2C_CR2_ITBUFEN_Msk                 (0x1UL << I2C_CR2_ITBUFEN_Pos)      /*!< 0x00000400 */\n#define I2C_CR2_ITBUFEN                     I2C_CR2_ITBUFEN_Msk                /*!< Buffer Interrupt Enable */\n#define I2C_CR2_DMAEN_Pos                   (11U)                              \n#define I2C_CR2_DMAEN_Msk                   (0x1UL << I2C_CR2_DMAEN_Pos)        /*!< 0x00000800 */\n#define I2C_CR2_DMAEN                       I2C_CR2_DMAEN_Msk                  /*!< DMA Requests Enable */\n#define I2C_CR2_LAST_Pos                    (12U)                              \n#define I2C_CR2_LAST_Msk                    (0x1UL << I2C_CR2_LAST_Pos)         /*!< 0x00001000 */\n#define I2C_CR2_LAST                        I2C_CR2_LAST_Msk                   /*!< DMA Last Transfer */\n\n/*******************  Bit definition for I2C_OAR1 register  *******************/\n#define I2C_OAR1_ADD1_7                     0x000000FEU             /*!< Interface Address */\n#define I2C_OAR1_ADD8_9                     0x00000300U             /*!< Interface Address */\n\n#define I2C_OAR1_ADD0_Pos                   (0U)                               \n#define I2C_OAR1_ADD0_Msk                   (0x1UL << I2C_OAR1_ADD0_Pos)        /*!< 0x00000001 */\n#define I2C_OAR1_ADD0                       I2C_OAR1_ADD0_Msk                  /*!< Bit 0 */\n#define I2C_OAR1_ADD1_Pos                   (1U)                               \n#define I2C_OAR1_ADD1_Msk                   (0x1UL << I2C_OAR1_ADD1_Pos)        /*!< 0x00000002 */\n#define I2C_OAR1_ADD1                       I2C_OAR1_ADD1_Msk                  /*!< Bit 1 */\n#define I2C_OAR1_ADD2_Pos                   (2U)                               \n#define I2C_OAR1_ADD2_Msk                   (0x1UL << I2C_OAR1_ADD2_Pos)        /*!< 0x00000004 */\n#define I2C_OAR1_ADD2                       I2C_OAR1_ADD2_Msk                  /*!< Bit 2 */\n#define I2C_OAR1_ADD3_Pos                   (3U)                               \n#define I2C_OAR1_ADD3_Msk                   (0x1UL << I2C_OAR1_ADD3_Pos)        /*!< 0x00000008 */\n#define I2C_OAR1_ADD3                       I2C_OAR1_ADD3_Msk                  /*!< Bit 3 */\n#define I2C_OAR1_ADD4_Pos                   (4U)                               \n#define I2C_OAR1_ADD4_Msk                   (0x1UL << I2C_OAR1_ADD4_Pos)        /*!< 0x00000010 */\n#define I2C_OAR1_ADD4                       I2C_OAR1_ADD4_Msk                  /*!< Bit 4 */\n#define I2C_OAR1_ADD5_Pos                   (5U)                               \n#define I2C_OAR1_ADD5_Msk                   (0x1UL << I2C_OAR1_ADD5_Pos)        /*!< 0x00000020 */\n#define I2C_OAR1_ADD5                       I2C_OAR1_ADD5_Msk                  /*!< Bit 5 */\n#define I2C_OAR1_ADD6_Pos                   (6U)                               \n#define I2C_OAR1_ADD6_Msk                   (0x1UL << I2C_OAR1_ADD6_Pos)        /*!< 0x00000040 */\n#define I2C_OAR1_ADD6                       I2C_OAR1_ADD6_Msk                  /*!< Bit 6 */\n#define I2C_OAR1_ADD7_Pos                   (7U)                               \n#define I2C_OAR1_ADD7_Msk                   (0x1UL << I2C_OAR1_ADD7_Pos)        /*!< 0x00000080 */\n#define I2C_OAR1_ADD7                       I2C_OAR1_ADD7_Msk                  /*!< Bit 7 */\n#define I2C_OAR1_ADD8_Pos                   (8U)                               \n#define I2C_OAR1_ADD8_Msk                   (0x1UL << I2C_OAR1_ADD8_Pos)        /*!< 0x00000100 */\n#define I2C_OAR1_ADD8                       I2C_OAR1_ADD8_Msk                  /*!< Bit 8 */\n#define I2C_OAR1_ADD9_Pos                   (9U)                               \n#define I2C_OAR1_ADD9_Msk                   (0x1UL << I2C_OAR1_ADD9_Pos)        /*!< 0x00000200 */\n#define I2C_OAR1_ADD9                       I2C_OAR1_ADD9_Msk                  /*!< Bit 9 */\n\n#define I2C_OAR1_ADDMODE_Pos                (15U)                              \n#define I2C_OAR1_ADDMODE_Msk                (0x1UL << I2C_OAR1_ADDMODE_Pos)     /*!< 0x00008000 */\n#define I2C_OAR1_ADDMODE                    I2C_OAR1_ADDMODE_Msk               /*!< Addressing Mode (Slave mode) */\n\n/*******************  Bit definition for I2C_OAR2 register  *******************/\n#define I2C_OAR2_ENDUAL_Pos                 (0U)                               \n#define I2C_OAR2_ENDUAL_Msk                 (0x1UL << I2C_OAR2_ENDUAL_Pos)      /*!< 0x00000001 */\n#define I2C_OAR2_ENDUAL                     I2C_OAR2_ENDUAL_Msk                /*!< Dual addressing mode enable */\n#define I2C_OAR2_ADD2_Pos                   (1U)                               \n#define I2C_OAR2_ADD2_Msk                   (0x7FUL << I2C_OAR2_ADD2_Pos)       /*!< 0x000000FE */\n#define I2C_OAR2_ADD2                       I2C_OAR2_ADD2_Msk                  /*!< Interface address */\n\n/********************  Bit definition for I2C_DR register  ********************/\n#define I2C_DR_DR_Pos             (0U)                                         \n#define I2C_DR_DR_Msk             (0xFFUL << I2C_DR_DR_Pos)                     /*!< 0x000000FF */\n#define I2C_DR_DR                 I2C_DR_DR_Msk                                /*!< 8-bit Data Register         */\n\n/*******************  Bit definition for I2C_SR1 register  ********************/\n#define I2C_SR1_SB_Pos                      (0U)                               \n#define I2C_SR1_SB_Msk                      (0x1UL << I2C_SR1_SB_Pos)           /*!< 0x00000001 */\n#define I2C_SR1_SB                          I2C_SR1_SB_Msk                     /*!< Start Bit (Master mode) */\n#define I2C_SR1_ADDR_Pos                    (1U)                               \n#define I2C_SR1_ADDR_Msk                    (0x1UL << I2C_SR1_ADDR_Pos)         /*!< 0x00000002 */\n#define I2C_SR1_ADDR                        I2C_SR1_ADDR_Msk                   /*!< Address sent (master mode)/matched (slave mode) */\n#define I2C_SR1_BTF_Pos                     (2U)                               \n#define I2C_SR1_BTF_Msk                     (0x1UL << I2C_SR1_BTF_Pos)          /*!< 0x00000004 */\n#define I2C_SR1_BTF                         I2C_SR1_BTF_Msk                    /*!< Byte Transfer Finished */\n#define I2C_SR1_ADD10_Pos                   (3U)                               \n#define I2C_SR1_ADD10_Msk                   (0x1UL << I2C_SR1_ADD10_Pos)        /*!< 0x00000008 */\n#define I2C_SR1_ADD10                       I2C_SR1_ADD10_Msk                  /*!< 10-bit header sent (Master mode) */\n#define I2C_SR1_STOPF_Pos                   (4U)                               \n#define I2C_SR1_STOPF_Msk                   (0x1UL << I2C_SR1_STOPF_Pos)        /*!< 0x00000010 */\n#define I2C_SR1_STOPF                       I2C_SR1_STOPF_Msk                  /*!< Stop detection (Slave mode) */\n#define I2C_SR1_RXNE_Pos                    (6U)                               \n#define I2C_SR1_RXNE_Msk                    (0x1UL << I2C_SR1_RXNE_Pos)         /*!< 0x00000040 */\n#define I2C_SR1_RXNE                        I2C_SR1_RXNE_Msk                   /*!< Data Register not Empty (receivers) */\n#define I2C_SR1_TXE_Pos                     (7U)                               \n#define I2C_SR1_TXE_Msk                     (0x1UL << I2C_SR1_TXE_Pos)          /*!< 0x00000080 */\n#define I2C_SR1_TXE                         I2C_SR1_TXE_Msk                    /*!< Data Register Empty (transmitters) */\n#define I2C_SR1_BERR_Pos                    (8U)                               \n#define I2C_SR1_BERR_Msk                    (0x1UL << I2C_SR1_BERR_Pos)         /*!< 0x00000100 */\n#define I2C_SR1_BERR                        I2C_SR1_BERR_Msk                   /*!< Bus Error */\n#define I2C_SR1_ARLO_Pos                    (9U)                               \n#define I2C_SR1_ARLO_Msk                    (0x1UL << I2C_SR1_ARLO_Pos)         /*!< 0x00000200 */\n#define I2C_SR1_ARLO                        I2C_SR1_ARLO_Msk                   /*!< Arbitration Lost (master mode) */\n#define I2C_SR1_AF_Pos                      (10U)                              \n#define I2C_SR1_AF_Msk                      (0x1UL << I2C_SR1_AF_Pos)           /*!< 0x00000400 */\n#define I2C_SR1_AF                          I2C_SR1_AF_Msk                     /*!< Acknowledge Failure */\n#define I2C_SR1_OVR_Pos                     (11U)                              \n#define I2C_SR1_OVR_Msk                     (0x1UL << I2C_SR1_OVR_Pos)          /*!< 0x00000800 */\n#define I2C_SR1_OVR                         I2C_SR1_OVR_Msk                    /*!< Overrun/Underrun */\n#define I2C_SR1_PECERR_Pos                  (12U)                              \n#define I2C_SR1_PECERR_Msk                  (0x1UL << I2C_SR1_PECERR_Pos)       /*!< 0x00001000 */\n#define I2C_SR1_PECERR                      I2C_SR1_PECERR_Msk                 /*!< PEC Error in reception */\n#define I2C_SR1_TIMEOUT_Pos                 (14U)                              \n#define I2C_SR1_TIMEOUT_Msk                 (0x1UL << I2C_SR1_TIMEOUT_Pos)      /*!< 0x00004000 */\n#define I2C_SR1_TIMEOUT                     I2C_SR1_TIMEOUT_Msk                /*!< Timeout or Tlow Error */\n#define I2C_SR1_SMBALERT_Pos                (15U)                              \n#define I2C_SR1_SMBALERT_Msk                (0x1UL << I2C_SR1_SMBALERT_Pos)     /*!< 0x00008000 */\n#define I2C_SR1_SMBALERT                    I2C_SR1_SMBALERT_Msk               /*!< SMBus Alert */\n\n/*******************  Bit definition for I2C_SR2 register  ********************/\n#define I2C_SR2_MSL_Pos                     (0U)                               \n#define I2C_SR2_MSL_Msk                     (0x1UL << I2C_SR2_MSL_Pos)          /*!< 0x00000001 */\n#define I2C_SR2_MSL                         I2C_SR2_MSL_Msk                    /*!< Master/Slave */\n#define I2C_SR2_BUSY_Pos                    (1U)                               \n#define I2C_SR2_BUSY_Msk                    (0x1UL << I2C_SR2_BUSY_Pos)         /*!< 0x00000002 */\n#define I2C_SR2_BUSY                        I2C_SR2_BUSY_Msk                   /*!< Bus Busy */\n#define I2C_SR2_TRA_Pos                     (2U)                               \n#define I2C_SR2_TRA_Msk                     (0x1UL << I2C_SR2_TRA_Pos)          /*!< 0x00000004 */\n#define I2C_SR2_TRA                         I2C_SR2_TRA_Msk                    /*!< Transmitter/Receiver */\n#define I2C_SR2_GENCALL_Pos                 (4U)                               \n#define I2C_SR2_GENCALL_Msk                 (0x1UL << I2C_SR2_GENCALL_Pos)      /*!< 0x00000010 */\n#define I2C_SR2_GENCALL                     I2C_SR2_GENCALL_Msk                /*!< General Call Address (Slave mode) */\n#define I2C_SR2_SMBDEFAULT_Pos              (5U)                               \n#define I2C_SR2_SMBDEFAULT_Msk              (0x1UL << I2C_SR2_SMBDEFAULT_Pos)   /*!< 0x00000020 */\n#define I2C_SR2_SMBDEFAULT                  I2C_SR2_SMBDEFAULT_Msk             /*!< SMBus Device Default Address (Slave mode) */\n#define I2C_SR2_SMBHOST_Pos                 (6U)                               \n#define I2C_SR2_SMBHOST_Msk                 (0x1UL << I2C_SR2_SMBHOST_Pos)      /*!< 0x00000040 */\n#define I2C_SR2_SMBHOST                     I2C_SR2_SMBHOST_Msk                /*!< SMBus Host Header (Slave mode) */\n#define I2C_SR2_DUALF_Pos                   (7U)                               \n#define I2C_SR2_DUALF_Msk                   (0x1UL << I2C_SR2_DUALF_Pos)        /*!< 0x00000080 */\n#define I2C_SR2_DUALF                       I2C_SR2_DUALF_Msk                  /*!< Dual Flag (Slave mode) */\n#define I2C_SR2_PEC_Pos                     (8U)                               \n#define I2C_SR2_PEC_Msk                     (0xFFUL << I2C_SR2_PEC_Pos)         /*!< 0x0000FF00 */\n#define I2C_SR2_PEC                         I2C_SR2_PEC_Msk                    /*!< Packet Error Checking Register */\n\n/*******************  Bit definition for I2C_CCR register  ********************/\n#define I2C_CCR_CCR_Pos                     (0U)                               \n#define I2C_CCR_CCR_Msk                     (0xFFFUL << I2C_CCR_CCR_Pos)        /*!< 0x00000FFF */\n#define I2C_CCR_CCR                         I2C_CCR_CCR_Msk                    /*!< Clock Control Register in Fast/Standard mode (Master mode) */\n#define I2C_CCR_DUTY_Pos                    (14U)                              \n#define I2C_CCR_DUTY_Msk                    (0x1UL << I2C_CCR_DUTY_Pos)         /*!< 0x00004000 */\n#define I2C_CCR_DUTY                        I2C_CCR_DUTY_Msk                   /*!< Fast Mode Duty Cycle */\n#define I2C_CCR_FS_Pos                      (15U)                              \n#define I2C_CCR_FS_Msk                      (0x1UL << I2C_CCR_FS_Pos)           /*!< 0x00008000 */\n#define I2C_CCR_FS                          I2C_CCR_FS_Msk                     /*!< I2C Master Mode Selection */\n\n/******************  Bit definition for I2C_TRISE register  *******************/\n#define I2C_TRISE_TRISE_Pos                 (0U)                               \n#define I2C_TRISE_TRISE_Msk                 (0x3FUL << I2C_TRISE_TRISE_Pos)     /*!< 0x0000003F */\n#define I2C_TRISE_TRISE                     I2C_TRISE_TRISE_Msk                /*!< Maximum Rise Time in Fast/Standard mode (Master mode) */\n\n/******************************************************************************/\n/*                                                                            */\n/*         Universal Synchronous Asynchronous Receiver Transmitter            */\n/*                                                                            */\n/******************************************************************************/\n\n/*******************  Bit definition for USART_SR register  *******************/\n#define USART_SR_PE_Pos                     (0U)                               \n#define USART_SR_PE_Msk                     (0x1UL << USART_SR_PE_Pos)          /*!< 0x00000001 */\n#define USART_SR_PE                         USART_SR_PE_Msk                    /*!< Parity Error */\n#define USART_SR_FE_Pos                     (1U)                               \n#define USART_SR_FE_Msk                     (0x1UL << USART_SR_FE_Pos)          /*!< 0x00000002 */\n#define USART_SR_FE                         USART_SR_FE_Msk                    /*!< Framing Error */\n#define USART_SR_NE_Pos                     (2U)                               \n#define USART_SR_NE_Msk                     (0x1UL << USART_SR_NE_Pos)          /*!< 0x00000004 */\n#define USART_SR_NE                         USART_SR_NE_Msk                    /*!< Noise Error Flag */\n#define USART_SR_ORE_Pos                    (3U)                               \n#define USART_SR_ORE_Msk                    (0x1UL << USART_SR_ORE_Pos)         /*!< 0x00000008 */\n#define USART_SR_ORE                        USART_SR_ORE_Msk                   /*!< OverRun Error */\n#define USART_SR_IDLE_Pos                   (4U)                               \n#define USART_SR_IDLE_Msk                   (0x1UL << USART_SR_IDLE_Pos)        /*!< 0x00000010 */\n#define USART_SR_IDLE                       USART_SR_IDLE_Msk                  /*!< IDLE line detected */\n#define USART_SR_RXNE_Pos                   (5U)                               \n#define USART_SR_RXNE_Msk                   (0x1UL << USART_SR_RXNE_Pos)        /*!< 0x00000020 */\n#define USART_SR_RXNE                       USART_SR_RXNE_Msk                  /*!< Read Data Register Not Empty */\n#define USART_SR_TC_Pos                     (6U)                               \n#define USART_SR_TC_Msk                     (0x1UL << USART_SR_TC_Pos)          /*!< 0x00000040 */\n#define USART_SR_TC                         USART_SR_TC_Msk                    /*!< Transmission Complete */\n#define USART_SR_TXE_Pos                    (7U)                               \n#define USART_SR_TXE_Msk                    (0x1UL << USART_SR_TXE_Pos)         /*!< 0x00000080 */\n#define USART_SR_TXE                        USART_SR_TXE_Msk                   /*!< Transmit Data Register Empty */\n#define USART_SR_LBD_Pos                    (8U)                               \n#define USART_SR_LBD_Msk                    (0x1UL << USART_SR_LBD_Pos)         /*!< 0x00000100 */\n#define USART_SR_LBD                        USART_SR_LBD_Msk                   /*!< LIN Break Detection Flag */\n#define USART_SR_CTS_Pos                    (9U)                               \n#define USART_SR_CTS_Msk                    (0x1UL << USART_SR_CTS_Pos)         /*!< 0x00000200 */\n#define USART_SR_CTS                        USART_SR_CTS_Msk                   /*!< CTS Flag */\n\n/*******************  Bit definition for USART_DR register  *******************/\n#define USART_DR_DR_Pos                     (0U)                               \n#define USART_DR_DR_Msk                     (0x1FFUL << USART_DR_DR_Pos)        /*!< 0x000001FF */\n#define USART_DR_DR                         USART_DR_DR_Msk                    /*!< Data value */\n\n/******************  Bit definition for USART_BRR register  *******************/\n#define USART_BRR_DIV_Fraction_Pos          (0U)                               \n#define USART_BRR_DIV_Fraction_Msk          (0xFUL << USART_BRR_DIV_Fraction_Pos) /*!< 0x0000000F */\n#define USART_BRR_DIV_Fraction              USART_BRR_DIV_Fraction_Msk         /*!< Fraction of USARTDIV */\n#define USART_BRR_DIV_Mantissa_Pos          (4U)                               \n#define USART_BRR_DIV_Mantissa_Msk          (0xFFFUL << USART_BRR_DIV_Mantissa_Pos) /*!< 0x0000FFF0 */\n#define USART_BRR_DIV_Mantissa              USART_BRR_DIV_Mantissa_Msk         /*!< Mantissa of USARTDIV */\n\n/******************  Bit definition for USART_CR1 register  *******************/\n#define USART_CR1_SBK_Pos                   (0U)                               \n#define USART_CR1_SBK_Msk                   (0x1UL << USART_CR1_SBK_Pos)        /*!< 0x00000001 */\n#define USART_CR1_SBK                       USART_CR1_SBK_Msk                  /*!< Send Break */\n#define USART_CR1_RWU_Pos                   (1U)                               \n#define USART_CR1_RWU_Msk                   (0x1UL << USART_CR1_RWU_Pos)        /*!< 0x00000002 */\n#define USART_CR1_RWU                       USART_CR1_RWU_Msk                  /*!< Receiver wakeup */\n#define USART_CR1_RE_Pos                    (2U)                               \n#define USART_CR1_RE_Msk                    (0x1UL << USART_CR1_RE_Pos)         /*!< 0x00000004 */\n#define USART_CR1_RE                        USART_CR1_RE_Msk                   /*!< Receiver Enable */\n#define USART_CR1_TE_Pos                    (3U)                               \n#define USART_CR1_TE_Msk                    (0x1UL << USART_CR1_TE_Pos)         /*!< 0x00000008 */\n#define USART_CR1_TE                        USART_CR1_TE_Msk                   /*!< Transmitter Enable */\n#define USART_CR1_IDLEIE_Pos                (4U)                               \n#define USART_CR1_IDLEIE_Msk                (0x1UL << USART_CR1_IDLEIE_Pos)     /*!< 0x00000010 */\n#define USART_CR1_IDLEIE                    USART_CR1_IDLEIE_Msk               /*!< IDLE Interrupt Enable */\n#define USART_CR1_RXNEIE_Pos                (5U)                               \n#define USART_CR1_RXNEIE_Msk                (0x1UL << USART_CR1_RXNEIE_Pos)     /*!< 0x00000020 */\n#define USART_CR1_RXNEIE                    USART_CR1_RXNEIE_Msk               /*!< RXNE Interrupt Enable */\n#define USART_CR1_TCIE_Pos                  (6U)                               \n#define USART_CR1_TCIE_Msk                  (0x1UL << USART_CR1_TCIE_Pos)       /*!< 0x00000040 */\n#define USART_CR1_TCIE                      USART_CR1_TCIE_Msk                 /*!< Transmission Complete Interrupt Enable */\n#define USART_CR1_TXEIE_Pos                 (7U)                               \n#define USART_CR1_TXEIE_Msk                 (0x1UL << USART_CR1_TXEIE_Pos)      /*!< 0x00000080 */\n#define USART_CR1_TXEIE                     USART_CR1_TXEIE_Msk                /*!< PE Interrupt Enable */\n#define USART_CR1_PEIE_Pos                  (8U)                               \n#define USART_CR1_PEIE_Msk                  (0x1UL << USART_CR1_PEIE_Pos)       /*!< 0x00000100 */\n#define USART_CR1_PEIE                      USART_CR1_PEIE_Msk                 /*!< PE Interrupt Enable */\n#define USART_CR1_PS_Pos                    (9U)                               \n#define USART_CR1_PS_Msk                    (0x1UL << USART_CR1_PS_Pos)         /*!< 0x00000200 */\n#define USART_CR1_PS                        USART_CR1_PS_Msk                   /*!< Parity Selection */\n#define USART_CR1_PCE_Pos                   (10U)                              \n#define USART_CR1_PCE_Msk                   (0x1UL << USART_CR1_PCE_Pos)        /*!< 0x00000400 */\n#define USART_CR1_PCE                       USART_CR1_PCE_Msk                  /*!< Parity Control Enable */\n#define USART_CR1_WAKE_Pos                  (11U)                              \n#define USART_CR1_WAKE_Msk                  (0x1UL << USART_CR1_WAKE_Pos)       /*!< 0x00000800 */\n#define USART_CR1_WAKE                      USART_CR1_WAKE_Msk                 /*!< Wakeup method */\n#define USART_CR1_M_Pos                     (12U)                              \n#define USART_CR1_M_Msk                     (0x1UL << USART_CR1_M_Pos)          /*!< 0x00001000 */\n#define USART_CR1_M                         USART_CR1_M_Msk                    /*!< Word length */\n#define USART_CR1_UE_Pos                    (13U)                              \n#define USART_CR1_UE_Msk                    (0x1UL << USART_CR1_UE_Pos)         /*!< 0x00002000 */\n#define USART_CR1_UE                        USART_CR1_UE_Msk                   /*!< USART Enable */\n\n/******************  Bit definition for USART_CR2 register  *******************/\n#define USART_CR2_ADD_Pos                   (0U)                               \n#define USART_CR2_ADD_Msk                   (0xFUL << USART_CR2_ADD_Pos)        /*!< 0x0000000F */\n#define USART_CR2_ADD                       USART_CR2_ADD_Msk                  /*!< Address of the USART node */\n#define USART_CR2_LBDL_Pos                  (5U)                               \n#define USART_CR2_LBDL_Msk                  (0x1UL << USART_CR2_LBDL_Pos)       /*!< 0x00000020 */\n#define USART_CR2_LBDL                      USART_CR2_LBDL_Msk                 /*!< LIN Break Detection Length */\n#define USART_CR2_LBDIE_Pos                 (6U)                               \n#define USART_CR2_LBDIE_Msk                 (0x1UL << USART_CR2_LBDIE_Pos)      /*!< 0x00000040 */\n#define USART_CR2_LBDIE                     USART_CR2_LBDIE_Msk                /*!< LIN Break Detection Interrupt Enable */\n#define USART_CR2_LBCL_Pos                  (8U)                               \n#define USART_CR2_LBCL_Msk                  (0x1UL << USART_CR2_LBCL_Pos)       /*!< 0x00000100 */\n#define USART_CR2_LBCL                      USART_CR2_LBCL_Msk                 /*!< Last Bit Clock pulse */\n#define USART_CR2_CPHA_Pos                  (9U)                               \n#define USART_CR2_CPHA_Msk                  (0x1UL << USART_CR2_CPHA_Pos)       /*!< 0x00000200 */\n#define USART_CR2_CPHA                      USART_CR2_CPHA_Msk                 /*!< Clock Phase */\n#define USART_CR2_CPOL_Pos                  (10U)                              \n#define USART_CR2_CPOL_Msk                  (0x1UL << USART_CR2_CPOL_Pos)       /*!< 0x00000400 */\n#define USART_CR2_CPOL                      USART_CR2_CPOL_Msk                 /*!< Clock Polarity */\n#define USART_CR2_CLKEN_Pos                 (11U)                              \n#define USART_CR2_CLKEN_Msk                 (0x1UL << USART_CR2_CLKEN_Pos)      /*!< 0x00000800 */\n#define USART_CR2_CLKEN                     USART_CR2_CLKEN_Msk                /*!< Clock Enable */\n\n#define USART_CR2_STOP_Pos                  (12U)                              \n#define USART_CR2_STOP_Msk                  (0x3UL << USART_CR2_STOP_Pos)       /*!< 0x00003000 */\n#define USART_CR2_STOP                      USART_CR2_STOP_Msk                 /*!< STOP[1:0] bits (STOP bits) */\n#define USART_CR2_STOP_0                    (0x1UL << USART_CR2_STOP_Pos)       /*!< 0x00001000 */\n#define USART_CR2_STOP_1                    (0x2UL << USART_CR2_STOP_Pos)       /*!< 0x00002000 */\n\n#define USART_CR2_LINEN_Pos                 (14U)                              \n#define USART_CR2_LINEN_Msk                 (0x1UL << USART_CR2_LINEN_Pos)      /*!< 0x00004000 */\n#define USART_CR2_LINEN                     USART_CR2_LINEN_Msk                /*!< LIN mode enable */\n\n/******************  Bit definition for USART_CR3 register  *******************/\n#define USART_CR3_EIE_Pos                   (0U)                               \n#define USART_CR3_EIE_Msk                   (0x1UL << USART_CR3_EIE_Pos)        /*!< 0x00000001 */\n#define USART_CR3_EIE                       USART_CR3_EIE_Msk                  /*!< Error Interrupt Enable */\n#define USART_CR3_IREN_Pos                  (1U)                               \n#define USART_CR3_IREN_Msk                  (0x1UL << USART_CR3_IREN_Pos)       /*!< 0x00000002 */\n#define USART_CR3_IREN                      USART_CR3_IREN_Msk                 /*!< IrDA mode Enable */\n#define USART_CR3_IRLP_Pos                  (2U)                               \n#define USART_CR3_IRLP_Msk                  (0x1UL << USART_CR3_IRLP_Pos)       /*!< 0x00000004 */\n#define USART_CR3_IRLP                      USART_CR3_IRLP_Msk                 /*!< IrDA Low-Power */\n#define USART_CR3_HDSEL_Pos                 (3U)                               \n#define USART_CR3_HDSEL_Msk                 (0x1UL << USART_CR3_HDSEL_Pos)      /*!< 0x00000008 */\n#define USART_CR3_HDSEL                     USART_CR3_HDSEL_Msk                /*!< Half-Duplex Selection */\n#define USART_CR3_NACK_Pos                  (4U)                               \n#define USART_CR3_NACK_Msk                  (0x1UL << USART_CR3_NACK_Pos)       /*!< 0x00000010 */\n#define USART_CR3_NACK                      USART_CR3_NACK_Msk                 /*!< Smartcard NACK enable */\n#define USART_CR3_SCEN_Pos                  (5U)                               \n#define USART_CR3_SCEN_Msk                  (0x1UL << USART_CR3_SCEN_Pos)       /*!< 0x00000020 */\n#define USART_CR3_SCEN                      USART_CR3_SCEN_Msk                 /*!< Smartcard mode enable */\n#define USART_CR3_DMAR_Pos                  (6U)                               \n#define USART_CR3_DMAR_Msk                  (0x1UL << USART_CR3_DMAR_Pos)       /*!< 0x00000040 */\n#define USART_CR3_DMAR                      USART_CR3_DMAR_Msk                 /*!< DMA Enable Receiver */\n#define USART_CR3_DMAT_Pos                  (7U)                               \n#define USART_CR3_DMAT_Msk                  (0x1UL << USART_CR3_DMAT_Pos)       /*!< 0x00000080 */\n#define USART_CR3_DMAT                      USART_CR3_DMAT_Msk                 /*!< DMA Enable Transmitter */\n#define USART_CR3_RTSE_Pos                  (8U)                               \n#define USART_CR3_RTSE_Msk                  (0x1UL << USART_CR3_RTSE_Pos)       /*!< 0x00000100 */\n#define USART_CR3_RTSE                      USART_CR3_RTSE_Msk                 /*!< RTS Enable */\n#define USART_CR3_CTSE_Pos                  (9U)                               \n#define USART_CR3_CTSE_Msk                  (0x1UL << USART_CR3_CTSE_Pos)       /*!< 0x00000200 */\n#define USART_CR3_CTSE                      USART_CR3_CTSE_Msk                 /*!< CTS Enable */\n#define USART_CR3_CTSIE_Pos                 (10U)                              \n#define USART_CR3_CTSIE_Msk                 (0x1UL << USART_CR3_CTSIE_Pos)      /*!< 0x00000400 */\n#define USART_CR3_CTSIE                     USART_CR3_CTSIE_Msk                /*!< CTS Interrupt Enable */\n\n/******************  Bit definition for USART_GTPR register  ******************/\n#define USART_GTPR_PSC_Pos                  (0U)                               \n#define USART_GTPR_PSC_Msk                  (0xFFUL << USART_GTPR_PSC_Pos)      /*!< 0x000000FF */\n#define USART_GTPR_PSC                      USART_GTPR_PSC_Msk                 /*!< PSC[7:0] bits (Prescaler value) */\n#define USART_GTPR_PSC_0                    (0x01UL << USART_GTPR_PSC_Pos)      /*!< 0x00000001 */\n#define USART_GTPR_PSC_1                    (0x02UL << USART_GTPR_PSC_Pos)      /*!< 0x00000002 */\n#define USART_GTPR_PSC_2                    (0x04UL << USART_GTPR_PSC_Pos)      /*!< 0x00000004 */\n#define USART_GTPR_PSC_3                    (0x08UL << USART_GTPR_PSC_Pos)      /*!< 0x00000008 */\n#define USART_GTPR_PSC_4                    (0x10UL << USART_GTPR_PSC_Pos)      /*!< 0x00000010 */\n#define USART_GTPR_PSC_5                    (0x20UL << USART_GTPR_PSC_Pos)      /*!< 0x00000020 */\n#define USART_GTPR_PSC_6                    (0x40UL << USART_GTPR_PSC_Pos)      /*!< 0x00000040 */\n#define USART_GTPR_PSC_7                    (0x80UL << USART_GTPR_PSC_Pos)      /*!< 0x00000080 */\n\n#define USART_GTPR_GT_Pos                   (8U)                               \n#define USART_GTPR_GT_Msk                   (0xFFUL << USART_GTPR_GT_Pos)       /*!< 0x0000FF00 */\n#define USART_GTPR_GT                       USART_GTPR_GT_Msk                  /*!< Guard time value */\n\n/******************************************************************************/\n/*                                                                            */\n/*                                 Debug MCU                                  */\n/*                                                                            */\n/******************************************************************************/\n\n/****************  Bit definition for DBGMCU_IDCODE register  *****************/\n#define DBGMCU_IDCODE_DEV_ID_Pos            (0U)                               \n#define DBGMCU_IDCODE_DEV_ID_Msk            (0xFFFUL << DBGMCU_IDCODE_DEV_ID_Pos) /*!< 0x00000FFF */\n#define DBGMCU_IDCODE_DEV_ID                DBGMCU_IDCODE_DEV_ID_Msk           /*!< Device Identifier */\n\n#define DBGMCU_IDCODE_REV_ID_Pos            (16U)                              \n#define DBGMCU_IDCODE_REV_ID_Msk            (0xFFFFUL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0xFFFF0000 */\n#define DBGMCU_IDCODE_REV_ID                DBGMCU_IDCODE_REV_ID_Msk           /*!< REV_ID[15:0] bits (Revision Identifier) */\n#define DBGMCU_IDCODE_REV_ID_0              (0x0001UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00010000 */\n#define DBGMCU_IDCODE_REV_ID_1              (0x0002UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00020000 */\n#define DBGMCU_IDCODE_REV_ID_2              (0x0004UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00040000 */\n#define DBGMCU_IDCODE_REV_ID_3              (0x0008UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00080000 */\n#define DBGMCU_IDCODE_REV_ID_4              (0x0010UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00100000 */\n#define DBGMCU_IDCODE_REV_ID_5              (0x0020UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00200000 */\n#define DBGMCU_IDCODE_REV_ID_6              (0x0040UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00400000 */\n#define DBGMCU_IDCODE_REV_ID_7              (0x0080UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x00800000 */\n#define DBGMCU_IDCODE_REV_ID_8              (0x0100UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x01000000 */\n#define DBGMCU_IDCODE_REV_ID_9              (0x0200UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x02000000 */\n#define DBGMCU_IDCODE_REV_ID_10             (0x0400UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x04000000 */\n#define DBGMCU_IDCODE_REV_ID_11             (0x0800UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x08000000 */\n#define DBGMCU_IDCODE_REV_ID_12             (0x1000UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x10000000 */\n#define DBGMCU_IDCODE_REV_ID_13             (0x2000UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x20000000 */\n#define DBGMCU_IDCODE_REV_ID_14             (0x4000UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x40000000 */\n#define DBGMCU_IDCODE_REV_ID_15             (0x8000UL << DBGMCU_IDCODE_REV_ID_Pos) /*!< 0x80000000 */\n\n/******************  Bit definition for DBGMCU_CR register  *******************/\n#define DBGMCU_CR_DBG_SLEEP_Pos             (0U)                               \n#define DBGMCU_CR_DBG_SLEEP_Msk             (0x1UL << DBGMCU_CR_DBG_SLEEP_Pos)  /*!< 0x00000001 */\n#define DBGMCU_CR_DBG_SLEEP                 DBGMCU_CR_DBG_SLEEP_Msk            /*!< Debug Sleep Mode */\n#define DBGMCU_CR_DBG_STOP_Pos              (1U)                               \n#define DBGMCU_CR_DBG_STOP_Msk              (0x1UL << DBGMCU_CR_DBG_STOP_Pos)   /*!< 0x00000002 */\n#define DBGMCU_CR_DBG_STOP                  DBGMCU_CR_DBG_STOP_Msk             /*!< Debug Stop Mode */\n#define DBGMCU_CR_DBG_STANDBY_Pos           (2U)                               \n#define DBGMCU_CR_DBG_STANDBY_Msk           (0x1UL << DBGMCU_CR_DBG_STANDBY_Pos) /*!< 0x00000004 */\n#define DBGMCU_CR_DBG_STANDBY               DBGMCU_CR_DBG_STANDBY_Msk          /*!< Debug Standby mode */\n#define DBGMCU_CR_TRACE_IOEN_Pos            (5U)                               \n#define DBGMCU_CR_TRACE_IOEN_Msk            (0x1UL << DBGMCU_CR_TRACE_IOEN_Pos) /*!< 0x00000020 */\n#define DBGMCU_CR_TRACE_IOEN                DBGMCU_CR_TRACE_IOEN_Msk           /*!< Trace Pin Assignment Control */\n\n#define DBGMCU_CR_TRACE_MODE_Pos            (6U)                               \n#define DBGMCU_CR_TRACE_MODE_Msk            (0x3UL << DBGMCU_CR_TRACE_MODE_Pos) /*!< 0x000000C0 */\n#define DBGMCU_CR_TRACE_MODE                DBGMCU_CR_TRACE_MODE_Msk           /*!< TRACE_MODE[1:0] bits (Trace Pin Assignment Control) */\n#define DBGMCU_CR_TRACE_MODE_0              (0x1UL << DBGMCU_CR_TRACE_MODE_Pos) /*!< 0x00000040 */\n#define DBGMCU_CR_TRACE_MODE_1              (0x2UL << DBGMCU_CR_TRACE_MODE_Pos) /*!< 0x00000080 */\n\n#define DBGMCU_CR_DBG_IWDG_STOP_Pos         (8U)                               \n#define DBGMCU_CR_DBG_IWDG_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_IWDG_STOP_Pos) /*!< 0x00000100 */\n#define DBGMCU_CR_DBG_IWDG_STOP             DBGMCU_CR_DBG_IWDG_STOP_Msk        /*!< Debug Independent Watchdog stopped when Core is halted */\n#define DBGMCU_CR_DBG_WWDG_STOP_Pos         (9U)                               \n#define DBGMCU_CR_DBG_WWDG_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_WWDG_STOP_Pos) /*!< 0x00000200 */\n#define DBGMCU_CR_DBG_WWDG_STOP             DBGMCU_CR_DBG_WWDG_STOP_Msk        /*!< Debug Window Watchdog stopped when Core is halted */\n#define DBGMCU_CR_DBG_TIM1_STOP_Pos         (10U)                              \n#define DBGMCU_CR_DBG_TIM1_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM1_STOP_Pos) /*!< 0x00000400 */\n#define DBGMCU_CR_DBG_TIM1_STOP             DBGMCU_CR_DBG_TIM1_STOP_Msk        /*!< TIM1 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM2_STOP_Pos         (11U)                              \n#define DBGMCU_CR_DBG_TIM2_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM2_STOP_Pos) /*!< 0x00000800 */\n#define DBGMCU_CR_DBG_TIM2_STOP             DBGMCU_CR_DBG_TIM2_STOP_Msk        /*!< TIM2 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM3_STOP_Pos         (12U)                              \n#define DBGMCU_CR_DBG_TIM3_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM3_STOP_Pos) /*!< 0x00001000 */\n#define DBGMCU_CR_DBG_TIM3_STOP             DBGMCU_CR_DBG_TIM3_STOP_Msk        /*!< TIM3 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM4_STOP_Pos         (13U)                              \n#define DBGMCU_CR_DBG_TIM4_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM4_STOP_Pos) /*!< 0x00002000 */\n#define DBGMCU_CR_DBG_TIM4_STOP             DBGMCU_CR_DBG_TIM4_STOP_Msk        /*!< TIM4 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_CAN1_STOP_Pos         (14U)                              \n#define DBGMCU_CR_DBG_CAN1_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_CAN1_STOP_Pos) /*!< 0x00004000 */\n#define DBGMCU_CR_DBG_CAN1_STOP             DBGMCU_CR_DBG_CAN1_STOP_Msk        /*!< Debug CAN1 stopped when Core is halted */\n#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT_Pos (15U)                             \n#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT_Msk (0x1UL << DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT_Pos) /*!< 0x00008000 */\n#define DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT    DBGMCU_CR_DBG_I2C1_SMBUS_TIMEOUT_Msk /*!< SMBUS timeout mode stopped when Core is halted */\n#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT_Pos (16U)                             \n#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT_Msk (0x1UL << DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT_Pos) /*!< 0x00010000 */\n#define DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT    DBGMCU_CR_DBG_I2C2_SMBUS_TIMEOUT_Msk /*!< SMBUS timeout mode stopped when Core is halted */\n#define DBGMCU_CR_DBG_TIM8_STOP_Pos         (17U)                              \n#define DBGMCU_CR_DBG_TIM8_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM8_STOP_Pos) /*!< 0x00020000 */\n#define DBGMCU_CR_DBG_TIM8_STOP             DBGMCU_CR_DBG_TIM8_STOP_Msk        /*!< TIM8 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM5_STOP_Pos         (18U)                              \n#define DBGMCU_CR_DBG_TIM5_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM5_STOP_Pos) /*!< 0x00040000 */\n#define DBGMCU_CR_DBG_TIM5_STOP             DBGMCU_CR_DBG_TIM5_STOP_Msk        /*!< TIM5 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM6_STOP_Pos         (19U)                              \n#define DBGMCU_CR_DBG_TIM6_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM6_STOP_Pos) /*!< 0x00080000 */\n#define DBGMCU_CR_DBG_TIM6_STOP             DBGMCU_CR_DBG_TIM6_STOP_Msk        /*!< TIM6 counter stopped when core is halted */\n#define DBGMCU_CR_DBG_TIM7_STOP_Pos         (20U)                              \n#define DBGMCU_CR_DBG_TIM7_STOP_Msk         (0x1UL << DBGMCU_CR_DBG_TIM7_STOP_Pos) /*!< 0x00100000 */\n#define DBGMCU_CR_DBG_TIM7_STOP             DBGMCU_CR_DBG_TIM7_STOP_Msk        /*!< TIM7 counter stopped when core is halted */\n\n/******************************************************************************/\n/*                                                                            */\n/*                      FLASH and Option Bytes Registers                      */\n/*                                                                            */\n/******************************************************************************/\n/*******************  Bit definition for FLASH_ACR register  ******************/\n#define FLASH_ACR_LATENCY_Pos               (0U)                               \n#define FLASH_ACR_LATENCY_Msk               (0x7UL << FLASH_ACR_LATENCY_Pos)    /*!< 0x00000007 */\n#define FLASH_ACR_LATENCY                   FLASH_ACR_LATENCY_Msk              /*!< LATENCY[2:0] bits (Latency) */\n#define FLASH_ACR_LATENCY_0                 (0x1UL << FLASH_ACR_LATENCY_Pos)    /*!< 0x00000001 */\n#define FLASH_ACR_LATENCY_1                 (0x2UL << FLASH_ACR_LATENCY_Pos)    /*!< 0x00000002 */\n#define FLASH_ACR_LATENCY_2                 (0x4UL << FLASH_ACR_LATENCY_Pos)    /*!< 0x00000004 */\n\n#define FLASH_ACR_HLFCYA_Pos                (3U)                               \n#define FLASH_ACR_HLFCYA_Msk                (0x1UL << FLASH_ACR_HLFCYA_Pos)     /*!< 0x00000008 */\n#define FLASH_ACR_HLFCYA                    FLASH_ACR_HLFCYA_Msk               /*!< Flash Half Cycle Access Enable */\n#define FLASH_ACR_PRFTBE_Pos                (4U)                               \n#define FLASH_ACR_PRFTBE_Msk                (0x1UL << FLASH_ACR_PRFTBE_Pos)     /*!< 0x00000010 */\n#define FLASH_ACR_PRFTBE                    FLASH_ACR_PRFTBE_Msk               /*!< Prefetch Buffer Enable */\n#define FLASH_ACR_PRFTBS_Pos                (5U)                               \n#define FLASH_ACR_PRFTBS_Msk                (0x1UL << FLASH_ACR_PRFTBS_Pos)     /*!< 0x00000020 */\n#define FLASH_ACR_PRFTBS                    FLASH_ACR_PRFTBS_Msk               /*!< Prefetch Buffer Status */\n\n/******************  Bit definition for FLASH_KEYR register  ******************/\n#define FLASH_KEYR_FKEYR_Pos                (0U)                               \n#define FLASH_KEYR_FKEYR_Msk                (0xFFFFFFFFUL << FLASH_KEYR_FKEYR_Pos) /*!< 0xFFFFFFFF */\n#define FLASH_KEYR_FKEYR                    FLASH_KEYR_FKEYR_Msk               /*!< FPEC Key */\n\n#define RDP_KEY_Pos                         (0U)                               \n#define RDP_KEY_Msk                         (0xA5UL << RDP_KEY_Pos)             /*!< 0x000000A5 */\n#define RDP_KEY                             RDP_KEY_Msk                        /*!< RDP Key */\n#define FLASH_KEY1_Pos                      (0U)                               \n#define FLASH_KEY1_Msk                      (0x45670123UL << FLASH_KEY1_Pos)    /*!< 0x45670123 */\n#define FLASH_KEY1                          FLASH_KEY1_Msk                     /*!< FPEC Key1 */\n#define FLASH_KEY2_Pos                      (0U)                               \n#define FLASH_KEY2_Msk                      (0xCDEF89ABUL << FLASH_KEY2_Pos)    /*!< 0xCDEF89AB */\n#define FLASH_KEY2                          FLASH_KEY2_Msk                     /*!< FPEC Key2 */\n\n/*****************  Bit definition for FLASH_OPTKEYR register  ****************/\n#define FLASH_OPTKEYR_OPTKEYR_Pos           (0U)                               \n#define FLASH_OPTKEYR_OPTKEYR_Msk           (0xFFFFFFFFUL << FLASH_OPTKEYR_OPTKEYR_Pos) /*!< 0xFFFFFFFF */\n#define FLASH_OPTKEYR_OPTKEYR               FLASH_OPTKEYR_OPTKEYR_Msk          /*!< Option Byte Key */\n\n#define  FLASH_OPTKEY1                       FLASH_KEY1                    /*!< Option Byte Key1 */\n#define  FLASH_OPTKEY2                       FLASH_KEY2                    /*!< Option Byte Key2 */\n\n/******************  Bit definition for FLASH_SR register  ********************/\n#define FLASH_SR_BSY_Pos                    (0U)                               \n#define FLASH_SR_BSY_Msk                    (0x1UL << FLASH_SR_BSY_Pos)         /*!< 0x00000001 */\n#define FLASH_SR_BSY                        FLASH_SR_BSY_Msk                   /*!< Busy */\n#define FLASH_SR_PGERR_Pos                  (2U)                               \n#define FLASH_SR_PGERR_Msk                  (0x1UL << FLASH_SR_PGERR_Pos)       /*!< 0x00000004 */\n#define FLASH_SR_PGERR                      FLASH_SR_PGERR_Msk                 /*!< Programming Error */\n#define FLASH_SR_WRPRTERR_Pos               (4U)                               \n#define FLASH_SR_WRPRTERR_Msk               (0x1UL << FLASH_SR_WRPRTERR_Pos)    /*!< 0x00000010 */\n#define FLASH_SR_WRPRTERR                   FLASH_SR_WRPRTERR_Msk              /*!< Write Protection Error */\n#define FLASH_SR_EOP_Pos                    (5U)                               \n#define FLASH_SR_EOP_Msk                    (0x1UL << FLASH_SR_EOP_Pos)         /*!< 0x00000020 */\n#define FLASH_SR_EOP                        FLASH_SR_EOP_Msk                   /*!< End of operation */\n\n/*******************  Bit definition for FLASH_CR register  *******************/\n#define FLASH_CR_PG_Pos                     (0U)                               \n#define FLASH_CR_PG_Msk                     (0x1UL << FLASH_CR_PG_Pos)          /*!< 0x00000001 */\n#define FLASH_CR_PG                         FLASH_CR_PG_Msk                    /*!< Programming */\n#define FLASH_CR_PER_Pos                    (1U)                               \n#define FLASH_CR_PER_Msk                    (0x1UL << FLASH_CR_PER_Pos)         /*!< 0x00000002 */\n#define FLASH_CR_PER                        FLASH_CR_PER_Msk                   /*!< Page Erase */\n#define FLASH_CR_MER_Pos                    (2U)                               \n#define FLASH_CR_MER_Msk                    (0x1UL << FLASH_CR_MER_Pos)         /*!< 0x00000004 */\n#define FLASH_CR_MER                        FLASH_CR_MER_Msk                   /*!< Mass Erase */\n#define FLASH_CR_OPTPG_Pos                  (4U)                               \n#define FLASH_CR_OPTPG_Msk                  (0x1UL << FLASH_CR_OPTPG_Pos)       /*!< 0x00000010 */\n#define FLASH_CR_OPTPG                      FLASH_CR_OPTPG_Msk                 /*!< Option Byte Programming */\n#define FLASH_CR_OPTER_Pos                  (5U)                               \n#define FLASH_CR_OPTER_Msk                  (0x1UL << FLASH_CR_OPTER_Pos)       /*!< 0x00000020 */\n#define FLASH_CR_OPTER                      FLASH_CR_OPTER_Msk                 /*!< Option Byte Erase */\n#define FLASH_CR_STRT_Pos                   (6U)                               \n#define FLASH_CR_STRT_Msk                   (0x1UL << FLASH_CR_STRT_Pos)        /*!< 0x00000040 */\n#define FLASH_CR_STRT                       FLASH_CR_STRT_Msk                  /*!< Start */\n#define FLASH_CR_LOCK_Pos                   (7U)                               \n#define FLASH_CR_LOCK_Msk                   (0x1UL << FLASH_CR_LOCK_Pos)        /*!< 0x00000080 */\n#define FLASH_CR_LOCK                       FLASH_CR_LOCK_Msk                  /*!< Lock */\n#define FLASH_CR_OPTWRE_Pos                 (9U)                               \n#define FLASH_CR_OPTWRE_Msk                 (0x1UL << FLASH_CR_OPTWRE_Pos)      /*!< 0x00000200 */\n#define FLASH_CR_OPTWRE                     FLASH_CR_OPTWRE_Msk                /*!< Option Bytes Write Enable */\n#define FLASH_CR_ERRIE_Pos                  (10U)                              \n#define FLASH_CR_ERRIE_Msk                  (0x1UL << FLASH_CR_ERRIE_Pos)       /*!< 0x00000400 */\n#define FLASH_CR_ERRIE                      FLASH_CR_ERRIE_Msk                 /*!< Error Interrupt Enable */\n#define FLASH_CR_EOPIE_Pos                  (12U)                              \n#define FLASH_CR_EOPIE_Msk                  (0x1UL << FLASH_CR_EOPIE_Pos)       /*!< 0x00001000 */\n#define FLASH_CR_EOPIE                      FLASH_CR_EOPIE_Msk                 /*!< End of operation interrupt enable */\n\n/*******************  Bit definition for FLASH_AR register  *******************/\n#define FLASH_AR_FAR_Pos                    (0U)                               \n#define FLASH_AR_FAR_Msk                    (0xFFFFFFFFUL << FLASH_AR_FAR_Pos)  /*!< 0xFFFFFFFF */\n#define FLASH_AR_FAR                        FLASH_AR_FAR_Msk                   /*!< Flash Address */\n\n/******************  Bit definition for FLASH_OBR register  *******************/\n#define FLASH_OBR_OPTERR_Pos                (0U)                               \n#define FLASH_OBR_OPTERR_Msk                (0x1UL << FLASH_OBR_OPTERR_Pos)     /*!< 0x00000001 */\n#define FLASH_OBR_OPTERR                    FLASH_OBR_OPTERR_Msk               /*!< Option Byte Error */\n#define FLASH_OBR_RDPRT_Pos                 (1U)                               \n#define FLASH_OBR_RDPRT_Msk                 (0x1UL << FLASH_OBR_RDPRT_Pos)      /*!< 0x00000002 */\n#define FLASH_OBR_RDPRT                     FLASH_OBR_RDPRT_Msk                /*!< Read protection */\n\n#define FLASH_OBR_IWDG_SW_Pos               (2U)                               \n#define FLASH_OBR_IWDG_SW_Msk               (0x1UL << FLASH_OBR_IWDG_SW_Pos)    /*!< 0x00000004 */\n#define FLASH_OBR_IWDG_SW                   FLASH_OBR_IWDG_SW_Msk              /*!< IWDG SW */\n#define FLASH_OBR_nRST_STOP_Pos             (3U)                               \n#define FLASH_OBR_nRST_STOP_Msk             (0x1UL << FLASH_OBR_nRST_STOP_Pos)  /*!< 0x00000008 */\n#define FLASH_OBR_nRST_STOP                 FLASH_OBR_nRST_STOP_Msk            /*!< nRST_STOP */\n#define FLASH_OBR_nRST_STDBY_Pos            (4U)                               \n#define FLASH_OBR_nRST_STDBY_Msk            (0x1UL << FLASH_OBR_nRST_STDBY_Pos) /*!< 0x00000010 */\n#define FLASH_OBR_nRST_STDBY                FLASH_OBR_nRST_STDBY_Msk           /*!< nRST_STDBY */\n#define FLASH_OBR_USER_Pos                  (2U)                               \n#define FLASH_OBR_USER_Msk                  (0x7UL << FLASH_OBR_USER_Pos)       /*!< 0x0000001C */\n#define FLASH_OBR_USER                      FLASH_OBR_USER_Msk                 /*!< User Option Bytes */\n#define FLASH_OBR_DATA0_Pos                 (10U)                              \n#define FLASH_OBR_DATA0_Msk                 (0xFFUL << FLASH_OBR_DATA0_Pos)     /*!< 0x0003FC00 */\n#define FLASH_OBR_DATA0                     FLASH_OBR_DATA0_Msk                /*!< Data0 */\n#define FLASH_OBR_DATA1_Pos                 (18U)                              \n#define FLASH_OBR_DATA1_Msk                 (0xFFUL << FLASH_OBR_DATA1_Pos)     /*!< 0x03FC0000 */\n#define FLASH_OBR_DATA1                     FLASH_OBR_DATA1_Msk                /*!< Data1 */\n\n/******************  Bit definition for FLASH_WRPR register  ******************/\n#define FLASH_WRPR_WRP_Pos                  (0U)                               \n#define FLASH_WRPR_WRP_Msk                  (0xFFFFFFFFUL << FLASH_WRPR_WRP_Pos) /*!< 0xFFFFFFFF */\n#define FLASH_WRPR_WRP                      FLASH_WRPR_WRP_Msk                 /*!< Write Protect */\n\n/*----------------------------------------------------------------------------*/\n\n/******************  Bit definition for FLASH_RDP register  *******************/\n#define FLASH_RDP_RDP_Pos                   (0U)                               \n#define FLASH_RDP_RDP_Msk                   (0xFFUL << FLASH_RDP_RDP_Pos)       /*!< 0x000000FF */\n#define FLASH_RDP_RDP                       FLASH_RDP_RDP_Msk                  /*!< Read protection option byte */\n#define FLASH_RDP_nRDP_Pos                  (8U)                               \n#define FLASH_RDP_nRDP_Msk                  (0xFFUL << FLASH_RDP_nRDP_Pos)      /*!< 0x0000FF00 */\n#define FLASH_RDP_nRDP                      FLASH_RDP_nRDP_Msk                 /*!< Read protection complemented option byte */\n\n/******************  Bit definition for FLASH_USER register  ******************/\n#define FLASH_USER_USER_Pos                 (16U)                              \n#define FLASH_USER_USER_Msk                 (0xFFUL << FLASH_USER_USER_Pos)     /*!< 0x00FF0000 */\n#define FLASH_USER_USER                     FLASH_USER_USER_Msk                /*!< User option byte */\n#define FLASH_USER_nUSER_Pos                (24U)                              \n#define FLASH_USER_nUSER_Msk                (0xFFUL << FLASH_USER_nUSER_Pos)    /*!< 0xFF000000 */\n#define FLASH_USER_nUSER                    FLASH_USER_nUSER_Msk               /*!< User complemented option byte */\n\n/******************  Bit definition for FLASH_Data0 register  *****************/\n#define FLASH_DATA0_DATA0_Pos               (0U)                               \n#define FLASH_DATA0_DATA0_Msk               (0xFFUL << FLASH_DATA0_DATA0_Pos)   /*!< 0x000000FF */\n#define FLASH_DATA0_DATA0                   FLASH_DATA0_DATA0_Msk              /*!< User data storage option byte */\n#define FLASH_DATA0_nDATA0_Pos              (8U)                               \n#define FLASH_DATA0_nDATA0_Msk              (0xFFUL << FLASH_DATA0_nDATA0_Pos)  /*!< 0x0000FF00 */\n#define FLASH_DATA0_nDATA0                  FLASH_DATA0_nDATA0_Msk             /*!< User data storage complemented option byte */\n\n/******************  Bit definition for FLASH_Data1 register  *****************/\n#define FLASH_DATA1_DATA1_Pos               (16U)                              \n#define FLASH_DATA1_DATA1_Msk               (0xFFUL << FLASH_DATA1_DATA1_Pos)   /*!< 0x00FF0000 */\n#define FLASH_DATA1_DATA1                   FLASH_DATA1_DATA1_Msk              /*!< User data storage option byte */\n#define FLASH_DATA1_nDATA1_Pos              (24U)                              \n#define FLASH_DATA1_nDATA1_Msk              (0xFFUL << FLASH_DATA1_nDATA1_Pos)  /*!< 0xFF000000 */\n#define FLASH_DATA1_nDATA1                  FLASH_DATA1_nDATA1_Msk             /*!< User data storage complemented option byte */\n\n/******************  Bit definition for FLASH_WRP0 register  ******************/\n#define FLASH_WRP0_WRP0_Pos                 (0U)                               \n#define FLASH_WRP0_WRP0_Msk                 (0xFFUL << FLASH_WRP0_WRP0_Pos)     /*!< 0x000000FF */\n#define FLASH_WRP0_WRP0                     FLASH_WRP0_WRP0_Msk                /*!< Flash memory write protection option bytes */\n#define FLASH_WRP0_nWRP0_Pos                (8U)                               \n#define FLASH_WRP0_nWRP0_Msk                (0xFFUL << FLASH_WRP0_nWRP0_Pos)    /*!< 0x0000FF00 */\n#define FLASH_WRP0_nWRP0                    FLASH_WRP0_nWRP0_Msk               /*!< Flash memory write protection complemented option bytes */\n\n/******************  Bit definition for FLASH_WRP1 register  ******************/\n#define FLASH_WRP1_WRP1_Pos                 (16U)                              \n#define FLASH_WRP1_WRP1_Msk                 (0xFFUL << FLASH_WRP1_WRP1_Pos)     /*!< 0x00FF0000 */\n#define FLASH_WRP1_WRP1                     FLASH_WRP1_WRP1_Msk                /*!< Flash memory write protection option bytes */\n#define FLASH_WRP1_nWRP1_Pos                (24U)                              \n#define FLASH_WRP1_nWRP1_Msk                (0xFFUL << FLASH_WRP1_nWRP1_Pos)    /*!< 0xFF000000 */\n#define FLASH_WRP1_nWRP1                    FLASH_WRP1_nWRP1_Msk               /*!< Flash memory write protection complemented option bytes */\n\n/******************  Bit definition for FLASH_WRP2 register  ******************/\n#define FLASH_WRP2_WRP2_Pos                 (0U)                               \n#define FLASH_WRP2_WRP2_Msk                 (0xFFUL << FLASH_WRP2_WRP2_Pos)     /*!< 0x000000FF */\n#define FLASH_WRP2_WRP2                     FLASH_WRP2_WRP2_Msk                /*!< Flash memory write protection option bytes */\n#define FLASH_WRP2_nWRP2_Pos                (8U)                               \n#define FLASH_WRP2_nWRP2_Msk                (0xFFUL << FLASH_WRP2_nWRP2_Pos)    /*!< 0x0000FF00 */\n#define FLASH_WRP2_nWRP2                    FLASH_WRP2_nWRP2_Msk               /*!< Flash memory write protection complemented option bytes */\n\n/******************  Bit definition for FLASH_WRP3 register  ******************/\n#define FLASH_WRP3_WRP3_Pos                 (16U)                              \n#define FLASH_WRP3_WRP3_Msk                 (0xFFUL << FLASH_WRP3_WRP3_Pos)     /*!< 0x00FF0000 */\n#define FLASH_WRP3_WRP3                     FLASH_WRP3_WRP3_Msk                /*!< Flash memory write protection option bytes */\n#define FLASH_WRP3_nWRP3_Pos                (24U)                              \n#define FLASH_WRP3_nWRP3_Msk                (0xFFUL << FLASH_WRP3_nWRP3_Pos)    /*!< 0xFF000000 */\n#define FLASH_WRP3_nWRP3                    FLASH_WRP3_nWRP3_Msk               /*!< Flash memory write protection complemented option bytes */\n\n\n\n/**\n  * @}\n*/\n\n/**\n  * @}\n*/ \n\n/** @addtogroup Exported_macro\n  * @{\n  */\n\n/****************************** ADC Instances *********************************/\n#define IS_ADC_ALL_INSTANCE(INSTANCE) (((INSTANCE) == ADC1) || \\\n                                       ((INSTANCE) == ADC2) || \\\n                                       ((INSTANCE) == ADC3))\n                                       \n#define IS_ADC_MULTIMODE_MASTER_INSTANCE(INSTANCE) ((INSTANCE) == ADC1)\n\n#define IS_ADC_COMMON_INSTANCE(INSTANCE) ((INSTANCE) == ADC12_COMMON)\n\n#define IS_ADC_DMA_CAPABILITY_INSTANCE(INSTANCE) (((INSTANCE) == ADC1) || \\\n                                                  ((INSTANCE) == ADC3))\n\n/****************************** CAN Instances *********************************/    \n#define IS_CAN_ALL_INSTANCE(INSTANCE) ((INSTANCE) == CAN1)\n\n/****************************** CRC Instances *********************************/\n#define IS_CRC_ALL_INSTANCE(INSTANCE) ((INSTANCE) == CRC)\n\n/****************************** DAC Instances *********************************/\n#define IS_DAC_ALL_INSTANCE(INSTANCE) ((INSTANCE) == DAC1)\n\n/****************************** DMA Instances *********************************/\n#define IS_DMA_ALL_INSTANCE(INSTANCE) (((INSTANCE) == DMA1_Channel1) || \\\n                                       ((INSTANCE) == DMA1_Channel2) || \\\n                                       ((INSTANCE) == DMA1_Channel3) || \\\n                                       ((INSTANCE) == DMA1_Channel4) || \\\n                                       ((INSTANCE) == DMA1_Channel5) || \\\n                                       ((INSTANCE) == DMA1_Channel6) || \\\n                                       ((INSTANCE) == DMA1_Channel7) || \\\n                                       ((INSTANCE) == DMA2_Channel1) || \\\n                                       ((INSTANCE) == DMA2_Channel2) || \\\n                                       ((INSTANCE) == DMA2_Channel3) || \\\n                                       ((INSTANCE) == DMA2_Channel4) || \\\n                                       ((INSTANCE) == DMA2_Channel5))\n  \n/******************************* GPIO Instances *******************************/\n#define IS_GPIO_ALL_INSTANCE(INSTANCE) (((INSTANCE) == GPIOA) || \\\n                                        ((INSTANCE) == GPIOB) || \\\n                                        ((INSTANCE) == GPIOC) || \\\n                                        ((INSTANCE) == GPIOD) || \\\n                                        ((INSTANCE) == GPIOE) || \\\n                                        ((INSTANCE) == GPIOF) || \\\n                                        ((INSTANCE) == GPIOG))\n\n/**************************** GPIO Alternate Function Instances ***************/\n#define IS_GPIO_AF_INSTANCE(INSTANCE) IS_GPIO_ALL_INSTANCE(INSTANCE)\n\n/**************************** GPIO Lock Instances *****************************/\n#define IS_GPIO_LOCK_INSTANCE(INSTANCE) IS_GPIO_ALL_INSTANCE(INSTANCE)\n\n/******************************** I2C Instances *******************************/\n#define IS_I2C_ALL_INSTANCE(INSTANCE) (((INSTANCE) == I2C1) || \\\n                                       ((INSTANCE) == I2C2))\n\n/******************************* SMBUS Instances ******************************/\n#define IS_SMBUS_ALL_INSTANCE         IS_I2C_ALL_INSTANCE\n\n/******************************** I2S Instances *******************************/\n#define IS_I2S_ALL_INSTANCE(INSTANCE) (((INSTANCE) == SPI2) || \\\n                                       ((INSTANCE) == SPI3))\n\n/****************************** IWDG Instances ********************************/\n#define IS_IWDG_ALL_INSTANCE(INSTANCE)  ((INSTANCE) == IWDG)\n\n/****************************** SDIO Instances *********************************/\n#define IS_SDIO_ALL_INSTANCE(INSTANCE) ((INSTANCE) == SDIO)\n\n/******************************** SPI Instances *******************************/\n#define IS_SPI_ALL_INSTANCE(INSTANCE) (((INSTANCE) == SPI1) || \\\n                                       ((INSTANCE) == SPI2) || \\\n                                       ((INSTANCE) == SPI3))\n\n/****************************** START TIM Instances ***************************/\n/****************************** TIM Instances *********************************/\n#define IS_TIM_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5)    || \\\n   ((INSTANCE) == TIM6)    || \\\n   ((INSTANCE) == TIM7))\n\n#define IS_TIM_ADVANCED_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8))\n\n#define IS_TIM_CC1_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CC2_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CC3_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CC4_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CLOCKSOURCE_ETRMODE1_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CLOCKSOURCE_ETRMODE2_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CLOCKSOURCE_TIX_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_CLOCKSOURCE_ITRX_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_OCXREF_CLEAR_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_ENCODER_INTERFACE_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_XOR_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_MASTER_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5)    || \\\n   ((INSTANCE) == TIM6)    || \\\n   ((INSTANCE) == TIM7))\n\n#define IS_TIM_SLAVE_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_SYNCHRO_INSTANCE(INSTANCE)  IS_TIM_MASTER_INSTANCE(INSTANCE)\n\n#define IS_TIM_DMABURST_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_BREAK_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8))\n\n#define IS_TIM_CCX_INSTANCE(INSTANCE, CHANNEL) \\\n   ((((INSTANCE) == TIM1) &&                  \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4)))           \\\n    ||                                         \\\n    (((INSTANCE) == TIM8) &&                   \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4)))           \\\n    ||                                         \\\n    (((INSTANCE) == TIM2) &&                   \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4)))           \\\n    ||                                         \\\n    (((INSTANCE) == TIM3) &&                   \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4)))           \\\n    ||                                         \\\n    (((INSTANCE) == TIM4) &&                   \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4)))           \\\n    ||                                         \\\n    (((INSTANCE) == TIM5) &&                   \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_3) ||          \\\n      ((CHANNEL) == TIM_CHANNEL_4))))\n\n#define IS_TIM_CCXN_INSTANCE(INSTANCE, CHANNEL) \\\n   ((((INSTANCE) == TIM1) &&                    \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||           \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||           \\\n      ((CHANNEL) == TIM_CHANNEL_3)))            \\\n    ||                                          \\\n    (((INSTANCE) == TIM8) &&                    \\\n     (((CHANNEL) == TIM_CHANNEL_1) ||           \\\n      ((CHANNEL) == TIM_CHANNEL_2) ||           \\\n      ((CHANNEL) == TIM_CHANNEL_3))))\n\n#define IS_TIM_COUNTER_MODE_SELECT_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_REPETITION_COUNTER_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8))\n\n#define IS_TIM_CLOCK_DIVISION_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n\n#define IS_TIM_DMA_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5)    || \\\n   ((INSTANCE) == TIM6)    || \\\n   ((INSTANCE) == TIM7))\n    \n#define IS_TIM_DMA_CC_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8)    || \\\n   ((INSTANCE) == TIM2)    || \\\n   ((INSTANCE) == TIM3)    || \\\n   ((INSTANCE) == TIM4)    || \\\n   ((INSTANCE) == TIM5))\n    \n#define IS_TIM_COMMUTATION_EVENT_INSTANCE(INSTANCE)\\\n  (((INSTANCE) == TIM1)    || \\\n   ((INSTANCE) == TIM8))\n\n#define IS_TIM_ETR_INSTANCE(INSTANCE)  (((INSTANCE) == TIM1)    || \\\n                                        ((INSTANCE) == TIM2)    || \\\n                                        ((INSTANCE) == TIM3)    || \\\n                                        ((INSTANCE) == TIM4)    || \\\n                                        ((INSTANCE) == TIM5)    || \\\n                                        ((INSTANCE) == TIM8))\n\n#define IS_TIM_HALL_SENSOR_INTERFACE_INSTANCE(INSTANCE) (((INSTANCE) == TIM1)    || \\\n                                                         ((INSTANCE) == TIM2)    || \\\n                                                         ((INSTANCE) == TIM3)    || \\\n                                                         ((INSTANCE) == TIM4)    || \\\n                                                         ((INSTANCE) == TIM5)    || \\\n                                                         ((INSTANCE) == TIM8))\n\n#define IS_TIM_32B_COUNTER_INSTANCE(INSTANCE)           0U\n\n/****************************** END TIM Instances *****************************/\n\n\n/******************** USART Instances : Synchronous mode **********************/                                           \n#define IS_USART_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                     ((INSTANCE) == USART2) || \\\n                                     ((INSTANCE) == USART3))\n\n/******************** UART Instances : Asynchronous mode **********************/\n#define IS_UART_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                    ((INSTANCE) == USART2) || \\\n                                    ((INSTANCE) == USART3) || \\\n                                    ((INSTANCE) == UART4)  || \\\n                                    ((INSTANCE) == UART5))\n\n/******************** UART Instances : Half-Duplex mode **********************/\n#define IS_UART_HALFDUPLEX_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                               ((INSTANCE) == USART2) || \\\n                                               ((INSTANCE) == USART3) || \\\n                                               ((INSTANCE) == UART4)  || \\\n                                               ((INSTANCE) == UART5))\n\n/******************** UART Instances : LIN mode **********************/\n#define IS_UART_LIN_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                        ((INSTANCE) == USART2) || \\\n                                        ((INSTANCE) == USART3) || \\\n                                        ((INSTANCE) == UART4)  || \\\n                                        ((INSTANCE) == UART5))\n\n/****************** UART Instances : Hardware Flow control ********************/                                    \n#define IS_UART_HWFLOW_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                           ((INSTANCE) == USART2) || \\\n                                           ((INSTANCE) == USART3))\n\n/********************* UART Instances : Smard card mode ***********************/\n#define IS_SMARTCARD_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                         ((INSTANCE) == USART2) || \\\n                                         ((INSTANCE) == USART3))\n\n/*********************** UART Instances : IRDA mode ***************************/\n#define IS_IRDA_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                    ((INSTANCE) == USART2) || \\\n                                    ((INSTANCE) == USART3) || \\\n                                    ((INSTANCE) == UART4)  || \\\n                                    ((INSTANCE) == UART5))\n\n/***************** UART Instances : Multi-Processor mode **********************/\n#define IS_UART_MULTIPROCESSOR_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                                   ((INSTANCE) == USART2) || \\\n                                                   ((INSTANCE) == USART3) || \\\n                                                   ((INSTANCE) == UART4)  || \\\n                                                   ((INSTANCE) == UART5))\n\n/***************** UART Instances : DMA mode available **********************/\n#define IS_UART_DMA_INSTANCE(INSTANCE) (((INSTANCE) == USART1) || \\\n                                        ((INSTANCE) == USART2) || \\\n                                        ((INSTANCE) == USART3) || \\\n                                        ((INSTANCE) == UART4))\n\n/****************************** RTC Instances *********************************/\n#define IS_RTC_ALL_INSTANCE(INSTANCE)  ((INSTANCE) == RTC)\n\n/**************************** WWDG Instances *****************************/\n#define IS_WWDG_ALL_INSTANCE(INSTANCE)  ((INSTANCE) == WWDG)\n\n/****************************** USB Instances ********************************/\n#define IS_USB_ALL_INSTANCE(INSTANCE)   ((INSTANCE) == USB)\n\n\n\n#define RCC_HSE_MIN         4000000U\n#define RCC_HSE_MAX        16000000U\n\n#define RCC_MAX_FREQUENCY  72000000U\n\n/**\n  * @}\n  */ \n/******************************************************************************/\n/*  For a painless codes migration between the STM32F1xx device product       */\n/*  lines, the aliases defined below are put in place to overcome the         */\n/*  differences in the interrupt handlers and IRQn definitions.               */\n/*  No need to update developed interrupt code when moving across             */ \n/*  product lines within the same STM32F1 Family                              */\n/******************************************************************************/\n\n/* Aliases for __IRQn */\n#define ADC1_IRQn               ADC1_2_IRQn\n#define DMA2_Channel4_IRQn      DMA2_Channel4_5_IRQn\n#define TIM9_IRQn               TIM1_BRK_IRQn\n#define TIM1_BRK_TIM9_IRQn      TIM1_BRK_IRQn\n#define TIM1_BRK_TIM15_IRQn     TIM1_BRK_IRQn\n#define TIM1_TRG_COM_TIM11_IRQn TIM1_TRG_COM_IRQn\n#define TIM11_IRQn              TIM1_TRG_COM_IRQn\n#define TIM1_TRG_COM_TIM17_IRQn TIM1_TRG_COM_IRQn\n#define TIM10_IRQn              TIM1_UP_IRQn\n#define TIM1_UP_TIM16_IRQn      TIM1_UP_IRQn\n#define TIM1_UP_TIM10_IRQn      TIM1_UP_IRQn\n#define TIM6_DAC_IRQn           TIM6_IRQn\n#define TIM12_IRQn              TIM8_BRK_IRQn\n#define TIM8_BRK_TIM12_IRQn     TIM8_BRK_IRQn\n#define TIM8_TRG_COM_TIM14_IRQn TIM8_TRG_COM_IRQn\n#define TIM14_IRQn              TIM8_TRG_COM_IRQn\n#define TIM8_UP_TIM13_IRQn      TIM8_UP_IRQn\n#define TIM13_IRQn              TIM8_UP_IRQn\n#define CEC_IRQn                USBWakeUp_IRQn\n#define OTG_FS_WKUP_IRQn        USBWakeUp_IRQn\n#define USB_HP_IRQn             USB_HP_CAN1_TX_IRQn\n#define CAN1_TX_IRQn            USB_HP_CAN1_TX_IRQn\n#define USB_LP_IRQn             USB_LP_CAN1_RX0_IRQn\n#define CAN1_RX0_IRQn           USB_LP_CAN1_RX0_IRQn\n\n\n/* Aliases for __IRQHandler */\n#define ADC1_IRQHandler               ADC1_2_IRQHandler\n#define DMA2_Channel4_IRQHandler      DMA2_Channel4_5_IRQHandler\n#define TIM9_IRQHandler               TIM1_BRK_IRQHandler\n#define TIM1_BRK_TIM9_IRQHandler      TIM1_BRK_IRQHandler\n#define TIM1_BRK_TIM15_IRQHandler     TIM1_BRK_IRQHandler\n#define TIM1_TRG_COM_TIM11_IRQHandler TIM1_TRG_COM_IRQHandler\n#define TIM11_IRQHandler              TIM1_TRG_COM_IRQHandler\n#define TIM1_TRG_COM_TIM17_IRQHandler TIM1_TRG_COM_IRQHandler\n#define TIM10_IRQHandler              TIM1_UP_IRQHandler\n#define TIM1_UP_TIM16_IRQHandler      TIM1_UP_IRQHandler\n#define TIM1_UP_TIM10_IRQHandler      TIM1_UP_IRQHandler\n#define TIM6_DAC_IRQHandler           TIM6_IRQHandler\n#define TIM12_IRQHandler              TIM8_BRK_IRQHandler\n#define TIM8_BRK_TIM12_IRQHandler     TIM8_BRK_IRQHandler\n#define TIM8_TRG_COM_TIM14_IRQHandler TIM8_TRG_COM_IRQHandler\n#define TIM14_IRQHandler              TIM8_TRG_COM_IRQHandler\n#define TIM8_UP_TIM13_IRQHandler      TIM8_UP_IRQHandler\n#define TIM13_IRQHandler              TIM8_UP_IRQHandler\n#define CEC_IRQHandler                USBWakeUp_IRQHandler\n#define OTG_FS_WKUP_IRQHandler        USBWakeUp_IRQHandler\n#define USB_HP_IRQHandler             USB_HP_CAN1_TX_IRQHandler\n#define CAN1_TX_IRQHandler            USB_HP_CAN1_TX_IRQHandler\n#define USB_LP_IRQHandler             USB_LP_CAN1_RX0_IRQHandler\n#define CAN1_RX0_IRQHandler           USB_LP_CAN1_RX0_IRQHandler\n\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n\n\n#ifdef __cplusplus\n  }\n#endif /* __cplusplus */\n  \n#endif /* __STM32F103xE_H */\n  \n  \n  \n  /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/stm32f1xx.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f1xx.h\n  * @author  MCD Application Team\n  * @version V4.2.0\n  * @date    31-March-2017\n  * @brief   CMSIS STM32F1xx Device Peripheral Access Layer Header File. \n  *\n  *          The file is the unique include file that the application programmer\n  *          is using in the C source code, usually in main.c. This file contains:\n  *            - Configuration section that allows to select:\n  *              - The STM32F1xx device used in the target application\n  *              - To use or not the peripherals drivers in application code(i.e. \n  *                code will be based on direct access to peripherals registers \n  *                rather than drivers API), this option is controlled by \n  *                \"#define USE_HAL_DRIVER\"\n  *  \n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>\n  *\n  * Redistribution and use in source and binary forms, with or without modification,\n  * are permitted provided that the following conditions are met:\n  *   1. Redistributions of source code must retain the above copyright notice,\n  *      this list of conditions and the following disclaimer.\n  *   2. Redistributions in binary form must reproduce the above copyright notice,\n  *      this list of conditions and the following disclaimer in the documentation\n  *      and/or other materials provided with the distribution.\n  *   3. Neither the name of STMicroelectronics nor the names of its contributors\n  *      may be used to endorse or promote products derived from this software\n  *      without specific prior written permission.\n  *\n  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  *\n  ******************************************************************************\n  */\n\n/** @addtogroup CMSIS\n  * @{\n  */\n\n/** @addtogroup stm32f1xx\n  * @{\n  */\n    \n#ifndef __STM32F1XX_H\n#define __STM32F1XX_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif /* __cplusplus */\n  \n/** @addtogroup Library_configuration_section\n  * @{\n  */\n\n/**\n  * @brief STM32 Family\n  */\n#if !defined (STM32F1)\n#define STM32F1\n#endif /* STM32F1 */\n\n/* Uncomment the line below according to the target STM32L device used in your \n   application \n  */\n\n#if !defined (STM32F100xB) && !defined (STM32F100xE) && !defined (STM32F101x6) && \\\n    !defined (STM32F101xB) && !defined (STM32F101xE) && !defined (STM32F101xG) && !defined (STM32F102x6) && !defined (STM32F102xB) && !defined (STM32F103x6) && \\\n    !defined (STM32F103xB) && !defined (STM32F103xE) && !defined (STM32F103xG) && !defined (STM32F105xC) && !defined (STM32F107xC)\n  /* #define STM32F100xB */   /*!< STM32F100C4, STM32F100R4, STM32F100C6, STM32F100R6, STM32F100C8, STM32F100R8, STM32F100V8, STM32F100CB, STM32F100RB and STM32F100VB */\n  /* #define STM32F100xE */   /*!< STM32F100RC, STM32F100VC, STM32F100ZC, STM32F100RD, STM32F100VD, STM32F100ZD, STM32F100RE, STM32F100VE and STM32F100ZE */\n  /* #define STM32F101x6 */   /*!< STM32F101C4, STM32F101R4, STM32F101T4, STM32F101C6, STM32F101R6 and STM32F101T6 Devices */\n  /* #define STM32F101xB */   /*!< STM32F101C8, STM32F101R8, STM32F101T8, STM32F101V8, STM32F101CB, STM32F101RB, STM32F101TB and STM32F101VB */\n  /* #define STM32F101xE */   /*!< STM32F101RC, STM32F101VC, STM32F101ZC, STM32F101RD, STM32F101VD, STM32F101ZD, STM32F101RE, STM32F101VE and STM32F101ZE */ \n  /* #define STM32F101xG */   /*!< STM32F101RF, STM32F101VF, STM32F101ZF, STM32F101RG, STM32F101VG and STM32F101ZG */\n  /* #define STM32F102x6 */   /*!< STM32F102C4, STM32F102R4, STM32F102C6 and STM32F102R6 */\n  /* #define STM32F102xB */   /*!< STM32F102C8, STM32F102R8, STM32F102CB and STM32F102RB */\n  /* #define STM32F103x6 */   /*!< STM32F103C4, STM32F103R4, STM32F103T4, STM32F103C6, STM32F103R6 and STM32F103T6 */\n  /* #define STM32F103xB */          /*!< STM32F103C8, STM32F103R8, STM32F103T8, STM32F103V8, STM32F103CB, STM32F103RB, STM32F103TB and STM32F103VB */\n  #define STM32F103xE    /*!< STM32F103RC, STM32F103VC, STM32F103ZC, STM32F103RD, STM32F103VD, STM32F103ZD, STM32F103RE, STM32F103VE and STM32F103ZE */\n  /* #define STM32F103xG */   /*!< STM32F103RF, STM32F103VF, STM32F103ZF, STM32F103RG, STM32F103VG and STM32F103ZG */\n  /* #define STM32F105xC */   /*!< STM32F105R8, STM32F105V8, STM32F105RB, STM32F105VB, STM32F105RC and STM32F105VC */\n  /* #define STM32F107xC */   /*!< STM32F107RB, STM32F107VB, STM32F107RC and STM32F107VC */  \n#endif\n\n/*  Tip: To avoid modifying this file each time you need to switch between these\n        devices, you can define the device in your toolchain compiler preprocessor.\n  */\n  \n#if !defined  (USE_HAL_DRIVER)\n/**\n * @brief Comment the line below if you will not use the peripherals drivers.\n   In this case, these drivers will not be included and the application code will \n   be based on direct access to peripherals registers \n   */\n#define USE_HAL_DRIVER\n#endif /* USE_HAL_DRIVER */\n\n/**\n  * @brief CMSIS Device version number V4.2.0\n  */\n#define __STM32F1_CMSIS_VERSION_MAIN   (0x04) /*!< [31:24] main version */\n#define __STM32F1_CMSIS_VERSION_SUB1   (0x02) /*!< [23:16] sub1 version */\n#define __STM32F1_CMSIS_VERSION_SUB2   (0x00) /*!< [15:8]  sub2 version */\n#define __STM32F1_CMSIS_VERSION_RC     (0x00) /*!< [7:0]  release candidate */ \n#define __STM32F1_CMSIS_VERSION        ((__STM32F1_CMSIS_VERSION_MAIN << 24)\\\n                                       |(__STM32F1_CMSIS_VERSION_SUB1 << 16)\\\n                                       |(__STM32F1_CMSIS_VERSION_SUB2 << 8 )\\\n                                       |(__STM32F1_CMSIS_VERSION_RC))\n\n/**\n  * @}\n  */\n\n/** @addtogroup Device_Included\n  * @{\n  */\n\n#if defined(STM32F100xB)\n  #include \"stm32f100xb.h\"\n#elif defined(STM32F100xE)\n  #include \"stm32f100xe.h\"\n#elif defined(STM32F101x6)\n  #include \"stm32f101x6.h\"\n#elif defined(STM32F101xB)\n  #include \"stm32f101xb.h\"\n#elif defined(STM32F101xE)\n  #include \"stm32f101xe.h\"\n#elif defined(STM32F101xG)\n  #include \"stm32f101xg.h\"\n#elif defined(STM32F102x6)\n  #include \"stm32f102x6.h\"\n#elif defined(STM32F102xB)\n  #include \"stm32f102xb.h\"\n#elif defined(STM32F103x6)\n  #include \"stm32f103x6.h\"\n#elif defined(STM32F103xB)\n  #include \"stm32f103xb.h\"\n#elif defined(STM32F103xE)\n  #include \"stm32f103xe.h\"\n#elif defined(STM32F103xG)\n  #include \"stm32f103xg.h\"\n#elif defined(STM32F105xC)\n  #include \"stm32f105xc.h\"\n#elif defined(STM32F107xC)\n  #include \"stm32f107xc.h\"\n#else\n #error \"Please select first the target STM32F1xx device used in your application (in stm32f1xx.h file)\"\n#endif\n\n/**\n  * @}\n  */\n\n/** @addtogroup Exported_types\n  * @{\n  */  \ntypedef enum \n{\n  RESET = 0, \n  SET = !RESET\n} FlagStatus, ITStatus;\n\ntypedef enum \n{\n  DISABLE = 0, \n  ENABLE = !DISABLE\n} FunctionalState;\n#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))\n\ntypedef enum \n{\n  ERROR = 0, \n  SUCCESS = !ERROR\n} ErrorStatus;\n\n/**\n  * @}\n  */\n\n\n/** @addtogroup Exported_macros\n  * @{\n  */\n#define SET_BIT(REG, BIT)     ((REG) |= (BIT))\n\n#define CLEAR_BIT(REG, BIT)   ((REG) &= ~(BIT))\n\n#define READ_BIT(REG, BIT)    ((REG) & (BIT))\n\n#define CLEAR_REG(REG)        ((REG) = (0x0))\n\n#define WRITE_REG(REG, VAL)   ((REG) = (VAL))\n\n#define READ_REG(REG)         ((REG))\n\n#define MODIFY_REG(REG, CLEARMASK, SETMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))\n\n#define POSITION_VAL(VAL)     (__CLZ(__RBIT(VAL))) \n\n\n/**\n  * @}\n  */\n\n#if defined (USE_HAL_DRIVER)\n #include \"stm32f1xx_hal.h\"\n#endif /* USE_HAL_DRIVER */\n\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* __STM32F1xx_H */\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n  \n\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/system_stm32f1xx.h",
    "content": "/**\n  ******************************************************************************\n  * @file    system_stm32f10x.h\n  * @author  MCD Application Team\n  * @version V4.2.0\n  * @date    31-March-2017\n  * @brief   CMSIS Cortex-M3 Device Peripheral Access Layer System Header File.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>\n  *\n  * Redistribution and use in source and binary forms, with or without modification,\n  * are permitted provided that the following conditions are met:\n  *   1. Redistributions of source code must retain the above copyright notice,\n  *      this list of conditions and the following disclaimer.\n  *   2. Redistributions in binary form must reproduce the above copyright notice,\n  *      this list of conditions and the following disclaimer in the documentation\n  *      and/or other materials provided with the distribution.\n  *   3. Neither the name of STMicroelectronics nor the names of its contributors\n  *      may be used to endorse or promote products derived from this software\n  *      without specific prior written permission.\n  *\n  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  *\n  ******************************************************************************\n  */\n\n/** @addtogroup CMSIS\n  * @{\n  */\n\n/** @addtogroup stm32f10x_system\n  * @{\n  */  \n  \n/**\n  * @brief Define to prevent recursive inclusion\n  */\n#ifndef __SYSTEM_STM32F10X_H\n#define __SYSTEM_STM32F10X_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif \n\n/** @addtogroup STM32F10x_System_Includes\n  * @{\n  */\n\n/**\n  * @}\n  */\n\n\n/** @addtogroup STM32F10x_System_Exported_types\n  * @{\n  */\n\nextern uint32_t SystemCoreClock;          /*!< System Clock Frequency (Core Clock) */\nextern const uint8_t  AHBPrescTable[16U];  /*!< AHB prescalers table values */\nextern const uint8_t  APBPrescTable[8U];   /*!< APB prescalers table values */\n\n/**\n  * @}\n  */\n\n/** @addtogroup STM32F10x_System_Exported_Constants\n  * @{\n  */\n\n/**\n  * @}\n  */\n\n/** @addtogroup STM32F10x_System_Exported_Macros\n  * @{\n  */\n\n/**\n  * @}\n  */\n\n/** @addtogroup STM32F10x_System_Exported_Functions\n  * @{\n  */\n  \nextern void SystemInit(void);\nextern void SystemCoreClockUpdate(void);\nextern void SetSysClock(void);\n\n/**\n  * @}\n  */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*__SYSTEM_STM32F10X_H */\n\n/**\n  * @}\n  */\n  \n/**\n  * @}\n  */  \n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/device/us_ticker_data.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2006-2018 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef __US_TICKER_DATA_H\n#define __US_TICKER_DATA_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"stm32f1xx.h\"\n#include \"stm32f1xx_ll_tim.h\"\n#include \"cmsis_nvic.h\"\n   \n#define TIM_MST      TIM4\n#define TIM_MST_IRQ  TIM4_IRQn\n#define TIM_MST_RCC  __HAL_RCC_TIM4_CLK_ENABLE()\n#define TIM_MST_DBGMCU_FREEZE  __HAL_DBGMCU_FREEZE_TIM4()\n\n#define TIM_MST_RESET_ON   __HAL_RCC_TIM4_FORCE_RESET()\n#define TIM_MST_RESET_OFF  __HAL_RCC_TIM4_RELEASE_RESET()\n\n#define TIM_MST_BIT_WIDTH  16 // 16 or 32\n\n#define TIM_MST_PCLK  1 // Select the peripheral clock number (1 or 2)\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // __US_TICKER_DATA_H\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F103xC/objects.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2016, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_OBJECTS_H\n#define MBED_OBJECTS_H\n\n#include \"cmsis.h\"\n#include \"PortNames.h\"\n#include \"PeripheralNames.h\"\n#include \"PinNames.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct gpio_irq_s {\n    IRQn_Type irq_n;\n    uint32_t irq_index;\n    uint32_t event;\n    PinName pin;\n};\n\nstruct port_s {\n    PortName port;\n    uint32_t mask;\n    PinDirection direction;\n    __IO uint32_t *reg_in;\n    __IO uint32_t *reg_out;\n};\n\n#include \"common_objects.h\"\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/SDIO/SDIOBlockDevice.cpp",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <errno.h>\n#include \"platform/mbed_debug.h\"\n#include \"platform/mbed_wait_api.h\"\n#include \"SDIOBlockDevice.h\"\n\nnamespace mbed\n{\n\n/*\n *  defines\n */\n\n#define SD_DBG 0       /*!< 1 - Enable debugging */\n#define SD_CMD_TRACE 0 /*!< 1 - Enable SD command tracing */\n\n#define SD_BLOCK_DEVICE_ERROR_WOULD_BLOCK -5001           /*!< operation would block */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED -5002           /*!< unsupported operation */\n#define SD_BLOCK_DEVICE_ERROR_PARAMETER -5003             /*!< invalid parameter */\n#define SD_BLOCK_DEVICE_ERROR_NO_INIT -5004               /*!< uninitialized */\n#define SD_BLOCK_DEVICE_ERROR_NO_DEVICE -5005             /*!< device is missing or not connected */\n#define SD_BLOCK_DEVICE_ERROR_WRITE_PROTECTED -5006       /*!< write protected */\n#define SD_BLOCK_DEVICE_ERROR_UNUSABLE -5007              /*!< unusable card */\n#define SD_BLOCK_DEVICE_ERROR_NO_RESPONSE -5008           /*!< No response from device */\n#define SD_BLOCK_DEVICE_ERROR_CRC -5009                   /*!< CRC error */\n#define SD_BLOCK_DEVICE_ERROR_ERASE -5010                 /*!< Erase error: reset/sequence */\n#define SD_BLOCK_DEVICE_ERROR_WRITE -5011                 /*!< SPI Write error: !SPI_DATA_ACCEPTED */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE -5012 /*!< unsupported blocksize, only 512 byte supported */\n#define SD_BLOCK_DEVICE_ERROR_READBLOCKS -5013            /*!< read data blocks from SD failed */\n#define SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS -5014           /*!< write data blocks to SD failed */\n#define SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS -5015           /*!< erase data blocks to SD failed */\n\n#define BLOCK_SIZE_HC 512 /*!< Block size supported for SD card is 512 bytes  */\n\n// Types\n#define SDCARD_NONE 0  /**< No card is present */\n#define SDCARD_V1 1    /**< v1.x Standard Capacity */\n#define SDCARD_V2 2    /**< v2.x Standard capacity SD card */\n#define SDCARD_V2HC 3  /**< v2.x High capacity SD card */\n#define CARD_UNKNOWN 4 /**< Unknown or unsupported card */\n\n#ifndef MBED_CONF_SD_TIMEOUT\n#define MBED_CONF_SD_TIMEOUT (30 * 1000) /* ms */\n#endif\n\nSDIOBlockDevice::SDIOBlockDevice(PinName cardDetect) : _cardDetect(cardDetect),\n                                                       _is_initialized(0),\n                                                       _sectors(0),\n                                                       _init_ref_count(0)\n{\n    _card_type = SDCARD_NONE;\n\n    // Only HC block size is supported.\n    _block_size = BLOCK_SIZE_HC;\n    _erase_size = BLOCK_SIZE_HC;\n}\n\nSDIOBlockDevice::~SDIOBlockDevice()\n{\n    if (_is_initialized)\n    {\n        deinit();\n    }\n}\n\nint SDIOBlockDevice::init()\n{\n    debug_if(SD_DBG, \"init Card...\\r\\n\");\n\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n    }\n\n    _init_ref_count++;\n\n    if (_init_ref_count != 1)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n\n    int status = SD_Init();\n    if (BD_ERROR_OK != status)\n    {\n        unlock();\n        return BD_ERROR_DEVICE_ERROR;\n    }\n\n    SD_GetCardInfo(&_cardInfo);\n    _is_initialized = true;\n    debug_if(SD_DBG, \"SD initialized: type: %ld  version: %ld  class: %ld\\n\",\n             _cardInfo.CardType, _cardInfo.CardVersion, _cardInfo.Class);\n    debug_if(SD_DBG, \"SD size: %ld MB\\n\",\n             _cardInfo.LogBlockNbr / 2 / 1024);\n\n    // get sectors count from cardinfo\n    _sectors = _cardInfo.LogBlockNbr;\n    if (BLOCK_SIZE_HC != _cardInfo.BlockSize)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::deinit()\n{\n    debug_if(SD_DBG, \"deinit Card...\\r\\n\");\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    _init_ref_count--;\n\n    if (_init_ref_count)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    int status = SD_DeInit();\n    _is_initialized = false;\n\n    _sectors = 0;\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_read(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    uint32_t *_buffer = static_cast<uint32_t *>(buffer);\n\n    // ReadBlocks uses byte unit address\n    // SDHC and SDXC Cards different addressing is handled in ReadBlocks()\n    bd_addr_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n    }\n\n    // receive the data : one block/ multiple blocks is handled in ReadBlocks()\n    int status = SD_ReadBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"ReadBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_ReadPending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"ReadBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_program(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    // HAL layer uses uint32_t for addr/size\n    uint32_t *_buffer = (uint32_t *)(buffer);\n\n    // Get block count\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n\n    int status = SD_WriteBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"WriteBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_WritePending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"WriteBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::trim(bd_addr_t addr, bd_size_t size)\n{\n    debug_if(SD_DBG, \"trim Card...\\r\\n\");\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!_is_valid_trim(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    int status = SD_Erase(addr, blockCnt);\n    if (status != 0)\n    {\n        debug_if(SD_DBG, \"Erase blocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n    }\n    else\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n            }\n        }\n    }\n\n    unlock();\n    return status;\n}\n\nbd_size_t SDIOBlockDevice::get_read_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::get_program_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::size() const\n{\n    return _block_size * _sectors;\n}\n\nvoid SDIOBlockDevice::debug(bool dbg)\n{\n}\n\nbool SDIOBlockDevice::_is_valid_trim(bd_addr_t addr, bd_size_t size)\n{\n    return (\n        addr % _erase_size == 0 &&\n        size % _erase_size == 0 &&\n        addr + size <= this->size());\n}\n\nbool SDIOBlockDevice::isPresent(void)\n{\n    if (_cardDetect.is_connected()) {\n        return (_cardDetect.read() == 0);\n    }\n    else {\n        return true;\n    }\n}\n\nconst char *SDIOBlockDevice::get_type() const\n{\n    return \"SDIO\";\n}\n\n} // namespace mbed\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/SDIO/SDIOBlockDevice.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#define MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#include \"BlockDevice.h\"\n#include \"DigitalIn.h\"\n#include \"PlatformMutex.h\"\n#include \"sdio_device.h\"\n\nnamespace mbed\n{\n\nclass SDIOBlockDevice : public BlockDevice\n{\n  public:\n    SDIOBlockDevice(PinName cardDetect = NC);\n    virtual ~SDIOBlockDevice();\n    /** Initialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int init();\n\n    /** Deinitialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int deinit();\n\n    /** Read blocks from a block device\n     *\n     *  @param buffer   Buffer to write blocks to\n     *  @param addr     Address of block to begin reading from\n     *  @param size     Size to read in bytes, must be a multiple of read block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Program blocks to a block device\n     *\n     *  The blocks must have been erased prior to being programmed\n     *\n     *  @param buffer   Buffer of data to write to blocks\n     *  @param addr     Address of block to begin writing to\n     *  @param size     Size to write in bytes, must be a multiple of program block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Mark blocks as no longer in use\n     *\n     *  This function provides a hint to the underlying block device that a region of blocks\n     *  is no longer in use and may be erased without side effects. Erase must still be called\n     *  before programming, but trimming allows flash-translation-layers to schedule erases when\n     *  the device is not busy.\n     *\n     *  @param addr     Address of block to mark as unused\n     *  @param size     Size to mark as unused in bytes, must be a multiple of erase block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int trim(bd_addr_t addr, bd_size_t size);\n\n    /** Get the size of a readable block\n     *\n     *  @return         Size of a readable block in bytes\n     */\n    virtual bd_size_t get_read_size() const;\n\n    /** Get the size of a programable block\n     *\n     *  @return         Size of a programable block in bytes\n     *  @note Must be a multiple of the read size\n     */\n    virtual bd_size_t get_program_size() const;\n\n    /** Get the total size of the underlying device\n     *\n     *  @return         Size of the underlying device in bytes\n     */\n    virtual bd_size_t size() const;\n\n    /** Enable or disable debugging\n     *\n     *  @param dbg        State of debugging\n     */\n    virtual void debug(bool dbg);\n\n    /** Set the transfer frequency\n     *\n     *  @param freq     Transfer frequency\n     *  @note Max frequency supported is 25MHZ\n     */\n    virtual int frequency(uint64_t freq) { return BD_ERROR_OK; };\n\n    /** check if SD is present\n     *\n     *  @note check physical present switch. Maybe not support by hardware, then function will always return true.\n     */\n    virtual bool isPresent(void);\n\n     /** Get the BlockDevice class type.\n     *\n     *  @return         A string representation of the BlockDevice class type.\n     */\n    virtual const char *get_type() const;\n\n\n  private:\n    DigitalIn _cardDetect;\n    bool _is_initialized;\n    bd_size_t _block_size;\n    bd_size_t _erase_size;\n    bd_size_t _sectors;\n    uint32_t _init_ref_count;\n    SD_Cardinfo_t _cardInfo;\n    uint32_t _card_type;\n\n    PlatformMutex _mutex;\n    virtual void lock()\n    {\n        _mutex.lock();\n    }\n\n    virtual void unlock()\n    {\n        _mutex.unlock();\n    }\n\n    bool _is_valid_trim(bd_addr_t addr, bd_size_t size);\n};\n\n} // namespace mbed\n\n#endif /* MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_ */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/SDIO/sdio_device.c",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n#include \"sdio_device.h\"\n#include \"platform/mbed_error.h\"\n\n/* Extern variables ---------------------------------------------------------*/\n\nSD_HandleTypeDef hsd;\nDMA_HandleTypeDef hdma_sdio_rx;\nDMA_HandleTypeDef hdma_sdio_tx;\n\n// simple flags for DMA pending signaling\nvolatile uint8_t SD_DMA_ReadPendingState = SD_TRANSFER_OK;\nvolatile uint8_t SD_DMA_WritePendingState = SD_TRANSFER_OK;\n\n/* DMA Handlers are global, there is only one SDIO interface */\n\n/**\n* @brief This function handles SDIO global interrupt.\n*/\nvoid _SDIO_IRQHandler(void)\n{\n    HAL_SD_IRQHandler(&hsd);\n}\n\n/**\n* @brief This function handles DMAx stream_n global interrupt. DMA Rx\n*/\nvoid _DMA_Stream_Rx_IRQHandler(void)\n{\n    HAL_DMA_IRQHandler(hsd.hdmarx);\n}\n\n/**\n* @brief This function handles DMAx stream_n global interrupt. DMA Tx\n*/\nvoid _DMA_Stream_Tx_IRQHandler(void)\n{\n    HAL_DMA_IRQHandler(hsd.hdmatx);\n}\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspInit(SD_HandleTypeDef *hsd)\n{\n    IRQn_Type IRQn;\n    GPIO_InitTypeDef GPIO_InitStruct;\n\n    if (hsd->Instance == SDIO)\n    {\n        /* Peripheral clock enable */\n        __HAL_RCC_SDIO_CLK_ENABLE();\n        __HAL_RCC_DMA2_CLK_ENABLE();\n\n        /* Enable GPIOs clock */\n        __HAL_RCC_GPIOC_CLK_ENABLE();\n        __HAL_RCC_GPIOD_CLK_ENABLE();\n\n        /**SDIO GPIO Configuration\n         PC12     ------> SDIO_CK\n         PC11     ------> SDIO_D3\n         PC10     ------> SDIO_D2\n         PD2     ------> SDIO_CMD\n         PC9     ------> SDIO_D1\n         PC8     ------> SDIO_D0\n         */\n        GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_PULLUP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;\n        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_2;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_PULLUP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;\n        HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);\n\n        /* NVIC configuration for SDIO interrupts */\n        IRQn = SDIO_IRQn;\n        HAL_NVIC_SetPriority(IRQn, 0x0E, 0);\n        NVIC_SetVector(IRQn, (uint32_t)&_SDIO_IRQHandler);\n        HAL_NVIC_EnableIRQ(IRQn);\n\n        /* SDIO DMA Init */\n        /* SDIO_RX Init */\n        hdma_sdio_rx.Instance = DMA2_Stream3;\n        hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;\n        hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;\n        hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;\n        hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;\n        hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;\n        hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;\n        hdma_sdio_rx.Init.Mode = DMA_PFCTRL;\n        hdma_sdio_rx.Init.Priority = DMA_PRIORITY_LOW;\n        hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;\n        hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;\n        hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;\n        hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;\n        if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)\n        {\n            error(\"SDIO DMA Init error at %d in %s\", __LINE__, __FILE__);\n        }\n\n        __HAL_LINKDMA(hsd, hdmarx, hdma_sdio_rx);\n\n        /* Deinitialize the stream for new transfer */\n        HAL_DMA_DeInit(&hdma_sdio_rx);\n\n        /* Configure the DMA stream */\n        HAL_DMA_Init(&hdma_sdio_rx);\n\n        /* SDIO_TX Init */\n        hdma_sdio_tx.Instance = DMA2_Stream6;\n        hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;\n        hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;\n        hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;\n        hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;\n        hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;\n        hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;\n        hdma_sdio_tx.Init.Mode = DMA_PFCTRL;\n        hdma_sdio_tx.Init.Priority = DMA_PRIORITY_LOW;\n        hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;\n        hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;\n        hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;\n        hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;\n        if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)\n        {\n            error(\"SDIO DMA Init error at %d in %s\", __LINE__, __FILE__);\n        }\n\n        __HAL_LINKDMA(hsd, hdmatx, hdma_sdio_tx);\n\n        /* Deinitialize the stream for new transfer */\n        HAL_DMA_DeInit(&hdma_sdio_tx);\n\n        /* Configure the DMA stream */\n        HAL_DMA_Init(&hdma_sdio_tx);\n\n        /* Enable NVIC for DMA transfer complete interrupts */\n        IRQn = DMA2_Stream3_IRQn;\n        NVIC_SetVector(IRQn, (uint32_t)&_DMA_Stream_Rx_IRQHandler);\n        HAL_NVIC_SetPriority(IRQn, 0x0F, 0);\n        HAL_NVIC_EnableIRQ(IRQn);\n\n        IRQn = DMA2_Stream6_IRQn;\n        NVIC_SetVector(IRQn, (uint32_t)&_DMA_Stream_Tx_IRQHandler);\n        HAL_NVIC_SetPriority(IRQn, 0x0F, 0);\n        HAL_NVIC_EnableIRQ(IRQn);\n    }\n}\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)\n{\n\n    if (hsd->Instance == SDIO)\n    {\n        /* Peripheral clock disable */\n        __HAL_RCC_SDIO_CLK_DISABLE();\n\n        /**SDIO GPIO Configuration\n         PC12     ------> SDIO_CK\n         PC11     ------> SDIO_D3\n         PC10     ------> SDIO_D2\n         PD2     ------> SDIO_CMD\n         PC9     ------> SDIO_D1\n         PC8     ------> SDIO_D0\n         */\n        HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8);\n\n        HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);\n\n        /* SDIO DMA DeInit */\n        HAL_DMA_DeInit(hsd->hdmarx);\n        HAL_DMA_DeInit(hsd->hdmatx);\n    }\n}\n\n/**\n * @brief  DeInitializes the SD MSP.\n * @param  hsd: SD handle\n * @param  Params : pointer on additional configuration parameters, can be NULL.\n */\n__weak void SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)\n{\n    static DMA_HandleTypeDef dma_rx_handle;\n    static DMA_HandleTypeDef dma_tx_handle;\n\n    /* Disable NVIC for DMA transfer complete interrupts */\n    HAL_NVIC_DisableIRQ(DMA2_Stream3_IRQn);\n    HAL_NVIC_DisableIRQ(DMA2_Stream6_IRQn);\n\n    /* Deinitialize the stream for new transfer */\n    dma_rx_handle.Instance = DMA2_Stream3;\n    HAL_DMA_DeInit(&dma_rx_handle);\n\n    /* Deinitialize the stream for new transfer */\n    dma_tx_handle.Instance = DMA2_Stream6;\n    HAL_DMA_DeInit(&dma_tx_handle);\n\n    /* Disable NVIC for SDIO interrupts */\n    HAL_NVIC_DisableIRQ(SDIO_IRQn);\n\n    /* Disable SDIO clock */\n    __HAL_RCC_SDIO_CLK_DISABLE();\n}\n\n/**\n  * @brief  Enables the SDIO wide bus mode.\n  * @param  hsd pointer to SD handle\n  * @retval error state\n  */\nstatic uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)\n{\n    uint32_t errorstate = HAL_SD_ERROR_NONE;\n\n    if ((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)\n    {\n        return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;\n    }\n\n    /* Send CMD55 APP_CMD with argument as card's RCA.*/\n    errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));\n    if (errorstate != HAL_OK)\n    {\n        return errorstate;\n    }\n\n    /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */\n    errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);\n    if (errorstate != HAL_OK)\n    {\n        return errorstate;\n    }\n\n    hsd->Init.BusWide = SDIO_BUS_WIDE_4B;\n    SDIO_Init(hsd->Instance, hsd->Init);\n\n    return HAL_SD_ERROR_NONE;\n}\n\n/**\n * @brief  Initializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_Init(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    hsd.Instance = SDIO;\n    hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;\n    hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;\n    hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;\n    hsd.Init.BusWide = SDIO_BUS_WIDE_1B;\n    hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;\n    hsd.Init.ClockDiv = 0;\n\n    /* HAL SD initialization */\n    sd_state = HAL_SD_Init(&hsd);\n    /* Configure SD Bus width (4 bits mode selected) */\n    if (sd_state == MSD_OK)\n    {\n        /* Enable wide operation */\n        if (SD_WideBus_Enable(&hsd) != HAL_OK)\n        {\n            sd_state = MSD_ERROR;\n        }\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  DeInitializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_DeInit(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    hsd.Instance = SDIO;\n\n    /* HAL SD deinitialization */\n    if (HAL_SD_DeInit(&hsd) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    /* Msp SD deinitialization */\n    hsd.Instance = SDIO;\n    SD_MspDeInit(&hsd, NULL);\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @param  Timeout: Timeout for read operation\n * @retval SD status\n */\nuint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_ReadBlocks(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @param  Timeout: Timeout for write operation\n * @retval SD status\n */\nuint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_WriteBlocks(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @retval SD status\n */\nuint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)\n{\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_ReadPendingState = SD_TRANSFER_BUSY;\n\n    /* Read block(s) in DMA transfer mode */\n    if (HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @retval SD status\n */\nuint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)\n{\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_WritePendingState = SD_TRANSFER_BUSY;\n\n    /* Write block(s) in DMA transfer mode */\n    if (HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_WritePendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Erases the specified memory area of the given SD card.\n * @param  StartAddr: Start byte address\n * @param  EndAddr: End byte address\n * @retval SD status\n */\nuint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_Erase(&hsd, StartAddr, EndAddr) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Gets the current SD card data status.\n * @param  None\n * @retval Data transfer state.\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_GetCardState(void)\n{\n    return ((HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY);\n}\n\n/**\n * @brief  Get SD information about specific SD card.\n * @param  CardInfo: Pointer to HAL_SD_CardInfoTypedef structure\n * @retval None\n */\nvoid SD_GetCardInfo(SD_Cardinfo_t *CardInfo)\n{\n    /* Get SD card Information, copy structure for portability */\n    HAL_SD_CardInfoTypeDef HAL_CardInfo;\n\n    HAL_SD_GetCardInfo(&hsd, &HAL_CardInfo);\n\n    if (CardInfo)\n    {\n        CardInfo->CardType = HAL_CardInfo.CardType;\n        CardInfo->CardVersion = HAL_CardInfo.CardVersion;\n        CardInfo->Class = HAL_CardInfo.Class;\n        CardInfo->RelCardAdd = HAL_CardInfo.RelCardAdd;\n        CardInfo->BlockNbr = HAL_CardInfo.BlockNbr;\n        CardInfo->BlockSize = HAL_CardInfo.BlockSize;\n        CardInfo->LogBlockNbr = HAL_CardInfo.LogBlockNbr;\n        CardInfo->LogBlockSize = HAL_CardInfo.LogBlockSize;\n    }\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_ReadPending(void)\n{\n    return SD_DMA_ReadPendingState;\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_WritePending(void)\n{\n    return SD_DMA_WritePendingState;\n}\n\n/**\n  * @brief Rx Transfer completed callbacks\n  * @param hsd Pointer SD handle\n  * @retval None\n  */\nvoid HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n}\n\n/**\n  * @brief Tx Transfer completed callbacks\n  * @param hsd Pointer to SD handle\n  * @retval None\n  */\nvoid HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_WritePendingState = SD_TRANSFER_OK;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/SDIO/sdio_device.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __SDIO_DEVICE_H\n#define __SDIO_DEVICE_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"stm32f4xx_hal.h\"\n\n  /* Typedefs */\n\n  typedef struct\n  {\n    uint32_t CardType;     /* Specifies the card Type                         */\n    uint32_t CardVersion;  /* Specifies the card version                      */\n    uint32_t Class;        /* Specifies the class of the card class           */\n    uint32_t RelCardAdd;   /* Specifies the Relative Card Address             */\n    uint32_t BlockNbr;     /* Specifies the Card Capacity in blocks           */\n    uint32_t BlockSize;    /* Specifies one block size in bytes               */\n    uint32_t LogBlockNbr;  /* Specifies the Card logical Capacity in blocks   */\n    uint32_t LogBlockSize; /* Specifies logical block size in bytes           */\n  } SD_Cardinfo_t;\n\n  /* External Global var  */\n\n  extern SD_HandleTypeDef hsd;\n\n/* Exported types */\n/** \n  * @brief SD Card information structure \n  */\n#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef\n\n/* Exported constants */\n/**\n  * @brief  SD status structure definition  \n  */\n#define MSD_OK ((uint8_t)0x00)\n#define MSD_ERROR ((uint8_t)0x01)\n\n/** \n  * @brief  SD transfer state definition  \n  */\n#define SD_TRANSFER_OK ((uint8_t)0x00)\n#define SD_TRANSFER_BUSY ((uint8_t)0x01)\n\n  /* Exported functions */\n  uint8_t SD_Init(void);\n  uint8_t SD_DeInit(void);\n  uint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks);\n  uint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks);\n  uint8_t SD_DMA_ReadPending(void);\n  uint8_t SD_DMA_WritePending(void);\n  uint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr);\n\n  uint8_t SD_GetCardState(void);\n  void SD_GetCardInfo(SD_Cardinfo_t *CardInfo);\n\n  /* callback function for DMA Rx/Tx completete, called by HAL SDIO interrupt handler */\n  void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd);\n  void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __SDIO_DEVICE_H */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32f4xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin), \n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PA_4)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PC_6)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI9_5_IRQn , 5, 0);\n    }\n\n    slaveSelect.rise(callback(this, &RemoraComms::processPacket));\n}\n\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising SPI1 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PA4     ------> SPI1_NSS\n        PA5     ------> SPI1_SCK\n        PA6     ------> SPI1_MISO\n        PA7     ------> SPI1_MOSI\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI1_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        } \n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n\n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOA_CLK_ENABLE();\n        __HAL_RCC_DMA2_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA2_Stream3;\n        this->hdma_spi_tx.Init.Channel               = DMA_CHANNEL_3;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_tx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n        \n        HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA2_Stream3_IRQn, (uint32_t)&DMA2_Stream3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA2_Stream0;\n        this->hdma_spi_rx.Init.Channel               = DMA_CHANNEL_3;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_rx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);\n        //NVIC_SetVector(DMA2_Stream0_IRQn, (uint32_t)&DMA2_Stream0_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);\n\n        \n        this->hdma_memtomem_dma2_stream1.Instance                 = DMA2_Stream1;\n        this->hdma_memtomem_dma2_stream1.Init.Channel             = DMA_CHANNEL_0;\n        this->hdma_memtomem_dma2_stream1.Init.Direction           = DMA_MEMORY_TO_MEMORY;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphInc           = DMA_PINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.MemInc              = DMA_MINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.Mode                = DMA_NORMAL;\n        this->hdma_memtomem_dma2_stream1.Init.Priority            = DMA_PRIORITY_LOW;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;\n        this->hdma_memtomem_dma2_stream1.Init.MemBurst            = DMA_MBURST_SINGLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphBurst         = DMA_PBURST_SINGLE;\n\n        HAL_DMA_Init(&this->hdma_memtomem_dma2_stream1);\n\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::processPacket()\n{\n    switch (this->spiRxBuffer.header)\n    {\n      case PRU_READ:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // READ so do nothing with the received data\n        break;\n\n      case PRU_WRITE:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // we've got a good WRITE header, move the data to rxData\n\n        // **** would like to use DMA for this but cannot when the stream is in CIRCULAR mode for the SPI transfer ****\n        // TODO: figure out how to use NORMAL mode for SPI...\n        //this->status = HAL_DMA_Start(&hdma_memtomem_dma2_stream1, (uint32_t)&this->spiRxBuffer.rxBuffer, (uint32_t)this->rxData->rxBuffer, SPI_BUFF_SIZE);\n        //if (this->status != HAL_OK) printf(\"F\\n\");\n\n            \n        // Do it the slower way. This does not seem to impact performance but not great to stay in ISR context for longer.. :-(\n\n        // ensure an atomic access to the rxBuffer\n\t\t// disable thread interrupts\n\t\t__disable_irq();        \n        for (int i = 0; i < SPI_BUFF_SIZE; i++)\n        {\n            this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n        }\n\t\t// re-enable thread interrupts\n\t\t__enable_irq();\n        break;\n\n      default:\n        this->rejectCnt++;\n        if (this->rejectCnt > 5)\n        {\n            this->SPIdataError = true;\n        }\n        // reset SPI somehow\n    }\n\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->SPIdata;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->SPIdata = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32f4xx_hal.h\"\n\n\n\nclass RemoraComms\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n        uint8_t             rejectCnt;\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void processPacket(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n        void init(void);\n        void start(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[8] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,GPIOH};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n        \n        case 5:\n            __HAL_RCC_GPIOF_CLK_ENABLE();\n            break;\n        \n        case 6:\n            __HAL_RCC_GPIOG_CLK_ENABLE();\n            break;\n        \n        case 7:\n            __HAL_RCC_GPIOH_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PA_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PA_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PA_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PA_11); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PA_15); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PB_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PB_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PB_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PB_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PB_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PB_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PB_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PB_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PB_11); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PB_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PB_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PB_15); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PC_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PC_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PC_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PC_9); }\n    }\n    else if (this->portIndex == 3)\n    {\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PD_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PD_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PD_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PD_15); }\n    }\n    else if (this->portIndex == 4)\n    {\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PE_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PE_6); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PE_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PE_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PE_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PE_11); }\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PE_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PE_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PE_14); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->hasIndex = false;\n    this->init();\n}\n\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(PE_13)\n{\n    this->hasIndex = true;\n    this->irq = EXTI15_10_IRQn;\n\n    this->init();\n\n    qeiIndex.rise(callback(this, &QEIdriver::interruptHandler));\n    //NVIC_EnableIRQ(this->irq);\n    HAL_NVIC_SetPriority(this->irq, 0, 0);\n}\n\n\nvoid QEIdriver::interruptHandler()\n{\n    this->indexDetected = true;\n    this->indexCount = this->get();\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return __HAL_TIM_GET_COUNTER(&htim);\n}\n\n\n// reference https://os.mbed.com/users/gregeric/code/Nucleo_Hello_Encoder/\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n\n    this->htim.Instance = TIM1;\n    this->htim.Init.Prescaler = 0;\n    this->htim.Init.CounterMode = TIM_COUNTERMODE_UP;\n    //this->htim.Init.Period = 0xffffffff; // 32-bit count for TIM2\n    this->htim.Init.Period = 65535;\n    this->htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n    this->htim.Init.RepetitionCounter = 0;\n\n    this->sConfig.EncoderMode = TIM_ENCODERMODE_TI12;\n\n    this->sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC1Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC1Filter = 0;\n\n    this->sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC2Filter = 0;\n\n    if (HAL_TIM_Encoder_Init(&this->htim, &this->sConfig) != HAL_OK)\n    {\n        printf(\"Couldn't Init Encoder\\r\\n\");\n    }\n\n    this->sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\n    this->sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\n    HAL_TIMEx_MasterConfigSynchronization(&this->htim, &this->sMasterConfig);\n\n    if (HAL_TIM_Encoder_Start(&this->htim, TIM_CHANNEL_2)!=HAL_OK)\n    {\n        printf(\"Couldn't Start Encoder\\r\\n\");\n    }\n}\n\n\nvoid HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* htim_encoder)\n{\n    GPIO_InitTypeDef GPIO_InitStruct = {0};\n    if(htim_encoder->Instance==TIM1)\n    {\n        __HAL_RCC_TIM1_CLK_ENABLE();\n\n        __HAL_RCC_GPIOE_CLK_ENABLE();\n        /**TIM1 GPIO Configuration\n        PE9     ------> TIM1_CH1\n        PE11     ------> TIM1_CH2\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\n        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;\n        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM9, TIM1_BRK_TIM9_IRQn, base_freq);\n    NVIC_SetVector(TIM1_BRK_TIM9_IRQn, (uint32_t)TIM9_IRQHandler);\n    NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 2);\n\n    servoThread = new pruThread(TIM10, TIM1_UP_TIM10_IRQn, servo_freq);\n    NVIC_SetVector(TIM1_UP_TIM10_IRQn, (uint32_t)TIM10_IRQHandler);\n    NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 3);\n\n    commsThread = new pruThread(TIM11, TIM1_TRG_COM_TIM11_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM1_TRG_COM_TIM11_IRQn, (uint32_t)TIM11_IRQHandler);\n    NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32f4xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\n//void Interrupt::TIM3_Wrapper(void)\n//{\n//\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n//}\n\nvoid Interrupt::TIM9_Wrapper(void)\n{\n\tISRVectorTable[TIM1_BRK_TIM9_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM10_Wrapper(void)\n{\n\tISRVectorTable[TIM1_UP_TIM10_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM11_Wrapper(void)\n{\n\tISRVectorTable[TIM1_TRG_COM_TIM11_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t82\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n        //static void TIM3_Wrapper();\n\t\tstatic void TIM9_Wrapper();\n        static void TIM10_Wrapper();\n        static void TIM11_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !<Window WatchDog Interrupt                                         \n  PVD_IRQn                    = 1,      !<PVD through EXTI Line detection Interrupt                         \n  TAMP_STAMP_IRQn             = 2,      !< Tamper and TimeStamp interrupts through the EXTI line             \n  RTC_WKUP_IRQn               = 3,      !< RTC Wakeup interrupt through the EXTI line                        \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                                            \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                              \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                              \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                              \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                              \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                              \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                              \n  DMA1_Stream0_IRQn           = 11,     !< DMA1 Stream 0 global Interrupt                                    \n  DMA1_Stream1_IRQn           = 12,     !< DMA1 Stream 1 global Interrupt                                    \n  DMA1_Stream2_IRQn           = 13,     !< DMA1 Stream 2 global Interrupt                                    \n  DMA1_Stream3_IRQn           = 14,     !< DMA1 Stream 3 global Interrupt                                    \n  DMA1_Stream4_IRQn           = 15,     !< DMA1 Stream 4 global Interrupt                                    \n  DMA1_Stream5_IRQn           = 16,     !< DMA1 Stream 5 global Interrupt                                    \n  DMA1_Stream6_IRQn           = 17,     !< DMA1 Stream 6 global Interrupt                                    \n  ADC_IRQn                    = 18,     !< ADC1, ADC2 and ADC3 global Interrupts                             \n  CAN1_TX_IRQn                = 19,     !< CAN1 TX Interrupt                                                 \n  CAN1_RX0_IRQn               = 20,     !< CAN1 RX0 Interrupt                                               \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                                \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                                \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                                     \n  TIM1_BRK_TIM9_IRQn          = 24,     !< TIM1 Break interrupt and TIM9 global interrupt                    \n  TIM1_UP_TIM10_IRQn          = 25,     !< TIM1 Update Interrupt and TIM10 global interrupt                  \n  TIM1_TRG_COM_TIM11_IRQn     = 26,     !< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt\n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                                   \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                             \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                             \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                             \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                              \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                              \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                              \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                              \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                             \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                             \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                                           \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                                           \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                                           \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                                   \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm (A and B) through EXTI Line Interrupt                   \n  OTG_FS_WKUP_IRQn            = 42,     !< USB OTG FS Wakeup through EXTI line interrupt                     \n  TIM8_BRK_TIM12_IRQn         = 43,     !< TIM8 Break Interrupt and TIM12 global interrupt                   \n  TIM8_UP_TIM13_IRQn          = 44,     !< TIM8 Update Interrupt and TIM13 global interrupt                  \n  TIM8_TRG_COM_TIM14_IRQn     = 45,     !< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare global interrupt                             \n  DMA1_Stream7_IRQn           = 47,     !< DMA1 Stream7 Interrupt                                            \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                             \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                             \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                             \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                             \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                                            \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                                            \n  TIM6_DAC_IRQn               = 54,     !< TIM6 global and DAC1&2 underrun error  interrupts                 \n  TIM7_IRQn                   = 55,     !< TIM7 global interrupt                                             \n  DMA2_Stream0_IRQn           = 56,     !< DMA2 Stream 0 global Interrupt                                    \n  DMA2_Stream1_IRQn           = 57,     !< DMA2 Stream 1 global Interrupt                                    \n  DMA2_Stream2_IRQn           = 58,     !< DMA2 Stream 2 global Interrupt                                    \n  DMA2_Stream3_IRQn           = 59,     !< DMA2 Stream 3 global Interrupt                                    \n  DMA2_Stream4_IRQn           = 60,     !< DMA2 Stream 4 global Interrupt                                    \n  ETH_IRQn                    = 61,     !< Ethernet global Interrupt                                         \n  ETH_WKUP_IRQn               = 62,     !< Ethernet Wakeup through EXTI line Interrupt                      \n  CAN2_TX_IRQn                = 63,     !< CAN2 TX Interrupt                                                 \n  CAN2_RX0_IRQn               = 64,     !< CAN2 RX0 Interrupt                                                \n  CAN2_RX1_IRQn               = 65,     !< CAN2 RX1 Interrupt                                                \n  CAN2_SCE_IRQn               = 66,     !< CAN2 SCE Interrupt                                                \n  OTG_FS_IRQn                 = 67,     !< USB OTG FS global Interrupt                                       \n  DMA2_Stream5_IRQn           = 68,     !< DMA2 Stream 5 global interrupt                                    \n  DMA2_Stream6_IRQn           = 69,     !< DMA2 Stream 6 global interrupt                                    \n  DMA2_Stream7_IRQn           = 70,     !< DMA2 Stream 7 global interrupt                                  \n  USART6_IRQn                 = 71,     !< USART6 global interrupt                                           \n  I2C3_EV_IRQn                = 72,     !< I2C3 event interrupt                                             \n  I2C3_ER_IRQn                = 73,     !< I2C3 error interrupt                                             \n  OTG_HS_EP1_OUT_IRQn         = 74,     !< USB OTG HS End Point 1 Out global interrupt                       \n  OTG_HS_EP1_IN_IRQn          = 75,     !< USB OTG HS End Point 1 In global interrupt                        \n  OTG_HS_WKUP_IRQn            = 76,     !< USB OTG HS Wakeup through EXTI interrupt                          \n  OTG_HS_IRQn                 = 77,     !< USB OTG HS global interrupt                                       \n  DCMI_IRQn                   = 78,     !< DCMI global interrupt                                             \n  RNG_IRQn                    = 80,     !< RNG global Interrupt                                              \n  FPU_IRQn                    = 81      !< FPU global interrupt                                               \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n//void TIM3_IRQHandler()\n//{\n//  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n//  {\n//    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n//    Interrupt::TIM3_Wrapper();\n//  }\n//}\n\n\nvoid TIM9_IRQHandler()\n{\n  if(TIM9->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM9->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM9_Wrapper();\n  }\n}\n\nvoid TIM10_IRQHandler()\n{\n  if(TIM10->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM10->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM10_Wrapper();\n  }\n}\n\nvoid TIM11_IRQHandler()\n{\n  if(TIM11->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM11->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM11_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32f4xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32f4xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 3\\n\\r\");\n        __TIM3_CLK_ENABLE();\n        TIM_CLK = APB2CLK;\n    }\n    else if (this->timer == TIM9)\n    {\n        printf(\"\tpower on Timer 9\\n\\r\");\n        __TIM9_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM10)\n    {\n        printf(\"\tpower on Timer 10\\n\\r\");\n        __TIM10_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM11)\n    {\n        printf(\"\tpower on Timer 11\\n\\r\");\n        __TIM11_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TARGET_STM32F4/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 4\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock/2\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/branch",
    "content": "default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/cache/branch2-base",
    "content": "5ba0c258c4ed90a7b2d84a782374f254077a2acc 1\n5ba0c258c4ed90a7b2d84a782374f254077a2acc o default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/cache/rbc-names-v1",
    "content": "default"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/cache/tags2-visible",
    "content": "1 5ba0c258c4ed90a7b2d84a782374f254077a2acc\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/hgrc",
    "content": "# example repository config (see 'hg help config' for more info)\n[paths]\nmbed-studio-cache = c:\\Users\\tanya\\AppData\\Local\\Mbed Studio\\library-cache\\os.mbed.com\\users\\charly\\code\\TMCStepper\ndefault = https://os.mbed.com/users/charly/code/TMCStepper/\n\n# path aliases to other clones of this repo in URLs or filesystem paths\n# (see 'hg help config.paths' for more info)\n#\n# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork\n# my-fork         = ssh://jdoe@example.net/hg/jdoes-fork\n# my-clone        = /home/jdoe/jdoes-clone\n\n[ui]\n# name and email (local to this repository, optional), e.g.\n# username = Jane Doe <jdoe@example.com>\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/requires",
    "content": "dotencode\nfncache\ngeneraldelta\nrevlogv1\nsparserevlog\nstore\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/store/fncache",
    "content": "data/DRV_STATUS.cpp.i\ndata/TMC_MACROS.h.i\ndata/TMCStepper.cpp.i\ndata/TMC2208Stepper.cpp.i\ndata/GCONF.cpp.i\ndata/IHOLD_IRUN.cpp.i\ndata/TMC2209_bitfields.h.i\ndata/TMCStepper.h.i\ndata/TMC2208_bitfields.h.i\ndata/CHOPCONF.cpp.i\ndata/TMC2209Stepper.cpp.i\ndata/PWMCONF.cpp.i\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/.hg/thgstatus",
    "content": "m\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/CHOPCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) CHOPCONF_register.SETTING = B; write(CHOPCONF_register.address, CHOPCONF_register.sr)\n\n// CHOPCONF\n/*\nuint32_t TMC2130Stepper::CHOPCONF() {\n    return read(CHOPCONF_register.address);\n}\nvoid TMC2130Stepper::CHOPCONF(uint32_t input) {\n    CHOPCONF_register.sr = input;\n    write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\n\nvoid TMC2130Stepper::toff(      uint8_t B ) { SET_REG(toff);    }\nvoid TMC2130Stepper::hstrt(     uint8_t B ) { SET_REG(hstrt);   }\nvoid TMC2130Stepper::hend(      uint8_t B ) { SET_REG(hend);    }\n//void TMC2130Stepper::fd(      uint8_t B ) { SET_REG(fd);      }\nvoid TMC2130Stepper::disfdcc(   bool    B ) { SET_REG(disfdcc); }\nvoid TMC2130Stepper::rndtf(     bool    B ) { SET_REG(rndtf);   }\nvoid TMC2130Stepper::chm(       bool    B ) { SET_REG(chm);     }\nvoid TMC2130Stepper::tbl(       uint8_t B ) { SET_REG(tbl);     }\nvoid TMC2130Stepper::vsense(    bool    B ) { SET_REG(vsense);  }\nvoid TMC2130Stepper::vhighfs(   bool    B ) { SET_REG(vhighfs); }\nvoid TMC2130Stepper::vhighchm(  bool    B ) { SET_REG(vhighchm);}\nvoid TMC2130Stepper::sync(      uint8_t B ) { SET_REG(sync);    }\nvoid TMC2130Stepper::mres(      uint8_t B ) { SET_REG(mres);    }\nvoid TMC2130Stepper::intpol(    bool    B ) { SET_REG(intpol);  }\nvoid TMC2130Stepper::dedge(     bool    B ) { SET_REG(dedge);   }\nvoid TMC2130Stepper::diss2g(    bool    B ) { SET_REG(diss2g);  }\n\nuint8_t TMC2130Stepper::toff()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff;    }\nuint8_t TMC2130Stepper::hstrt()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt;   }\nuint8_t TMC2130Stepper::hend()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend;    }\n//uint8_t TMC2130Stepper::fd()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.fd;      }\nbool    TMC2130Stepper::disfdcc()   { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.disfdcc; }\nbool    TMC2130Stepper::rndtf()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.rndtf;   }\nbool    TMC2130Stepper::chm()       { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.chm;     }\nuint8_t TMC2130Stepper::tbl()       { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl;     }\nbool    TMC2130Stepper::vsense()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense;  }\nbool    TMC2130Stepper::vhighfs()   { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighfs; }\nbool    TMC2130Stepper::vhighchm()  { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighchm;}\nuint8_t TMC2130Stepper::sync()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.sync;    }\nuint8_t TMC2130Stepper::mres()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres;    }\nbool    TMC2130Stepper::intpol()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol;  }\nbool    TMC2130Stepper::dedge()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge;   }\nbool    TMC2130Stepper::diss2g()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g;  }\n\nvoid TMC5160Stepper::diss2vs(bool B){ SET_REG(diss2vs); }\nvoid TMC5160Stepper::tpfd(uint8_t B){ SET_REG(tpfd);    }\nbool TMC5160Stepper::diss2vs()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs; }\nuint8_t TMC5160Stepper::tpfd()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tpfd;    }\n*/\nvoid TMC2208Stepper::CHOPCONF(uint32_t input) {\n    CHOPCONF_register.sr = input;\n    write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\nuint32_t TMC2208Stepper::CHOPCONF() {\n    return read(CHOPCONF_register.address);\n}\nvoid TMC2208Stepper::toff   ( uint8_t  B )  { SET_REG(toff);    }\nvoid TMC2208Stepper::hstrt  ( uint8_t  B )  { SET_REG(hstrt);   }\nvoid TMC2208Stepper::hend   ( uint8_t  B )  { SET_REG(hend);    }\nvoid TMC2208Stepper::tbl    ( uint8_t  B )  { SET_REG(tbl);     }\nvoid TMC2208Stepper::vsense ( bool     B )  { SET_REG(vsense);  }\nvoid TMC2208Stepper::mres   ( uint8_t  B )  { SET_REG(mres);    }\nvoid TMC2208Stepper::intpol ( bool     B )  { SET_REG(intpol);  }\nvoid TMC2208Stepper::dedge  ( bool     B )  { SET_REG(dedge);   }\nvoid TMC2208Stepper::diss2g ( bool     B )  { SET_REG(diss2g);  }\nvoid TMC2208Stepper::diss2vs( bool     B )  { SET_REG(diss2vs); }\n\nuint8_t TMC2208Stepper::toff()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff;     }\nuint8_t TMC2208Stepper::hstrt()     { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt;    }\nuint8_t TMC2208Stepper::hend()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend;     }\nuint8_t TMC2208Stepper::tbl()       { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl;      }\nbool    TMC2208Stepper::vsense()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense;   }\nuint8_t TMC2208Stepper::mres()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres;     }\nbool    TMC2208Stepper::intpol()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol;   }\nbool    TMC2208Stepper::dedge()     { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge;    }\nbool    TMC2208Stepper::diss2g()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g;   }\nbool    TMC2208Stepper::diss2vs()   { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs;  }\n/*\n#define GET_REG_2660(SETTING) return CHOPCONF_register.SETTING;\n\nuint32_t TMC2660Stepper::CHOPCONF() { return CHOPCONF_register.sr; }\nvoid TMC2660Stepper::CHOPCONF(uint32_t data) {\n  CHOPCONF_register.sr = data;\n  write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\n\nvoid TMC2660Stepper::toff(uint8_t B)    {\n    SET_REG(toff);\n    if (B>0) _savedToff = B;\n}\nvoid TMC2660Stepper::hstrt(uint8_t B)   { SET_REG(hstrt);   }\nvoid TMC2660Stepper::hend(uint8_t B)    { SET_REG(hend);    }\nvoid TMC2660Stepper::hdec(uint8_t B)    { SET_REG(hdec);    }\nvoid TMC2660Stepper::rndtf(bool B)  { SET_REG(rndtf);   }\nvoid TMC2660Stepper::chm(bool B)    { SET_REG(chm); }\nvoid TMC2660Stepper::tbl(uint8_t B)     { SET_REG(tbl); }\n\nuint8_t TMC2660Stepper::toff()  { GET_REG_2660(toff);   }\nuint8_t TMC2660Stepper::hstrt()     { GET_REG_2660(hstrt);  }\nuint8_t TMC2660Stepper::hend() { GET_REG_2660(hend);    }\nuint8_t TMC2660Stepper::hdec()  { GET_REG_2660(hdec);   }\nbool TMC2660Stepper::rndtf() { GET_REG_2660(rndtf); }\nbool TMC2660Stepper::chm()  { GET_REG_2660(chm);    }\nuint8_t TMC2660Stepper::tbl() { GET_REG_2660(tbl);  }\n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/COOLCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) COOLCONF_register.SETTING = B; write(COOLCONF_register.address, COOLCONF_register.sr);\n#define GET_REG(SETTING) return COOLCONF_register.SETTING;\n\n// COOLCONF\nuint16_t TMC2209Stepper::COOLCONF() { return COOLCONF_register.sr; }\nvoid TMC2209Stepper::COOLCONF(uint16_t input) {\n\tCOOLCONF_register.sr = input;\n\twrite(COOLCONF_register.address, COOLCONF_register.sr);\n}\n\nvoid TMC2209Stepper::semin(\tuint8_t B )\t{ SET_REG(semin);\t}\nvoid TMC2209Stepper::seup(\tuint8_t B )\t{ SET_REG(seup);\t}\nvoid TMC2209Stepper::semax(\tuint8_t B )\t{ SET_REG(semax);\t}\nvoid TMC2209Stepper::sedn(\tuint8_t B )\t{ SET_REG(sedn);\t}\nvoid TMC2209Stepper::seimin(bool \tB )\t{ SET_REG(seimin);\t}\n\nuint8_t TMC2209Stepper::semin()\t{ GET_REG(semin);\t}\nuint8_t TMC2209Stepper::seup()\t{ GET_REG(seup);\t}\nuint8_t TMC2209Stepper::semax()\t{ GET_REG(semax);\t}\nuint8_t TMC2209Stepper::sedn()\t{ GET_REG(sedn);\t}\nbool \tTMC2209Stepper::seimin(){ GET_REG(seimin);\t}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/DRV_STATUS.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define GET_REG(NS, SETTING) NS::DRV_STATUS_t r{0}; r.sr = DRV_STATUS(); return r.SETTING\n/*\nuint32_t TMC2130Stepper::DRV_STATUS() { return read(DRV_STATUS_t::address); }\n\nuint16_t TMC2130Stepper::sg_result(){ GET_REG(TMC2130_n, sg_result);    }\nbool TMC2130Stepper::fsactive()     { GET_REG(TMC2130_n, fsactive);     }\nuint8_t TMC2130Stepper::cs_actual() { GET_REG(TMC2130_n, cs_actual);    }\nbool TMC2130Stepper::stallguard()   { GET_REG(TMC2130_n, stallGuard);   }\nbool TMC2130Stepper::ot()           { GET_REG(TMC2130_n, ot);           }\nbool TMC2130Stepper::otpw()         { GET_REG(TMC2130_n, otpw);         }\nbool TMC2130Stepper::s2ga()         { GET_REG(TMC2130_n, s2ga);         }\nbool TMC2130Stepper::s2gb()         { GET_REG(TMC2130_n, s2gb);         }\nbool TMC2130Stepper::ola()          { GET_REG(TMC2130_n, ola);          }\nbool TMC2130Stepper::olb()          { GET_REG(TMC2130_n, olb);          }\nbool TMC2130Stepper::stst()         { GET_REG(TMC2130_n, stst);         }\n*/\nuint32_t TMC2208Stepper::DRV_STATUS() {\n    return read(TMC2208_n::DRV_STATUS_t::address);\n}\n\nbool        TMC2208Stepper::otpw()      { GET_REG(TMC2208_n, otpw);         }\nbool        TMC2208Stepper::ot()        { GET_REG(TMC2208_n, ot);           }\nbool        TMC2208Stepper::s2ga()      { GET_REG(TMC2208_n, s2ga);         }\nbool        TMC2208Stepper::s2gb()      { GET_REG(TMC2208_n, s2gb);         }\nbool        TMC2208Stepper::s2vsa()     { GET_REG(TMC2208_n, s2vsa);        }\nbool        TMC2208Stepper::s2vsb()     { GET_REG(TMC2208_n, s2vsb);        }\nbool        TMC2208Stepper::ola()       { GET_REG(TMC2208_n, ola);          }\nbool        TMC2208Stepper::olb()       { GET_REG(TMC2208_n, olb);          }\nbool        TMC2208Stepper::t120()      { GET_REG(TMC2208_n, t120);         }\nbool        TMC2208Stepper::t143()      { GET_REG(TMC2208_n, t143);         }\nbool        TMC2208Stepper::t150()      { GET_REG(TMC2208_n, t150);         }\nbool        TMC2208Stepper::t157()      { GET_REG(TMC2208_n, t157);         }\nuint16_t    TMC2208Stepper::cs_actual() { GET_REG(TMC2208_n, cs_actual);    }\nbool        TMC2208Stepper::stealth()   { GET_REG(TMC2208_n, stealth);      }\nbool        TMC2208Stepper::stst()      { GET_REG(TMC2208_n, stst);         }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/GCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) GCONF_register.SETTING = B; write(GCONF_register.address, GCONF_register.sr)\n\n// GCONF\n/*\nuint32_t TMC2130Stepper::GCONF() {\n    return read(GCONF_register.address);\n}\nvoid TMC2130Stepper::GCONF(uint32_t input) {\n    GCONF_register.sr = input;\n    write(GCONF_register.address, GCONF_register.sr);\n}\n\nvoid TMC2130Stepper::I_scale_analog(bool B)         { SET_REG(i_scale_analog);          }\nvoid TMC2130Stepper::internal_Rsense(bool B)        { SET_REG(internal_rsense);         }\nvoid TMC2130Stepper::en_pwm_mode(bool B)            { SET_REG(en_pwm_mode);             }\nvoid TMC2130Stepper::enc_commutation(bool B)        { SET_REG(enc_commutation);         }\nvoid TMC2130Stepper::shaft(bool B)                  { SET_REG(shaft);                   }\nvoid TMC2130Stepper::diag0_error(bool B)            { SET_REG(diag0_error);             }\nvoid TMC2130Stepper::diag0_otpw(bool B)             { SET_REG(diag0_otpw);              }\nvoid TMC2130Stepper::diag0_stall(bool B)            { SET_REG(diag0_stall);             }\nvoid TMC2130Stepper::diag1_stall(bool B)            { SET_REG(diag1_stall);             }\nvoid TMC2130Stepper::diag1_index(bool B)            { SET_REG(diag1_index);             }\nvoid TMC2130Stepper::diag1_onstate(bool B)          { SET_REG(diag1_onstate);           }\nvoid TMC2130Stepper::diag1_steps_skipped(bool B)    { SET_REG(diag1_steps_skipped);     }\nvoid TMC2130Stepper::diag0_int_pushpull(bool B)     { SET_REG(diag0_int_pushpull);      }\nvoid TMC2130Stepper::diag1_pushpull(bool B)         { SET_REG(diag1_poscomp_pushpull);  }\nvoid TMC2130Stepper::small_hysteresis(bool B)       { SET_REG(small_hysteresis);        }\nvoid TMC2130Stepper::stop_enable(bool B)            { SET_REG(stop_enable);             }\nvoid TMC2130Stepper::direct_mode(bool B)            { SET_REG(direct_mode);             }\n\nbool TMC2130Stepper::I_scale_analog()               { GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog;        }\nbool TMC2130Stepper::internal_Rsense()              { GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense;       }\nbool TMC2130Stepper::en_pwm_mode()                  { GCONF_t r{0}; r.sr = GCONF(); return r.en_pwm_mode;           }\nbool TMC2130Stepper::enc_commutation()              { GCONF_t r{0}; r.sr = GCONF(); return r.enc_commutation;       }\nbool TMC2130Stepper::shaft()                        { GCONF_t r{0}; r.sr = GCONF(); return r.shaft;                 }\nbool TMC2130Stepper::diag0_error()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_error;           }\nbool TMC2130Stepper::diag0_otpw()                   { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_otpw;            }\nbool TMC2130Stepper::diag0_stall()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_stall;           }\nbool TMC2130Stepper::diag1_stall()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_stall;           }\nbool TMC2130Stepper::diag1_index()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_index;           }\nbool TMC2130Stepper::diag1_onstate()                { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_onstate;         }\nbool TMC2130Stepper::diag1_steps_skipped()          { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_steps_skipped;   }\nbool TMC2130Stepper::diag0_int_pushpull()           { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_int_pushpull;    }\nbool TMC2130Stepper::diag1_pushpull()               { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_poscomp_pushpull;}\nbool TMC2130Stepper::small_hysteresis()             { GCONF_t r{0}; r.sr = GCONF(); return r.small_hysteresis;      }\nbool TMC2130Stepper::stop_enable()                  { GCONF_t r{0}; r.sr = GCONF(); return r.stop_enable;           }\nbool TMC2130Stepper::direct_mode()                  { GCONF_t r{0}; r.sr = GCONF(); return r.direct_mode;           }\n*/\n/*\nbit 18 not implemented:\ntest_mode 0:\nNormal operation 1:\nEnable analog test output on pin DCO. IHOLD[1..0] selects the function of DCO:\n0…2: T120, DAC, VDDH Attention:\nNot for user, set to 0 for normal operation!\n*/\n/*\nvoid TMC5160Stepper::recalibrate(bool B)            { SET_REG(recalibrate);             }\nvoid TMC5160Stepper::faststandstill(bool B)         { SET_REG(faststandstill);          }\nvoid TMC5160Stepper::multistep_filt(bool B)         { SET_REG(multistep_filt);          }\nbool TMC5160Stepper::recalibrate()                  { GCONF_t r{0}; r.sr = GCONF(); return r.recalibrate;   }\nbool TMC5160Stepper::faststandstill()               { GCONF_t r{0}; r.sr = GCONF(); return r.faststandstill;    }\nbool TMC5160Stepper::multistep_filt()               { GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt;    }\n*/\nuint32_t TMC2208Stepper::GCONF() {\n    return read(GCONF_register.address);\n}\nvoid TMC2208Stepper::GCONF(uint32_t input) {\n    GCONF_register.sr = input;\n    write(GCONF_register.address, GCONF_register.sr);\n}\n\nvoid TMC2208Stepper::I_scale_analog(bool B)     { SET_REG(i_scale_analog);  }\nvoid TMC2208Stepper::internal_Rsense(bool B)    { SET_REG(internal_rsense); }\nvoid TMC2208Stepper::en_spreadCycle(bool B)     { SET_REG(en_spreadcycle);  }\nvoid TMC2208Stepper::shaft(bool B)              { SET_REG(shaft);           }\nvoid TMC2208Stepper::index_otpw(bool B)         { SET_REG(index_otpw);      }\nvoid TMC2208Stepper::index_step(bool B)         { SET_REG(index_step);      }\nvoid TMC2208Stepper::pdn_disable(bool B)        { SET_REG(pdn_disable);     }\nvoid TMC2208Stepper::mstep_reg_select(bool B)   { SET_REG(mstep_reg_select);}\nvoid TMC2208Stepper::multistep_filt(bool B)     { SET_REG(multistep_filt);  }\n\nbool TMC2208Stepper::I_scale_analog()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog;     }\nbool TMC2208Stepper::internal_Rsense()  { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense;    }\nbool TMC2208Stepper::en_spreadCycle()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.en_spreadcycle;     }\nbool TMC2208Stepper::shaft()            { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.shaft;              }\nbool TMC2208Stepper::index_otpw()       { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_otpw;         }\nbool TMC2208Stepper::index_step()       { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_step;         }\nbool TMC2208Stepper::pdn_disable()      { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.pdn_disable;        }\nbool TMC2208Stepper::mstep_reg_select() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.mstep_reg_select;   }\nbool TMC2208Stepper::multistep_filt()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt;     }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/IHOLD_IRUN.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) IHOLD_IRUN_register.SETTING = B; write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr);\n#define GET_REG(SETTING) return IHOLD_IRUN_register.SETTING;\n\n// IHOLD_IRUN\nuint32_t TMCStepper::IHOLD_IRUN() { return IHOLD_IRUN_register.sr; }\nvoid TMCStepper::IHOLD_IRUN(uint32_t input) {\n    IHOLD_IRUN_register.sr = input;\n    write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr);\n}\n\nvoid    TMCStepper::ihold(uint8_t B)        { SET_REG(ihold);       }\nvoid    TMCStepper::irun(uint8_t B)         { SET_REG(irun);        }\nvoid    TMCStepper::iholddelay(uint8_t B)   { SET_REG(iholddelay);  }\n\nuint8_t TMCStepper::ihold()                 { GET_REG(ihold);       }\nuint8_t TMCStepper::irun()                  { GET_REG(irun);        }\nuint8_t TMCStepper::iholddelay()            { GET_REG(iholddelay);  }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/PWMCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) PWMCONF_register.SETTING = B; write(PWMCONF_register.address, PWMCONF_register.sr)\n#define GET_REG(SETTING) return PWMCONF_register.SETTING\n\n// PWMCONF\n/*\nuint32_t TMC2130Stepper::PWMCONF() { return PWMCONF_register.sr; }\nvoid TMC2130Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2130Stepper::pwm_ampl(\t\tuint8_t B )\t{ SET_REG(pwm_ampl);\t\t}\nvoid TMC2130Stepper::pwm_grad(\t\tuint8_t B )\t{ SET_REG(pwm_grad);\t\t}\nvoid TMC2130Stepper::pwm_freq(\t\tuint8_t B )\t{ SET_REG(pwm_freq);\t\t}\nvoid TMC2130Stepper::pwm_autoscale(\tbool \tB )\t{ SET_REG(pwm_autoscale);\t}\nvoid TMC2130Stepper::pwm_symmetric(\tbool \tB )\t{ SET_REG(pwm_symmetric);\t}\nvoid TMC2130Stepper::freewheel(\t\tuint8_t B )\t{ SET_REG(freewheel);\t\t}\n\nuint8_t TMC2130Stepper::pwm_ampl()\t\t{ GET_REG(pwm_ampl);\t\t}\nuint8_t TMC2130Stepper::pwm_grad()\t\t{ GET_REG(pwm_grad);\t\t}\nuint8_t TMC2130Stepper::pwm_freq()\t\t{ GET_REG(pwm_freq);\t\t}\nbool \tTMC2130Stepper::pwm_autoscale()\t{ GET_REG(pwm_autoscale);\t}\nbool \tTMC2130Stepper::pwm_symmetric()\t{ GET_REG(pwm_symmetric);\t}\nuint8_t TMC2130Stepper::freewheel()\t\t{ GET_REG(freewheel);\t\t}\n\nuint32_t TMC2160Stepper::PWMCONF() {\n\treturn PWMCONF_register.sr;\n}\nvoid TMC2160Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2160Stepper::pwm_ofs\t\t( uint8_t B ) { PWMCONF_register.pwm_ofs = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_grad\t\t( uint8_t B ) { PWMCONF_register.pwm_grad = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_freq\t\t( uint8_t B ) { PWMCONF_register.pwm_freq = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_autoscale\t( bool \t  B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_autograd\t( bool    B ) { PWMCONF_register.pwm_autograd = B; \twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::freewheel\t\t( uint8_t B ) { PWMCONF_register.freewheel = B; \twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_reg\t\t( uint8_t B ) { PWMCONF_register.pwm_reg = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_lim\t\t( uint8_t B ) { PWMCONF_register.pwm_lim = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\n\nuint8_t TMC2160Stepper::pwm_ofs()\t\t{ return PWMCONF_register.pwm_ofs;\t\t}\nuint8_t TMC2160Stepper::pwm_grad()\t\t{ return PWMCONF_register.pwm_grad;\t\t}\nuint8_t TMC2160Stepper::pwm_freq()\t\t{ return PWMCONF_register.pwm_freq;\t\t}\nbool \tTMC2160Stepper::pwm_autoscale()\t{ return PWMCONF_register.pwm_autoscale;}\nbool \tTMC2160Stepper::pwm_autograd()\t{ return PWMCONF_register.pwm_autograd;\t}\nuint8_t TMC2160Stepper::freewheel()\t\t{ return PWMCONF_register.freewheel;\t}\nuint8_t TMC2160Stepper::pwm_reg()\t\t{ return PWMCONF_register.pwm_reg;\t\t}\nuint8_t TMC2160Stepper::pwm_lim()\t\t{ return PWMCONF_register.pwm_lim;\t\t}\n*/\nuint32_t TMC2208Stepper::PWMCONF() {\n\treturn read(PWMCONF_register.address);\n}\nvoid TMC2208Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2208Stepper::pwm_ofs\t\t( uint8_t B ) { PWMCONF_register.pwm_ofs = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_grad\t\t( uint8_t B ) { PWMCONF_register.pwm_grad = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_freq\t\t( uint8_t B ) { PWMCONF_register.pwm_freq = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_autoscale\t( bool \t  B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_autograd\t( bool    B ) { PWMCONF_register.pwm_autograd = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::freewheel\t\t( uint8_t B ) { PWMCONF_register.freewheel = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_reg\t\t( uint8_t B ) { PWMCONF_register.pwm_reg = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_lim\t\t( uint8_t B ) { PWMCONF_register.pwm_lim = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\n\nuint8_t TMC2208Stepper::pwm_ofs()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_ofs;\t\t}\nuint8_t TMC2208Stepper::pwm_grad()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_grad;\t\t}\nuint8_t TMC2208Stepper::pwm_freq()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_freq;\t\t}\nbool \tTMC2208Stepper::pwm_autoscale()\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autoscale;\t}\nbool \tTMC2208Stepper::pwm_autograd()\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autograd;\t}\nuint8_t TMC2208Stepper::freewheel()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.freewheel;\t\t}\nuint8_t TMC2208Stepper::pwm_reg()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_reg;\t\t}\nuint8_t TMC2208Stepper::pwm_lim()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_lim;\t\t}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMC2208Stepper.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n// Protected\n// addr needed for TMC2209\nTMC2208Stepper::TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr) :\n    SWRXpin(SWRXpin),\n    SWTXpin(SWRXpin),\n    TMCStepper(RS),\n    //RXTX_pin(SW_RX_pin == SW_TX_pin ? SW_RX_pin : 0),\n    slave_address(addr)\n    {\n        SoftwareSerial *SWSerialObj = new SoftwareSerial(SWRXpin, SWTXpin);\n        SWSerial = SWSerialObj;\n        defaults();\n\n\n        #if defined TARGET_LPC176X\n        //this->debug1 = new DigitalOut(P1_30);\n        //this->debug2 = new DigitalOut(P0_28);\n        #elif defined TARGET_STM32F4\n        //this->debug1 = new DigitalOut(PE_5);\n        //this->debug2 = new DigitalOut(PE_4);\n        #endif\n\n    }\n\n\nvoid TMC2208Stepper::beginSerial(uint32_t baudrate) {\n\n    SWSerial->begin(baudrate);\n}\n\n\nvoid TMC2208Stepper::begin() {\n\n    beginSerial(19600);\n    pdn_disable(true);\n    mstep_reg_select(true);\n    //Wait to initialize\n    wait_ms(replyDelay);\n\n}\n\nvoid TMC2208Stepper::defaults() {\n    GCONF_register.i_scale_analog = 1;\n    GCONF_register.internal_rsense = 0; // OTP\n    GCONF_register.en_spreadcycle = 0; // OTP\n    GCONF_register.multistep_filt = 1; // OTP\n    IHOLD_IRUN_register.iholddelay = 1; // OTP\n    TPOWERDOWN_register.sr = 20;\n    CHOPCONF_register.sr = 0x10000053;\n    PWMCONF_register.sr = 0xC10D0024;\n  //MSLUT0_register.sr = ???;\n  //MSLUT1_register.sr = ???;\n  //MSLUT2_register.sr = ???;\n  //MSLUT3_register.sr = ???;\n  //MSLUT4_register.sr = ???;\n  //MSLUT5_register.sr = ???;\n  //MSLUT6_register.sr = ???;\n  //MSLUT7_register.sr = ???;\n  //MSLUTSTART_register.start_sin90 = 247;\n}\n\nvoid TMC2208Stepper::push() {\n    GCONF(GCONF_register.sr);\n    IHOLD_IRUN(IHOLD_IRUN_register.sr);\n    SLAVECONF(SLAVECONF_register.sr);\n    TPOWERDOWN(TPOWERDOWN_register.sr);\n    TPWMTHRS(TPWMTHRS_register.sr);\n    VACTUAL(VACTUAL_register.sr);\n    CHOPCONF(CHOPCONF_register.sr);\n    PWMCONF(PWMCONF_register.sr);\n}\n\nbool TMC2208Stepper::isEnabled() { return !enn() && toff(); }\n\nuint8_t TMC2208Stepper::calcCRC(uint8_t datagram[], uint8_t len) {\n    uint8_t crc = 0;\n    for (uint8_t i = 0; i < len; i++) {\n        uint8_t currentByte = datagram[i];\n        for (uint8_t j = 0; j < 8; j++) {\n            if ((crc >> 7) ^ (currentByte & 0x01)) {\n                crc = (crc << 1) ^ 0x07;\n            } else {\n                crc = (crc << 1);\n            }\n            crc &= 0xff;\n            currentByte = currentByte >> 1;\n        }\n    }\n    return crc;\n}\n\n__attribute__((weak))\nint TMC2208Stepper::available() {\n    int out = 0;\n\n\tout = SWSerial->available();\n\n    return out;\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::preWriteCommunication() {\n    //this->debug1->write(1);\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::preReadCommunication() {\n\n\tSWSerial->listen();\t\n    //this->debug2->write(1);\t\t\t\t\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::postWriteCommunication() {\n    //this->debug1->write(0);\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::postReadCommunication() {\n    //this->debug2->write(0);\n}\n\n\n__attribute__((weak))\nint16_t TMC2208Stepper::serial_read() {\n    int16_t out = 0;\n     \n    out = SWSerial->read();\n\n\treturn out;\n}\n\n__attribute__((weak))\nuint8_t TMC2208Stepper::serial_write(const uint8_t data) {\n    int out = 0;\n\n    SWSerial->write(data);\n\n    return out;\n}\n\n\nvoid TMC2208Stepper::write(uint8_t addr, uint32_t regVal) {\n    uint8_t len = 7;\n    addr |= TMC_WRITE;\n    uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, (uint8_t)(regVal>>24), (uint8_t)(regVal>>16), (uint8_t)(regVal>>8), (uint8_t)(regVal>>0), 0x00};\n\t\n    datagram[len] = calcCRC(datagram, len);\n\t\n\t//printf(\"write datagram = %x, %x, %x, %x, %x, %x, %x, %x\\n\", datagram[0], datagram[1], datagram[2], datagram[3], datagram[4], datagram[5], datagram[6], datagram[7]);\n    \n    preWriteCommunication();\n\n    for(uint8_t i=0; i<=len; i++) {\n        bytesWritten += serial_write(datagram[i]);\n    }\n    postWriteCommunication();\n\n    //delay(replyDelay);\n    //ThisThread::sleep_for(150);\n    wait_ms(5);\n}\n\nuint64_t TMC2208Stepper::_sendDatagram(uint8_t datagram[], const uint8_t len, uint16_t timeout) {\n\t\n    while (available() > 0) serial_read(); // Flush\n\n    tmcTimer.reset();\n    tmcTimer.start(); \n\n    preWriteCommunication();\n\tfor(int i=0; i<=len; i++)\n    {   \n        serial_write(datagram[i]);\n    }\n\t//delay(replyDelay);\n    //ThisThread::sleep_for(replyDelay);\n    postWriteCommunication();\n\n\t// scan for the rx frame and read it\n\tuint32_t ms = tmcTimer.read_ms();\n\tuint32_t sync_target = (static_cast<uint32_t>(datagram[0])<<16) | 0xFF00 | datagram[2];\n\tuint32_t sync = 0;\n\n\tdo {\n\t\tuint32_t ms2 = tmcTimer.read_ms();\n\t\tif (ms2 != ms) {\n\t\t\t// 1ms tick\n\t\t\tms = ms2;\n\t\t\ttimeout--;\n\t\t}\n\t\tif (!timeout) return 0;\n\n\t\tint16_t res = serial_read();\n\t\tif (res < 0) continue;\n\n\t\tsync <<= 8;\n\t\tsync |= res & 0xFF;\n\t\tsync &= 0xFFFFFF;\n\n\t} while (sync != sync_target);\n\n\tuint64_t out = sync;\n\tms = tmcTimer.read_ms();\n\ttimeout = this->abort_window;\n\t\t \n\tfor(uint8_t i=0; i<5;) {\n\t\tuint32_t ms2 = tmcTimer.read_ms();\n\t\tif (ms2 != ms) {\n\t\t\t// 1ms tick\n\t\t\tms = ms2;\n\t\t\ttimeout--;\n\t\t}\n\t\tif (!timeout) return 0;\n\n\t\tint16_t res = serial_read();\n\t\tif (res < 0) continue;\n\n\t\tout <<= 8;\n\t\tout |= res & 0xFF;\n\t\ti++;\n\t}\n\n    tmcTimer.stop();\n\t\t\n\twhile (available() > 0) serial_read(); // Flush\n\n\treturn out;\n}\n\nuint32_t TMC2208Stepper::read(uint8_t addr) {\n    constexpr uint8_t len = 3;\n    addr |= TMC_READ;\n    uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, 0x00};\n    datagram[len] = calcCRC(datagram, len);\n    uint64_t out = 0x00000000UL;\n\n    for (uint8_t i = 0; i < max_retries; i++) {\t\t\t \n        preReadCommunication();\n        out = _sendDatagram(datagram, len, abort_window);\n        postReadCommunication();\n\n//        delay(replyDelay);\n        //ThisThread::sleep_for(replyDelay);\n        wait_ms(5);\n\n        CRCerror = false;\n        uint8_t out_datagram[] = {\n            static_cast<uint8_t>(out>>56),\n            static_cast<uint8_t>(out>>48),\n            static_cast<uint8_t>(out>>40),\n            static_cast<uint8_t>(out>>32),\n            static_cast<uint8_t>(out>>24),\n            static_cast<uint8_t>(out>>16),\n            static_cast<uint8_t>(out>> 8),\n            static_cast<uint8_t>(out>> 0)\n        };\n        //printf(\"read  datagram = %x, %x, %x, %x, %x, %x, %x, %x\\n\", out_datagram[0], out_datagram[1], out_datagram[2], out_datagram[3], out_datagram[4], out_datagram[5], out_datagram[6], out_datagram[7]);\n\t\t\n        uint8_t crc = calcCRC(out_datagram, 7);\n        if ((crc != static_cast<uint8_t>(out)) || crc == 0 ) {\n            CRCerror = true;\n            out = 0;\n        } else {\n            break;\n        }\n    }\n\n    return out>>8;\n}\n\nuint8_t TMC2208Stepper::IFCNT() {\n    return read(IFCNT_t::address);\n}\n\nvoid TMC2208Stepper::SLAVECONF(uint16_t input) {\n    SLAVECONF_register.sr = input&0xF00;\n    write(SLAVECONF_register.address, SLAVECONF_register.sr);\n}\nuint16_t TMC2208Stepper::SLAVECONF() {\n    return SLAVECONF_register.sr;\n}\nvoid TMC2208Stepper::senddelay(uint8_t B)   { SLAVECONF_register.senddelay = B; write(SLAVECONF_register.address, SLAVECONF_register.sr); }\nuint8_t TMC2208Stepper::senddelay()         { return SLAVECONF_register.senddelay; }\n\nvoid TMC2208Stepper::OTP_PROG(uint16_t input) {\n    write(OTP_PROG_t::address, input);\n}\n\nuint32_t TMC2208Stepper::OTP_READ() {\n    return read(OTP_READ_t::address);\n}\n\nuint32_t TMC2208Stepper::IOIN() {\n    return read(TMC2208_n::IOIN_t::address);\n}\nbool TMC2208Stepper::enn()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2208Stepper::ms1()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2208Stepper::ms2()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2208Stepper::diag()         { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag;     }\nbool TMC2208Stepper::pdn_uart()     { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2208Stepper::step()         { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2208Stepper::sel_a()        { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a;    }\nbool TMC2208Stepper::dir()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2208Stepper::version()   { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n\n/*\nuint32_t TMC2224Stepper::IOIN() {\n    return read(TMC2224_n::IOIN_t::address);\n}\nbool TMC2224Stepper::enn()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2224Stepper::ms1()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2224Stepper::ms2()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2224Stepper::pdn_uart()     { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2224Stepper::spread()       { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread;   }\nbool TMC2224Stepper::step()         { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2224Stepper::sel_a()        { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a;    }\nbool TMC2224Stepper::dir()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2224Stepper::version()   { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n*/\nuint16_t TMC2208Stepper::FACTORY_CONF() {\n    return read(FACTORY_CONF_register.address);\n}\nvoid TMC2208Stepper::FACTORY_CONF(uint16_t input) {\n    FACTORY_CONF_register.sr = input;\n    write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr);\n}\nvoid TMC2208Stepper::fclktrim(uint8_t B){ FACTORY_CONF_register.fclktrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); }\nvoid TMC2208Stepper::ottrim(uint8_t B)  { FACTORY_CONF_register.ottrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); }\nuint8_t TMC2208Stepper::fclktrim()      { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.fclktrim; }\nuint8_t TMC2208Stepper::ottrim()        { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.ottrim; }\n\nvoid TMC2208Stepper::VACTUAL(uint32_t input) {\n    VACTUAL_register.sr = input;\n    write(VACTUAL_register.address, VACTUAL_register.sr);\n}\nuint32_t TMC2208Stepper::VACTUAL() {\n    return VACTUAL_register.sr;\n}\n\nuint32_t TMC2208Stepper::PWM_SCALE() {\n    return read(TMC2208_n::PWM_SCALE_t::address);\n}\nuint8_t TMC2208Stepper::pwm_scale_sum() {\n    TMC2208_n::PWM_SCALE_t r{0};\n    r.sr = PWM_SCALE();\n    return r.pwm_scale_sum;\n}\n\nint16_t TMC2208Stepper::pwm_scale_auto() {\n    TMC2208_n::PWM_SCALE_t r{0};\n    r.sr = PWM_SCALE();\n    return r.pwm_scale_auto;\n    // Not two's complement? 9nth bit determines sign\n    /*\n    uint32_t d = PWM_SCALE();\n    int16_t response = (d>>PWM_SCALE_AUTO_bp)&0xFF;\n    if (((d&PWM_SCALE_AUTO_bm) >> 24) & 0x1) return -response;\n    else return response;\n    */\n}\n\n// R: PWM_AUTO\nuint32_t TMC2208Stepper::PWM_AUTO() {\n    return read(PWM_AUTO_t::address);\n}\nuint8_t TMC2208Stepper::pwm_ofs_auto()  { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_ofs_auto; }\nuint8_t TMC2208Stepper::pwm_grad_auto() { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_grad_auto; }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMC2208_bitfields.h",
    "content": "#pragma once\n#pragma pack(push, 1)\n\nnamespace TMC2208_n {\n  struct GCONF_t {\n    constexpr static uint8_t address = 0x00;\n    union {\n      uint16_t sr : 10;\n      struct {\n        bool  i_scale_analog : 1,\n              internal_rsense : 1,\n              en_spreadcycle : 1,\n              shaft : 1,\n              index_otpw : 1,\n              index_step : 1,\n              pdn_disable : 1,\n              mstep_reg_select : 1,\n              multistep_filt : 1,\n              test_mode : 1;\n      };\n    };\n  };\n}\n\nnamespace TMC2208_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  enn : 1,\n              : 1,\n              ms1 : 1,\n              ms2 : 1,\n              diag : 1,\n              : 1,\n              pdn_uart : 1,\n              step : 1,\n              sel_a : 1,\n              dir : 1;\n        uint16_t : 14;\n        uint8_t version : 8;\n      };\n    };\n  };\n}\n\nnamespace TMC2224_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  : 1,\n              pdn_uart : 1,\n              spread : 1,\n              dir : 1,\n              enn : 1,\n              step : 1,\n              ms1 : 1,\n              ms2 : 1,\n              sel_a : 1;\n        uint16_t : 15;\n        uint8_t version : 8;\n      };\n    };\n  };\n}\n\nstruct FACTORY_CONF_t {\n  constexpr static uint8_t address = 0x07;\n  union {\n    uint16_t sr;\n    struct {\n        uint8_t fclktrim : 5,\n                         : 3,\n                ottrim : 2;\n    };\n  };\n};\n\nnamespace TMC2208_n {\n  struct VACTUAL_t {\n    constexpr static uint8_t address = 0x22;\n    uint32_t sr;\n  };\n}\n\nstruct MSCURACT_t {\n  constexpr static uint8_t address = 0x6B;\n  union {\n    uint32_t sr : 25;\n    struct {\n      int16_t cur_a : 9,\n                    : 7,\n              cur_b : 9;\n    };\n  };\n};\n\nnamespace TMC2208_n {\n  struct CHOPCONF_t {\n    constexpr static uint8_t address = 0x6C;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t toff : 4,\n                hstrt : 3,\n                hend : 4,\n                     : 4,\n                tbl : 2;\n        bool    vsense : 1;\n        uint8_t : 6,\n                mres : 4;\n        bool    intpol : 1,\n                dedge : 1,\n                diss2g : 1,\n                diss2vs : 1;\n      };\n    };\n  };\n\n  struct PWMCONF_t {\n    constexpr static uint8_t address = 0x70;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t pwm_ofs : 8,\n                pwm_grad : 8,\n                pwm_freq : 2;\n        bool pwm_autoscale : 1,\n             pwm_autograd : 1;\n        uint8_t freewheel : 2,\n                          : 2,\n                pwm_reg : 4,\n                pwm_lim : 4;\n      };\n    };\n  };\n\n  struct DRV_STATUS_t {\n    constexpr static uint8_t address = 0x6F;\n    union {\n      uint32_t sr;\n      struct {\n        bool otpw : 1,\n             ot : 1,\n             s2ga : 1,\n             s2gb : 1,\n             s2vsa : 1,\n             s2vsb : 1,\n             ola : 1,\n             olb : 1,\n             t120 : 1,\n             t143 : 1,\n             t150 : 1,\n             t157 : 1;\n        uint8_t : 4,\n                cs_actual : 5,\n                : 3,\n                : 6;\n        bool stealth : 1,\n             stst : 1;\n      };\n    };\n  };\n\n  struct PWM_SCALE_t {\n    constexpr static uint8_t address = 0x71;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t pwm_scale_sum : 8,\n                : 8;\n        int16_t pwm_scale_auto : 9;\n      };\n    };\n  };\n}\n\n#pragma pack(pop)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMC2209Stepper.cpp",
    "content": "#include \"TMCStepper.h\"\n\nuint32_t TMC2209Stepper::IOIN() {\n    return read(TMC2209_n::IOIN_t::address);\n}\nbool TMC2209Stepper::enn()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2209Stepper::ms1()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2209Stepper::ms2()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2209Stepper::diag()         { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag;     }\nbool TMC2209Stepper::pdn_uart()     { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2209Stepper::step()         { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2209Stepper::spread_en()    { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread_en;}\nbool TMC2209Stepper::dir()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2209Stepper::version()   { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n\nvoid TMC2209Stepper::push() {\n    IHOLD_IRUN(IHOLD_IRUN_register.sr);\n    TPOWERDOWN(TPOWERDOWN_register.sr);\n    TPWMTHRS(TPWMTHRS_register.sr);\n    GCONF(GCONF_register.sr);\n    SLAVECONF(SLAVECONF_register.sr);\n    VACTUAL(VACTUAL_register.sr);\n    CHOPCONF(CHOPCONF_register.sr);\n    PWMCONF(PWMCONF_register.sr);\n    TCOOLTHRS(TCOOLTHRS_register.sr);\n}\n\nvoid TMC2209Stepper::SGTHRS(uint8_t input) {\n    SGTHRS_register.sr = input;\n    write(SGTHRS_register.address, SGTHRS_register.sr);\n}\nuint8_t TMC2209Stepper::SGTHRS() {\n    return SGTHRS_register.sr;\n}\n\n// W: TCOOLTHRS\nuint32_t TMC2209Stepper::TCOOLTHRS() { return TCOOLTHRS_register.sr; }\nvoid TMC2209Stepper::TCOOLTHRS(uint32_t input) {\n  TCOOLTHRS_register.sr = input;\n  write(TCOOLTHRS_register.address, TCOOLTHRS_register.sr);\n}\n\nuint16_t TMC2209Stepper::SG_RESULT() {\n    return read(TMC2209_n::SG_RESULT_t::address);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMC2209_bitfields.h",
    "content": "#pragma once\n#pragma pack(push, 1)\n\nnamespace TMC2209_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  enn : 1,\n                  : 1,\n              ms1 : 1,\n              ms2 : 1,\n              diag : 1,\n                   : 1,\n              pdn_uart : 1,\n              step : 1,\n              spread_en : 1,\n              dir : 1;\n        uint16_t : 14;\n        uint8_t version : 8;\n      };\n    };\n  };\n\n  struct SGTHRS_t {\n    constexpr static uint8_t address = 0x40;\n    uint8_t sr : 8;\n  };\n\n  struct SG_RESULT_t {\n    constexpr static uint8_t address = 0x41;\n    uint16_t sr : 10;\n  };\n\n  struct COOLCONF_t {\n    constexpr static uint8_t address = 0x42;\n    union {\n      uint16_t sr;\n      struct {\n        uint8_t semin : 4,\n                      : 1,\n                seup : 2,\n                      : 1,\n                semax : 4,\n                      : 1,\n                sedn : 2;\n        bool    seimin : 1;\n      };\n    };\n  };\n\n} //namespace \n//////////////////////////////////////////////////////\nstruct SLAVECONF_t {\n  constexpr static uint8_t address = 0x03;\n  union {\n    uint16_t sr : 12;\n    struct {\n      uint8_t slaveaddr : 8;\n      uint8_t senddelay : 4;\n    };\n  };\n};\n\nstruct PWM_AUTO_t {\n  constexpr static uint8_t address = 0x72;\n  union {\n    uint32_t sr : 24;\n    struct {\n      uint8_t pwm_ofs_auto : 8,\n                           : 8,\n              pwm_grad_auto : 8;\n    };\n  };\n};\n\nstruct GCONF_t {\n  constexpr static uint8_t address = 0x00;\n  union {\n    uint32_t sr : 18;\n    struct {\n      bool  i_scale_analog : 1, // 2130, 5130\n            internal_rsense : 1, // 2130, 5130\n            en_pwm_mode : 1,\n            enc_commutation : 1, // 2130, 5130\n            shaft : 1,\n            diag0_error : 1,\n            diag0_otpw : 1,\n            diag0_stall : 1,\n            diag1_stall : 1,\n            diag1_index : 1,\n            diag1_onstate : 1,\n            diag1_steps_skipped : 1,\n            diag0_int_pushpull : 1,\n            diag1_pushpull : 1,\n            small_hysteresis : 1,\n            stop_enable : 1,\n            direct_mode : 1;\n    };\n    struct { // TMC5160\n      bool recalibrate : 1,\n           faststandstill : 1,\n                          : 1,\n           multistep_filt : 1,\n                    : 3,\n           diag0_step : 1,\n           diag1_dir : 1,\n                 : 4,\n           diag1_poscomp_pushpull : 1;\n    };\n  };\n};\n\nstruct IHOLD_IRUN_t {\n  constexpr static uint8_t address = 0x10;\n  union {\n    uint32_t sr : 20;\n    struct {\n      uint8_t ihold : 5,\n                    : 3,\n              irun : 5,\n                   : 3,\n              iholddelay : 4;\n    };\n  };\n};\n\nstruct GSTAT_t {\n  constexpr static uint8_t address = 0x01;\n  union {\n    uint8_t sr : 3;\n    struct {\n      bool  reset : 1,\n            drv_err : 1,\n            uv_cp : 1;\n    };\n  };\n};\n\nstruct TPOWERDOWN_t {\n  constexpr static uint8_t address = 0x11;\n  uint8_t sr : 8;\n};\n\nstruct TPWMTHRS_t {\n  constexpr static uint8_t address = 0x13;\n  uint32_t sr : 20;\n};\n\nstruct TCOOLTHRS_t {\n  constexpr static uint8_t address = 0x14;\n  uint32_t sr : 20;\n};\n\nstruct THIGH_t {\n  constexpr static uint8_t address = 0x15;\n  uint32_t sr : 20;\n};\n\nstruct XDIRECT_t {\n  constexpr static uint8_t address = 0x2D;\n  union {\n    uint32_t sr : 25;\n    struct {\n      int16_t coil_A : 9;\n      int8_t         : 7;\n      int16_t coil_B : 9;\n    };\n  };\n};\n\nstruct VDCMIN_t {\n  constexpr static uint8_t address = 0x33;\n  uint32_t sr : 23;\n};\n\nstruct CHOPCONF_t {\n  constexpr static uint8_t address = 0x6C;\n  union {\n    uint32_t sr : 32;\n    struct {\n      uint8_t toff : 4,\n              hstrt : 3,\n              hend : 4,\n                   : 1;\n      bool    disfdcc : 1,\n              rndtf : 1,\n              chm : 1;\n      uint8_t tbl : 2;\n      bool    vsense : 1,\n              vhighfs : 1,\n              vhighchm : 1;\n      uint8_t sync : 4, // 2130, 5130\n              mres : 4;\n      bool    intpol : 1,\n              dedge : 1,\n              diss2g : 1;\n    };\n    struct { // TMC5160\n      uint32_t     : 20;\n      uint8_t tpfd : 4; // 5160\n      uint16_t     : 7;\n      bool diss2vs : 1; // TMC5160 only\n    };\n  };\n};\n\nstruct DCCTRL_t {\n    constexpr static uint8_t address = 0x6E;\n    union {\n        uint32_t sr : 24;\n        struct {\n            uint16_t dc_time : 10,\n                : 6;\n            uint8_t dc_sg : 8;\n        };\n    };\n};\n\nstruct PWMCONF_t {\n  constexpr static uint8_t address = 0x70;\n  union {\n    uint32_t sr : 22;\n    struct {\n      uint8_t pwm_ampl : 8,\n              pwm_grad : 8,\n              pwm_freq : 2;\n      bool pwm_autoscale : 1,\n           pwm_symmetric : 1;\n      uint8_t freewheel : 2;\n    };\n  };\n};\n\nstruct ENCM_CTRL_t {\n  constexpr static uint8_t address = 0x72;\n  union {\n    uint8_t sr : 2;\n    struct {\n      bool  inv : 1,\n            maxspeed : 1;\n    };\n  };\n};  \n  \n#pragma pack(pop)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMCStepper.cpp",
    "content": "#include \"TMCStepper.h\"\n\n\n/*\n  Requested current = mA = I_rms/1000\n  Equation for current:\n  I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2)\n  Solve for CS ->\n  CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1\n\n  Example:\n  vsense = 0b0 -> V_fs = 0.325V\n  mA = 1640mA = I_rms/1000 = 1.64A\n  R_sense = 0.10 Ohm\n  ->\n  CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4\n  CS = 26\n*/\n\nuint16_t TMCStepper::cs2rms(uint8_t CS) {\n  return (float)(CS+1)/32.0 * (vsense() ? 0.180 : 0.325)/(Rsense+0.02) / 1.41421 * 1000;\n}\n\nvoid TMCStepper::rms_current(uint16_t mA) {\n  uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1;\n  // If Current Scale is too low, turn on high sensitivity R_sense and calculate again\n  if (CS < 16) {\n    vsense(true);\n    CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1;\n  } else { // If CS >= 16, turn off high_sense_r\n    vsense(false);\n  }\n\n  if (CS > 31)\n    CS = 31;\n\n  irun(CS);\n  ihold(CS*holdMultiplier);\n  //val_mA = mA;\n}\nvoid TMCStepper::rms_current(uint16_t mA, float mult) {\n  holdMultiplier = mult;\n  rms_current(mA);\n}\n\nuint16_t TMCStepper::rms_current() {\n  return cs2rms(irun());\n}\n\nuint8_t TMCStepper::test_connection() {\n  uint32_t drv_status = DRV_STATUS();\n  switch (drv_status) {\n      case 0xFFFFFFFF: return 1;\n      case 0: return 2;\n      default: return 0;\n  }\n}\n\nvoid TMCStepper::hysteresis_end(int8_t value) { hend(value+3); }\nint8_t TMCStepper::hysteresis_end() { return hend()-3; };\n\nvoid TMCStepper::hysteresis_start(uint8_t value) { hstrt(value-1); }\nuint8_t TMCStepper::hysteresis_start() { return hstrt()+1; }\n\nvoid TMCStepper::microsteps(uint16_t ms) {\n  switch(ms) {\n    case 256: mres(0); break;\n    case 128: mres(1); break;\n    case  64: mres(2); break;\n    case  32: mres(3); break;\n    case  16: mres(4); break;\n    case   8: mres(5); break;\n    case   4: mres(6); break;\n    case   2: mres(7); break;\n    case   1: mres(8); break;\n    default: break;\n  }\n}\n\nuint16_t TMCStepper::microsteps() {\n  switch(mres()) {\n    case 0: return 256;\n    case 1: return 128;\n    case 2: return  64;\n    case 3: return  32;\n    case 4: return  16;\n    case 5: return   8;\n    case 6: return   4;\n    case 7: return   2;\n    case 8: return   1;\n  }\n  return 1;\n}\n\nvoid TMCStepper::blank_time(uint8_t value) {\n  switch (value) {\n    case 16: tbl(0b00); break;\n    case 24: tbl(0b01); break;\n    case 36: tbl(0b10); break;\n    case 54: tbl(0b11); break;\n  }\n}\n\nuint8_t TMCStepper::blank_time() {\n  switch (tbl()) {\n    case 0b00: return 16;\n    case 0b01: return 24;\n    case 0b10: return 36;\n    case 0b11: return 54;\n  }\n  return 0;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////\n// R+C: GSTAT\nuint8_t TMCStepper::GSTAT()  { return read(GSTAT_t::address); }\nvoid  TMCStepper::GSTAT(uint8_t){ write(GSTAT_t::address, 0b111); }\nbool  TMCStepper::reset()    { GSTAT_t r; r.sr = GSTAT(); return r.reset; }\nbool  TMCStepper::drv_err()  { GSTAT_t r; r.sr = GSTAT(); return r.drv_err; }\nbool  TMCStepper::uv_cp()    { GSTAT_t r; r.sr = GSTAT(); return r.uv_cp; }\n///////////////////////////////////////////////////////////////////////////////////////\n// W: TPOWERDOWN\nuint8_t TMCStepper::TPOWERDOWN() { return TPOWERDOWN_register.sr; }\nvoid TMCStepper::TPOWERDOWN(uint8_t input) {\n  TPOWERDOWN_register.sr = input;\n  write(TPOWERDOWN_register.address, TPOWERDOWN_register.sr);\n}\n///////////////////////////////////////////////////////////////////////////////////////\n// R: TSTEP\nuint32_t TMCStepper::TSTEP() { return read(TSTEP_t::address); }\n///////////////////////////////////////////////////////////////////////////////////////\n// W: TPWMTHRS\nuint32_t TMCStepper::TPWMTHRS() { return TPWMTHRS_register.sr; }\nvoid TMCStepper::TPWMTHRS(uint32_t input) {\n  TPWMTHRS_register.sr = input;\n  write(TPWMTHRS_register.address, TPWMTHRS_register.sr);\n}\n\nuint16_t TMCStepper::MSCNT() {\n  return read(MSCNT_t::address);\n}\n\nuint32_t TMCStepper::MSCURACT() { return read(MSCURACT_t::address); }\nint16_t TMCStepper::cur_a() {\n  MSCURACT_t r{0};\n  r.sr = MSCURACT();\n  int16_t value = r.cur_a;\n  if (value > 255) value -= 512;\n  return value;\n}\nint16_t TMCStepper::cur_b() {\n  MSCURACT_t r{0};\n  r.sr = MSCURACT();\n  int16_t value = r.cur_b;\n  if (value > 255) value -= 512;\n  return value;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMCStepper.h",
    "content": "#include \"mbed.h\"\n#include <cstdint>\n#include \"../SoftwareSerial/SoftwareSerial.h\"\n#include \"../pin/pin.h\"\n\n//#include \"TMC2130_bitfields.h\"\n//#include \"TMC2160_bitfields.h\"\n//#include \"TMC5130_bitfields.h\"\n//#include \"TMC5160_bitfields.h\"\n#include \"TMC2208_bitfields.h\"\n#include \"TMC2209_bitfields.h\"\n//#include \"TMC2660_bitfields.h\"\n\n\n#define INIT_REGISTER(REG) REG##_t REG##_register = REG##_t\n#define INIT2208_REGISTER(REG) TMC2208_n::REG##_t REG##_register = TMC2208_n::REG##_t\n#define SET_ALIAS(TYPE, DRIVER, NEW, ARG, OLD) TYPE (DRIVER::*NEW)(ARG) = &DRIVER::OLD\n\n#define TMCSTEPPER_VERSION 0x000701 // v0.7.1\n\nclass TMCStepper {\n    public:\n        uint16_t cs2rms(uint8_t CS);\n        void rms_current(uint16_t mA);\n        void rms_current(uint16_t mA, float mult);\n        uint16_t rms_current();\n        void hold_multiplier(float val) { holdMultiplier = val; }\n        float hold_multiplier() { return holdMultiplier; }\n        uint8_t test_connection();\n\n        // Helper functions\n        void microsteps(uint16_t ms);\n        uint16_t microsteps();\n        void blank_time(uint8_t value);\n        uint8_t blank_time();\n        void hysteresis_end(int8_t value);\n        int8_t hysteresis_end();\n        void hysteresis_start(uint8_t value);\n        uint8_t hysteresis_start();\n\n        // R+WC: GSTAT\n        void    GSTAT(                          uint8_t input);\n        uint8_t GSTAT();\n        bool    reset();\n        bool    drv_err();\n        bool    uv_cp();\n\n        // W: IHOLD_IRUN\n        void IHOLD_IRUN(                    uint32_t input);\n        uint32_t IHOLD_IRUN();\n        void    ihold(                          uint8_t B);\n        void    irun(                               uint8_t B);\n        void    iholddelay(                 uint8_t B);\n        uint8_t ihold();\n        uint8_t irun();\n        uint8_t iholddelay();\n\n        // W: TPOWERDOWN\n        uint8_t TPOWERDOWN();\n        void TPOWERDOWN(                    uint8_t input);\n\n        // R: TSTEP\n        uint32_t TSTEP();\n\n        // W: TPWMTHRS\n        uint32_t TPWMTHRS();\n        void TPWMTHRS(                      uint32_t input);\n\n        // R: MSCNT\n        uint16_t MSCNT();\n\n        // R: MSCURACT\n        uint32_t MSCURACT();\n        int16_t cur_a();\n        int16_t cur_b();\n\n\t\tTimer tmcTimer;\n\n    protected:\n        TMCStepper(float RS) : Rsense(RS) {};\n        INIT_REGISTER(IHOLD_IRUN){{.sr=0}}; // 32b\n        INIT_REGISTER(TPOWERDOWN){.sr=0};       // 8b\n        INIT_REGISTER(TPWMTHRS){.sr=0};         // 32b\n\n        static constexpr uint8_t TMC_READ = 0x00,\n                                 TMC_WRITE = 0x80;\n\n        struct TSTEP_t { constexpr static uint8_t address = 0x12; };\n        struct MSCNT_t { constexpr static uint8_t address = 0x6A; };\n\n        virtual void write(uint8_t, uint32_t) = 0;\n        virtual uint32_t read(uint8_t) = 0;\n        virtual void vsense(bool) = 0;\n        virtual bool vsense(void) = 0;\n        virtual uint32_t DRV_STATUS() = 0;\n        virtual void hend(uint8_t) = 0;\n        virtual uint8_t hend() = 0;\n        virtual void hstrt(uint8_t) = 0;\n        virtual uint8_t hstrt() = 0;\n        virtual void mres(uint8_t) = 0;\n        virtual uint8_t mres() = 0;\n        virtual void tbl(uint8_t) = 0;\n        virtual uint8_t tbl() = 0;\n\n        const float Rsense;\n        float holdMultiplier = 0.5;\n};\n\n\nclass TMC2208Stepper : public TMCStepper {\n    public:\n\n        TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS) :\n                TMC2208Stepper(SWRXpin, SWTXpin, RS, TMC2208_SLAVE_ADDR)\n                {}\n\n        SoftwareSerial * SWSerial = nullptr;\n\n        void defaults();\n        void push();\n        void begin();\n        void beginSerial(uint32_t baudrate) __attribute__((weak));\n\n        bool isEnabled();\n\n        // RW: GCONF\n        void GCONF(uint32_t input);\n        void I_scale_analog(bool B);\n        void internal_Rsense(bool B);\n        void en_spreadCycle(bool B);\n        void shaft(bool B);\n        void index_otpw(bool B);\n        void index_step(bool B);\n        void pdn_disable(bool B);\n        void mstep_reg_select(bool B);\n        void multistep_filt(bool B);\n        uint32_t GCONF();\n        bool I_scale_analog();\n        bool internal_Rsense();\n        bool en_spreadCycle();\n        bool shaft();\n        bool index_otpw();\n        bool index_step();\n        bool pdn_disable();\n        bool mstep_reg_select();\n        bool multistep_filt();\n\n        // R: IFCNT\n        uint8_t IFCNT();\n\n        // W: SLAVECONF\n        void SLAVECONF(uint16_t input);\n        uint16_t SLAVECONF();\n        void senddelay(uint8_t B);\n        uint8_t senddelay();\n\n        // W: OTP_PROG\n        void OTP_PROG(uint16_t input);\n\n        // R: OTP_READ\n        uint32_t OTP_READ();\n\n        // R: IOIN\n        uint32_t IOIN();\n        bool enn();\n        bool ms1();\n        bool ms2();\n        bool diag();\n        bool pdn_uart();\n        bool step();\n        bool sel_a();\n        bool dir();\n        uint8_t version();\n\n        // RW: FACTORY_CONF\n        void FACTORY_CONF(uint16_t input);\n        uint16_t FACTORY_CONF();\n        void fclktrim(uint8_t B);\n        void ottrim(uint8_t B);\n        uint8_t fclktrim();\n        uint8_t ottrim();\n\n        // W: VACTUAL\n        void VACTUAL(uint32_t input);\n        uint32_t VACTUAL();\n\n        // RW: CHOPCONF\n        void CHOPCONF(uint32_t input);\n        void toff(uint8_t B);\n        void hstrt(uint8_t B);\n        void hend(uint8_t B);\n        void tbl(uint8_t B);\n        void vsense(bool B);\n        void mres(uint8_t B);\n        void intpol(bool B);\n        void dedge(bool B);\n        void diss2g(bool B);\n        void diss2vs(bool B);\n        uint32_t CHOPCONF();\n        uint8_t toff();\n        uint8_t hstrt();\n        uint8_t hend();\n        uint8_t tbl();\n        bool vsense();\n        uint8_t mres();\n        bool intpol();\n        bool dedge();\n        bool diss2g();\n        bool diss2vs();\n\n        // R: DRV_STATUS\n        uint32_t DRV_STATUS();\n        bool otpw();\n        bool ot();\n        bool s2ga();\n        bool s2gb();\n        bool s2vsa();\n        bool s2vsb();\n        bool ola();\n        bool olb();\n        bool t120();\n        bool t143();\n        bool t150();\n        bool t157();\n        uint16_t cs_actual();\n        bool stealth();\n        bool stst();\n\n        // RW: PWMCONF\n        void PWMCONF(uint32_t input);\n        void pwm_ofs(uint8_t B);\n        void pwm_grad(uint8_t B);\n        void pwm_freq(uint8_t B);\n        void pwm_autoscale(bool B);\n        void pwm_autograd(bool B);\n        void freewheel(uint8_t B);\n        void pwm_reg(uint8_t B);\n        void pwm_lim(uint8_t B);\n        uint32_t PWMCONF();\n        uint8_t pwm_ofs();\n        uint8_t pwm_grad();\n        uint8_t pwm_freq();\n        bool pwm_autoscale();\n        bool pwm_autograd();\n        uint8_t freewheel();\n        uint8_t pwm_reg();\n        uint8_t pwm_lim();\n\n        // R: PWM_SCALE\n        uint32_t PWM_SCALE();\n        uint8_t pwm_scale_sum();\n        int16_t pwm_scale_auto();\n\n        // R: PWM_AUTO (0x72)\n        uint32_t PWM_AUTO();\n        uint8_t pwm_ofs_auto();\n        uint8_t pwm_grad_auto();\n\n        uint16_t bytesWritten = 0;\n        float Rsense = 0.11;\n        bool CRCerror = false;\n    protected:\n        INIT2208_REGISTER(GCONF)            {{.sr=0}};\n        INIT_REGISTER(SLAVECONF)            {{.sr=0}};\n        INIT_REGISTER(FACTORY_CONF)     {{.sr=0}};\n        INIT2208_REGISTER(VACTUAL)      {.sr=0};\n        INIT2208_REGISTER(CHOPCONF)     {{.sr=0}};\n        INIT2208_REGISTER(PWMCONF)      {{.sr=0}};\n\n        struct IFCNT_t      { constexpr static uint8_t address = 0x02; };\n        struct OTP_PROG_t   { constexpr static uint8_t address = 0x04; };\n        struct OTP_READ_t   { constexpr static uint8_t address = 0x05; };\n\n        //SoftwareSerial * SWSerial = nullptr;\n\n        TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr);\n\n        std::string SWTXpin;\n        std::string SWRXpin;\n\n        DigitalOut* debug1;\n        DigitalOut* debug2;\n\n        int available();\n        void preWriteCommunication();\n        void preReadCommunication();\n        int16_t serial_read();\n        uint8_t serial_write(const uint8_t data);\n        void postWriteCommunication();\n        void postReadCommunication();\n        void write(uint8_t, uint32_t);\n        uint32_t read(uint8_t);\n        const uint8_t slave_address;\n        uint8_t calcCRC(uint8_t datagram[], uint8_t len);\n        static constexpr uint8_t  TMC2208_SYNC = 0x05,\n                                  TMC2208_SLAVE_ADDR = 0x00;\n        static constexpr uint8_t replyDelay = 2;  //ms\n        static constexpr uint8_t abort_window = 5;\n        static constexpr uint8_t max_retries = 2;\n\n        uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t);\n};\n\nclass TMC2209Stepper : public TMC2208Stepper {\n    public:\n\n        TMC2209Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr) :\n                TMC2208Stepper(SWRXpin, SWTXpin, RS, addr) {}\n\n        void push();\n\n        // R: IOIN\n        uint32_t IOIN();\n        bool enn();\n        bool ms1();\n        bool ms2();\n        bool diag();\n        bool pdn_uart();\n        bool step();\n        bool spread_en();\n        bool dir();\n        uint8_t version();\n\n        // W: TCOOLTHRS\n        uint32_t TCOOLTHRS();\n        void TCOOLTHRS(uint32_t input);\n\n        // W: SGTHRS\n        void SGTHRS(uint8_t B);\n        uint8_t SGTHRS();\n\n        // R: SG_RESULT\n        uint16_t SG_RESULT();\n\n        // W: COOLCONF\n        void COOLCONF(uint16_t B);\n        uint16_t COOLCONF();\n        void semin(uint8_t B);\n        void seup(uint8_t B);\n        void semax(uint8_t B);\n        void sedn(uint8_t B);\n        void seimin(bool B);\n        uint8_t semin();\n        uint8_t seup();\n        uint8_t semax();\n        uint8_t sedn();\n        bool seimin();\n\n    protected:\n        INIT_REGISTER(TCOOLTHRS){.sr=0};\n        TMC2209_n::SGTHRS_t SGTHRS_register{.sr=0};\n        TMC2209_n::COOLCONF_t COOLCONF_register{{.sr=0}};\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/TMCStepper/TMC_MACROS.h",
    "content": "#pragma once\n\n#define DEBUG_PRINT(CFG, VAL) Serial.print(CFG); Serial.print('('); Serial.print(VAL, HEX); Serial.println(')')\n//#define WRITE_REG(R) write(R##_register.address, R##_register.sr)\n//#define READ_REG(R) read(R##_register.address)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/branch",
    "content": "default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/cache/branch2-base",
    "content": "d4c8fe4d9b29d4e5614620b0820a49d31087b512 0\nd4c8fe4d9b29d4e5614620b0820a49d31087b512 o default\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/cache/rbc-names-v1",
    "content": "default"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/cache/tags2-visible",
    "content": "0 d4c8fe4d9b29d4e5614620b0820a49d31087b512\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/hgrc",
    "content": "# example repository config (see 'hg help config' for more info)\n[paths]\nmbed-studio-cache = c:\\Users\\tanya\\AppData\\Local\\Mbed Studio\\library-cache\\os.mbed.com\\teams\\WIZnet\\code\\WIZnetInterface-OS5\ndefault = http://os.mbed.com/teams/WIZnet/code/WIZnetInterface-OS5/\n\n# path aliases to other clones of this repo in URLs or filesystem paths\n# (see 'hg help config.paths' for more info)\n#\n# default:pushurl = ssh://jdoe@example.net/hg/jdoes-fork\n# my-fork         = ssh://jdoe@example.net/hg/jdoes-fork\n# my-clone        = /home/jdoe/jdoes-clone\n\n[ui]\n# name and email (local to this repository, optional), e.g.\n# username = Jane Doe <jdoe@example.com>\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/requires",
    "content": "dotencode\nfncache\ngeneraldelta\nrevlogv1\nsparserevlog\nstore\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/.hg/store/fncache",
    "content": "data/Socket/DNSClient.h.i\ndata/arch/int/W7500x_toe.cpp.i\ndata/Socket/TCPSocketServer.h.i\ndata/Socket/TCPSocketConnection.cpp.i\ndata/arch/ext/W5500.cpp.i\ndata/arch/ext/W5500.h.i\ndata/Socket/DHCPClient.h.i\ndata/Socket/TCPSocketServer.cpp.i\ndata/Socket/WIZnet_UDPSocket.cpp.i\ndata/Socket/TCPSocketConnection.h.i\ndata/WIZnetInterface.h.i\ndata/arch/int/W7500x_toe.h.i\ndata/Socket/WIZnet_Socket.h.i\ndata/Socket/WIZnet_Socket.cpp.i\ndata/Socket/Endpoint.h.i\ndata/Socket/DNSClient.cpp.i\ndata/WIZnetInterface.cpp.i\ndata/Socket/Endpoint.cpp.i\ndata/eth_arch.h.i\ndata/Socket/DHCPClient.cpp.i\ndata/Socket/WIZnet_UDPSocket.h.i\ndata/Socket/dnsname.h.i\ndata/Socket/pico_string.h.i\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/DHCPClient.cpp",
    "content": "// DHCPClient.cpp 2013/4/10\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n#include \"WIZnet_UDPSocket.h\"\n#include \"DHCPClient.h\"\n\n#define DBG_DHCP 0\n\n#if DBG_DHCP\n#define DBG(...) do{debug(\"[%s:%d]\", __PRETTY_FUNCTION__,__LINE__);debug(__VA_ARGS__);} while(0);\n#define DBG_HEX(A,B) do{debug(\"[%s:%d]\\r\\n\", __PRETTY_FUNCTION__,__LINE__);debug_hex(A,B);} while(0);\n#else\n#define DBG(...) while(0);\n#define DBG_HEX(A,B) while(0);\n#endif\n\nint DHCPClient::discover()\n{\n    m_pos = 0;\n    const uint8_t header[] = {0x01,0x01,0x06,0x00};\n    add_buf((uint8_t*)header, sizeof(header));\n    uint32_t x = time(NULL) + rand();\n    xid[0] = x>>24; xid[1] = x>>16; xid[2] = x>>8; xid[3] = x;\n    add_buf(xid, 4);\n    fill_buf(20, 0x00);\n    add_buf(chaddr, 6);\n    fill_buf(10+192, 0x00);\n    const uint8_t options[] = {0x63,0x82,0x53,0x63, // magic cookie\n                               53,1,DHCPDISCOVER,   // DHCP option 53: DHCP Discover\n                               55,4,1,3,15,6,\n                               255}; \n    add_buf((uint8_t*)options, sizeof(options));\n    return m_pos;\n}\n\nint DHCPClient::request()\n{\n    m_pos = 0;\n    const uint8_t header[] = {0x01,0x01,0x06,0x00};\n    add_buf((uint8_t*)header, sizeof(header));\n    add_buf(xid, 4);\n    fill_buf(12, 0x00);\n    add_buf(siaddr, 4);\n    fill_buf(4, 0x00); // giaddr\n    add_buf(chaddr, 6);\n    fill_buf(10+192, 0x00);\n    const uint8_t options[] = {0x63,0x82,0x53,0x63, // magic cookie\n                               53,1,DHCPREQUEST,    // DHCP option 53: DHCP Request\n                               55,4,1,3,15,6,       // DHCP option 55:\n                               };\n    add_buf((uint8_t*)options, sizeof(options));\n    add_option(50, yiaddr, 4);\n    add_option(54, siaddr, 4);\n    add_option(255);\n    return m_pos;\n}\n\nint DHCPClient::offer(uint8_t buf[], int size) {\n    memcpy(yiaddr, buf+DHCP_OFFSET_YIADDR, 4);   \n    memcpy(siaddr, buf+DHCP_OFFSET_SIADDR, 4);   \n    uint8_t *p;\n    int msg_type = -1;\n    p = buf + DHCP_OFFSET_OPTIONS;\n    while(*p != 255 && p < (buf+size)) {\n        uint8_t code = *p++;\n        if (code == 0) { // Pad Option\n            continue;\n        }\n        int len = *p++;\n \n        DBG(\"DHCP option: %d\\r\\n\", code);\n        DBG_HEX(p, len);\n\n        switch(code) {\n            case 53:\n                msg_type = *p;\n                break;\n            case 1:\n                memcpy(netmask, p, 4); // Subnet mask address\n                break;\n            case 3:\n                memcpy(gateway, p, 4); // Gateway IP address\n                break; \n            case 6:  // DNS server\n                memcpy(dnsaddr, p, 4);\n                break;\n            case 51: // IP lease time \n                break;\n            case 54: // DHCP server\n                memcpy(siaddr, p, 4);\n                break;\n        }\n        p += len;\n    }\n    return msg_type;\n}\n\nbool DHCPClient::verify(uint8_t buf[], int len) {\n    if (len < DHCP_OFFSET_OPTIONS) {\n        return false;\n    }\n    if (buf[DHCP_OFFSET_OP] != 0x02) {\n        return false;\n    }\n    if (memcmp(buf+DHCP_OFFSET_XID, xid, 4) != 0) {\n        return false;\n    }\n    return true;\n}\n\nvoid DHCPClient::callback()\n{\n    Endpoint host;\n    int recv_len = m_udp->receiveFrom(host, (char*)m_buf, sizeof(m_buf));\n    if (recv_len < 0) {\n        return;\n    }\n    if (!verify(m_buf, recv_len)) {\n        return;\n    }\n    int r = offer(m_buf, recv_len);\n    if (r == DHCPOFFER) {\n        int send_size = request();\n        m_udp->sendTo(m_server, (char*)m_buf, send_size);\n    } else if (r == DHCPACK) {\n        exit_flag = true;\n    }\n}\n\nvoid  DHCPClient::add_buf(uint8_t c)\n{\n    m_buf[m_pos++] = c;\n}\n\nvoid  DHCPClient::add_buf(uint8_t* buf, int len)\n{\n    for(int i = 0; i < len; i++) {\n        add_buf(buf[i]);\n    }\n}\n\nvoid DHCPClient::fill_buf(int len, uint8_t data)\n{\n    while(len-- > 0) {\n        add_buf(data);\n    }\n}\n\nvoid  DHCPClient::add_option(uint8_t code, uint8_t* buf, int len)\n{\n    add_buf(code);\n    if (len > 0) {\n        add_buf((uint8_t)len);\n        add_buf(buf, len);\n    }\n}\n\nint DHCPClient::setup(int timeout_ms)\n{\n    eth = WIZnet_Chip::getInstance();\n    if (eth == NULL) {\n        return -1;\n    }    \n    eth->reg_rd_mac(SHAR, chaddr);\n    int interval_ms = 5*1000; // 5000msec\n    if (timeout_ms < interval_ms) {\n        interval_ms = timeout_ms;\n    }\n    m_udp = new WIZnet_UDPSocket;\n    m_udp->init();\n    m_udp->set_blocking(false);\n    eth->reg_wr<uint32_t>(SIPR, 0x00000000); // local ip \"0.0.0.0\"\n    m_udp->bind(68); // local port\n    m_server.set_address(\"255.255.255.255\", 67); // DHCP broadcast\n    exit_flag = false;\n    int err = 0;\n    int seq = 0;\n    int send_size;\n    while(!exit_flag) {\n        switch(seq) {\n            case 0:\n                m_retry = 0;\n                seq++;\n                break;\n            case 1:\n                send_size = discover();\n                m_udp->sendTo(m_server, (char*)m_buf, send_size);\n                m_interval.reset();\n                m_interval.start();\n                seq++;\n                break;\n            case 2:\n                callback();\n                if (m_interval.read_ms() > interval_ms) {\n                    DBG(\"m_retry: %d\\n\", m_retry);\n                    if (++m_retry >= (timeout_ms/interval_ms)) {\n                        err = -1;\n                        exit_flag = true;\n                    }\n                    seq--;\n                }\n                break;\n        }\n    }\n    DBG(\"m_retry: %d, m_interval: %d\\n\", m_retry, m_interval.read_ms());\n    delete m_udp;\n    return err;\n}\n\nDHCPClient::DHCPClient() {\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/DHCPClient.h",
    "content": "// DHCPClient.h 2013/4/10\n#ifndef DHCPCLIENT_H\n#define DHCPCLIENT_H\n#include \"eth_arch.h\"\n#include \"WIZnet_UDPSocket.h\"\n\n#define DHCP_OFFSET_OP 0\n#define DHCP_OFFSET_XID 4\n#define DHCP_OFFSET_YIADDR 16\n#define DHCP_OFFSET_SIADDR 20\n#define DHCP_OFFSET_OPTIONS 240\n#define DHCP_MAX_PACKET_SIZE 600\n\n// DHCP Message Type\n#define DHCPDISCOVER 1\n#define DHCPOFFER    2\n#define DHCPREQUEST  3\n#define DHCPDECLINE  4\n#define DHCPACK      5\n#define DHCPNAK      6\n#define DHCPRELEASE  7\n#define DHCPINFORM   8\n\nclass DHCPClient {\npublic:\n    DHCPClient();\n    int setup(int timeout_ms = 15*1000);\n    uint8_t chaddr[6]; // MAC\n    uint8_t yiaddr[4]; // IP\n    uint8_t dnsaddr[4]; // DNS\n    uint8_t gateway[4];\n    uint8_t netmask[4];\n    uint8_t siaddr[4];\nprivate:\n    int discover();\n    int request();\n    int offer(uint8_t buf[], int size);\n    void add_buf(uint8_t* buf, int len);\n    void fill_buf(int len, uint8_t data = 0x00);\n    void add_buf(uint8_t c);\n    void add_option(uint8_t code, uint8_t* buf = NULL, int len = 0);\n    bool verify(uint8_t buf[], int len);\n    void callback();\n    WIZnet_UDPSocket* m_udp;\n    Endpoint m_server;\n    uint8_t xid[4];\n    bool exit_flag;\n    Timer m_interval;\n    int m_retry;\n    uint8_t m_buf[DHCP_MAX_PACKET_SIZE];\n    int m_pos;\n    WIZnet_Chip* eth;\n};\n#endif //DHCPCLIENT_H\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/DNSClient.cpp",
    "content": "// DNSClient.cpp 2013/8/27\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n#include \"DNSClient.h\"\n#include \"WIZnet_UDPSocket.h\"\n#include \"dnsname.h\"\n#include \"eth_arch.h\"\n\n#define DBG_DNS 0\n\n#if DBG_DNS\n#define DBG2(...) do{debug(\"[DNS]%p %d %s \", this,__LINE__,__PRETTY_FUNCTION__); debug(__VA_ARGS__); } while(0);\n#else\n#define DBG2(...) while(0);\n#endif\n\nDNSClient::DNSClient(const char* hostname) : m_state(MYNETDNS_START), m_udp(NULL) {\n    m_hostname = hostname;\n}\n\nDNSClient::DNSClient(Endpoint* pHost) : m_state(MYNETDNS_START), m_udp(NULL) {\n}\n\nDNSClient::~DNSClient() {\n    if (m_udp) {\n        delete m_udp;\n    }\n}\n\nvoid DNSClient::callback()\n{\n    uint8_t buf[512];\n    Endpoint host;\n    int len = m_udp->receiveFrom(host, (char*)buf, sizeof(buf));\n    if (len < 0) {\n        return;\n    }\n    if (memcmp(buf+0, m_id, 2) != 0) { //verify\n        return;\n    }\n    int rcode = response(buf, len);\n    if (rcode == 0) {\n        m_state = MYNETDNS_OK;\n    } else {\n        m_state = MYNETDNS_NOTFOUND;\n    }\n}\n\nint DNSClient::response(uint8_t buf[], int size) {\n    int rcode = buf[3] & 0x0f;\n    if (rcode != 0) {\n        return rcode;\n    }\n    int qdcount = buf[4]<<8|buf[5];\n    int ancount = buf[6]<<8|buf[7];\n    int pos = 12;\n    while(qdcount-- > 0) {\n        dnsname qname(buf);\n        pos = qname.decode(pos); // qname\n        pos += 4; // qtype qclass\n    }\n    while(ancount-- > 0) {\n        dnsname name(buf);\n        pos = name.decode(pos); // name\n        int type = buf[pos]<<8|buf[pos+1];\n        pos += 8; // type class TTL  \n        int rdlength = buf[pos]<<8|buf[pos+1]; pos += 2;\n        int rdata_pos = pos;\n        pos += rdlength;\n        if (type == 1) { // A record\n            ip = (buf[rdata_pos]<<24) | (buf[rdata_pos+1]<<16) | (buf[rdata_pos+2]<<8) | buf[rdata_pos+3];\n        }\n#if DBG_DNS\n        printf(\"%s\", name.str.c_str());\n        if (type == 1) {\n            printf(\" A %d.%d.%d.%d\\n\", \n                buf[rdata_pos],buf[rdata_pos+1],buf[rdata_pos+2],buf[rdata_pos+3]);\n        } else if (type == 5) {\n            dnsname rdname(buf);\n            rdname.decode(rdata_pos);\n            printf(\" CNAME %s\\n\", rdname.str.c_str());\n        } else {\n            printf(\" TYPE:%d\", type);\n            printfBytes(\" RDATA:\", &buf[rdata_pos], rdlength);\n        }\n#endif\n    }\n    return rcode;\n}\n\nint DNSClient::query(uint8_t buf[], int size, const char* hostname) {\n    const uint8_t header[] = {\n        0x00,0x00,0x01,0x00, // id=0x0000 QR=0 rd=1 opcode=0 rcode=0\n        0x00,0x01,0x00,0x00, // qdcount=1 ancount=0\n        0x00,0x00,0x00,0x00};// nscount=0 arcount=0 \n    const uint8_t tail[] = {0x00,0x01,0x00,0x01}; // qtype=A qclass=IN\n    memcpy(buf, header, sizeof(header));\n    int t = rand();\n    m_id[0] = t>>8;\n    m_id[1] = t;\n    memcpy(buf, m_id, 2); \n    dnsname qname(buf);\n    int pos = qname.encode(sizeof(header), (char*)hostname);\n    memcpy(buf+pos, tail, sizeof(tail));\n    pos += sizeof(tail);\n    return pos;\n}\n\nvoid DNSClient::resolve(const char* hostname) {\n    if (m_udp == NULL) {\n        m_udp = new WIZnet_UDPSocket;\n    }\n    m_udp->init();\n    m_udp->set_blocking(false);\n    Endpoint server;\n    server.set_address(\"8.8.8.8\", 53); // DNS\n    m_udp->bind(rand()&0x7fff);\n    uint8_t buf[256];                \n    int size = query(buf, sizeof(buf), hostname);\n#if DBG_DNS\n    printf(\"hostname:[%s]\\n\", hostname);\n    printHex(buf, size);\n#endif\n    m_udp->sendTo(server, (char*)buf, size);\n    m_interval.reset();\n    m_interval.start();\n}\n\nvoid DNSClient::poll() {\n#if DBG_DNS\n    printf(\"%p m_state: %d, m_udp: %p\\n\", this, m_state, m_udp);\n    wait_ms(400);\n#endif\n    switch(m_state) {\n        case MYNETDNS_START:\n            m_retry = 0;\n            resolve(m_hostname);\n            m_state = MYNETDNS_PROCESSING;\n            break;\n        case MYNETDNS_PROCESSING: \n            break;\n        case MYNETDNS_NOTFOUND: \n            break;\n        case MYNETDNS_ERROR: \n            break;\n        case MYNETDNS_OK:\n            DBG2(\"m_retry=%d, m_interval=%d\\n\", m_retry, m_interval.read_ms());\n            break;\n    }\n    if (m_interval.read_ms() > 1000) {\n        m_interval.stop();\n        DBG2(\"timeout m_retry=%d\\n\", m_retry);\n        if (++m_retry >= 2) {\n            m_state = MYNETDNS_ERROR;\n        } else {\n            resolve(m_hostname);\n            m_state = MYNETDNS_PROCESSING;\n        }\n    }\n}\n\nbool DNSClient::lookup(const char* hostname) {\n    m_hostname = hostname;\n    m_state = MYNETDNS_START;\n    while(1) {\n        poll();\n        callback();\n        if (m_state != MYNETDNS_PROCESSING) {\n            break;\n        } \n    }\n    return m_state == MYNETDNS_OK;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/DNSClient.h",
    "content": "// DNSClient.h 2013/4/5\n#pragma once\n\n#include \"WIZnet_UDPSocket.h\"\n \nclass DNSClient {\npublic:\n    DNSClient(const char* hostname = NULL);\n    DNSClient(Endpoint* pHost);\n    virtual ~DNSClient();\n    bool lookup(const char* hostname = NULL);\n    uint32_t ip;\nprotected:\n    void poll();\n    void callback();\n    int response(uint8_t buf[], int size);\n    int query(uint8_t buf[], int size, const char* hostname);\n    void resolve(const char* hostname);\n    uint8_t m_id[2];\n    Timer m_interval;\n    int m_retry;\n    const char* m_hostname;\nprivate:\n    enum MyNetDnsState\n    {\n        MYNETDNS_START,\n        MYNETDNS_PROCESSING, //Req has not completed\n        MYNETDNS_NOTFOUND,\n        MYNETDNS_ERROR,\n        MYNETDNS_OK\n    };\n    MyNetDnsState m_state;\n    WIZnet_UDPSocket *m_udp;\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/Endpoint.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#include \"WIZnet_Socket.h\"\n#include \"Endpoint.h\"\n\nEndpoint::Endpoint()\n{\n    //printf(\"reset_address\\r\\n\");\n    reset_address();\n}\nEndpoint::~Endpoint() {}\n\nvoid Endpoint::reset_address(void)\n{\n    _ipAddress[0] = '\\0';\n    _port = 0;\n}\n\nint Endpoint::set_address(const char* host, const int port)\n{\n    //Resolve DNS address or populate hard-coded IP address\n    WIZnet_Chip* eth = WIZnet_Chip::getInstance();\n    if (eth == NULL) {\n        error(\"Endpoint constructor error: no WIZnet chip instance available!\\r\\n\");\n        return -1;\n    }\n    uint32_t addr;\n    if (!eth->gethostbyname(host, &addr)) {\n        error(\"DNS error : Cannot get url from DNS server\\r\\n\");\n        return -1;\n    }\n    snprintf(_ipAddress, sizeof(_ipAddress), \"%d.%d.%d.%d\", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);\n    _port = port;\n    return 0;\n}\n\nchar* Endpoint::get_address()\n{\n    return _ipAddress;\n}\n\nint   Endpoint::get_port()\n{\n    return _port;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/Endpoint.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#ifndef ENDPOINT_H\n#define ENDPOINT_H\n\n#include \"eth_arch.h\"\n\nclass WIZnet_UDPSocket;\n\n/**\nIP Endpoint (address, port)\n*/\nclass Endpoint {\n    friend class WIZnet_UDPSocket;\n\npublic:\n    /** IP Endpoint (address, port)\n     */\n    Endpoint(void);\n    \n    ~Endpoint(void);\n    \n    /** Reset the address of this endpoint\n     */\n    void reset_address(void);\n    \n    /** Set the address of this endpoint\n    \\param host The endpoint address (it can either be an IP Address or a hostname that will be resolved with DNS).\n    \\param port The endpoint port\n    \\return 0 on success, -1 on failure (when an hostname cannot be resolved by DNS).\n     */\n    int  set_address(const char* host, const int port);\n    \n    /** Get the IP address of this endpoint\n    \\return The IP address of this endpoint.\n     */\n    char* get_address(void);\n    \n    /** Get the port of this endpoint\n    \\return The port of this endpoint\n     */\n    int get_port(void);\n\nprotected:\n    char _ipAddress[16];\n    int _port;\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/TCPSocketConnection.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"TCPSocketConnection.h\"\n#include <cstring>\n\nusing std::memset;\nusing std::memcpy;\n\n// not a big code.\n// refer from EthernetInterface by mbed official driver\nTCPSocketConnection::TCPSocketConnection() :\n    _is_connected(false)\n{\n}\n\nint TCPSocketConnection::connect(const char* host, const int port)\n{\n    if (_sock_fd < 0) {\n        _sock_fd = eth->new_socket();\n        if (_sock_fd < 0) {\n            return -1;\n        }\n    }\n    if (set_address(host, port) != 0) {\n        return -1;\n    }\n    if (!eth->connect(_sock_fd, get_address(), port)) {\n        return -1;\n    }\n    set_blocking(false);\n    // add code refer from EthernetInterface.\n    _is_connected = true;\n\n    return 0;\n}\n\nbool TCPSocketConnection::is_connected(void)\n{\n    // force update recent state.\n    _is_connected = eth->is_connected(_sock_fd);\n    return _is_connected;\n}\n\nint TCPSocketConnection::send(char* data, int length)\n{\n    if((_sock_fd<0) || !(eth->is_connected(_sock_fd)))\n        return -1;\n\n    int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout);\n    if (size < 0) \n        return -1;\n\n    if (size > length) \n        size = length;\n\n    return eth->send(_sock_fd, data, size);\n}\n\n// -1 if unsuccessful, else number of bytes written\nint TCPSocketConnection::send_all(char* data, int length)\n{\n    int writtenLen = 0;\n\n    if(_sock_fd<0)\n        return -1;\n\n    while (writtenLen < length) {\n\n        if(!(eth->is_connected(_sock_fd)))\n            return -1;\n\n        int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout);\n        if (size < 0) {\n            return -1;\n        }\n        if (size > (length-writtenLen)) {\n            size = (length-writtenLen);\n        }\n        int ret = eth->send(_sock_fd, data + writtenLen, size);\n        if (ret < 0) {\n            return -1;\n        }\n        writtenLen += ret;\n    }\n    return writtenLen;\n}\n\n// -1 if unsuccessful, else number of bytes received\nint TCPSocketConnection::receive(char* data, int length)\n{\n    if((_sock_fd<0) || !(eth->is_connected(_sock_fd)))\n        return -1;\n\n    int size = eth->wait_readable(_sock_fd, _blocking ? -1 : _timeout);\n    if (size < 0) {\n        return -1;\n    }\n    if (size > length) {\n        size = length;\n    }\n    return eth->recv(_sock_fd, data, size);\n}\n\n// -1 if unsuccessful, else number of bytes received\nint TCPSocketConnection::receive_all(char* data, int length)\n{\n    if(_sock_fd<0)\n        return -1;\n\n    int readLen = 0;\n    while (readLen < length) {\n\n        if(!(eth->is_connected(_sock_fd)))\n            return -1;\n\n        int size = eth->wait_readable(_sock_fd, _blocking ? -1 :_timeout);\n        if (size <= 0) {\n            break;\n        }\n        if (size > (length - readLen)) {\n            size = length - readLen;\n        }\n        int ret = eth->recv(_sock_fd, data + readLen, size);\n        if (ret < 0) {\n            return -1;\n        }\n        readLen += ret;\n    }\n    return readLen;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/TCPSocketConnection.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef TCPSOCKETCONNECTION_H\n#define TCPSOCKETCONNECTION_H\n\n#include \"WIZnet_Socket.h\"\n#include \"Endpoint.h\"\n\n/**\nTCP socket connection\n*/\nclass TCPSocketConnection: public WIZnet_Socket, public Endpoint {\n    friend class TCPSocketServer;\n    \npublic:\n    /** TCP socket connection\n    */\n    TCPSocketConnection();\n    \n    /** Connects this TCP socket to the server\n    \\param host The host to connect to. It can either be an IP Address or a hostname that will be resolved with DNS.\n    \\param port The host's port to connect to.\n    \\return 0 on success, -1 on failure.\n    */\n    int connect(const char* host, const int port);\n    \n    /** Check if the socket is connected\n    \\return true if connected, false otherwise.\n    */\n    bool is_connected(void);\n    \n    /** Send data to the remote host.\n    \\param data The buffer to send to the host.\n    \\param length The length of the buffer to send.\n    \\return the number of written bytes on success (>=0) or -1 on failure\n     */\n    int send(char* data, int length);\n    \n    /** Send all the data to the remote host.\n    \\param data The buffer to send to the host.\n    \\param length The length of the buffer to send.\n    \\return the number of written bytes on success (>=0) or -1 on failure\n    */\n    int send_all(char* data, int length);\n    \n    /** Receive data from the remote host.\n    \\param data The buffer in which to store the data received from the host.\n    \\param length The maximum length of the buffer.\n    \\return the number of received bytes on success (>=0) or -1 on failure\n     */\n    int receive(char* data, int length);\n    \n    /** Receive all the data from the remote host.\n    \\param data The buffer in which to store the data received from the host.\n    \\param length The maximum length of the buffer.\n    \\return the number of received bytes on success (>=0) or -1 on failure\n    */\n    int receive_all(char* data, int length);\n\nprivate:\n    bool _is_connected;\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/TCPSocketServer.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"TCPSocketServer.h\"\n\nTCPSocketServer::TCPSocketServer() {}\n\n// Server initialization\nint TCPSocketServer::bind(int port)\n{\n   // set the listen_port for next connection. \n   listen_port = port;\n    if (_sock_fd < 0) {\n        _sock_fd = eth->new_socket();\n        if (_sock_fd < 0) {\n            return -1;\n        }\n    }\n    // set TCP protocol\n    eth->setProtocol(_sock_fd, WIZnet_Chip::TCP);\n    // set local port\n    eth->sreg<uint16_t>(_sock_fd, Sn_PORT, port);\n    // connect the network\n    eth->scmd(_sock_fd, WIZnet_Chip::OPEN);\n    return 0;\n}\n\nint TCPSocketServer::listen(int backlog)\n{\n    if (_sock_fd < 0) {\n        return -1;\n    }\n    if (backlog != 1) {\n        return -1;\n    }\n    eth->scmd(_sock_fd, WIZnet_Chip::LISTEN);\n    return 0;\n}\n\n\nint TCPSocketServer::accept(TCPSocketConnection& connection)\n{\n    if (_sock_fd < 0) {\n        return -1;\n    }\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        if (t.read_ms() > _timeout && _blocking == false) {\n            return -1;\n        }\n        if (eth->sreg<uint8_t>(_sock_fd, Sn_SR) == WIZnet_Chip::SOCK_ESTABLISHED) {\n            break;\n        }\n    }\n    uint32_t ip = eth->sreg<uint32_t>(_sock_fd, Sn_DIPR);\n    char host[16];\n    snprintf(host, sizeof(host), \"%d.%d.%d.%d\", (ip>>24)&0xff, (ip>>16)&0xff, (ip>>8)&0xff, ip&0xff);\n    uint16_t port = eth->sreg<uint16_t>(_sock_fd, Sn_DPORT);\n\n    // change this server socket to connection socket.\n    connection._sock_fd = _sock_fd;\n    connection._is_connected = true;\n    connection.set_address(host, port);\n\n    // and then, for the next connection, server socket should be assigned new one.\n    _sock_fd = -1; // want to assign new available _sock_fd.\n    if(bind(listen_port) < 0) {\n        // modified by Patrick Pollet\n        error(\"No more socket for listening, bind error\");\n        return -1;\n    } else {\n        //return -1;\n        if(listen(1) < 0) {\n            // modified by Patrick Pollet\n            error(\"No more socket for listening, listen error\");\n            return -1;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/TCPSocketServer.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#ifndef TCPSOCKETSERVER_H\n#define TCPSOCKETSERVER_H\n\n#include \"WIZnet_Socket.h\"\n#include \"TCPSocketConnection.h\"\n\n/** TCP Server.\n  */\nclass TCPSocketServer : public WIZnet_Socket\n{\npublic:\n    /** Instantiate a TCP Server.\n    */\n    TCPSocketServer();\n\n    /** Bind a socket to a specific port.\n    \\param port The port to listen for incoming connections on.\n    \\return 0 on success, -1 on failure.\n    */\n    int bind(int port);\n\n    /** Start listening for incoming connections.\n    \\param backlog number of pending connections that can be queued up at any\n                   one time [Default: 1].\n    \\return 0 on success, -1 on failure.\n    */\n    int listen(int backlog=1);\n\n    /** Accept a new connection.\n    \\param connection A TCPSocketConnection instance that will handle the incoming connection.\n    \\return 0 on success, -1 on failure.\n    */\n    int accept(TCPSocketConnection& connection);\n\nprivate :\n    int listen_port;\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/WIZnet_Socket.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"WIZnet_Socket.h\"\n\nWIZnet_Socket::WIZnet_Socket() : _sock_fd(-1),_blocking(true), _timeout(1500)\n{\n    eth = WIZnet_Chip::getInstance();\n    if (eth == NULL) {\n        error(\"Socket constructor error: no W7500 instance available!\\r\\n\");\n    }\n}\n\nvoid WIZnet_Socket::set_blocking(bool blocking, unsigned int timeout)\n{\n    _blocking = blocking;\n    _timeout = timeout;\n}\n\nint WIZnet_Socket::close()\n{\n    // add this code refer from EthernetInterface.\n    // update by Patrick Pollet\n    int res;\n    res = eth->close(_sock_fd);\n    _sock_fd = -1;\n    return (res)? 0: -1;\n}\n\nWIZnet_Socket::~WIZnet_Socket()\n{\n    close(); //Don't want to leak\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/WIZnet_Socket.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#ifndef WIZnet_SOCKET_H_\n#define WIZnet_SOCKET_H_\n\n#include \"eth_arch.h\"\n\n#define htons(x) __REV16(x)\n#define ntohs(x) __REV16(x)\n#define htonl(x) __REV(x)\n#define ntohl(x) __REV(x)\n\n/** Socket file descriptor and select wrapper\n  */\nclass WIZnet_Socket {\npublic:\n    /** Socket\n     */\n    WIZnet_Socket();\n    \n    /** Set blocking or non-blocking mode of the socket and a timeout on\n        blocking socket operations\n    \\param blocking  true for blocking mode, false for non-blocking mode.\n    \\param timeout   timeout in ms [Default: (1500)ms].\n    */\n    //void set_blocking(bool blocking, unsigned int timeout=1500);\n    void set_blocking(bool blocking, unsigned int timeout=1);\n    \n    /** Close the socket file descriptor\n     */\n    int close();\n    \n    ~WIZnet_Socket();\n    \nprotected:\n    int _sock_fd;\n    bool _blocking;\n    int _timeout;\n\n    WIZnet_Chip* eth;\n};\n\n\n#endif /* SOCKET_H_ */\n\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/WIZnet_UDPSocket.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"WIZnet_UDPSocket.h\"\n\nstatic int udp_local_port;\n\nWIZnet_UDPSocket::WIZnet_UDPSocket()\n{\n}\n// After init function, bind() should be called.\nint WIZnet_UDPSocket::init(void)\n{\n    if (_sock_fd < 0) {\n        _sock_fd = eth->new_socket();\n    }\n    if (eth->setProtocol(_sock_fd, WIZnet_Chip::UDP) == false) return -1;\n    return 0;\n}\n\n// Server initialization\nint WIZnet_UDPSocket::bind(int port)\n{\n    if (_sock_fd < 0) {\n        _sock_fd = eth->new_socket();\n        if (_sock_fd < 0) {\n            return -1;\n        }\n    }\n    // set local port\n    if (port != 0) {\n        eth->sreg<uint16_t>(_sock_fd, Sn_PORT, port);\n    } else {\n        udp_local_port++;\n        eth->sreg<uint16_t>(_sock_fd, Sn_PORT, udp_local_port);\n    }\n    // set udp protocol\n    eth->setProtocol(_sock_fd, WIZnet_Chip::UDP);\n    eth->scmd(_sock_fd, WIZnet_Chip::OPEN);\n    return 0;\n}\n\n// -1 if unsuccessful, else number of bytes written\nint WIZnet_UDPSocket::sendTo(Endpoint &remote, char *packet, int length)\n{\n    int size = eth->wait_writeable(_sock_fd, _blocking ? -1 : _timeout, length-1);\n    if (size < 0) {\n        return -1;\n    }\n    confEndpoint(remote);\n    int ret = eth->send(_sock_fd, packet, length);\n    return ret;\n}\n\n// -1 if unsuccessful, else number of bytes received\nint WIZnet_UDPSocket::receiveFrom(Endpoint &remote, char *buffer, int length)\n{\n    uint8_t info[8];\n    int size = eth->wait_readable(_sock_fd, _blocking ? -1 : _timeout, sizeof(info));\n    if (size < 0) {\n        return -1;\n    }\n    eth->recv(_sock_fd, (char*)info, sizeof(info));\n    readEndpoint(remote, info);\n    int udp_size = info[6]<<8|info[7];\n    //TEST_ASSERT(udp_size <= (size-sizeof(info)));\n    if (udp_size > (size-sizeof(info))) {\n        return -1;\n    }\n\n    /* Perform Length check here to prevent buffer overrun */\n    /* fixed by Sean Newton (https://developer.mbed.org/users/SeanNewton/) */\n    if (udp_size > length) {\n        //printf(\"udp_size: %d\\n\",udp_size);\n        return -1;\n    }\n    return eth->recv(_sock_fd, buffer, udp_size);\n}\n\nvoid WIZnet_UDPSocket::confEndpoint(Endpoint & ep)\n{\n    char * host = ep.get_address();\n    // set remote host\n    eth->sreg_ip(_sock_fd, Sn_DIPR, host);\n    // set remote port\n    eth->sreg<uint16_t>(_sock_fd, Sn_DPORT, ep.get_port());\n}\n\nvoid WIZnet_UDPSocket::readEndpoint(Endpoint & ep, uint8_t info[])\n{\n    char addr[17];\n    snprintf(addr, sizeof(addr), \"%d.%d.%d.%d\", info[0], info[1], info[2], info[3]);\n    uint16_t port = info[4]<<8|info[5];\n    ep.set_address(addr, port);\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/WIZnet_UDPSocket.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef WIZnet_UDPSOCKET_H\n#define WIZnet_UDPSOCKET_H\n\n#include \"Endpoint.h\"\n#include \"WIZnet_Socket.h\"\n\n/**\nUDP Socket\n*/\nclass WIZnet_UDPSocket: public WIZnet_Socket {\n\npublic:\n    /** Instantiate an UDP Socket.\n    */\n    WIZnet_UDPSocket();\n    \n    /** Init the UDP Client Socket without binding it to any specific port\n    \\return 0 on success, -1 on failure.\n    */\n    int init(void);\n    \n    /** Bind a UDP Server Socket to a specific port\n    \\param port The port to listen for incoming connections on\n    \\return 0 on success, -1 on failure.\n    */\n    int bind(int port = -1);\n    \n    /** Send a packet to a remote endpoint\n    \\param remote   The remote endpoint\n    \\param packet   The packet to be sent\n    \\param length   The length of the packet to be sent\n    \\return the number of written bytes on success (>=0) or -1 on failure\n    */\n    int sendTo(Endpoint &remote, char *packet, int length);\n    \n    /** Receive a packet from a remote endpoint\n    \\param remote   The remote endpoint\n    \\param buffer   The buffer for storing the incoming packet data. If a packet\n           is too long to fit in the supplied buffer, excess bytes are discarded\n    \\param length   The length of the buffer\n    \\return the number of received bytes on success (>=0) or -1 on failure\n    */\n    int receiveFrom(Endpoint &remote, char *buffer, int length);\n    \nprivate:\n    void confEndpoint(Endpoint & ep);\n    void readEndpoint(Endpoint & ep, uint8_t info[]);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/dnsname.h",
    "content": "// dnsname.h 2013/8/27\n#pragma once\n//#include <string>\n#include \"pico_string.h\"\nclass dnsname {\npublic:\n    uint8_t *buf;\n    pico_string str;\n    dnsname(uint8_t *s) {\n        buf = s;\n    }\n    int decode(int pos) {\n        while(1) {\n            int len = buf[pos++];\n            if (len == 0x00) {\n                break;\n            }\n            if ((len&0xc0) == 0xc0) { //compress\n                int offset = (len&0x3f)<<8|buf[pos];\n                decode(offset);\n                return pos+1;\n            }\n            if (!str.empty()) {\n                str.append(\".\");\n            }\n            str.append((const char*)(buf+pos), len);\n            pos += len;\n        }\n        return pos;\n    }\n\n    int encode(int pos, char* s) {\n        while(*s) {  \n            char *f = strchr(s, '.');\n            if (f == NULL) {\n                int len = strlen(s);\n                buf[pos++] = len;\n                memcpy(buf+pos, s, len);\n                pos += len;\n                break;\n            }\n            int len = f - s;\n            buf[pos++] = len;\n            memcpy(buf+pos, s, len);\n            s = f+1;\n            pos += len;\n        }\n        buf[pos++] = 0x00;\n        return pos;\n    }\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/Socket/pico_string.h",
    "content": "// pico_string.h 2013/8/27\n#pragma once\nclass pico_string {\npublic:\n    pico_string(){\n        _len = 0;\n        _buf = (char*)malloc(1);\n        if (_buf) {\n            _buf[0] = '\\0';\n        }\n    }\n    ~pico_string() {\n        if (_buf) {\n            free(_buf);\n        }\n    }\n    bool empty() {\n        return _len == 0;\n    }\n    void append(const char* s, int len) {\n        if (_buf == NULL) {\n            return;\n        }\n        char* p = (char*)malloc(_len+len+1);\n        if (p == NULL) {\n            return;\n        }\n        memcpy(p, _buf, _len);\n        memcpy(p+_len, s, len);\n        p[_len+len] = '\\0';\n        free(_buf);\n        _buf = p;\n    }\n    void append(const char* s) {\n        append(s, strlen(s));\n    }\n    char* c_str() {\n        if (_buf) {\n            return _buf;\n        }\n        return \"\";\n    }\nprivate:\n    char* _buf;\n    int _len;\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/WIZnetInterface.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#include \"WIZnetInterface.h\"\n#include \"DHCPClient.h\"\n\n#if (not defined TARGET_WIZwiki_W7500) && (not defined TARGET_WIZwiki_W7500P) && (not defined TARGET_WIZwiki_W7500ECO)\nWIZnetInterface::WIZnetInterface(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset) :\n        WIZnet_Chip(mosi, miso, sclk, cs, reset)\n{\n    ip_set = false;\n}\n\nWIZnetInterface::WIZnetInterface(SPI* spi, PinName cs, PinName reset) :\n        WIZnet_Chip(spi, cs, reset)\n{\n    ip_set = false;\n}\n#endif\n\nint WIZnetInterface::init()\n{\n    dhcp = true;\n    reset();\n    \n    return 0;\n}\n\nint WIZnetInterface::init(uint8_t * mac)\n{\n    dhcp = true;\n    //\n    for (int i =0; i < 6; i++) this->mac[i] = mac[i];\n    //\n    reset();\n    \n    return 0;\n}\n\nint WIZnetInterface::init(uint8_t * mac, const char* ip, const char* mask, const char* gateway)\n{\n    dhcp = false;\n    //\n    for (int i =0; i < 6; i++) this->mac[i] = mac[i];\n    //\n    this->ip = str_to_ip(ip);\n    strcpy(ip_string, ip);\n    ip_set = true;\n    this->netmask = str_to_ip(mask);\n    this->gateway = str_to_ip(gateway);\n    reset();\n\n    // @Jul. 8. 2014 add code. should be called to write chip.\n    setmac();\n    setip();\n    \n    return 0;\n}\n\n// Connect Bring the interface up, start DHCP if needed.\nint WIZnetInterface::connect()\n{\n    if (dhcp) {\n        int r = IPrenew();\n        if (r < 0) {\n            return r;\n        }\n    }\n    \n    if (WIZnet_Chip::setip() == false) return -1;\n    return 0;\n}\n\n// Disconnect Bring the interface down.\nint WIZnetInterface::disconnect()\n{\n    //if (WIZnet_Chip::disconnect() == false) return -1;\n    return 0;\n}\n\n\nchar* WIZnetInterface::getIPAddress()\n{\n    uint32_t ip = reg_rd<uint32_t>(SIPR);\n    snprintf(ip_string, sizeof(ip_string), \"%d.%d.%d.%d\", \n                (uint8_t)((ip>>24)&0xff), \n                (uint8_t)((ip>>16)&0xff), \n                (uint8_t)((ip>>8)&0xff), \n                (uint8_t)(ip&0xff));\n    return ip_string;\n}\n\nchar* WIZnetInterface::getNetworkMask()\n{\n    uint32_t ip = reg_rd<uint32_t>(SUBR);\n    snprintf(mask_string, sizeof(mask_string), \"%d.%d.%d.%d\", \n                (uint8_t)((ip>>24)&0xff), \n                (uint8_t)((ip>>16)&0xff), \n                (uint8_t)((ip>>8)&0xff), \n                (uint8_t)(ip&0xff));\n    return mask_string;\n}\n\nchar* WIZnetInterface::getGateway()\n{\n    uint32_t ip = reg_rd<uint32_t>(GAR);\n    snprintf(gw_string, sizeof(gw_string), \"%d.%d.%d.%d\", \n                (uint8_t)((ip>>24)&0xff), \n                (uint8_t)((ip>>16)&0xff), \n                (uint8_t)((ip>>8)&0xff), \n                (uint8_t)(ip&0xff));\n    return gw_string;\n}\n\nchar* WIZnetInterface::getMACAddress()\n{\n    uint8_t mac[6];\n    reg_rd_mac(SHAR, mac);\n    snprintf(mac_string, sizeof(mac_string), \"%02X:%02X:%02X:%02X:%02X:%02X\", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);\n    //ethernet_address(mac_string);\n    return mac_string; \n    \n}\n\nint WIZnetInterface::IPrenew(int timeout_ms)\n{\n    DHCPClient dhcp;\n    int err = dhcp.setup(timeout_ms);\n    if (err == (-1)) {\n        return -1;\n    }\n//    printf(\"Connected, IP: %d.%d.%d.%d\\n\", dhcp.yiaddr[0], dhcp.yiaddr[1], dhcp.yiaddr[2], dhcp.yiaddr[3]);\n    ip      = (dhcp.yiaddr[0] <<24) | (dhcp.yiaddr[1] <<16) | (dhcp.yiaddr[2] <<8) | dhcp.yiaddr[3];\n    gateway = (dhcp.gateway[0]<<24) | (dhcp.gateway[1]<<16) | (dhcp.gateway[2]<<8) | dhcp.gateway[3];\n    netmask = (dhcp.netmask[0]<<24) | (dhcp.netmask[1]<<16) | (dhcp.netmask[2]<<8) | dhcp.netmask[3];\n    dnsaddr = (dhcp.dnsaddr[0]<<24) | (dhcp.dnsaddr[1]<<16) | (dhcp.dnsaddr[2]<<8) | dhcp.dnsaddr[3];\n    return 0;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/WIZnetInterface.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#pragma once\n#include \"eth_arch.h\"\n /** Interface using Wiznet chip to connect to an IP-based network\n *\n */\nclass WIZnetInterface: public WIZnet_Chip {\npublic:\n\n#if (not defined TARGET_WIZwiki_W7500) && (not defined TARGET_WIZwiki_W7500P) && (not defined TARGET_WIZwiki_W7500ECO)\n\n    /**\n    * Constructor\n    *\n    * \\param mosi mbed pin to use for SPI\n    * \\param miso mbed pin to use for SPI\n    * \\param sclk mbed pin to use for SPI\n    * \\param cs chip select of the WIZnet_Chip\n    * \\param reset reset pin of the WIZnet_Chip\n    */\n    WIZnetInterface(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);\n    WIZnetInterface(SPI* spi, PinName cs, PinName reset);\n#endif\n\n  /** Initialize the interface with DHCP.\n  * Initialize the interface and configure it to use DHCP (no connection at this point).\n  * \\return 0 on success, a negative number on failure\n  */\n  int init();              //With DHCP\n  int init(uint8_t * mac); //With DHCP\n\n  /** Initialize the interface with a static IP address.\n  * Initialize the interface and configure it with the following static configuration (no connection at this point).\n  * \\param ip the IP address to use\n  * \\param mask the IP address mask\n  * \\param gateway the gateway to use\n  * \\return 0 on success, a negative number on failure\n  */\n  int init(uint8_t * mac, const char* ip, const char* mask, const char* gateway);\n\n  /** Connect\n  * Bring the interface up, start DHCP if needed.\n  * \\return 0 on success, a negative number on failure\n  */\n  int connect();\n  \n  /** Disconnect\n  * Bring the interface down\n  * \\return 0 on success, a negative number on failure\n  */\n  int disconnect();\n  \n  /** Get IP address & MAC address\n  *\n  * @ returns ip address\n  */\n  char* getIPAddress();\n  char* getNetworkMask();\n  char* getGateway();\n  char* getMACAddress();\n\n  int IPrenew(int timeout_ms = 15*1000);\n    \nprivate:\n    char ip_string[20];\n    char mask_string[20];\n    char gw_string[20];\n    char mac_string[20];\n    bool ip_set;\n};\n\n#include \"TCPSocketConnection.h\"\n#include \"TCPSocketServer.h\"\n#include \"WIZnet_UDPSocket.h\"\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/arch/ext/W5500.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#include \"eth_arch.h\"\n#if (not defined TARGET_WIZwiki_W7500) && (not defined TARGET_WIZwiki_W7500P) && (not defined TARGET_WIZwiki_W7500ECO)\n\n\n\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n#include \"DNSClient.h\"\n\n\n//Debug is disabled by default\n#if 0\n#define DBG(...) do{debug(\"%p %d %s \", this,__LINE__,__PRETTY_FUNCTION__); debug(__VA_ARGS__); } while(0);\n//#define DBG(x, ...) debug(\"[W5500:DBG]\"x\"\\r\\n\", ##__VA_ARGS__);\n#define WARN(x, ...) debug(\"[W5500:WARN]\"x\"\\r\\n\", ##__VA_ARGS__);\n#define ERR(x, ...) debug(\"[W5500:ERR]\"x\"\\r\\n\", ##__VA_ARGS__);\n#else\n#define DBG(x, ...)\n#define WARN(x, ...)\n#define ERR(x, ...)\n#endif\n\n#if 1\n#define INFO(x, ...) debug(\"[W5500:INFO]\"x\"\\r\\n\", ##__VA_ARGS__);\n#else\n#define INFO(x, ...)\n#endif\n\n#define DBG_SPI 0\n\nWIZnet_Chip* WIZnet_Chip::inst;\n\nWIZnet_Chip::WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName _cs, PinName _reset):\n    cs(_cs), reset_pin(_reset)\n{\n    spi = new SPI(mosi, miso, sclk);\n    cs = 1;\n    reset_pin = 1;\n    inst = this;\n    sock_any_port = SOCK_ANY_PORT_NUM;\n}\n\nWIZnet_Chip::WIZnet_Chip(SPI* spi, PinName _cs, PinName _reset):\n    cs(_cs), reset_pin(_reset)\n{\n    this->spi = spi;\n    cs = 1;\n    reset_pin = 1;\n    inst = this;\n    sock_any_port = SOCK_ANY_PORT_NUM;\n}\n\nbool WIZnet_Chip::setmac()\n{\n\n    for (int i =0; i < 6; i++) reg_wr<uint8_t>(SHAR+i, mac[i]);\n\n    return true;\n}\n\n// Set the IP\nbool WIZnet_Chip::setip()\n{\n    reg_wr<uint32_t>(SIPR, ip);\n    reg_wr<uint32_t>(GAR, gateway);\n    reg_wr<uint32_t>(SUBR, netmask);\n    return true;\n}\n\nbool WIZnet_Chip::setProtocol(int socket, Protocol p)\n{\n    if (socket < 0) {\n        return false;\n    }\n    sreg<uint8_t>(socket, Sn_MR, p);\n    return true;\n}\n\nbool WIZnet_Chip::connect(int socket, const char * host, int port, int timeout_ms)\n{\n    if (socket < 0) {\n        return false;\n    }\n    sreg<uint8_t>(socket, Sn_MR, TCP);\n    scmd(socket, OPEN);\n    sreg_ip(socket, Sn_DIPR, host);\n    sreg<uint16_t>(socket, Sn_DPORT, port);\n    sreg<uint16_t>(socket, Sn_PORT, new_port());\n    scmd(socket, CONNECT);\n    Timer t;\n    t.reset();\n    t.start();\n    while(!is_connected(socket)) {\n        if (t.read_ms() > timeout_ms) {\n            return false;\n        }\n    }\n    return true;\n}\n\nbool WIZnet_Chip::gethostbyname(const char* host, uint32_t* ip)\n{\n    uint32_t addr = str_to_ip(host);\n    char buf[17];\n    snprintf(buf, sizeof(buf), \"%d.%d.%d.%d\", (addr>>24)&0xff, (addr>>16)&0xff, (addr>>8)&0xff, addr&0xff);\n    if (strcmp(buf, host) == 0) {\n        *ip = addr;\n        return true;\n    }\n    DNSClient client;\n    if(client.lookup(host)) {\n        *ip = client.ip;\n        return true;\n    }\n    return false;\n}\n\nbool WIZnet_Chip::disconnect()\n{\n    return true;\n}\n\nbool WIZnet_Chip::is_connected(int socket)\n{\n    /*\n        if (sreg<uint8_t>(socket, Sn_SR) == SOCK_ESTABLISHED) {\n            return true;\n        }\n    */\n    uint8_t tmpSn_SR;\n    tmpSn_SR = sreg<uint8_t>(socket, Sn_SR);\n    // packet sending is possible, when state is SOCK_CLOSE_WAIT.\n    if ((tmpSn_SR == SOCK_ESTABLISHED) || (tmpSn_SR == SOCK_CLOSE_WAIT)) {\n        return true;\n    }\n    return false;\n}\n\n// Reset the chip & set the buffer\nvoid WIZnet_Chip::reset()\n{\n#if defined(USE_WIZ550IO_MAC)\n    //read the MAC address inside the module    \n    reg_rd_mac(SHAR, mac); \n#endif\n    // hw reset\n    reset_pin = 1;\n    reset_pin = 0;\n    wait_us(500); // 500us (w5500)\n    reset_pin = 1;\n    wait_ms(400); // 400ms (w5500)\n#if defined(USE_WIZ550IO_MAC)\n    // write MAC address inside the WZTOE MAC address register\n    reg_wr_mac(SHAR, mac);\n#endif\n    // set RX and TX buffer size\n#if 0\n    for (int socket = 0; socket < MAX_SOCK_NUM; socket++) {\n        sreg<uint8_t>(socket, Sn_RXBUF_SIZE, 2);\n        sreg<uint8_t>(socket, Sn_TXBUF_SIZE, 2);\n    }\n#endif\n}\n\n\nbool WIZnet_Chip::close(int socket)\n{\n    if (socket < 0) {\n        return false;\n    }\n    // if not connected, return\n    if (sreg<uint8_t>(socket, Sn_SR) == SOCK_CLOSED) {\n        return true;\n    }\n    if (sreg<uint8_t>(socket, Sn_MR) == TCP) {\n        scmd(socket, DISCON);\n    }\n    scmd(socket, CLOSE);\n    sreg<uint8_t>(socket, Sn_IR, 0xff);\n    return true;\n}\n\nint WIZnet_Chip::wait_readable(int socket, int wait_time_ms, int req_size)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        //int size = sreg<uint16_t>(socket, Sn_RX_RSR);\n        // during the reading Sn_RX_RXR, it has the possible change of this register.\n        // so read twice and get same value then use size information.\n        int size, size2;\n        do {\n            size = sreg<uint16_t>(socket, Sn_RX_RSR);\n            size2 = sreg<uint16_t>(socket, Sn_RX_RSR);\n        } while (size != size2);\n        \n        if (size > req_size) {\n            return size;\n        }\n        break;\n        //if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n        //    break;\n        //}\n    }\n    return -1;\n}\n\nint WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        //int size = sreg<uint16_t>(socket, Sn_TX_FSR);\n        // during the reading Sn_TX_FSR, it has the possible change of this register.\n        // so read twice and get same value then use size information.\n        int size, size2;\n        do {\n            size = sreg<uint16_t>(socket, Sn_TX_FSR);\n            size2 = sreg<uint16_t>(socket, Sn_TX_FSR);\n        } while (size != size2);\n        \n        if (size > req_size) {\n            return size;\n        }\n        break;\n        //if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n        //    break;\n        //}\n    }\n    return -1;\n}\n\nint WIZnet_Chip::send(int socket, const char * str, int len)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR);\n    uint8_t cntl_byte = (0x14 + (socket << 5));\n    spi_write(ptr, cntl_byte, (uint8_t*)str, len);\n    sreg<uint16_t>(socket, Sn_TX_WR, ptr + len);\n    scmd(socket, SEND);\n    uint8_t tmp_Sn_IR;\n    while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) {\n        // @Jul.10, 2014 fix contant name, and udp sendto function.\n        switch (sreg<uint8_t>(socket, Sn_SR)) {\n            case SOCK_CLOSED :\n                close(socket);\n                return 0;\n                //break;\n            case SOCK_UDP :\n                // ARP timeout is possible.\n                if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) {\n                    sreg<uint8_t>(socket, Sn_IR, INT_TIMEOUT);\n                    return 0;\n                }\n                break;\n            default :\n                break;\n        }\n    }\n    /*\n        while ((sreg<uint8_t>(socket, Sn_IR) & INT_SEND_OK) != INT_SEND_OK) {\n            if (sreg<uint8_t>(socket, Sn_SR) == CLOSED) {\n                close(socket);\n                return 0;\n            }\n        }\n    */\n    sreg<uint8_t>(socket, Sn_IR, INT_SEND_OK);\n\n    return len;\n}\n\nint WIZnet_Chip::recv(int socket, char* buf, int len)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD);\n    uint8_t cntl_byte = (0x18 + (socket << 5));\n    spi_read(ptr, cntl_byte, (uint8_t*)buf, len);\n    sreg<uint16_t>(socket, Sn_RX_RD, ptr + len);\n    scmd(socket, RECV);\n    return len;\n}\n\nint WIZnet_Chip::new_socket()\n{\n    for(int s = 0; s < MAX_SOCK_NUM; s++) {\n        if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) {\n            return s;\n        }\n    }\n    return -1;\n}\n\nuint16_t WIZnet_Chip::new_port()\n{\n    uint16_t port = rand();\n    port |= 49152;\n    return port;\n}\n\nbool WIZnet_Chip::link(int wait_time_ms)\n{\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        int is_link = ethernet_link();\n        \n        if (is_link) {\n            return true;\n        }\n        if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n            break;\n        }\n    }\n    return 0;\n}\n\nvoid WIZnet_Chip::set_link(PHYMode phymode)\n{\n    int speed = -1;\n    int duplex = 0;\n\n    switch(phymode) {\n        case AutoNegotiate : speed = -1; duplex = 0; break;\n        case HalfDuplex10  : speed = 0;  duplex = 0; break;\n        case FullDuplex10  : speed = 0;  duplex = 1; break;\n        case HalfDuplex100 : speed = 1;  duplex = 0; break;\n        case FullDuplex100 : speed = 1;  duplex = 1; break;\n    }\n\n    ethernet_set_link(speed, duplex);\n}\n\nvoid WIZnet_Chip::scmd(int socket, Command cmd)\n{\n    sreg<uint8_t>(socket, Sn_CR, cmd);\n    while(sreg<uint8_t>(socket, Sn_CR));\n}\n\nvoid WIZnet_Chip::spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len)\n{\n    cs = 0;\n    spi->write(addr >> 8);\n    spi->write(addr & 0xff);\n    spi->write(cb);\n    for(int i = 0; i < len; i++) {\n        spi->write(buf[i]);\n    }\n    cs = 1;\n\n#if DBG_SPI \n    debug(\"[SPI]W %04x(%02x %d)\", addr, cb, len);\n    for(int i = 0; i < len; i++) {\n        debug(\" %02x\", buf[i]);\n        if (i > 16) {\n            debug(\" ...\");\n            break;\n        }\n    }\n    debug(\"\\r\\n\");\n#endif\n}\n\nvoid WIZnet_Chip::spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len)\n{\n    cs = 0;\n    spi->write(addr >> 8);\n    spi->write(addr & 0xff);\n    spi->write(cb);\n    for(int i = 0; i < len; i++) {\n        buf[i] = spi->write(0);\n    }\n    cs = 1;\n\n#if DBG_SPI\n    debug(\"[SPI]R %04x(%02x %d)\", addr, cb, len);\n    for(int i = 0; i < len; i++) {\n        debug(\" %02x\", buf[i]);\n        if (i > 16) {\n            debug(\" ...\");\n            break;\n        }\n    }\n    debug(\"\\r\\n\");\n    if ((addr&0xf0ff)==0x4026 || (addr&0xf0ff)==0x4003) {\n        wait_ms(200);\n    }\n#endif\n}\n\nuint32_t str_to_ip(const char* str)\n{\n    uint32_t ip = 0;\n    char* p = (char*)str;\n    for(int i = 0; i < 4; i++) {\n        ip |= atoi(p);\n        p = strchr(p, '.');\n        if (p == NULL) {\n            break;\n        }\n        ip <<= 8;\n        p++;\n    }\n    return ip;\n}\n\nvoid printfBytes(char* str, uint8_t* buf, int len)\n{\n    printf(\"%s %d:\", str, len);\n    for(int i = 0; i < len; i++) {\n        printf(\" %02x\", buf[i]);\n    }\n    printf(\"\\n\");\n}\n\nvoid printHex(uint8_t* buf, int len)\n{\n    for(int i = 0; i < len; i++) {\n        if ((i%16) == 0) {\n            printf(\"%p\", buf+i);\n        }\n        printf(\" %02x\", buf[i]);\n        if ((i%16) == 15) {\n            printf(\"\\n\");\n        }\n    }\n    printf(\"\\n\");\n}\n\nvoid debug_hex(uint8_t* buf, int len)\n{\n    for(int i = 0; i < len; i++) {\n        if ((i%16) == 0) {\n            debug(\"%p\", buf+i);\n        }\n        debug(\" %02x\", buf[i]);\n        if ((i%16) == 15) {\n            debug(\"\\n\");\n        }\n    }\n    debug(\"\\n\");\n}\n\nint WIZnet_Chip::ethernet_link(void) {\n    int val = getPHYCFGR();\n    return (val&0x01);\n}\n\nvoid WIZnet_Chip::ethernet_set_link(int speed, int duplex) {\n    uint32_t val=0;\n    if((speed < 0) || (speed > 1)) {\n        val = (PHYCFGR_OPMDC_ALLA)<<3; \n    } else {\n        val = (((speed&0x01)<<1)+ (duplex&0x01))<<3; \n    }\n    setPHYCFGR((uint8_t)(PHYCFGR_RST&(PHYCFGR_OPMD|val)));\n    wait(0.2);\n    setPHYCFGR((uint8_t)((~PHYCFGR_RST)|(PHYCFGR_OPMD|val)));\n    wait(0.2);\n}\n\n    void WIZnet_Chip::reg_rd_mac(uint16_t addr, uint8_t* data) {\n        spi_read(addr, 0x00, data, 6);\n    }\n\n    void WIZnet_Chip::reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip) {\n        uint8_t buf[4];\n        char* p = (char*)ip;\n        for(int i = 0; i < 4; i++) {\n            buf[i] = atoi(p);\n            p = strchr(p, '.');\n            if (p == NULL) {\n                break;\n            }\n            p++;\n        }\n        spi_write(addr, cb, buf, sizeof(buf));\n    }\n    \n    void WIZnet_Chip::sreg_ip(int socket, uint16_t addr, const char* ip) {\n        reg_wr_ip(addr, (0x0C + (socket << 5)), ip);\n    }\n    \n    void WIZnet_Chip::reg_rd_ip_byte(uint16_t addr, uint8_t* data) {\n        spi_read(addr, 0x00, data, 4);\n    }\n    \n    void WIZnet_Chip::reg_wr_ip_byte(uint16_t addr, uint8_t* data) {\n        spi_write(addr, 0x04, data, 4);\n    }\n\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/arch/ext/W5500.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n#pragma once\n\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n\n#define TEST_ASSERT(A) while(!(A)){debug(\"\\n\\n%s@%d %s ASSERT!\\n\\n\",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};\n\n#define DEFAULT_WAIT_RESP_TIMEOUT 500\n\n#define SOCK_ERROR            0        \n#define SOCKERR_SOCKNUM       (SOCK_ERROR - 1)     ///< Invalid socket number\n#define SOCKERR_SOCKOPT       (SOCK_ERROR - 2)     ///< Invalid socket option\n#define SOCKERR_SOCKINIT      (SOCK_ERROR - 3)     ///< Socket is not initialized\n#define SOCKERR_SOCKCLOSED    (SOCK_ERROR - 4)     ///< Socket unexpectedly closed.\n#define SOCKERR_SOCKMODE      (SOCK_ERROR - 5)     ///< Invalid socket mode for socket operation.\n#define SOCKERR_SOCKFLAG      (SOCK_ERROR - 6)     ///< Invalid socket flag\n#define SOCKERR_SOCKSTATUS    (SOCK_ERROR - 7)     ///< Invalid socket status for socket operation.\n#define SOCKERR_ARG           (SOCK_ERROR - 10)    ///< Invalid argrument.\n#define SOCKERR_PORTZERO      (SOCK_ERROR - 11)    ///< Port number is zero\n#define SOCKERR_IPINVALID     (SOCK_ERROR - 12)    ///< Invalid IP address\n#define SOCKERR_TIMEOUT       (SOCK_ERROR - 13)    ///< Timeout occurred\n#define SOCKERR_DATALEN       (SOCK_ERROR - 14)    ///< Data length is zero or greater than buffer max size.\n#define SOCKERR_BUFFER        (SOCK_ERROR - 15)    ///< Socket buffer is not enough for data communication.\n\n#define SOCK_ANY_PORT_NUM  0xC000;\n\n\n#define MAX_SOCK_NUM 8\n\n#define MR        0x0000\n#define GAR       0x0001\n#define SUBR      0x0005\n#define SHAR      0x0009\n#define SIPR      0x000f\n#define IR        0x0015\n#define IMR       0x0016\n#define SIR       0x0017\n#define SIMR      0x0018\n#define RTR       0x0019\n#define RCR       0x001b\n#define UIPR      0x0028\n#define UPORTR    0x002c\n#define PHYCFGR   0x002e\n\n// W5500 socket register\n#define Sn_MR         0x0000\n#define Sn_CR         0x0001\n#define Sn_IR         0x0002\n#define Sn_SR         0x0003\n#define Sn_PORT       0x0004\n#define Sn_DHAR       0x0006\n#define Sn_DIPR       0x000c\n#define Sn_DPORT      0x0010\n#define Sn_RXBUF_SIZE 0x001e\n#define Sn_TXBUF_SIZE 0x001f\n#define Sn_TX_FSR     0x0020\n#define Sn_TX_RD      0x0022\n#define Sn_TX_WR      0x0024\n#define Sn_RX_RSR     0x0026\n#define Sn_RX_RD      0x0028\n#define Sn_RX_WR      0x002a\n#define Sn_IMR        0x002c\n\n\n//Define for Socket Command register option value\n#define Sn_CR_OPEN      0x01\n#define Sn_CR_LISTEN    0x02\n#define Sn_CR_CONNECT   0x04\n#define Sn_CR_DISCON    0x08\n#define Sn_CR_CLOSE     0x10\n#define Sn_CR_SEND      0x20\n#define Sn_CR_SEND_MAC  0x21\n#define Sn_CR_SEND_KEEP 0x22\n#define Sn_CR_RECV      0x40\n\n\n//Define for Socket Mode register option value\n#define Sn_MR_CLOSE   0x00\n#define Sn_MR_TCP     0x01\n#define Sn_MR_UDP     0x02\n#define Sn_MR_MACRAW  0x04\n#define Sn_MR_UCASTB  0x10\n#define Sn_MR_ND      0x20\n#define Sn_MR_BCASTB  0x40\n#define Sn_MR_MULTI   0x80\n\n#define Sn_IR_SENDOK                 0x10\n\n//Sn_IR values\n\n#define Sn_IR_TIMEOUT                0x08\n#define Sn_IR_RECV                   0x04\n#define Sn_IR_DISCON                 0x02\n#define Sn_IR_CON                    0x01\n\n/* PHYCFGR register value */\n#define PHYCFGR_RST                  ~(1<<7)  //< For PHY reset, must operate AND mask.\n#define PHYCFGR_OPMD                 (1<<6)   // Configre PHY with OPMDC value\n#define PHYCFGR_OPMDC_ALLA           (7<<3)\n#define PHYCFGR_OPMDC_PDOWN          (6<<3)\n#define PHYCFGR_OPMDC_NA             (5<<3)\n#define PHYCFGR_OPMDC_100FA          (4<<3)\n#define PHYCFGR_OPMDC_100F           (3<<3)\n#define PHYCFGR_OPMDC_100H           (2<<3)\n#define PHYCFGR_OPMDC_10F            (1<<3)\n#define PHYCFGR_OPMDC_10H            (0<<3)           \n#define PHYCFGR_DPX_FULL             (1<<2)\n#define PHYCFGR_DPX_HALF             (0<<2)\n#define PHYCFGR_SPD_100              (1<<1)\n#define PHYCFGR_SPD_10               (0<<1)\n#define PHYCFGR_LNK_ON               (1<<0)\n#define PHYCFGR_LNK_OFF              (0<<0)\n\n//PHY status define\n#define PHY_CONFBY_HW            0     ///< Configured PHY operation mode by HW pin\n#define PHY_CONFBY_SW            1     ///< Configured PHY operation mode by SW register   \n#define PHY_MODE_MANUAL          0     ///< Configured PHY operation mode with user setting.\n#define PHY_MODE_AUTONEGO        1     ///< Configured PHY operation mode with auto-negotiation\n#define PHY_SPEED_10             0     ///< Link Speed 10\n#define PHY_SPEED_100            1     ///< Link Speed 100\n#define PHY_DUPLEX_HALF          0     ///< Link Half-Duplex\n#define PHY_DUPLEX_FULL          1     ///< Link Full-Duplex\n#define PHY_LINK_OFF             0     ///< Link Off\n#define PHY_LINK_ON              1     ///< Link On\n#define PHY_POWER_NORM           0     ///< PHY power normal mode\n#define PHY_POWER_DOWN           1     ///< PHY power down mode \n\nenum PHYMode {\n    AutoNegotiate = 0,\n    HalfDuplex10  = 1,\n    FullDuplex10  = 2,\n    HalfDuplex100 = 3,\n    FullDuplex100 = 4,\n};\nclass WIZnet_Chip {\npublic:\nenum Protocol {\n    CLOSED = 0,\n    TCP    = 1,\n    UDP    = 2,\n};\n\nenum Command {\n    OPEN      = 0x01,\n    LISTEN    = 0x02,\n    CONNECT   = 0x04,\n    DISCON    = 0x08,\n    CLOSE     = 0x10,\n    SEND      = 0x20,\n    SEND_MAC  = 0x21, \n    SEND_KEEP = 0x22,\n    RECV      = 0x40,\n    \n};  \n\nenum Interrupt {\n    INT_CON     = 0x01,\n    INT_DISCON  = 0x02,\n    INT_RECV    = 0x04,\n    INT_TIMEOUT = 0x08,\n    INT_SEND_OK = 0x10,\n};\n\nenum Status {\n    SOCK_CLOSED      = 0x00,\n    SOCK_INIT        = 0x13,\n    SOCK_LISTEN      = 0x14,\n    SOCK_SYNSENT     = 0x15,\n    SOCK_ESTABLISHED = 0x17,\n    SOCK_CLOSE_WAIT  = 0x1c,\n    SOCK_UDP         = 0x22,\n};\n\n    \n    uint16_t sock_any_port;\n     \n    /*\n    * Constructor\n    *\n    * @param spi spi class\n    * @param cs cs of the W5500\n    * @param reset reset pin of the W5500\n    */\n    WIZnet_Chip(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset);\n    WIZnet_Chip(SPI* spi, PinName cs, PinName reset);\n\n    /*\n    * Set MAC Address to W5500\n    *\n    * @return true if connected, false otherwise\n    */ \n    bool setmac();\n\n    /*\n    * Set Network Informations (SrcIP, Netmask, Gataway)\n    *\n    * @return true if connected, false otherwise\n    */ \n    bool setip();\n\n    /*\n    * Disconnect the connection\n    *\n    * @ returns true \n    */\n    bool disconnect();\n\n    /*\n    * Open a tcp connection with the specified host on the specified port\n    *\n    * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)\n    * @param port port\n    * @ returns true if successful\n    */\n    bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);\n\n    /*\n    * Set the protocol (UDP or TCP)\n    *\n    * @param p protocol\n    * @ returns true if successful\n    */\n    bool setProtocol(int socket, Protocol p);\n\n    /*\n    * Reset the W5500\n    */\n    void reset();\n   \n    int wait_readable(int socket, int wait_time_ms, int req_size = 0);\n\n    int wait_writeable(int socket, int wait_time_ms, int req_size = 0);\n\n    /*\n    * Check if an ethernet link is pressent or not.\n    *\n    * @returns true if successful\n    */\n    bool link(int wait_time_ms= 3*1000);\n\n    /*\n    * Sets the speed and duplex parameters of an ethernet link.\n    *\n    * @returns true if successful\n    */\n    void set_link(PHYMode phymode);\n\n    /*\n    * Check if a tcp link is active\n    *\n    * @returns true if successful\n    */\n    bool is_connected(int socket);\n\n    /*\n    * Close a tcp connection\n    *\n    * @ returns true if successful\n    */\n    bool close(int socket);\n\n    /*\n    * @param str string to be sent\n    * @param len string length\n    */\n    int send(int socket, const char * str, int len);\n\n    int recv(int socket, char* buf, int len);\n\n    /*\n    * Return true if the module is using dhcp\n    *\n    * @returns true if the module is using dhcp\n    */\n    bool isDHCP() {\n        return dhcp;\n    }\n\n    bool gethostbyname(const char* host, uint32_t* ip);\n\n    static WIZnet_Chip * getInstance() {\n        return inst;\n    };\n\n    int new_socket();\n    uint16_t new_port();\n    void scmd(int socket, Command cmd);\n\n    template<typename T>\n    void sreg(int socket, uint16_t addr, T data) {\n        reg_wr<T>(addr, (0x0C + (socket << 5)), data);\n    }\n\n    template<typename T>\n    T sreg(int socket, uint16_t addr) {\n        return reg_rd<T>(addr, (0x08 + (socket << 5)));\n    }\n\n    template<typename T>\n    void reg_wr(uint16_t addr, T data) {\n        return reg_wr(addr, 0x04, data);\n    }\n    \n    template<typename T>\n    void reg_wr(uint16_t addr, uint8_t cb, T data) {\n        uint8_t buf[sizeof(T)];\n        *reinterpret_cast<T*>(buf) = data;\n        for(int i = 0; i < sizeof(buf)/2; i++) { //  Little Endian to Big Endian\n            uint8_t t = buf[i];\n            buf[i] = buf[sizeof(buf)-1-i];\n            buf[sizeof(buf)-1-i] = t;\n        }\n        spi_write(addr, cb, buf, sizeof(buf));\n    }\n\n    template<typename T>\n    T reg_rd(uint16_t addr) {\n        return reg_rd<T>(addr, 0x00);\n    }\n\n    template<typename T>\n    T reg_rd(uint16_t addr, uint8_t cb) {\n        uint8_t buf[sizeof(T)];\n        spi_read(addr, cb, buf, sizeof(buf));\n        for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian\n            uint8_t t = buf[i];\n            buf[i] = buf[sizeof(buf)-1-i];\n            buf[sizeof(buf)-1-i] = t;\n        }\n        return *reinterpret_cast<T*>(buf);\n    }\n\n    void reg_rd_mac(uint16_t addr, uint8_t* data);\n/*     {\n        spi_read(addr, 0x00, data, 6);\n    }*/\n\n    void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip);\n    /* {\n        uint8_t buf[4];\n        char* p = (char*)ip;\n        for(int i = 0; i < 4; i++) {\n            buf[i] = atoi(p);\n            p = strchr(p, '.');\n            if (p == NULL) {\n                break;\n            }\n            p++;\n        }\n        spi_write(addr, cb, buf, sizeof(buf));\n    }\n    */\n    void sreg_ip(int socket, uint16_t addr, const char* ip);\n/*     {\n        reg_wr_ip(addr, (0x0C + (socket << 5)), ip);\n    }*/\n    \n    void reg_rd_ip_byte(uint16_t addr, uint8_t* data);\n/*     {\n        spi_read(addr, 0x00, data, 4);\n    }*/\n    \n    void reg_wr_ip_byte(uint16_t addr, uint8_t* data);\n/*     {\n        spi_write(addr, 0x04, data, 4);\n    }*/\n       \n/////////////////////////////////\n// Common Register I/O function //\n/////////////////////////////////\n/**\n * @ingroup Common_register_access_function\n * @brief Set Mode Register\n * @param (uint8_t)mr The value to be set.\n * @sa getMR()\n */\n    void setMR(uint8_t mr) {\n        reg_wr<uint8_t>(MR,mr);\n    }\n\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get Mode Register\n * @return uint8_t. The value of Mode register.\n * @sa setMR()\n */\n    uint8_t getMR() {\n        return reg_rd<uint8_t>(MR);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set gateway IP address\n * @param (uint8_t*)gar Pointer variable to set gateway IP address. It should be allocated 4 bytes.\n * @sa getGAR()\n */\n    void setGAR(uint8_t * gar) {\n        reg_wr_ip_byte(GAR,gar);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get gateway IP address\n * @param (uint8_t*)gar Pointer variable to get gateway IP address. It should be allocated 4 bytes.\n * @sa setGAR()\n */\n    void getGAR(uint8_t * gar) { \n        reg_rd_ip_byte(GAR,gar);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set subnet mask address\n * @param (uint8_t*)subr Pointer variable to set subnet mask address. It should be allocated 4 bytes.\n * @sa getSUBR()\n */\n    void setSUBR(uint8_t * subr) {\n        reg_wr_ip_byte(SUBR, subr);\n    }\n\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get subnet mask address\n * @param (uint8_t*)subr Pointer variable to get subnet mask address. It should be allocated 4 bytes.\n * @sa setSUBR()\n */\n    void getSUBR(uint8_t * subr) {\n        reg_rd_ip_byte(SUBR, subr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set local MAC address\n * @param (uint8_t*)shar Pointer variable to set local MAC address. It should be allocated 6 bytes.\n * @sa getSHAR()\n */\n    void setSHAR(uint8_t * shar) {\n        reg_wr_mac(SHAR, shar);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get local MAC address\n * @param (uint8_t*)shar Pointer variable to get local MAC address. It should be allocated 6 bytes.\n * @sa setSHAR()\n */\n    void getSHAR(uint8_t * shar) {\n        reg_rd_mac(SHAR, shar);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set local IP address\n * @param (uint8_t*)sipr Pointer variable to set local IP address. It should be allocated 4 bytes.\n * @sa getSIPR()\n */\n    void setSIPR(uint8_t * sipr) {\n        reg_wr_ip_byte(SIPR, sipr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get local IP address\n * @param (uint8_t*)sipr Pointer variable to get local IP address. It should be allocated 4 bytes.\n * @sa setSIPR()\n */\n    void getSIPR(uint8_t * sipr) {\n        reg_rd_ip_byte(SIPR, sipr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref IR register\n * @param (uint8_t)ir Value to set @ref IR register.\n * @sa getIR()\n */\n    void setIR(uint8_t ir) { \n        reg_wr<uint8_t>(IR, (ir & 0xF0));\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref IR register\n * @return uint8_t. Value of @ref IR register.\n * @sa setIR()\n */\n    uint8_t getIR() {\n       return reg_rd<uint8_t>(IR & 0xF0);\n    }\n    \n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref IMR register\n * @param (uint8_t)imr Value to set @ref IMR register.\n * @sa getIMR()\n */\n    void setIMR(uint8_t imr) {\n        reg_wr<uint8_t>(IMR, imr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref IMR register\n * @return uint8_t. Value of @ref IMR register.\n * @sa setIMR()\n */\n    uint8_t getIMR() {\n        return reg_rd<uint8_t>(IMR);\n    }\n\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref SIR register\n * @param (uint8_t)sir Value to set @ref SIR register.\n * @sa getSIR()\n */\n    void setSIR(uint8_t sir) {\n        reg_wr<uint8_t>(SIR, sir);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref SIR register\n * @return uint8_t. Value of @ref SIR register.\n * @sa setSIR()\n */\n    uint8_t getSIR() {\n        return reg_rd<uint8_t>(SIR);\n    }\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref SIMR register\n * @param (uint8_t)simr Value to set @ref SIMR register.\n * @sa getSIMR()\n */\n    void setSIMR(uint8_t simr) {\n        reg_wr<uint8_t>(SIMR, simr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref SIMR register\n * @return uint8_t. Value of @ref SIMR register.\n * @sa setSIMR()\n */\n    uint8_t getSIMR() {\n        return reg_rd<uint8_t>(SIMR);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref RTR register\n * @param (uint16_t)rtr Value to set @ref RTR register.\n * @sa getRTR()\n */\n    void setRTR(uint16_t rtr)   {\n        reg_wr<uint16_t>(RTR, rtr);\n    } \n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref RTR register\n * @return uint16_t. Value of @ref RTR register.\n * @sa setRTR()\n */\n    uint16_t getRTR() {\n        return reg_rd<uint16_t>(RTR);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref RCR register\n * @param (uint8_t)rcr Value to set @ref RCR register.\n * @sa getRCR()\n */\n    void setRCR(uint8_t rcr) {\n        reg_wr<uint8_t>(RCR, rcr);\n    }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref RCR register\n * @return uint8_t. Value of @ref RCR register.\n * @sa setRCR()\n */\n    uint8_t getRCR() {\n        return reg_rd<uint8_t>(RCR);\n    }\n\n//================================================== test done ===========================================================\n\n/**\n * @ingroup Common_register_access_function\n * @brief Set @ref PHYCFGR register\n * @param (uint8_t)phycfgr Value to set @ref PHYCFGR register.\n * @sa setPHYCFGR()\n */\n   void setPHYCFGR(uint8_t phycfgr) {\n        reg_wr<uint8_t>(PHYCFGR, phycfgr);\n   }\n\n/**\n * @ingroup Common_register_access_function\n * @brief Get @ref PHYCFGR register\n * @return uint8_t. Value of @ref PHYCFGR register.\n * @sa getPHYCFGR()\n */\n     uint8_t getPHYCFGR() {\n        return reg_rd<uint8_t>(PHYCFGR);\n    }\n\n\n/////////////////////////////////////\n\n///////////////////////////////////\n// Socket N register I/O function //\n///////////////////////////////////\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_MR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)mr Value to set @ref Sn_MR\n * @sa getSn_MR()\n */\n    void setSn_MR(uint8_t sn, uint8_t mr) {\n        sreg<uint8_t>(sn, MR, mr);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_MR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_MR.\n * @sa setSn_MR()\n */\n    uint8_t getSn_MR(uint8_t sn) {\n        return sreg<uint8_t>(sn, Sn_MR);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_CR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)cr Value to set @ref Sn_CR\n * @sa getSn_CR()\n */\n    void setSn_CR(uint8_t sn, uint8_t cr) {\n        sreg<uint8_t>(sn, Sn_CR, cr);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_CR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_CR.\n * @sa setSn_CR()\n */\n    uint8_t getSn_CR(uint8_t sn) {\n        return sreg<uint8_t>(sn, Sn_CR);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_IR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)ir Value to set @ref Sn_IR\n * @sa getSn_IR()\n */\n    void setSn_IR(uint8_t sn, uint8_t ir) { \n        sreg<uint8_t>(sn, Sn_IR, (ir & 0x1F));\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_IR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_IR.\n * @sa setSn_IR()\n */\n    uint8_t getSn_IR(uint8_t sn) {\n        return (sreg<uint8_t>(sn, Sn_IR)) & 0x1F;\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_IMR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)imr Value to set @ref Sn_IMR\n * @sa getSn_IMR()\n */\n    void setSn_IMR(uint8_t sn, uint8_t imr) {\n        sreg<uint8_t>(sn, Sn_IMR, (imr & 0x1F));\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_IMR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_IMR.\n * @sa setSn_IMR()\n */\n    uint8_t getSn_IMR(uint8_t sn) {\n        return (sreg<uint8_t>(sn, Sn_IMR)) & 0x1F;\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_SR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_SR.\n */\n    uint8_t getSn_SR(uint8_t sn) {\n        return sreg<uint8_t>(sn, Sn_SR);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_PORT register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint16_t)port Value to set @ref Sn_PORT.\n * @sa getSn_PORT()\n */\n    void setSn_PORT(uint8_t sn, uint16_t port)  { \n        sreg<uint16_t>(sn, Sn_PORT, port );\n    } \n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_PORT register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_PORT.\n * @sa setSn_PORT()\n */\n    uint16_t getSn_PORT(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_PORT);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_DHAR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t*)dhar Pointer variable to set socket n destination hardware address. It should be allocated 6 bytes.\n * @sa getSn_DHAR()\n */\n    void setSn_DHAR(uint8_t sn, uint8_t * dhar) {\n        spi_write(Sn_DHAR, (0x0C + (sn << 5)), dhar, 6);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_MR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t*)dhar Pointer variable to get socket n destination hardware address. It should be allocated 6 bytes.\n * @sa setSn_DHAR()\n */\n    void getSn_DHAR(uint8_t sn, uint8_t * dhar) {\n        spi_read(Sn_DHAR, (0x08 + (sn << 5)), dhar, 6);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_DIPR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t*)dipr Pointer variable to set socket n destination IP address. It should be allocated 4 bytes.\n * @sa getSn_DIPR()\n */\n    void setSn_DIPR(uint8_t sn, uint8_t * dipr) {\n        spi_write(Sn_DIPR, (0x0C + (sn << 5)), dipr, 4);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_DIPR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t*)dipr Pointer variable to get socket n destination IP address. It should be allocated 4 bytes.\n * @sa SetSn_DIPR()\n */\n    void getSn_DIPR(uint8_t sn, uint8_t * dipr) {\n        spi_read(Sn_DIPR, (0x08 + (sn << 5)), dipr, 4);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_DPORT register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint16_t)dport Value to set @ref Sn_DPORT\n * @sa getSn_DPORT()\n */\n    void setSn_DPORT(uint8_t sn, uint16_t dport) { \n        sreg<uint16_t>(sn, Sn_DPORT, dport);\n    } \n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_DPORT register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_DPORT.\n * @sa setSn_DPORT()\n */\n    uint16_t getSn_DPORT(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_DPORT);\n    }\n\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_RXBUF_SIZE register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)rxbufsize Value to set @ref Sn_RXBUF_SIZE\n * @sa getSn_RXBUF_SIZE()\n */\n    void setSn_RXBUF_SIZE(uint8_t sn, uint8_t rxbufsize) {\n        sreg<uint8_t>(sn, Sn_RXBUF_SIZE ,rxbufsize);\n    }\n\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_RXBUF_SIZE register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_RXBUF_SIZE.\n * @sa setSn_RXBUF_SIZE()\n */\n    uint8_t getSn_RXBUF_SIZE(uint8_t sn) {\n        return sreg<uint8_t>(sn, Sn_RXBUF_SIZE);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_TXBUF_SIZE register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint8_t)txbufsize Value to set @ref Sn_TXBUF_SIZE\n * @sa getSn_TXBUF_SIZE()\n */\n    void setSn_TXBUF_SIZE(uint8_t sn, uint8_t txbufsize) {\n        sreg<uint8_t>(sn, Sn_TXBUF_SIZE, txbufsize);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_TXBUF_SIZE register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint8_t. Value of @ref Sn_TXBUF_SIZE.\n * @sa setSn_TXBUF_SIZE()\n */\n    uint8_t getSn_TXBUF_SIZE(uint8_t sn) {\n        return sreg<uint8_t>(sn, Sn_TXBUF_SIZE);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_TX_FSR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_TX_FSR.\n */\n    uint16_t getSn_TX_FSR(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_TX_FSR);\n    }\n\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_TX_RD register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_TX_RD.\n */\n    uint16_t getSn_TX_RD(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_TX_RD);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_TX_WR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint16_t)txwr Value to set @ref Sn_TX_WR\n * @sa GetSn_TX_WR()\n */\n    void setSn_TX_WR(uint8_t sn, uint16_t txwr) { \n        sreg<uint16_t>(sn, Sn_TX_WR, txwr); \n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_TX_WR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_TX_WR.\n * @sa setSn_TX_WR()\n */\n    uint16_t getSn_TX_WR(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_TX_WR);\n    }\n\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_RX_RSR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_RX_RSR.\n */\n    uint16_t getSn_RX_RSR(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_RX_RSR);\n    }\n\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Set @ref Sn_RX_RD register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @param (uint16_t)rxrd Value to set @ref Sn_RX_RD\n * @sa getSn_RX_RD()\n */\n    void setSn_RX_RD(uint8_t sn, uint16_t rxrd) { \n        sreg<uint16_t>(sn, Sn_RX_RD, rxrd); \n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_RX_RD register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @regurn uint16_t. Value of @ref Sn_RX_RD.\n * @sa setSn_RX_RD()\n */\n    uint16_t getSn_RX_RD(uint8_t sn) {\n        return sreg<uint16_t>(sn, Sn_RX_RD);\n    }\n\n/**\n * @ingroup Socket_register_access_function\n * @brief Get @ref Sn_RX_WR register\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of @ref Sn_RX_WR.\n */\n    uint16_t getSn_RX_WR(uint8_t sn) { \n        return sreg<uint16_t>(sn, Sn_RX_WR);\n    }\n\n\n//////////////////////////////////////\n\n/////////////////////////////////////\n// Sn_TXBUF & Sn_RXBUF IO function //\n/////////////////////////////////////\n/**  \n * @brief Gets the max buffer size of socket sn passed as parameter.\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of Socket n RX max buffer size.\n */\n    uint16_t getSn_RxMAX(uint8_t sn) {\n        return (getSn_RXBUF_SIZE(sn) << 10);\n    }\n\n/**  \n * @brief Gets the max buffer size of socket sn passed as parameters.\n * @param (uint8_t)sn Socket number. It should be <b>0 ~ 7</b>.\n * @return uint16_t. Value of Socket n TX max buffer size.\n */\n//uint16_t getSn_TxMAX(uint8_t sn);\n    uint16_t getSn_TxMAX(uint8_t sn) {\n        return (getSn_TXBUF_SIZE(sn) << 10);\n    }\n\n\n    int ethernet_link(void);\n    void ethernet_set_link(int speed, int duplex);\nprotected:\n    uint8_t mac[6];\n    uint32_t ip;\n    uint32_t netmask;\n    uint32_t gateway;\n    uint32_t dnsaddr;\n    bool dhcp;\n    \n    void spi_write(uint16_t addr, uint8_t cb, const uint8_t *buf, uint16_t len);\n    void spi_read(uint16_t addr, uint8_t cb, uint8_t *buf, uint16_t len);\n    SPI* spi;\n    DigitalOut cs;\n    DigitalOut reset_pin;\n    static WIZnet_Chip* inst;\n\n    void reg_wr_mac(uint16_t addr, uint8_t* data) {\n        spi_write(addr, 0x04, data, 6);\n    }\n\n};\n\n\nextern uint32_t str_to_ip(const char* str);\nextern void printfBytes(char* str, uint8_t* buf, int len);\nextern void printHex(uint8_t* buf, int len);\nextern void debug_hex(uint8_t* buf, int len);\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/arch/int/W7500x_toe.cpp",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n#include \"eth_arch.h\"\n#if defined(TARGET_WIZwiki_W7500) || defined(TARGET_WIZwiki_W7500P) || defined(TARGET_WIZwiki_W7500ECO)\n\n\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n#include \"DNSClient.h\"\n\n\n/*\n * MDIO via GPIO\n * mdio via gpio is supported and related functions as follows.\n *  - mdio_init(),mdio_read(),mdio_write()\n *  - input_MDIO(),output_MDIO(),turnaroud_MDIO(),idle_MDIO()\n * called by ethernet_link() and ethernet_set_link()\n */\n \n#if defined (TARGET_WIZwiki_W7500) || defined(TARGET_WIZwiki_W7500ECO)\n\n#define MDIO            GPIO_Pin_14\n#define MDC             GPIO_Pin_15\n#define GPIO_MDC        GPIOB\n#define PHY_ADDR_IP101G 0x07 \n#define PHY_ADDR        PHY_ADDR_IP101G\n#define SVAL            0x2 //right shift val = 2 \n#define PHYREG_CONTROL  0x0 //Control Register address (Contorl basic register)\n#define PHYREG_STATUS   0x1 //Status Register address (Status basic register)\n#define CNTL_DUPLEX     (0x01ul<< 7)\n#define CNTL_AUTONEGO   (0x01ul<<11)\n#define CNTL_SPEED      (0x01ul<<12)\n#define MDC_WAIT        (1)\n\n#elif defined (TARGET_WIZwiki_W7500P) \n\n#define MDIO            GPIO_Pin_15\n#define MDC             GPIO_Pin_14\n#define GPIO_MDC        GPIOB\n#define PHY_ADDR_IP101G 0x01 \n#define PHY_ADDR        PHY_ADDR_IP101G\n#define SVAL            0x2 //right shift val = 2 \n#define PHYREG_CONTROL  0x0 //Control Register address (Contorl basic register)\n#define PHYREG_STATUS   0x1 //Status Register address (Status basic register)\n#define CNTL_DUPLEX     (0x01ul<< 8)\n#define CNTL_AUTONEGO   (0x01ul<<12)\n#define CNTL_SPEED      (0x01ul<<13)\n#define MDC_WAIT        (1)\n\n#endif\n\nvoid mdio_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_MDC, uint16_t GPIO_Pin_MDIO);\nvoid mdio_write(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr, uint32_t val);\nuint32_t mdio_read(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr);\n\nWIZnet_Chip* WIZnet_Chip::inst;\n\nWIZnet_Chip::WIZnet_Chip()\n{\n    inst = this;\n}\n\nbool WIZnet_Chip::setmac()\n{\n    reg_wr_mac(SHAR, mac);\n    return true;\n}\n\n// Set the IP\nbool WIZnet_Chip::setip()\n{\n    reg_wr<uint32_t>(SIPR, ip);\n    reg_wr<uint32_t>(GAR, gateway);\n    reg_wr<uint32_t>(SUBR, netmask);\n    return true;\n}\n\nbool WIZnet_Chip::setProtocol(int socket, Protocol p)\n{\n    if (socket < 0) {\n        return false;\n    }\n    sreg<uint8_t>(socket, Sn_MR, p);\n    return true;\n}\n\nbool WIZnet_Chip::connect(int socket, const char * host, int port, int timeout_ms)\n{\n    if (socket < 0) {\n        return false;\n    }\n    sreg<uint8_t>(socket, Sn_MR, TCP);\n    scmd(socket, OPEN);\n    sreg_ip(socket, Sn_DIPR, host);\n    sreg<uint16_t>(socket, Sn_DPORT, port);\n    sreg<uint16_t>(socket, Sn_PORT, new_port());\n    scmd(socket, CONNECT);\n    Timer t;\n    t.reset();\n    t.start();\n    while(!is_connected(socket)) {\n        if (t.read_ms() > timeout_ms) {\n            return false;\n        }\n    }\n    return true;\n}\n\nbool WIZnet_Chip::gethostbyname(const char* host, uint32_t* ip)\n{\n    uint32_t addr = str_to_ip(host);\n    char buf[17];\n    snprintf(buf, sizeof(buf), \"%d.%d.%d.%d\", \n            (uint8_t)((addr>>24)&0xff), \n            (uint8_t)((addr>>16)&0xff), \n            (uint8_t)((addr>>8)&0xff), \n            (uint8_t)(addr&0xff));\n    if (strcmp(buf, host) == 0) {\n        *ip = addr;\n        return true;\n    }\n    DNSClient client;\n    if(client.lookup(host)) {\n        *ip = client.ip;\n        return true;\n    }\n    return false;\n}\n\n\nbool WIZnet_Chip::is_connected(int socket)\n{\n    /*\n       if (sreg<uint8_t>(socket, Sn_SR) == SOCK_ESTABLISHED) {\n       return true;\n       }\n     */\n    uint8_t tmpSn_SR;\n    tmpSn_SR = sreg<uint8_t>(socket, Sn_SR);\n    // packet sending is possible, when state is SOCK_CLOSE_WAIT.\n    if ((tmpSn_SR == SOCK_ESTABLISHED) || (tmpSn_SR == SOCK_CLOSE_WAIT)) {\n        return true;\n    }\n    return false;\n}\n// Reset the chip & set the buffer\nvoid WIZnet_Chip::reset()\n{\n    /* S/W Reset PHY */\n    mdio_write(GPIO_MDC, PHYREG_CONTROL, 0x8000);\n    wait_ms(10);//for S/W reset\n    wait_ms(10);//for MDC I/F RDY\n\n    mdio_init(GPIO_MDC, MDC, MDIO);\n    \n    /* S/W Reset WZTOE */\n    reg_wr<uint8_t>(MR, MR_RST);\n    // set PAD strengh and pull-up for TXD[3:0] and TXE \n#ifdef __DEF_USED_IC101AG__ //For using IC+101AG\n\n#if defined(TARGET_WIZwiki_W7500) || defined(TARGET_WIZwiki_W7500ECO)\n\n    *(volatile uint32_t *)(0x41003068) = 0x64; //TXD0 \n    *(volatile uint32_t *)(0x4100306C) = 0x64; //TXD1\n    *(volatile uint32_t *)(0x41003070) = 0x64; //TXD2\n    *(volatile uint32_t *)(0x41003074) = 0x64; //TXD3\n    *(volatile uint32_t *)(0x41003050) = 0x64; //TXE\n#endif\n\n#endif  \n\n    // set ticker counter\n    reg_wr<uint32_t>(TIC100US, (SystemCoreClock/10000));\n    // write MAC address inside the WZTOE MAC address register\n    reg_wr_mac(SHAR, mac);\n    /*\n     * set RX and TX buffer size\n     * for (int socket = 0; socket < MAX_SOCK_NUM; socket++) {\n     *  sreg<uint8_t>(socket, Sn_RXBUF_SIZE, 2);\n     *  sreg<uint8_t>(socket, Sn_TXBUF_SIZE, 2);\n     * }\n     */\n}\n\n\nbool WIZnet_Chip::close(int socket)\n{\n    if (socket < 0) {\n        return false;\n    }\n    // if SOCK_CLOSED, return\n    if (sreg<uint8_t>(socket, Sn_SR) == SOCK_CLOSED) {\n        return true;\n    }\n    // if SOCK_ESTABLISHED, send FIN-Packet to peer \n    if (sreg<uint8_t>(socket, Sn_MR) == TCP) {\n        scmd(socket, DISCON);\n    }\n    // close socket\n    scmd(socket, CLOSE);\n    // clear Socket Interrupt Register\n    sreg<uint8_t>(socket, Sn_ICR, 0xff);\n    return true;\n}\n\nint WIZnet_Chip::wait_readable(int socket, int wait_time_ms, int req_size)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        int size = sreg<uint16_t>(socket, Sn_RX_RSR);\n        if (size > req_size) {\n            return size;\n        }\n        if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n            break;\n        }\n    }\n    return -1;\n}\n\nint WIZnet_Chip::wait_writeable(int socket, int wait_time_ms, int req_size)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        int size = sreg<uint16_t>(socket, Sn_TX_FSR);\n        if (size > req_size) {\n            return size;\n        }\n        if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n            break;\n        }\n    }\n    return -1;\n}\n\nint WIZnet_Chip::send(int socket, const char * str, int len)\n{\n    if (socket < 0) {\n        return -1;\n    }\n\n    uint16_t ptr = sreg<uint16_t>(socket, Sn_TX_WR);\n    uint32_t sn_tx_base = W7500x_TXMEM_BASE + (uint32_t)(socket<<18); \n\n    for(int i=0; i<len; i++)\n        *(volatile uint8_t *)(sn_tx_base + ((ptr+i)&0xFFFF)) = str[i];\n\n    sreg<uint16_t>(socket, Sn_TX_WR, ptr + len);\n    scmd(socket, SEND);\n\n    uint8_t tmp_Sn_IR;\n    while (( (tmp_Sn_IR = sreg<uint8_t>(socket, Sn_IR)) & INT_SEND_OK) != INT_SEND_OK) {\n        // @Jul.10, 2014 fix contant name, and udp sendto function.\n        switch (sreg<uint8_t>(socket, Sn_SR)) {\n            case SOCK_CLOSED :\n                close(socket);\n                return 0;\n                //break;\n            case SOCK_UDP :\n                // ARP timeout is possible.\n                if ((tmp_Sn_IR & INT_TIMEOUT) == INT_TIMEOUT) {\n                    sreg<uint8_t>(socket, Sn_ICR, INT_TIMEOUT);\n                    return 0;\n                }\n                break;\n            default :\n                break;\n        }\n    }\n\n    sreg<uint8_t>(socket, Sn_ICR, INT_SEND_OK);\n\n    return len;\n}\n\nint WIZnet_Chip::recv(int socket, char* buf, int len)\n{\n    if (socket < 0) {\n        return -1;\n    }\n    uint16_t ptr = sreg<uint16_t>(socket, Sn_RX_RD);\n    uint32_t sn_rx_base = W7500x_RXMEM_BASE + (uint32_t)(socket<<18); \n\n    for(int i=0; i<len; i++)\n        buf[i] = *(volatile uint8_t *)(sn_rx_base + ((ptr+i)&0xFFFF));\n\n    sreg<uint16_t>(socket, Sn_RX_RD, ptr + len);\n    scmd(socket, RECV);\n\n    return len;\n}\n\nint WIZnet_Chip::new_socket()\n{\n    for(int s = 0; s < MAX_SOCK_NUM; s++) {\n        if (sreg<uint8_t>(s, Sn_SR) == SOCK_CLOSED) {\n            return s;\n        }\n    }\n    return -1;\n}\n\nuint16_t WIZnet_Chip::new_port()\n{\n    uint16_t port = rand();\n    port |= 49152;\n    return port;\n}\n\nbool WIZnet_Chip::link(int wait_time_ms)\n{\n    Timer t;\n    t.reset();\n    t.start();\n    while(1) {\n        int is_link = ethernet_link();\n        \n        if (is_link) {\n            return true;\n        }\n        if (wait_time_ms != (-1) && t.read_ms() > wait_time_ms) {\n            break;\n        }\n    }\n    return 0;\n}\n\nvoid WIZnet_Chip::set_link(PHYMode phymode)\n{\n    int speed = -1;\n    int duplex = 0;\n\n    switch(phymode) {\n        case AutoNegotiate : speed = -1; duplex = 0; break;\n        case HalfDuplex10  : speed = 0;  duplex = 0; break;\n        case FullDuplex10  : speed = 0;  duplex = 1; break;\n        case HalfDuplex100 : speed = 1;  duplex = 0; break;\n        case FullDuplex100 : speed = 1;  duplex = 1; break;\n    }\n\n    ethernet_set_link(speed, duplex);\n}\n\nuint32_t str_to_ip(const char* str)\n{\n    uint32_t ip = 0;\n    char* p = (char*)str;\n    for(int i = 0; i < 4; i++) {\n        ip |= atoi(p);\n        p = strchr(p, '.');\n        if (p == NULL) {\n            break;\n        }\n        ip <<= 8;\n        p++;\n    }\n    return ip;\n}\n\nvoid printfBytes(char* str, uint8_t* buf, int len)\n{\n    printf(\"%s %d:\", str, len);\n    for(int i = 0; i < len; i++) {\n        printf(\" %02x\", buf[i]);\n    }\n    printf(\"\\n\");\n}\n\nvoid printHex(uint8_t* buf, int len)\n{\n    for(int i = 0; i < len; i++) {\n        if ((i%16) == 0) {\n            printf(\"%p\", buf+i);\n        }\n        printf(\" %02x\", buf[i]);\n        if ((i%16) == 15) {\n            printf(\"\\n\");\n        }\n    }\n    printf(\"\\n\");\n}\n\nvoid debug_hex(uint8_t* buf, int len)\n{\n    for(int i = 0; i < len; i++) {\n        if ((i%16) == 0) {\n            debug(\"%p\", buf+i);\n        }\n        debug(\" %02x\", buf[i]);\n        if ((i%16) == 15) {\n            debug(\"\\n\");\n        }\n    }\n    debug(\"\\n\");\n}\n\nvoid WIZnet_Chip::scmd(int socket, Command cmd)\n{\n    sreg<uint8_t>(socket, Sn_CR, cmd);\n    while(sreg<uint8_t>(socket, Sn_CR));\n}\n\n\nvoid mdio_init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin_MDC, uint16_t GPIO_Pin_MDIO)\n{\n    /* Set GPIOs for MDIO and MDC */\n    GPIO_InitTypeDef MDIO_InitDef;  \n    HAL_PAD_AFConfig(PAD_PB, GPIO_Pin_MDIO, PAD_AF1);  \n    HAL_PAD_AFConfig(PAD_PB, GPIO_Pin_MDC, PAD_AF1);  \n    MDIO_InitDef.GPIO_Pin = GPIO_Pin_MDC | GPIO_Pin_MDIO;\n    MDIO_InitDef.GPIO_Mode = GPIO_Mode_OUT;\n    HAL_GPIO_Init(GPIOx, &MDIO_InitDef);\n}\n\nvoid output_MDIO(GPIO_TypeDef* GPIOx, uint32_t val, uint32_t n)\n{\n    for(val <<= (32-n); n; val<<=1, n--)\n    {\n        if(val & 0x80000000)\n            HAL_GPIO_SetBits(GPIOx, MDIO); \n        else\n            HAL_GPIO_ResetBits(GPIOx, MDIO);\n\n        wait_ms(MDC_WAIT);\n        HAL_GPIO_SetBits(GPIOx, MDC); \n        wait_ms(MDC_WAIT);\n        HAL_GPIO_ResetBits(GPIOx, MDC);\n    }\n}\n\nuint32_t input_MDIO( GPIO_TypeDef* GPIOx )\n{\n    uint32_t i, val=0; \n    for(i=0; i<16; i++)\n    {\n        val <<=1;\n        HAL_GPIO_SetBits(GPIOx, MDC); \n        wait_ms(MDC_WAIT);\n        HAL_GPIO_ResetBits(GPIOx, MDC);\n        wait_ms(MDC_WAIT);\n        val |= HAL_GPIO_ReadInputDataBit(GPIOx, MDIO);\n    }\n    return (val);\n}\n\nvoid turnaround_MDIO( GPIO_TypeDef* GPIOx)\n{\n    GPIOx->OUTENCLR = MDIO ;\n    HAL_GPIO_SetBits(GPIOx, MDC); \n    wait_ms(MDC_WAIT);\n    HAL_GPIO_ResetBits(GPIOx, MDC);\n    wait_ms(MDC_WAIT);\n}\n\nvoid idle_MDIO( GPIO_TypeDef* GPIOx )\n{\n    GPIOx->OUTENSET = MDIO ;\n    HAL_GPIO_SetBits(GPIOx,MDC); \n    wait_ms(MDC_WAIT);\n    HAL_GPIO_ResetBits(GPIOx, MDC);\n    wait_ms(MDC_WAIT);\n}\n\nuint32_t mdio_read(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr)\n{\n    output_MDIO(GPIOx, 0xFFFFFFFF, 32);\n    output_MDIO(GPIOx, 0x06, 4);\n    output_MDIO(GPIOx, PHY_ADDR, 5);\n    output_MDIO(GPIOx, PhyRegAddr, 5);\n    turnaround_MDIO(GPIOx);\n    uint32_t val = input_MDIO(GPIOx );\n    idle_MDIO(GPIOx);\n    return val;\n}\n\nvoid mdio_write(GPIO_TypeDef* GPIOx, uint32_t PhyRegAddr, uint32_t val)\n{\n    output_MDIO(GPIOx, 0xFFFFFFFF, 32);\n    output_MDIO(GPIOx, 0x05, 4);\n    output_MDIO(GPIOx, PHY_ADDR, 5);\n    output_MDIO(GPIOx, PhyRegAddr, 5);\n    output_MDIO(GPIOx, 0x02, 2);\n    output_MDIO(GPIOx, val, 16);\n    idle_MDIO(GPIOx);\n}\n\nint WIZnet_Chip::ethernet_link(void) {\n    return ((mdio_read(GPIO_MDC, PHYREG_STATUS)>>SVAL)&0x01); \n}\n\nvoid WIZnet_Chip::ethernet_set_link(int speed, int duplex) {\n    uint32_t val=0;\n    if((speed < 0) || (speed > 1)) {\n        val = CNTL_AUTONEGO; \n    } else {\n        val = ((CNTL_SPEED&(speed<<11))|(CNTL_DUPLEX&(duplex<<7))); \n    }\n    mdio_write(GPIO_MDC, PHYREG_CONTROL, val);\n}\n\n   void WIZnet_Chip::reg_rd_mac(uint16_t addr, uint8_t* data) \n   {\n        data[0] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3));\n        data[1] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2));\n        data[2] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1));\n        data[3] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0));\n        data[4] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7));\n        data[5] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6));\n    }\n\n    void WIZnet_Chip::reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip)\n    {\n        uint8_t buf[4]={0,};\n        uint32_t wr_ip = 0;\n        char* p = (char*)ip;\n        \n        for(int i = 0; i < 4; i++) {\n            wr_ip = (wr_ip<<8);\n            buf[i] = atoi(p);\n            wr_ip |= buf[i];\n            p = strchr(p, '.');\n            if (p == NULL) break;\n            p++;\n        }\n        *(volatile uint32_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)) = wr_ip;\n    }\n\n    void WIZnet_Chip::sreg_ip(int socket, uint16_t addr, const char* ip) {\n        reg_wr_ip(addr,  (uint8_t)(0x01+(socket<<2)), ip);\n    }\n\n#endif\n\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/arch/int/W7500x_toe.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n#pragma once\n\n#include \"mbed.h\"\n#include \"mbed_debug.h\"\n\n#define TEST_ASSERT(A) while(!(A)){debug(\"\\n\\n%s@%d %s ASSERT!\\n\\n\",__PRETTY_FUNCTION__,__LINE__,#A);exit(1);};\n\n#define DEFAULT_WAIT_RESP_TIMEOUT 500\n\n\n#define MAX_SOCK_NUM 8\n\n// Peripheral base address \n#define W7500x_WZTOE_BASE   (0x46000000)\n#define W7500x_TXMEM_BASE   (W7500x_WZTOE_BASE + 0x00020000)\n#define W7500x_RXMEM_BASE   (W7500x_WZTOE_BASE + 0x00030000)\n// Common register\n#define MR                  (0x2300)\n#define GAR                 (0x6008)\n#define SUBR                (0x600C)\n#define SHAR                (0x6000)\n#define SIPR                (0x6010)\n\n// Added Common register @W7500\n#define TIC100US            (0x2000) \n\n// Socket register\n#define Sn_MR               (0x0000)\n#define Sn_CR               (0x0010)\n#define Sn_IR               (0x0020) //--Sn_ISR\n#define Sn_SR               (0x0030)\n#define Sn_PORT             (0x0114)\n#define Sn_DIPR             (0x0124)\n#define Sn_DPORT            (0x0120)\n#define Sn_RXBUF_SIZE       (0x0200)\n#define Sn_TXBUF_SIZE       (0x0220)\n#define Sn_TX_FSR           (0x0204)\n#define Sn_TX_WR            (0x020C)\n#define Sn_RX_RSR           (0x0224)\n#define Sn_RX_RD            (0x0228)\n// added Socket register @W7500\n#define Sn_ICR              (0x0028)\nenum PHYMode {\n    AutoNegotiate = 0,\n    HalfDuplex10  = 1,\n    FullDuplex10  = 2,\n    HalfDuplex100 = 3,\n    FullDuplex100 = 4,\n};\n\n//bool plink(int wait_time_ms= 3*1000);\n\nclass WIZnet_Chip {\npublic:\nenum Protocol {\n    CLOSED = 0,\n    TCP    = 1,\n    UDP    = 2,\n};\n\nenum Command {\n    OPEN      = 0x01,\n    LISTEN    = 0x02,\n    CONNECT   = 0x04,\n    DISCON    = 0x08,\n    CLOSE     = 0x10,\n    SEND      = 0x20,\n    SEND_MAC  = 0x21, \n    SEND_KEEP = 0x22,\n    RECV      = 0x40,\n    \n};\n\nenum Interrupt {\n    INT_CON     = 0x01,\n    INT_DISCON  = 0x02,\n    INT_RECV    = 0x04,\n    INT_TIMEOUT = 0x08,\n    INT_SEND_OK = 0x10,\n};\nenum Status {\n    SOCK_CLOSED      = 0x00,\n    SOCK_INIT        = 0x13,\n    SOCK_LISTEN      = 0x14,\n    SOCK_SYNSENT     = 0x15,\n    SOCK_ESTABLISHED = 0x17,\n    SOCK_CLOSE_WAIT  = 0x1c,\n    SOCK_UDP         = 0x22,\n};\nenum Mode {\n    MR_RST           = 0x80,   \n    MR_WOL           = 0x20,   \n    MR_PB            = 0x10,   \n    MR_FARP          = 0x02,   \n};\n\n    WIZnet_Chip();\n\n    /*\n    * Set MAC Address to W7500x_TOE\n    *\n    * @return true if connected, false otherwise\n    */ \n    bool setmac();\n\n    /*\n    * Connect the W7500 WZTOE to the ssid contained in the constructor.\n    *\n    * @return true if connected, false otherwise\n    */ \n    bool setip();\n\n\n    /*\n    * Open a tcp connection with the specified host on the specified port\n    *\n    * @param host host (can be either an ip address or a name. If a name is provided, a dns request will be established)\n    * @param port port\n    * @ returns true if successful\n    */\n    bool connect(int socket, const char * host, int port, int timeout_ms = 10*1000);\n\n    /*\n    * Set the protocol (UDP or TCP)\n    *\n    * @param p protocol\n    * @ returns true if successful\n    */\n    bool setProtocol(int socket, Protocol p);\n\n    /*\n    * Reset the W7500 WZTOE\n    */\n    void reset();\n   \n    int wait_readable(int socket, int wait_time_ms, int req_size = 0);\n\n    int wait_writeable(int socket, int wait_time_ms, int req_size = 0);\n\n    /*\n    * Check if an ethernet link is pressent or not.\n    *\n    * @returns true if successful\n    */\n    bool link(int wait_time_ms= 3*1000);\n\n    /*\n    * Sets the speed and duplex parameters of an ethernet link.\n    *\n    * @returns true if successful\n    */\n    void set_link(PHYMode phymode);\n\n    /*\n    * Check if a tcp link is active\n    *\n    * @returns true if successful\n    */\n    bool is_connected(int socket);\n\n    /*\n    * Close a tcp connection\n    *\n    * @ returns true if successful\n    */\n    bool close(int socket);\n\n    /*\n    * @param str string to be sent\n    * @param len string length\n    */\n    int send(int socket, const char * str, int len);\n\n    int recv(int socket, char* buf, int len);\n\n    /*\n    * Return true if the module is using dhcp\n    *\n    * @returns true if the module is using dhcp\n    */\n    bool isDHCP() {\n        return dhcp;\n    }\n\n    bool gethostbyname(const char* host, uint32_t* ip);\n\n    static WIZnet_Chip * getInstance() {\n        return inst;\n    };\n\n    int new_socket();\n    uint16_t new_port();\n\n    void scmd(int socket, Command cmd);\n\n    template<typename T>\n    void sreg(int socket, uint16_t addr, T data) {\n        reg_wr<T>(addr, (uint8_t)(0x01+(socket<<2)), data);\n    }\n\n    template<typename T>\n    T sreg(int socket, uint16_t addr) {\n        return reg_rd<T>(addr, (uint8_t)(0x01+(socket<<2)));\n    }\n\n    template<typename T>\n    void reg_wr(uint16_t addr, T data) {\n        return reg_wr(addr, 0x00, data);\n    }\n    \n    template<typename T>\n    void reg_wr(uint16_t addr, uint8_t cb, T data) {\n        uint8_t buf[sizeof(T)];\n        *reinterpret_cast<T*>(buf) = data;\n        /*\n        for(int i = 0; i < sizeof(buf)/2; i++) { //  Little Endian to Big Endian\n            uint8_t t = buf[i];\n            buf[i] = buf[sizeof(buf)-1-i];\n            buf[sizeof(buf)-1-i] = t;\n        }\n        */\n        for(int i = 0; i < sizeof(buf); i++) { //  Little Endian to Big Endian\n            *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i) = buf[i];\n        }\n    }\n\n    template<typename T>\n    T reg_rd(uint16_t addr) {\n        return reg_rd<T>(addr, (uint8_t)(0x00));\n    }\n\n    template<typename T>\n    T reg_rd(uint16_t addr, uint8_t cb) {\n        uint8_t buf[sizeof(T)] = {0,};\n        for(int i = 0; i < sizeof(buf); i++) { //  Little Endian to Big Endian\n            buf[i] = *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)((cb<<16)+addr)+i);\n        }\n        /*\n        for(int i = 0; i < sizeof(buf)/2; i++) { // Big Endian to Little Endian\n            uint8_t t = buf[i];\n            buf[i] = buf[sizeof(buf)-1-i];\n            buf[sizeof(buf)-1-i] = t;\n        }\n        */\n        return *reinterpret_cast<T*>(buf);\n    }\n\n    void reg_rd_mac(uint16_t addr, uint8_t* data);\n    \n    void reg_wr_ip(uint16_t addr, uint8_t cb, const char* ip);\n\n    void sreg_ip(int socket, uint16_t addr, const char* ip);\n\n    int ethernet_link(void);\n    \n    void ethernet_set_link(int speed, int duplex);\n\n\nprotected:\n    uint8_t mac[6];\n    uint32_t ip;\n    uint32_t netmask;\n    uint32_t gateway;\n    uint32_t dnsaddr;\n    bool dhcp;\n\n    static WIZnet_Chip* inst;\n\n    void reg_wr_mac(uint16_t addr, uint8_t* data) {\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+3)) = data[0] ;\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+2)) = data[1] ;\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+1)) = data[2] ;\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+0)) = data[3] ;\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+7)) = data[4] ;\n        *(volatile uint8_t *)(W7500x_WZTOE_BASE + (uint32_t)(addr+6)) = data[5] ;\n    }\n};\n\nextern uint32_t str_to_ip(const char* str);\nextern void printfBytes(char* str, uint8_t* buf, int len);\nextern void printHex(uint8_t* buf, int len);\nextern void debug_hex(uint8_t* buf, int len);\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5/eth_arch.h",
    "content": "/* Copyright (C) 2012 mbed.org, MIT License\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this software\n * and associated documentation files (the \"Software\"), to deal in the Software without restriction,\n * including without limitation the rights to use, copy, modify, merge, publish, distribute,\n * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies or\n * substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING\n * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n */\n\n#pragma once\n\n#if defined(TARGET_WIZwiki_W7500) || defined(TARGET_WIZwiki_W7500ECO)\n\n#include \"W7500x_toe.h\"\n#define __DEF_USED_IC101AG__  //For using IC+101AG@WIZwiki-W7500\n\n#elif defined(TARGET_WIZwiki_W7500P)\n\n#include \"W7500x_toe.h\"\n\n#else\n#include \"W5500.h\"            // W5500 Ethernet Shield \n//#define USE_WIZ550IO_MAC    // WIZ550io; using the MAC address\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/WIZnetInterface-OS5.lib",
    "content": "http://os.mbed.com/teams/WIZnet/code/WIZnetInterface-OS5/#d4c8fe4d9b29d4e5614620b0820a49d31087b512"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/configuration.h",
    "content": "#ifndef CONFIGURATION_H\n#define CONFIGURATION_H\n\n#define PRU_BASEFREQ    \t40000 //24000   // PRU Base thread ISR update frequency (hz)\n#define PRU_SERVOFREQ       1000            // PRU Servo thread ISR update freqency (hz)\n#define OVERSAMPLE          3\n#define SWBAUDRATE          19200           // Software serial baud rate\n#define PRU_COMMSFREQ       (SWBAUDRATE * OVERSAMPLE)\n\n#define STEPBIT     \t\t22            \t// bit location in DDS accum\n#define STEP_MASK   \t\t  (1L<<STEPBIT)\n\n#define JSON_BUFF_SIZE\t    10000\t\t\t// Jason dynamic buffer size\n\n#define JOINTS\t\t\t    8\t\t\t\t// Number of joints - set this the same as LinuxCNC HAL compenent. Max 8 joints\n#define VARIABLES           6             \t// Number of command values - set this the same as the LinuxCNC HAL compenent\n\n#define PRU_DATA\t\t    0x64617461 \t    // \"data\" SPI payload\n#define PRU_READ            0x72656164      // \"read\" SPI payload\n#define PRU_WRITE           0x77726974      // \"writ\" SPI payload\n#define PRU_ESTOP           0x65737470      // \"estp\" SPI payload\n\n\n// Serial configuration\n#define TXD0                P0_2            // MBED pin number\n#define RXD0                P0_3\n#define PC_BAUD             115200          // UART baudrate\n\n\n#define LOOP_TIME           0.1\n#define SPI_ERR_MAX         5\n// PRU reset will occur in SPI_ERR_MAX * LOOP_TIME = 0.5sec\n\n// SPI configuration\n#define SPI_BUFF_SIZE \t\t64            \t// Size of SPI recieve buffer - same as HAL component, 64\n\n#define MOSI0               P0_18           // RPi SPI\n#define MISO0               P0_17\n#define SCK0                P0_15\n#define SSEL0               P0_16\n\n//#define MOSI1               P0_9            // SD card\n//#define MISO1               P0_8\n//#define SCK1                P0_7\n//#define SSEL1               P0_6\n\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/custom_targets.json",
    "content": "{\n    \"SKRV1_4\": {\n        \"inherits\": [\"LPC1768\"]\n    },\n    \"SKRV1_4_TURBO\": {\n        \"inherits\": [\"SKRV1_4\"],\n        \"device_name\": \"LPC1769\"\n    },\n    \"SKRV2\": {\n        \"inherits\": [\"FAMILY_STM32\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F407\",\n            \"STM32F407xG\",\n            \"STM32F407VG\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n        \"config\": {\n            \"clock_source\": {\n                \"help\": \"Mask value : USE_PLL_HSE_EXTC (need HW patch) | USE_PLL_HSE_XTAL | USE_PLL_HSI\",\n                \"value\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\",\n                \"macro_name\": \"CLOCK_SOURCE\"\n            }\n        },\n        \"overrides\": { \"lse_available\": 0 },\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"FLASH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F407VGTx\",\n        \"bootloader_supported\": true\n    },\n    \"OCTOPUS_429\": {\n        \"inherits\": [\"FAMILY_STM32\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F429\",\n            \"STM32F429xI\",\n            \"STM32F429ZI\"\n          \n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n        \"config\": {\n            \"clock_source\": {\n                \"help\": \"Mask value : USE_PLL_HSE_EXTC (need HW patch) | USE_PLL_HSE_XTAL | USE_PLL_HSI\",\n                \"value\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\",\n                \"macro_name\": \"CLOCK_SOURCE\"\n            }\n        },\n        \"overrides\": { \"lse_available\": 0 },\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"FLASH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F429ZI\",\n        \"bootloader_supported\": true\n    },\n    \"OCTOPUS_446\": {\n        \"inherits\": [\"FAMILY_STM32\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\", \n            \"STM32F446xE\", \n            \"STM32F446ZE\"],\n        \"config\": {\n            \"clock_source\": {\n                \"help\": \"Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL (need HW patch) | USE_PLL_HSI\",\n                \"value\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\",\n                \"macro_name\": \"CLOCK_SOURCE\"\n            },\n            \"usb_speed\": {\n                \"help\": \"USE_USB_OTG_FS or USE_USB_OTG_HS or USE_USB_HS_IN_FS\",\n                \"value\": \"USE_USB_OTG_FS\"\n            },\n            \"hse_value\": {\n                \"help\": \"HSE via 12MHz xtal\",\n                \"value\": \"12000000\",\n                \"macro_name\": \"HSE_VALUE\"\n            }\n        },\n        \"overrides\": {\n               \"lse_available\": 0\n        \n        },\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"FLASH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F446ZE\"\n    },\n\n    \"BLACK_F407VE\": {\n        \"inherits\": [\"ARCH_MAX\"]\n    },\n    \"ROBIN_E3\": {\n        \"inherits\": [\"FAMILY_STM32\"],\n        \"core\": \"Cortex-M3\",\n        \"extra_labels_add\": [\n            \"STM32F1\", \n            \"STM32F103xC\", \n            \"STM32F103RC\"\n        ],\n        \"supported_toolchains\": [\"ARMC6\"],\n        \"config\": {\n            \"clock_source\": {\n                \"help\": \"Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL | USE_PLL_HSI\",\n                \"value\": \"USE_PLL_HSE_EXTC|USE_PLL_HSE_XTAL|USE_PLL_HSI\",\n                \"macro_name\": \"CLOCK_SOURCE\"\n            }\n        },\n        \"device_has_add\": [\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"FLASH\",\n            \"CRC\",\n            \"SD\",\n            \"PWM\"\n        ],\n        \"device_has_remove\": [\"LPTICKER\"],\n        \"overrides\": {\n            \"tickless-from-us-ticker\": true\n        },\n        \"device_name\": \"STM32F103RC\",\n\t\t\"bootloader_supported\": true\n    },\n    \"SKR_MINI_E3\": {\n        \"inherits\": [\"FAMILY_STM32\"],\n        \"core\": \"Cortex-M3\",\n        \"extra_labels_add\": [\n            \"STM32F1\", \n            \"STM32F103xC\", \n            \"STM32F103RC\"\n        ],\n        \"supported_toolchains\": [\"ARMC6\"],\n        \"config\": {\n            \"clock_source\": {\n                \"help\": \"Mask value : USE_PLL_HSE_EXTC | USE_PLL_HSE_XTAL | USE_PLL_HSI\",\n                \"value\": \"USE_PLL_HSE_EXTC|USE_PLL_HSE_XTAL|USE_PLL_HSI\",\n                \"macro_name\": \"CLOCK_SOURCE\"\n            }\n        },\n        \"device_has_add\": [\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"FLASH\",\n            \"CRC\",\n            \"SD\",\n            \"PWM\"\n        ],\n        \"device_has_remove\": [\"LPTICKER\"],\n        \"overrides\": {\n            \"tickless-from-us-ticker\": true\n        },\n        \"device_name\": \"STM32F103RC\",\n\t\t\"bootloader_supported\": true\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/drivers/softPwm/softPwm.cpp",
    "content": "#include \"softPwm.h\"\n\n#include <algorithm>\n\n#define confine(value, min, max) (((value) < (min))?(min):(((value) > (max))?(max):(value)))\n#define PID_PWM_MAX 256\t\t// 8 bit resolution\n\nusing namespace std;\n\nSoftPWM::SoftPWM(std::string pin) :\n\tpin(pin),\n\tpwmMax(PID_PWM_MAX-1),\n\tpwmSP(0),\n\tSDaccumulator(0),\n\tSDdirection(false)\n{\n\tthis->pwmPin = new Pin(this->pin, OUTPUT);\n}\n\n\nvoid SoftPWM::setMaxPwm(int pwmMax)\n{\n\tthis->pwmMax = confine(pwmMax, 0, PID_PWM_MAX-1);\n}\n\n\nvoid SoftPWM::setPwmSP(int newPwmSP)\n{\n\tthis->pwmSP = newPwmSP; //confine(newPwmSP, 0, pwmMax);\n}\n\n\nvoid SoftPWM::update()\n{\n\t// Use the standard Moudle interface\n\n\tif ((this->pwmSP < 0) || this->pwmSP >= PID_PWM_MAX)\n\t{\n        return;\n    }\n    else if (this->pwmSP == 0)\n\t{\n\t\tthis->pwmPin->set(false);\n        return;\n    }\n    else if (this->pwmSP == PID_PWM_MAX-1)\n\t{\n\t\tthis->pwmPin->set(true);\n        return;\n    }\n\n\n    // this line should never actually do anything, it's just a sanity check in case our accumulator gets corrupted somehow.\n    // If we didn't check and the accumulator is corrupted, we could leave a heater on for quite a long time\n    // the accumulator is kept within these limits by the normal operation of the Sigma-Delta algorithm\n\n    SDaccumulator = confine(SDaccumulator, -PID_PWM_MAX, PID_PWM_MAX << 1);\n\n    // when SDdirection == false, our output is 0 and our accumulator is increasing by pwmSP\n    if (this->SDdirection == false)\n    {\n        // increment accumulator\n        this->SDaccumulator += this->pwmSP;\n        // if we've reached half of max, flip our direction\n        if (this->SDaccumulator >= (PID_PWM_MAX >> 1))\n            this->SDdirection = true;\n    }\n    // when SDdirection == true, our output is 1 and our accumulator is decreasing by (maxPwm - pwmSP)\n    else\n    {\n        // decrement accumulator\n        this->SDaccumulator -= (PID_PWM_MAX - this->pwmSP);\n        // if we've reached 0, flip our direction\n        if (this->SDaccumulator <= 0)\n            this->SDdirection = false;\n    }\n\n\tthis->pwmPin->set(this->SDdirection);\n\n    return;\n}\n\nvoid SoftPWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/drivers/softPwm/softPwm.h",
    "content": "#ifndef SOFTPWM_H\n#define SOFTPWM_H\n\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass SoftPWM : public Module\n{\n\tprivate:\n\n\t\tstd::string pin;\t\t\t// PWM output pin\n\t\tint pwmMax;\t\t\t\t\t\t// maximum PWM output: 8 bit resolution (ie 0 to 255)\n\t\tint pwmSP;\t\t\t\t\t\t// PWM setpoint as a percentage of maxPwm\n\t\tint SDaccumulator;\t\t// Sigma-Delta accumulator\n\t\tbool SDdirection;\t\t\t// direction the SD accumulator is being updated\n\n\t\tPin* pwmPin;\t\t\t\t\t// pin object\n\n\tpublic:\n\n\t\tSoftPWM(std::string);\t\t\t\t\t// constructor\n\n\t\tvoid setMaxPwm(int pwmMax);\n\t\tvoid setPwmSP(int newPwmSP);\n\n\t\tvirtual void update(void);           // Module default interface\n\t\tvirtual void slowUpdate(void);           // Module default interface\n};\n\n#endif\n\n\n/*\n\t The following is taken from Smoothieware...\n\n     * Sigma-Delta PWM algorithm\n     *\n     * This Sigma-Delta implementation works by increasing _sd_accumulator by _pwm until we reach _half_ of max,\n     * then decreasing by (max - target_pwm) until we hit zero\n     *\n     * While we're increasing, the output is 0 and while we're decreasing the output is 1\n     *\n     * For example, with pwm=128 and a max of 256, we'll see the following pattern:\n     * ACC  ADD OUT\n     *   0  128   1 // after the add, we hit 256/2 = 128 so we change direction\n     * 128 -128   0 // after the add, we hit 0 so we change direction again\n     *   0  128   1\n     * 128 -128   0\n     *  as expected\n     *\n     * with a pwm value of 192 (75%) we'll see this:\n     *  ACC  ADD OUT\n     *    0  192   0 // after the add, we are beyond max/2 so we change direction\n     *  192  -64   1 // haven't reached 0 yet\n     *  128  -64   1 // haven't reached 0 yet\n     *   64  -64   1 // after this add we reach 0, and change direction\n     *    0  192   0\n     *  192  -64   1\n     *  128  -64   1\n     *   64  -64   1\n     *    0  192   0\n     * etcetera\n     *\n     * with a pwm value of 75 (about 29%) we'll see this pattern:\n     *  ACC  ADD OUT\n     *    0   75   0\n     *   75   75   0\n     *  150 -181   1\n     *  -31   75   0\n     *   44   75   0\n     *  119   75   0\n     *  194 -181   1\n     *   13 -181   1\n     * -168   75   0\n     *  -93   75   0\n     *  -18   75   0\n     *   57   75   0\n     *  132 -181   1\n     *  -49   75   0\n     *   26   75   0\n     *  101   75   0\n     *  176 -181   1\n     *   -5   75   0\n     *   70   75   0\n     *  145 -181   1\n     *  -36   75   0\n     * etcetera. This pattern has 6 '1's over a total of 21 lines which is on 28.57% of the time. If we let it run longer, it would get closer to the target as time went on\n     */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/extern.h",
    "content": "#ifndef EXTERN_H\n#define EXTERN_H\n\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"ArduinoJson.h\"\n#include \"pruThread.h\"\n\nextern uint32_t base_freq;\nextern uint32_t servo_freq;\n\nextern JsonObject module;\n\nextern volatile bool PRUreset;\n\n// unions for RX and TX data\nextern volatile rxData_t rxData;\nextern volatile txData_t txData;\n\n// pointers to objects with global scope\nextern pruThread* baseThread;\nextern pruThread* servoThread;\nextern pruThread* commsThread;\n\n// pointers to data\nextern volatile rxData_t*  ptrRxData;\nextern volatile txData_t*  ptrTxData;\nextern volatile int32_t*   ptrTxHeader;  \nextern volatile bool*      ptrPRUreset;\nextern volatile int32_t*   ptrJointFreqCmd[JOINTS];\nextern volatile int32_t*   ptrJointFeedback[JOINTS];\nextern volatile uint8_t*   ptrJointEnable;\nextern volatile float*     ptrSetPoint[VARIABLES];\nextern volatile float*     ptrProcessVariable[VARIABLES];\nextern volatile uint16_t*   ptrInputs;\nextern volatile uint16_t*   ptrOutputs;\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ArrayFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Collection/CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) {\n  return arr ? arr->add(pool) : 0;\n}\n\ntemplate <typename Visitor>\ninline void arrayAccept(const CollectionData *arr, Visitor &visitor) {\n  if (arr)\n    visitor.visitArray(*arr);\n  else\n    visitor.visitNull();\n}\n\ninline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) {\n  if (lhs == rhs) return true;\n  if (!lhs || !rhs) return false;\n\n  return lhs->equalsArray(*rhs);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ArrayImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Object/ObjectRef.hpp\"\n#include \"ArrayRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TArray>\ninline ArrayRef ArrayShortcuts<TArray>::createNestedArray() const {\n  return impl()->addElement().template to<ArrayRef>();\n}\n\ntemplate <typename TArray>\ninline ObjectRef ArrayShortcuts<TArray>::createNestedObject() const {\n  return impl()->addElement().template to<ObjectRef>();\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ArrayIterator.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/SlotFunctions.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass VariantPtr {\n public:\n  VariantPtr(MemoryPool *pool, VariantData *data) : _variant(pool, data) {}\n\n  VariantRef *operator->() {\n    return &_variant;\n  }\n\n  VariantRef &operator*() {\n    return _variant;\n  }\n\n private:\n  VariantRef _variant;\n};\n\nclass ArrayIterator {\n public:\n  ArrayIterator() : _slot(0) {}\n  explicit ArrayIterator(MemoryPool *pool, VariantSlot *slot)\n      : _pool(pool), _slot(slot) {}\n\n  VariantRef operator*() const {\n    return VariantRef(_pool, _slot->data());\n  }\n  VariantPtr operator->() {\n    return VariantPtr(_pool, _slot->data());\n  }\n\n  bool operator==(const ArrayIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ArrayIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ArrayIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ArrayIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  MemoryPool *_pool;\n  VariantSlot *_slot;\n};\n\nclass VariantConstPtr {\n public:\n  VariantConstPtr(const VariantData *data) : _variant(data) {}\n\n  VariantConstRef *operator->() {\n    return &_variant;\n  }\n\n  VariantConstRef &operator*() {\n    return _variant;\n  }\n\n private:\n  VariantConstRef _variant;\n};\n\nclass ArrayConstRefIterator {\n public:\n  ArrayConstRefIterator() : _slot(0) {}\n  explicit ArrayConstRefIterator(const VariantSlot *slot) : _slot(slot) {}\n\n  VariantConstRef operator*() const {\n    return VariantConstRef(_slot->data());\n  }\n  VariantConstPtr operator->() {\n    return VariantConstPtr(_slot->data());\n  }\n\n  bool operator==(const ArrayConstRefIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ArrayConstRefIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ArrayConstRefIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ArrayConstRefIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  const VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  const VariantSlot *_slot;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ArrayRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantData.hpp\"\n#include \"ArrayFunctions.hpp\"\n#include \"ArrayIterator.hpp\"\n\n// Returns the size (in bytes) of an array with n elements.\n// Can be very handy to determine the size of a StaticMemoryPool.\n#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \\\n  ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot))\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ObjectRef;\ntemplate <typename>\nclass ElementProxy;\n\ntemplate <typename TData>\nclass ArrayRefBase {\n public:\n  operator VariantConstRef() const {\n    const void* data = _data;  // prevent warning cast-align\n    return VariantConstRef(reinterpret_cast<const VariantData*>(data));\n  }\n\n  template <typename Visitor>\n  FORCE_INLINE void accept(Visitor& visitor) const {\n    arrayAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return _data == 0;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  FORCE_INLINE size_t size() const {\n    return _data ? _data->size() : 0;\n  }\n\n protected:\n  ArrayRefBase(TData* data) : _data(data) {}\n  TData* _data;\n};\n\nclass ArrayConstRef : public ArrayRefBase<const CollectionData>,\n                      public Visitable {\n  friend class ArrayRef;\n  typedef ArrayRefBase<const CollectionData> base_type;\n\n public:\n  typedef ArrayConstRefIterator iterator;\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  FORCE_INLINE ArrayConstRef() : base_type(0) {}\n  FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {}\n\n  FORCE_INLINE bool operator==(ArrayConstRef rhs) const {\n    return arrayEquals(_data, rhs._data);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const {\n    return getElement(index);\n  }\n\n  FORCE_INLINE VariantConstRef getElement(size_t index) const {\n    return VariantConstRef(_data ? _data->get(index) : 0);\n  }\n};\n\nclass ArrayRef : public ArrayRefBase<CollectionData>,\n                 public ArrayShortcuts<ArrayRef>,\n                 public Visitable {\n  typedef ArrayRefBase<CollectionData> base_type;\n\n public:\n  typedef ArrayIterator iterator;\n\n  FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {}\n  FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data)\n      : base_type(data), _pool(pool) {}\n\n  operator VariantRef() {\n    void* data = _data;  // prevent warning cast-align\n    return VariantRef(_pool, reinterpret_cast<VariantData*>(data));\n  }\n\n  operator ArrayConstRef() const {\n    return ArrayConstRef(_data);\n  }\n\n  VariantRef addElement() const {\n    return VariantRef(_pool, arrayAdd(_data, _pool));\n  }\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_pool, _data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  // Copy a ArrayRef\n  FORCE_INLINE bool set(ArrayConstRef src) const {\n    if (!_data || !src._data) return false;\n    return _data->copyFrom(*src._data, _pool);\n  }\n\n  FORCE_INLINE bool operator==(ArrayRef rhs) const {\n    return arrayEquals(_data, rhs._data);\n  }\n\n  // Gets the value at the specified index.\n  FORCE_INLINE VariantRef getElement(size_t index) const {\n    return VariantRef(_pool, _data ? _data->get(index) : 0);\n  }\n\n  // Removes element at specified position.\n  FORCE_INLINE void remove(iterator it) const {\n    if (!_data) return;\n    _data->remove(it.internal());\n  }\n\n  // Removes element at specified index.\n  FORCE_INLINE void remove(size_t index) const {\n    if (!_data) return;\n    _data->remove(index);\n  }\n\n private:\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ArrayShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n// Forward declarations.\ntemplate <typename>\nclass ElementProxy;\n\ntemplate <typename TArray>\nclass ArrayShortcuts {\n public:\n  // Returns the element at specified index if the variant is an array.\n  FORCE_INLINE ElementProxy<const TArray &> operator[](size_t index) const;\n\n  FORCE_INLINE ObjectRef createNestedObject() const;\n\n  FORCE_INLINE ArrayRef createNestedArray() const;\n\n  // Adds the specified value at the end of the array.\n  //\n  // bool add(TValue);\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ObjectRef\n  template <typename T>\n  FORCE_INLINE bool add(const T &value) const {\n    return impl()->addElement().set(value);\n  }\n  //\n  // bool add(TValue);\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename T>\n  FORCE_INLINE bool add(T *value) const {\n    return impl()->addElement().set(value);\n  }\n\n private:\n  const TArray *impl() const {\n    return static_cast<const TArray *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/ElementProxy.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4522)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TArray>\nclass ElementProxy : public VariantOperators<ElementProxy<TArray> >,\n                     public Visitable {\n  typedef ElementProxy<TArray> this_type;\n\n public:\n  FORCE_INLINE ElementProxy(TArray array, size_t index)\n      : _array(array), _index(index) {}\n\n  FORCE_INLINE this_type& operator=(const this_type& src) {\n    getUpstreamElement().set(src.as<VariantConstRef>());\n    return *this;\n  }\n\n  // Replaces the value\n  //\n  // operator=(const TValue&)\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ArrayRef, ObjectRef\n  template <typename T>\n  FORCE_INLINE this_type& operator=(const T& src) {\n    getUpstreamElement().set(src);\n    return *this;\n  }\n  //\n  // operator=(TValue)\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename T>\n  FORCE_INLINE this_type& operator=(T* src) {\n    getUpstreamElement().set(src);\n    return *this;\n  }\n\n  FORCE_INLINE void clear() const {\n    getUpstreamElement().clear();\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return getUpstreamElement().isNull();\n  }\n\n  template <typename T>\n  FORCE_INLINE typename VariantAs<T>::type as() const {\n    return getUpstreamElement().template as<T>();\n  }\n\n  template <typename T>\n  FORCE_INLINE bool is() const {\n    return getUpstreamElement().template is<T>();\n  }\n\n  template <typename T>\n  FORCE_INLINE typename VariantTo<T>::type to() const {\n    return getUpstreamElement().template to<T>();\n  }\n\n  // Replaces the value\n  //\n  // bool set(const TValue&)\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ArrayRef, ObjectRef\n  template <typename TValue>\n  FORCE_INLINE bool set(const TValue& value) const {\n    return getUpstreamElement().set(value);\n  }\n  //\n  // bool set(TValue)\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename TValue>\n  FORCE_INLINE bool set(TValue* value) const {\n    return getUpstreamElement().set(value);\n  }\n\n  template <typename Visitor>\n  void accept(Visitor& visitor) const {\n    return getUpstreamElement().accept(visitor);\n  }\n\n  FORCE_INLINE size_t size() const {\n    return getUpstreamElement().size();\n  }\n\n  template <typename TNestedKey>\n  VariantRef getMember(TNestedKey* key) const {\n    return getUpstreamElement().getMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getMember(const TNestedKey& key) const {\n    return getUpstreamElement().getMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getOrAddMember(TNestedKey* key) const {\n    return getUpstreamElement().getOrAddMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getOrAddMember(const TNestedKey& key) const {\n    return getUpstreamElement().getOrAddMember(key);\n  }\n\n  VariantRef addElement() const {\n    return getUpstreamElement().addElement();\n  }\n\n  VariantRef getElement(size_t index) const {\n    return getUpstreamElement().getElement(index);\n  }\n\n  FORCE_INLINE void remove(size_t index) const {\n    getUpstreamElement().remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(\n      TChar* key) const {\n    getUpstreamElement().remove(key);\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString& key) const {\n    getUpstreamElement().remove(key);\n  }\n\n private:\n  FORCE_INLINE VariantRef getUpstreamElement() const {\n    return _array.getElement(_index);\n  }\n\n  TArray _array;\n  const size_t _index;\n};\n\ntemplate <typename TArray>\ninline ElementProxy<const TArray&> ArrayShortcuts<TArray>::operator[](\n    size_t index) const {\n  return ElementProxy<const TArray&>(*impl(), index);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Array/Utilities.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ArrayRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Copy a 1D array to a JsonArray\ntemplate <typename T, size_t N>\ninline bool copyArray(T (&src)[N], ArrayRef dst) {\n  return copyArray(src, N, dst);\n}\n\n// Copy a 1D array to a JsonArray\ntemplate <typename T>\ninline bool copyArray(T* src, size_t len, ArrayRef dst) {\n  bool ok = true;\n  for (size_t i = 0; i < len; i++) {\n    ok &= dst.add(src[i]);\n  }\n  return ok;\n}\n\n// Copy a 2D array to a JsonArray\ntemplate <typename T, size_t N1, size_t N2>\ninline bool copyArray(T (&src)[N1][N2], ArrayRef dst) {\n  bool ok = true;\n  for (size_t i = 0; i < N1; i++) {\n    ArrayRef nestedArray = dst.createNestedArray();\n    for (size_t j = 0; j < N2; j++) {\n      ok &= nestedArray.add(src[i][j]);\n    }\n  }\n  return ok;\n}\n\n// Copy a JsonArray to a 1D array\ntemplate <typename T, size_t N>\ninline size_t copyArray(ArrayConstRef src, T (&dst)[N]) {\n  return copyArray(src, dst, N);\n}\n\n// Copy a JsonArray to a 1D array\ntemplate <typename T>\ninline size_t copyArray(ArrayConstRef src, T* dst, size_t len) {\n  size_t i = 0;\n  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < len;\n       ++it)\n    dst[i++] = *it;\n  return i;\n}\n\n// Copy a JsonArray to a 2D array\ntemplate <typename T, size_t N1, size_t N2>\ninline void copyArray(ArrayConstRef src, T (&dst)[N1][N2]) {\n  size_t i = 0;\n  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < N1;\n       ++it) {\n    copyArray(it->as<ArrayConstRef>(), dst[i++]);\n  }\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Collection/CollectionData.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass MemoryPool;\nclass VariantData;\nclass VariantSlot;\n\nclass CollectionData {\n  VariantSlot *_head;\n  VariantSlot *_tail;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n  VariantSlot *addSlot(MemoryPool *);\n\n  VariantData *add(MemoryPool *pool);\n\n  template <typename TAdaptedString>\n  VariantData *add(TAdaptedString key, MemoryPool *pool);\n\n  void clear();\n\n  template <typename TAdaptedString>\n  bool containsKey(const TAdaptedString &key) const;\n\n  bool copyFrom(const CollectionData &src, MemoryPool *pool);\n\n  bool equalsArray(const CollectionData &other) const;\n  bool equalsObject(const CollectionData &other) const;\n\n  VariantData *get(size_t index) const;\n\n  template <typename TAdaptedString>\n  VariantData *get(TAdaptedString key) const;\n\n  VariantSlot *head() const {\n    return _head;\n  }\n\n  void remove(size_t index);\n\n  template <typename TAdaptedString>\n  void remove(TAdaptedString key) {\n    remove(getSlot(key));\n  }\n\n  void remove(VariantSlot *slot);\n\n  size_t memoryUsage() const;\n  size_t nesting() const;\n  size_t size() const;\n\n private:\n  VariantSlot *getSlot(size_t index) const;\n\n  template <typename TAdaptedString>\n  VariantSlot *getSlot(TAdaptedString key) const;\n\n  VariantSlot *getPreviousSlot(VariantSlot *) const;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Collection/CollectionImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantData.hpp\"\n#include \"CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline VariantSlot* CollectionData::addSlot(MemoryPool* pool) {\n  VariantSlot* slot = pool->allocVariant();\n  if (!slot) return 0;\n\n  if (_tail) {\n    _tail->setNextNotNull(slot);\n    _tail = slot;\n  } else {\n    _head = slot;\n    _tail = slot;\n  }\n\n  slot->clear();\n  return slot;\n}\n\ninline VariantData* CollectionData::add(MemoryPool* pool) {\n  return slotData(addSlot(pool));\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData* CollectionData::add(TAdaptedString key, MemoryPool* pool) {\n  VariantSlot* slot = addSlot(pool);\n  if (!slotSetKey(slot, key, pool)) return 0;\n  return slot->data();\n}\n\ninline void CollectionData::clear() {\n  _head = 0;\n  _tail = 0;\n}\n\ntemplate <typename TAdaptedString>\ninline bool CollectionData::containsKey(const TAdaptedString& key) const {\n  return getSlot(key) != 0;\n}\n\ninline bool CollectionData::copyFrom(const CollectionData& src,\n                                     MemoryPool* pool) {\n  clear();\n  for (VariantSlot* s = src._head; s; s = s->next()) {\n    VariantData* var;\n    if (s->key() != 0) {\n      if (s->ownsKey())\n        var = add(RamStringAdapter(s->key()), pool);\n      else\n        var = add(ConstRamStringAdapter(s->key()), pool);\n    } else {\n      var = add(pool);\n    }\n    if (!var) return false;\n    if (!var->copyFrom(*s->data(), pool)) return false;\n  }\n  return true;\n}\n\ninline bool CollectionData::equalsObject(const CollectionData& other) const {\n  size_t count = 0;\n  for (VariantSlot* slot = _head; slot; slot = slot->next()) {\n    VariantData* v1 = slot->data();\n    VariantData* v2 = other.get(adaptString(slot->key()));\n    if (!variantEquals(v1, v2)) return false;\n    count++;\n  }\n  return count == other.size();\n}\n\ninline bool CollectionData::equalsArray(const CollectionData& other) const {\n  VariantSlot* s1 = _head;\n  VariantSlot* s2 = other._head;\n  for (;;) {\n    if (s1 == s2) return true;\n    if (!s1 || !s2) return false;\n    if (!variantEquals(s1->data(), s2->data())) return false;\n    s1 = s1->next();\n    s2 = s2->next();\n  }\n}\n\ntemplate <typename TAdaptedString>\ninline VariantSlot* CollectionData::getSlot(TAdaptedString key) const {\n  VariantSlot* slot = _head;\n  while (slot) {\n    if (key.equals(slot->key())) break;\n    slot = slot->next();\n  }\n  return slot;\n}\n\ninline VariantSlot* CollectionData::getSlot(size_t index) const {\n  return _head->next(index);\n}\n\ninline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const {\n  VariantSlot* current = _head;\n  while (current) {\n    VariantSlot* next = current->next();\n    if (next == target) return current;\n    current = next;\n  }\n  return 0;\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData* CollectionData::get(TAdaptedString key) const {\n  VariantSlot* slot = getSlot(key);\n  return slot ? slot->data() : 0;\n}\n\ninline VariantData* CollectionData::get(size_t index) const {\n  VariantSlot* slot = getSlot(index);\n  return slot ? slot->data() : 0;\n}\n\ninline void CollectionData::remove(VariantSlot* slot) {\n  if (!slot) return;\n  VariantSlot* prev = getPreviousSlot(slot);\n  VariantSlot* next = slot->next();\n  if (prev)\n    prev->setNext(next);\n  else\n    _head = next;\n  if (!next) _tail = prev;\n}\n\ninline void CollectionData::remove(size_t index) {\n  remove(getSlot(index));\n}\n\ninline size_t CollectionData::memoryUsage() const {\n  size_t total = 0;\n  for (VariantSlot* s = _head; s; s = s->next()) {\n    total += sizeof(VariantSlot) + s->data()->memoryUsage();\n    if (s->ownsKey()) total += strlen(s->key()) + 1;\n  }\n  return total;\n}\n\ninline size_t CollectionData::nesting() const {\n  size_t maxChildNesting = 0;\n  for (VariantSlot* s = _head; s; s = s->next()) {\n    size_t childNesting = s->data()->nesting();\n    if (childNesting > maxChildNesting) maxChildNesting = childNesting;\n  }\n  return maxChildNesting + 1;\n}\n\ninline size_t CollectionData::size() const {\n  return slotSize(_head);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Configuration.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if defined(_MSC_VER)\n#define ARDUINOJSON_HAS_INT64 1\n#else\n#define ARDUINOJSON_HAS_INT64 0\n#endif\n\n#if __cplusplus >= 201103L\n#define ARDUINOJSON_HAS_LONG_LONG 1\n#else\n#define ARDUINOJSON_HAS_LONG_LONG 0\n#endif\n\n// Small or big machine?\n#ifndef ARDUINOJSON_EMBEDDED_MODE\n#if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \\\n    defined(__ARMCC_VERSION)\n#define ARDUINOJSON_EMBEDDED_MODE 1\n#else\n#define ARDUINOJSON_EMBEDDED_MODE 0\n#endif\n#endif\n\n#if ARDUINOJSON_EMBEDDED_MODE\n\n// Store floats by default to reduce the memory usage (issue #134)\n#ifndef ARDUINOJSON_USE_DOUBLE\n#define ARDUINOJSON_USE_DOUBLE 0\n#endif\n\n// Store longs by default, because they usually match the size of a float.\n#ifndef ARDUINOJSON_USE_LONG_LONG\n#define ARDUINOJSON_USE_LONG_LONG 0\n#endif\n\n// Embedded systems usually don't have std::string\n#ifndef ARDUINOJSON_ENABLE_STD_STRING\n#define ARDUINOJSON_ENABLE_STD_STRING 0\n#endif\n\n// Embedded systems usually don't have std::stream\n#ifndef ARDUINOJSON_ENABLE_STD_STREAM\n#define ARDUINOJSON_ENABLE_STD_STREAM 0\n#endif\n\n// Limit nesting as the stack is likely to be small\n#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT\n#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10\n#endif\n\n#else  // ARDUINOJSON_EMBEDDED_MODE\n\n// On a computer we have plenty of memory so we can use doubles\n#ifndef ARDUINOJSON_USE_DOUBLE\n#define ARDUINOJSON_USE_DOUBLE 1\n#endif\n\n// Use long long when available\n#ifndef ARDUINOJSON_USE_LONG_LONG\n#if ARDUINOJSON_HAS_LONG_LONG || ARDUINOJSON_HAS_INT64\n#define ARDUINOJSON_USE_LONG_LONG 1\n#else\n#define ARDUINOJSON_USE_LONG_LONG 0\n#endif\n#endif\n\n// On a computer, we can use std::string\n#ifndef ARDUINOJSON_ENABLE_STD_STRING\n#define ARDUINOJSON_ENABLE_STD_STRING 1\n#endif\n\n// On a computer, we can assume std::stream\n#ifndef ARDUINOJSON_ENABLE_STD_STREAM\n#define ARDUINOJSON_ENABLE_STD_STREAM 1\n#endif\n\n// On a computer, the stack is large so we can increase nesting limit\n#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT\n#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50\n#endif\n\n#endif  // ARDUINOJSON_EMBEDDED_MODE\n\n#ifdef ARDUINO\n\n// Enable support for Arduino's String class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING\n#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1\n#endif\n\n// Enable support for Arduino's Stream class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM\n#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1\n#endif\n\n// Enable support for Arduino's Print class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT\n#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 1\n#endif\n\n#else  // ARDUINO\n\n// Enable support for Arduino's String class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING\n#define ARDUINOJSON_ENABLE_ARDUINO_STRING 0\n#endif\n\n// Enable support for Arduino's Stream class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM\n#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0\n#endif\n\n// Enable support for Arduino's Print class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT\n#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 0\n#endif\n\n#endif  // ARDUINO\n\n#ifndef ARDUINOJSON_ENABLE_PROGMEM\n#ifdef PROGMEM\n#define ARDUINOJSON_ENABLE_PROGMEM 1\n#else\n#define ARDUINOJSON_ENABLE_PROGMEM 0\n#endif\n#endif\n\n// Convert unicode escape sequence (\\u0123) to UTF-8\n#ifndef ARDUINOJSON_DECODE_UNICODE\n#define ARDUINOJSON_DECODE_UNICODE 0\n#endif\n\n// Control the exponentiation threshold for big numbers\n// CAUTION: cannot be more that 1e9 !!!!\n#ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD\n#define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7\n#endif\n\n// Control the exponentiation threshold for small numbers\n#ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD\n#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5\n#endif\n\n#ifndef ARDUINOJSON_LITTLE_ENDIAN\n#if defined(_MSC_VER) ||                                                      \\\n    (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \\\n    defined(__LITTLE_ENDIAN__) || defined(__i386) || defined(__x86_64)\n#define ARDUINOJSON_LITTLE_ENDIAN 1\n#else\n#define ARDUINOJSON_LITTLE_ENDIAN 0\n#endif\n#endif\n\n#ifndef ARDUINOJSON_TAB\n#define ARDUINOJSON_TAB \"  \"\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/ArduinoStreamReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STREAM\n\n#include <Stream.h>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct ArduinoStreamReader {\n  Stream& _stream;\n  char _current;\n  bool _ended;\n\n public:\n  explicit ArduinoStreamReader(Stream& stream)\n      : _stream(stream), _current(0), _ended(false) {}\n\n  char read() {\n    // don't use _stream.read() as it ignores the timeout\n    char c = 0;\n    _ended = _stream.readBytes(&c, 1) == 0;\n    return c;\n  }\n\n  bool ended() const {\n    return _ended;\n  }\n};\n\ninline ArduinoStreamReader makeReader(Stream& input) {\n  return ArduinoStreamReader(input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/CharPointerReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass UnsafeCharPointerReader {\n  const char* _ptr;\n\n public:\n  explicit UnsafeCharPointerReader(const char* ptr)\n      : _ptr(ptr ? ptr : reinterpret_cast<const char*>(\"\")) {}\n\n  char read() {\n    return static_cast<char>(*_ptr++);\n  }\n\n  bool ended() const {\n    // we cannot know, that's why it's unsafe\n    return false;\n  }\n};\n\nclass SafeCharPointerReader {\n  const char* _ptr;\n  const char* _end;\n\n public:\n  explicit SafeCharPointerReader(const char* ptr, size_t len)\n      : _ptr(ptr ? ptr : reinterpret_cast<const char*>(\"\")), _end(_ptr + len) {}\n\n  char read() {\n    return static_cast<char>(*_ptr++);\n  }\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n};\n\ntemplate <typename TChar>\ninline UnsafeCharPointerReader makeReader(TChar* input) {\n  return UnsafeCharPointerReader(reinterpret_cast<const char*>(input));\n}\n\ntemplate <typename TChar>\ninline SafeCharPointerReader makeReader(TChar* input, size_t n) {\n  return SafeCharPointerReader(reinterpret_cast<const char*>(input), n);\n}\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\ninline SafeCharPointerReader makeReader(const ::String& input) {\n  return SafeCharPointerReader(input.c_str(), input.length());\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/DeserializationError.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n#include <ostream>\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass DeserializationError {\n  // safe bool idiom\n  typedef void (DeserializationError::*bool_type)() const;\n  void safeBoolHelper() const {}\n\n public:\n  enum Code {\n    Ok,\n    IncompleteInput,\n    InvalidInput,\n    NoMemory,\n    NotSupported,\n    TooDeep\n  };\n\n  DeserializationError() {}\n  DeserializationError(Code c) : _code(c) {}\n\n  // Compare with DeserializationError\n  friend bool operator==(const DeserializationError& lhs,\n                         const DeserializationError& rhs) {\n    return lhs._code == rhs._code;\n  }\n  friend bool operator!=(const DeserializationError& lhs,\n                         const DeserializationError& rhs) {\n    return lhs._code != rhs._code;\n  }\n\n  // Compare with Code\n  friend bool operator==(const DeserializationError& lhs, Code rhs) {\n    return lhs._code == rhs;\n  }\n  friend bool operator==(Code lhs, const DeserializationError& rhs) {\n    return lhs == rhs._code;\n  }\n  friend bool operator!=(const DeserializationError& lhs, Code rhs) {\n    return lhs._code != rhs;\n  }\n  friend bool operator!=(Code lhs, const DeserializationError& rhs) {\n    return lhs != rhs._code;\n  }\n\n  // Behaves like a bool\n  operator bool_type() const {\n    return _code != Ok ? &DeserializationError::safeBoolHelper : 0;\n  }\n  friend bool operator==(bool value, const DeserializationError& err) {\n    return static_cast<bool>(err) == value;\n  }\n  friend bool operator==(const DeserializationError& err, bool value) {\n    return static_cast<bool>(err) == value;\n  }\n  friend bool operator!=(bool value, const DeserializationError& err) {\n    return static_cast<bool>(err) != value;\n  }\n  friend bool operator!=(const DeserializationError& err, bool value) {\n    return static_cast<bool>(err) != value;\n  }\n\n  // Returns internal enum, useful for switch statement\n  Code code() const {\n    return _code;\n  }\n\n  const char* c_str() const {\n    switch (_code) {\n      case Ok:\n        return \"Ok\";\n      case TooDeep:\n        return \"TooDeep\";\n      case NoMemory:\n        return \"NoMemory\";\n      case InvalidInput:\n        return \"InvalidInput\";\n      case IncompleteInput:\n        return \"IncompleteInput\";\n      case NotSupported:\n        return \"NotSupported\";\n      default:\n        return \"???\";\n    }\n  }\n\n private:\n  Code _code;\n};\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ninline std::ostream& operator<<(std::ostream& s,\n                                const DeserializationError& e) {\n  s << e.c_str();\n  return s;\n}\n\ninline std::ostream& operator<<(std::ostream& s, DeserializationError::Code c) {\n  s << DeserializationError(c).c_str();\n  return s;\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/FlashStringReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_PROGMEM\n\nnamespace ARDUINOJSON_NAMESPACE {\nclass UnsafeFlashStringReader {\n  const char* _ptr;\n\n public:\n  explicit UnsafeFlashStringReader(const __FlashStringHelper* ptr)\n      : _ptr(reinterpret_cast<const char*>(ptr)) {}\n\n  char read() {\n    return pgm_read_byte_near(_ptr++);\n  }\n\n  bool ended() const {\n    // this reader cannot detect the end\n    return false;\n  }\n};\n\nclass SafeFlashStringReader {\n  const char* _ptr;\n  const char* _end;\n\n public:\n  explicit SafeFlashStringReader(const __FlashStringHelper* ptr, size_t size)\n      : _ptr(reinterpret_cast<const char*>(ptr)), _end(_ptr + size) {}\n\n  char read() {\n    return pgm_read_byte_near(_ptr++);\n  }\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n};\n\ninline UnsafeFlashStringReader makeReader(const __FlashStringHelper* input) {\n  return UnsafeFlashStringReader(input);\n}\n\ninline SafeFlashStringReader makeReader(const __FlashStringHelper* input,\n                                        size_t size) {\n  return SafeFlashStringReader(input, size);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/IteratorReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TIterator>\nclass IteratorReader {\n  TIterator _ptr, _end;\n\n public:\n  explicit IteratorReader(TIterator begin, TIterator end)\n      : _ptr(begin), _end(end) {}\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n\n  char read() {\n    return char(*_ptr++);\n  }\n};\n\ntemplate <typename TInput>\ninline IteratorReader<typename TInput::const_iterator> makeReader(\n    const TInput& input) {\n  return IteratorReader<typename TInput::const_iterator>(input.begin(),\n                                                         input.end());\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/NestingLimit.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct NestingLimit {\n  NestingLimit() : value(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}\n  explicit NestingLimit(uint8_t n) : value(n) {}\n\n  uint8_t value;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/StdStreamReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n\n#include <istream>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StdStreamReader {\n  std::istream& _stream;\n  char _current;\n\n public:\n  explicit StdStreamReader(std::istream& stream)\n      : _stream(stream), _current(0) {}\n\n  bool ended() const {\n    return _stream.eof();\n  }\n\n  char read() {\n    return static_cast<char>(_stream.get());\n  }\n\n private:\n  StdStreamReader& operator=(const StdStreamReader&);  // Visual Studio C4512\n};\n\ninline StdStreamReader makeReader(std::istream& input) {\n  return StdStreamReader(input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Deserialization/deserialize.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../StringStorage/StringStorage.hpp\"\n#include \"ArduinoStreamReader.hpp\"\n#include \"CharPointerReader.hpp\"\n#include \"DeserializationError.hpp\"\n#include \"FlashStringReader.hpp\"\n#include \"IteratorReader.hpp\"\n#include \"NestingLimit.hpp\"\n#include \"StdStreamReader.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename, typename> class TDeserializer, typename TReader,\n          typename TWriter>\nTDeserializer<TReader, TWriter> makeDeserializer(MemoryPool &pool,\n                                                 TReader reader, TWriter writer,\n                                                 uint8_t nestingLimit) {\n  return TDeserializer<TReader, TWriter>(pool, reader, writer, nestingLimit);\n}\n\n// deserialize(JsonDocument&, const std::string&);\n// deserialize(JsonDocument&, const String&);\ntemplate <template <typename, typename> class TDeserializer, typename TString>\ntypename enable_if<!is_array<TString>::value, DeserializationError>::type\ndeserialize(JsonDocument &doc, const TString &input,\n            NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, char*);\n// deserialize(JsonDocument&, const char*);\n// deserialize(JsonDocument&, const __FlashStringHelper*);\ntemplate <template <typename, typename> class TDeserializer, typename TChar>\nDeserializationError deserialize(JsonDocument &doc, TChar *input,\n                                 NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, char*, size_t);\n// deserialize(JsonDocument&, const char*, size_t);\n// deserialize(JsonDocument&, const __FlashStringHelper*, size_t);\ntemplate <template <typename, typename> class TDeserializer, typename TChar>\nDeserializationError deserialize(JsonDocument &doc, TChar *input,\n                                 size_t inputSize, NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input, inputSize),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, std::istream&);\n// deserialize(JsonDocument&, Stream&);\ntemplate <template <typename, typename> class TDeserializer, typename TStream>\nDeserializationError deserialize(JsonDocument &doc, TStream &input,\n                                 NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Document/BasicJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"JsonDocument.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TAllocator>\nclass AllocatorOwner {\n protected:\n  AllocatorOwner() {}\n  AllocatorOwner(const AllocatorOwner& src) : _allocator(src._allocator) {}\n  AllocatorOwner(TAllocator allocator) : _allocator(allocator) {}\n\n  void* allocate(size_t n) {\n    return _allocator.allocate(n);\n  }\n\n  void deallocate(void* p) {\n    _allocator.deallocate(p);\n  }\n\n private:\n  TAllocator _allocator;\n};\n\ntemplate <typename TAllocator>\nclass BasicJsonDocument : AllocatorOwner<TAllocator>, public JsonDocument {\n public:\n  explicit BasicJsonDocument(size_t capa, TAllocator allocator = TAllocator())\n      : AllocatorOwner<TAllocator>(allocator), JsonDocument(allocPool(capa)) {}\n\n  BasicJsonDocument(const BasicJsonDocument& src)\n      : AllocatorOwner<TAllocator>(src),\n        JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  template <typename T>\n  BasicJsonDocument(const T& src,\n                    typename enable_if<IsVisitable<T>::value>::type* = 0)\n      : JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  // disambiguate\n  BasicJsonDocument(VariantRef src)\n      : JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  ~BasicJsonDocument() {\n    freePool();\n  }\n\n  BasicJsonDocument& operator=(const BasicJsonDocument& src) {\n    reallocPoolIfTooSmall(src.memoryUsage());\n    set(src);\n    return *this;\n  }\n\n  template <typename T>\n  BasicJsonDocument& operator=(const T& src) {\n    reallocPoolIfTooSmall(src.memoryUsage());\n    set(src);\n    return *this;\n  }\n\n private:\n  MemoryPool allocPool(size_t requiredSize) {\n    size_t capa = addPadding(requiredSize);\n    return MemoryPool(reinterpret_cast<char*>(this->allocate(capa)), capa);\n  }\n\n  void reallocPoolIfTooSmall(size_t requiredSize) {\n    if (requiredSize <= capacity()) return;\n    freePool();\n    replacePool(allocPool(addPadding(requiredSize)));\n  }\n\n  void freePool() {\n    this->deallocate(memoryPool().buffer());\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Document/DynamicJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"BasicJsonDocument.hpp\"\n\n#include <stdlib.h>  // malloc, free\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct DefaultAllocator {\n  void* allocate(size_t n) {\n    return malloc(n);\n  }\n\n  void deallocate(void* p) {\n    free(p);\n  }\n};\n\ntypedef BasicJsonDocument<DefaultAllocator> DynamicJsonDocument;\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Document/JsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Object/ObjectRef.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n#include \"../Variant/VariantTo.hpp\"\n\n#include \"../Array/ElementProxy.hpp\"\n#include \"../Object/MemberProxy.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass JsonDocument : public Visitable {\n public:\n  template <typename Visitor>\n  void accept(Visitor& visitor) const {\n    return getVariant().accept(visitor);\n  }\n\n  template <typename T>\n  typename VariantAs<T>::type as() {\n    return getVariant().template as<T>();\n  }\n\n  template <typename T>\n  typename VariantConstAs<T>::type as() const {\n    return getVariant().template as<T>();\n  }\n\n  void clear() {\n    _pool.clear();\n    _data.setNull();\n  }\n\n  template <typename T>\n  bool is() const {\n    return getVariant().template is<T>();\n  }\n\n  bool isNull() const {\n    return getVariant().isNull();\n  }\n\n  size_t memoryUsage() const {\n    return _pool.size();\n  }\n\n  size_t nesting() const {\n    return _data.nesting();\n  }\n\n  size_t capacity() const {\n    return _pool.capacity();\n  }\n\n  size_t size() const {\n    return _data.size();\n  }\n\n  bool set(const JsonDocument& src) {\n    return to<VariantRef>().set(src.as<VariantRef>());\n  }\n\n  template <typename T>\n  typename enable_if<!is_base_of<JsonDocument, T>::value, bool>::type set(\n      const T& src) {\n    return to<VariantRef>().set(src);\n  }\n\n  template <typename T>\n  typename VariantTo<T>::type to() {\n    clear();\n    return getVariant().template to<T>();\n  }\n\n  // for internal use only\n  MemoryPool& memoryPool() {\n    return _pool;\n  }\n\n  VariantData& data() {\n    return _data;\n  }\n\n  ArrayRef createNestedArray() {\n    return addElement().to<ArrayRef>();\n  }\n\n  // createNestedArray(char*)\n  // createNestedArray(const char*)\n  // createNestedArray(const __FlashStringHelper*)\n  template <typename TChar>\n  ArrayRef createNestedArray(TChar* key) {\n    return getOrAddMember(key).template to<ArrayRef>();\n  }\n\n  // createNestedArray(const std::string&)\n  // createNestedArray(const String&)\n  template <typename TString>\n  ArrayRef createNestedArray(const TString& key) {\n    return getOrAddMember(key).template to<ArrayRef>();\n  }\n\n  ObjectRef createNestedObject() {\n    return addElement().to<ObjectRef>();\n  }\n\n  // createNestedObject(char*)\n  // createNestedObject(const char*)\n  // createNestedObject(const __FlashStringHelper*)\n  template <typename TChar>\n  ObjectRef createNestedObject(TChar* key) {\n    return getOrAddMember(key).template to<ObjectRef>();\n  }\n\n  // createNestedObject(const std::string&)\n  // createNestedObject(const String&)\n  template <typename TString>\n  ObjectRef createNestedObject(const TString& key) {\n    return getOrAddMember(key).template to<ObjectRef>();\n  }\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  bool containsKey(TChar* key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  bool containsKey(const TString& key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // operator[](const std::string&)\n  // operator[](const String&)\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value,\n                         MemberProxy<JsonDocument&, const TString&> >::type\n      operator[](const TString& key) {\n    return MemberProxy<JsonDocument&, const TString&>(*this, key);\n  }\n\n  // operator[](char*)\n  // operator[](const char*)\n  // operator[](const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value,\n                                  MemberProxy<JsonDocument&, TChar*> >::type\n  operator[](TChar* key) {\n    return MemberProxy<JsonDocument&, TChar*>(*this, key);\n  }\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString& key) const {\n    return getMember(key);\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar*>::value, VariantConstRef>::type\n      operator[](TChar* key) const {\n    return getMember(key);\n  }\n\n  FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {\n    return ElementProxy<JsonDocument&>(*this, index);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const {\n    return getElement(index);\n  }\n\n  FORCE_INLINE VariantRef getElement(size_t index) {\n    return VariantRef(&_pool, _data.getElement(index));\n  }\n\n  FORCE_INLINE VariantConstRef getElement(size_t index) const {\n    return VariantConstRef(_data.getElement(index));\n  }\n\n  // JsonVariantConst getMember(char*) const\n  // JsonVariantConst getMember(const char*) const\n  // JsonVariantConst getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantConstRef getMember(TChar* key) const {\n    return VariantConstRef(_data.getMember(adaptString(key)));\n  }\n\n  // JsonVariantConst getMember(const std::string&) const\n  // JsonVariantConst getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      getMember(const TString& key) const {\n    return VariantConstRef(_data.getMember(adaptString(key)));\n  }\n\n  // JsonVariant getMember(char*)\n  // JsonVariant getMember(const char*)\n  // JsonVariant getMember(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar* key) {\n    return VariantRef(&_pool, _data.getMember(adaptString(key)));\n  }\n\n  // JsonVariant getMember(const std::string&)\n  // JsonVariant getMember(const String&)\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type\n  getMember(const TString& key) {\n    return VariantRef(&_pool, _data.getMember(adaptString(key)));\n  }\n\n  // getOrAddMember(char*)\n  // getOrAddMember(const char*)\n  // getOrAddMember(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar* key) {\n    return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));\n  }\n\n  // getOrAddMember(const std::string&)\n  // getOrAddMember(const String&)\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString& key) {\n    return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));\n  }\n\n  FORCE_INLINE VariantRef addElement() {\n    return VariantRef(&_pool, _data.addElement(&_pool));\n  }\n\n  template <typename TValue>\n  FORCE_INLINE bool add(const TValue& value) {\n    return addElement().set(value);\n  }\n\n  // add(char*) const\n  // add(const char*) const\n  // add(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool add(TChar* value) {\n    return addElement().set(value);\n  }\n\n  FORCE_INLINE void remove(size_t index) {\n    _data.remove(index);\n  }\n  // remove(char*)\n  // remove(const char*)\n  // remove(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(\n      TChar* key) {\n    _data.remove(adaptString(key));\n  }\n  // remove(const std::string&)\n  // remove(const String&)\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString& key) {\n    _data.remove(adaptString(key));\n  }\n\n protected:\n  JsonDocument(MemoryPool pool) : _pool(pool) {\n    _data.setNull();\n  }\n\n  JsonDocument(char* buf, size_t capa) : _pool(buf, capa) {\n    _data.setNull();\n  }\n\n  void replacePool(MemoryPool pool) {\n    _pool = pool;\n  }\n\n private:\n  VariantRef getVariant() {\n    return VariantRef(&_pool, &_data);\n  }\n\n  VariantConstRef getVariant() const {\n    return VariantConstRef(&_data);\n  }\n\n  MemoryPool _pool;\n  VariantData _data;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Document/StaticJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"JsonDocument.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <size_t desiredCapacity>\nclass StaticJsonDocument : public JsonDocument {\n  static const size_t _capacity =\n      AddPadding<Max<1, desiredCapacity>::value>::value;\n\n public:\n  StaticJsonDocument() : JsonDocument(_buffer, _capacity) {}\n\n  StaticJsonDocument(const StaticJsonDocument& src)\n      : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  template <typename T>\n  StaticJsonDocument(const T& src,\n                     typename enable_if<IsVisitable<T>::value>::type* = 0)\n      : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  // disambiguate\n  StaticJsonDocument(VariantRef src) : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  StaticJsonDocument operator=(const StaticJsonDocument& src) {\n    set(src);\n    return *this;\n  }\n\n  template <typename T>\n  StaticJsonDocument operator=(const T& src) {\n    set(src);\n    return *this;\n  }\n\n private:\n  char _buffer[_capacity];\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/EscapeSequence.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass EscapeSequence {\n public:\n  // Optimized for code size on a 8-bit AVR\n  static char escapeChar(char c) {\n    const char *p = escapeTable(false);\n    while (p[0] && p[1] != c) {\n      p += 2;\n    }\n    return p[0];\n  }\n\n  // Optimized for code size on a 8-bit AVR\n  static char unescapeChar(char c) {\n    const char *p = escapeTable(true);\n    for (;;) {\n      if (p[0] == '\\0') return c;\n      if (p[0] == c) return p[1];\n      p += 2;\n    }\n  }\n\n private:\n  static const char *escapeTable(bool excludeIdenticals) {\n    return &\"\\\"\\\"\\\\\\\\b\\bf\\fn\\nr\\rt\\t\"[excludeIdenticals ? 4 : 0];\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/JsonDeserializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Deserialization/deserialize.hpp\"\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Numbers/parseNumber.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"EscapeSequence.hpp\"\n#include \"Utf8.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TReader, typename TStringStorage>\nclass JsonDeserializer {\n  typedef typename remove_reference<TStringStorage>::type::StringBuilder\n      StringBuilder;\n\n public:\n  JsonDeserializer(MemoryPool &pool, TReader reader,\n                   TStringStorage stringStorage, uint8_t nestingLimit)\n      : _pool(&pool),\n        _reader(reader),\n        _stringStorage(stringStorage),\n        _nestingLimit(nestingLimit),\n        _loaded(false) {}\n  DeserializationError parse(VariantData &variant) {\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    switch (current()) {\n      case '[':\n        return parseArray(variant.toArray());\n\n      case '{':\n        return parseObject(variant.toObject());\n\n      default:\n        return parseValue(variant);\n    }\n  }\n\n private:\n  JsonDeserializer &operator=(const JsonDeserializer &);  // non-copiable\n\n  char current() {\n    if (!_loaded) {\n      if (_reader.ended())\n        _current = 0;\n      else\n        _current = _reader.read();\n      _loaded = true;\n    }\n    return _current;\n  }\n\n  void move() {\n    _loaded = false;\n  }\n\n  FORCE_INLINE bool eat(char charToSkip) {\n    if (current() != charToSkip) return false;\n    move();\n    return true;\n  }\n\n  DeserializationError parseArray(CollectionData &array) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n\n    // Check opening braket\n    if (!eat('[')) return DeserializationError::InvalidInput;\n\n    // Skip spaces\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    // Empty array?\n    if (eat(']')) return DeserializationError::Ok;\n\n    // Read each value\n    for (;;) {\n      // Allocate slot in array\n      VariantData *value = array.add(_pool);\n      if (!value) return DeserializationError::NoMemory;\n\n      // 1 - Parse value\n      _nestingLimit--;\n      err = parse(*value);\n      _nestingLimit++;\n      if (err) return err;\n\n      // 2 - Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n\n      // 3 - More values?\n      if (eat(']')) return DeserializationError::Ok;\n      if (!eat(',')) return DeserializationError::InvalidInput;\n    }\n  }\n\n  DeserializationError parseObject(CollectionData &object) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n\n    // Check opening brace\n    if (!eat('{')) return DeserializationError::InvalidInput;\n\n    // Skip spaces\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    // Empty object?\n    if (eat('}')) return DeserializationError::Ok;\n\n    // Read each key value pair\n    for (;;) {\n      // Allocate slot in object\n      VariantSlot *slot = object.addSlot(_pool);\n      if (!slot) return DeserializationError::NoMemory;\n\n      // Parse key\n      const char *key;\n      err = parseKey(key);\n      if (err) return err;\n      slot->setOwnedKey(make_not_null(key));\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;  // Colon\n      if (!eat(':')) return DeserializationError::InvalidInput;\n\n      // Parse value\n      _nestingLimit--;\n      err = parse(*slot->data());\n      _nestingLimit++;\n      if (err) return err;\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n\n      // More keys/values?\n      if (eat('}')) return DeserializationError::Ok;\n      if (!eat(',')) return DeserializationError::InvalidInput;\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n    }\n  }\n\n  DeserializationError parseValue(VariantData &variant) {\n    if (isQuote(current())) {\n      return parseStringValue(variant);\n    } else {\n      return parseNumericValue(variant);\n    }\n  }\n\n  DeserializationError parseKey(const char *&key) {\n    if (isQuote(current())) {\n      return parseQuotedString(key);\n    } else {\n      return parseNonQuotedString(key);\n    }\n  }\n\n  DeserializationError parseStringValue(VariantData &variant) {\n    const char *value;\n    DeserializationError err = parseQuotedString(value);\n    if (err) return err;\n    variant.setOwnedString(make_not_null(value));\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseQuotedString(const char *&result) {\n    StringBuilder builder = _stringStorage.startString();\n    const char stopChar = current();\n\n    move();\n    for (;;) {\n      char c = current();\n      move();\n      if (c == stopChar) break;\n\n      if (c == '\\0') return DeserializationError::IncompleteInput;\n\n      if (c == '\\\\') {\n        c = current();\n        if (c == '\\0') return DeserializationError::IncompleteInput;\n        if (c == 'u') {\n#if ARDUINOJSON_DECODE_UNICODE\n          uint16_t codepoint;\n          move();\n          DeserializationError err = parseCodepoint(codepoint);\n          if (err) return err;\n          Utf8::encodeCodepoint(codepoint, builder);\n          continue;\n#else\n          return DeserializationError::NotSupported;\n#endif\n        }\n        // replace char\n        c = EscapeSequence::unescapeChar(c);\n        if (c == '\\0') return DeserializationError::InvalidInput;\n        move();\n      }\n\n      builder.append(c);\n    }\n\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseNonQuotedString(const char *&result) {\n    StringBuilder builder = _stringStorage.startString();\n\n    char c = current();\n    if (c == '\\0') return DeserializationError::IncompleteInput;\n\n    if (canBeInNonQuotedString(c)) {  // no quotes\n      do {\n        move();\n        builder.append(c);\n        c = current();\n      } while (canBeInNonQuotedString(c));\n    } else {\n      return DeserializationError::InvalidInput;\n    }\n\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseNumericValue(VariantData &result) {\n    char buffer[64];\n    uint8_t n = 0;\n\n    char c = current();\n    while (canBeInNonQuotedString(c) && n < 63) {\n      move();\n      buffer[n++] = c;\n      c = current();\n    }\n    buffer[n] = 0;\n\n    c = buffer[0];\n    if (c == 't') {  // true\n      result.setBoolean(true);\n      return n == 4 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n    if (c == 'f') {  // false\n      result.setBoolean(false);\n      return n == 5 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n    if (c == 'n') {  // null\n      // the variant is already null\n      return n == 4 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n\n    ParsedNumber<Float, UInt> num = parseNumber<Float, UInt>(buffer);\n\n    switch (num.type()) {\n      case VALUE_IS_NEGATIVE_INTEGER:\n        result.setNegativeInteger(num.uintValue);\n        return DeserializationError::Ok;\n\n      case VALUE_IS_POSITIVE_INTEGER:\n        result.setPositiveInteger(num.uintValue);\n        return DeserializationError::Ok;\n\n      case VALUE_IS_FLOAT:\n        result.setFloat(num.floatValue);\n        return DeserializationError::Ok;\n    }\n\n    return DeserializationError::InvalidInput;\n  }\n\n  DeserializationError parseCodepoint(uint16_t &codepoint) {\n    codepoint = 0;\n    for (uint8_t i = 0; i < 4; ++i) {\n      char digit = current();\n      if (!digit) return DeserializationError::IncompleteInput;\n      uint8_t value = decodeHex(digit);\n      if (value > 0x0F) return DeserializationError::InvalidInput;\n      codepoint = uint16_t((codepoint << 4) | value);\n      move();\n    }\n    return DeserializationError::Ok;\n  }\n\n  static inline bool isBetween(char c, char min, char max) {\n    return min <= c && c <= max;\n  }\n\n  static inline bool canBeInNonQuotedString(char c) {\n    return isBetween(c, '0', '9') || isBetween(c, '_', 'z') ||\n           isBetween(c, 'A', 'Z') || c == '+' || c == '-' || c == '.';\n  }\n\n  static inline bool isQuote(char c) {\n    return c == '\\'' || c == '\\\"';\n  }\n\n  static inline uint8_t decodeHex(char c) {\n    if (c < 'A') return uint8_t(c - '0');\n    c = char(c & ~0x20);  // uppercase\n    return uint8_t(c - 'A' + 10);\n  }\n\n  DeserializationError skipSpacesAndComments() {\n    for (;;) {\n      switch (current()) {\n        // end of string\n        case '\\0':\n          return DeserializationError::IncompleteInput;\n\n        // spaces\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n          move();\n          continue;\n\n        // comments\n        case '/':\n          move();  // skip '/'\n          switch (current()) {\n            // block comment\n            case '*': {\n              move();  // skip '*'\n              bool wasStar = false;\n              for (;;) {\n                char c = current();\n                if (c == '\\0') return DeserializationError::IncompleteInput;\n                if (c == '/' && wasStar) {\n                  move();\n                  break;\n                }\n                wasStar = c == '*';\n                move();\n              }\n              break;\n            }\n\n            // trailing comment\n            case '/':\n              // no need to skip \"//\"\n              for (;;) {\n                move();\n                char c = current();\n                if (c == '\\0') return DeserializationError::IncompleteInput;\n                if (c == '\\n') break;\n              }\n              break;\n\n            // not a comment, just a '/'\n            default:\n              return DeserializationError::InvalidInput;\n          }\n          break;\n\n        default:\n          return DeserializationError::Ok;\n      }\n    }\n  }\n\n  MemoryPool *_pool;\n  TReader _reader;\n  TStringStorage _stringStorage;\n  uint8_t _nestingLimit;\n  char _current;\n  bool _loaded;\n};\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, const TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput *input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput *input, size_t inputSize,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/JsonSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Misc/Visitable.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"TextFormatter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass JsonSerializer {\n public:\n  JsonSerializer(TWriter &writer) : _formatter(writer) {}\n\n  FORCE_INLINE void visitArray(const CollectionData &array) {\n    write('[');\n\n    VariantSlot *slot = array.head();\n\n    while (slot != 0) {\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      if (slot == 0) break;\n\n      write(',');\n    }\n\n    write(']');\n  }\n\n  void visitObject(const CollectionData &object) {\n    write('{');\n\n    VariantSlot *slot = object.head();\n\n    while (slot != 0) {\n      _formatter.writeString(slot->key());\n      write(':');\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      if (slot == 0) break;\n\n      write(',');\n    }\n\n    write('}');\n  }\n\n  void visitFloat(Float value) {\n    _formatter.writeFloat(value);\n  }\n\n  void visitString(const char *value) {\n    _formatter.writeString(value);\n  }\n\n  void visitRawJson(const char *data, size_t n) {\n    _formatter.writeRaw(data, n);\n  }\n\n  void visitNegativeInteger(UInt value) {\n    _formatter.writeNegativeInteger(value);\n  }\n\n  void visitPositiveInteger(UInt value) {\n    _formatter.writePositiveInteger(value);\n  }\n\n  void visitBoolean(bool value) {\n    _formatter.writeBoolean(value);\n  }\n\n  void visitNull() {\n    _formatter.writeRaw(\"null\");\n  }\n\n  size_t bytesWritten() const {\n    return _formatter.bytesWritten();\n  }\n\n protected:\n  void write(char c) {\n    _formatter.writeRaw(c);\n  }\n\n  void write(const char *s) {\n    _formatter.writeRaw(s);\n  }\n\n private:\n  TextFormatter<TWriter> _formatter;\n};\n\ntemplate <typename TSource, typename TDestination>\nsize_t serializeJson(const TSource &source, TDestination &destination) {\n  return serialize<JsonSerializer>(source, destination);\n}\n\ntemplate <typename TSource>\nsize_t serializeJson(const TSource &source, char *buffer, size_t bufferSize) {\n  return serialize<JsonSerializer>(source, buffer, bufferSize);\n}\n\ntemplate <typename TSource>\nsize_t measureJson(const TSource &source) {\n  return measure<JsonSerializer>(source);\n}\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ntemplate <typename T>\ninline typename enable_if<IsVisitable<T>::value, std::ostream &>::type\noperator<<(std::ostream &os, const T &source) {\n  serializeJson(source, os);\n  return os;\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/PrettyJsonSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"JsonSerializer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass PrettyJsonSerializer : public JsonSerializer<TWriter> {\n  typedef JsonSerializer<TWriter> base;\n\n public:\n  PrettyJsonSerializer(TWriter &writer) : base(writer), _nesting(0) {}\n\n  void visitArray(const CollectionData &array) {\n    VariantSlot *slot = array.head();\n    if (!slot) return base::write(\"[]\");\n\n    base::write(\"[\\r\\n\");\n    _nesting++;\n    while (slot != 0) {\n      indent();\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      base::write(slot ? \",\\r\\n\" : \"\\r\\n\");\n    }\n    _nesting--;\n    indent();\n    base::write(\"]\");\n  }\n\n  void visitObject(const CollectionData &object) {\n    VariantSlot *slot = object.head();\n    if (!slot) return base::write(\"{}\");\n\n    base::write(\"{\\r\\n\");\n    _nesting++;\n    while (slot != 0) {\n      indent();\n      base::visitString(slot->key());\n      base::write(\": \");\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      base::write(slot ? \",\\r\\n\" : \"\\r\\n\");\n    }\n    _nesting--;\n    indent();\n    base::write(\"}\");\n  }\n\n private:\n  void indent() {\n    for (uint8_t i = 0; i < _nesting; i++) base::write(ARDUINOJSON_TAB);\n  }\n\n  uint8_t _nesting;\n};\n\ntemplate <typename TSource, typename TDestination>\nsize_t serializeJsonPretty(const TSource &source, TDestination &destination) {\n  return serialize<PrettyJsonSerializer>(source, destination);\n}\n\ntemplate <typename TSource>\nsize_t serializeJsonPretty(const TSource &source, char *buffer,\n                           size_t bufferSize) {\n  return serialize<PrettyJsonSerializer>(source, buffer, bufferSize);\n}\n\ntemplate <typename TSource>\nsize_t measureJsonPretty(const TSource &source) {\n  return measure<PrettyJsonSerializer>(source);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/TextFormatter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stdint.h>\n#include <string.h>  // for strlen\n#include \"../Numbers/FloatParts.hpp\"\n#include \"../Numbers/Integer.hpp\"\n#include \"../Polyfills/attributes.hpp\"\n#include \"EscapeSequence.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass TextFormatter {\n public:\n  explicit TextFormatter(TWriter &writer) : _writer(writer), _length(0) {}\n\n  // Returns the number of bytes sent to the TWriter implementation.\n  size_t bytesWritten() const {\n    return _length;\n  }\n\n  void writeBoolean(bool value) {\n    if (value)\n      writeRaw(\"true\");\n    else\n      writeRaw(\"false\");\n  }\n\n  void writeString(const char *value) {\n    if (!value) {\n      writeRaw(\"null\");\n    } else {\n      writeRaw('\\\"');\n      while (*value) writeChar(*value++);\n      writeRaw('\\\"');\n    }\n  }\n\n  void writeChar(char c) {\n    char specialChar = EscapeSequence::escapeChar(c);\n    if (specialChar) {\n      writeRaw('\\\\');\n      writeRaw(specialChar);\n    } else {\n      writeRaw(c);\n    }\n  }\n\n  template <typename T>\n  void writeFloat(T value) {\n    if (isnan(value)) return writeRaw(\"NaN\");\n\n    if (value < 0.0) {\n      writeRaw('-');\n      value = -value;\n    }\n\n    if (isinf(value)) return writeRaw(\"Infinity\");\n\n    FloatParts<T> parts(value);\n\n    writePositiveInteger(parts.integral);\n    if (parts.decimalPlaces) writeDecimals(parts.decimal, parts.decimalPlaces);\n\n    if (parts.exponent < 0) {\n      writeRaw(\"e-\");\n      writePositiveInteger(-parts.exponent);\n    }\n\n    if (parts.exponent > 0) {\n      writeRaw('e');\n      writePositiveInteger(parts.exponent);\n    }\n  }\n\n  void writeNegativeInteger(UInt value) {\n    writeRaw('-');\n    writePositiveInteger(value);\n  }\n\n  template <typename T>\n  void writePositiveInteger(T value) {\n    char buffer[22];\n    char *end = buffer + sizeof(buffer);\n    char *begin = end;\n\n    // write the string in reverse order\n    do {\n      *--begin = char(value % 10 + '0');\n      value = T(value / 10);\n    } while (value);\n\n    // and dump it in the right order\n    writeRaw(begin, end);\n  }\n\n  void writeDecimals(uint32_t value, int8_t width) {\n    // buffer should be big enough for all digits and the dot\n    char buffer[16];\n    char *end = buffer + sizeof(buffer);\n    char *begin = end;\n\n    // write the string in reverse order\n    while (width--) {\n      *--begin = char(value % 10 + '0');\n      value /= 10;\n    }\n    *--begin = '.';\n\n    // and dump it in the right order\n    writeRaw(begin, end);\n  }\n\n  void writeRaw(const char *s) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), strlen(s));\n  }\n\n  void writeRaw(const char *s, size_t n) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), n);\n  }\n\n  void writeRaw(const char *begin, const char *end) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(begin),\n                             static_cast<size_t>(end - begin));\n  }\n\n  template <size_t N>\n  void writeRaw(const char (&s)[N]) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), N - 1);\n  }\n  void writeRaw(char c) {\n    _length += _writer.write(static_cast<uint8_t>(c));\n  }\n\n protected:\n  TWriter &_writer;\n  size_t _length;\n\n private:\n  TextFormatter &operator=(const TextFormatter &);  // cannot be assigned\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Json/Utf8.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nnamespace Utf8 {\ntemplate <typename TStringBuilder>\ninline void encodeCodepoint(uint16_t codepoint, TStringBuilder &str) {\n  if (codepoint < 0x80) {\n    str.append(char(codepoint));\n    return;\n  }\n\n  if (codepoint >= 0x00000800) {\n    str.append(char(0xe0 /*0b11100000*/ | (codepoint >> 12)));\n    str.append(char(((codepoint >> 6) & 0x3f /*0b00111111*/) | 0x80));\n  } else {\n    str.append(char(0xc0 /*0b11000000*/ | (codepoint >> 6)));\n  }\n  str.append(char((codepoint & 0x3f /*0b00111111*/) | 0x80));\n}\n}  // namespace Utf8\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Memory/Alignment.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline bool isAligned(void *ptr) {\n  const size_t mask = sizeof(void *) - 1;\n  size_t addr = reinterpret_cast<size_t>(ptr);\n  return (addr & mask) == 0;\n}\n\ninline size_t addPadding(size_t bytes) {\n  const size_t mask = sizeof(void *) - 1;\n  return (bytes + mask) & ~mask;\n}\n\ntemplate <size_t bytes>\nstruct AddPadding {\n  static const size_t mask = sizeof(void *) - 1;\n  static const size_t value = (bytes + mask) & ~mask;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Memory/MemoryPool.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/assert.hpp\"\n#include \"../Polyfills/mpl/max.hpp\"\n#include \"../Variant/VariantSlot.hpp\"\n#include \"Alignment.hpp\"\n#include \"MemoryPool.hpp\"\n#include \"StringSlot.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// _begin                                _end\n// v                                        v\n// +-------------+--------------+-----------+\n// | strings...  |   (free)     |  ...slots |\n// +-------------+--------------+-----------+\n//               ^              ^\n//             _left          _right\n\nclass MemoryPool {\n public:\n  MemoryPool(char* buf, size_t capa)\n      : _begin(buf),\n        _left(buf),\n        _right(buf ? buf + capa : 0),\n        _end(buf ? buf + capa : 0) {\n    ARDUINOJSON_ASSERT(isAligned(_begin));\n    ARDUINOJSON_ASSERT(isAligned(_right));\n    ARDUINOJSON_ASSERT(isAligned(_end));\n  }\n\n  void* buffer() {\n    return _begin;\n  }\n\n  // Gets the capacity of the memoryPool in bytes\n  size_t capacity() const {\n    return size_t(_end - _begin);\n  }\n\n  size_t size() const {\n    return size_t(_left - _begin + _end - _right);\n  }\n\n  VariantSlot* allocVariant() {\n    return allocRight<VariantSlot>();\n  }\n\n  char* allocFrozenString(size_t n) {\n    if (!canAlloc(n)) return 0;\n    char* s = _left;\n    _left += n;\n    checkInvariants();\n    return s;\n  }\n\n  StringSlot allocExpandableString() {\n    StringSlot s;\n    s.value = _left;\n    s.size = size_t(_right - _left);\n    _left = _right;\n    checkInvariants();\n    return s;\n  }\n\n  void freezeString(StringSlot& s, size_t newSize) {\n    _left -= (s.size - newSize);\n    s.size = newSize;\n    checkInvariants();\n  }\n\n  void clear() {\n    _left = _begin;\n    _right = _end;\n  }\n\n  bool canAlloc(size_t bytes) const {\n    return _left + bytes <= _right;\n  }\n\n  bool owns(void* p) const {\n    return _begin <= p && p < _end;\n  }\n\n  template <typename T>\n  T* allocRight() {\n    return reinterpret_cast<T*>(allocRight(sizeof(T)));\n  }\n\n  void* allocRight(size_t bytes) {\n    if (!canAlloc(bytes)) return 0;\n    _right -= bytes;\n    return _right;\n  }\n\n  // Workaround for missing placement new\n  void* operator new(size_t, void* p) {\n    return p;\n  }\n\n private:\n  StringSlot* allocStringSlot() {\n    return allocRight<StringSlot>();\n  }\n\n  void checkInvariants() {\n    ARDUINOJSON_ASSERT(_begin <= _left);\n    ARDUINOJSON_ASSERT(_left <= _right);\n    ARDUINOJSON_ASSERT(_right <= _end);\n    ARDUINOJSON_ASSERT(isAligned(_right));\n  }\n\n  char *_begin, *_left, *_right, *_end;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Memory/StringBuilder.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"MemoryPool.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringBuilder {\n public:\n  explicit StringBuilder(MemoryPool* parent) : _parent(parent), _size(0) {\n    _slot = _parent->allocExpandableString();\n  }\n\n  void append(const char* s) {\n    while (*s) append(*s++);\n  }\n\n  void append(const char* s, size_t n) {\n    while (n-- > 0) append(*s++);\n  }\n\n  void append(char c) {\n    if (!_slot.value) return;\n\n    if (_size >= _slot.size) {\n      _slot.value = 0;\n      return;\n    }\n\n    _slot.value[_size++] = c;\n  }\n\n  char* complete() {\n    append('\\0');\n    if (_slot.value) {\n      _parent->freezeString(_slot, _size);\n    }\n    return _slot.value;\n  }\n\n private:\n  MemoryPool* _parent;\n  size_t _size;\n  StringSlot _slot;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Memory/StringSlot.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n#include \"../Configuration.hpp\"\n\n#define JSON_STRING_SIZE(SIZE) (SIZE)\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct StringSlot {\n  char *value;\n  size_t size;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Misc/SerializedValue.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Strings/StringAdapters.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A special type of data that can be used to insert pregenerated JSON portions.\ntemplate <typename T>\nclass SerializedValue {\n public:\n  explicit SerializedValue(T str) : _str(str) {}\n  operator T() const {\n    return _str;\n  }\n\n  const char* data() const {\n    return _str.c_str();\n  }\n\n  size_t size() const {\n    // CAUTION: the old Arduino String doesn't have size()\n    return _str.length();\n  }\n\n private:\n  T _str;\n};\n\ntemplate <typename TChar>\nclass SerializedValue<TChar*> {\n public:\n  explicit SerializedValue(TChar* p, size_t n) : _data(p), _size(n) {}\n  operator TChar*() const {\n    return _data;\n  }\n\n  TChar* data() const {\n    return _data;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n private:\n  TChar* _data;\n  size_t _size;\n};\n\ntemplate <typename T>\ninline SerializedValue<T> serialized(T str) {\n  return SerializedValue<T>(str);\n}\n\ntemplate <typename TChar>\ninline SerializedValue<TChar*> serialized(TChar* p) {\n  return SerializedValue<TChar*>(p, adaptString(p).size());\n}\n\ntemplate <typename TChar>\ninline SerializedValue<TChar*> serialized(TChar* p, size_t n) {\n  return SerializedValue<TChar*>(p, n);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Misc/Visitable.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct Visitable {\n  // template<Visitor>\n  // void accept(Visitor&) const;\n};\n\ntemplate <typename T>\nstruct IsVisitable : is_base_of<Visitable, T> {};\n\ntemplate <typename T>\nstruct IsVisitable<T&> : IsVisitable<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/MsgPack/MsgPackDeserializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Deserialization/deserialize.hpp\"\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"endianess.hpp\"\n#include \"ieee754.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TReader, typename TStringStorage>\nclass MsgPackDeserializer {\n  typedef typename remove_reference<TStringStorage>::type::StringBuilder\n      StringBuilder;\n\n public:\n  MsgPackDeserializer(MemoryPool &pool, TReader reader,\n                      TStringStorage stringStorage, uint8_t nestingLimit)\n      : _pool(&pool),\n        _reader(reader),\n        _stringStorage(stringStorage),\n        _nestingLimit(nestingLimit) {}\n\n  DeserializationError parse(VariantData &variant) {\n    uint8_t code;\n    if (!readByte(code)) return DeserializationError::IncompleteInput;\n\n    if ((code & 0x80) == 0) {\n      variant.setUnsignedInteger(code);\n      return DeserializationError::Ok;\n    }\n\n    if ((code & 0xe0) == 0xe0) {\n      // TODO: add setNegativeInteger()\n      variant.setSignedInteger(static_cast<int8_t>(code));\n      return DeserializationError::Ok;\n    }\n\n    if ((code & 0xe0) == 0xa0) {\n      return readString(variant, code & 0x1f);\n    }\n\n    if ((code & 0xf0) == 0x90) {\n      return readArray(variant.toArray(), code & 0x0F);\n    }\n\n    if ((code & 0xf0) == 0x80) {\n      return readObject(variant.toObject(), code & 0x0F);\n    }\n\n    switch (code) {\n      case 0xc0:\n        // already null\n        return DeserializationError::Ok;\n\n      case 0xc2:\n        variant.setBoolean(false);\n        return DeserializationError::Ok;\n\n      case 0xc3:\n        variant.setBoolean(true);\n        return DeserializationError::Ok;\n\n      case 0xcc:\n        return readInteger<uint8_t>(variant);\n\n      case 0xcd:\n        return readInteger<uint16_t>(variant);\n\n      case 0xce:\n        return readInteger<uint32_t>(variant);\n\n      case 0xcf:\n#if ARDUINOJSON_USE_LONG_LONG\n        return readInteger<uint64_t>(variant);\n#else\n        return DeserializationError::NotSupported;\n#endif\n\n      case 0xd0:\n        return readInteger<int8_t>(variant);\n\n      case 0xd1:\n        return readInteger<int16_t>(variant);\n\n      case 0xd2:\n        return readInteger<int32_t>(variant);\n\n      case 0xd3:\n#if ARDUINOJSON_USE_LONG_LONG\n        return readInteger<int64_t>(variant);\n#else\n        return DeserializationError::NotSupported;\n#endif\n\n      case 0xca:\n        return readFloat<float>(variant);\n\n      case 0xcb:\n        return readDouble<double>(variant);\n\n      case 0xd9:\n        return readString<uint8_t>(variant);\n\n      case 0xda:\n        return readString<uint16_t>(variant);\n\n      case 0xdb:\n        return readString<uint32_t>(variant);\n\n      case 0xdc:\n        return readArray<uint16_t>(variant.toArray());\n\n      case 0xdd:\n        return readArray<uint32_t>(variant.toArray());\n\n      case 0xde:\n        return readObject<uint16_t>(variant.toObject());\n\n      case 0xdf:\n        return readObject<uint32_t>(variant.toObject());\n\n      default:\n        return DeserializationError::NotSupported;\n    }\n  }\n\n private:\n  // Prevent VS warning \"assignment operator could not be generated\"\n  MsgPackDeserializer &operator=(const MsgPackDeserializer &);\n\n  bool skip(uint8_t n) {\n    while (n--) {\n      if (_reader.ended()) return false;\n      _reader.read();\n    }\n    return true;\n  }\n\n  bool readByte(uint8_t &value) {\n    if (_reader.ended()) return false;\n    value = static_cast<uint8_t>(_reader.read());\n    return true;\n  }\n\n  bool readBytes(uint8_t *p, size_t n) {\n    for (size_t i = 0; i < n; i++) {\n      if (!readByte(p[i])) return false;\n    }\n    return true;\n  }\n\n  template <typename T>\n  bool readBytes(T &value) {\n    return readBytes(reinterpret_cast<uint8_t *>(&value), sizeof(value));\n  }\n\n  template <typename T>\n  T readInteger() {\n    T value;\n    readBytes(value);\n    fixEndianess(value);\n    return value;\n  }\n\n  template <typename T>\n  bool readInteger(T &value) {\n    if (!readBytes(value)) return false;\n    fixEndianess(value);\n    return true;\n  }\n\n  template <typename T>\n  DeserializationError readInteger(VariantData &variant) {\n    T value;\n    if (!readInteger(value)) return DeserializationError::IncompleteInput;\n    variant.setInteger(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4, DeserializationError>::type readFloat(\n      VariantData &variant) {\n    T value;\n    if (!readBytes(value)) return DeserializationError::IncompleteInput;\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 8, DeserializationError>::type readDouble(\n      VariantData &variant) {\n    T value;\n    if (!readBytes(value)) return DeserializationError::IncompleteInput;\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4, DeserializationError>::type readDouble(\n      VariantData &variant) {\n    uint8_t i[8];  // input is 8 bytes\n    T value;       // output is 4 bytes\n    uint8_t *o = reinterpret_cast<uint8_t *>(&value);\n    if (!readBytes(i, 8)) return DeserializationError::IncompleteInput;\n    doubleToFloat(i, o);\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  DeserializationError readString(VariantData &variant) {\n    T size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readString(variant, size);\n  }\n\n  template <typename T>\n  DeserializationError readString(const char *&str) {\n    T size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readString(str, size);\n  }\n\n  DeserializationError readString(VariantData &variant, size_t n) {\n    const char *s;\n    DeserializationError err = readString(s, n);\n    if (!err) variant.setOwnedString(make_not_null(s));\n    return err;\n  }\n\n  DeserializationError readString(const char *&result, size_t n) {\n    StringBuilder builder = _stringStorage.startString();\n    for (; n; --n) {\n      uint8_t c;\n      if (!readBytes(c)) return DeserializationError::IncompleteInput;\n      builder.append(static_cast<char>(c));\n    }\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  template <typename TSize>\n  DeserializationError readArray(CollectionData &array) {\n    TSize size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readArray(array, size);\n  }\n\n  DeserializationError readArray(CollectionData &array, size_t n) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n    --_nestingLimit;\n    for (; n; --n) {\n      VariantData *value = array.add(_pool);\n      if (!value) return DeserializationError::NoMemory;\n\n      DeserializationError err = parse(*value);\n      if (err) return err;\n    }\n    ++_nestingLimit;\n    return DeserializationError::Ok;\n  }\n\n  template <typename TSize>\n  DeserializationError readObject(CollectionData &object) {\n    TSize size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readObject(object, size);\n  }\n\n  DeserializationError readObject(CollectionData &object, size_t n) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n    --_nestingLimit;\n    for (; n; --n) {\n      VariantSlot *slot = object.addSlot(_pool);\n      if (!slot) return DeserializationError::NoMemory;\n\n      const char *key;\n      DeserializationError err = parseKey(key);\n      if (err) return err;\n      slot->setOwnedKey(make_not_null(key));\n\n      err = parse(*slot->data());\n      if (err) return err;\n    }\n    ++_nestingLimit;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseKey(const char *&key) {\n    uint8_t code;\n    if (!readByte(code)) return DeserializationError::IncompleteInput;\n\n    if ((code & 0xe0) == 0xa0) return readString(key, code & 0x1f);\n\n    switch (code) {\n      case 0xd9:\n        return readString<uint8_t>(key);\n\n      case 0xda:\n        return readString<uint16_t>(key);\n\n      case 0xdb:\n        return readString<uint32_t>(key);\n\n      default:\n        return DeserializationError::NotSupported;\n    }\n  }\n\n  MemoryPool *_pool;\n  TReader _reader;\n  TStringStorage _stringStorage;\n  uint8_t _nestingLimit;\n};\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, const TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput *input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput *input, size_t inputSize,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, inputSize, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/MsgPack/MsgPackSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"endianess.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass MsgPackSerializer {\n public:\n  MsgPackSerializer(TWriter& writer) : _writer(&writer), _bytesWritten(0) {}\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4>::type visitFloat(T value32) {\n    writeByte(0xCA);\n    writeInteger(value32);\n  }\n\n  template <typename T>\n  ARDUINOJSON_NO_SANITIZE(\"float-cast-overflow\")\n  typename enable_if<sizeof(T) == 8>::type visitFloat(T value64) {\n    float value32 = float(value64);\n    if (value32 == value64) {\n      writeByte(0xCA);\n      writeInteger(value32);\n    } else {\n      writeByte(0xCB);\n      writeInteger(value64);\n    }\n  }\n\n  void visitArray(const CollectionData& array) {\n    size_t n = array.size();\n    if (n < 0x10) {\n      writeByte(uint8_t(0x90 + array.size()));\n    } else if (n < 0x10000) {\n      writeByte(0xDC);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDD);\n      writeInteger(uint32_t(n));\n    }\n    for (VariantSlot* slot = array.head(); slot; slot = slot->next()) {\n      slot->data()->accept(*this);\n    }\n  }\n\n  void visitObject(const CollectionData& object) {\n    size_t n = object.size();\n    if (n < 0x10) {\n      writeByte(uint8_t(0x80 + n));\n    } else if (n < 0x10000) {\n      writeByte(0xDE);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDF);\n      writeInteger(uint32_t(n));\n    }\n    for (VariantSlot* slot = object.head(); slot; slot = slot->next()) {\n      visitString(slot->key());\n      slot->data()->accept(*this);\n    }\n  }\n\n  void visitString(const char* value) {\n    if (!value) return writeByte(0xC0);  // nil\n\n    size_t n = strlen(value);\n\n    if (n < 0x20) {\n      writeByte(uint8_t(0xA0 + n));\n    } else if (n < 0x100) {\n      writeByte(0xD9);\n      writeInteger(uint8_t(n));\n    } else if (n < 0x10000) {\n      writeByte(0xDA);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDB);\n      writeInteger(uint32_t(n));\n    }\n    writeBytes(reinterpret_cast<const uint8_t*>(value), n);\n  }\n\n  void visitRawJson(const char* data, size_t size) {\n    writeBytes(reinterpret_cast<const uint8_t*>(data), size);\n  }\n\n  void visitNegativeInteger(UInt value) {\n    UInt negated = UInt(~value + 1);\n    if (value <= 0x20) {\n      writeInteger(int8_t(negated));\n    } else if (value <= 0x80) {\n      writeByte(0xD0);\n      writeInteger(int8_t(negated));\n    } else if (value <= 0x8000) {\n      writeByte(0xD1);\n      writeInteger(int16_t(negated));\n    } else if (value <= 0x80000000) {\n      writeByte(0xD2);\n      writeInteger(int32_t(negated));\n    }\n#if ARDUINOJSON_USE_LONG_LONG\n    else {\n      writeByte(0xD3);\n      writeInteger(int64_t(negated));\n    }\n#endif\n  }\n\n  void visitPositiveInteger(UInt value) {\n    if (value <= 0x7F) {\n      writeInteger(uint8_t(value));\n    } else if (value <= 0xFF) {\n      writeByte(0xCC);\n      writeInteger(uint8_t(value));\n    } else if (value <= 0xFFFF) {\n      writeByte(0xCD);\n      writeInteger(uint16_t(value));\n    } else if (value <= 0xFFFFFFFF) {\n      writeByte(0xCE);\n      writeInteger(uint32_t(value));\n    }\n#if ARDUINOJSON_USE_LONG_LONG\n    else {\n      writeByte(0xCF);\n      writeInteger(uint64_t(value));\n    }\n#endif\n  }\n\n  void visitBoolean(bool value) {\n    writeByte(value ? 0xC3 : 0xC2);\n  }\n\n  void visitNull() {\n    writeByte(0xC0);\n  }\n\n  size_t bytesWritten() const {\n    return _bytesWritten;\n  }\n\n private:\n  void writeByte(uint8_t c) {\n    _bytesWritten += _writer->write(c);\n  }\n\n  void writeBytes(const uint8_t* p, size_t n) {\n    _bytesWritten += _writer->write(p, n);\n  }\n\n  template <typename T>\n  void writeInteger(T value) {\n    fixEndianess(value);\n    writeBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));\n  }\n\n  TWriter* _writer;\n  size_t _bytesWritten;\n};\n\ntemplate <typename TSource, typename TDestination>\ninline size_t serializeMsgPack(const TSource& source, TDestination& output) {\n  return serialize<MsgPackSerializer>(source, output);\n}\n\ntemplate <typename TSource, typename TDestination>\ninline size_t serializeMsgPack(const TSource& source, TDestination* output,\n                               size_t size) {\n  return serialize<MsgPackSerializer>(source, output, size);\n}\n\ntemplate <typename TSource>\ninline size_t measureMsgPack(const TSource& source) {\n  return measure<MsgPackSerializer>(source);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/MsgPack/endianess.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Polyfills/utility.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_LITTLE_ENDIAN\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 8>) {\n  swap(p[0], p[7]);\n  swap(p[1], p[6]);\n  swap(p[2], p[5]);\n  swap(p[3], p[4]);\n}\n\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 4>) {\n  swap(p[0], p[3]);\n  swap(p[1], p[2]);\n}\n\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 2>) {\n  swap(p[0], p[1]);\n}\n\ninline void fixEndianess(uint8_t *, integral_constant<size_t, 1>) {}\n\ntemplate <typename T>\ninline void fixEndianess(T &value) {\n  fixEndianess(reinterpret_cast<uint8_t *>(&value),\n               integral_constant<size_t, sizeof(T)>());\n}\n#else\ntemplate <typename T>\ninline void fixEndianess(T &) {}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/MsgPack/ieee754.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline void doubleToFloat(const uint8_t d[8], uint8_t f[4]) {\n  f[0] = uint8_t((d[0] & 0xC0) | (d[0] << 3 & 0x3f) | (d[1] >> 5));\n  f[1] = uint8_t((d[1] << 3) | (d[2] >> 5));\n  f[2] = uint8_t((d[2] << 3) | (d[3] >> 5));\n  f[3] = uint8_t((d[3] << 3) | (d[4] >> 5));\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Namespace.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"version.hpp\"\n\n#include \"Configuration.hpp\"\n\n#define ARDUINOJSON_DO_CONCAT(A, B) A##B\n#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_DO_CONCAT(A, B)\n#define ARDUINOJSON_CONCAT4(A, B, C, D) \\\n  ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), ARDUINOJSON_CONCAT2(C, D))\n#define ARDUINOJSON_CONCAT8(A, B, C, D, E, F, G, H)    \\\n  ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT4(A, B, C, D), \\\n                      ARDUINOJSON_CONCAT4(E, F, G, H))\n\n#define ARDUINOJSON_NAMESPACE                                                  \\\n  ARDUINOJSON_CONCAT8(ArduinoJson, ARDUINOJSON_VERSION_MAJOR,                  \\\n                      ARDUINOJSON_VERSION_MINOR, ARDUINOJSON_VERSION_REVISION, \\\n                      _, ARDUINOJSON_USE_LONG_LONG, ARDUINOJSON_USE_DOUBLE,    \\\n                      ARDUINOJSON_DECODE_UNICODE)\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/Float.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_USE_DOUBLE\ntypedef double Float;\n#else\ntypedef float Float;\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/FloatParts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/math.hpp\"\n#include \"./FloatTraits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TFloat>\nstruct FloatParts {\n  uint32_t integral;\n  uint32_t decimal;\n  int16_t exponent;\n  int8_t decimalPlaces;\n\n  FloatParts(TFloat value) {\n    uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000;\n    decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6;\n\n    exponent = normalize(value);\n\n    integral = uint32_t(value);\n    // reduce number of decimal places by the number of integral places\n    for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) {\n      maxDecimalPart /= 10;\n      decimalPlaces--;\n    }\n\n    TFloat remainder = (value - TFloat(integral)) * TFloat(maxDecimalPart);\n\n    decimal = uint32_t(remainder);\n    remainder = remainder - TFloat(decimal);\n\n    // rounding:\n    // increment by 1 if remainder >= 0.5\n    decimal += uint32_t(remainder * 2);\n    if (decimal >= maxDecimalPart) {\n      decimal = 0;\n      integral++;\n      if (exponent && integral >= 10) {\n        exponent++;\n        integral = 1;\n      }\n    }\n\n    // remove trailing zeros\n    while (decimal % 10 == 0 && decimalPlaces > 0) {\n      decimal /= 10;\n      decimalPlaces--;\n    }\n  }\n\n  static int16_t normalize(TFloat& value) {\n    typedef FloatTraits<TFloat> traits;\n    int16_t powersOf10 = 0;\n\n    int8_t index = sizeof(TFloat) == 8 ? 8 : 5;\n    int bit = 1 << index;\n\n    if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) {\n      for (; index >= 0; index--) {\n        if (value >= traits::positiveBinaryPowerOfTen(index)) {\n          value *= traits::negativeBinaryPowerOfTen(index);\n          powersOf10 = int16_t(powersOf10 + bit);\n        }\n        bit >>= 1;\n      }\n    }\n\n    if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) {\n      for (; index >= 0; index--) {\n        if (value < traits::negativeBinaryPowerOfTenPlusOne(index)) {\n          value *= traits::positiveBinaryPowerOfTen(index);\n          powersOf10 = int16_t(powersOf10 - bit);\n        }\n        bit >>= 1;\n      }\n    }\n\n    return powersOf10;\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/FloatTraits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n#include <stdint.h>\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/alias_cast.hpp\"\n#include \"../Polyfills/math.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, size_t = sizeof(T)>\nstruct FloatTraits {};\n\ntemplate <typename T>\nstruct FloatTraits<T, 8 /*64bits*/> {\n  typedef uint64_t mantissa_type;\n  static const short mantissa_bits = 52;\n  static const mantissa_type mantissa_max =\n      (mantissa_type(1) << mantissa_bits) - 1;\n\n  typedef int16_t exponent_type;\n  static const exponent_type exponent_max = 308;\n\n  template <typename TExponent>\n  static T make_float(T m, TExponent e) {\n    if (e > 0) {\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= positiveBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    } else {\n      e = TExponent(-e);\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= negativeBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    }\n    return m;\n  }\n\n  static T positiveBinaryPowerOfTen(int index) {\n    static T factors[] = {\n        1e1,\n        1e2,\n        1e4,\n        1e8,\n        1e16,\n        forge(0x4693B8B5, 0xB5056E17),  // 1e32\n        forge(0x4D384F03, 0xE93FF9F5),  // 1e64\n        forge(0x5A827748, 0xF9301D32),  // 1e128\n        forge(0x75154FDD, 0x7F73BF3C)   // 1e256\n    };\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTen(int index) {\n    static T factors[] = {\n        forge(0x3FB99999, 0x9999999A),  // 1e-1\n        forge(0x3F847AE1, 0x47AE147B),  // 1e-2\n        forge(0x3F1A36E2, 0xEB1C432D),  // 1e-4\n        forge(0x3E45798E, 0xE2308C3A),  // 1e-8\n        forge(0x3C9CD2B2, 0x97D889BC),  // 1e-16\n        forge(0x3949F623, 0xD5A8A733),  // 1e-32\n        forge(0x32A50FFD, 0x44F4A73D),  // 1e-64\n        forge(0x255BBA08, 0xCF8C979D),  // 1e-128\n        forge(0x0AC80628, 0x64AC6F43)   // 1e-256\n    };\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTenPlusOne(int index) {\n    static T factors[] = {\n        1e0,\n        forge(0x3FB99999, 0x9999999A),  // 1e-1\n        forge(0x3F50624D, 0xD2F1A9FC),  // 1e-3\n        forge(0x3E7AD7F2, 0x9ABCAF48),  // 1e-7\n        forge(0x3CD203AF, 0x9EE75616),  // 1e-15\n        forge(0x398039D6, 0x65896880),  // 1e-31\n        forge(0x32DA53FC, 0x9631D10D),  // 1e-63\n        forge(0x25915445, 0x81B7DEC2),  // 1e-127\n        forge(0x0AFE07B2, 0x7DD78B14)   // 1e-255\n    };\n    return factors[index];\n  }\n\n  static T nan() {\n    return forge(0x7ff80000, 0x00000000);\n  }\n\n  static T inf() {\n    return forge(0x7ff00000, 0x00000000);\n  }\n\n  static T highest() {\n    return forge(0x7FEFFFFF, 0xFFFFFFFF);\n  }\n\n  static T lowest() {\n    return forge(0xFFEFFFFF, 0xFFFFFFFF);\n  }\n\n  // constructs a double floating point values from its binary representation\n  // we use this function to workaround platforms with single precision literals\n  // (for example, when -fsingle-precision-constant is passed to GCC)\n  static T forge(uint32_t msb, uint32_t lsb) {\n    return alias_cast<T>((uint64_t(msb) << 32) | lsb);\n  }\n};\n\ntemplate <typename T>\nstruct FloatTraits<T, 4 /*32bits*/> {\n  typedef uint32_t mantissa_type;\n  static const short mantissa_bits = 23;\n  static const mantissa_type mantissa_max =\n      (mantissa_type(1) << mantissa_bits) - 1;\n\n  typedef int8_t exponent_type;\n  static const exponent_type exponent_max = 38;\n\n  template <typename TExponent>\n  static T make_float(T m, TExponent e) {\n    if (e > 0) {\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= positiveBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    } else {\n      e = -e;\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= negativeBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    }\n    return m;\n  }\n\n  static T positiveBinaryPowerOfTen(int index) {\n    static T factors[] = {1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f};\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTen(int index) {\n    static T factors[] = {1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f};\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTenPlusOne(int index) {\n    static T factors[] = {1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f};\n    return factors[index];\n  }\n\n  static T forge(uint32_t bits) {\n    return alias_cast<T>(bits);\n  }\n\n  static T nan() {\n    return forge(0x7fc00000);\n  }\n\n  static T inf() {\n    return forge(0x7f800000);\n  }\n\n  static T highest() {\n    return forge(0x7f7fffff);\n  }\n\n  static T lowest() {\n    return forge(0xFf7fffff);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/Integer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\n#include <stdint.h>  // int64_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_USE_LONG_LONG\ntypedef int64_t Integer;\ntypedef uint64_t UInt;\n#else\ntypedef long Integer;\ntypedef unsigned long UInt;\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/convertNumber.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wconversion\"\n#elif defined(__GNUC__)\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)\n#pragma GCC diagnostic push\n#endif\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#endif\n\n#include \"../Polyfills/limits.hpp\"\n#include \"Float.hpp\"\n#include \"FloatTraits.hpp\"\n#include \"Integer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && sizeof(TOut) <= sizeof(TIn),\n                   bool>::type\ncanStorePositiveInteger(TIn value) {\n  return value <= TIn(numeric_limits<TOut>::highest());\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && sizeof(TIn) < sizeof(TOut),\n                   bool>::type\ncanStorePositiveInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, bool>::type\ncanStorePositiveInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, bool>::type\ncanStoreNegativeInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&\n                       sizeof(TOut) <= sizeof(TIn),\n                   bool>::type\ncanStoreNegativeInteger(TIn value) {\n  return value <= TIn(numeric_limits<TOut>::highest()) + 1;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&\n                       sizeof(TIn) < sizeof(TOut),\n                   bool>::type\ncanStoreNegativeInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_unsigned<TOut>::value,\n                   bool>::type\ncanStoreNegativeInteger(TIn) {\n  return false;\n}\n\ntemplate <typename TOut, typename TIn>\nTOut convertPositiveInteger(TIn value) {\n  return canStorePositiveInteger<TOut>(value) ? TOut(value) : 0;\n}\n\ntemplate <typename TOut, typename TIn>\nTOut convertNegativeInteger(TIn value) {\n  return canStoreNegativeInteger<TOut>(value) ? TOut(~value + 1) : 0;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, TOut>::type convertFloat(\n    TIn value) {\n  return TOut(value);\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<!is_floating_point<TOut>::value, TOut>::type convertFloat(\n    TIn value) {\n  return value >= numeric_limits<TOut>::lowest() &&\n                 value <= numeric_limits<TOut>::highest()\n             ? TOut(value)\n             : 0;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#elif defined(__GNUC__)\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)\n#pragma GCC diagnostic pop\n#endif\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/parseFloat.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"convertNumber.hpp\"\n#include \"parseNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline T parseFloat(const char* s) {\n  // try to reuse the same parameters as JsonDeserializer\n  typedef typename choose_largest<Float, T>::type TFloat;\n  return parseNumber<TFloat, UInt>(s).template as<T>();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/parseInteger.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"convertNumber.hpp\"\n#include \"parseNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\nT parseInteger(const char *s) {\n  // try to reuse the same parameters as JsonDeserializer\n  typedef typename choose_largest<UInt, typename make_unsigned<T>::type>::type\n      TUInt;\n  return parseNumber<Float, TUInt>(s).template as<T>();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Numbers/parseNumber.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/assert.hpp\"\n#include \"../Polyfills/ctype.hpp\"\n#include \"../Polyfills/math.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantContent.hpp\"\n#include \"FloatTraits.hpp\"\n#include \"convertNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TFloat, typename TUInt>\nstruct ParsedNumber {\n  ParsedNumber() : uintValue(0), floatValue(0), _type(VALUE_IS_NULL) {}\n\n  ParsedNumber(TUInt value, bool is_negative)\n      : uintValue(value),\n        floatValue(TFloat(value)),\n        _type(uint8_t(is_negative ? VALUE_IS_NEGATIVE_INTEGER\n                                  : VALUE_IS_POSITIVE_INTEGER)) {}\n  ParsedNumber(TFloat value) : floatValue(value), _type(VALUE_IS_FLOAT) {}\n\n  template <typename T>\n  T as() const {\n    switch (_type) {\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return convertNegativeInteger<T>(uintValue);\n      case VALUE_IS_POSITIVE_INTEGER:\n        return convertPositiveInteger<T>(uintValue);\n      case VALUE_IS_FLOAT:\n        return convertFloat<T>(floatValue);\n      default:\n        return 0;\n    }\n  }\n\n  uint8_t type() const {\n    return _type;\n  }\n\n  TUInt uintValue;\n  TFloat floatValue;\n  uint8_t _type;\n};\n\ntemplate <typename A, typename B>\nstruct choose_largest : conditional<(sizeof(A) > sizeof(B)), A, B> {};\n\ntemplate <typename TFloat, typename TUInt>\ninline ParsedNumber<TFloat, TUInt> parseNumber(const char *s) {\n  typedef FloatTraits<TFloat> traits;\n  typedef typename choose_largest<typename traits::mantissa_type, TUInt>::type\n      mantissa_t;\n  typedef typename traits::exponent_type exponent_t;\n  typedef ParsedNumber<TFloat, TUInt> return_type;\n\n  ARDUINOJSON_ASSERT(s != 0);\n\n  bool is_negative = false;\n  switch (*s) {\n    case '-':\n      is_negative = true;\n      s++;\n      break;\n    case '+':\n      s++;\n      break;\n  }\n\n  if (*s == 'n' || *s == 'N') return traits::nan();\n  if (*s == 'i' || *s == 'I')\n    return is_negative ? -traits::inf() : traits::inf();\n  if (!isdigit(*s) && *s != '.') return return_type();\n\n  mantissa_t mantissa = 0;\n  exponent_t exponent_offset = 0;\n  const mantissa_t maxUint = TUInt(-1);\n\n  while (isdigit(*s)) {\n    uint8_t digit = uint8_t(*s - '0');\n    if (mantissa > maxUint / 10) break;\n    mantissa *= 10;\n    if (mantissa > maxUint - digit) break;\n    mantissa += digit;\n    s++;\n  }\n\n  if (*s == '\\0') return return_type(TUInt(mantissa), is_negative);\n\n  // avoid mantissa overflow\n  while (mantissa > traits::mantissa_max) {\n    mantissa /= 10;\n    exponent_offset++;\n  }\n\n  // remaing digits can't fit in the mantissa\n  while (isdigit(*s)) {\n    exponent_offset++;\n    s++;\n  }\n\n  if (*s == '.') {\n    s++;\n    while (isdigit(*s)) {\n      if (mantissa < traits::mantissa_max / 10) {\n        mantissa = mantissa * 10 + uint8_t(*s - '0');\n        exponent_offset--;\n      }\n      s++;\n    }\n  }\n\n  int exponent = 0;\n  if (*s == 'e' || *s == 'E') {\n    s++;\n    bool negative_exponent = false;\n    if (*s == '-') {\n      negative_exponent = true;\n      s++;\n    } else if (*s == '+') {\n      s++;\n    }\n\n    while (isdigit(*s)) {\n      exponent = exponent * 10 + (*s - '0');\n      if (exponent + exponent_offset > traits::exponent_max) {\n        if (negative_exponent)\n          return is_negative ? -0.0f : 0.0f;\n        else\n          return is_negative ? -traits::inf() : traits::inf();\n      }\n      s++;\n    }\n    if (negative_exponent) exponent = -exponent;\n  }\n  exponent += exponent_offset;\n\n  // we should be at the end of the string, otherwise it's an error\n  if (*s != '\\0') return return_type();\n\n  TFloat result = traits::make_float(static_cast<TFloat>(mantissa), exponent);\n\n  return is_negative ? -result : result;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/MemberProxy.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4522)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TObject, typename TStringRef>\nclass MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,\n                    public Visitable {\n  typedef MemberProxy<TObject, TStringRef> this_type;\n\n public:\n  FORCE_INLINE MemberProxy(TObject variant, TStringRef key)\n      : _object(variant), _key(key) {}\n\n  FORCE_INLINE operator VariantConstRef() const {\n    return getUpstreamMember();\n  }\n\n  FORCE_INLINE this_type &operator=(const this_type &src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename enable_if<!is_array<TValue>::value, this_type &>::type\n  operator=(const TValue &src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  // operator=(char*)\n  // operator=(const char*)\n  // operator=(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE this_type &operator=(TChar *src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  FORCE_INLINE void clear() const {\n    getUpstreamMember().clear();\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return getUpstreamMember().isNull();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename VariantAs<TValue>::type as() const {\n    return getUpstreamMember().template as<TValue>();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE bool is() const {\n    return getUpstreamMember().template is<TValue>();\n  }\n\n  FORCE_INLINE size_t size() const {\n    return getUpstreamMember().size();\n  }\n\n  FORCE_INLINE void remove(size_t index) const {\n    getUpstreamMember().remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(\n      TChar *key) const {\n    getUpstreamMember().remove(key);\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString &key) const {\n    getUpstreamMember().remove(key);\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename VariantTo<TValue>::type to() {\n    return getOrAddUpstreamMember().template to<TValue>();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename enable_if<!is_array<TValue>::value, bool>::type set(\n      const TValue &value) {\n    return getOrAddUpstreamMember().set(value);\n  }\n\n  // set(char*) const\n  // set(const char*) const\n  // set(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool set(const TChar *value) {\n    return getOrAddUpstreamMember().set(value);\n  }\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    return getUpstreamMember().accept(visitor);\n  }\n\n  FORCE_INLINE VariantRef addElement() const {\n    return getOrAddUpstreamMember().addElement();\n  }\n\n  // getElement(size_t) const\n  FORCE_INLINE VariantRef getElement(size_t index) const {\n    return getUpstreamMember().getElement(index);\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar *key) const {\n    return getUpstreamMember().getMember(key);\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getMember(const TString &key) const {\n    return getUpstreamMember().getMember(key);\n  }\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar *key) const {\n    return getOrAddUpstreamMember().getOrAddMember(key);\n  }\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString &key) const {\n    return getOrAddUpstreamMember().getOrAddMember(key);\n  }\n\n private:\n  FORCE_INLINE VariantRef getUpstreamMember() const {\n    return _object.getMember(_key);\n  }\n\n  FORCE_INLINE VariantRef getOrAddUpstreamMember() const {\n    return _object.getOrAddMember(_key);\n  }\n\n  TObject _object;\n  TStringRef _key;\n};\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value,\n                          MemberProxy<const TObject &, const TString &> >::type\n    ObjectShortcuts<TObject>::operator[](const TString &key) const {\n  return MemberProxy<const TObject &, const TString &>(*impl(), key);\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString *>::value,\n                          MemberProxy<const TObject &, TString *> >::type\n    ObjectShortcuts<TObject>::operator[](TString *key) const {\n  return MemberProxy<const TObject &, TString *>(*impl(), key);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/ObjectFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Collection/CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename Visitor>\nvoid objectAccept(const CollectionData *obj, Visitor &visitor) {\n  if (obj)\n    visitor.visitObject(*obj);\n  else\n    visitor.visitNull();\n}\n\ninline bool objectEquals(const CollectionData *lhs, const CollectionData *rhs) {\n  if (lhs == rhs) return true;\n  if (!lhs || !rhs) return false;\n  return lhs->equalsObject(*rhs);\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData *objectGet(const CollectionData *obj, TAdaptedString key) {\n  if (!obj) return 0;\n  return obj->get(key);\n}\n\ntemplate <typename TAdaptedString>\nvoid objectRemove(CollectionData *obj, TAdaptedString key) {\n  if (!obj) return;\n  obj->remove(key);\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData *objectGetOrCreate(CollectionData *obj, TAdaptedString key,\n                                      MemoryPool *pool) {\n  if (!obj) return 0;\n\n  // ignore null key\n  if (key.isNull()) return 0;\n\n  // search a matching key\n  VariantData *var = obj->get(key);\n  if (var) return var;\n\n  return obj->add(key, pool);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/ObjectImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Array/ArrayRef.hpp\"\n#include \"ObjectRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline ArrayRef ObjectShortcuts<TObject>::createNestedArray(\n    const TString& key) const {\n  return impl()->getOrAddMember(key).template to<ArrayRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline ArrayRef ObjectShortcuts<TObject>::createNestedArray(TChar* key) const {\n  return impl()->getOrAddMember(key).template to<ArrayRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline ObjectRef ObjectShortcuts<TObject>::createNestedObject(\n    const TString& key) const {\n  return impl()->getOrAddMember(key).template to<ObjectRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline ObjectRef ObjectShortcuts<TObject>::createNestedObject(\n    TChar* key) const {\n  return impl()->getOrAddMember(key).template to<ObjectRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value, bool>::type\nObjectShortcuts<TObject>::containsKey(const TString& key) const {\n  return !impl()->getMember(key).isUndefined();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline typename enable_if<IsString<TChar*>::value, bool>::type\nObjectShortcuts<TObject>::containsKey(TChar* key) const {\n  return !impl()->getMember(key).isUndefined();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/ObjectIterator.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/SlotFunctions.hpp\"\n#include \"Pair.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass PairPtr {\n public:\n  PairPtr(MemoryPool *pool, VariantSlot *slot) : _pair(pool, slot) {}\n\n  const Pair *operator->() const {\n    return &_pair;\n  }\n\n  const Pair &operator*() const {\n    return _pair;\n  }\n\n private:\n  Pair _pair;\n};\n\nclass ObjectIterator {\n public:\n  ObjectIterator() : _slot(0) {}\n\n  explicit ObjectIterator(MemoryPool *pool, VariantSlot *slot)\n      : _pool(pool), _slot(slot) {}\n\n  Pair operator*() const {\n    return Pair(_pool, _slot);\n  }\n  PairPtr operator->() {\n    return PairPtr(_pool, _slot);\n  }\n\n  bool operator==(const ObjectIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ObjectIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ObjectIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ObjectIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  MemoryPool *_pool;\n  VariantSlot *_slot;\n};\n\nclass PairConstPtr {\n public:\n  PairConstPtr(const VariantSlot *slot) : _pair(slot) {}\n\n  const PairConst *operator->() const {\n    return &_pair;\n  }\n\n  const PairConst &operator*() const {\n    return _pair;\n  }\n\n private:\n  PairConst _pair;\n};\n\nclass ObjectConstIterator {\n public:\n  ObjectConstIterator() : _slot(0) {}\n\n  explicit ObjectConstIterator(const VariantSlot *slot) : _slot(slot) {}\n\n  PairConst operator*() const {\n    return PairConst(_slot);\n  }\n  PairConstPtr operator->() {\n    return PairConstPtr(_slot);\n  }\n\n  bool operator==(const ObjectConstIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ObjectConstIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ObjectConstIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ObjectConstIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  const VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  const VariantSlot *_slot;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/ObjectRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ObjectFunctions.hpp\"\n#include \"ObjectIterator.hpp\"\n\n// Returns the size (in bytes) of an object with n elements.\n// Can be very handy to determine the size of a StaticMemoryPool.\n#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \\\n  ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot))\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TData>\nclass ObjectRefBase {\n public:\n  operator VariantConstRef() const {\n    const void* data = _data;  // prevent warning cast-align\n    return VariantConstRef(reinterpret_cast<const VariantData*>(data));\n  }\n\n  template <typename Visitor>\n  FORCE_INLINE void accept(Visitor& visitor) const {\n    objectAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return _data == 0;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  FORCE_INLINE size_t size() const {\n    return _data ? _data->size() : 0;\n  }\n\n protected:\n  ObjectRefBase(TData* data) : _data(data) {}\n  TData* _data;\n};\n\nclass ObjectConstRef : public ObjectRefBase<const CollectionData>,\n                       public Visitable {\n  friend class ObjectRef;\n  typedef ObjectRefBase<const CollectionData> base_type;\n\n public:\n  typedef ObjectConstIterator iterator;\n\n  ObjectConstRef() : base_type(0) {}\n  ObjectConstRef(const CollectionData* data) : base_type(data) {}\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  FORCE_INLINE bool containsKey(const TString& key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool containsKey(TChar* key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantConstRef getMember(const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantConstRef getMember(TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar*>::value, VariantConstRef>::type\n      operator[](TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  FORCE_INLINE bool operator==(ObjectConstRef rhs) const {\n    return objectEquals(_data, rhs._data);\n  }\n\n private:\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantConstRef get_impl(TAdaptedString key) const {\n    return VariantConstRef(objectGet(_data, key));\n  }\n};\n\nclass ObjectRef : public ObjectRefBase<CollectionData>,\n                  public ObjectShortcuts<ObjectRef>,\n                  public Visitable {\n  typedef ObjectRefBase<CollectionData> base_type;\n\n public:\n  typedef ObjectIterator iterator;\n\n  FORCE_INLINE ObjectRef() : base_type(0), _pool(0) {}\n  FORCE_INLINE ObjectRef(MemoryPool* buf, CollectionData* data)\n      : base_type(data), _pool(buf) {}\n\n  operator VariantRef() const {\n    void* data = _data;  // prevent warning cast-align\n    return VariantRef(_pool, reinterpret_cast<VariantData*>(data));\n  }\n\n  operator ObjectConstRef() const {\n    return ObjectConstRef(_data);\n  }\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_pool, _data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  void clear() const {\n    if (!_data) return;\n    _data->clear();\n  }\n\n  FORCE_INLINE bool set(ObjectConstRef src) {\n    if (!_data || !src._data) return false;\n    return _data->copyFrom(*src._data, _pool);\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getMember(const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString& key) const {\n    return getOrCreate_impl(adaptString(key));\n  }\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar* key) const {\n    return getOrCreate_impl(adaptString(key));\n  }\n\n  FORCE_INLINE bool operator==(ObjectRef rhs) const {\n    return objectEquals(_data, rhs._data);\n  }\n\n  FORCE_INLINE void remove(iterator it) const {\n    if (!_data) return;\n    _data->remove(it.internal());\n  }\n\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE void remove(const TString& key) const {\n    objectRemove(_data, adaptString(key));\n  }\n\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE void remove(TChar* key) const {\n    objectRemove(_data, adaptString(key));\n  }\n\n private:\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantRef get_impl(TAdaptedString key) const {\n    return VariantRef(_pool, objectGet(_data, key));\n  }\n\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantRef getOrCreate_impl(TAdaptedString key) const {\n    return VariantRef(_pool, objectGetOrCreate(_data, key, _pool));\n  }\n\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/ObjectShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Strings/StringAdapters.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename TParent, typename TStringRef>\nclass MemberProxy;\n\ntemplate <typename TObject>\nclass ObjectShortcuts {\n public:\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type\n  containsKey(const TString &key) const;\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value, bool>::type\n  containsKey(TChar *key) const;\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value,\n                         MemberProxy<const TObject &, const TString &> >::type\n      operator[](const TString &key) const;\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value,\n                                  MemberProxy<const TObject &, TChar *> >::type\n  operator[](TChar *key) const;\n\n  // createNestedArray(const std::string&) const\n  // createNestedArray(const String&) const\n  template <typename TString>\n  FORCE_INLINE ArrayRef createNestedArray(const TString &key) const;\n\n  // createNestedArray(char*) const\n  // createNestedArray(const char*) const\n  // createNestedArray(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE ArrayRef createNestedArray(TChar *key) const;\n\n  // createNestedObject(const std::string&) const\n  // createNestedObject(const String&) const\n  template <typename TString>\n  ObjectRef createNestedObject(const TString &key) const;\n\n  // createNestedObject(char*) const\n  // createNestedObject(const char*) const\n  // createNestedObject(const __FlashStringHelper*) const\n  template <typename TChar>\n  ObjectRef createNestedObject(TChar *key) const;\n\n private:\n  const TObject *impl() const {\n    return static_cast<const TObject *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Object/Pair.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Strings/String.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n// A key value pair for CollectionData.\nclass Pair {\n public:\n  Pair(MemoryPool* pool, VariantSlot* slot) {\n    if (slot) {\n      _key = String(slot->key(), !slot->ownsKey());\n      _value = VariantRef(pool, slot->data());\n    }\n  }\n\n  String key() const {\n    return _key;\n  }\n\n  VariantRef value() const {\n    return _value;\n  }\n\n private:\n  String _key;\n  VariantRef _value;\n};\n\nclass PairConst {\n public:\n  PairConst(const VariantSlot* slot) {\n    if (slot) {\n      _key = String(slot->key(), !slot->ownsKey());\n      _value = VariantConstRef(slot->data());\n    }\n  }\n\n  String key() const {\n    return _key;\n  }\n\n  VariantConstRef value() const {\n    return _value;\n  }\n\n private:\n  String _key;\n  VariantConstRef _value;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Operators/VariantCasts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantCasts {\n public:\n  template <typename T>\n  FORCE_INLINE operator T() const {\n    return impl()->template as<T>();\n  }\n\n private:\n  const TImpl *impl() const {\n    return static_cast<const TImpl *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Operators/VariantComparisons.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\nstruct is_simple_value {\n  static const bool value = is_integral<T>::value ||\n                            is_floating_point<T>::value ||\n                            is_same<T, bool>::value;\n};\n\ntemplate <typename TVariant>\nclass VariantComparisons {\n public:\n  // const char* == TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator==(\n      T *lhs, TVariant rhs) {\n    return adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // std::string == TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator==(\n      const T &lhs, TVariant rhs) {\n    return adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // TVariant == const char*\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator==(\n      TVariant lhs, T *rhs) {\n    return adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // TVariant == std::string\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator==(\n      TVariant lhs, const T &rhs) {\n    return adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // bool/int/float == TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator==(\n      const T &lhs, TVariant rhs) {\n    return lhs == rhs.template as<T>();\n  }\n\n  // TVariant == bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator==(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() == rhs;\n  }\n\n  // const char* != TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator!=(\n      T *lhs, TVariant rhs) {\n    return !adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // std::string != TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator!=(\n      const T &lhs, TVariant rhs) {\n    return !adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // TVariant != const char*\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator!=(\n      TVariant lhs, T *rhs) {\n    return !adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // TVariant != std::string\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator!=(\n      TVariant lhs, const T &rhs) {\n    return !adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // bool/int/float != TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator!=(\n      const T &lhs, TVariant rhs) {\n    return lhs != rhs.template as<T>();\n  }\n\n  // TVariant != bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator!=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() != rhs;\n  }\n\n  // bool/int/float < TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<(\n      const T &lhs, TVariant rhs) {\n    return lhs < rhs.template as<T>();\n  }\n\n  // TVariant < bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() < rhs;\n  }\n\n  // bool/int/float <= TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<=(\n      const T &lhs, TVariant rhs) {\n    return lhs <= rhs.template as<T>();\n  }\n\n  // TVariant <= bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() <= rhs;\n  }\n\n  // bool/int/float > TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>(\n      const T &lhs, TVariant rhs) {\n    return lhs > rhs.template as<T>();\n  }\n\n  // TVariant > bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() > rhs;\n  }\n\n  // bool/int/float >= TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>=(\n      const T &lhs, TVariant rhs) {\n    return lhs >= rhs.template as<T>();\n  }\n\n  // TVariant >= bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() >= rhs;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Operators/VariantOperators.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"VariantCasts.hpp\"\n#include \"VariantComparisons.hpp\"\n#include \"VariantOr.hpp\"\n#include \"VariantShortcuts.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantOperators : public VariantCasts<TImpl>,\n                         public VariantComparisons<TImpl>,\n                         public VariantOr<TImpl>,\n                         public VariantShortcuts<TImpl> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Operators/VariantOr.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantAs.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantOr {\n public:\n  // Returns the default value if the VariantRef is undefined of incompatible\n  template <typename T>\n  typename enable_if<!is_integral<T>::value, T>::type operator|(\n      const T &defaultValue) const {\n    if (impl()->template is<T>())\n      return impl()->template as<T>();\n    else\n      return defaultValue;\n  }\n\n  // Returns the default value if the VariantRef is undefined of incompatible\n  // Special case for string: null is treated as undefined\n  const char *operator|(const char *defaultValue) const {\n    const char *value = impl()->template as<const char *>();\n    return value ? value : defaultValue;\n  }\n\n  // Returns the default value if the VariantRef is undefined of incompatible\n  // Special case for integers: we also accept double\n  template <typename Integer>\n  typename enable_if<is_integral<Integer>::value, Integer>::type operator|(\n      const Integer &defaultValue) const {\n    if (impl()->template is<double>())\n      return impl()->template as<Integer>();\n    else\n      return defaultValue;\n  }\n\n private:\n  const TImpl *impl() const {\n    return static_cast<const TImpl *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Operators/VariantShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Array/ArrayShortcuts.hpp\"\n#include \"../Object/ObjectShortcuts.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TVariant>\nclass VariantShortcuts : public ObjectShortcuts<TVariant>,\n                         public ArrayShortcuts<TVariant> {\n public:\n  using ArrayShortcuts<TVariant>::createNestedArray;\n  using ArrayShortcuts<TVariant>::createNestedObject;\n  using ArrayShortcuts<TVariant>::operator[];\n  using ObjectShortcuts<TVariant>::createNestedArray;\n  using ObjectShortcuts<TVariant>::createNestedObject;\n  using ObjectShortcuts<TVariant>::operator[];\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/alias_cast.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stdint.h>\n#include <stdlib.h>  // for size_t\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/math.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, typename F>\nstruct alias_cast_t {\n  union {\n    F raw;\n    T data;\n  };\n};\n\ntemplate <typename T, typename F>\nT alias_cast(F raw_data) {\n  alias_cast_t<T, F> ac;\n  ac.raw = raw_data;\n  return ac.data;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/assert.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef ARDUINOJSON_DEBUG\n#include <assert.h>\n#define ARDUINOJSON_ASSERT(X) assert(X)\n#else\n#define ARDUINOJSON_ASSERT(X) ((void)0)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/attributes.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef _MSC_VER  // Visual Studio\n\n#define FORCE_INLINE  // __forceinline causes C4714 when returning std::string\n#define NO_INLINE __declspec(noinline)\n#define DEPRECATED(msg) __declspec(deprecated(msg))\n\n#elif defined(__GNUC__)  // GCC or Clang\n\n#define FORCE_INLINE __attribute__((always_inline))\n#define NO_INLINE __attribute__((noinline))\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\n#define DEPRECATED(msg) __attribute__((deprecated(msg)))\n#else\n#define DEPRECATED(msg) __attribute__((deprecated))\n#endif\n\n#else  // Other compilers\n\n#define FORCE_INLINE\n#define NO_INLINE\n#define DEPRECATED(msg)\n\n#endif\n\n#if __cplusplus >= 201103L\n#define NOEXCEPT noexcept\n#else\n#define NOEXCEPT throw()\n#endif\n\n#if defined(__has_attribute)\n#if __has_attribute(no_sanitize)\n#define ARDUINOJSON_NO_SANITIZE(check) __attribute__((no_sanitize(check)))\n#else\n#define ARDUINOJSON_NO_SANITIZE(check)\n#endif\n#else\n#define ARDUINOJSON_NO_SANITIZE(check)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/ctype.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline bool isdigit(char c) {\n  return '0' <= c && c <= '9';\n}\n\ninline bool issign(char c) {\n  return '-' == c || c == '+';\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/gsl/not_null.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../assert.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nclass not_null {\n public:\n  explicit not_null(T ptr) : _ptr(ptr) {\n    ARDUINOJSON_ASSERT(ptr != NULL);\n  }\n\n  T get() const {\n    ARDUINOJSON_ASSERT(_ptr != NULL);\n    return _ptr;\n  }\n\n private:\n  T _ptr;\n};\n\ntemplate <typename T>\nnot_null<T> make_not_null(T ptr) {\n  ARDUINOJSON_ASSERT(ptr != NULL);\n  return not_null<T>(ptr);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/limits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4310)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Differs from standard because we can't use the symbols \"min\" and \"max\"\ntemplate <typename T, typename Enable = void>\nstruct numeric_limits;\n\ntemplate <typename T>\nstruct numeric_limits<T, typename enable_if<is_unsigned<T>::value>::type> {\n  static T lowest() {\n    return 0;\n  }\n  static T highest() {\n    return T(-1);\n  }\n};\n\ntemplate <typename T>\nstruct numeric_limits<\n    T, typename enable_if<is_integral<T>::value && is_signed<T>::value>::type> {\n  static T lowest() {\n    return T(T(1) << (sizeof(T) * 8 - 1));\n  }\n  static T highest() {\n    return T(~lowest());\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/math.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Some libraries #define isnan() and isinf() so we need to check before\n// using this name\n\n#ifndef isnan\ntemplate <typename T>\nbool isnan(T x) {\n  return x != x;\n}\n#endif\n\n#ifndef isinf\ntemplate <typename T>\nbool isinf(T x) {\n  return x != 0.0 && x * 2 == x;\n}\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/mpl/max.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns the highest value\ntemplate <size_t X, size_t Y, bool MaxIsX = (X > Y)>\nstruct Max {};\n\ntemplate <size_t X, size_t Y>\nstruct Max<X, Y, true> {\n  static const size_t value = X;\n};\n\ntemplate <size_t X, size_t Y>\nstruct Max<X, Y, false> {\n  static const size_t value = Y;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/conditional.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <bool Condition, class TrueType, class FalseType>\nstruct conditional {\n  typedef TrueType type;\n};\n\ntemplate <class TrueType, class FalseType>\nstruct conditional<false, TrueType, FalseType> {\n  typedef FalseType type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/enable_if.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T if Condition is true.\ntemplate <bool Condition, typename T = void>\nstruct enable_if {};\n\ntemplate <typename T>\nstruct enable_if<true, T> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/integral_constant.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, T v>\nstruct integral_constant {\n  static const T value = v;\n};\n\ntypedef integral_constant<bool, true> true_type;\ntypedef integral_constant<bool, false> false_type;\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_array.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct is_array : false_type {};\n\ntemplate <typename T>\nstruct is_array<T[]> : true_type {};\n\ntemplate <typename T, size_t N>\nstruct is_array<T[N]> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_base_of.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if Derived inherits from TBase is an\n// integral type.\ntemplate <typename TBase, typename TDerived>\nclass is_base_of {\n protected:  // <- to avoid GCC's \"all member functions in class are private\"\n  typedef char Yes[1];\n  typedef char No[2];\n\n  static Yes &probe(const TBase *);\n  static No &probe(...);\n\n public:\n  static const bool value =\n      sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes);\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_const.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the const modifier\ntemplate <typename T>\nstruct is_const : false_type {};\n\ntemplate <typename T>\nstruct is_const<const T> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_floating_point : false_type {};\n\ntemplate <>\nstruct is_floating_point<float> : true_type {};\n\ntemplate <>\nstruct is_floating_point<double> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_integral.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../../Configuration.hpp\"\n#include \"is_same.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if T is an integral type.\ntemplate <typename T>\nstruct is_integral {\n  static const bool value =\n      is_same<T, signed char>::value || is_same<T, unsigned char>::value ||\n      is_same<T, signed short>::value || is_same<T, unsigned short>::value ||\n      is_same<T, signed int>::value || is_same<T, unsigned int>::value ||\n      is_same<T, signed long>::value || is_same<T, unsigned long>::value ||\n#if ARDUINOJSON_HAS_LONG_LONG\n      is_same<T, signed long long>::value ||\n      is_same<T, unsigned long long>::value ||\n#endif\n#if ARDUINOJSON_HAS_INT64\n      is_same<T, signed __int64>::value ||\n      is_same<T, unsigned __int64>::value ||\n#endif\n      is_same<T, char>::value;\n\n  // CAUTION: differs from std::is_integral as it doesn't include bool\n};\n\ntemplate <typename T>\nstruct is_integral<const T> : is_integral<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_same.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if types T and U are the same.\ntemplate <typename T, typename U>\nstruct is_same : false_type {};\n\ntemplate <typename T>\nstruct is_same<T, T> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_signed.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_signed : false_type {};\n\ntemplate <>\nstruct is_signed<char> : true_type {};\n\ntemplate <>\nstruct is_signed<signed char> : true_type {};\n\ntemplate <>\nstruct is_signed<signed short> : true_type {};\n\ntemplate <>\nstruct is_signed<signed int> : true_type {};\n\ntemplate <>\nstruct is_signed<signed long> : true_type {};\n\ntemplate <>\nstruct is_signed<float> : true_type {};\n\ntemplate <>\nstruct is_signed<double> : true_type {};\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct is_signed<signed long long> : true_type {};\n#endif\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct is_signed<signed __int64> : true_type {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_unsigned : false_type {};\n\ntemplate <>\nstruct is_unsigned<bool> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned char> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned short> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned int> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned long> : true_type {};\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct is_unsigned<unsigned __int64> : true_type {};\n#endif\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct is_unsigned<unsigned long long> : true_type {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"type_identity.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct make_unsigned;\n\ntemplate <>\nstruct make_unsigned<char> : type_identity<unsigned char> {};\n\ntemplate <>\nstruct make_unsigned<signed char> : type_identity<unsigned char> {};\ntemplate <>\nstruct make_unsigned<unsigned char> : type_identity<unsigned char> {};\n\ntemplate <>\nstruct make_unsigned<signed short> : type_identity<unsigned short> {};\ntemplate <>\nstruct make_unsigned<unsigned short> : type_identity<unsigned short> {};\n\ntemplate <>\nstruct make_unsigned<signed int> : type_identity<unsigned int> {};\ntemplate <>\nstruct make_unsigned<unsigned int> : type_identity<unsigned int> {};\n\ntemplate <>\nstruct make_unsigned<signed long> : type_identity<unsigned long> {};\ntemplate <>\nstruct make_unsigned<unsigned long> : type_identity<unsigned long> {};\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct make_unsigned<signed long long> : type_identity<unsigned long long> {};\ntemplate <>\nstruct make_unsigned<unsigned long long> : type_identity<unsigned long long> {};\n#endif\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct make_unsigned<signed __int64> : type_identity<unsigned __int64> {};\ntemplate <>\nstruct make_unsigned<unsigned __int64> : type_identity<unsigned __int64> {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/remove_const.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the const modifier\ntemplate <typename T>\nstruct remove_const {\n  typedef T type;\n};\ntemplate <typename T>\nstruct remove_const<const T> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/remove_reference.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the reference modifier.\ntemplate <typename T>\nstruct remove_reference {\n  typedef T type;\n};\ntemplate <typename T>\nstruct remove_reference<T&> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/type_identity.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct type_identity {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"type_traits/conditional.hpp\"\n#include \"type_traits/enable_if.hpp\"\n#include \"type_traits/integral_constant.hpp\"\n#include \"type_traits/is_array.hpp\"\n#include \"type_traits/is_base_of.hpp\"\n#include \"type_traits/is_const.hpp\"\n#include \"type_traits/is_floating_point.hpp\"\n#include \"type_traits/is_integral.hpp\"\n#include \"type_traits/is_same.hpp\"\n#include \"type_traits/is_signed.hpp\"\n#include \"type_traits/is_unsigned.hpp\"\n#include \"type_traits/make_unsigned.hpp\"\n#include \"type_traits/remove_const.hpp\"\n#include \"type_traits/remove_reference.hpp\"\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Polyfills/utility.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\ninline void swap(T& a, T& b) {\n  T t(a);\n  a = b;\n  b = t;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/DummyWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass DummyWriter {\n public:\n  size_t write(uint8_t) {\n    return 1;\n  }\n\n  size_t write(const uint8_t*, size_t n) {\n    return n;\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/DynamicStringWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\n#include <WString.h>\n#endif\n\n#if ARDUINOJSON_ENABLE_STD_STRING\n#include <string>\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct IsWriteableString : false_type {};\n\n// A Print implementation that allows to write in a String\ntemplate <typename TString>\nclass DynamicStringWriter {};\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\ntemplate <>\nstruct IsWriteableString<String> : true_type {};\n\ntemplate <>\nclass DynamicStringWriter<String> {\n public:\n  DynamicStringWriter(String &str) : _str(&str) {}\n\n  size_t write(uint8_t c) {\n    _str->operator+=(static_cast<char>(c));\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    // CAUTION: Arduino String doesn't have append()\n    // and old version doesn't have size() either\n    _str->reserve(_str->length() + n);\n    while (n > 0) {\n      _str->operator+=(static_cast<char>(*s++));\n      n--;\n    }\n    return n;\n  }\n\n private:\n  String *_str;\n};\n#endif\n\n#if ARDUINOJSON_ENABLE_STD_STRING\ntemplate <>\nstruct IsWriteableString<std::string> : true_type {};\n\ntemplate <>\nclass DynamicStringWriter<std::string> {\n public:\n  DynamicStringWriter(std::string &str) : _str(&str) {}\n\n  size_t write(uint8_t c) {\n    _str->operator+=(static_cast<char>(c));\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    _str->append(reinterpret_cast<const char *>(s), n);\n    return n;\n  }\n\n private:\n  std::string *_str;\n};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/StaticStringWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A Print implementation that allows to write in a char[]\nclass StaticStringWriter {\n public:\n  StaticStringWriter(char *buf, size_t size) : end(buf + size - 1), p(buf) {\n    *p = '\\0';\n  }\n\n  size_t write(uint8_t c) {\n    if (p >= end) return 0;\n    *p++ = static_cast<char>(c);\n    *p = '\\0';\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    char *begin = p;\n    while (p < end && n > 0) {\n      *p++ = static_cast<char>(*s++);\n      n--;\n    }\n    *p = '\\0';\n    return size_t(p - begin);\n  }\n\n private:\n  char *end;\n  char *p;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/StreamWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n\n#include <ostream>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StreamWriter {\n public:\n  explicit StreamWriter(std::ostream& os) : _os(os) {}\n\n  size_t write(uint8_t c) {\n    _os << c;\n    return 1;\n  }\n\n  size_t write(const uint8_t* s, size_t n) {\n    _os.write(reinterpret_cast<const char*>(s),\n              static_cast<std::streamsize>(n));\n    return n;\n  }\n\n private:\n  // cannot be assigned\n  StreamWriter& operator=(const StreamWriter&);\n\n  std::ostream& _os;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif  // ARDUINOJSON_ENABLE_STD_STREAM\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/measure.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./DummyWriter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t measure(const TSource &source) {\n  DummyWriter dp;\n  TSerializer<DummyWriter> serializer(dp);\n  source.accept(serializer);\n  return serializer.bytesWritten();\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Serialization/serialize.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./DynamicStringWriter.hpp\"\n#include \"./StaticStringWriter.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n#include \"./StreamWriter.hpp\"\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename> class TSerializer, typename TSource,\n          typename TDestination>\nsize_t doSerialize(const TSource &source, TDestination &destination) {\n  TSerializer<TDestination> serializer(destination);\n  source.accept(serializer);\n  return serializer.bytesWritten();\n}\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, std::ostream &destination) {\n  StreamWriter writer(destination);\n  return doSerialize<TSerializer>(source, writer);\n}\n#endif\n\n#if ARDUINOJSON_ENABLE_ARDUINO_PRINT\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, Print &destination) {\n  return doSerialize<TSerializer>(source, destination);\n}\n#endif\n\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, char *buffer, size_t bufferSize) {\n  StaticStringWriter writer(buffer, bufferSize);\n  return doSerialize<TSerializer>(source, writer);\n}\n\ntemplate <template <typename> class TSerializer, typename TSource, size_t N>\nsize_t serialize(const TSource &source, char (&buffer)[N]) {\n  StaticStringWriter writer(buffer, N);\n  return doSerialize<TSerializer>(source, writer);\n}\n\ntemplate <template <typename> class TSerializer, typename TSource,\n          typename TString>\ntypename enable_if<IsWriteableString<TString>::value, size_t>::type serialize(\n    const TSource &source, TString &str) {\n  DynamicStringWriter<TString> writer(str);\n  return doSerialize<TSerializer>(source, writer);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/StringStorage/StringCopier.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Memory/StringBuilder.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringCopier {\n public:\n  typedef ARDUINOJSON_NAMESPACE::StringBuilder StringBuilder;\n\n  StringCopier(MemoryPool* pool) : _pool(pool) {}\n\n  StringBuilder startString() {\n    return StringBuilder(_pool);\n  }\n\n private:\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/StringStorage/StringMover.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringMover {\n public:\n  class StringBuilder {\n   public:\n    StringBuilder(char** ptr) : _writePtr(ptr), _startPtr(*ptr) {}\n\n    void append(char c) {\n      *(*_writePtr)++ = char(c);\n    }\n\n    char* complete() const {\n      *(*_writePtr)++ = 0;\n      return _startPtr;\n    }\n\n   private:\n    char** _writePtr;\n    char* _startPtr;\n  };\n\n  StringMover(char* ptr) : _ptr(ptr) {}\n\n  StringBuilder startString() {\n    return StringBuilder(&_ptr);\n  }\n\n private:\n  char* _ptr;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/StringStorage/StringStorage.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./StringCopier.hpp\"\n#include \"./StringMover.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TInput, typename Enable = void>\nstruct StringStorage {\n  typedef StringCopier type;\n\n  static type create(MemoryPool& pool, TInput&) {\n    return type(&pool);\n  }\n};\n\ntemplate <typename TChar>\nstruct StringStorage<TChar*,\n                     typename enable_if<!is_const<TChar>::value>::type> {\n  typedef StringMover type;\n\n  static type create(MemoryPool&, TChar* input) {\n    return type(reinterpret_cast<char*>(input));\n  }\n};\n\ntemplate <typename TInput>\ntypename StringStorage<TInput>::type makeStringStorage(MemoryPool& pool,\n                                                       TInput& input) {\n  return StringStorage<TInput>::create(pool, input);\n}\n\ntemplate <typename TChar>\ntypename StringStorage<TChar*>::type makeStringStorage(MemoryPool& pool,\n                                                       TChar* input) {\n  return StringStorage<TChar*>::create(pool, input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/ArduinoStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <WString.h>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ArduinoStringAdapter {\n public:\n  ArduinoStringAdapter(const ::String& str) : _str(&str) {}\n\n  char* save(MemoryPool* pool) const {\n    if (isNull()) return NULL;\n    size_t n = _str->length() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str->c_str(), n);\n    return dup;\n  }\n\n  bool isNull() const {\n    // Arduino's String::c_str() can return NULL\n    return !_str->c_str();\n  }\n\n  bool equals(const char* expected) const {\n    // Arduino's String::c_str() can return NULL\n    const char* actual = _str->c_str();\n    if (!actual || !expected) return actual == expected;\n    return 0 == strcmp(actual, expected);\n  }\n\n  const char* data() const {\n    return _str->c_str();\n  }\n\n  size_t size() const {\n    return _str->length();\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const ::String* _str;\n};\n\ntemplate <>\nstruct IsString< ::String> : true_type {};\n\ntemplate <>\nstruct IsString< ::StringSumHelper> : true_type {};\n\ninline ArduinoStringAdapter adaptString(const ::String& str) {\n  return ArduinoStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/ConstRamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n#include <string.h>  // strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ConstRamStringAdapter {\n public:\n  ConstRamStringAdapter(const char* str = 0) : _str(str) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = _str;\n    if (!actual || !expected) return actual == expected;\n    return strcmp(actual, expected) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  template <typename TMemoryPool>\n  char* save(TMemoryPool*) const {\n    return 0;\n  }\n\n  size_t size() const {\n    if (!_str) return 0;\n    return strlen(_str);\n  }\n\n  const char* data() const {\n    return _str;\n  }\n\n  bool isStatic() const {\n    return true;\n  }\n\n protected:\n  const char* _str;\n};\n\ninline ConstRamStringAdapter adaptString(const char* str) {\n  return ConstRamStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/FlashStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass FlashStringAdapter {\n public:\n  FlashStringAdapter(const __FlashStringHelper* str) : _str(str) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strcmp_P(expected, actual) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    size_t n = size() + 1;  // copy the terminator\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy_P(dup, reinterpret_cast<const char*>(_str), n);\n    return dup;\n  }\n\n  const char* data() const {\n    return 0;\n  }\n\n  size_t size() const {\n    if (!_str) return 0;\n    return strlen_P(reinterpret_cast<const char*>(_str));\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const __FlashStringHelper* _str;\n};\n\ninline FlashStringAdapter adaptString(const __FlashStringHelper* str) {\n  return FlashStringAdapter(str);\n}\n\ntemplate <>\nstruct IsString<const __FlashStringHelper*> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/RamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ConstRamStringAdapter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass RamStringAdapter : public ConstRamStringAdapter {\n public:\n  RamStringAdapter(const char* str) : ConstRamStringAdapter(str) {}\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    size_t n = size() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str, n);\n    return dup;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n};\n\ntemplate <typename TChar>\ninline RamStringAdapter adaptString(const TChar* str) {\n  return RamStringAdapter(reinterpret_cast<const char*>(str));\n}\n\ninline RamStringAdapter adaptString(char* str) {\n  return RamStringAdapter(str);\n}\n\ntemplate <typename TChar>\nstruct IsString<TChar*> {\n  static const bool value = sizeof(TChar) == 1;\n};\n\ntemplate <>\nstruct IsString<void*> {\n  static const bool value = false;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/SizedFlashStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass SizedFlashStringAdapter {\n public:\n  SizedFlashStringAdapter(const __FlashStringHelper* str, size_t sz)\n      : _str(str), _size(sz) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strncmp_P(expected, actual, _size) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    char* dup = pool->allocFrozenString(_size);\n    if (!dup) memcpy_P(dup, (const char*)_str, _size);\n    return dup;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const __FlashStringHelper* _str;\n  size_t _size;\n};\n\ninline SizedFlashStringAdapter adaptString(const __FlashStringHelper* str,\n                                           size_t sz) {\n  return SizedFlashStringAdapter(str, sz);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/SizedRamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <string.h>  // strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass SizedRamStringAdapter {\n public:\n  SizedRamStringAdapter(const char* str, size_t n) : _str(str), _size(n) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strcmp(actual, expected) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    char* dup = pool->allocFrozenString(_size);\n    if (dup) memcpy(dup, _str, _size);\n    return dup;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const char* _str;\n  size_t _size;\n};\n\ntemplate <typename TChar>\ninline SizedRamStringAdapter adaptString(const TChar* str, size_t size) {\n  return SizedRamStringAdapter(reinterpret_cast<const char*>(str), size);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/StlStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <string>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StlStringAdapter {\n public:\n  StlStringAdapter(const std::string& str) : _str(&str) {}\n\n  char* save(MemoryPool* pool) const {\n    size_t n = _str->length() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str->c_str(), n);\n    return dup;\n  }\n\n  bool isNull() const {\n    return false;\n  }\n\n  bool equals(const char* expected) const {\n    if (!expected) return false;\n    return *_str == expected;\n  }\n\n  const char* data() const {\n    return _str->data();\n  }\n\n  size_t size() const {\n    return _str->size();\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const std::string* _str;\n};\n\ntemplate <>\nstruct IsString<std::string> : true_type {};\n\ninline StlStringAdapter adaptString(const std::string& str) {\n  return StlStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/String.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ConstRamStringAdapter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass String {\n public:\n  String() : _data(0), _isStatic(true) {}\n  String(const char* data, bool isStaticData = true)\n      : _data(data), _isStatic(isStaticData) {}\n\n  const char* c_str() const {\n    return _data;\n  }\n\n  bool isNull() const {\n    return !_data;\n  }\n\n  bool isStatic() const {\n    return _isStatic;\n  }\n\n  friend bool operator==(String lhs, String rhs) {\n    if (lhs._data == rhs._data) return true;\n    if (!lhs._data) return false;\n    if (!rhs._data) return false;\n    return strcmp(lhs._data, rhs._data) == 0;\n  }\n\n private:\n  const char* _data;\n  bool _isStatic;\n};\n\nclass StringAdapter : public RamStringAdapter {\n public:\n  StringAdapter(const String& str)\n      : RamStringAdapter(str.c_str()), _isStatic(str.isStatic()) {}\n\n  bool isStatic() const {\n    return _isStatic;\n  }\n\n  /*  const char* save(MemoryPool* pool) const {\n      if (_isStatic) return c_str();\n      return RamStringAdapter::save(pool);\n    }*/\n\n private:\n  bool _isStatic;\n};\n\ntemplate <>\nstruct IsString<String> : true_type {};\n\ninline StringAdapter adaptString(const String& str) {\n  return StringAdapter(str);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Strings/StringAdapters.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename>\nstruct IsString : false_type {};\n\ntemplate <typename T>\nstruct IsString<const T> : IsString<T> {};\n\ntemplate <typename T>\nstruct IsString<T&> : IsString<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#include \"ConstRamStringAdapter.hpp\"\n#include \"RamStringAdapter.hpp\"\n#include \"SizedRamStringAdapter.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STRING\n#include \"StlStringAdapter.hpp\"\n#endif\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\n#include \"ArduinoStringAdapter.hpp\"\n#endif\n\n#if ARDUINOJSON_ENABLE_PROGMEM\n#include \"FlashStringAdapter.hpp\"\n#include \"SizedFlashStringAdapter.hpp\"\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/SlotFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/assert.hpp\"\n#include \"../Strings/StringAdapters.hpp\"\n#include \"VariantData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TAdaptedString>\ninline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool) {\n  if (!var) return false;\n  if (key.isStatic()) {\n    var->setLinkedKey(make_not_null(key.data()));\n  } else {\n    const char* dup = key.save(pool);\n    if (!dup) return false;\n    var->setOwnedKey(make_not_null(dup));\n  }\n  return true;\n}\n\ninline size_t slotSize(const VariantSlot* var) {\n  size_t n = 0;\n  while (var) {\n    n++;\n    var = var->next();\n  }\n  return n;\n}\n\ninline VariantData* slotData(VariantSlot* slot) {\n  return reinterpret_cast<VariantData*>(slot);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantAs.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Serialization/DynamicStringWriter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ArrayRef;\nclass ArrayConstRef;\nclass ObjectRef;\nclass ObjectConstRef;\nclass VariantRef;\nclass VariantConstRef;\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::as<T>()\ntemplate <typename T>\nstruct VariantAs {\n  typedef T type;\n};\n\ntemplate <>\nstruct VariantAs<char*> {\n  typedef const char* type;\n};\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::as<T>()\ntemplate <typename T>\nstruct VariantConstAs {\n  typedef typename VariantAs<T>::type type;\n};\n\ntemplate <>\nstruct VariantConstAs<VariantRef> {\n  typedef VariantConstRef type;\n};\n\ntemplate <>\nstruct VariantConstAs<ObjectRef> {\n  typedef ObjectConstRef type;\n};\n\ntemplate <>\nstruct VariantConstAs<ArrayRef> {\n  typedef ArrayConstRef type;\n};\n\n// ---\n\ntemplate <typename T>\ninline typename enable_if<is_integral<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asIntegral<T>() : T(0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, bool>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asBoolean() : false;\n}\n\ntemplate <typename T>\ninline typename enable_if<is_floating_point<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asFloat<T>() : T(0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, const char*>::value ||\n                              is_same<T, char*>::value,\n                          const char*>::type\nvariantAs(const VariantData* _data) {\n  return _data != 0 ? _data->asString() : 0;\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<ArrayConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<is_same<ObjectConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<is_same<VariantConstRef, T>::value, T>::type\nvariantAs(const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<IsWriteableString<T>::value, T>::type variantAs(\n    const VariantData* _data);\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantAsImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Serialization/DynamicStringWriter.hpp\"\n#include \"VariantFunctions.hpp\"\n#include \"VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline typename enable_if<is_same<ArrayConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return ArrayConstRef(variantAsArray(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<ObjectConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return ObjectConstRef(variantAsObject(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<VariantConstRef, T>::value, T>::type\nvariantAs(const VariantData* _data) {\n  return VariantConstRef(_data);\n}\n\ntemplate <typename T>\ninline typename enable_if<IsWriteableString<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  const char* cstr = _data != 0 ? _data->asString() : 0;\n  if (cstr) return T(cstr);\n  T s;\n  serializeJson(VariantConstRef(_data), s);\n  return s;\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantContent.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\n#include \"../Collection/CollectionData.hpp\"\n#include \"../Numbers/Float.hpp\"\n#include \"../Numbers/Integer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n//\nenum {\n  VALUE_MASK = 0x7F,\n\n  VALUE_IS_NULL = 0,\n  VALUE_IS_LINKED_RAW = 0x01,\n  VALUE_IS_OWNED_RAW = 0x02,\n  VALUE_IS_LINKED_STRING = 0x03,\n  VALUE_IS_OWNED_STRING = 0x04,\n  VALUE_IS_BOOLEAN = 0x05,\n  VALUE_IS_POSITIVE_INTEGER = 0x06,\n  VALUE_IS_NEGATIVE_INTEGER = 0x07,\n  VALUE_IS_FLOAT = 0x08,\n\n  COLLECTION_MASK = 0x60,\n  VALUE_IS_OBJECT = 0x20,\n  VALUE_IS_ARRAY = 0x40,\n\n  KEY_IS_OWNED = 0x80\n};\n\nstruct RawData {\n  const char *data;\n  size_t size;\n};\n\nunion VariantContent {\n  Float asFloat;\n  UInt asInteger;\n  CollectionData asCollection;\n  const char *asString;\n  struct {\n    const char *data;\n    size_t size;\n  } asRaw;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantData.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Misc/SerializedValue.hpp\"\n#include \"../Numbers/convertNumber.hpp\"\n#include \"../Polyfills/gsl/not_null.hpp\"\n#include \"VariantContent.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass VariantData {\n  VariantContent _content;  // must be first to allow cast from array to variant\n  uint8_t _flags;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    switch (type()) {\n      case VALUE_IS_FLOAT:\n        return visitor.visitFloat(_content.asFloat);\n\n      case VALUE_IS_ARRAY:\n        return visitor.visitArray(_content.asCollection);\n\n      case VALUE_IS_OBJECT:\n        return visitor.visitObject(_content.asCollection);\n\n      case VALUE_IS_LINKED_STRING:\n      case VALUE_IS_OWNED_STRING:\n        return visitor.visitString(_content.asString);\n\n      case VALUE_IS_OWNED_RAW:\n      case VALUE_IS_LINKED_RAW:\n        return visitor.visitRawJson(_content.asRaw.data, _content.asRaw.size);\n\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return visitor.visitNegativeInteger(_content.asInteger);\n\n      case VALUE_IS_POSITIVE_INTEGER:\n        return visitor.visitPositiveInteger(_content.asInteger);\n\n      case VALUE_IS_BOOLEAN:\n        return visitor.visitBoolean(_content.asInteger != 0);\n\n      default:\n        return visitor.visitNull();\n    }\n  }\n\n  template <typename T>\n  T asIntegral() const;\n\n  template <typename T>\n  T asFloat() const;\n\n  const char *asString() const;\n\n  bool asBoolean() const;\n\n  CollectionData *asArray() {\n    return isArray() ? &_content.asCollection : 0;\n  }\n\n  const CollectionData *asArray() const {\n    return const_cast<VariantData *>(this)->asArray();\n  }\n\n  CollectionData *asObject() {\n    return isObject() ? &_content.asCollection : 0;\n  }\n\n  const CollectionData *asObject() const {\n    return const_cast<VariantData *>(this)->asObject();\n  }\n\n  bool copyFrom(const VariantData &src, MemoryPool *pool) {\n    switch (src.type()) {\n      case VALUE_IS_ARRAY:\n        return toArray().copyFrom(src._content.asCollection, pool);\n      case VALUE_IS_OBJECT:\n        return toObject().copyFrom(src._content.asCollection, pool);\n      case VALUE_IS_OWNED_STRING:\n        return setOwnedString(RamStringAdapter(src._content.asString), pool);\n      case VALUE_IS_OWNED_RAW:\n        return setOwnedRaw(\n            serialized(src._content.asRaw.data, src._content.asRaw.size), pool);\n      default:\n        setType(src.type());\n        _content = src._content;\n        return true;\n    }\n  }\n\n  bool equals(const VariantData &other) const {\n    if (type() != other.type()) return false;\n\n    switch (type()) {\n      case VALUE_IS_LINKED_STRING:\n      case VALUE_IS_OWNED_STRING:\n        return !strcmp(_content.asString, other._content.asString);\n\n      case VALUE_IS_LINKED_RAW:\n      case VALUE_IS_OWNED_RAW:\n        return _content.asRaw.size == other._content.asRaw.size &&\n               !memcmp(_content.asRaw.data, other._content.asRaw.data,\n                       _content.asRaw.size);\n\n      case VALUE_IS_BOOLEAN:\n      case VALUE_IS_POSITIVE_INTEGER:\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return _content.asInteger == other._content.asInteger;\n\n      case VALUE_IS_ARRAY:\n        return _content.asCollection.equalsArray(other._content.asCollection);\n\n      case VALUE_IS_OBJECT:\n        return _content.asCollection.equalsObject(other._content.asCollection);\n\n      case VALUE_IS_FLOAT:\n        return _content.asFloat == other._content.asFloat;\n\n      case VALUE_IS_NULL:\n      default:\n        return true;\n    }\n  }\n\n  bool isArray() const {\n    return (_flags & VALUE_IS_ARRAY) != 0;\n  }\n\n  bool isBoolean() const {\n    return type() == VALUE_IS_BOOLEAN;\n  }\n\n  bool isCollection() const {\n    return (_flags & COLLECTION_MASK) != 0;\n  }\n\n  template <typename T>\n  bool isInteger() const {\n    switch (type()) {\n      case VALUE_IS_POSITIVE_INTEGER:\n        return canStorePositiveInteger<T>(_content.asInteger);\n\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return canStoreNegativeInteger<T>(_content.asInteger);\n\n      default:\n        return false;\n    }\n  }\n\n  bool isFloat() const {\n    return type() == VALUE_IS_FLOAT || type() == VALUE_IS_POSITIVE_INTEGER ||\n           type() == VALUE_IS_NEGATIVE_INTEGER;\n  }\n\n  bool isString() const {\n    return type() == VALUE_IS_LINKED_STRING || type() == VALUE_IS_OWNED_STRING;\n  }\n\n  bool isObject() const {\n    return (_flags & VALUE_IS_OBJECT) != 0;\n  }\n\n  bool isNull() const {\n    return type() == VALUE_IS_NULL;\n  }\n\n  void remove(size_t index) {\n    if (isArray()) _content.asCollection.remove(index);\n  }\n\n  template <typename TAdaptedString>\n  void remove(TAdaptedString key) {\n    if (isObject()) _content.asCollection.remove(key);\n  }\n\n  void setBoolean(bool value) {\n    setType(VALUE_IS_BOOLEAN);\n    _content.asInteger = static_cast<UInt>(value);\n  }\n\n  void setFloat(Float value) {\n    setType(VALUE_IS_FLOAT);\n    _content.asFloat = value;\n  }\n\n  void setLinkedRaw(SerializedValue<const char *> value) {\n    if (value.data()) {\n      setType(VALUE_IS_LINKED_RAW);\n      _content.asRaw.data = value.data();\n      _content.asRaw.size = value.size();\n    } else {\n      setType(VALUE_IS_NULL);\n    }\n  }\n\n  template <typename T>\n  bool setOwnedRaw(SerializedValue<T> value, MemoryPool *pool) {\n    char *dup = adaptString(value.data(), value.size()).save(pool);\n    if (dup) {\n      setType(VALUE_IS_OWNED_RAW);\n      _content.asRaw.data = dup;\n      _content.asRaw.size = value.size();\n      return true;\n    } else {\n      setType(VALUE_IS_NULL);\n      return false;\n    }\n  }\n\n  template <typename T>\n  typename enable_if<is_unsigned<T>::value>::type setInteger(T value) {\n    setUnsignedInteger(value);\n  }\n\n  template <typename T>\n  typename enable_if<is_signed<T>::value>::type setInteger(T value) {\n    setSignedInteger(value);\n  }\n\n  template <typename T>\n  void setSignedInteger(T value) {\n    if (value >= 0) {\n      setPositiveInteger(static_cast<UInt>(value));\n    } else {\n      setNegativeInteger(~static_cast<UInt>(value) + 1);\n    }\n  }\n\n  void setPositiveInteger(UInt value) {\n    setType(VALUE_IS_POSITIVE_INTEGER);\n    _content.asInteger = value;\n  }\n\n  void setNegativeInteger(UInt value) {\n    setType(VALUE_IS_NEGATIVE_INTEGER);\n    _content.asInteger = value;\n  }\n\n  void setLinkedString(const char *value) {\n    if (value) {\n      setType(VALUE_IS_LINKED_STRING);\n      _content.asString = value;\n    } else {\n      setType(VALUE_IS_NULL);\n    }\n  }\n\n  void setNull() {\n    setType(VALUE_IS_NULL);\n  }\n\n  void setOwnedString(not_null<const char *> s) {\n    setType(VALUE_IS_OWNED_STRING);\n    _content.asString = s.get();\n  }\n\n  bool setOwnedString(const char *s) {\n    if (s) {\n      setOwnedString(make_not_null(s));\n      return true;\n    } else {\n      setType(VALUE_IS_NULL);\n      return false;\n    }\n  }\n\n  template <typename T>\n  bool setOwnedString(T value, MemoryPool *pool) {\n    return setOwnedString(value.save(pool));\n  }\n\n  void setUnsignedInteger(UInt value) {\n    setType(VALUE_IS_POSITIVE_INTEGER);\n    _content.asInteger = static_cast<UInt>(value);\n  }\n\n  CollectionData &toArray() {\n    setType(VALUE_IS_ARRAY);\n    _content.asCollection.clear();\n    return _content.asCollection;\n  }\n\n  CollectionData &toObject() {\n    setType(VALUE_IS_OBJECT);\n    _content.asCollection.clear();\n    return _content.asCollection;\n  }\n\n  size_t memoryUsage() const {\n    switch (type()) {\n      case VALUE_IS_OWNED_STRING:\n        return strlen(_content.asString) + 1;\n      case VALUE_IS_OWNED_RAW:\n        return _content.asRaw.size;\n      case VALUE_IS_OBJECT:\n      case VALUE_IS_ARRAY:\n        return _content.asCollection.memoryUsage();\n      default:\n        return 0;\n    }\n  }\n\n  size_t nesting() const {\n    return isCollection() ? _content.asCollection.nesting() : 0;\n  }\n\n  size_t size() const {\n    return isCollection() ? _content.asCollection.size() : 0;\n  }\n\n  VariantData *addElement(MemoryPool *pool) {\n    if (isNull()) toArray();\n    if (!isArray()) return 0;\n    return _content.asCollection.add(pool);\n  }\n\n  VariantData *getElement(size_t index) const {\n    return isArray() ? _content.asCollection.get(index) : 0;\n  }\n\n  template <typename TAdaptedString>\n  VariantData *getMember(TAdaptedString key) const {\n    return isObject() ? _content.asCollection.get(key) : 0;\n  }\n\n  template <typename TAdaptedString>\n  VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool) {\n    if (isNull()) toObject();\n    if (!isObject()) return 0;\n    VariantData *var = _content.asCollection.get(key);\n    if (var) return var;\n    return _content.asCollection.add(key, pool);\n  }\n\n private:\n  uint8_t type() const {\n    return _flags & VALUE_MASK;\n  }\n\n  void setType(uint8_t t) {\n    _flags &= KEY_IS_OWNED;\n    _flags |= t;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"VariantData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename Visitor>\ninline void variantAccept(const VariantData *var, Visitor &visitor) {\n  if (var != 0)\n    var->accept(visitor);\n  else\n    visitor.visitNull();\n}\n\ninline const CollectionData *variantAsArray(const VariantData *var) {\n  return var != 0 ? var->asArray() : 0;\n}\n\ninline const CollectionData *variantAsObject(const VariantData *var) {\n  return var != 0 ? var->asObject() : 0;\n}\n\ninline CollectionData *variantAsObject(VariantData *var) {\n  return var != 0 ? var->asObject() : 0;\n}\n\ninline bool variantCopyFrom(VariantData *dst, const VariantData *src,\n                            MemoryPool *pool) {\n  if (!dst) return false;\n  if (!src) {\n    dst->setNull();\n    return true;\n  }\n  return dst->copyFrom(*src, pool);\n}\n\ninline bool variantEquals(const VariantData *a, const VariantData *b) {\n  if (a == b) return true;\n  if (!a || !b) return false;\n  return a->equals(*b);\n}\n\ninline bool variantIsArray(const VariantData *var) {\n  return var && var->isArray();\n}\n\ninline bool variantIsBoolean(const VariantData *var) {\n  return var && var->isBoolean();\n}\n\ntemplate <typename T>\ninline bool variantIsInteger(const VariantData *var) {\n  return var && var->isInteger<T>();\n}\n\ninline bool variantIsFloat(const VariantData *var) {\n  return var && var->isFloat();\n}\n\ninline bool variantIsString(const VariantData *var) {\n  return var && var->isString();\n}\n\ninline bool variantIsObject(const VariantData *var) {\n  return var && var->isObject();\n}\n\ninline bool variantIsNull(const VariantData *var) {\n  return var == 0 || var->isNull();\n}\n\ninline bool variantSetBoolean(VariantData *var, bool value) {\n  if (!var) return false;\n  var->setBoolean(value);\n  return true;\n}\n\ninline bool variantSetFloat(VariantData *var, Float value) {\n  if (!var) return false;\n  var->setFloat(value);\n  return true;\n}\n\ninline bool variantSetLinkedRaw(VariantData *var,\n                                SerializedValue<const char *> value) {\n  if (!var) return false;\n  var->setLinkedRaw(value);\n  return true;\n}\n\ntemplate <typename T>\ninline bool variantSetOwnedRaw(VariantData *var, SerializedValue<T> value,\n                               MemoryPool *pool) {\n  return var != 0 && var->setOwnedRaw(value, pool);\n}\n\ntemplate <typename T>\ninline bool variantSetSignedInteger(VariantData *var, T value) {\n  if (!var) return false;\n  var->setSignedInteger(value);\n  return true;\n}\n\ninline bool variantSetLinkedString(VariantData *var, const char *value) {\n  if (!var) return false;\n  var->setLinkedString(value);\n  return true;\n}\n\ninline void variantSetNull(VariantData *var) {\n  if (!var) return;\n  var->setNull();\n}\n\ninline bool variantSetOwnedString(VariantData *var, char *value) {\n  if (!var) return false;\n  var->setOwnedString(value);\n  return true;\n}\n\ntemplate <typename T>\ninline bool variantSetOwnedString(VariantData *var, T value, MemoryPool *pool) {\n  return var != 0 && var->setOwnedString(value, pool);\n}\n\ninline bool variantSetUnsignedInteger(VariantData *var, UInt value) {\n  if (!var) return false;\n  var->setUnsignedInteger(value);\n  return true;\n}\n\ninline size_t variantSize(const VariantData *var) {\n  return var != 0 ? var->size() : 0;\n}\n\ninline CollectionData *variantToArray(VariantData *var) {\n  if (!var) return 0;\n  return &var->toArray();\n}\n\ninline CollectionData *variantToObject(VariantData *var) {\n  if (!var) return 0;\n  return &var->toObject();\n}\n\ninline NO_INLINE VariantData *variantAdd(VariantData *var, MemoryPool *pool) {\n  return var != 0 ? var->addElement(pool) : 0;\n}\n\ntemplate <typename TChar>\nNO_INLINE VariantData *variantGetOrCreate(VariantData *var, TChar *key,\n                                          MemoryPool *pool) {\n  return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0;\n}\n\ntemplate <typename TString>\nNO_INLINE VariantData *variantGetOrCreate(VariantData *var, const TString &key,\n                                          MemoryPool *pool) {\n  return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0;\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Numbers/convertNumber.hpp\"\n#include \"../Numbers/parseFloat.hpp\"\n#include \"../Numbers/parseInteger.hpp\"\n#include \"VariantRef.hpp\"\n\n#include <string.h>  // for strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline T VariantData::asIntegral() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n      return convertPositiveInteger<T>(_content.asInteger);\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return convertNegativeInteger<T>(_content.asInteger);\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return parseInteger<T>(_content.asString);\n    case VALUE_IS_FLOAT:\n      return convertFloat<T>(_content.asFloat);\n    default:\n      return 0;\n  }\n}\n\ninline bool VariantData::asBoolean() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return _content.asInteger != 0;\n    case VALUE_IS_FLOAT:\n      return _content.asFloat != 0;\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return strcmp(\"true\", _content.asString) == 0;\n    default:\n      return false;\n  }\n}\n\n// T = float/double\ntemplate <typename T>\ninline T VariantData::asFloat() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n      return static_cast<T>(_content.asInteger);\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return -static_cast<T>(_content.asInteger);\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return parseFloat<T>(_content.asString);\n    case VALUE_IS_FLOAT:\n      return static_cast<T>(_content.asFloat);\n    default:\n      return 0;\n  }\n}\n\ninline const char *VariantData::asString() const {\n  switch (type()) {\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return _content.asString;\n    default:\n      return 0;\n  }\n}\n\ntemplate <typename TVariant>\ntypename enable_if<IsVisitable<TVariant>::value, bool>::type VariantRef::set(\n    const TVariant &value) const {\n  VariantConstRef v = value;\n  return variantCopyFrom(_data, v._data, _pool);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ArrayRef>::value, T>::type VariantRef::as()\n    const {\n  return ArrayRef(_pool, _data != 0 ? _data->asArray() : 0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ObjectRef>::value, T>::type\nVariantRef::as() const {\n  return ObjectRef(_pool, variantAsObject(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type\nVariantRef::to() const {\n  return ArrayRef(_pool, variantToArray(_data));\n}\n\ntemplate <typename T>\ntypename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type\nVariantRef::to() const {\n  return ObjectRef(_pool, variantToObject(_data));\n}\n\ntemplate <typename T>\ntypename enable_if<is_same<T, VariantRef>::value, VariantRef>::type\nVariantRef::to() const {\n  variantSetNull(_data);\n  return *this;\n}\n\ninline VariantConstRef VariantConstRef::operator[](size_t index) const {\n  return ArrayConstRef(_data != 0 ? _data->asArray() : 0)[index];\n}\n\ninline VariantRef VariantRef::addElement() const {\n  return VariantRef(_pool, variantAdd(_data, _pool));\n}\n\ninline VariantRef VariantRef::getElement(size_t index) const {\n  return VariantRef(_pool, _data != 0 ? _data->getElement(index) : 0);\n}\n\ntemplate <typename TChar>\ninline VariantRef VariantRef::getMember(TChar *key) const {\n  return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0);\n}\n\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value, VariantRef>::type\nVariantRef::getMember(const TString &key) const {\n  return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0);\n}\n\ntemplate <typename TChar>\ninline VariantRef VariantRef::getOrAddMember(TChar *key) const {\n  return VariantRef(_pool, variantGetOrCreate(_data, key, _pool));\n}\n\ntemplate <typename TString>\ninline VariantRef VariantRef::getOrAddMember(const TString &key) const {\n  return VariantRef(_pool, variantGetOrCreate(_data, key, _pool));\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>\n#include <stdint.h>  // for uint8_t\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Misc/Visitable.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"VariantAs.hpp\"\n#include \"VariantFunctions.hpp\"\n#include \"VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Forward declarations.\nclass ArrayRef;\nclass ObjectRef;\n\ntemplate <typename, typename>\nclass MemberProxy;\n\n// Contains the methods shared by VariantRef and VariantConstRef\ntemplate <typename TData>\nclass VariantRefBase {\n public:\n  // Tells wether the variant has the specified type.\n  // Returns true if the variant has type type T, false otherwise.\n  //\n  // bool is<char>() const;\n  // bool is<signed char>() const;\n  // bool is<signed short>() const;\n  // bool is<signed int>() const;\n  // bool is<signed long>() const;\n  // bool is<unsigned char>() const;\n  // bool is<unsigned short>() const;\n  // bool is<unsigned int>() const;\n  // bool is<unsigned long>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_integral<T>::value, bool>::type is()\n      const {\n    return variantIsInteger<T>(_data);\n  }\n  //\n  // bool is<double>() const;\n  // bool is<float>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_floating_point<T>::value, bool>::type is()\n      const {\n    return variantIsFloat(_data);\n  }\n  //\n  // bool is<bool>() const\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, bool>::value, bool>::type is()\n      const {\n    return variantIsBoolean(_data);\n  }\n  //\n  // bool is<const char*>() const;\n  // bool is<char*>() const;\n  // bool is<std::string>() const;\n  // bool is<String>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, const char *>::value ||\n                                      is_same<T, char *>::value ||\n                                      IsWriteableString<T>::value,\n                                  bool>::type\n  is() const {\n    return variantIsString(_data);\n  }\n  //\n  // bool is<ArrayRef> const;\n  // bool is<const ArrayRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<\n      is_same<typename remove_const<T>::type, ArrayRef>::value, bool>::type\n  is() const {\n    return variantIsArray(_data);\n  }\n  //\n  // bool is<ObjectRef> const;\n  // bool is<const ObjectRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<\n      is_same<typename remove_const<T>::type, ObjectRef>::value, bool>::type\n  is() const {\n    return variantIsObject(_data);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return variantIsNull(_data);\n  }\n\n  FORCE_INLINE bool isUndefined() const {\n    return !_data;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  size_t size() const {\n    return variantSize(_data);\n  }\n\n protected:\n  VariantRefBase(TData *data) : _data(data) {}\n  TData *_data;\n};\n\n// A variant that can be a any value serializable to a JSON value.\n//\n// It can be set to:\n// - a boolean\n// - a char, short, int or a long (signed or unsigned)\n// - a string (const char*)\n// - a reference to a ArrayRef or ObjectRef\nclass VariantRef : public VariantRefBase<VariantData>,\n                   public VariantOperators<VariantRef>,\n                   public Visitable {\n  typedef VariantRefBase<VariantData> base_type;\n  friend class VariantConstRef;\n\n public:\n  // Intenal use only\n  FORCE_INLINE VariantRef(MemoryPool *pool, VariantData *data)\n      : base_type(data), _pool(pool) {}\n\n  // Creates an uninitialized VariantRef\n  FORCE_INLINE VariantRef() : base_type(0), _pool(0) {}\n\n  FORCE_INLINE void clear() const {\n    return variantSetNull(_data);\n  }\n\n  // set(bool value)\n  FORCE_INLINE bool set(bool value) const {\n    return variantSetBoolean(_data, value);\n  }\n\n  // set(double value);\n  // set(float value);\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value,\n      typename enable_if<is_floating_point<T>::value>::type * = 0) const {\n    return variantSetFloat(_data, static_cast<Float>(value));\n  }\n\n  // set(char)\n  // set(signed short)\n  // set(signed int)\n  // set(signed long)\n  // set(signed char)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value,\n      typename enable_if<is_integral<T>::value && is_signed<T>::value>::type * =\n          0) const {\n    return variantSetSignedInteger(_data, value);\n  }\n\n  // set(unsigned short)\n  // set(unsigned int)\n  // set(unsigned long)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value, typename enable_if<is_integral<T>::value &&\n                                  is_unsigned<T>::value>::type * = 0) const {\n    return variantSetUnsignedInteger(_data, static_cast<UInt>(value));\n  }\n\n  // set(SerializedValue<const char *>)\n  FORCE_INLINE bool set(SerializedValue<const char *> value) const {\n    return variantSetLinkedRaw(_data, value);\n  }\n\n  // set(SerializedValue<std::string>)\n  // set(SerializedValue<String>)\n  // set(SerializedValue<const __FlashStringHelper*>)\n  template <typename T>\n  FORCE_INLINE bool set(\n      SerializedValue<T> value,\n      typename enable_if<!is_same<const char *, T>::value>::type * = 0) const {\n    return variantSetOwnedRaw(_data, value, _pool);\n  }\n\n  // set(const std::string&)\n  // set(const String&)\n  template <typename T>\n  FORCE_INLINE bool set(\n      const T &value,\n      typename enable_if<IsString<T>::value>::type * = 0) const {\n    return variantSetOwnedString(_data, adaptString(value), _pool);\n  }\n\n  // set(char*)\n  // set(const __FlashStringHelper*)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T *value, typename enable_if<IsString<T *>::value>::type * = 0) const {\n    return variantSetOwnedString(_data, adaptString(value), _pool);\n  }\n\n  // set(const char*);\n  FORCE_INLINE bool set(const char *value) const {\n    return variantSetLinkedString(_data, value);\n  }\n\n  // set(VariantRef)\n  // set(VariantConstRef)\n  // set(ArrayRef)\n  // set(ArrayConstRef)\n  // set(ObjectRef)\n  // set(ObjecConstRef)\n  template <typename TVariant>\n  typename enable_if<IsVisitable<TVariant>::value, bool>::type set(\n      const TVariant &value) const;\n\n  // Get the variant as the specified type.\n  //\n  // std::string as<std::string>() const;\n  // String as<String>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<!is_same<T, ArrayRef>::value &&\n                                      !is_same<T, ObjectRef>::value &&\n                                      !is_same<T, VariantRef>::value,\n                                  typename VariantAs<T>::type>::type\n  as() const {\n    return variantAs<T>(_data);\n  }\n  //\n  // ArrayRef as<ArrayRef>() const;\n  // const ArrayRef as<const ArrayRef>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, ArrayRef>::value, T>::type as()\n      const;\n  //\n  // ObjectRef as<ObjectRef>() const;\n  // const ObjectRef as<const ObjectRef>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, ObjectRef>::value, T>::type as()\n      const;\n  //\n  // VariantRef as<VariantRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, VariantRef>::value, T>::type as()\n      const {\n    return *this;\n  }\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    variantAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool operator==(VariantRef lhs) const {\n    return variantEquals(_data, lhs._data);\n  }\n\n  FORCE_INLINE bool operator!=(VariantRef lhs) const {\n    return !variantEquals(_data, lhs._data);\n  }\n\n  // Change the type of the variant\n  //\n  // ArrayRef to<ArrayRef>()\n  template <typename T>\n  typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type to() const;\n  //\n  // ObjectRef to<ObjectRef>()\n  template <typename T>\n  typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type to() const;\n  //\n  // ObjectRef to<VariantRef>()\n  template <typename T>\n  typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type to()\n      const;\n\n  VariantRef addElement() const;\n\n  FORCE_INLINE VariantRef getElement(size_t) const;\n\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar *) const;\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type\n  getMember(const TString &) const;\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar *) const;\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString &) const;\n\n  FORCE_INLINE void remove(size_t index) const {\n    if (_data) _data->remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(\n      TChar *key) const {\n    if (_data) _data->remove(adaptString(key));\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString &key) const {\n    if (_data) _data->remove(adaptString(key));\n  }\n\n private:\n  MemoryPool *_pool;\n};  // namespace ARDUINOJSON_NAMESPACE\n\nclass VariantConstRef : public VariantRefBase<const VariantData>,\n                        public VariantOperators<VariantConstRef>,\n                        public Visitable {\n  typedef VariantRefBase<const VariantData> base_type;\n  friend class VariantRef;\n\n public:\n  VariantConstRef() : base_type(0) {}\n  VariantConstRef(const VariantData *data) : base_type(data) {}\n  VariantConstRef(VariantRef var) : base_type(var._data) {}\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    variantAccept(_data, visitor);\n  }\n\n  // Get the variant as the specified type.\n  //\n  template <typename T>\n  FORCE_INLINE typename VariantConstAs<T>::type as() const {\n    return variantAs<typename VariantConstAs<T>::type>(_data);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const;\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString &key) const {\n    return VariantConstRef(objectGet(variantAsObject(_data), adaptString(key)));\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar *>::value, VariantConstRef>::type\n      operator[](TChar *key) const {\n    const CollectionData *obj = variantAsObject(_data);\n    return VariantConstRef(obj ? obj->get(adaptString(key)) : 0);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantSlot.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/gsl/not_null.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantContent.hpp\"\n\n#include <stdint.h>  // int8_t, int16_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntypedef conditional<sizeof(void*) <= 2, int8_t, int16_t>::type VariantSlotDiff;\n\nclass VariantSlot {\n  // CAUTION: same layout as VariantData\n  // we cannot use composition because it adds padding\n  // (+20% on ESP8266 for example)\n  VariantContent _content;\n  uint8_t _flags;\n  VariantSlotDiff _next;\n  const char* _key;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n\n  VariantData* data() {\n    return reinterpret_cast<VariantData*>(&_content);\n  }\n\n  const VariantData* data() const {\n    return reinterpret_cast<const VariantData*>(&_content);\n  }\n\n  VariantSlot* next() {\n    return _next ? this + _next : 0;\n  }\n\n  const VariantSlot* next() const {\n    return const_cast<VariantSlot*>(this)->next();\n  }\n\n  VariantSlot* next(size_t distance) {\n    VariantSlot* slot = this;\n    while (distance--) {\n      if (!slot->_next) return 0;\n      slot += slot->_next;\n    }\n    return slot;\n  }\n\n  const VariantSlot* next(size_t distance) const {\n    return const_cast<VariantSlot*>(this)->next(distance);\n  }\n\n  void setNext(VariantSlot* slot) {\n    _next = VariantSlotDiff(slot ? slot - this : 0);\n  }\n\n  void setNextNotNull(VariantSlot* slot) {\n    ARDUINOJSON_ASSERT(slot != 0);\n    _next = VariantSlotDiff(slot - this);\n  }\n\n  void setOwnedKey(not_null<const char*> k) {\n    _flags |= KEY_IS_OWNED;\n    _key = k.get();\n  }\n\n  void setLinkedKey(not_null<const char*> k) {\n    _flags &= VALUE_MASK;\n    _key = k.get();\n  }\n\n  const char* key() const {\n    return _key;\n  }\n\n  bool ownsKey() const {\n    return (_flags & KEY_IS_OWNED) != 0;\n  }\n\n  void clear() {\n    _next = 0;\n    _flags = 0;\n    _key = 0;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/Variant/VariantTo.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\nclass ArrayRef;\nclass ObjectRef;\nclass VariantRef;\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::to<T>()\ntemplate <typename T>\nstruct VariantTo {};\n\ntemplate <>\nstruct VariantTo<ArrayRef> {\n  typedef ArrayRef type;\n};\ntemplate <>\nstruct VariantTo<ObjectRef> {\n  typedef ObjectRef type;\n};\ntemplate <>\nstruct VariantTo<VariantRef> {\n  typedef VariantRef type;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/compatibility.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n//\n// clang-format off\n\n#ifdef __GNUC__\n\n#define ARDUINOJSON_PRAGMA(x) _Pragma(#x)\n\n#define ARDUINOJSON_COMPILE_ERROR(msg) ARDUINOJSON_PRAGMA(GCC error msg)\n\n#define ARDUINOJSON_STRINGIFY(S) #S\n\n#define ARDUINOJSON_DEPRECATION_ERROR(X, Y) \\\n  ARDUINOJSON_COMPILE_ERROR(ARDUINOJSON_STRINGIFY(X is a Y from ArduinoJson 5. Please see arduinojson.org/upgrade to learn how to upgrade your program to ArduinoJson version 6))\n\n#define StaticJsonBuffer ARDUINOJSON_DEPRECATION_ERROR(StaticJsonBuffer, class)\n#define DynamicJsonBuffer ARDUINOJSON_DEPRECATION_ERROR(DynamicJsonBuffer, class)\n#define JsonBuffer ARDUINOJSON_DEPRECATION_ERROR(JsonBuffer, class)\n#define RawJson ARDUINOJSON_DEPRECATION_ERROR(RawJson, function)\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson/version.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#define ARDUINOJSON_VERSION \"6.10.1\"\n#define ARDUINOJSON_VERSION_MAJOR 6\n#define ARDUINOJSON_VERSION_MINOR 10\n#define ARDUINOJSON_VERSION_REVISION 1\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson.h",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef __cplusplus\n\n#include \"ArduinoJson.hpp\"\n\nusing namespace ArduinoJson;\n\n#else\n\n#error ArduinoJson requires a C++ compiler, please change file extension to .cc or .cpp\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/lib/ArduinoJson6/ArduinoJson.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifndef ARDUINOJSON_DEBUG\n#ifdef __clang__\n#pragma clang system_header\n#elif defined __GNUC__\n#pragma GCC system_header\n#endif\n#endif\n\n#include \"ArduinoJson/Namespace.hpp\"\n\n#include \"ArduinoJson/Array/ArrayRef.hpp\"\n#include \"ArduinoJson/Object/ObjectRef.hpp\"\n#include \"ArduinoJson/Variant/VariantRef.hpp\"\n\n#include \"ArduinoJson/Document/DynamicJsonDocument.hpp\"\n#include \"ArduinoJson/Document/StaticJsonDocument.hpp\"\n\n#include \"ArduinoJson/Array/ArrayImpl.hpp\"\n#include \"ArduinoJson/Array/ElementProxy.hpp\"\n#include \"ArduinoJson/Array/Utilities.hpp\"\n#include \"ArduinoJson/Collection/CollectionImpl.hpp\"\n#include \"ArduinoJson/Object/MemberProxy.hpp\"\n#include \"ArduinoJson/Object/ObjectImpl.hpp\"\n#include \"ArduinoJson/Variant/VariantAsImpl.hpp\"\n#include \"ArduinoJson/Variant/VariantImpl.hpp\"\n\n#include \"ArduinoJson/Json/JsonDeserializer.hpp\"\n#include \"ArduinoJson/Json/JsonSerializer.hpp\"\n#include \"ArduinoJson/Json/PrettyJsonSerializer.hpp\"\n#include \"ArduinoJson/MsgPack/MsgPackDeserializer.hpp\"\n#include \"ArduinoJson/MsgPack/MsgPackSerializer.hpp\"\n\n#include \"ArduinoJson/compatibility.hpp\"\n\nnamespace ArduinoJson {\ntypedef ARDUINOJSON_NAMESPACE::ArrayConstRef JsonArrayConst;\ntypedef ARDUINOJSON_NAMESPACE::ArrayRef JsonArray;\ntypedef ARDUINOJSON_NAMESPACE::Float JsonFloat;\ntypedef ARDUINOJSON_NAMESPACE::Integer JsonInteger;\ntypedef ARDUINOJSON_NAMESPACE::ObjectConstRef JsonObjectConst;\ntypedef ARDUINOJSON_NAMESPACE::ObjectRef JsonObject;\ntypedef ARDUINOJSON_NAMESPACE::Pair JsonPair;\ntypedef ARDUINOJSON_NAMESPACE::String JsonString;\ntypedef ARDUINOJSON_NAMESPACE::UInt JsonUInt;\ntypedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst;\ntypedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant;\nusing ARDUINOJSON_NAMESPACE::BasicJsonDocument;\nusing ARDUINOJSON_NAMESPACE::copyArray;\nusing ARDUINOJSON_NAMESPACE::DeserializationError;\nusing ARDUINOJSON_NAMESPACE::deserializeJson;\nusing ARDUINOJSON_NAMESPACE::deserializeMsgPack;\nusing ARDUINOJSON_NAMESPACE::DynamicJsonDocument;\nusing ARDUINOJSON_NAMESPACE::JsonDocument;\nusing ARDUINOJSON_NAMESPACE::serialized;\nusing ARDUINOJSON_NAMESPACE::serializeJson;\nusing ARDUINOJSON_NAMESPACE::serializeJsonPretty;\nusing ARDUINOJSON_NAMESPACE::serializeMsgPack;\nusing ARDUINOJSON_NAMESPACE::StaticJsonDocument;\n\nnamespace DeserializationOption {\nusing ARDUINOJSON_NAMESPACE::NestingLimit;\n}\n}  // namespace ArduinoJson\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/main.cpp",
    "content": "\n/*\nRemora PRU firmware for LinuxCNC\nCopyright (C) 2021  Scott Alford (scotta)\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License version 2\nof the License.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n*/\n\n// MBED includes\n#include \"mbed.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string> \n#include \"FATFileSystem.h\"\n\n#if defined TARGET_LPC176X || TARGET_STM32F1 \n#include \"SDBlockDevice.h\"\n#elif defined TARGET_SKRV2 || TARGET_OCTOPUS_446 || TARGET_BLACK_F407VE || TARGET_OCTOPUS_429\n#include \"SDIOBlockDevice.h\"\n#endif\n\n#include \"configuration.h\"\n#include \"remora.h\"\n\n// libraries\n#include \"ArduinoJson.h\"\n\n// drivers\n#include \"RemoraComms.h\"\n#include \"pin.h\"\n#include \"softPwm.h\"\n\n// threads\n#include \"irqHandlers.h\"\n#include \"interrupt.h\"\n#include \"pruThread.h\"\n#include \"createThreads.h\"\n\n// modules\n#include \"module.h\"\n#include \"blink.h\"\n#include \"debug.h\"\n#include \"digitalPin.h\"\n#include \"encoder.h\"\n#include \"eStop.h\"\n#include \"hardwarePwm.h\"\n#include \"mcp4451.h\"\n#include \"motorPower.h\"\n#include \"pwm.h\"\n#include \"rcservo.h\"\n#include \"resetPin.h\"\n#include \"stepgen.h\"\n#include \"switch.h\"\n#include \"temperature.h\"\n#include \"tmc.h\"\n#include \"qei.h\"\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\n// state machine\nenum State {\n    ST_SETUP = 0,\n    ST_START,\n    ST_IDLE,\n    ST_RUNNING,\n    ST_STOP,\n    ST_RESET,\n    ST_WDRESET\n};\n\nuint8_t resetCnt;\nuint32_t base_freq = PRU_BASEFREQ;\nuint32_t servo_freq = PRU_SERVOFREQ;\n\n// boolean\nvolatile bool PRUreset;\nbool configError = false;\nbool threadsRunning = false;\n\n// pointers to objects with global scope\npruThread* servoThread;\npruThread* baseThread;\npruThread* commsThread;\n\n// unions for RX and TX data\n//volatile rxData_t spiRxBuffer1;  // this buffer is used to check for valid data before moving it to rxData\n//volatile rxData_t spiRxBuffer2;  // this buffer is used to check for valid data before moving it to rxData\nvolatile rxData_t rxData;\nvolatile txData_t txData;\n\n// pointers to data\nvolatile rxData_t*  ptrRxData = &rxData;\nvolatile txData_t*  ptrTxData = &txData;\nvolatile int32_t* ptrTxHeader;  \nvolatile bool*    ptrPRUreset;\nvolatile int32_t* ptrJointFreqCmd[JOINTS];\nvolatile int32_t* ptrJointFeedback[JOINTS];\nvolatile uint8_t* ptrJointEnable;\nvolatile float*   ptrSetPoint[VARIABLES];\nvolatile float*   ptrProcessVariable[VARIABLES];\nvolatile uint16_t* ptrInputs;\nvolatile uint16_t* ptrOutputs;\n\n\n/***********************************************************************\n        OBJECTS etc                                           \n************************************************************************/\n\n// SD card access and Remora communication protocol\n#if defined TARGET_SKRV1_4\n    SDBlockDevice blockDevice(P0_9, P0_8, P0_7, P0_6);  // mosi, miso, sclk, cs\n    RemoraComms comms(ptrRxData, ptrTxData);\n\n#elif defined TARGET_SKRV2 || TARGET_OCTOPUS_446 || TARGET_BLACK_F407VE || TARGET_OCTOPUS_429\n    SDIOBlockDevice blockDevice;\n    RemoraComms comms(ptrRxData, ptrTxData, SPI1, PA_4);\n\n#elif defined TARGET_ROBIN_E3\n    SDBlockDevice blockDevice(PB_15, PB_14, PB_13, PA_15);  // mosi, miso, sclk, cs\n    RemoraComms comms(ptrRxData, ptrTxData, SPI1, PA_4);\n\n#elif defined TARGET_SKR_MINI_E3\n    SDBlockDevice blockDevice(PA_7, PA_6, PA_5, PA_4);  // mosi, miso, sclk, cs\n    RemoraComms comms(ptrRxData, ptrTxData, SPI1, PC_1);    // use PC_1 as \"slave select\"\n\n#endif\n\n// Watchdog\nWatchdog& watchdog = Watchdog::get_instance();\n\n// Json configuration file stuff\nFATFileSystem fileSystem(\"fs\");\nFILE *jsonFile;\nstring strJson;\nDynamicJsonDocument doc(JSON_BUFF_SIZE);\nJsonObject thread;\nJsonObject module;\n\n/***********************************************************************\n        INTERRUPT HANDLERS - add NVIC_SetVector etc to setup()\n************************************************************************/\n\n// Add these to /thread/irqHandlers.h in the TARGET_target\n\n\n/***********************************************************************\n        ROUTINES\n************************************************************************/\n\nvoid readJsonConfig()\n{\n    printf(\"1. Reading json configuration file\\n\");\n\n    // Try to mount the filesystem\n    printf(\"Mounting the filesystem... \");\n    fflush(stdout);\n \n    int err = fileSystem.mount(&blockDevice);\n    printf(\"%s\\n\", (err ? \"Fail :(\" : \"OK\"));\n    if (err) {\n        printf(\"No filesystem found... \");\n        fflush(stdout);\n     }\n\n    // Open the config file\n    printf(\"Opening \\\"/fs/config.txt\\\"... \");\n    fflush(stdout);\n    jsonFile = fopen(\"/fs/config.txt\", \"r+\");\n    printf(\"%s\\n\", (!jsonFile ? \"Fail :(\" : \"OK\"));\n\n    fseek (jsonFile, 0, SEEK_END);\n    int32_t length = ftell (jsonFile);\n    fseek (jsonFile, 0, SEEK_SET);\n\n    printf(\"Json config file lenght = %2d\\n\", length);\n\n    strJson.reserve(length+1);\n\n    while (!feof(jsonFile)) {\n        int c = fgetc(jsonFile);\n        strJson.push_back(c);\n    }\n\n    // Remove comments from next line to print out the JSON config file\n    //printf(\"%s\\n\", strJson.c_str());\n\n    printf(\"\\rClosing \\\"/fs/config.txt\\\"... \");\n    fflush(stdout);\n    fclose(jsonFile);\n}\n\n\nvoid setup()\n{\n    printf(\"\\n2. Setting up DMA and threads\\n\");\n\n    // TODO: we can probably just deinit the blockdevice for all targets....?\n\n    #if defined TARGET_STM32F4\n    // deinitialise the SDIO device to avoid DMA issues with the SPI DMA Slave on the STM32F4\n    blockDevice.deinit();\n    #endif\n\n    #if defined TARGET_SKR_MINI_E3\n    // remove the SD device as we are sharing the SPI with the comms module\n    blockDevice.deinit();\n    #endif\n\n    // initialise the Remora comms \n    comms.init();\n    comms.start();\n}\n\n\nvoid deserialiseJSON()\n{\n    printf(\"\\n3. Parsing json configuration file\\n\");\n\n    const char *json = strJson.c_str();\n\n    // parse the json configuration file\n    DeserializationError error = deserializeJson(doc, json);\n\n    printf(\"Config deserialisation - \");\n\n    switch (error.code())\n    {\n        case DeserializationError::Ok:\n            printf(\"Deserialization succeeded\\n\");\n            break;\n        case DeserializationError::InvalidInput:\n            printf(\"Invalid input!\\n\");\n            configError = true;\n            break;\n        case DeserializationError::NoMemory:\n            printf(\"Not enough memory\\n\");\n            configError = true;\n            break;\n        default:\n            printf(\"Deserialization failed\\n\");\n            configError = true;\n            break;\n    }\n}\n\n\nvoid configThreads()\n{\n    if (configError) return;\n\n    printf(\"\\n4. Config threads\\n\");\n\n    JsonArray Threads = doc[\"Threads\"];\n\n    // create objects from json data\n    for (JsonArray::iterator it=Threads.begin(); it!=Threads.end(); ++it)\n    {\n        thread = *it;\n        \n        const char* configor = thread[\"Thread\"];\n        uint32_t    freq = thread[\"Frequency\"];\n\n        if (!strcmp(configor,\"Base\"))\n        {\n            base_freq = freq;\n            printf(\"Setting BASE thread frequency to %d\\n\", base_freq);\n        }\n        else if (!strcmp(configor,\"Servo\"))\n        {\n            servo_freq = freq;\n            printf(\"Setting SERVO thread frequency to %d\\n\", servo_freq);\n        }\n    }\n}\n\n\nvoid loadModules()\n{\n    if (configError) return;\n\n    printf(\"\\n5. Loading modules\\n\");\n\n    JsonArray Modules = doc[\"Modules\"];\n\n    // create objects from json data\n    for (JsonArray::iterator it=Modules.begin(); it!=Modules.end(); ++it)\n    {\n        module = *it;\n        \n        const char* thread = module[\"Thread\"];\n        const char* type = module[\"Type\"];\n\n        if (!strcmp(thread,\"Base\"))\n        {\n            printf(\"\\nBase thread object\\n\");\n\n            if (!strcmp(type,\"Stepgen\"))\n            {\n                createStepgen();\n            }\n            else if (!strcmp(type,\"Encoder\"))\n            {\n                createEncoder();\n            }\n            else if (!strcmp(type,\"RCServo\"))\n            {\n                createRCServo();\n            }\n        }\n        else if (!strcmp(thread,\"Servo\"))\n        {\n            printf(\"\\nServo thread object\\n\");\n\n            if (!strcmp(type, \"eStop\"))\n            {\n                createEStop();\n            }\n            else if (!strcmp(type, \"Reset Pin\"))\n            {\n                createResetPin();\n            }\n            else if (!strcmp(type, \"Blink\"))\n            {\n                createBlink();\n            }\n            else if (!strcmp(type,\"Digital Pin\"))\n            {\n                createDigitalPin();\n            }\n            else if (!strcmp(type,\"PWM\"))\n            {\n                createPWM();\n            }\n            else if (!strcmp(type,\"Temperature\"))\n            { \n                createTemperature();\n            }\n            else if (!strcmp(type,\"Switch\"))\n            {\n                createSwitch();\n            }\n            else if (!strcmp(type,\"QEI\"))\n            {\n                createQEI();\n            }\n        }\n        else if (!strcmp(thread,\"On load\"))\n        {\n            printf(\"\\nOn load - run once module\\n\");\n\n\n            if (!strcmp(type,\"MCP4451\")) // digipot\n            {\n\t\t\t\tcreateMCP4451();\n            }\n            else if (!strcmp(type,\"Motor Power\"))\n            {\n                createMotorPower();\n            }\n            else if (!strcmp(type,\"TMC2208\"))\n            {\n                createTMC2208();\n            }\n            else if (!strcmp(type,\"TMC2209\"))\n            {\n                createTMC2209();\n            }\n        }\n    }\n}\n\n\nvoid debugThreadHigh()\n{\n    //Module* debugOnB = new Debug(\"PC_1\", 1);\n    //baseThread->registerModule(debugOnB);\n\n    //Module* debugOnS = new Debug(\"PC_3\", 1);\n    //servoThread->registerModule(debugOnS);\n\n    //Module* debugOnC = new Debug(\"PE_6\", 1);\n    //commsThread->registerModule(debugOnC);\n}\n\nvoid debugThreadLow()\n{\n    //Module* debugOffB = new Debug(\"PC_1\", 0);\n    //baseThread->registerModule(debugOffB); \n\n    //Module* debugOffS = new Debug(\"PC_3\", 0);\n    //servoThread->registerModule(debugOffS);\n\n    //commsThread->startThread();\n    //Module* debugOffC = new Debug(\"PE_6\", 0);\n    //commsThread->registerModule(debugOffC); \n}\n\nint main()\n{\n    \n    enum State currentState;\n    enum State prevState;\n\n    comms.setStatus(false);\n    comms.setError(false);\n    currentState = ST_SETUP;\n    prevState = ST_RESET;\n\n    printf(\"\\nRemora PRU - Programmable Realtime Unit\\n\");\n\n    watchdog.start(2000);\n\n    while(1)\n    {\n      // the main loop does very little, keeping the Watchdog serviced and\n      // resetting the rxData buffer if there is a loss of SPI commmunication\n      // with LinuxCNC. Everything else is done via DMA and within the\n      // two threads- Base and Servo threads that run the Modules.\n\n    watchdog.kick();\n\n    switch(currentState){\n        case ST_SETUP:\n            // do setup tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering SETUP state\\n\");\n            }\n            prevState = currentState;\n\n            readJsonConfig();\n            setup();\n            deserialiseJSON();\n            configThreads();\n            createThreads();\n            //debugThreadHigh();\n            loadModules();\n            //debugThreadLow();\n\n            currentState = ST_START;\n            break; \n\n        case ST_START:\n            // do start tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering START state\\n\");\n            }\n            prevState = currentState;\n\n            if (!threadsRunning)\n            {\n                // Start the threads\n                printf(\"\\nStarting the BASE thread\\n\");\n                baseThread->startThread();\n                \n                printf(\"\\nStarting the SERVO thread\\n\");\n                servoThread->startThread();\n\n                threadsRunning = true;\n\n                // wait for threads to read IO before testing for PRUreset\n                wait(1);\n            }\n\n            if (PRUreset)\n            {\n                // RPi outputs default is high until configured when LinuxCNC Remora component is started, PRUreset pin will be high\n                // stay in start state until LinuxCNC is started\n                currentState = ST_START;\n            }\n            else\n            {\n                currentState = ST_IDLE;\n            }\n            \n            break;\n\n\n        case ST_IDLE:\n            // do something when idle\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering IDLE state\\n\");\n            }\n            prevState = currentState;\n\n            // check to see if there there has been SPI errors\n            if (comms.getError())\n            {\n                printf(\"Communication data error\\n\");\n                comms.setError(false);\n            }\n\n            //wait for SPI data before changing to running state\n            if (comms.getStatus())\n            {\n                currentState = ST_RUNNING;\n            }\n\n            if (PRUreset) \n            {\n                currentState = ST_WDRESET;\n            }\n\n            break;\n\n        case ST_RUNNING:\n            // do running tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering RUNNING state\\n\");\n            }\n            prevState = currentState;\n\n            // check to see if there there has been SPI errors \n            if (comms.getError())\n            {\n                printf(\"Communication data error\\n\");\n                comms.setError(false);\n            }\n            \n            if (comms.getStatus())\n            {\n                // SPI data received by DMA\n                resetCnt = 0;\n                comms.setStatus(false);\n            }\n            else\n            {\n                // no data received by DMA\n                resetCnt++;\n            }\n\n            if (resetCnt > SPI_ERR_MAX)\n            {\n                // reset threshold reached, reset the PRU\n                printf(\"   Communication data error limit reached, resetting\\n\");\n                resetCnt = 0;\n                currentState = ST_RESET;\n            }\n\n            if (PRUreset) \n            {\n                currentState = ST_WDRESET;\n            }\n\n            break;\n\n        case ST_STOP:\n            // do stop tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering STOP state\\n\");\n            }\n            prevState = currentState;\n\n\n            currentState = ST_STOP;\n            break;\n\n        case ST_RESET:\n            // do reset tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering RESET state\\n\");\n            }\n            prevState = currentState;\n\n            // set all of the rxData buffer to 0\n            // rxData.rxBuffer is volatile so need to do this the long way. memset cannot be used for volatile\n            printf(\"   Resetting rxBuffer\\n\");\n            {\n                int n = sizeof(rxData.rxBuffer);\n                while(n-- > 0)\n                {\n                    rxData.rxBuffer[n] = 0;\n                }\n            }\n\n            currentState = ST_IDLE;\n            break;\n\n        case ST_WDRESET:\n            // do a watch dog reset\n            printf(\"\\n## Entering WDRESET state\\n\");\n\n            // force a watchdog reset by looping here\n            while(1){}\n\n            break;\n      }\n\n    wait(LOOP_TIME);\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/mbed-os.lib",
    "content": "https://github.com/ARMmbed/mbed-os/#64853b354fa188bfe8dbd51e78771213c7ed37f7\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/mbed_app.json",
    "content": "{\n    \"requires\": [\n        \"bare-metal\",\n        \"rtos-api\", \n        \"sd\",\n        \"filesystem\",\n        \"fat_chan\"\n    ],\n    \n    \"artifact_name\": \"firmware\",\n\n    \"target_overrides\": {\n        \"LPC1768\": {\n            \"target.mbed_app_start\": \"0x4000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"LPC1769\": {\n            \"target.mbed_app_start\": \"0x4000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"SKRV2\": {\n            \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"OCTOPUS_429\": {\n            \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"OCTOPUS_446\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"BLACK_F407VE\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"ROBIN_E3\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        }        ,\n        \"SKR_MINI_E3\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        }\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/blink/blink.cpp",
    "content": "#include \"blink.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createBlink()\n{\n    const char* pin = module[\"Pin\"];\n    int frequency = module[\"Frequency\"];\n    \n    printf(\"Make Blink at pin %s\\n\", pin);\n        \n    Module* blink = new Blink(pin, PRU_SERVOFREQ, frequency);\n    servoThread->registerModule(blink);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nBlink::Blink(std::string portAndPin, uint32_t threadFreq, uint32_t freq)\n{\n\n\tthis->periodCount = threadFreq / freq;\n\tthis->blinkCount = 0;\n\tthis->bState = false;\n\n\tthis->blinkPin = new Pin(portAndPin, OUTPUT);\n\tthis->blinkPin->set(bState);\n}\n\nvoid Blink::update(void)\n{\n\t++this->blinkCount;\n\tif (this->blinkCount >= this->periodCount / 2)\n\t{\n\t\tthis->blinkPin->set(this->bState=!this->bState);\n\t\tthis->blinkCount = 0;\n\t}\n}\n\nvoid Blink::slowUpdate(void)\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/blink/blink.h",
    "content": "#ifndef BLINK_H\n#define BLINK_H\n\n#include <cstdint>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createBlink(void);\n\nclass Blink : public Module\n{\n\n\tprivate:\n\n\t\tbool \t\tbState;\n\t\tuint32_t \tperiodCount;\n\t\tuint32_t \tblinkCount;\n\n\t\tPin *blinkPin;\t// class object members - Pin objects\n\n\tpublic:\n\n\t\tBlink(std::string, uint32_t, uint32_t);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/debug/debug.cpp",
    "content": "#include \"debug.h\"\n\n\nDebug::Debug(std::string portAndPin, bool bstate) :\n    bState(bstate)\n{\n\tthis->debugPin = new Pin(portAndPin, OUTPUT);\n}\n\nvoid Debug::update(void)\n{\n\tthis->debugPin->set(bState);\n}\n\nvoid Debug::slowUpdate(void)\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/debug/debug.h",
    "content": "#ifndef DEBUG_H\n#define DEBUG_H\n\n#include <cstdint>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass Debug : public Module\n{\n\n\tprivate:\n\n\t\tbool \t\tbState;\n\n\t\tPin*        debugPin;\t// class object members - Pin objects\n\n\tpublic:\n\n\t\tDebug(std::string, bool);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/digipot/DigipotBase.h",
    "content": "#ifndef DIGIPOTBASE_H\n#define DIGIPOTBASE_H\n\n// adapted from Smoothieware\n\n#include \"modules/module.h\"\n\nclass DigipotBase : public Module\n{\n  protected:\n\n    float factor;\n    float max_current;\n\n  public:\n\n      DigipotBase(){}\n      virtual ~DigipotBase(){}\n\n      virtual void set_current( int channel, float current )= 0;\n      virtual float get_current(int channel)= 0;\n      void set_max_current(float c) { max_current= c; }\n      void set_factor(float f) { factor= f; }\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/digipot/mcp4451.cpp",
    "content": "#include \"mcp4451.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createMCP4451()\n{\n    printf(\"Make MCP4451 Digipot object\\n\");\n\n    const char* sda = module[\"I2C SDA pin\"];\n    const char* scl = module[\"I2C SCL pin\"];\n    int address = module[\"I2C address\"];\n    float maxCurrent = module[\"Max current\"];\n    float factor = module[\"Factor\"];\n    float c0 = module[\"Current 0\"];\n    float c1 = module[\"Current 1\"];\n    float c2 = module[\"Current 2\"];\n    float c3 = module[\"Current 3\"];\n\n    Module* digipot = new MCP4451(sda, scl, address, maxCurrent, factor, c0, c1, c2, c3);\n    digipot->update();\n    delete digipot;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n\nMCP4451::MCP4451(std::string sda, std::string scl, char address, float maxCurrent, float factor, float c0, float c1, float c2, float c3) :\n  sda(sda),\n  scl(scl),\n  address(address),\n  maxCurrent(maxCurrent),\n  factor(factor),\n  c0(c0),\n  c1(c1),\n  c2(c2),\n  c3(c3)\n{\n  this->sclPin = new Pin(this->scl, -1); // dir = -1 so not configured as IO\n  this->sdaPin = new Pin(this->sda, -1);\n\n  // I2C com\n  //this->i2c = new I2C(p9, p10);\n  this->i2c = new I2C(this->sdaPin->pinToPinName(), this->sclPin->pinToPinName());\n  this->i2c->frequency(20000);\n  for (int i = 0; i < 4; i++) this->currents[i] = -1;\n}\n\nMCP4451::~MCP4451()\n{\n    delete this->i2c;\n    delete this->sclPin;\n    delete this->sdaPin;\n}\n\nvoid MCP4451::set_current( int channel, float current)\n{\n    if(current < 0) {\n        currents[channel]= -1;\n        return;\n    }\n    current = min( (float) max( current, 0.0f ), this->maxCurrent );\n    currents[channel] = current;\n    char addr = 0x58 + this->address;\n\n    // Initial setup\n    this->i2c_send( addr, 0x40, 0xff );\n    this->i2c_send( addr, 0xA0, 0xff );\n\n    // Set actual wiper value\n    char addresses[4] = { 0x00, 0x10, 0x60, 0x70 };\n    this->i2c_send( addr, addresses[channel], this->current_to_wiper(current) );\n}\n\nvoid MCP4451::i2c_send( char first, char second, char third )\n{\n    this->i2c->start();\n    this->i2c->write(first);\n    this->i2c->write(second);\n    this->i2c->write(third);\n    this->i2c->stop();\n}\n\nchar MCP4451::current_to_wiper( float current )\n{\n    int c= ceilf(this->factor*current);\n    if(c > 255) c= 255;\n    return c;\n}\n\nvoid MCP4451::update()\n{\n  this->set_max_current(this->maxCurrent);\n  this->set_factor(this->factor);\n\n  this->set_current(0, this->c0);\n  this->set_current(1, this->c1);\n  this->set_current(2, this->c2);\n  this->set_current(3, this->c3);\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/digipot/mcp4451.h",
    "content": "#ifndef MCP4451_H\n#define MCP4451_H\n\n#include \"mbed.h\"\n#include <string>\n\n#include \"module.h\"\n#include \"pin.h\"\n\n#include \"extern.h\"\n\n\nvoid createMCP4451(void);\n\nclass MCP4451 : public Module\n{\n  private:\n\n    std::string scl, sda; // i2c SCL and SDA portAndPin\n    Pin *sclPin, *sdaPin;\n    I2C *i2c;\n\n    char address;       // on the i2c bus, set by address bits A1:A0\n    float c0, c1, c2, c3;\n    float currents[4];  // the mcp4451 only has 4 wipers\n\n    float factor;\n    float maxCurrent;\n\n    void i2c_send(char, char, char);\n    char current_to_wiper(float);\n\n  public:\n\n    MCP4451(std::string, std::string, char, float, float, float, float, float, float);\n    //mcp4451(std::string, std::string, char);\n    ~MCP4451();\n\n    void set_max_current(float c) { maxCurrent= c; }\n    void set_factor(float f) { factor= f; }\n    void set_current(int, float);\n\n    virtual void update(void);           // Module default interface\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/digitalPin/digitalPin.cpp",
    "content": "#include \"digitalPin.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createDigitalPin()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n    const char* mode = module[\"Mode\"];\n    const char* invert = module[\"Invert\"];\n    const char* modifier = module[\"Modifier\"];\n    int dataBit = module[\"Data Bit\"];\n\n    int mod;\n    bool inv;\n\n    if (!strcmp(modifier,\"Open Drain\"))\n    {\n        mod = OPENDRAIN;\n    }\n    else if (!strcmp(modifier,\"Pull Up\"))\n    {\n        mod = PULLUP;\n    }\n    else if (!strcmp(modifier,\"Pull Down\"))\n    {\n        mod = PULLDOWN;\n    }\n    else if (!strcmp(modifier,\"Pull None\"))\n    {\n        mod = PULLNONE;\n    }\n    else\n    {\n        mod = NONE;\n    }\n\n    if (!strcmp(invert,\"True\"))\n    {\n        inv = true;\n    }\n    else inv = false;\n\n    ptrOutputs = &rxData.outputs;\n    ptrInputs = &txData.inputs;\n\n    printf(\"Make Digital %s at pin %s\\n\", mode, pin);\n\n    if (!strcmp(mode,\"Output\"))\n    {\n        //Module* digitalPin = new DigitalPin(*ptrOutputs, 1, pin, dataBit, invert);\n        Module* digitalPin = new DigitalPin(*ptrOutputs, 1, pin, dataBit, inv, mod);\n        servoThread->registerModule(digitalPin);\n    }\n    else if (!strcmp(mode,\"Input\"))\n    {\n        //Module* digitalPin = new DigitalPin(*ptrInputs, 0, pin, dataBit, invert);\n        Module* digitalPin = new DigitalPin(*ptrInputs, 0, pin, dataBit, inv, mod);\n        servoThread->registerModule(digitalPin);\n    }\n    else\n    {\n        printf(\"Error - incorrectly defined Digital Pin\\n\");\n    }\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nDigitalPin::DigitalPin(volatile uint16_t &ptrData, int mode, std::string portAndPin, int bitNumber, bool invert, int modifier) :\n\tptrData(&ptrData),\n\tmode(mode),\n\tportAndPin(portAndPin),\n\tbitNumber(bitNumber),\n    invert(invert),\n\tmodifier(modifier)\n{\n\tthis->pin = new Pin(this->portAndPin, this->mode, this->modifier);\t\t// Input 0x0, Output 0x1\n\tthis->mask = 1 << this->bitNumber;\n}\n\n\nvoid DigitalPin::update()\n{\n\tbool pinState;\n\n\tif (this->mode == 0)\t\t\t\t\t\t\t\t\t// the pin is configured as an input\n\t{\n\t\tpinState = this->pin->get();\n\t\tif(this->invert)\n\t\t{\n\t\t\tpinState = !pinState;\n\t\t}\n\n\t\tif (pinState == 1)\t\t\t\t\t\t\t\t// input is high\n\t\t{\n\t\t\t*(this->ptrData) |= this->mask;\n\t\t}\n\t\telse\t\t\t\t\t\t\t\t\t\t\t// input is low\n\t\t{\n\t\t\t*(this->ptrData) &= ~this->mask;\n\t\t}\n\t}\n\telse\t\t\t\t\t\t\t\t\t\t\t\t// the pin is configured as an output\n\t{\n\t\tpinState = *(this->ptrData) & this->mask;\t\t// get the value of the bit in the data source\n\t\tif(this->invert)\n\t\t{\n\t\t\tpinState = !pinState;\n\t\t}\n\t\tthis->pin->set(pinState);\t\t\t// simple conversion to boolean\n\t}\n}\n\nvoid DigitalPin::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/digitalPin/digitalPin.h",
    "content": "#ifndef DIGITALPIN_H\n#define DIGITALPIN_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createDigitalPin(void);\n\nclass DigitalPin : public Module\n{\n\tprivate:\n\n\t\tvolatile uint16_t *ptrData; \t// pointer to the data source\n\t\tint bitNumber;\t\t\t\t// location in the data source\n\t\tbool invert;\n\t\tint mask;\n\n\t\tint mode;\n        int modifier;\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n        DigitalPin(volatile uint16_t&, int, std::string, int, bool, int);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/eStop/eStop.cpp",
    "content": "#include \"eStop.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createEStop()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    ptrTxHeader = &txData.header;\n\n    printf(\"Make eStop at pin %s\\n\", pin);\n\n    Module* estop = new eStop(*ptrTxHeader, pin);\n    servoThread->registerModule(estop);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\neStop::eStop(volatile int32_t &ptrTxHeader, std::string portAndPin) :\n    ptrTxHeader(&ptrTxHeader),\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0);\t\t// Input 0x0, Output 0x1\n}\n\n\nvoid eStop::update()\n{\n    if (this->pin->get() == 1)\n    {\n        *ptrTxHeader = PRU_ESTOP;\n    }\n    else {\n        *ptrTxHeader = PRU_DATA;\n    }\n}\n\nvoid eStop::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/eStop/eStop.h",
    "content": "#ifndef ESTOP_H\n#define ESTOP_H\n\n#include <cstdint>\n#include <iostream>\n#include <string>\n\n#include \"../../configuration.h\"\n#include \"../../remora.h\"\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createEStop(void);\n\nclass eStop : public Module\n{\n\n\tprivate:\n\n        volatile int32_t *ptrTxHeader;\n\t\tstd::string \tportAndPin;\n\n        Pin *pin;\n\n\n\tpublic:\n\n\t\teStop(volatile int32_t&, std::string);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/encoder/encoder.cpp",
    "content": "#include \"encoder.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createEncoder()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    const char* pinA = module[\"ChA Pin\"];\n    const char* pinB = module[\"ChB Pin\"];\n    const char* pinI = module[\"Index Pin\"];\n    int dataBit = module[\"Data Bit\"];\n    const char* modifier = module[\"Modifier\"];\n\n    printf(\"Creating Quadrature Encoder at pins %s and %s\\n\", pinA, pinB);\n\n    int mod;\n\n    if (!strcmp(modifier,\"Open Drain\"))\n    {\n        mod = OPENDRAIN;\n    }\n    else if (!strcmp(modifier,\"Pull Up\"))\n    {\n        mod = PULLUP;\n    }\n    else if (!strcmp(modifier,\"Pull Down\"))\n    {\n        mod = PULLDOWN;\n    }\n    else if (!strcmp(modifier,\"Pull None\"))\n    {\n        mod = PULLNONE;\n    }\n    else\n    {\n        mod = NONE;\n    }\n    \n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n    ptrInputs = &txData.inputs;\n\n    if (pinI == nullptr)\n    {\n        Module* encoder = new Encoder(*ptrProcessVariable[pv], pinA, pinB, mod);\n        baseThread->registerModule(encoder);\n    }\n    else\n    {\n        printf(\"  Encoder has index at pin %s\\n\", pinI);\n        Module* encoder = new Encoder(*ptrProcessVariable[pv], *ptrInputs, dataBit, pinA, pinB, pinI, mod);\n        baseThread->registerModule(encoder);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nEncoder::Encoder(volatile float &ptrEncoderCount, std::string ChA, std::string ChB, int modifier) :\n\tptrEncoderCount(&ptrEncoderCount),\n\tChA(ChA),\n\tChB(ChB),\n    modifier(modifier)\n{\n\tthis->pinA = new Pin(this->ChA, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinB = new Pin(this->ChB, INPUT, this->modifier);\t\t\t// create Pin\n    this->hasIndex = false;\n\tthis->count = 0;\t\t\t\t\t\t\t\t                // initialise the count to 0\n}\n\nEncoder::Encoder(volatile float &ptrEncoderCount, volatile uint16_t &ptrData, int bitNumber, std::string ChA, std::string ChB, std::string Index, int modifier) :\n\tptrEncoderCount(&ptrEncoderCount),\n    ptrData(&ptrData),\n    bitNumber(bitNumber),\n\tChA(ChA),\n\tChB(ChB),\n    Index(Index),\n    modifier(modifier)\n{\n\tthis->pinA = new Pin(this->ChA, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinB = new Pin(this->ChB, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinI = new Pin(this->Index, INPUT, this->modifier);\t\t// create Pin\n    this->hasIndex = true;\n    this->indexPulse = (PRU_BASEFREQ / PRU_SERVOFREQ) * 3;          // output the index pulse for 3 servo thread periods so LinuxCNC sees it\n    this->indexCount = 0;\n\tthis->count = 0;\t\t\t\t\t\t\t\t                // initialise the count to 0\n    this->pulseCount = 0;                                           // number of base thread periods to pulse the index output    \n    this->mask = 1 << this->bitNumber;\n}\n\nvoid Encoder::update()\n{\n    uint8_t s = this->state & 3;\n\n    if (this->pinA->get()) s |= 4;\n    if (this->pinB->get()) s |= 8;\n\n    switch (s) {\n\t\tcase 0: case 5: case 10: case 15:\n\t\t\tbreak;\n\t\tcase 1: case 7: case 8: case 14:\n\t\t\tcount++; break;\n\t\tcase 2: case 4: case 11: case 13:\n\t\t\tcount--; break;\n\t\tcase 3: case 12:\n\t\t\tcount += 2; break;\n\t\tdefault:\n\t\t\tcount -= 2; break;\n\t}\n\n\tthis->state = (s >> 2);\n\n    if (this->hasIndex)                                     // we have an index pin\n    {\n        // handle index, index pulse and pulse count\n        if (this->pinI->get() && (this->pulseCount == 0))    // rising edge on index pulse\n        {\n            this->indexCount = this->count;                 //  capture the encoder count at the index, send this to linuxCNC for one servo period \n            *(this->ptrEncoderCount) = this->indexCount;\n            this->pulseCount = this->indexPulse;        \n            *(this->ptrData) |= this->mask;                 // set bit in data source high\n        }\n        else if (this->pulseCount > 0)                      // maintain both index output and encoder count for the latch period\n        {\n            this->pulseCount--;                             // decrement the counter\n        }\n        else\n        {\n            *(this->ptrData) &= ~this->mask;                // set bit in data source low\n            *(this->ptrEncoderCount) = this->count;         // update encoder count\n        }\n    }\n    else\n    {\n        *(this->ptrEncoderCount) = this->count;             // update encoder count\n    }\n}\n\n\n// credit to https://github.com/PaulStoffregen/Encoder/blob/master/Encoder.h\n\n//                           _______         _______       \n//               PinA ______|       |_______|       |______ PinA\n// negative <---         _______         _______         __      --> positive\n//               PinB __|       |_______|       |_______|   PinB\n\n\t\t//\tnew\tnew\told\told\n\t\t//\tpinB\tpinA\tpinB\tpinA\tResult\n\t\t//\t----\t----\t----\t----\t------\n\t\t//\t0\t0\t0\t0\tno movement\n\t\t//\t0\t0\t0\t1\t+1\n\t\t//\t0\t0\t1\t0\t-1\n\t\t//\t0\t0\t1\t1\t+2  (assume pinA edges only)\n\t\t//\t0\t1\t0\t0\t-1\n\t\t//\t0\t1\t0\t1\tno movement\n\t\t//\t0\t1\t1\t0\t-2  (assume pinA edges only)\n\t\t//\t0\t1\t1\t1\t+1\n\t\t//\t1\t0\t0\t0\t+1\n\t\t//\t1\t0\t0\t1\t-2  (assume pinA edges only)\n\t\t//\t1\t0\t1\t0\tno movement\n\t\t//\t1\t0\t1\t1\t-1\n\t\t//\t1\t1\t0\t0\t+2  (assume pinA edges only)\n\t\t//\t1\t1\t0\t1\t-1\n\t\t//\t1\t1\t1\t0\t+1\n\t\t//\t1\t1\t1\t1\tno movement\n/*\n\t// Simple, easy-to-read \"documentation\" version :-)\n\t//\n\tvoid update(void) {\n\t\tuint8_t s = state & 3;\n\t\tif (digitalRead(pinA)) s |= 4;\n\t\tif (digitalRead(pinB)) s |= 8;\n\t\tswitch (s) {\n\t\t\tcase 0: case 5: case 10: case 15:\n\t\t\t\tbreak;\n\t\t\tcase 1: case 7: case 8: case 14:\n\t\t\t\tposition++; break;\n\t\t\tcase 2: case 4: case 11: case 13:\n\t\t\t\tposition--; break;\n\t\t\tcase 3: case 12:\n\t\t\t\tposition += 2; break;\n\t\t\tdefault:\n\t\t\t\tposition -= 2; break;\n\t\t}\n\t\tstate = (s >> 2);\n\t}\n*/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/encoder/encoder.h",
    "content": "#ifndef ENCODER_H\n#define ENCODER_H\n\n#include <cstdint>\n#include <iostream>\n#include <string>\n\n#include \"configuration.h\"\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createEncoder(void);\n\nclass Encoder : public Module\n{\n\n\tprivate:\n\n\t\tstd::string ChA;\t\t\t// physical pin connection\n        std::string ChB;\t\t\t// physical pin connection\n        \n        std::string Index;\t\t\t// physical pin connection\n        bool hasIndex;\n        volatile uint16_t *ptrData; \t// pointer to the data source\n\t\tint bitNumber;\t\t\t\t// location in the data source\n        int mask;\n\n\t\tvolatile float *ptrEncoderCount; \t// pointer to the data source\n\n        int8_t  modifier;\n        uint8_t state;\n        int32_t count;\n        int32_t indexCount;\n        int8_t  indexPulse;\n        int8_t  pulseCount;\n\n\tpublic:\n\n\t\tPin* pinA;      // channel A\n        Pin* pinB;      // channel B\n        Pin* pinI;      // index       \n\n\t\tEncoder(volatile float&, std::string, std::string, int);\n        Encoder(volatile float&, volatile uint16_t&, int, std::string, std::string, std::string, int);\n\n\t\tvirtual void update(void);\t// Module default interface\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/module.cpp",
    "content": "#include \"module.h\"\n\n#include <cstdio>\n\nModule::Module()\n{\n\tthis->counter = 0;\n\tthis->updateCount = 1;\n\tprintf(\"\\nCreating a std module\\n\");\n}\n\n\nModule::Module(int32_t threadFreq, int32_t slowUpdateFreq) :\n\tthreadFreq(threadFreq),\n\tslowUpdateFreq(slowUpdateFreq)\n{\n\tthis->counter = 0;\n\tthis->updateCount = this->threadFreq / this->slowUpdateFreq;\n\tprintf(\"\\nCreating a slower module, updating every %d thread cycles\\n\",this->updateCount);\n}\n\nModule::~Module(){}\n\n\nvoid Module::runModule()\n{\n\t++this->counter;\n\n\tif (this->counter >= this->updateCount)\n\t{\n\t\tthis->slowUpdate();\n\t\tthis->counter = 0;\n\t}\n\n\tthis->update();\n}\n\n\nvoid Module::update(){}\nvoid Module::slowUpdate(){}\nvoid Module::configure(){}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/module.h",
    "content": "#ifndef MODULE_H\n#define MODULE_H\n\n#include <cstdint>\n\n// Module base class\n// All modules are derived from this base class\n\nclass Module\n{\n\tprotected:\n\n\t\tint32_t threadFreq;\n\t\tint32_t slowUpdateFreq;\n\t\tint32_t updateCount;\n\t\tint32_t counter;\n\n\n\tpublic:\n\n\t\tModule();\t\t\t\t\t// constructor to run the module at the thread frequency\n\t\tModule(int32_t, int32_t);\t// constructor to run the module at a \"slow update frequency\" < thread frequency\n\n\t\tvirtual ~Module();\n\t\tvoid runModule();\t\t\t// the standard interface that the thread runs at the thread frequency, this calls update() at the module frequency\n\t\tvirtual void update();\t\t// the standard interface for update of the module - use for stepgen, PWM etc\n\t\tvirtual void slowUpdate();\t// the standard interface for the slow update - use for PID controller etc\n        virtual void configure();   // the standard interface for one off configuration\n\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/motorPower/motorPower.cpp",
    "content": "#include \"motorPower.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createMotorPower()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    printf(\"Make Motor Power at pin %s\\n\", pin);\n\n    Module* motPower = new MotorPower(pin);\n    delete motPower;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nMotorPower::MotorPower(std::string portAndPin) :\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0x1);\t\t// Input 0x0, Output 0x1\n    this->update();\n}\n\n\nvoid MotorPower::update()\n{\n\tthis->pin->set(true);\t\t\t// turn motor power ON\n}\n\nvoid MotorPower::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/motorPower/motorPower.h",
    "content": "#ifndef MOTORPOWER_H\n#define MOTORPOWER_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createMotorPower(void);\n\nclass MotorPower : public Module\n{\n\tprivate:\n\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n        MotorPower(std::string);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/pwm/hardwarePwm.cpp",
    "content": "#include \"hardwarePwm.h\"\n\nusing namespace std;\n\n#define PWMPERIOD 200\n\nHardwarePWM::HardwarePWM(volatile float &ptrPwmPulseWidth, int pwmPeriod, std::string pin) :\n    ptrPwmPulseWidth(&ptrPwmPulseWidth),\n    pwmPeriod(pwmPeriod),\n\tpin(pin)\n{\n    cout << \"Creating Hardware PWM at pin \" << this->pin << endl;\n\n    variablePeriod = false;\n\n    if (pwmPeriod == 0)\n    {\n        this->pwmPeriod = PWMPERIOD;\n    }\n\n    Pin* dummyPin = new Pin(pin, 1);\n    this->pwmPin = dummyPin->hardware_pwm();\n\n    if (this->pwmPin == NULL) {\n        printf(\"  Error: Hardware PWM cannot this pin (P2.0 - P2.5, P1.18, P1.20, P1.21, P1.23, P1.24, P1.26, P3.25, P3.26 only)\\n\");\n        delete dummyPin;\n        return;\n    }\n\n    this->pwmPin->period_us(this->pwmPeriod);\n}\n\n\nHardwarePWM::HardwarePWM(volatile float &ptrPwmPeriod, volatile float &ptrPwmPulseWidth, int pwmPeriod, std::string pin) :\n    ptrPwmPeriod(&ptrPwmPeriod),\n    ptrPwmPulseWidth(&ptrPwmPulseWidth),\n    pwmPeriod(pwmPeriod),\n\tpin(pin)\n{\n    cout << \"Creating variable frequency Hardware PWM at pin \" << this->pin << endl;\n\n    variablePeriod = true;\n\n    if (pwmPeriod == 0)\n    {\n        this->pwmPeriod = PWMPERIOD;\n    }\n\n    Pin* dummyPin = new Pin(pin, 1);\n    this->pwmPin = dummyPin->hardware_pwm();\n\n    if (this->pwmPin == NULL) {\n        printf(\"  Error: Hardware PWM cannot this pin (P2.0 - P2.5, P1.18, P1.20, P1.21, P1.23, P1.24, P1.26, P3.25, P3.26 only)\\n\");\n        delete dummyPin;\n        return;\n    }\n\n    this->pwmPin->period_us(this->pwmPeriod);\n}\n\n\nvoid HardwarePWM::update()\n{\n    if (variablePeriod)\n    {\n        if (*(this->ptrPwmPeriod) != 0 && (*(this->ptrPwmPeriod) != this->pwmPeriod))\n        {\n            // PWM period has changed\n            this->pwmPeriod = *(this->ptrPwmPeriod);\n            this->pwmPin->period_us(this->pwmPeriod);\n            this->pwmPulseWidth_us = (this->pwmPeriod * this->pwmPulseWidth) / 100.0;\n            this->pwmPin->pulsewidth_us(this->pwmPulseWidth_us);\n        }\n    }\n\n    if (*(this->ptrPwmPulseWidth) != this->pwmPulseWidth)\n    {\n        // PWM duty has changed\n        this->pwmPulseWidth = *(this->ptrPwmPulseWidth);\n        this->pwmPulseWidth_us = (this->pwmPeriod * this->pwmPulseWidth) / 100.0;\n        this->pwmPin->pulsewidth_us(this->pwmPulseWidth_us);\n    } \n\n    return;\n}\n\n\nvoid HardwarePWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/pwm/hardwarePwm.h",
    "content": "#ifndef HARDWAREPWM_H\n#define HARDWAREPWM_H\n\n#include <string>\n#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass HardwarePWM : public Module\n{\n\tprivate:\n\n\t\tstd::string pin;\t\t\t        // PWM output pin\n\t\tint pwmMax;\t\t\t\t\t        // maximum PWM output\n\t\tint pwmSP;\t\t\t\t\t        // PWM setpoint as a percentage of maxPwm\n\n\t\tPin* dummyPin;\t\t\t\t        // pin object\n        PwmOut *pwmPin;                     // PWM out object\n\n        volatile float *ptrPwmPeriod; \t    // pointer to the data source\n        volatile float *ptrPwmPulseWidth; \t// pointer to the data source\n\n        int pwmPeriod;                      // Period (us)\n        float pwmPulseWidth;                // Pulse width (%)\n        int pwmPulseWidth_us;               // Pulse width (us)\n\n        bool variablePeriod;\n\n\tpublic:\n\n\t\tHardwarePWM(volatile float&, int, std::string);\t\t\t        \n        HardwarePWM(volatile float&, volatile float&, int, std::string);\t\n\n\t\tvirtual void update(void);          // Module default interface\n\t\tvirtual void slowUpdate(void);      // Module default interface\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/pwm/pwm.cpp",
    "content": "#include \"pwm.h\"\n#include \"hardwarePwm.h\"\n\n\n#define PID_PWM_MAX 256\t\t// 8 bit resolution\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createPWM()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int sp = module[\"SP[i]\"];\n    int pwmMax = module[\"PWM Max\"];\n    const char* pin = module[\"PWM Pin\"];\n\n    const char* hardware = module[\"Hardware PWM\"];\n    const char* variable = module[\"Variable Freq\"];\n    int period_sp = module[\"Period SP[i]\"];\n    int period = module[\"Period us\"];\n\n    printf(\"Make PWM at pin %s\\n\", pin);\n    \n    ptrSetPoint[sp] = &rxData.setPoint[sp];\n\n    if (!strcmp(hardware,\"True\"))\n    {\n        // Hardware PWM\n        if (!strcmp(variable,\"True\"))\n        {\n            // Variable frequency hardware PWM\n            ptrSetPoint[period_sp] = &rxData.setPoint[period_sp];\n\n            Module* pwm = new HardwarePWM(*ptrSetPoint[period_sp], *ptrSetPoint[sp], period, pin);\n            servoThread->registerModule(pwm);\n        }\n        else\n        {\n            // Fixed frequency hardware PWM\n            Module* pwm = new HardwarePWM(*ptrSetPoint[sp], period, pin);\n            servoThread->registerModule(pwm);\n        }\n    }\n    else\n    {\n        // Software PWM\n        if (pwmMax != 0) // use configuration file value for pwmMax - useful for 12V on 24V systems\n        {\n            Module* pwm = new PWM(*ptrSetPoint[sp], pin, pwmMax);\n            servoThread->registerModule(pwm);\n        }\n        else // use default value of pwmMax\n        {\n            Module* pwm = new PWM(*ptrSetPoint[sp], pin);\n            servoThread->registerModule(pwm);\n        }\n    }\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nPWM::PWM(volatile float &ptrSP, std::string portAndPin) :\n\tptrSP(&ptrSP),\n\tportAndPin(portAndPin)\n{\n\tprintf(\"Creating software PWM @ pin %s\\n\", this->portAndPin.c_str());\n    //cout << \"Creating software PWM @ pin \" << this->portAndPin << endl;\n\n\tthis->pwm = new SoftPWM(this->portAndPin);\n\tthis->pwmMax = PID_PWM_MAX-1;\n\tthis->pwm->setMaxPwm(this->pwmMax);\n}\n\n// use the following constructor when using 12v devices on a 24v system\nPWM::PWM(volatile float &ptrSP, std::string portAndPin, int pwmMax) :\n\tptrSP(&ptrSP),\n\tportAndPin(portAndPin),\n\tpwmMax(pwmMax)\n{\n\tprintf(\"Creating software PWM with PWM Max @ pin %s\\n\", this->portAndPin.c_str());\n    //cout << \"Creating software PWM with PWM Max @ pin \" << this->portAndPin << endl;\n\n\tthis->pwm = new SoftPWM(this->portAndPin);\n\tthis->pwm->setMaxPwm(this->pwmMax);\n}\n\n\n\nvoid PWM::update()\n{\n\tfloat SP;\n\n\t// update the speed SP\n\tthis->SP = *(this->ptrSP);\n\n    // ensure SP is within range. LinuxCNC PID can have -ve command value\n\tif (this->SP > 100) this->SP = 100;\n    if (this->SP < 0) this->SP = 0;\n\n\t// the SP is as a percentage (%)\n\t// scale the pwm output range (0 - pwmMax) = (0 - 100%)\n\n\tSP = this->pwmMax * (this->SP / 100.0);\n\n\tthis->pwm->setPwmSP(int(SP));\n\n\tthis->pwm->update();\n}\n\nvoid PWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/pwm/pwm.h",
    "content": "#ifndef PWM_H\n#define PWM_H\n\n#include <cstdint>\n//#include <iostream>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/softPwm/softPwm.h\"\n\n#include \"extern.h\"\n\nvoid createPWM(void);\n\nclass PWM : public Module\n{\n\n\tprivate:\n\n\t\tvolatile float* ptrSP; \t\t\t// pointer to the data source\n\t\tint \t\t\tSP;\n\t\tstd::string \tportAndPin;\n\t\tint \t\t\tpwmMax;\n\n\t\tSoftPWM* \t\tpwm;\t\t\t// pointer to PWM object - output\n\n\n\tpublic:\n\n\t\tPWM(volatile float&, std::string);\n\t\tPWM(volatile float&, std::string, int);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/qei/qei.cpp",
    "content": "#include \"mbed.h\"\n#include \"qei.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createQEI()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    int dataBit = module[\"Data Bit\"];\n    const char* index = module[\"Enable Index\"];\n\n    printf(\"Creating QEI, hardware quadrature encoder interface\\n\");\n\n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n    ptrInputs = &txData.inputs;\n\n    if (!strcmp(index,\"True\"))\n    {\n        printf(\"  Encoder has index\\n\");\n        Module* qei = new QEI(*ptrProcessVariable[pv], *ptrInputs, dataBit);\n        baseThread->registerModule(qei);\n    }\n    else\n    {\n        Module* qei = new QEI(*ptrProcessVariable[pv]);\n        baseThread->registerModule(qei);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nQEI::QEI(volatile float &ptrEncoderCount) :\n\tptrEncoderCount(&ptrEncoderCount)\n{\n    qei = new QEIdriver();\n    this->hasIndex = false;\n}\n\nQEI::QEI(volatile float &ptrEncoderCount, volatile uint16_t &ptrData, int bitNumber) :\n\tptrEncoderCount(&ptrEncoderCount),\n    ptrData(&ptrData),\n    bitNumber(bitNumber)\n{\n    qei = new QEIdriver(true);\n    this->hasIndex = true;\n    this->indexPulse = 100;                             \n\tthis->count = 0;\t\t\t\t\t\t\t\t    \n    this->pulseCount = 0;                               \n    this->mask = 1 << this->bitNumber;\n}\n\n\nvoid QEI::update()\n{\n    this->count = this->qei->get();\n\n    if (this->hasIndex)                                     // we have an index pin\n    {\n        // handle index, index pulse and pulse count\n        if (this->qei->indexDetected && (this->pulseCount == 0))    // index interrupt occured: rising edge on index pulse\n        {\n            *(this->ptrEncoderCount) = this->qei->indexCount;\n            this->pulseCount = this->indexPulse;        \n            *(this->ptrData) |= this->mask;                 // set bit in data source high\n        }\n        else if (this->pulseCount > 0)                      // maintain both index output and encoder count for the latch period\n        {\n            this->qei->indexDetected = false;\n            this->pulseCount--;                             // decrement the counter\n        }\n        else\n        {\n            *(this->ptrData) &= ~this->mask;                // set bit in data source low\n            *(this->ptrEncoderCount) = this->count;         // update encoder count\n        }\n    }\n    else\n    {\n        *(this->ptrEncoderCount) = this->count;             // update encoder count\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/qei/qei.h",
    "content": "#ifndef QEI_H\n#define QEI_H\n\n#include \"mbed.h\"\n#include <cstdint>\n\n#include \"module.h\"\n#include \"qeiDriver.h\"\n\n#include \"extern.h\"\n\nvoid createQEI(void);\n\nclass QEI : public Module\n{\n\n\tprivate:\n\n        QEIdriver*              qei;\n\n        volatile uint16_t*      ptrData; \t// pointer to the data source\n\t\tint                     bitNumber;\t\t\t\t// location in the data source\n        int                     mask;\n\n\t\tvolatile float*         ptrEncoderCount; \t// pointer to the data source\n\n        bool                    hasIndex;\n        int32_t                 count;\n        int8_t                  indexPulse;\n        int8_t                  pulseCount;\n\n\tpublic:\n\n        QEI(volatile float&);                           // for channel A & B\n        QEI(volatile float&, volatile uint16_t&, int);   // For channels A & B, and index\n\n\t\tvirtual void update(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/rcservo/rcservo.cpp",
    "content": "#include \"rcservo.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createRCServo()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int sp = module[\"SP[i]\"];\n    const char* pin = module[\"Servo Pin\"];\n\n    printf(\"Make RC Servo at pin %s\\n\", pin);\n    \n    ptrSetPoint[sp] = &rxData.setPoint[sp];\n\n    // slow module with 10 hz update\n    int updateHz = 10;\n    Module* rcservo = new RCServo(*ptrSetPoint[sp], pin, PRU_BASEFREQ, updateHz);\n    baseThread->registerModule(rcservo);\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\n\nRCServo::RCServo(volatile float &ptrPositionCmd, std::string pin, int32_t threadFreq, int32_t slowUpdateFreq) :\n\tModule(threadFreq, slowUpdateFreq),\n\tptrPositionCmd(&ptrPositionCmd),\n\tpin(pin),\n\tthreadFreq(threadFreq)\n{\n    printf(\"Creating RC servo\\n\");\n\t//cout << \"Creating RC servo at pin \" << this->pin << endl;\n\n\tthis->servoPin = new Pin(this->pin, OUTPUT);\t\t\t// create Pin\n\n\tthis->T_ms = 20; \t// 50hz\n\tthis->T_compare = this->T_ms * this->threadFreq / 1000;\n\tthis->pinState = false;\n\tthis->counter = 0;\n\tthis->positionCommand = 0;\n\t\n\tthis->t_compare = (this->threadFreq / 1000)*(1 + (int)this->positionCommand / 180);\n}\n\nvoid RCServo::update()\n{\n\tcounter++;\n\n\tif (counter == this->t_compare)\n\t{\n\t\tpinState = false;\t\t// falling edge of pulse\n\t}\n\telse if (counter == this->T_compare)\n\t{\n\t\tpinState = true; \t\t// rising edge of pulse\n\t\tcounter = 0;\n\t}\n\n\tthis->servoPin->set(pinState);\n}\n\nvoid RCServo::slowUpdate()\n{\n\t// the slowUpate is used to update the position set-point\n\n\tthis->positionCommand = *(this->ptrPositionCmd); \n\tint t = this->threadFreq*(180 + (int)this->positionCommand)/(1000*180);\n\tthis->t_compare = (int)t;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/rcservo/rcservo.h",
    "content": "#ifndef RCSERVO_H\n#define RCSERVO_H\n\n#include <cstdint>\n#include <string>\n//#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createRCServo(void);\n\nclass RCServo : public Module\n{\n\n\tprivate:\n\n\t\tstd::string pin;\t\t\t// physical pin connection\n\t\tint threadFreq;\t\t\t\t// thread frequency\n\t\tint T_ms;\t\t\t\t\t\t\t// servo pulse period\n\t\tint T_compare;\t\t\t\t// thread period counts compare for 20ms (50hz) pulses\n\t\tint t_compare;\t\t\t\t// thread period counts compare for pulse period\n\t\tint counter;\n\n\t\tbool pinState;\t\t\t\t// the state of the output pin\n\n\t\tvolatile float *ptrPositionCmd; \t// pointer to the data source\n\t\tfloat positionCommand;\t// the current servo position command\n\n\n\n\tpublic:\n\n\t\tPin* servoPin;\n\n\t\tRCServo(volatile float&, std::string, int32_t, int32_t);\n\n\t\tvirtual void update(void);\t// Module default interface\n\t\tvirtual void slowUpdate();\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/resetPin/resetPin.cpp",
    "content": "#include \"resetPin.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createResetPin()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    ptrPRUreset = &PRUreset;\n\n    printf(\"Make Reset Pin at pin %s\\n\", pin);\n\n    Module* resetPin = new ResetPin(*ptrPRUreset, pin);\n    servoThread->registerModule(resetPin);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nResetPin::ResetPin(volatile bool &ptrReset, std::string portAndPin) :\n\tptrReset(&ptrReset),\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0);\t\t// Input 0x0, Output 0x1\n}\n\n\nvoid ResetPin::update()\n{\n\t*(this->ptrReset) = this->pin->get();\n}\n\nvoid ResetPin::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/resetPin/resetPin.h",
    "content": "#ifndef RESETPIN_H\n#define RESETPIN_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createResetPin(void);\n\nclass ResetPin : public Module\n{\n\tprivate:\n\n\t\tvolatile bool *ptrReset; \t// pointer to the data source\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n\t\tResetPin(volatile bool&, std::string);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/stepgen/stepgen.cpp",
    "content": "#include \"stepgen.h\"\n\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createStepgen()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int joint = module[\"Joint Number\"];\n    const char* enable = module[\"Enable Pin\"];\n    const char* step = module[\"Step Pin\"];\n    const char* dir = module[\"Direction Pin\"];\n\n    // configure pointers to data source and feedback location\n    ptrJointFreqCmd[joint] = &rxData.jointFreqCmd[joint];\n    ptrJointFeedback[joint] = &txData.jointFeedback[joint];\n    ptrJointEnable = &rxData.jointEnable;\n\n    // create the step generator, register it in the thread\n    Module* stepgen = new Stepgen(base_freq, joint, enable, step, dir, STEPBIT, *ptrJointFreqCmd[joint], *ptrJointFeedback[joint], *ptrJointEnable);\n    baseThread->registerModule(stepgen);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nStepgen::Stepgen(int32_t threadFreq, int jointNumber, std::string enable, std::string step, std::string direction, int stepBit, volatile int32_t &ptrFrequencyCommand, volatile int32_t &ptrFeedback, volatile uint8_t &ptrJointEnable) :\n\tjointNumber(jointNumber),\n\tenable(enable),\n\tstep(step),\n\tdirection(direction),\n\tstepBit(stepBit),\n\tptrFrequencyCommand(&ptrFrequencyCommand),\n\tptrFeedback(&ptrFeedback),\n\tptrJointEnable(&ptrJointEnable)\n{\n\tthis->enablePin = new Pin(this->enable, OUTPUT);\t\t\t// create Pins\n\tthis->stepPin = new Pin(this->step, OUTPUT);\n\tthis->directionPin = new Pin(this->direction, OUTPUT);\n\tthis->DDSaccumulator = 0;\n\tthis->frequencyScale = (float)(1 << this->stepBit) / (float)threadFreq;\n\tthis->mask = 1 << this->jointNumber;\n\tthis->isEnabled = false;\n\tthis->isForward = false;\n}\n\n\nvoid Stepgen::update()\n{\n\t// Use the standard Module interface to run makePulses()\n\tthis->makePulses();\n}\n\nvoid Stepgen::slowUpdate()\n{\n\treturn;\n}\n\nvoid Stepgen::makePulses()\n{\n\tint32_t stepNow = 0;\n\n\tthis->isEnabled = ((*(this->ptrJointEnable) & this->mask) != 0);\n\n\tif (this->isEnabled == true)  \t\t\t\t\t\t\t\t\t\t\t\t// this Step generator is enables so make the pulses\n\t{\n\t\tthis->enablePin->set(false);                                \t\t\t// Enable the driver - CHANGE THIS TO MAKE THE OUTPUT VALUE CONFIGURABLE???\n\n\t\tthis->frequencyCommand = *(this->ptrFrequencyCommand);            \t\t// Get the latest frequency command via pointer to the data source\n\t\tthis->DDSaddValue = this->frequencyCommand * this->frequencyScale;\t\t// Scale the frequency command to get the DDS add value\n\t\tstepNow = this->DDSaccumulator;                           \t\t\t\t// Save the current DDS accumulator value\n\t\tthis->DDSaccumulator += this->DDSaddValue;           \t  \t\t\t\t// Update the DDS accumulator with the new add value\n\t\tstepNow ^= this->DDSaccumulator;                          \t\t\t\t// Test for changes in the low half of the DDS accumulator\n\t\tstepNow &= (1L << this->stepBit);                         \t\t\t\t// Check for the step bit\n\t\tthis->rawCount = this->DDSaccumulator >> this->stepBit;   \t\t\t\t// Update the position raw count\n\n\t\tif (this->DDSaddValue > 0)\t\t\t\t\t\t\t\t\t\t\t\t// The sign of the DDS add value indicates the desired direction\n\t\t{\n\t\t\tthis->isForward = true;\n\t\t}\n\t\telse //if (this->DDSaddValue < 0)\n\t\t{\n\t\t\tthis->isForward = false;\n\t\t}\n\n\t\tif (stepNow)\n\t\t{\n\t\t\tthis->directionPin->set(this->isForward);             \t\t// Set direction pin\n\t\t\tthis->stepPin->set(true);\t\t\t\t\t\t\t\t\t\t// Raise step pin - A4988 / DRV8825 stepper drivers only need 200ns setup time\n\t\t\t*(this->ptrFeedback) = this->DDSaccumulator;                     // Update position feedback via pointer to the data receiver\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis->stepPin->set(false);\t\t\t\t\t\t\t\t\t\t// Reset step pin\n\t\t}\n\n\t}\n\telse\n\t{\n\t\tthis->enablePin->set(true);\n\t}\n\n}\n\nvoid Stepgen::setEnabled(bool state)\n{\n\tthis->isEnabled = state;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/stepgen/stepgen.h",
    "content": "#ifndef STEPGEN_H\n#define STEPGEN_H\n\n#include <cstdint>\n#include <string>\n#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createStepgen(void);\n\nclass Stepgen : public Module\n{\n  private:\n\n    int jointNumber;              \t// LinuxCNC joint number\n    int mask;\n\n    std::string enable, step, direction;\t // physical pins connections\n\n    bool isEnabled;        \t// flag to enable the step generator\n    bool isForward;        \t// current diretion\n\n    int32_t frequencyCommand;     \t// the joint frequency command generated by LinuxCNC\n    volatile int32_t *ptrFrequencyCommand; \t// pointer to the data source where to get the frequency command\n    int32_t rawCount;             \t// current position raw count - not currently used - mirrors original stepgen.c\n    volatile int32_t *ptrFeedback;       \t// pointer where to put the feedback\n    volatile uint8_t *ptrJointEnable;\n    int32_t DDSaccumulator;       \t// Direct Digital Synthesis (DDS) accumulator\n    float   frequencyScale;\t\t  \t  // frequency scale\n  \tint32_t\tDDSaddValue;\t\t  \t    // DDS accumulator add vdd value\n    int32_t stepBit;                // position in the DDS accumulator that triggers a step pulse\n\n  public:\n\n    Stepgen(int32_t, int, std::string, std::string, std::string, int, volatile int32_t&, volatile int32_t&, volatile uint8_t&);  // constructor\n\n    Pin *enablePin, *stepPin, *directionPin;\t\t// class object members - Pin objects\n\n    virtual void update(void);           // Module default interface\n    virtual void slowUpdate(void);\n    void makePulses();\n    void setEnabled(bool);\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/switch/switch.cpp",
    "content": "#include \"switch.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createSwitch()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n    const char* mode = module[\"Mode\"];\n    int pv = module[\"PV[i]\"];\n    float sp = module[\"SP\"];\n\n    printf(\"Make Switch (%s) at pin %s\\n\", mode, pin);\n\n    if (!strcmp(mode,\"On\"))\n    {\n        Module* SoftSwitch = new Switch(sp, *ptrProcessVariable[pv], pin, 1);\n        servoThread->registerModule(SoftSwitch);\n    }\n    else if (!strcmp(mode,\"Off\"))\n    {\n        Module* SoftSwitch = new Switch(sp, *ptrProcessVariable[pv], pin, 0);\n        servoThread->registerModule(SoftSwitch);\n    }\n    else\n    {\n        printf(\"Error - incorrectly defined Switch\\n\");\n    }\n}\n\nSwitch::Switch(float SP, volatile float &ptrPV, std::string portAndPin, bool mode) :\n\tSP(SP),\n\tptrPV(&ptrPV),\n\tportAndPin(portAndPin),\n\tmode(mode)\n{\n    printf(\"Creating a Switch\\n\");\n\t//cout << \"Creating a Switch @ pin \" << this->portAndPin << endl;\n\tint output = 0x1; // an output\n\tthis->pin = new Pin(this->portAndPin, output);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nvoid Switch::update()\n{\n\tbool pinState;\n\n\tpinState = this->mode;\n\n\t// update the SP\n\tthis->PV = *(this->ptrPV);\n\n\tif (this->PV > this->SP)\n\t{\n\t\tthis->pin->set(pinState);\n\t}\n\telse\n\t{\n\t\tpinState = !pinState;\n\t\tthis->pin->set(pinState);\n\t}\n\n}\n\n\nvoid Switch::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/switch/switch.h",
    "content": "#ifndef SWITCH_H\n#define SWITCH_H\n\n#include <cstdint>\n//#include <iostream>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createSwitch(void);\n\nclass Switch : public Module\n{\n\n\tprivate:\n\n\t\tvolatile float* ptrPV; \t\t\t// pointer to the data source\n\t\tfloat \t\t\tPV;\n\t\tfloat \t\t\tSP;\n\t\tbool\t\t\tmode;\t\t\t// 0 switch off, 1 switch on\n\t\tstd::string \tportAndPin;\n\n\t\tPin \t\t\t*pin;\n\n\n\tpublic:\n\n\t\tSwitch(float, volatile float&, std::string, bool);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/temperature/temperature.cpp",
    "content": "#include \"temperature.h\"\n\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createTemperature()\n{\n    printf(\"Make Temperature measurement object\\n\");\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    const char* sensor = module[\"Sensor\"];\n\n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n\n    if (!strcmp(sensor, \"Thermistor\"))\n    {\n        const char* pinSensor = module[\"Thermistor\"][\"Pin\"];\n        float beta =  module[\"Thermistor\"][\"beta\"];\n        int r0 = module[\"Thermistor\"][\"r0\"];\n        int t0 = module[\"Thermistor\"][\"t0\"];\n\n        // slow module with 1 hz update\n        int updateHz = 1;\n        Module* temperature = new Temperature(*ptrProcessVariable[pv], PRU_SERVOFREQ, updateHz, sensor, pinSensor, beta, r0, t0);\n        servoThread->registerModule(temperature);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nTemperature::Temperature(volatile float &ptrFeedback, int32_t threadFreq, int32_t slowUpdateFreq, std::string sensorType, std::string pinSensor, float beta, int r0, int t0) :\n  Module(threadFreq, slowUpdateFreq),\n  ptrFeedback(&ptrFeedback),\n  sensorType(sensorType),\n  pinSensor(pinSensor),\n\tbeta(beta),\n\tr0(r0),\n\tt0(t0)\n{\n    if (this->sensorType == \"Thermistor\")\n    {\n        printf(\"Creating Thermistor Tempearture measurement @ pin %s\\n\", this->pinSensor.c_str());\n        //cout <<\"Creating Thermistor Tempearture measurement @ pin \" << this->pinSensor << endl;\n        this->Sensor = new Thermistor(this->pinSensor, this->beta, this->r0, this->t0);\n    }\n    // TODO: Add more sensor types as needed\n\n    // Take some readings to get the ADC up and running before moving on\n    this->slowUpdate();\n    this->slowUpdate();\n    printf(\"Start temperature = %f\\n\", this->temperaturePV);\n    //cout << \"Start temperature = \" << this->temperaturePV << endl;\n}\n\nvoid Temperature::update()\n{\n  return;\n}\n\nvoid Temperature::slowUpdate()\n{\n\tthis->temperaturePV = this->Sensor->getTemperature();\n\n    // check for disconnected temperature sensor\n    if (this->temperaturePV > 0)\n    {\n        *(this->ptrFeedback) = this->temperaturePV;\n    }\n    else\n    {\n        printf(\"Temperature sensor error, pin %s reading = %f\\n\", this->pinSensor.c_str(), this->temperaturePV);\n        //cout << \"Temperature sensor error, pin \" << this->pinSensor << \" reading = \" << this->temperaturePV << endl;\n        *(this->ptrFeedback) = 999;\n    }\n\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/temperature/temperature.h",
    "content": "#ifndef TEMPERATURE_H\n#define TEMPERATURE_H\n\n#include <cstdint>\n#include <string>\n//#include <iostream>\n\n#include \"modules/module.h\"\n#include \"sensors/tempSensor.h\"\n#include \"sensors/thermistor/thermistor.h\"\n\n#include \"extern.h\"\n\nvoid createTemperature(void);\n\nclass Temperature : public Module\n{\n  private:\n\n    std::string sensorType;       // temperature sensor type\n    std::string pinSensor;\t             // physical pins connections\n\n    volatile float* ptrFeedback;       \t   // pointer where to put the feedback\n\n    float temperaturePV;\n\n    // thermistor parameters\n    float beta;\n    float r0;\n\t\tfloat t0;\n\n  public:\n\n    Temperature(volatile float&, int32_t, int32_t, std::string, std::string, float, int, int);  // Thermistor type constructor\n\n    TempSensor* Sensor;\n\n    virtual void update(void);           // Module default interface\n    virtual void slowUpdate(void);\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/tmc/tmc.h",
    "content": "#ifndef TMCMODULE_H\n#define TMCMODULE_H\n\n#include \"mbed.h\"\n#include <cstdint>\n#include <string>\n\n#include \"module.h\"\n#include \"/TMCStepper/TMCStepper.h\"\n\n#include \"extern.h\"\n\n\nvoid createTMC2208(void);\nvoid createTMC2209(void);\n\nclass TMC : public Module\n{\n  protected:\n\n    float       Rsense;\n\n  public:\n\n    virtual void update(void) = 0;           // Module default interface\n    virtual void configure(void) = 0;\n};\n\n\nclass TMC2208 : public TMC\n{\n  protected:\n\n    std::string rxtxPin;     // default to half duplex\n    uint16_t    mA;\n    uint16_t    microsteps;\n    bool        stealth;\n\n    TMC2208Stepper* driver;\n\n  public:\n\n    // SW Serial pin, Rsense, mA, microsteps, stealh\n    TMC2208(std::string, float, uint16_t, uint16_t, bool);\n    ~TMC2208();\n\n    void update(void);           // Module default interface\n    void configure(void);\n};\n\n\nclass TMC2209 : public TMC\n{\n  protected:\n\n    std::string rxtxPin;     // default to half duplex\n    uint16_t    mA;\n    uint16_t    microsteps;\n    bool        stealth;\n    uint8_t     addr;\n    uint16_t    stall;\n\n    TMC2209Stepper* driver;\n\n  public:\n\n    // SW Serial pin, Rsense, addr, mA, microsteps, stealh, hybrid, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    ~TMC2209();\n\n    void update(void);           // Module default interface\n    void configure(void);\n};\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/tmc/tmc2208.cpp",
    "content": "\n#include \"tmc.h\"\n#include <cstdint>\n\n#define TOFF_VALUE  4 // [1... 15]\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createTMC2208()\n{\n    printf(\"Make TMC2208\\n\");\n\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* RxPin = module[\"RX pin\"];\n    float RSense = module[\"RSense\"];\n    uint8_t address = module[\"Address\"];\n    uint16_t current = module[\"Current\"];\n    uint16_t microsteps = module[\"Microsteps\"];\n    const char* stealth = module[\"Stealth chop\"];\n    uint16_t stall = module[\"Stall sensitivity\"];\n\n    bool stealthchop;\n\n    if (!strcmp(stealth, \"on\"))\n    {\n        stealthchop = true;\n    }\n    else\n    {\n        stealthchop = false;   \n    }\n\n    // SW Serial pin, RSense, mA, microsteps, stealh\n    // TMC2208(std::string, float, uint8_t, uint16_t, uint16_t, bool);\n    Module* tmc = new TMC2208(RxPin, RSense, current, microsteps, stealthchop);\n\n    printf(\"\\nStarting the COMMS thread\\n\");\n    commsThread->startThread();\n    commsThread->registerModule(tmc);\n\n    tmc->configure();\n\n    printf(\"\\nStopping the COMMS thread\\n\");\n    commsThread->stopThread();\n    commsThread->unregisterModule(tmc);\n\n    delete tmc;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n    // SW Serial pin, RSense, mA, microsteps, stealh, hybrid\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool);\nTMC2208::TMC2208(std::string rxtxPin, float Rsense, uint16_t mA, uint16_t microsteps, bool stealth) :\n    rxtxPin(rxtxPin),\n    mA(mA),\n    microsteps(microsteps),\n    stealth(stealth)\n{\n    this->Rsense = Rsense;\n    this->driver = new TMC2208Stepper(this->rxtxPin, this->rxtxPin, this->Rsense);\n}\n\nTMC2208::~TMC2208()\n{\n    delete this->driver;\n}\n\nvoid TMC2208::configure()\n{\n    uint16_t result;\n\n    driver->begin();\n    \n    printf(\"Testing connection to TMC driver...\");\n    result = driver->test_connection();\n    if (result) {\n        printf(\"failed!\\n\");\n        printf(\"Likely cause: \");\n        switch(result) {\n            case 1: printf(\"loose connection\\n\"); break;\n            case 2: printf(\"no power\\n\"); break;\n        }\n        printf(\"  Fix the problem and reset board.\\n\");\n        //abort();\n    }\n    else   \n    {\n        printf(\"OK\\n\");\n    }\n\n\n    // Sets the slow decay time (off time) [1... 15]. This setting also limits\n    // the maximum chopper frequency. For operation with StealthChop,\n    // this parameter is not used, but it is required to enable the motor.\n    // In case of operation with StealthChop only, any setting is OK.\n    driver->toff(TOFF_VALUE);\n\n    // Comparator blank time. This time needs to safely cover the switching\n    // event and the duration of the ringing on the sense resistor. For most\n    // applications, a setting of 16 or 24 is good. For highly capacitive\n    // loads, a setting of 32 or 40 will be required.\n    driver->blank_time(24);\n\n    driver->rms_current(this->mA);\n    driver->microsteps(this->microsteps);\n\n    // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!\n    driver->en_spreadCycle(!this->stealth);            \n\n    // Needed for StealthChop\n    driver->pwm_autoscale(true);             \n\n     driver->iholddelay(10);\n\n    driver->TPOWERDOWN(128);    // ~2s until driver lowers to hold current\n    \n}\n\nvoid TMC2208::update()\n{\n    this->driver->SWSerial->tickerHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/modules/tmc/tmc2209.cpp",
    "content": "\n#include \"tmc.h\"\n#include <cstdint>\n\n#define TOFF_VALUE  4 // [1... 15]\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createTMC2209()\n{\n    printf(\"Make TMC2209\\n\");\n\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* RxPin = module[\"RX pin\"];\n    float RSense = module[\"RSense\"];\n    uint8_t address = module[\"Address\"];\n    uint16_t current = module[\"Current\"];\n    uint16_t microsteps = module[\"Microsteps\"];\n    const char* stealth = module[\"Stealth chop\"];\n    uint16_t stall = module[\"Stall sensitivity\"];\n\n    bool stealthchop;\n\n    if (!strcmp(stealth, \"on\"))\n    {\n        stealthchop = true;\n    }\n    else\n    {\n        stealthchop = false;   \n    }\n\n    // SW Serial pin, RSense, addr, mA, microsteps, stealh, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    Module* tmc = new TMC2209(RxPin, RSense, address, current, microsteps, stealthchop, stall);\n    commsThread->registerModule(tmc);\n\n    printf(\"\\nStarting the COMMS thread\\n\");\n    commsThread->startThread(); \n    tmc->configure();\n\n    printf(\"\\nStopping the COMMS thread\\n\");\n    commsThread->stopThread();\n    commsThread->unregisterModule(tmc);\n    delete tmc;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n    // SW Serial pin, RSense, addr, mA, microsteps, stealh, hybrid, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\nTMC2209::TMC2209(std::string rxtxPin, float Rsense, uint8_t addr, uint16_t mA, uint16_t microsteps, bool stealth, uint16_t stall) :\n    rxtxPin(rxtxPin),\n    mA(mA),\n    microsteps(microsteps),\n    stealth(stealth),\n    addr(addr),\n    stall(stall)\n{\n    this->Rsense = Rsense;\n    this->driver = new TMC2209Stepper(this->rxtxPin, this->rxtxPin, this->Rsense, this->addr);\n}\n\nTMC2209::~TMC2209()\n{\n    delete this->driver;\n}\n\nvoid TMC2209::configure()\n{\n    uint16_t result;\n\n    driver->begin();\n    \n    printf(\"Testing connection to TMC driver...\");\n    result = driver->test_connection();\n    if (result) {\n        printf(\"failed!\\n\");\n        printf(\"Likely cause: \");\n        switch(result) {\n            case 1: printf(\"loose connection\\n\"); break;\n            case 2: printf(\"no power\\n\"); break;\n        }\n        printf(\"  Fix the problem and reset board.\\n\");\n        //abort();\n    }\n    else   \n    {\n        printf(\"OK\\n\");\n    }\n\n\n    // Sets the slow decay time (off time) [1... 15]. This setting also limits\n    // the maximum chopper frequency. For operation with StealthChop,\n    // this parameter is not used, but it is required to enable the motor.\n    // In case of operation with StealthChop only, any setting is OK.\n    driver->toff(TOFF_VALUE);\n\n    // Comparator blank time. This time needs to safely cover the switching\n    // event and the duration of the ringing on the sense resistor. For most\n    // applications, a setting of 16 or 24 is good. For highly capacitive\n    // loads, a setting of 32 or 40 will be required.\n    driver->blank_time(24);\n\n    driver->rms_current(this->mA);\n    driver->microsteps(this->microsteps);\n\n    // Lower threshold velocity for switching on smart energy CoolStep and StallGuard to DIAG output\n    driver->TCOOLTHRS(0xFFFFF); // 20bit max\n    \n    // CoolStep lower threshold [0... 15].\n    // If SG_RESULT goes below this threshold, CoolStep increases the current to both coils.\n    // 0: disable CoolStep\n    driver->semin(5);\n\n    // CoolStep upper threshold [0... 15].\n    // If SG is sampled equal to or above this threshold enough times,\n    // CoolStep decreases the current to both coils.\n    driver->semax(2);\n\n    // Sets the number of StallGuard2 readings above the upper threshold necessary\n    // for each current decrement of the motor current.\n    driver->sedn(0b01);\n\n    // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!\n    driver->en_spreadCycle(!this->stealth);            \n    \n    // Needed for StealthChop\n    driver->pwm_autoscale(true);             \n\n    // StallGuard is only possible if StealthChop is enabled\n    if (this->stealth && this->stall)\n    {\n        // StallGuard4 threshold [0... 255] level for stall detection. It compensates for\n        // motor specific characteristics and controls sensitivity. A higher value gives a higher\n        // sensitivity. A higher value makes StallGuard4 more sensitive and requires less torque to\n        // indicate a stall. The double of this value is compared to SG_RESULT.\n        // The stall output becomes active if SG_RESULT fall below this value.\n        driver->SGTHRS(this->stall);             \n    }\n\n    driver->iholddelay(10);\n\n    driver->TPOWERDOWN(128);    // ~2s until driver lowers to hold current\n    \n}\n\nvoid TMC2209::update()\n{\n    this->driver->SWSerial->tickerHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/remora.h",
    "content": "#ifndef REMORA_H\n#define REMORA_H\n#pragma pack(push, 1)\n\n\ntypedef union\n{\n  // this allow structured access to the incoming SPI data without having to move it\n  struct\n  {\n    uint8_t rxBuffer[SPI_BUFF_SIZE];\n  };\n  struct\n  {\n    int32_t header;\n    volatile int32_t jointFreqCmd[JOINTS]; \t// Base thread commands ?? - basically motion\n    float setPoint[VARIABLES];\t\t  // Servo thread commands ?? - temperature SP, PWM etc\n    uint8_t jointEnable;\n    uint16_t outputs;\n    uint8_t spare0;\n  };\n} rxData_t;\n\nextern volatile rxData_t rxData;\n\n\ntypedef union\n{\n  // this allow structured access to the out going SPI data without having to move it\n  struct\n  {\n    uint8_t txBuffer[SPI_BUFF_SIZE];\n  };\n  struct\n  {\n    int32_t header;\n    int32_t jointFeedback[JOINTS];\t  // Base thread feedback ??\n    float processVariable[VARIABLES];\t\t     // Servo thread feedback ??\n\tuint16_t inputs;\n  };\n} txData_t;\n\nextern volatile txData_t txData;\n\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/sensors/tempSensor.h",
    "content": "#ifndef TEMPSENSOR_H\n#define TEMPSENSOR_H\n\n// Base class for all temperature sensor classes\n\nclass TempSensor\n{\n\tpublic:\n\t\tvirtual ~TempSensor() {}\n\n\t\t// Return temperature in degrees Celsius.\n\t\tvirtual float getTemperature() { return -1.0F; }\n\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/sensors/thermistor/thermistor.cpp",
    "content": "#include \"thermistor.h\"\n\n\nThermistor::Thermistor(std::string pin, float beta, int r0, int t0) :\n\tpin(pin),\n\tbeta(beta),\n\tr0(r0),\n\tt0(t0)\n{\n\t// Thermistor math\n\tthis->j = (1.0F / this->beta);\n\tthis->k = (1.0F / (this->t0 + 273.15F));\n\n\tthis->thermistorPin = new Pin(this->pin, INPUT);\n    this->adc = new AnalogIn(this->thermistorPin->pinToPinName());\n\tthis->r1 = 0;\n\tthis->r2 = 4700;\n}\n\n// Use FastAnalogIn library to get ADC value\nint Thermistor::newThermistorReading()\n{\n\treturn this->adc->read_u16();\n}\n\n// This is the workhorse routine that calculates the temperature\n// using the Steinhart-Hart equation for thermistors\n// https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation\nfloat Thermistor::adcValueToTemperature()\n{\n\tfloat adcValue = this->newThermistorReading();\n\tfloat t;\n\n\t// resistance of the thermistor in ohms\n\tfloat r = this->r2 / ((65536.0F / adcValue) - 1.0F);\n\n\n\tif (this->r1 > 0.0F) r = (this->r1 * r) / (this->r1 - r);\n\n\t// use Beta value\n\tt= (1.0F / (this->k + (this->j * logf(r / this->r0)))) - 273.15F;\n\n\treturn t;\n}\n\n\nfloat Thermistor::getTemperature()\n{\n\t// This is the standard interface\n\treturn this->adcValueToTemperature();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/sensors/thermistor/thermistor.h",
    "content": "#ifndef THERMISTOR_H\n#define THERMISTOR_H\n\n#include <stdint.h>\n#include <string>\n\n#include \"sensors/tempSensor.h\"\n#include \"drivers/pin/pin.h\"\n\n// Derived class from Tempsensor\n\nclass Thermistor : public TempSensor\n{\n\tprivate:\n\n\t\tstd::string pin;\n\n        AnalogIn *adc;\n\n\t\tfloat temperatureMax, temperatureMin;\n\t\tbool useSteinhartHart;\n\n\t\t// Thermistor computation settings using beta, not used if using Steinhart-Hart\n\t\tfloat r0;\n\t\tfloat t0;\n\n\t\t// on board resistor settings\n\t\tint r1;\n\t\tint r2;\n\n\t\tunion\n\t\t{\n\t\t\t// this saves memory as we only use either beta or SHH\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tfloat beta;\n\t\t\t\tfloat j;\n\t\t\t\tfloat k;\n\t\t\t};\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tfloat c1;\n\t\t\t\tfloat c2;\n\t\t\t\tfloat c3;\n\t\t\t};\n\t\t};\n\n\tpublic:\n\n\t\tPin *thermistorPin;\n\n\t\tThermistor(std::string, float, int, int);\n\n\t\tint newThermistorReading();\n\t\tfloat adcValueToTemperature();\n\t\tfloat getTemperature();\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/thread/timerInterrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n\n\nTimerInterrupt::TimerInterrupt(int interruptNumber, pruTimer* owner)\n{\n\t// Allows interrupt to access owner's data\n\tInterruptOwnerPtr = owner;\n\n\t// When a device interrupt object is instantiated, the Register function must be called to let the\n\t// Interrupt base class know that there is an appropriate ISR function for the given interrupt.\n\tInterrupt::Register(interruptNumber, this);\n}\n\n\nvoid TimerInterrupt::ISR_Handler(void)\n{\n\tthis->InterruptOwnerPtr->timerTick();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/thread/timerInterrupt.h",
    "content": "#ifndef TIMERINTERRUPT_H\n#define TIMERINTERRUPT_H\n\n// Derived class for timer interrupts\n\nclass pruTimer; // forward declatation\n\nclass TimerInterrupt : public Interrupt\n{\n\tprivate:\n\t    \n\t\tpruTimer* InterruptOwnerPtr;\n\t\n\tpublic:\n\n\t\tTimerInterrupt(int interruptNumber, pruTimer* ownerptr);\n    \n\t\tvoid ISR_Handler(void);\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS5/update_mks_robin.py",
    "content": "#!/usr/bin/env python2\n# Script to update firmware for MKS Robin bootloader\n#\n# Copyright (C) 2020  Kevin O'Connor <kevin@koconnor.net>\n#\n# This file may be distributed under the terms of the GNU GPLv3 license.\nimport optparse\n\nXOR_PATTERN = [\n    0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80,\n    0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33,\n    0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF,\n    0xF7, 0x3E\n]\n\ndef main():\n    # Parse command-line arguments\n    usage = \"%prog <input_file> <output_file>\"\n    opts = optparse.OptionParser(usage)\n    options, args = opts.parse_args()\n    if len(args) != 2:\n        opts.error(\"Incorrect number of arguments\")\n    infilename, outfilename = args\n    # Read input\n    f = open(infilename, \"rb\")\n    srcfirmware = f.read()\n    f.close()\n    # Update\n    firmware = bytearray(srcfirmware)\n    for pos in range(320, min(31040, len(firmware))):\n        firmware[pos] ^= XOR_PATTERN[pos & 31]\n    # Write output\n    f = open(outfilename, \"wb\")\n    f.write(firmware)\n    f.close()\n\nif __name__ == '__main__':\n    main()"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/README.md",
    "content": "Remora OS6 firmware. All current Remora supported STM32 based boards will be found here. LPC1768/1769 based boards are not supported by Remora OS6\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/SoftwareSerial/SoftwareSerial.cpp",
    "content": "\n#include \"SoftwareSerial.h\"\n#include <cstdint>\n\n\n\nSoftwareSerial::SoftwareSerial(std::string tx, std::string rx)\n{\n    if (!tx.empty()) TXportAndPin = tx;\n    if (!rx.empty()) RXportAndPin = rx;\n    halfDuplex = !TXportAndPin.compare(RXportAndPin);\n\n    if(halfDuplex)\n    {\n        this->rxpin = new Pin(RXportAndPin,1);\n        this->txpin = this->rxpin;\n        setTX();\n    }\n    else\n    {\n        this->txpin = new Pin(TXportAndPin,0);\n        setTX();\n\n        this->rxpin = new Pin(RXportAndPin,1);\n        setRX();\n    }\n    \n    qin = 0;\n    qout = 0;\n    activeTx = false;\n    activeRx = false;\n}\n\n\nvoid SoftwareSerial::begin(int baudrate)\n{\n    #ifdef FORCE_BAUD_RATE\n    baudrate = FORCE_BAUD_RATE;     // 19200 fastest stable baud rate\n    #endif\n    baudRate = baudrate;\n    //ticker.attach_us(callback(this, &SoftwareSerial::tickerHandler), 1000000.0 / (baudRate * 3.0));\n}\n\nvoid SoftwareSerial::setSpeed(int baudrate)\n{\n    //ticker.detach();\n  \n    //ticker.attach_us(callback(this, &SoftwareSerial::tickerHandler), 1000000.0 / (baudrate * 3.0));\n    this->baudRate = baudrate;\n}\n\nvoid SoftwareSerial::setTX(void)\n{\n    // First write, then set output. If we do this the other way around,\n    // the pin would be output low for a short while before switching to\n    // output hihg. Now, it is input with pullup for a short while, which\n    // is fine. With inverse logic, either order is fine.\n\n    //this->txpin->set(1);                  // works for LPC1768 but not STM32\n    this->txpin->setAsOutput();\n    this->txpin->set(1);\n}\n\nvoid SoftwareSerial::setRX(void)\n{\n\n    this->rxpin->setAsInput();\n    this->rxpin->pull_up();\n}\n\nvoid SoftwareSerial::setRXTX(bool input)\n{\n    if (halfDuplex)\n    {\n        if (input)\n        {\n            setRX();\n            rxBitCnt = -1;\n            rxTickCnt = 2;\n            activeRx = true;\n        }\n        else\n        {\n            if (activeRx)\n            {\n                setTX();\n                activeRx = false;\n            }\n        }\n    }\n}\n\nbool SoftwareSerial::listen()\n{\n    if (rxpin != nullptr)\n    {\n        setRXTX(true);\n        return true;\n    }\n    return false;\n}\n\nvoid SoftwareSerial::end(void)\n{\n    \n}\n\nvoid SoftwareSerial::tickerHandler(void)\n{\n    if (activeTx) this->send();\n    if (activeRx) this->receive();\n}\n\nvoid SoftwareSerial::send(void)\n{\n    if (--txTickCnt <= 0)\n    {\n        if (txBitCnt++ < TX_BITS)   // count out the bits in the txBuffer\n        {\n            this->txpin->set(txBuffer & 0x01);   // set output equal to the LSB in txBuffer\n            txBuffer >>= 1;                     // shift txBuffer to right\n            txTickCnt = OVERSAMPLE;             // reset the tick counter\n        }\n        else    // transmit finished, stay active or wait for a period before swapping to Rx mode if half duplex mode\n        {\n            txTickCnt = 1;\n            if (outputPending)\n            {\n                activeTx = false;    // output pending allow new byte to be written to txBuffer from write()\n            }\n            else if (txBitCnt > 10 + OVERSAMPLE*5)\n            {\n                if (halfDuplex)\n                {\n                    setRXTX(true);        // switch to receive mode\n                }\n                activeTx = false;\n            }\n        }\n    }\n}\n\nvoid SoftwareSerial::receive()\n{\n    if (--rxTickCnt <= 0)\n    {\n        uint8_t inbit = this->rxpin->get();   // read the rx line\n        if (rxBitCnt == -1)                 // waiting for start bit\n        {\n            if (!inbit)\n            {\n                // got a start bit\n                rxBitCnt = 0;\n                rxTickCnt = OVERSAMPLE + 1;\n                rxBuffer = 0;\n            }\n            else\n            {\n                rxTickCnt = 1;\n            }\n        }\n        else if (rxBitCnt >= RX_BITS)     // full byte has been read\n        {\n            // add stop bit to buffer\n            inbuf[qin] = rxBuffer;\n\t\t\tif ( ++qin >= IN_BUF_SIZE )\n            {\n\t\t\t    // overflow - reset inbuf-index\n\t\t\t\tqin = 0;\n\t\t\t}\n            rxTickCnt = 1;\n            rxBitCnt = -1;              // flag waiting for start bit\n        }\n        else                            // read data bits\n        {\n            rxBuffer >>= 1;\n            if (inbit)  rxBuffer |= 0x80;\n            rxBitCnt++;\n            rxTickCnt = OVERSAMPLE;\n        }\n    }\n}\n\n\nint SoftwareSerial::available()\n{\n    return (qout - qin);\n}\n\n\nvoid SoftwareSerial::printStr(char* str)\n{\n    int i = 0;\n    int len = strlen(str); \n    for(i = 0; i<len; i++)\n    {\n        write(str[i]);\n    }\n}\n\n\nvoid SoftwareSerial::write(int b)\n{\n    outputPending = true;               // notify ticker handler that there are more bytes to transmit after current\n    while (activeTx)                    // wait for current transmission to complete\n    {\n        idle();\n    }\n    txBuffer =      (b << 1) | 0x200;   // add start and stop bits\n    txBitCnt =      0;\n    txTickCnt =     OVERSAMPLE;\n    if (halfDuplex) setRXTX(false);\n    outputPending = false;\n    activeTx =      true;\n}\n\nint16_t SoftwareSerial::read()\n{\n    if (qout == qin) return -1;\n\n    char d = inbuf[qout] & 0xFF;\n\n    if ( ++qout >= IN_BUF_SIZE ) {qout = 0;}\n    \n    return d;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/SoftwareSerial/SoftwareSerial.h",
    "content": "#ifndef SOFTWARESERIAL_H\n#define SOFTWARESERIAL_H\n\n//#include \"LPC17xx.h\"\n#include \"mbed.h\"\n#include <cstdint>\n#include <string>\n#include \"configuration.h\"\n#include \"pin.h\"\n\n\n#define FORCE_BAUD_RATE 19600 //9600\n#define IN_BUF_SIZE     64\n#define TX_BITS         10     // 1 Startbit, 8 Databits, 1 Stopbit = 10 Bits/Frame\n#define RX_BITS         8      // startbit and stopbit parsed internally (see ISR)\n//#define OVERSAMPLE      3\n\n\nclass SoftwareSerial\n{\n    private:\n\n    //static SoftwareSerial* instance;        // there can only be one\n    //void (*_rit_isr)(void);                 // storage for an appended isr function\n    //void ritisr(void);                      // the default (instance) isr\n    //static void _ritisr(void);              // the actual static isr\n\n    std::string     TXportAndPin;\n    std::string     RXportAndPin;\n    Pin*            txpin;\n    Pin*            rxpin;\n\n    //Ticker          ticker;\n    \n    unsigned char   inbuf[IN_BUF_SIZE];\n    unsigned char   qin;\n    unsigned char   qout;\n    \n    int32_t  baudRate;\n \n    bool     activeTx;\n    bool     activeRx;\n    bool     halfDuplex;\n    bool     outputPending;\n\n    int32_t  rxTickCnt;\n    int32_t  txTickCnt;\n    int32_t  txBitCnt;\n    int32_t  rxBitCnt;\n    int32_t  txBuffer;\n    int32_t  rxBuffer;\n\n    public:\n\n    SoftwareSerial(std::string, std::string);\n\n    void begin(int);\n    void setSpeed(int);\n    void end(void);\n    void setTX(void);\n    void setRX(void);\n    void setRXTX(bool);\n    void send(void);\n    void receive(void);\n    void write(int);\n    int16_t  read(void);\n    bool listen(void);\n    void tickerHandler(void);\n\n    void enableTx(void);\n    void enableRx(void);\n    void idle() {__NOP();}\n    \n\n    int available();\n\n    void flush_input_buffer();\n    void printStr(char*);\n};\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MANTA8/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ******************************************************************************\r\n *\r\n * Copyright (c) 2015 STMicroelectronics.\r\n * All rights reserved.\r\n *\r\n * This software component is licensed by ST under BSD 3-Clause license,\r\n * the \"License\"; You may not use this file except in compliance with the\r\n * License. You may obtain a copy of the License at:\r\n *                        opensource.org/licenses/BSD-3-Clause\r\n *\r\n ******************************************************************************\r\n */\r\n#ifndef MBED_PERIPHERALNAMES_H\r\n#define MBED_PERIPHERALNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ADC_1 = (int)ADC1_BASE,\r\n} ADCName;\r\n\r\n#if defined DAC_BASE\r\ntypedef enum {\r\n    DAC_1 = (int)DAC_BASE,\r\n} DACName;\r\n#endif\r\n\r\ntypedef enum {\r\n    UART_1   = (int)USART1_BASE,\r\n    UART_2   = (int)USART2_BASE,\r\n#if defined USART3_BASE\r\n    UART_3   = (int)USART3_BASE,\r\n#endif\r\n#if defined USART4_BASE\r\n    UART_4   = (int)USART4_BASE,\r\n#endif\r\n#if defined USART5_BASE\r\n    UART_5   = (int)USART5_BASE,\r\n#endif\r\n#if defined USART6_BASE\r\n    UART_6   = (int)USART6_BASE,\r\n#endif\r\n#if defined LPUART1_BASE\r\n    LPUART_1 = (int)LPUART1_BASE,\r\n#endif\r\n#if defined LPUART2_BASE\r\n    LPUART_2 = (int)LPUART2_BASE,\r\n#endif\r\n} UARTName;\r\n\r\n#define DEVICE_SPI_COUNT 2\r\ntypedef enum {\r\n    SPI_1 = (int)SPI1_BASE,\r\n    SPI_2 = (int)SPI2_BASE,\r\n#if defined SPI3_BASE\r\n    SPI_3 = (int)SPI3_BASE,\r\n#endif\r\n} SPIName;\r\n\r\ntypedef enum {\r\n    I2C_1 = (int)I2C1_BASE,\r\n    I2C_2 = (int)I2C2_BASE,\r\n#if defined I2C3_BASE\r\n    I2C_3 = (int)I2C3_BASE,\r\n#endif\r\n} I2CName;\r\n\r\ntypedef enum {\r\n    PWM_1  = (int)TIM1_BASE,\r\n#if defined TIM2_BASE\r\n    PWM_2  = (int)TIM2_BASE,\r\n#endif\r\n    PWM_3  = (int)TIM3_BASE,\r\n#if defined TIM4_BASE\r\n    PWM_4  = (int)TIM4_BASE,\r\n#endif\r\n    PWM_14 = (int)TIM14_BASE,\r\n#if defined TIM15_BASE\r\n    PWM_15 = (int)TIM15_BASE,\r\n#endif\r\n    PWM_16 = (int)TIM16_BASE,\r\n    PWM_17 = (int)TIM17_BASE,\r\n} PWMName;\r\n\r\n#if defined FDCAN1_BASE\r\ntypedef enum {\r\n    CAN_1 = (int)FDCAN1_BASE,\r\n#if defined FDCAN2_BASE\r\n    CAN_2 = (int)FDCAN2_BASE,\r\n#endif\r\n} CANName;\r\n#endif\r\n\r\n#if defined USB_BASE\r\ntypedef enum {\r\n    USB_FS = (int)USB_BASE\r\n} USBName;\r\n#endif\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MANTA8/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ******************************************************************************\r\n *\r\n * Copyright (c) 2016-2022 STMicroelectronics.\r\n * All rights reserved.\r\n *\r\n * This software component is licensed by ST under BSD 3-Clause license,\r\n * the \"License\"; You may not use this file except in compliance with the\r\n * License. You may obtain a copy of the License at:\r\n *                        opensource.org/licenses/BSD-3-Clause\r\n *\r\n ******************************************************************************\r\n *\r\n * Automatically generated from STM32CubeMX/db/mcu/STM32G0B1R(B-C-E)Tx.xml\r\n */\r\n\r\n#include \"PeripheralPins.h\"\r\n#include \"mbed_toolchain.h\"\r\n\r\n//==============================================================================\r\n// Notes\r\n//\r\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\r\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\r\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\r\n//   pinout image on mbed.org.\r\n//\r\n// - The pins which are connected to other components present on the board have\r\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\r\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\r\n//   Please read the board reference manual and schematic for more information.\r\n//\r\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\r\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\r\n//\r\n//==============================================================================\r\n\r\n\r\n//*** ADC ***\r\n\r\nMBED_WEAK const PinMap PinMap_ADC[] = {\r\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\r\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\r\n//  {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to STDIO_UART_TX\r\n//  {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to STDIO_UART_RX\r\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\r\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to LED_GREEN\r\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\r\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\r\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\r\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\r\n    {PB_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\r\n    {PB_10,      ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\r\n    {PB_11,      ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\r\n    {PB_12,      ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC1_IN16\r\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC1_IN17\r\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // ADC1_IN18\r\n    {NC, NC, 0}\r\n};\r\n\r\n// !!! SECTION TO BE CHECKED WITH DEVICE REFERENCE MANUAL\r\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\r\n//     {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\r\n//     {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\r\n//     {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** DAC ***\r\n\r\nMBED_WEAK const PinMap PinMap_DAC[] = {\r\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1\r\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2 // Connected to LED_GREEN\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** I2C ***\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\r\n    {PA_6,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PA_6_ALT0,  I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)},\r\n    {PA_10,      I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PA_10_ALT0, I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PA_12,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PB_4,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PB_4_ALT0,  I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C3)},\r\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PB_14,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PC_1,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C3)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\r\n    {PA_7,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PA_7_ALT0,  I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF9_I2C3)},\r\n    {PA_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PA_9_ALT0,  I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PA_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PB_3,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF8_I2C2)},\r\n    {PB_3_ALT0,  I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C3)},\r\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C1)},\r\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PB_13,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C2)},\r\n    {PC_0,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C3)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** PWM ***\r\n\r\n// TIM2 cannot be used because already used by the us_ticker\r\n// (update us_ticker_data.h file if another timer is chosen)\r\nMBED_WEAK const PinMap PinMap_PWM[] = {\r\n//  {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1\r\n//  {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 2, 0)}, // TIM2_CH2\r\n    {PA_1,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 1, 1)}, // TIM15_CH1N\r\n//  {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 3, 0)}, // TIM2_CH3 // Connected to STDIO_UART_TX\r\n//  {PA_2,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 1, 0)}, // TIM15_CH1 // Connected to STDIO_UART_TX\r\n//  {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 4, 0)}, // TIM2_CH4 // Connected to STDIO_UART_RX\r\n//  {PA_3,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 2, 0)}, // TIM15_CH2 // Connected to STDIO_UART_RX\r\n    {PA_4,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM14, 1, 0)}, // TIM14_CH1\r\n//  {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1 // Connected to LED_GREEN\r\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 1, 0)}, // TIM3_CH1\r\n    {PA_6_ALT0,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM16, 1, 0)}, // TIM16_CH1\r\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 1, 1)}, // TIM1_CH1N\r\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 2, 0)}, // TIM3_CH2\r\n    {PA_7_ALT1,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM14, 1, 0)}, // TIM14_CH1\r\n    {PA_7_ALT2,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM17, 1, 0)}, // TIM17_CH1\r\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 1, 0)}, // TIM1_CH1\r\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 2, 0)}, // TIM1_CH2\r\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 3, 0)}, // TIM1_CH3\r\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 4, 0)}, // TIM1_CH4\r\n//  {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1\r\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 2, 1)}, // TIM1_CH2N\r\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 3, 0)}, // TIM3_CH3\r\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 3, 1)}, // TIM1_CH3N\r\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 4, 0)}, // TIM3_CH4\r\n    {PB_1_ALT1,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_TIM14, 1, 0)}, // TIM14_CH1\r\n    {PB_3,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\r\n//  {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 2, 0)}, // TIM2_CH2\r\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 1, 0)}, // TIM3_CH1\r\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 2, 0)}, // TIM3_CH2\r\n    {PB_6,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\r\n    {PB_6_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM4, 1, 0)}, // TIM4_CH1\r\n    {PB_6_ALT1,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM16, 1, 1)}, // TIM16_CH1N\r\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM4, 2, 0)}, // TIM4_CH2\r\n    {PB_7_ALT0,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM17, 1, 1)}, // TIM17_CH1N\r\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM4, 3, 0)}, // TIM4_CH3\r\n    {PB_8_ALT0,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM16, 1, 0)}, // TIM16_CH1\r\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM4, 4, 0)}, // TIM4_CH4\r\n    {PB_9_ALT0,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM17, 1, 0)}, // TIM17_CH1\r\n//  {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 3, 0)}, // TIM2_CH3\r\n//  {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 4, 0)}, // TIM2_CH4\r\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 1, 1)}, // TIM1_CH1N\r\n    {PB_13_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 1, 1)}, // TIM15_CH1N\r\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 2, 1)}, // TIM1_CH2N\r\n    {PB_14_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 1, 0)}, // TIM15_CH1\r\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 3, 1)}, // TIM1_CH3N\r\n    {PB_15_ALT0, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N\r\n    {PB_15_ALT1, PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_TIM15, 2, 0)}, // TIM15_CH2\r\n    {PC_1,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM15, 1, 0)}, // TIM15_CH1\r\n    {PC_2,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM15, 2, 0)}, // TIM15_CH2\r\n//  {PC_4,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 1, 0)}, // TIM2_CH1\r\n//  {PC_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 2, 0)}, // TIM2_CH2\r\n//  {PC_6,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 3, 0)}, // TIM2_CH3\r\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 1, 0)}, // TIM3_CH1\r\n//  {PC_7,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM2, 4, 0)}, // TIM2_CH4\r\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 2, 0)}, // TIM3_CH2\r\n    {PC_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 1, 0)}, // TIM1_CH1\r\n    {PC_8_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 3, 0)}, // TIM3_CH3\r\n    {PC_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 2, 0)}, // TIM1_CH2\r\n    {PC_9_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM3, 4, 0)}, // TIM3_CH4\r\n    {PC_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 3, 0)}, // TIM1_CH3\r\n    {PC_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 4, 0)}, // TIM1_CH4\r\n    {PC_12,      PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM14, 1, 0)}, // TIM14_CH1\r\n    {PD_0,       PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM16, 1, 0)}, // TIM16_CH1\r\n    {PD_1,       PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM17, 1, 0)}, // TIM17_CH1\r\n    {PD_2,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 1, 1)}, // TIM1_CH1N\r\n    {PD_3,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 2, 1)}, // TIM1_CH2N\r\n    {PD_4,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM1, 3, 1)}, // TIM1_CH3N\r\n    {PF_0,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM14, 1, 0)}, // TIM14_CH1\r\n    {PF_1,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM15, 1, 1)}, // TIM15_CH1N\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SERIAL ***\r\n\r\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\r\n    {PA_0,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {PA_2,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, // Connected to STDIO_UART_TX\r\n    {PA_2_ALT0,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_LPUART1)}, // Connected to STDIO_UART_TX\r\n    {PA_4,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART6)},\r\n    {PA_5,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)}, // Connected to LED_GREEN\r\n    {PA_9,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PA_14,      UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, // Connected to TCK\r\n    {PA_14_ALT0, LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)}, // Connected to TCK\r\n    {PB_0,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART5)},\r\n    {PB_2,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_3,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PB_6,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)},\r\n    {PB_6_ALT0,  LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)},\r\n    {PB_8,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_8_ALT0,  UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {PB_10,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_11,      LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PC_0,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART6)},\r\n    {PC_0_ALT0,  LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PC_1,       LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PC_4,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PC_4_ALT0,  UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PC_6,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PC_10,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PC_10_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART4)},\r\n    {PC_12,      UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PD_3,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PD_5,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART2)},\r\n    {PD_8,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PE_8,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {PF_2,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART2)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\r\n    {PA_1,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {PA_3,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)}, // Connected to STDIO_UART_RX\r\n    {PA_3_ALT0,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_LPUART1)}, // Connected to STDIO_UART_RX\r\n    {PA_5,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART6)}, // Connected to LED_GREEN\r\n    {PA_10,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PA_13,      LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)}, // Connected to TMS\r\n    {PA_15,      UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},\r\n    {PB_0,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_1,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART5)},\r\n    {PB_4,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PB_7,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART1)},\r\n    {PB_7_ALT0,  LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)},\r\n    {PB_9,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_9_ALT0,  UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {PB_10,      LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PB_11,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PC_0,       LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PC_1,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART6)},\r\n    {PC_1_ALT0,  LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PC_5,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PC_5_ALT0,  UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PC_7,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PC_11,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PC_11_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART4)},\r\n    {PD_2,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PD_6,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART2)},\r\n    {PD_9,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PE_9,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\r\n    {PA_1,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},\r\n    {PA_7,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART6)},\r\n    {PA_12,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PA_15,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF5_USART3)},\r\n    {PA_15_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {PB_1,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_1_ALT0,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_LPUART1)},\r\n    {PB_1_ALT1,  LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)},\r\n    {PB_3,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)},\r\n    {PB_5,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART5)},\r\n    {PB_12,      LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PB_14,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_14_ALT0, UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {PC_9,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PD_2,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART3)},\r\n    {PD_4,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART2)},\r\n    {PD_4_ALT0,  UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {PF_2,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\r\n    {PA_0,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART2)},\r\n    {PA_6,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PA_6_ALT0,  UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART6)},\r\n    {PA_6_ALT1,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_LPUART1)},\r\n    {PA_11,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_USART1)},\r\n    {PB_0,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_LPUART2)},\r\n    {PB_4,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)},\r\n    {PB_6,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART5)},\r\n    {PB_7,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART4)},\r\n    {PB_13,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART3)},\r\n    {PB_13_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_LPUART1)},\r\n    {PB_15,      UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {PC_8,       LPUART_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART2)},\r\n    {PD_3,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF0_USART2)},\r\n    {PD_5,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_USART5)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SPI ***\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\r\n//  {PA_2,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)}, // Connected to STDIO_UART_TX\r\n    {PA_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PA_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PA_12,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_SPI3)},\r\n    {PB_7,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PB_11,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_SPI3)},\r\n    {PD_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PD_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\r\n//  {PA_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)}, // Connected to STDIO_UART_RX\r\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PA_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_SPI2)},\r\n    {PA_11,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_SPI3)},\r\n    {PB_6,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_SPI2)},\r\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_SPI3)},\r\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PD_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\r\n    {PA_0,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PA_1,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)}, // Connected to LED_GREEN\r\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_SPI3)},\r\n    {PB_8,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\r\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_SPI3)},\r\n    {PD_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PD_8,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\r\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_SPI3)},\r\n    {PA_8,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_SPI3)},\r\n    {PB_0,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI1)},\r\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\r\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF0_SPI2)},\r\n    {PD_0,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI2)},\r\n    {PD_9,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_SPI1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** CAN ***\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\r\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PB_0,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PC_2,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PC_4,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\r\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PB_1,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PC_3,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN2)},\r\n    {PC_5,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_FDCAN1)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** USBDEVICE ***\r\n\r\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\r\n//  {PA_4,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_USB)}, // USB_NOE\r\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_DM\r\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_DP\r\n//  {PA_13,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_USB)}, // USB_NOE // Connected to TMS\r\n//  {PA_15,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_USB)}, // USB_NOE\r\n//  {PC_9,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_USB)}, // USB_NOE\r\n    {NC, NC, 0}\r\n};\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MANTA8/PinNames.h",
    "content": "/* mbed Microcontroller Library\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ******************************************************************************\r\n *\r\n * Copyright (c) 2016-2022 STMicroelectronics.\r\n * All rights reserved.\r\n *\r\n * This software component is licensed by ST under BSD 3-Clause license,\r\n * the \"License\"; You may not use this file except in compliance with the\r\n * License. You may obtain a copy of the License at:\r\n *                        opensource.org/licenses/BSD-3-Clause\r\n *\r\n ******************************************************************************\r\n *\r\n * Automatically generated from STM32CubeMX/db/mcu/STM32G0B1R(B-C-E)Tx.xml\r\n */\r\n\r\n/* MBED TARGET LIST: NUCLEO_G0B1RE */\r\n\r\n#ifndef MBED_PINNAMES_H\r\n#define MBED_PINNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n#include \"PinNamesTypes.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ALT0  = 0x100,\r\n    ALT1  = 0x200,\r\n    ALT2  = 0x300,\r\n} ALTx;\r\n\r\ntypedef enum {\r\n    PA_0       = 0x00,\r\n    PA_1       = 0x01,\r\n    PA_2       = 0x02,\r\n    PA_2_ALT0  = PA_2  | ALT0, // same pin used for alternate HW\r\n    PA_3       = 0x03,\r\n    PA_3_ALT0  = PA_3  | ALT0, // same pin used for alternate HW\r\n    PA_4       = 0x04,\r\n    PA_4_ALT0  = PA_4  | ALT0, // same pin used for alternate HW\r\n    PA_5       = 0x05,\r\n    PA_6       = 0x06,\r\n    PA_6_ALT0  = PA_6  | ALT0, // same pin used for alternate HW\r\n    PA_6_ALT1  = PA_6  | ALT1, // same pin used for alternate HW\r\n    PA_7       = 0x07,\r\n    PA_7_ALT0  = PA_7  | ALT0, // same pin used for alternate HW\r\n    PA_7_ALT1  = PA_7  | ALT1, // same pin used for alternate HW\r\n    PA_7_ALT2  = PA_7  | ALT2, // same pin used for alternate HW\r\n    PA_8       = 0x08,\r\n    PA_9       = 0x09,\r\n    PA_9_ALT0  = PA_9  | ALT0, // same pin used for alternate HW\r\n    PA_10      = 0x0A,\r\n    PA_10_ALT0 = PA_10 | ALT0, // same pin used for alternate HW\r\n    PA_11      = 0x0B,\r\n    PA_12      = 0x0C,\r\n    PA_13      = 0x0D,\r\n    PA_14      = 0x0E,\r\n    PA_14_ALT0 = PA_14 | ALT0, // same pin used for alternate HW\r\n    PA_15      = 0x0F,\r\n    PA_15_ALT0 = PA_15 | ALT0, // same pin used for alternate HW\r\n    PB_0       = 0x10,\r\n    PB_0_ALT0  = PB_0  | ALT0, // same pin used for alternate HW\r\n    PB_1       = 0x11,\r\n    PB_1_ALT0  = PB_1  | ALT0, // same pin used for alternate HW\r\n    PB_1_ALT1  = PB_1  | ALT1, // same pin used for alternate HW\r\n    PB_2       = 0x12,\r\n    PB_3       = 0x13,\r\n    PB_3_ALT0  = PB_3  | ALT0, // same pin used for alternate HW\r\n    PB_4       = 0x14,\r\n    PB_4_ALT0  = PB_4  | ALT0, // same pin used for alternate HW\r\n    PB_5       = 0x15,\r\n    PB_5_ALT0  = PB_5  | ALT0, // same pin used for alternate HW\r\n    PB_6       = 0x16,\r\n    PB_6_ALT0  = PB_6  | ALT0, // same pin used for alternate HW\r\n    PB_6_ALT1  = PB_6  | ALT1, // same pin used for alternate HW\r\n    PB_7       = 0x17,\r\n    PB_7_ALT0  = PB_7  | ALT0, // same pin used for alternate HW\r\n    PB_8       = 0x18,\r\n    PB_8_ALT0  = PB_8  | ALT0, // same pin used for alternate HW\r\n    PB_9       = 0x19,\r\n    PB_9_ALT0  = PB_9  | ALT0, // same pin used for alternate HW\r\n    PB_10      = 0x1A,\r\n    PB_11      = 0x1B,\r\n    PB_12      = 0x1C,\r\n    PB_13      = 0x1D,\r\n    PB_13_ALT0 = PB_13 | ALT0, // same pin used for alternate HW\r\n    PB_14      = 0x1E,\r\n    PB_14_ALT0 = PB_14 | ALT0, // same pin used for alternate HW\r\n    PB_15      = 0x1F,\r\n    PB_15_ALT0 = PB_15 | ALT0, // same pin used for alternate HW\r\n    PB_15_ALT1 = PB_15 | ALT1, // same pin used for alternate HW\r\n    PC_0       = 0x20,\r\n    PC_0_ALT0  = PC_0  | ALT0, // same pin used for alternate HW\r\n    PC_1       = 0x21,\r\n    PC_1_ALT0  = PC_1  | ALT0, // same pin used for alternate HW\r\n    PC_2       = 0x22,\r\n    PC_3       = 0x23,\r\n    PC_4       = 0x24,\r\n    PC_4_ALT0  = PC_4  | ALT0, // same pin used for alternate HW\r\n    PC_5       = 0x25,\r\n    PC_5_ALT0  = PC_5  | ALT0, // same pin used for alternate HW\r\n    PC_6       = 0x26,\r\n    PC_7       = 0x27,\r\n    PC_8       = 0x28,\r\n    PC_8_ALT0  = PC_8  | ALT0, // same pin used for alternate HW\r\n    PC_9       = 0x29,\r\n    PC_9_ALT0  = PC_9  | ALT0, // same pin used for alternate HW\r\n    PC_10      = 0x2A,\r\n    PC_10_ALT0 = PC_10 | ALT0, // same pin used for alternate HW\r\n    PC_11      = 0x2B,\r\n    PC_11_ALT0 = PC_11 | ALT0, // same pin used for alternate HW\r\n    PC_12      = 0x2C,\r\n    PC_13      = 0x2D,\r\n    PC_14      = 0x2E,\r\n    PC_15      = 0x2F,\r\n    PD_0       = 0x30,\r\n    PD_1       = 0x31,\r\n    PD_2       = 0x32,\r\n    PD_3       = 0x33,\r\n    PD_4       = 0x34,\r\n    PD_4_ALT0  = PD_4  | ALT0, // same pin used for alternate HW\r\n    PD_5       = 0x35,\r\n    PD_6       = 0x36,\r\n    PD_8       = 0x38,\r\n    PD_9       = 0x39,\r\n    PD_10 = 0x3A,\r\n    PD_11 = 0x3B,\r\n    PD_12 = 0x3C,\r\n    PD_13 = 0x3D,\r\n    PD_14 = 0x3E,\r\n    PD_15 = 0x3F,\r\n\r\n    PE_0  = 0x40,\r\n    PE_1  = 0x41,\r\n    PE_2  = 0x42,\r\n    PE_3  = 0x43,\r\n    PE_4  = 0x44,\r\n    PE_5  = 0x45,\r\n    PE_6  = 0x46,\r\n    PE_7  = 0x47,\r\n    PE_8  = 0x48,\r\n    PE_9  = 0x49,\r\n    PE_10 = 0x4A,\r\n    PE_11 = 0x4B,\r\n    PE_12 = 0x4C,\r\n    PE_13 = 0x4D,\r\n    PE_14 = 0x4E,\r\n    PE_15 = 0x4F,\r\n\r\n    PF_0  = 0x50,\r\n    PF_1  = 0x51,\r\n    PF_2  = 0x52,\r\n    PF_3  = 0x53,\r\n    PF_4  = 0x54,\r\n    PF_5  = 0x55,\r\n    PF_6  = 0x56,\r\n    PF_7  = 0x57,\r\n    PF_8  = 0x58,\r\n    PF_9  = 0x59,\r\n    PF_10 = 0x5A,\r\n    PF_11 = 0x5B,\r\n    PF_12 = 0x5C,\r\n    PF_13 = 0x5D,\r\n    PF_14 = 0x5E,\r\n    PF_15 = 0x5F,\r\n  \r\n\r\n    /**** ADC internal channels ****/\r\n\r\n    ADC_TEMP = 0xF0, // Internal pin virtual value\r\n    ADC_VREF = 0xF1, // Internal pin virtual value\r\n    ADC_VBAT = 0xF2, // Internal pin virtual value\r\n\r\n\r\n    // STDIO for console print\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\r\n    CONSOLE_TX = MBED_CONF_TARGET_STDIO_UART_TX,\r\n#else\r\n    CONSOLE_TX = PE_8,\r\n#endif\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\r\n    CONSOLE_RX = MBED_CONF_TARGET_STDIO_UART_RX,\r\n#else\r\n    CONSOLE_RX = PE_9,\r\n#endif\r\n\r\n    /**** USB pins ****/\r\n    USB_DM = PA_11,\r\n    USB_DP = PA_12,\r\n    USB_NOE = PA_4,\r\n    USB_NOE_ALT0 = PA_13,\r\n    USB_NOE_ALT1 = PA_15,\r\n    USB_NOE_ALT2 = PC_9,\r\n\r\n    /**** OSCILLATOR pins ****/\r\n    RCC_OSC32_EN = PC_15,\r\n    RCC_OSC32_IN = PC_14,\r\n    RCC_OSC32_OUT = PC_15,\r\n    RCC_OSC_EN = PC_15,\r\n    RCC_OSC_EN_ALT0 = PF_1,\r\n    RCC_OSC_IN = PF_0,\r\n    RCC_OSC_OUT = PF_1,\r\n\r\n    /**** DEBUG pins ****/\r\n    SYS_PVD_IN = PB_7,\r\n    SYS_SWCLK = PA_14,\r\n    SYS_SWDIO = PA_13,\r\n    SYS_WKUP1 = PA_0,\r\n    SYS_WKUP2 = PC_13,\r\n    SYS_WKUP4 = PA_2,\r\n    SYS_WKUP5 = PC_5,\r\n    SYS_WKUP6 = PB_5,\r\n\r\n    // Not connected\r\n    NC = (int)0xFFFFFFFF\r\n} PinName;\r\n\r\n// Standardized LED and button names\r\n#define LED1     PA_5   // LED_GREEN\r\n#define BUTTON1  PC_13\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MANTA8/system_clock.c",
    "content": "/* mbed Microcontroller Library\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ******************************************************************************\r\n *\r\n * Copyright (c) 2019-2021 STMicroelectronics.\r\n * All rights reserved.\r\n *\r\n * This software component is licensed by ST under BSD 3-Clause license,\r\n * the \"License\"; You may not use this file except in compliance with the\r\n * License. You may obtain a copy of the License at:\r\n *                        opensource.org/licenses/BSD-3-Clause\r\n *\r\n ******************************************************************************\r\n */\r\n\r\n/**\r\n  * This file configures the system clock depending on config from targets.json:\r\n  *-----------------------------------------------------------------------------\r\n  * System clock source | 1- USE_PLL_HSE_EXTC (external clock)\r\n  *                     | 2- USE_PLL_HSE_XTAL (external xtal)\r\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\r\n  *-----------------------------------------------------------------\r\n  * SYSCLK(MHz)         | 64\r\n  * AHBCLK (MHz)        | 64\r\n  * APB1CLK (MHz)       | 64\r\n  * USB capable         | NO\r\n  *-----------------------------------------------------------------\r\n  */\r\n\r\n#include \"stm32g0xx.h\"\r\n#include \"mbed_error.h\"\r\n\r\n#define VECT_TAB_OFFSET  0x2000 /*!< Vector Table base offset field.\r\n                                   This value must be a multiple of 0x200. */\r\n\r\n// clock source is selected with CLOCK_SOURCE in json config\r\n#define USE_PLL_HSE_EXTC 0x8 // Use external clock (OSC_IN)\r\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\r\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\nuint8_t SetSysClock_PLL_HSI(void);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\r\n/**\r\n  * @brief  Setup the microcontroller system\r\n  *         Initialize the FPU setting, vector table location and External memory\r\n  *         configuration.\r\n  * @param  None\r\n  * @retval None\r\n  */\r\nvoid SystemInit(void)\r\n{\r\n    /* Reset the RCC clock configuration to the default reset state ------------*/\r\n    /* Set HSION bit */\r\n    RCC->CR |= (uint32_t)0x00000001;\r\n\r\n    /* Reset CFGR register */\r\n    RCC->CFGR = 0x00000000;\r\n\r\n    /* Reset HSEON, CSSON and PLLON bits */\r\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\r\n\r\n    /* Reset PLLCFGR register */\r\n    RCC->PLLCFGR = 0x24003010;\r\n\r\n    /* Reset HSEBYP bit */\r\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\r\n\r\n    /* Disable all interrupts */\r\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\r\n    SystemInit_ExtMemCtl();\r\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\r\n\r\n    /* Configure the Vector Table location add offset address ------------------*/\r\n#ifdef VECT_TAB_SRAM\r\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\r\n#else\r\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\r\n#endif\r\n\r\n}\r\n/**\r\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\r\n  *               AHB/APBx prescalers and Flash settings\r\n  * @note   This function is called in mbed_sdk_init() function (targets/TARGET_STM/mbed_overrides.c)\r\n  *         and after each deepsleep period in hal_deepsleep() (targets/TARGET_STM/sleep.c)\r\n  * @param  None\r\n  * @retval None\r\n  */\r\nvoid SetSysClock(void)\r\n{\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\r\n    /* 1- Try to start with HSE and external clock */\r\n    if (SetSysClock_PLL_HSE(1) == 0)\r\n#endif\r\n    {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\r\n        /* 2- If fail try to start with HSE and external xtal */\r\n        if (SetSysClock_PLL_HSE(0) == 0)\r\n#endif\r\n        {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\n            /* 3- If fail start with HSI clock */\r\n            if (SetSysClock_PLL_HSI() == 0)\r\n#endif\r\n            {\r\n                {\r\n                    error(\"SetSysClock failed 8 \\n\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\n/******************************************************************************/\r\n/*            PLL (clocked by HSE) used as System clock source                */\r\n/******************************************************************************/\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\r\n{\r\n    RCC_OscInitTypeDef RCC_OscInitStruct = {0};\r\n    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\r\n\r\n    /** Configure the main internal regulator output voltage\r\n    */\r\n    __HAL_RCC_PWR_CLK_ENABLE();\r\n    HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\r\n    /** Initializes the CPU, AHB and APB busses clocks\r\n    */\r\n    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\r\n    RCC_OscInitStruct.HSEState = RCC_HSE_ON;\r\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\r\n    RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;\r\n    RCC_OscInitStruct.PLL.PLLN = 8;\r\n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\r\n    RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\r\n    RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\r\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n    /** Initializes the CPU, AHB and APB busses clocks\r\n    */\r\n    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\r\n                                  | RCC_CLOCKTYPE_PCLK1;\r\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\r\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\r\n\r\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    return 1; // OK\r\n}\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MONSTER8/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_0 = 0,\n    DAC_1\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE,\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MONSTER8/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to VBUS_FS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to OTG_FS_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to LD4 [Green Led]\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD3 [Orange Led]\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to LD5 [Red Led]\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to LD6 [Blue Led]\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to VBUS_FS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to OTG_FS_OverCurrent\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DP\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to Audio_RST [CS43L22_RESET]\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD4 [Green Led]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DM\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SWO\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SWO\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to VBUS_FS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to I2S3_WS [CS43L22_LRCK]\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to OTG_FS_PowerSwitchOn\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT // Connected to PDM_OUT [MP45DT02_DOUT]\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MONSTER8/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0,\n    PC_11 = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n    PH_3  = 0x73,\n    PH_4  = 0x74,\n    PH_5  = 0x75,\n    PH_6  = 0x76,\n    PH_7  = 0x77,\n    PH_8  = 0x78,\n    PH_9  = 0x79,\n    PH_10 = 0x7A,\n    PH_11 = 0x7B,\n    PH_12 = 0x7C,\n    PH_13 = 0x7D,\n    PH_14 = 0x7E,\n    PH_15 = 0x7F,\n\n    PI_0  = 0x80,\n    PI_1  = 0x81,\n    PI_2  = 0x82,\n    PI_3  = 0x83,\n    PI_4  = 0x84,\n    PI_5  = 0x85,\n    PI_6  = 0x86,\n    PI_7  = 0x87,\n    PI_8  = 0x88,\n    PI_9  = 0x89,\n    PI_10 = 0x8A,\n    PI_11 = 0x8B,\n    PI_12 = 0x8C,\n    PI_13 = 0x8D,\n    PI_14 = 0x8E,\n    PI_15 = 0x8F,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PD_13, // LD3 as LD1 is not a user LED\n    LED2        = PD_12, // LD4 as LD2 is not a user LED\n    LED3        = PD_13, // orange\n    LED4        = PD_12, // green\n    LED5        = PD_14, // red\n    LED6        = PD_15, // blue\n    LED_RED     = LED5,\n    USER_BUTTON = PA_0,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, /* USART2 */\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX, /* USART2 */\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8, /* I2C1 */\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD1 = PB_13,\n    ETH_TXD2 = PC_2,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3,\n    ETH_TX_EN = PB_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED3 = PE_6,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_MONSTER8/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 168\n  * AHBCLK (MHz)        | 168\n  * APB1CLK (MHz)       | 42\n  * APB2CLK (MHz)       | 84\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n//#define VECT_TAB_OFFSET  0xc000\n#define VECT_TAB_OFFSET  0x0000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO2 pin(PC9) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); // 84 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM            = 8;             // VCO input clock = 1 MHz (8 MHz / 8)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> OK for USB\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;   // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;   // 84 MHz (SPI1 clock...)\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    /*\n    if (bypass == 0)\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz\n    else\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n    */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_429/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2015, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n#ifndef MBED_PERIPHERALNAMES_H\r\n#define MBED_PERIPHERALNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ADC_1 = (int)ADC1_BASE,\r\n    ADC_2 = (int)ADC2_BASE,\r\n    ADC_3 = (int)ADC3_BASE\r\n} ADCName;\r\n\r\ntypedef enum {\r\n    DAC_1 = (int)DAC_BASE\r\n} DACName;\r\n\r\ntypedef enum {\r\n    UART_1 = (int)USART1_BASE,\r\n    UART_2 = (int)USART2_BASE,\r\n    UART_3 = (int)USART3_BASE,\r\n    UART_4 = (int)UART4_BASE,\r\n    UART_5 = (int)UART5_BASE,\r\n    UART_6 = (int)USART6_BASE,\r\n    UART_7 = (int)UART7_BASE,\r\n    UART_8 = (int)UART8_BASE\r\n} UARTName;\r\n\r\n#define DEVICE_SPI_COUNT 6\r\ntypedef enum {\r\n    SPI_1 = (int)SPI1_BASE,\r\n    SPI_2 = (int)SPI2_BASE,\r\n    SPI_3 = (int)SPI3_BASE,\r\n    SPI_4 = (int)SPI4_BASE,\r\n    SPI_5 = (int)SPI5_BASE,\r\n    SPI_6 = (int)SPI6_BASE\r\n} SPIName;\r\n\r\ntypedef enum {\r\n    I2C_1 = (int)I2C1_BASE,\r\n    I2C_2 = (int)I2C2_BASE,\r\n    I2C_3 = (int)I2C3_BASE\r\n} I2CName;\r\n\r\ntypedef enum {\r\n    PWM_1  = (int)TIM1_BASE,\r\n    PWM_2  = (int)TIM2_BASE,\r\n    PWM_3  = (int)TIM3_BASE,\r\n    PWM_4  = (int)TIM4_BASE,\r\n    PWM_5  = (int)TIM5_BASE,\r\n    PWM_8  = (int)TIM8_BASE,\r\n    PWM_9  = (int)TIM9_BASE,\r\n    PWM_10 = (int)TIM10_BASE,\r\n    PWM_11 = (int)TIM11_BASE,\r\n    PWM_12 = (int)TIM12_BASE,\r\n    PWM_13 = (int)TIM13_BASE,\r\n    PWM_14 = (int)TIM14_BASE\r\n} PWMName;\r\n\r\ntypedef enum {\r\n    CAN_1 = (int)CAN1_BASE,\r\n    CAN_2 = (int)CAN2_BASE\r\n} CANName;\r\n\r\ntypedef enum {\r\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\r\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\r\n} USBName;\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_429/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2018, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n\r\n#include \"PeripheralPins.h\"\r\n#include \"mbed_toolchain.h\"\r\n\r\n//==============================================================================\r\n// Notes\r\n//\r\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\r\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\r\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\r\n//   pinout image on mbed.org.\r\n//\r\n// - The pins which are connected to other components present on the board have\r\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\r\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\r\n//   Please read the board reference manual and schematic for more information.\r\n//\r\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\r\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\r\n//\r\n//==============================================================================\r\n\r\n\r\n//*** ADC ***\r\n\r\nMBED_WEAK const PinMap PinMap_ADC[] = {\r\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\r\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to B5\r\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3 // Connected to B5\r\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3 // Connected to B5\r\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to VSYNC\r\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to VSYNC\r\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5\r\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5\r\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to G2\r\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to G2\r\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to ACP_RST\r\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to ACP_RST\r\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to R3\r\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to R3\r\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9 // Connected to R6\r\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9 // Connected to R6\r\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to SDNWE\r\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to SDNWE\r\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to SDNWE\r\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11 // Connected to NCS_MEMS_SPI [L3GD20_CS_I2C/SPI]\r\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12 // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\r\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13\r\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13\r\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14 // Connected to OTG_FS_PSO [OTG_FS_PowerSwitchOn]\r\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14 // Connected to OTG_FS_PSO [OTG_FS_PowerSwitchOn]\r\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15 // Connected to OTG_FS_OC [OTG_FS_OverCurrent]\r\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15 // Connected to OTG_FS_OC [OTG_FS_OverCurrent]\r\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9 // Connected to A3\r\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14 // Connected to A4\r\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15 // Connected to A5\r\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4\r\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5 // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6 // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7 // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8 // Connected to ENABLE [LCD-RGB_ENABLE]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\r\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\r\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\r\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** DAC ***\r\n\r\nMBED_WEAK const PinMap PinMap_DAC[] = {\r\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to VSYNC\r\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** I2C ***\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\r\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\r\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to B7\r\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to G5\r\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to A0\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\r\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to I2C3_SCL [ACP/RF_SCL]\r\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to B6\r\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to G4\r\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to A1\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** PWM ***\r\n\r\n// TIM5 cannot be used because already used by the us_ticker\r\nMBED_WEAK const PinMap PinMap_PWM[] = {\r\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\r\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\r\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1 // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to B5\r\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4 // Connected to B5\r\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2 // Connected to B5\r\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\r\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\r\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to G2\r\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to G2\r\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ACP_RST\r\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to ACP_RST\r\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ACP_RST\r\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to ACP_RST\r\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to I2C3_SCL [ACP/RF_SCL]\r\n//  {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to STDIO_UART_TX\r\n//  {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to STDIO_UART_RX\r\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to R4\r\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to TP_INT1 [Touch Panel]\r\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to R3\r\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to R3\r\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to R3\r\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to R6\r\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to R6\r\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to R6\r\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\r\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\r\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SDCKE1\r\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\r\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to B6\r\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1 // Connected to B6\r\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to B7\r\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to B7\r\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to G4\r\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4 // Connected to G5\r\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to VBUS_HS\r\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to OTG_HS_DM\r\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to OTG_HS_DM\r\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 // Connected to OTG_HS_DM\r\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to OTG_HS_DP\r\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N // Connected to OTG_HS_DP\r\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2 // Connected to OTG_HS_DP\r\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to HSYNC\r\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1 // Connected to HSYNC\r\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to G6\r\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to G6\r\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\r\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\r\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4 // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4 // Connected to I2C3_SDA [ACP/RF_SDA]\r\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to RDX [LDC-RGB_RDX]\r\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to WRX_DCX [LCD-RGB_WRX_DCX]\r\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to D0\r\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to D1\r\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\r\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\r\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to D5\r\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to D6\r\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to D7\r\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to D8\r\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N // Connected to D9\r\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to D10\r\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to D11\r\n    {PF_6,       PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\r\n    {PF_7,       PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SERIAL ***\r\n\r\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\r\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\r\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS_INT2 [L3GD20_INT2]\r\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_TX\r\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to G4\r\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to HSYNC\r\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to R2\r\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to R2\r\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\r\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\r\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to D13\r\n    {PE_1,       UART_8,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to NBL1 [SDRAM_UDQM]\r\n    {PE_8,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to D5\r\n    {PF_7,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PG_14,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LD4 [Red Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\r\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B5\r\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to STDIO_UART_RX\r\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\r\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to G5\r\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to G6\r\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\r\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\r\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\r\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B2\r\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to D14\r\n    {PE_0,       UART_8,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to NBL0 [SDRAM_LDQM]\r\n    {PE_7,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)}, // Connected to D4\r\n    {PF_6,       UART_7,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART7)},\r\n    {PG_9,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\r\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to MEMS_INT1 [L3GD20_INT1]\r\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to R5\r\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to OTG_HS_DM\r\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\r\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to RDX [LDC-RGB_RDX]\r\n    {PG_8,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDCLK\r\n    {PG_12,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to B4\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\r\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\r\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to R4\r\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to VBUS_HS\r\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to G7\r\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to TE [LCD-RGB_TE]\r\n    {PG_13,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to LD3 [Green Led]\r\n    {PG_15,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to SDNCAS\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** SPI ***\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\r\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ACP_RST\r\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SDCKE1\r\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SDCKE1\r\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_DP\r\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\r\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to B2\r\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D11\r\n    {PF_9,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_MOSI [L3GD20_SDA/SDI/SDO]\r\n    {PF_11,      SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SDNRAS\r\n    {PG_14,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to LD4 [Red Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\r\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to G2\r\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_DM\r\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D10\r\n    {PF_8,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_MISO [L3GD20_SDO]\r\n    {PG_12,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to B4\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\r\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\r\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\r\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to G4\r\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to VBUS_HS\r\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to R2\r\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to G7\r\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D9\r\n    {PF_7,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)}, // Connected to SPI5_SCK [L3GD20_SCL/SPC]\r\n    {PG_13,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to LD3 [Green Led]\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\r\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to VSYNC\r\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to VSYNC\r\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to TP_INT1 [Touch Panel]\r\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to TP_INT1 [Touch Panel]\r\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to B7\r\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to OTG_HS_ID\r\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\r\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)}, // Connected to D8\r\n    {PF_6,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\r\n    {PG_8,       SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to SDCLK\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** CAN ***\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\r\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to R4\r\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDCKE1\r\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to B6\r\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to OTG_HS_ID\r\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to D2\r\n    {NC, NC, 0}\r\n};\r\n\r\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\r\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to R5\r\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to SDNE1 [SDRAM_CS]\r\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to B7\r\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to VBUS_HS\r\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to D3\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** USBDEVICE ***\r\n\r\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\r\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF // Connected to I2C3_SCL [ACP/RF_SCL]\r\n//  {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to STDIO_UART_TX\r\n//  {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to STDIO_UART_RX\r\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to R4\r\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to R5\r\n    {NC, NC, 0}\r\n};\r\n\r\n//*** USBDEVICE ***\r\n\r\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\r\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\r\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to VSYNC\r\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID // Connected to OTG_HS_ID\r\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS // Connected to VBUS_HS\r\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM // Connected to OTG_HS_DM\r\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP // Connected to OTG_HS_DP\r\n#else /* MBED_CONF_TARGET_USB_SPEED */\r\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0 // Connected to B5\r\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK\r\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1 // Connected to R3\r\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2 // Connected to R6\r\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7 // Connected to SDCKE1\r\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to G4\r\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4 // Connected to G5\r\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5 // Connected to OTG_HS_ID\r\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6 // Connected to VBUS_HS\r\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to SDNWE\r\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR // Connected to CSX [LCD-RGB_CSX]\r\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT\r\n#endif /* MBED_CONF_TARGET_USB_SPEED */\r\n    {NC, NC, 0}\r\n};\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_429/PinNames.h",
    "content": "/* mbed Microcontroller Library\r\n *******************************************************************************\r\n * Copyright (c) 2018, STMicroelectronics\r\n * All rights reserved.\r\n *\r\n * Redistribution and use in source and binary forms, with or without\r\n * modification, are permitted provided that the following conditions are met:\r\n *\r\n * 1. Redistributions of source code must retain the above copyright notice,\r\n *    this list of conditions and the following disclaimer.\r\n * 2. Redistributions in binary form must reproduce the above copyright notice,\r\n *    this list of conditions and the following disclaimer in the documentation\r\n *    and/or other materials provided with the distribution.\r\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\r\n *    may be used to endorse or promote products derived from this software\r\n *    without specific prior written permission.\r\n *\r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\r\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\r\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\r\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\r\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r\n *******************************************************************************\r\n */\r\n\r\n#ifndef MBED_PINNAMES_H\r\n#define MBED_PINNAMES_H\r\n\r\n#include \"cmsis.h\"\r\n#include \"PinNamesTypes.h\"\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\ntypedef enum {\r\n    ALT0  = 0x100,\r\n    ALT1  = 0x200,\r\n    ALT2  = 0x300,\r\n    ALT3  = 0x400\r\n} ALTx;\r\n\r\ntypedef enum {\r\n    PA_0  = 0x00,\r\n    PA_0_ALT0 = PA_0 | ALT0,\r\n    PA_0_ALT1 = PA_0 | ALT1,\r\n    PA_1  = 0x01,\r\n    PA_1_ALT0 = PA_1 | ALT0,\r\n    PA_1_ALT1 = PA_1 | ALT1,\r\n    PA_2  = 0x02,\r\n    PA_2_ALT0 = PA_2 | ALT0,\r\n    PA_2_ALT1 = PA_2 | ALT1,\r\n    PA_3  = 0x03,\r\n    PA_3_ALT0 = PA_3 | ALT0,\r\n    PA_3_ALT1 = PA_3 | ALT1,\r\n    PA_4  = 0x04,\r\n    PA_4_ALT0 = PA_4 | ALT0,\r\n    PA_5  = 0x05,\r\n    PA_5_ALT0 = PA_5 | ALT0,\r\n    PA_5_ALT1 = PA_5 | ALT1,\r\n    PA_6  = 0x06,\r\n    PA_6_ALT0 = PA_6 | ALT0,\r\n    PA_7  = 0x07,\r\n    PA_7_ALT0 = PA_7 | ALT0,\r\n    PA_7_ALT1 = PA_7 | ALT1,\r\n    PA_7_ALT2 = PA_7 | ALT2,\r\n    PA_8  = 0x08,\r\n    PA_9  = 0x09,\r\n    PA_10 = 0x0A,\r\n    PA_11 = 0x0B,\r\n    PA_12 = 0x0C,\r\n    PA_13 = 0x0D,\r\n    PA_14 = 0x0E,\r\n    PA_15 = 0x0F,\r\n    PA_15_ALT0 = PA_15 | ALT0,\r\n\r\n    PB_0  = 0x10,\r\n    PB_0_ALT0 = PB_0 | ALT0,\r\n    PB_0_ALT1 = PB_0 | ALT1,\r\n    PB_1  = 0x11,\r\n    PB_1_ALT0 = PB_1 | ALT0,\r\n    PB_1_ALT1 = PB_1 | ALT1,\r\n    PB_2  = 0x12,\r\n    PB_3  = 0x13,\r\n    PB_3_ALT0 = PB_3 | ALT0,\r\n    PB_4  = 0x14,\r\n    PB_4_ALT0 = PB_4 | ALT0,\r\n    PB_5  = 0x15,\r\n    PB_5_ALT0 = PB_5 | ALT0,\r\n    PB_6  = 0x16,\r\n    PB_7  = 0x17,\r\n    PB_8  = 0x18,\r\n    PB_8_ALT0 = PB_8 | ALT0,\r\n    PB_9  = 0x19,\r\n    PB_9_ALT0 = PB_9 | ALT0,\r\n    PB_10 = 0x1A,\r\n    PB_11 = 0x1B,\r\n    PB_12 = 0x1C,\r\n    PB_13 = 0x1D,\r\n    PB_14 = 0x1E,\r\n    PB_14_ALT0 = PB_14 | ALT0,\r\n    PB_14_ALT1 = PB_14 | ALT1,\r\n    PB_15 = 0x1F,\r\n    PB_15_ALT0 = PB_15 | ALT0,\r\n    PB_15_ALT1 = PB_15 | ALT1,\r\n\r\n    PC_0  = 0x20,\r\n    PC_0_ALT0 = PC_0 | ALT0,\r\n    PC_0_ALT1 = PC_0 | ALT1,\r\n    PC_1  = 0x21,\r\n    PC_1_ALT0 = PC_1 | ALT0,\r\n    PC_1_ALT1 = PC_1 | ALT1,\r\n    PC_2  = 0x22,\r\n    PC_2_ALT0 = PC_2 | ALT0,\r\n    PC_2_ALT1 = PC_2 | ALT1,\r\n    PC_3  = 0x23,\r\n    PC_3_ALT0 = PC_3 | ALT0,\r\n    PC_3_ALT1 = PC_3 | ALT1,\r\n    PC_4  = 0x24,\r\n    PC_4_ALT0 = PC_4 | ALT0,\r\n    PC_5  = 0x25,\r\n    PC_5_ALT0 = PC_5 | ALT0,\r\n    PC_6  = 0x26,\r\n    PC_6_ALT0 = PC_6 | ALT0,\r\n    PC_7  = 0x27,\r\n    PC_7_ALT0 = PC_7 | ALT0,\r\n    PC_8  = 0x28,\r\n    PC_8_ALT0 = PC_8 | ALT0,\r\n    PC_9  = 0x29,\r\n    PC_9_ALT0 = PC_9 | ALT0,\r\n    PC_10 = 0x2A,\r\n    PC_10_ALT0 = PC_10 | ALT0,\r\n    PC_11 = 0x2B,\r\n    PC_11_ALT0 = PC_11 | ALT0,\r\n    PC_12 = 0x2C,\r\n    PC_13 = 0x2D,\r\n    PC_14 = 0x2E,\r\n    PC_15 = 0x2F,\r\n\r\n    PD_0  = 0x30,\r\n    PD_1  = 0x31,\r\n    PD_2  = 0x32,\r\n    PD_3  = 0x33,\r\n    PD_4  = 0x34,\r\n    PD_5  = 0x35,\r\n    PD_6  = 0x36,\r\n    PD_7  = 0x37,\r\n    PD_8  = 0x38,\r\n    PD_9  = 0x39,\r\n    PD_10 = 0x3A,\r\n    PD_11 = 0x3B,\r\n    PD_12 = 0x3C,\r\n    PD_13 = 0x3D,\r\n    PD_14 = 0x3E,\r\n    PD_15 = 0x3F,\r\n\r\n    PE_0  = 0x40,\r\n    PE_1  = 0x41,\r\n    PE_2  = 0x42,\r\n    PE_3  = 0x43,\r\n    PE_4  = 0x44,\r\n    PE_5  = 0x45,\r\n    PE_6  = 0x46,\r\n    PE_7  = 0x47,\r\n    PE_8  = 0x48,\r\n    PE_9  = 0x49,\r\n    PE_10 = 0x4A,\r\n    PE_11 = 0x4B,\r\n    PE_12 = 0x4C,\r\n    PE_13 = 0x4D,\r\n    PE_14 = 0x4E,\r\n    PE_15 = 0x4F,\r\n\r\n    PF_0  = 0x50,\r\n    PF_1  = 0x51,\r\n    PF_2  = 0x52,\r\n    PF_3  = 0x53,\r\n    PF_4  = 0x54,\r\n    PF_5  = 0x55,\r\n    PF_6  = 0x56,\r\n    PF_7  = 0x57,\r\n    PF_8  = 0x58,\r\n    PF_9  = 0x59,\r\n    PF_10 = 0x5A,\r\n    PF_11 = 0x5B,\r\n    PF_12 = 0x5C,\r\n    PF_13 = 0x5D,\r\n    PF_14 = 0x5E,\r\n    PF_15 = 0x5F,\r\n\r\n    PG_0  = 0x60,\r\n    PG_1  = 0x61,\r\n    PG_2  = 0x62,\r\n    PG_3  = 0x63,\r\n    PG_4  = 0x64,\r\n    PG_5  = 0x65,\r\n    PG_6  = 0x66,\r\n    PG_7  = 0x67,\r\n    PG_8  = 0x68,\r\n    PG_9  = 0x69,\r\n    PG_10 = 0x6A,\r\n    PG_11 = 0x6B,\r\n    PG_12 = 0x6C,\r\n    PG_13 = 0x6D,\r\n    PG_14 = 0x6E,\r\n    PG_15 = 0x6F,\r\n\r\n    PH_0  = 0x70,\r\n    PH_1  = 0x71,\r\n\r\n    // ADC internal channels\r\n    ADC_TEMP = 0xF0,\r\n    ADC_VREF = 0xF1,\r\n    ADC_VBAT = 0xF2,\r\n\r\n    // STDIO for console print\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\r\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\r\n#else\r\n    STDIO_UART_TX = PA_9,\r\n#endif\r\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\r\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\r\n#else\r\n    STDIO_UART_RX = PA_10,\r\n#endif\r\n\r\n    // Generic signals namings\r\n    LED1        = PG_13, // Corresponds to LD3 on MB1075B\r\n    LED2        = PG_14, // Corresponds to LD4 on MB1075B\r\n    LED3        = PG_13,\r\n    LED4        = PG_14,\r\n    LED_RED     = LED2,\r\n    USER_BUTTON = PA_0,\r\n    // Standardized button names\r\n    BUTTON1 = USER_BUTTON,\r\n    CONSOLE_TX   = STDIO_UART_TX,\r\n    CONSOLE_RX   = STDIO_UART_RX,\r\n    //USBTX       = STDIO_UART_TX,\r\n    //USBRX       = STDIO_UART_RX,\r\n    SPI_MOSI    = PA_7,\r\n    SPI_MISO    = PA_6,\r\n    SPI_SCK     = PA_5,\r\n    SPI_CS      = PB_6,\r\n\r\n    /**** USB FS pins ****/\r\n    USB_OTG_FS_DM = PA_11,\r\n    USB_OTG_FS_DP = PA_12,\r\n    USB_OTG_FS_ID = PA_10,\r\n    USB_OTG_FS_SOF = PA_8,\r\n    USB_OTG_FS_VBUS = PA_9,\r\n\r\n    /**** USB HS pins ****/\r\n    USB_OTG_HS_DM = PB_14,\r\n    USB_OTG_HS_DP = PB_15,\r\n    USB_OTG_HS_ID = PB_12,\r\n    USB_OTG_HS_SOF = PA_4,\r\n    USB_OTG_HS_ULPI_CK = PA_5,\r\n    USB_OTG_HS_ULPI_D0 = PA_3,\r\n    USB_OTG_HS_ULPI_D1 = PB_0,\r\n    USB_OTG_HS_ULPI_D2 = PB_1,\r\n    USB_OTG_HS_ULPI_D3 = PB_10,\r\n    USB_OTG_HS_ULPI_D4 = PB_11,\r\n    USB_OTG_HS_ULPI_D5 = PB_12,\r\n    USB_OTG_HS_ULPI_D6 = PB_13,\r\n    USB_OTG_HS_ULPI_D7 = PB_5,\r\n    USB_OTG_HS_ULPI_DIR = PC_2,\r\n    USB_OTG_HS_ULPI_NXT = PC_3,\r\n    USB_OTG_HS_ULPI_STP = PC_0,\r\n    USB_OTG_HS_VBUS = PB_13,\r\n\r\n    /**** ETHERNET pins ****/\r\n    ETH_COL = PA_3,\r\n    ETH_CRS = PA_0,\r\n    ETH_CRS_DV = PA_7,\r\n    ETH_MDC = PC_1,\r\n    ETH_MDIO = PA_2,\r\n    ETH_PPS_OUT = PG_8,\r\n    ETH_PPS_OUT_ALT0 = PB_5,\r\n    ETH_REF_CLK = PA_1,\r\n    ETH_RXD0 = PC_4,\r\n    ETH_RXD1 = PC_5,\r\n    ETH_RXD2 = PB_0,\r\n    ETH_RXD3 = PB_1,\r\n    ETH_RX_CLK = PA_1,\r\n    ETH_RX_DV = PA_7,\r\n    ETH_RX_ER = PB_10,\r\n    ETH_TXD0 = PB_12,\r\n    ETH_TXD0_ALT0 = PG_13,\r\n    ETH_TXD1 = PB_13,\r\n    ETH_TXD1_ALT0 = PG_14,\r\n    ETH_TXD2 = PC_2,\r\n    ETH_TXD3 = PE_2,\r\n    ETH_TXD3_ALT0 = PB_8,\r\n    ETH_TX_CLK = PC_3,\r\n    ETH_TX_EN = PB_11,\r\n    ETH_TX_EN_ALT0 = PG_11,\r\n\r\n    /**** OSCILLATOR pins ****/\r\n    RCC_OSC32_IN = PC_14,\r\n    RCC_OSC32_OUT = PC_15,\r\n    RCC_OSC_IN = PH_0,\r\n    RCC_OSC_OUT = PH_1,\r\n\r\n    /**** DEBUG pins ****/\r\n    SYS_JTCK_SWCLK = PA_14,\r\n    SYS_JTDI = PA_15,\r\n    SYS_JTDO_SWO = PB_3,\r\n    SYS_JTMS_SWDIO = PA_13,\r\n    SYS_JTRST = PB_4,\r\n    SYS_TRACECLK = PE_2,\r\n    SYS_TRACED0 = PE_3,\r\n    SYS_TRACED1 = PE_4,\r\n    SYS_TRACED2 = PE_5,\r\n    SYS_TRACED3 = PE_6,\r\n    SYS_WKUP = PA_0,\r\n\r\n    // Not connected\r\n    NC = (int)0xFFFFFFFF\r\n} PinName;\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_429/system_clock.c",
    "content": "/* mbed Microcontroller Library\r\n* Copyright (c) 2006-2017 ARM Limited\r\n*\r\n* Licensed under the Apache License, Version 2.0 (the \"License\");\r\n* you may not use this file except in compliance with the License.\r\n* You may obtain a copy of the License at\r\n*\r\n*     http://www.apache.org/licenses/LICENSE-2.0\r\n*\r\n* Unless required by applicable law or agreed to in writing, software\r\n* distributed under the License is distributed on an \"AS IS\" BASIS,\r\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n* See the License for the specific language governing permissions and\r\n* limitations under the License.\r\n*/\r\n\r\n/**\r\n  * This file configures the system clock as follows:\r\n  *-----------------------------------------------------------------------------------\r\n  * System clock source   | 1- USE_PLL_HSE_EXTC (external 8 MHz clock) |\r\n  *                       | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)  | DEVICE_USBDEVICE=1\r\n  *                       | 3- USE_PLL_HSI (internal 16 MHz clock)     |\r\n  *-----------------------------------------------------------------------------------\r\n  * SYSCLK(MHz)           |                               180          | 168\r\n  * AHBCLK (MHz)          |                               180          | 168\r\n  * APB1CLK (MHz)         |                                45          |  42\r\n  * APB2CLK (MHz)         |                                90          |  84\r\n  * USB capable (48 MHz)  |                                NO          | YES (HSI calibration needed)\r\n  *-----------------------------------------------------------------------------------\r\n**/\r\n\r\n#include \"stm32f4xx.h\"\r\n//#include \"nvic_addr.h\"         original\r\n#include \"mbed_error.h\"\r\n\r\n/*!< COPIED FROM SKR2 Uncomment the following line if you need to relocate your vector Table in\r\n     Internal SRAM. */\r\n/* #define VECT_TAB_SRAM */\r\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\r\n                                   This value must be a multiple of 0x200. */\r\n\r\n\r\n// clock source is selected with CLOCK_SOURCE in json config\r\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\r\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\r\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\r\n\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\nuint8_t SetSysClock_PLL_HSI(void);\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\r\n\r\n\r\n/**\r\n  * @brief  Setup the microcontroller system\r\n  *         Initialize the FPU setting, vector table location and External memory\r\n  *         configuration.\r\n  * @param  None\r\n  * @retval None\r\n  */\r\nvoid SystemInit(void)\r\n{\r\n    /* FPU settings ------------------------------------------------------------*/\r\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\r\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\r\n#endif\r\n    /* Reset the RCC clock configuration to the default reset state ------------*/\r\n    /* Set HSION bit */\r\n    RCC->CR |= (uint32_t)0x00000001;\r\n\r\n    /* Reset CFGR register */\r\n    RCC->CFGR = 0x00000000;\r\n\r\n    /* Reset HSEON, CSSON and PLLON bits */\r\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\r\n\r\n    /* Reset PLLCFGR register */\r\n    RCC->PLLCFGR = 0x24003010;\r\n\r\n    /* Reset HSEBYP bit */\r\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\r\n\r\n    /* Disable all interrupts */\r\n    RCC->CIR = 0x00000000;\r\n\r\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\r\n    SystemInit_ExtMemCtl();\r\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\r\n\r\n    /* Configure the Vector Table location add offset address ------------------*/\r\n#ifdef VECT_TAB_SRAM\r\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\r\n#else\r\n    // original line \r\n   \r\n    //SCB->VTOR = NVIC_FLASH_VECTOR_ADDRESS; /* Vector Table Relocation in Internal FLASH */\r\n    // copied from SKR2\r\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\r\n#endif\r\n\r\n}\r\n\r\n/**\r\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\r\n  *               AHB/APBx prescalers and Flash settings\r\n  * @note   This function should be called only once the RCC clock configuration\r\n  *         is reset to the default reset state (done in SystemInit() function).\r\n  * @param  None\r\n  * @retval None\r\n  */\r\n\r\nvoid SetSysClock(void)\r\n{\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\r\n    /* 1- Try to start with HSE and external clock */\r\n    if (SetSysClock_PLL_HSE(1) == 0)\r\n#endif\r\n    {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\r\n        /* 2- If fail try to start with HSE and external xtal */\r\n        if (SetSysClock_PLL_HSE(0) == 0)\r\n#endif\r\n        {\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\n            /* 3- If fail start with HSI clock */\r\n            if (SetSysClock_PLL_HSI() == 0)\r\n#endif\r\n            {\r\n                {\r\n                    error(\"SetSysClock failed\\n\");\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\r\n/******************************************************************************/\r\n/*            PLL (clocked by HSE) used as System clock source                */\r\n/******************************************************************************/\r\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\r\n{\r\n    RCC_OscInitTypeDef RCC_OscInitStruct;\r\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\r\n\r\n    /* The voltage scaling allows optimizing the power consumption when the device is\r\n       clocked below the maximum system frequency, to update the voltage scaling value\r\n       regarding system frequency refer to product datasheet. */\r\n    __HAL_RCC_PWR_CLK_ENABLE();\r\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\r\n\r\n    // Enable HSE oscillator and activate PLL with HSE as source\r\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\r\n    if (bypass == 0) {\r\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; // External 8 MHz xtal on OSC_IN/OSC_OUT\r\n    } else {\r\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; // External 8 MHz clock on OSC_IN\r\n    }\r\n\r\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\r\n    RCC_OscInitStruct.PLL.PLLM = 8;\r\n#if (DEVICE_USBDEVICE)\r\n    RCC_OscInitStruct.PLL.PLLN = 336;\r\n#else\r\n    RCC_OscInitStruct.PLL.PLLN = 360;\r\n#endif\r\n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 180 MHz or 168 MHz if DEVICE_USBDEVICE defined\r\n    RCC_OscInitStruct.PLL.PLLQ = 7;             //  48 MHz if DEVICE_USBDEVICE defined\r\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Activate the OverDrive to reach the 180 MHz Frequency\r\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers\r\n    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\r\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 or 168 MHz\r\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 or  42 MHz\r\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 or  84 MHz\r\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_3);\r\n\r\n    return 1;\r\n}\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\r\n\r\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\r\n/******************************************************************************/\r\n/*            PLL (clocked by HSI) used as System clock source                */\r\n/******************************************************************************/\r\nuint8_t SetSysClock_PLL_HSI(void)\r\n{\r\n    RCC_OscInitTypeDef RCC_OscInitStruct;\r\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\r\n\r\n    /* The voltage scaling allows optimizing the power consumption when the device is\r\n       clocked below the maximum system frequency, to update the voltage scaling value\r\n       regarding system frequency refer to product datasheet. */\r\n    __HAL_RCC_PWR_CLK_ENABLE();\r\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\r\n\r\n    // Enable HSI oscillator and activate PLL with HSI as source\r\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\r\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\r\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\r\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\r\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\r\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\r\n    RCC_OscInitStruct.PLL.PLLM = 8;\r\n#if (DEVICE_USBDEVICE)\r\n    RCC_OscInitStruct.PLL.PLLN = 168;\r\n#else\r\n    RCC_OscInitStruct.PLL.PLLN = 180;\r\n#endif\r\n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; // 180 MHz or 168 MHz if DEVICE_USBDEVICE defined\r\n    RCC_OscInitStruct.PLL.PLLQ = 7;             //  48 MHz if DEVICE_USBDEVICE defined\r\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // Activate the OverDrive to reach the 180 MHz Frequency\r\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\r\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\r\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\r\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; // 180 or 168 MHz\r\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 or  42 MHz\r\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 or  84 MHz\r\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\r\n        return 0; // FAIL\r\n    }\r\n\r\n    // HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_3);\r\n\r\n    return 1;\r\n}\r\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\r\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_446/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 4\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE,\n    SPI_4 = (int)SPI4_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE,\n    FMPI2C_1 = (int)FMPI2C1_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    QSPI_1 = (int)QSPI_R_BASE,\n} QSPIName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_446/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to LD1\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to LD1\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_3,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PB_4,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to LD2 [Blue]\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_7,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PC_12,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PD_13,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to USB_SOF [TP1]\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_6,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_12,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to USB_SOF [TP1]\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_VBUS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to USB_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD1\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LD1\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD1\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD2 [Blue]\n    {PB_8,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_8_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT1,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_9_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PB_9_ALT1,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 // Connected to LD3 [Red]\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {PF_6,       PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PF_7,       PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_VBUS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n//  {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_10,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_TX\n    {PE_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_14,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to LD2 [Blue]\n//  {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_5,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_11,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_RX\n    {PE_7,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_9,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DP\n    {PA_15,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD3 [Red]\n    {PC_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_8,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_12,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DM\n    {PB_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to LD1\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_9,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_13,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_15,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)}, // Connected to LD1\n    {PB_2,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PC_1_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LD3 [Red]\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_VBUS\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_7,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PD_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** QUADSPI ***\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA0[] = {\n    {PC_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PD_11,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PF_8,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO0\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA1[] = {\n    {PC_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PD_12,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PF_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO1\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA2[] = {\n    {PE_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {PF_7,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA3[] = {\n    {PA_1,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PD_13,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PF_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SCLK[] = {\n    {PB_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {PD_3,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SSEL[] = {\n    {PB_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS\n    {PG_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS // Connected to USB_PowerSwitchOn [STMPS2151STR_EN]\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF // Connected to USB_SOF [TP1]\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to USB_VBUS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to USB_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to USB_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM // Connected to LD3 [Red]\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_446/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // Arduino connector namings\n    A0          = PA_3,\n    A1          = PC_0,\n    A2          = PC_3,\n    A3          = PF_3,\n    A4          = PF_5,\n    A5          = PF_10,\n    D0          = PG_9,\n    D1          = PG_14,\n    D2          = PF_15,\n    D3          = PE_13,\n    D4          = PF_14,\n    D5          = PE_11,\n    D6          = PE_9,\n    D7          = PF_13,\n    D8          = PF_12,\n    D9          = PD_15,\n    D10         = PD_14,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PD_8,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PD_9,\n#endif\n\n    // Generic signals namings\n    LED1        = PB_0,\n    LED2        = PB_7,\n    LED3        = PB_14,\n    LED4        = LED1,\n    LED_RED     = LED3,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, // Virtual Com Port\n    CONSOLE_RX   = STDIO_UART_RX, // Virtual Com Port\n    //USBTX       = STDIO_UART_TX, // Virtual Com Port\n    //USBRX       = STDIO_UART_RX, // Virtual Com Port\n    I2C_SCL     = D15,\n    I2C_SDA     = D14,\n    SPI_MOSI    = D11,\n    SPI_MISO    = D12,\n    SPI_SCK     = D13,\n    SPI_CS      = D10,\n    PWM_OUT     = D9,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_2,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED0_ALT0 = PC_8,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED1_ALT0 = PD_3,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED2_ALT0 = PG_13,\n    SYS_TRACED3 = PE_6,\n    SYS_TRACED3_ALT0 = PG_14,\n    SYS_WKUP0 = PA_0,\n    SYS_WKUP1 = PC_13,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_OCTOPUS_446/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 12 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 12 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 180\n  * AHBCLK (MHz)        | 180\n  * APB1CLK (MHz)       |  45\n  * APB2CLK (MHz)       |  90\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI      0x2 // Use HSI internal clock\n\n//#define DEBUG_MCO        (1) // Output the MCO1/MCO2 on PA8/PC9 for debugging (0=OFF, 1=ON)\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\n\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    // Output clock on MCO2 pin(PC9) for debugging purpose\n#if DEBUG_MCO == 1\n    HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4);\n#endif\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n    /* Enable Power Control clock */\n    __HAL_RCC_PWR_CLK_ENABLE();\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.PLL.PLLState  = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM = 6;             \n    RCC_OscInitStruct.PLL.PLLN = 180;           \n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; \n    RCC_OscInitStruct.PLL.PLLQ = 7;             \n    RCC_OscInitStruct.PLL.PLLR = 2;             \n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Activate the OverDrive to reach the 180 MHz Frequency\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if DEVICE_USBDEVICE\n    // Select PLLSAI output as USB clock source\n    PeriphClkInitStruct.PLLSAI.PLLSAIM = 6;\n    PeriphClkInitStruct.PLLSAI.PLLSAIN = 96;\n    PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4;\n    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n    PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;\n    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 180 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Output clock on MCO1 pin(PA8) for debugging purpose\n#if DEBUG_MCO == 1\n    if (bypass == 0) {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2);    // 4 MHz with xtal\n    } else {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);    // 8 MHz with external clock (MCO)\n    }\n#endif\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_3/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_0 = 0,\n    DAC_1\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE,\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to VBUS_FS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to OTG_FS_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to LD4 [Green Led]\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD3 [Orange Led]\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to LD5 [Red Led]\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to LD6 [Blue Led]\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to VBUS_FS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to OTG_FS_OverCurrent\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DP\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to Audio_RST [CS43L22_RESET]\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD4 [Green Led]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DM\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SWO\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SWO\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to VBUS_FS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to I2S3_WS [CS43L22_LRCK]\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to OTG_FS_PowerSwitchOn\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT // Connected to PDM_OUT [MP45DT02_DOUT]\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0,\n    PC_11 = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n    PH_3  = 0x73,\n    PH_4  = 0x74,\n    PH_5  = 0x75,\n    PH_6  = 0x76,\n    PH_7  = 0x77,\n    PH_8  = 0x78,\n    PH_9  = 0x79,\n    PH_10 = 0x7A,\n    PH_11 = 0x7B,\n    PH_12 = 0x7C,\n    PH_13 = 0x7D,\n    PH_14 = 0x7E,\n    PH_15 = 0x7F,\n\n    PI_0  = 0x80,\n    PI_1  = 0x81,\n    PI_2  = 0x82,\n    PI_3  = 0x83,\n    PI_4  = 0x84,\n    PI_5  = 0x85,\n    PI_6  = 0x86,\n    PI_7  = 0x87,\n    PI_8  = 0x88,\n    PI_9  = 0x89,\n    PI_10 = 0x8A,\n    PI_11 = 0x8B,\n    PI_12 = 0x8C,\n    PI_13 = 0x8D,\n    PI_14 = 0x8E,\n    PI_15 = 0x8F,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PD_13, // LD3 as LD1 is not a user LED\n    LED2        = PD_12, // LD4 as LD2 is not a user LED\n    LED3        = PD_13, // orange\n    LED4        = PD_12, // green\n    LED5        = PD_14, // red\n    LED6        = PD_15, // blue\n    LED_RED     = LED5,\n    USER_BUTTON = PA_0,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, /* USART2 */\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX, /* USART2 */\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8, /* I2C1 */\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PA_4,\n    PWM_OUT     = PB_3,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD1 = PB_13,\n    ETH_TXD2 = PC_2,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3,\n    ETH_TX_EN = PB_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED3 = PE_6,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 168\n  * AHBCLK (MHz)        | 168\n  * APB1CLK (MHz)       | 42\n  * APB2CLK (MHz)       | 84\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n//#define VECT_TAB_OFFSET  0xc000 \n#define VECT_TAB_OFFSET  0x0000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO2 pin(PC9) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); // 84 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM            = 8;             // VCO input clock = 1 MHz (8 MHz / 8)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> OK for USB\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;   // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;   // 84 MHz (SPI1 clock...)\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    /*\n    if (bypass == 0)\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz\n    else\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n    */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_E3/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_E3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n//  {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to STDIO_UART_TX\n//  {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to STDIO_UART_RX\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to LD2 [Green Led]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM4 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM2_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM2_CH2\n//  {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM2_CH3 // Connected to STDIO_UART_TX\n//  {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM2_CH4 // Connected to STDIO_UART_RX\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM3_CH1\n    {PA_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM3_CH2\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM1_CH2\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM1_CH3\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM1_CH4\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM3_CH3\n    {PB_1,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM3_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 2, 0)}, // TIM3_CH2\n//  {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM4_CH1\n//  {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM4_CH2\n//  {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM4_CH3\n//  {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM4_CH4\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 1)}, // TIM1_CH2N\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 1)}, // TIM1_CH3N\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 1, 0)}, // TIM3_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 2, 0)}, // TIM3_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 3, 0)}, // TIM3_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 4, 0)}, // TIM3_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_TX\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_RX\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)}, // Connected to LD2 [Green Led]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1 // Connected to SWO\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 10)}, // Remap CAN_RX to PB_8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 10)}, // Remap CAN_TX to PB_9\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DP\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_E3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_1  = 0x01,\n    PA_2  = 0x02,\n    PA_3  = 0x03,\n    PA_4  = 0x04,\n    PA_5  = 0x05,\n    PA_6  = 0x06,\n    PA_7  = 0x07,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n\n    PB_0  = 0x10,\n    PB_1  = 0x11,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_4  = 0x14,\n    PB_5  = 0x15,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_9  = 0x19,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_15 = 0x1F,\n\n    PC_0  = 0x20,\n    PC_1  = 0x21,\n    PC_2  = 0x22,\n    PC_3  = 0x23,\n    PC_4  = 0x24,\n    PC_5  = 0x25,\n    PC_6  = 0x26,\n    PC_7  = 0x27,\n    PC_8  = 0x28,\n    PC_9  = 0x29,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n\n    // Arduino connector namings\n    A0          = PA_0,\n    A1          = PA_1,\n    A2          = PA_4,\n    A3          = PB_0,\n    A4          = PC_1,\n    A5          = PC_0,\n    D0          = PA_3,\n    D1          = PA_2,\n    D2          = PA_10,\n    D3          = PB_3,\n    D4          = PB_5,\n    D5          = PB_4,\n    D6          = PB_10,\n    D7          = PA_8,\n    D8          = PA_9,\n    D9          = PC_7,\n    D10         = PB_6,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PA_5,\n    LED2        = PA_5,\n    LED3        = PA_5,\n    LED4        = PA_5,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX,\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX,\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8,\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB pins ****/\n    USB_DM = PA_11,\n    USB_DP = PA_12,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PD_0,\n    RCC_OSC_OUT = PD_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_TRACESWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_NJTRST = PB_4,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_ROBIN_E3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-------------------------------------------------------------------------------------------\n  * System clock source                | 1- PLL_HSE_EXTC  / DEVICE_USBDEVICE   | 3- PLL_HSI / DEVICE_USBDEVICE\n  *                                    | (external 8 MHz clock)                | (internal 8 MHz)\n  *                                    | 2- PLL_HSE_XTAL / DEVICE_USBDEVICE    |\n  *                                    | (external 8 MHz xtal)                 |\n  *-------------------------------------------------------------------------------------------\n  * SYSCLK(MHz)                        | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * AHBCLK (MHz)                       | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * APB1CLK (MHz)                      | 36 / 36                               | 32 / 24\n  *-------------------------------------------------------------------------------------------\n  * APB2CLK (MHz)                      | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  */\n\n#include \"stm32f1xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x5000 /*!< Vector Table base offset field.\n                                  This value must be a multiple of 0x200. */\n\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // 72 MHz or 64 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSEPredivValue      = RCC_HSE_PREDIV_DIV1;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL9; // 72 MHz (8 MHz * 9)\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 72 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 72 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 36 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 72 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI_DIV2;\n#if (DEVICE_USBDEVICE)\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL12; // 48 MHz (8 MHz/2 * 12)\n#else /* DEVICE_USBDEVICE */\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL16; // 64 MHz (8 MHz/2 * 16)\n#endif /* DEVICE_USBDEVICE */\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 64 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 64 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 32 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 64 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiSlave(MOSI0, MISO0, SCK0, SSEL0)\n{\n    spiSlave.frequency(48000000);\n}\n\nvoid RemoraComms::init()\n{\n    // Create MODDMA configuration objects for the SPI transfer and memory copy\n    spiDMAmemcpy1 = new MODDMA_Config;\n    spiDMAmemcpy2 = new MODDMA_Config;\n    spiDMAtx1 = new MODDMA_Config;\n    spiDMAtx2 = new MODDMA_Config;\n    spiDMArx1 = new MODDMA_Config;\n    spiDMArx2 = new MODDMA_Config;\n\n   // Setup DMA configurations\n    spiDMAtx1\n        ->channelNum    ( MODDMA::Channel_0 )\n        ->srcMemAddr    ( (uint32_t) ptrTxData )\n        ->dstMemAddr    ( 0 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2p )\n        ->srcConn       ( 0 )\n        ->dstConn       ( MODDMA::SSP0_Tx )\n        ->attach_tc     ( this, &RemoraComms::tc0_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMAtx2\n        ->channelNum    ( MODDMA::Channel_1 )\n        ->srcMemAddr    ( (uint32_t) ptrTxData )\n        ->dstMemAddr    ( 0 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2p )\n        ->srcConn       ( 0 )\n        ->dstConn       ( MODDMA::SSP0_Tx )\n        ->attach_tc     ( this, &RemoraComms::tc1_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMArx1\n        ->channelNum    ( MODDMA::Channel_2 )\n        ->srcMemAddr    ( 0 )\n        ->dstMemAddr    ( (uint32_t) &spiRxBuffer1 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::p2m )\n        ->srcConn       ( MODDMA::SSP0_Rx )\n        ->dstConn       ( 0 )\n        ->attach_tc     ( this, &RemoraComms::tc2_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMArx2\n        ->channelNum    ( MODDMA::Channel_3 )\n        ->srcMemAddr    ( 0 )\n        ->dstMemAddr    ( (uint32_t) &spiRxBuffer2 )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::p2m )\n        ->srcConn       ( MODDMA::SSP0_Rx )\n        ->dstConn       ( 0 )\n        ->attach_tc     ( this, &RemoraComms::tc3_callback )\n        ->attach_err    ( this, &RemoraComms::err_callback )\n    ;\n\n    spiDMAmemcpy1\n        ->channelNum    ( MODDMA::Channel_4 )\n        ->srcMemAddr    ( (uint32_t) &spiRxBuffer1 )\n        ->dstMemAddr    ( (uint32_t) &rxData )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2m )\n    ;\n\n    spiDMAmemcpy2\n        ->channelNum    ( MODDMA::Channel_5 )\n        ->srcMemAddr    ( (uint32_t) &spiRxBuffer2 )\n        ->dstMemAddr    ( (uint32_t) &rxData )\n        ->transferSize  ( SPI_BUFF_SIZE )\n        ->transferType  ( MODDMA::m2m )\n    ;\n}\n\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n\n    // Pass the configurations to the controller\n    dma.Prepare( spiDMArx1 );\n    dma.Prepare( spiDMAtx1 );\n\n    // Enable SSP0 for DMA\n    LPC_SSP0->DMACR = 0;\n    LPC_SSP0->DMACR = (1<<1)|(1<<0); // TX,RX DMA Enable\n}\n\n\nvoid RemoraComms::tc0_callback()\n{\n    // SPI Tx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    dma.Prepare( spiDMAtx2 );\n}\n\nvoid RemoraComms::tc1_callback()\n{\n    // SPI Tx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    dma.Prepare( spiDMAtx1 );\n}\n\nvoid RemoraComms::tc2_callback()\n{\n    // SPI Rx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    SPIdata = false;\n    SPIdataError = false;\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    // Check and move the recieved SPI data payload\n    switch (spiRxBuffer1.header)\n    {\n      case PRU_READ:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Disable( spiDMAmemcpy2->channelNum()  );\n        break;\n\n      case PRU_WRITE:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Prepare( spiDMAmemcpy1 );\n        break;\n\n      default:\n        rejectCnt++;\n        if (rejectCnt > 5)\n        {\n            SPIdataError = true;\n        }\n        dma.Disable( spiDMAmemcpy2->channelNum()  );\n    }\n\n    // swap Rx buffers\n    dma.Prepare( spiDMArx2 );\n}\n\nvoid RemoraComms::tc3_callback()\n{\n    // SPI Rx\n    MODDMA_Config *config = dma.getConfig();\n    dma.Disable( (MODDMA::CHANNELS)config->channelNum() );\n\n    SPIdata = false;\n    SPIdataError = false;\n\n    // Clear DMA IRQ flags.\n    if (dma.irqType() == MODDMA::TcIrq) dma.clearTcIrq();\n    if (dma.irqType() == MODDMA::ErrIrq) dma.clearErrIrq();\n\n    // Check and move the recieved SPI data payload\n    switch (spiRxBuffer2.header)\n    {\n      case PRU_READ:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Disable( spiDMAmemcpy1->channelNum()  );\n        break;\n\n      case PRU_WRITE:\n        SPIdata = true;\n        rejectCnt = 0;\n        dma.Prepare( spiDMAmemcpy2 );\n        break;\n\n      default:\n        rejectCnt++;\n        if (rejectCnt > 5)\n        {\n            SPIdataError = true;\n        }\n        dma.Disable( spiDMAmemcpy1->channelNum()  );\n    }\n\n    // swap Rx buffers\n    dma.Prepare( spiDMArx1 );\n}\n\nvoid RemoraComms::err_callback()\n{\n    printf(\"err\\r\\n\");\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->SPIdata;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->SPIdata = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n#include \"MODDMA.h\"\n\n// RPi SPI\n#define MOSI0               P0_18\n#define MISO0               P0_17\n#define SCK0                P0_15\n#define SSEL0               P0_16\n\nclass RemoraComms\n{\n    private:\n\n        SPISlave            spiSlave;\n\n        MODDMA              dma;\n\n        MODDMA_Config*      spiDMArx1;\n        MODDMA_Config*      spiDMArx2;\n        MODDMA_Config*      spiDMAtx1;\n        MODDMA_Config*      spiDMAtx2;\n        MODDMA_Config*      spiDMAmemcpy1;\n        MODDMA_Config*      spiDMAmemcpy2;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer1;\n        rxData_t            spiRxBuffer2;\n        uint8_t             rejectCnt;\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*);\n\n        void tc0_callback(void);\n        void tc1_callback(void);\n        void tc2_callback(void);\n        void tc3_callback(void);\n        void err_callback(void);\n\n        void init(void);\n        void start(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"LPC17xx.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    this->configPin();\n\n    if (this->dir == 0) //input\n    {\n        switch(this->modifier)\n        {\n            case OPENDRAIN:\n                printf(\"  Setting pin as open drain\\n\");\n                this->as_open_drain();\n                break;\n            case PULLUP:\n                printf(\"  Setting pin as pull_up\\n\");\n                this->pull_up();\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as pull_down\\n\");\n                this->pull_down();\n                break;\n            case PULLNONE:\n                printf(\"  Setting pin as pull_none\\n\");\n                this->pull_none();\n                break;\n        }\n    }\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    LPC_GPIO_TypeDef* gpios[5] ={LPC_GPIO0,LPC_GPIO1,LPC_GPIO2,LPC_GPIO3,LPC_GPIO4};\n\n    // The method below to determine the port and pin from the string is taken from Smoothieware, thanks!\n\n    // cs is the current position in the string\n    const char* cs = this->portAndPin.c_str();\n\n    // cn is the position of the next char after the number we just read\n    char* cn = NULL;\n\n    // grab first integer as port. pointer to first non-digit goes in cn\n    this->portNumber = std::strtol(cs, &cn, 10);\n\n    printf(\"  portNumber = %d\\n\", this->portNumber);\n\n    // if cn > cs then strtol read at least one digit\n    if ((cn > cs) && (this->portNumber <= 4))\n    {\n        // translate port index into something useful\n        this->port = gpios[this->portNumber];\n\n        // if the char after the first integer is a . then we should expect a pin index next\n        if (*cn == '.')\n        {\n            // move pointer to first digit (hopefully) of pin index\n            cs = ++cn;\n\n            // grab pin index.\n            this->pin = strtol(cs, &cn, 10);\n\n            printf(\"  pin = %d\\n\", this->pin);\n\n            // if strtol read some numbers, cn will point to the first non-digit\n            if ((cn > cs) && (this->pin < 32) && (this->dir >= 0))\n            {\n                // configure pin direction: FIODIR\n                if (dir == INPUT)\n                {\n                    this->port->FIODIR &= ~(1<<this->pin);\n                }\n                else\n                {\n                    this->port->FIODIR |= 1<<this->pin;\n                }\n\n                // configure\n                this->port->FIOMASK &= ~(1 << this->pin);\n            }\n        }\n    }\n}\n\nvoid Pin::setAsOutput()\n{\n    this->port->FIODIR |= 1<<this->pin;\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->port->FIODIR &= ~(1<<this->pin);\n}\n\n// Configure this pin as OD\nvoid Pin::as_open_drain(){\n    if( this->portNumber == 0 ){ LPC_PINCON->PINMODE_OD0 |= (1<<this->pin); }\n    if( this->portNumber == 1 ){ LPC_PINCON->PINMODE_OD1 |= (1<<this->pin); }\n    if( this->portNumber == 2 ){ LPC_PINCON->PINMODE_OD2 |= (1<<this->pin); }\n    if( this->portNumber == 3 ){ LPC_PINCON->PINMODE_OD3 |= (1<<this->pin); }\n    if( this->portNumber == 4 ){ LPC_PINCON->PINMODE_OD4 |= (1<<this->pin); }\n    pull_none(); // no pull up by default\n}\n\n// Configure this pin as no pullup or pulldown\nvoid Pin::pull_none()\n{\n    // Set the two bits for this pin as 10\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE0 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE1 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE2 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE3 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE4 &= ~(1<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE7 &= ~(1<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 |= (2<<( this->pin*2)); LPC_PINCON->PINMODE9 &= ~(1<<((this->pin-16)*2)); }\n}\n\n// Configure this pin as a pullup\nvoid Pin::pull_up()\n{\n    // Set the two bits for this pin as 00\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 &= ~(3<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 &= ~(3<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 &= ~(3<<((this->pin-16)*2)); }\n}\n\n// Configure this pin as a pulldown\nvoid Pin::pull_down()\n{\n    // Set the two bits for this pin as 11\n    if( this->portNumber == 0 && this->pin < 16  ){ LPC_PINCON->PINMODE0 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 0 && this->pin >= 16 ){ LPC_PINCON->PINMODE1 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 1 && this->pin < 16  ){ LPC_PINCON->PINMODE2 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 1 && this->pin >= 16 ){ LPC_PINCON->PINMODE3 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 2 && this->pin < 16  ){ LPC_PINCON->PINMODE4 |= (3<<( this->pin    *2)); }\n    if( this->portNumber == 3 && this->pin >= 16 ){ LPC_PINCON->PINMODE7 |= (3<<((this->pin-16)*2)); }\n    if( this->portNumber == 4 && this->pin >= 16 ){ LPC_PINCON->PINMODE9 |= (3<<((this->pin-16)*2)); }\n}\n\n// Convert a PortAndPin into a mBed Pin\n// allows use of standard mbed libraries, eg FastAnalogIn\nPinName Pin::pinToPinName()\n{\n  if( this->port == LPC_GPIO0 && this->pin == 0 ) {\n      return p9;\n  } else if( this->port == LPC_GPIO0 && this->pin == 1 ) {\n      return p10;\n  } else if( this->port == LPC_GPIO0 && this->pin == 23 ) {\n      return p15;\n  } else if( this->port == LPC_GPIO0 && this->pin == 24 ) {\n      return p16;\n  } else if( this->port == LPC_GPIO0 && this->pin == 25 ) {\n      return p17;\n  } else if( this->port == LPC_GPIO0 && this->pin == 26 ) {\n      return p18;\n  } else if( this->port == LPC_GPIO1 && this->pin == 30 ) {\n      return p19;\n  } else if( this->port == LPC_GPIO1 && this->pin == 31 ) {\n      return p20;\n  } else {\n      //TODO: Error\n      return NC;\n  }\n}\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portNumber == 1)\n    {\n        if (this->pin == 18) { return new mbed::PwmOut(P1_18); }\n        if (this->pin == 20) { return new mbed::PwmOut(P1_20); }\n        if (this->pin == 21) { return new mbed::PwmOut(P1_21); }\n        if (this->pin == 23) { return new mbed::PwmOut(P1_23); }\n        if (this->pin == 24) { return new mbed::PwmOut(P1_24); }\n        if (this->pin == 26) { return new mbed::PwmOut(P1_26); }\n    }\n    else if (this->portNumber == 2)\n    {\n        if (this->pin == 0) { return new mbed::PwmOut(P2_0); }\n        if (this->pin == 1) { return new mbed::PwmOut(P2_1); }\n        if (this->pin == 2) { return new mbed::PwmOut(P2_2); }\n        if (this->pin == 3) { return new mbed::PwmOut(P2_3); }\n        if (this->pin == 4) { return new mbed::PwmOut(P2_4); }\n        if (this->pin == 5) { return new mbed::PwmOut(P2_5); }\n    }\n    else if (this->portNumber == 3)\n    {\n        if (this->pin == 25) { return new mbed::PwmOut(P3_25); }\n        if (this->pin == 26) { return new mbed::PwmOut(P3_26); }\n    }\n    return nullptr;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"LPC17xx.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portNumber;\n        uint8_t             pin;\n        LPC_GPIO_TypeDef*   port;\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void setAsOutput();\n        void setAsInput();\n        void as_open_drain();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return ((this->port->FIOPIN >> this->pin ) & 1);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n                this->port->FIOSET = 1 << this->pin;\n            else\n                this->port->FIOCLR = 1 << this->pin;\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n#include \"interrupt.h\"\n#include \"qeiInterrupt.h\"\n\nQEIdriver::QEIdriver()\n{\n    this->hasIndex = false;\n\n    this->dirinv = 0;\n    this->sigmode = 0;  // quadrature inputs\n    this->capmode = 1;  // count channels A and B (4x mode)\n    this->invinx = 0;\n\n    this->init();\n}\n\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex)\n{\n    this->hasIndex = true;\n\n    this->dirinv = 0;\n    this->sigmode = 0;  // quadrature inputs\n    this->capmode = 1;  // count channels A and B (4x mode)\n    this->invinx = 0;\n\n    this->irq = QEI_IRQn;\n\n    this->init();\n\n    interruptPtr = new qeiInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\n\nvoid QEIdriver::interruptHandler()\n{\n    this->indexDetected = true;\n    this->indexCount = this->get();\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return (LPC_QEI->QEIPOS);\n}\n\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n\n    /* Set up clock and power for QEI module */\n    LPC_SC->PCONP |= PCONP_QEI_ENABLE;\n\n    /* The clock for theQEI module is set to FCCLK  */\n    LPC_SC->PCLKSEL1 = LPC_SC->PCLKSEL1 & ~(3UL<<0) | ((PCLKSEL_CCLK_DIV_1 & 3)<<0); \n\n    /* Assign the pins. They are hard-coded, not user-selected. */\n    // MCI0 (PhA)\n    LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI0_MASK) | PINSEL3_MCI0 ;\n    LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI0_MASK) | PINMODE3_MCI0;\n\n    // MCI1 (PhB)\n    LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI1_MASK) | PINSEL3_MCI1 ;\n    LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI1_MASK) | PINMODE3_MCI1;\n\n    // MCI2 (Index)\n    if (hasIndex)\n    {\n        LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & PINSEL3_MCI2_MASK) | PINSEL3_MCI2 ;\n        LPC_PINCON->PINMODE3 = (LPC_PINCON->PINMODE3 & PINMODE3_MCI2_MASK) | PINMODE3_MCI2;\n    }\n\n    // Initialize all remaining values in QEI peripheral\n    LPC_QEI->QEICON = QEI_CON_RESP | QEI_CON_RESV | QEI_CON_RESI;\n    LPC_QEI->QEIMAXPOS = 0xFFFFFFFF;                          // Default value\n    LPC_QEI->CMPOS0 = 0x00;\n    LPC_QEI->CMPOS1 = 0x00;\n    LPC_QEI->CMPOS2 = 0x00;\n    LPC_QEI->INXCMP = 0x00;\n    LPC_QEI->QEILOAD = 0x00;\n    LPC_QEI->VELCOMP = 0x00;\n    LPC_QEI->FILTER = 200000;       // Default for mechanical switches.\n\n    // Set QEI configuration value corresponding to the call parameters\n    LPC_QEI->QEICONF = (\n        ((dirinv << 0) & 1) | \\\n        ((sigmode << 1) & 2) | \\\n        ((capmode << 2) & 4) | \\\n        ((invinx <<3) & 8) );\n       \n    // Mask all int sources   \n    LPC_QEI->QEIIEC = QEI_IECLR_BITMASK;    // Set the \"clear\" bits for all sources in the IE clear register              \n\n    // Clear any pending ints    \n    LPC_QEI->QEICLR = QEI_INTCLR_BITMASK;   // Set the \"clear\" bits for for all sources in the Interrupt clear register\n\n    // Enable specified interrupt on QEI peropheral\n    LPC_QEI->QEIIES = QEI_INTSTAT_INX_Int;\n\n    // set digital filter\n    LPC_QEI->FILTER = 480UL;\n    \n    // set max position\n    LPC_QEI->QEIMAXPOS = 0xFFFFFFFF;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\nclass qeiInterrupt; // forward declatation\n\nclass QEIdriver\n{\n    \tfriend class    qeiInterrupt;\n    \n    private:\n\n        qeiInterrupt* \tinterruptPtr;\n        IRQn_Type \t\tirq;\n\n        int             dirinv;                 // Direction invert. When = 1, complements the QEICONF register DIR bit\n        int             sigmode;                // Signal mode. When = 0, PhA and PhB are quadrature inputs. When = 1, PhA is direction and PhB is clock\n        int             capmode;                // Capture mode. When = 0, count PhA edges only (2X mode). Whe = 1, count PhB edges also (4X mode)\n        int             invinx;                 // Invert index. When = 1, inverts the sense of the index signal\n\n        void interruptHandler();\n\n    public:\n\n        bool             hasIndex;\n        bool             indexDetected;\n        int32_t          indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n\n\n/* Private Macros ------------------------------------------------------------- */\n/* --------------------- BIT DEFINITIONS -------------------------------------- */\n/* Quadrature Encoder Interface Control Register Definition --------------------- */\n/*********************************************************************//**\n * Macro defines for QEI Control register\n **********************************************************************/\n#define QEI_CON_RESP        ((uint32_t)(1<<0))        /**< Reset position counter */\n#define QEI_CON_RESPI        ((uint32_t)(1<<1))        /**< Reset Posistion Counter on Index */\n#define QEI_CON_RESV        ((uint32_t)(1<<2))        /**< Reset Velocity */\n#define QEI_CON_RESI        ((uint32_t)(1<<3))        /**< Reset Index Counter */\n#define QEI_CON_BITMASK        ((uint32_t)(0x0F))        /**< QEI Control register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Configuration register\n **********************************************************************/\n#define QEI_CONF_DIRINV        ((uint32_t)(1<<0))        /**< Direction Invert */\n#define QEI_CONF_SIGMODE    ((uint32_t)(1<<1))        /**< Signal mode */\n#define QEI_CONF_CAPMODE    ((uint32_t)(1<<2))        /**< Capture mode */\n#define QEI_CONF_INVINX        ((uint32_t)(1<<3))        /**< Invert index */\n#define QEI_CONF_BITMASK    ((uint32_t)(0x0F))        /**< QEI Configuration register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Status register\n **********************************************************************/\n#define QEI_STAT_DIR        ((uint32_t)(1<<0))        /**< Direction bit */\n#define QEI_STAT_BITMASK    ((uint32_t)(1<<0))        /**< QEI status register bit-mask */\n\n/* Quadrature Encoder Interface Interrupt registers definitions --------------------- */\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Status register\n **********************************************************************/\n#define QEI_INTSTAT_INX_Int            ((uint32_t)(1<<0))    /**< Indicates that an index pulse was detected */\n#define QEI_INTSTAT_TIM_Int            ((uint32_t)(1<<1))    /**< Indicates that a velocity timer overflow occurred */\n#define QEI_INTSTAT_VELC_Int        ((uint32_t)(1<<2))    /**< Indicates that capture velocity is less than compare velocity */\n#define QEI_INTSTAT_DIR_Int            ((uint32_t)(1<<3))    /**< Indicates that a change of direction was detected */\n#define QEI_INTSTAT_ERR_Int            ((uint32_t)(1<<4))    /**< Indicates that an encoder phase error was detected */\n#define QEI_INTSTAT_ENCLK_Int        ((uint32_t)(1<<5))    /**< Indicates that and encoder clock pulse was detected */\n#define QEI_INTSTAT_POS0_Int        ((uint32_t)(1<<6))    /**< Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_POS1_Int        ((uint32_t)(1<<7))    /**< Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_POS2_Int        ((uint32_t)(1<<8))    /**< Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTSTAT_REV_Int            ((uint32_t)(1<<9))    /**< Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTSTAT_POS0REV_Int        ((uint32_t)(1<<10))    /**< Combined position 0 and revolution count interrupt. Set when\n                                                        both the POS0_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_POS1REV_Int        ((uint32_t)(1<<11))    /**< Combined position 1 and revolution count interrupt. Set when\n                                                        both the POS1_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_POS2REV_Int        ((uint32_t)(1<<12))    /**< Combined position 2 and revolution count interrupt. Set when\n                                                        both the POS2_Int bit is set and the REV_Int is set */\n#define QEI_INTSTAT_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Status register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Set register\n **********************************************************************/\n#define QEI_INTSET_INX_Int            ((uint32_t)(1<<0))    /**< Set Bit Indicates that an index pulse was detected */\n#define QEI_INTSET_TIM_Int            ((uint32_t)(1<<1))    /**< Set Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTSET_VELC_Int            ((uint32_t)(1<<2))    /**< Set Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTSET_DIR_Int            ((uint32_t)(1<<3))    /**< Set Bit Indicates that a change of direction was detected */\n#define QEI_INTSET_ERR_Int            ((uint32_t)(1<<4))    /**< Set Bit Indicates that an encoder phase error was detected */\n#define QEI_INTSET_ENCLK_Int        ((uint32_t)(1<<5))    /**< Set Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTSET_POS0_Int            ((uint32_t)(1<<6))    /**< Set Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_POS1_Int            ((uint32_t)(1<<7))    /**< Set Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_POS2_Int            ((uint32_t)(1<<8))    /**< Set Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTSET_REV_Int            ((uint32_t)(1<<9))    /**< Set Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTSET_POS0REV_Int        ((uint32_t)(1<<10))    /**< Set Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTSET_POS1REV_Int        ((uint32_t)(1<<11))    /**< Set Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTSET_POS2REV_Int        ((uint32_t)(1<<12))    /**< Set Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTSET_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Set register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Clear register\n **********************************************************************/\n#define QEI_INTCLR_INX_Int            ((uint32_t)(1<<0))    /**< Clear Bit Indicates that an index pulse was detected */\n#define QEI_INTCLR_TIM_Int            ((uint32_t)(1<<1))    /**< Clear Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTCLR_VELC_Int            ((uint32_t)(1<<2))    /**< Clear Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTCLR_DIR_Int            ((uint32_t)(1<<3))    /**< Clear Bit Indicates that a change of direction was detected */\n#define QEI_INTCLR_ERR_Int            ((uint32_t)(1<<4))    /**< Clear Bit Indicates that an encoder phase error was detected */\n#define QEI_INTCLR_ENCLK_Int        ((uint32_t)(1<<5))    /**< Clear Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTCLR_POS0_Int            ((uint32_t)(1<<6))    /**< Clear Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_POS1_Int            ((uint32_t)(1<<7))    /**< Clear Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_POS2_Int            ((uint32_t)(1<<8))    /**< Clear Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTCLR_REV_Int            ((uint32_t)(1<<9))    /**< Clear Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTCLR_POS0REV_Int        ((uint32_t)(1<<10))    /**< Clear Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTCLR_POS1REV_Int        ((uint32_t)(1<<11))    /**< Clear Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTCLR_POS2REV_Int        ((uint32_t)(1<<12))    /**< Clear Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTCLR_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Clear register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable register\n **********************************************************************/\n#define QEI_INTEN_INX_Int            ((uint32_t)(1<<0))    /**< Enabled Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_INTEN_TIM_Int            ((uint32_t)(1<<1))    /**< Enabled Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_INTEN_VELC_Int            ((uint32_t)(1<<2))    /**< Enabled Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_INTEN_DIR_Int            ((uint32_t)(1<<3))    /**< Enabled Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_INTEN_ERR_Int            ((uint32_t)(1<<4))    /**< Enabled Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_INTEN_ENCLK_Int            ((uint32_t)(1<<5))    /**< Enabled Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_INTEN_POS0_Int            ((uint32_t)(1<<6))    /**< Enabled Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_POS1_Int            ((uint32_t)(1<<7))    /**< Enabled Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_POS2_Int            ((uint32_t)(1<<8))    /**< Enabled Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_INTEN_REV_Int            ((uint32_t)(1<<9))    /**< Enabled Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_INTEN_POS0REV_Int        ((uint32_t)(1<<10))    /**< Enabled Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_INTEN_POS1REV_Int        ((uint32_t)(1<<11))    /**< Enabled Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_INTEN_POS2REV_Int        ((uint32_t)(1<<12))    /**< Enabled Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_INTEN_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable Set register\n **********************************************************************/\n#define QEI_IESET_INX_Int            ((uint32_t)(1<<0))    /**< Set Enable Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_IESET_TIM_Int            ((uint32_t)(1<<1))    /**< Set Enable Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_IESET_VELC_Int            ((uint32_t)(1<<2))    /**< Set Enable Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_IESET_DIR_Int            ((uint32_t)(1<<3))    /**< Set Enable Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_IESET_ERR_Int            ((uint32_t)(1<<4))    /**< Set Enable Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_IESET_ENCLK_Int            ((uint32_t)(1<<5))    /**< Set Enable Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_IESET_POS0_Int            ((uint32_t)(1<<6))    /**< Set Enable Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_IESET_POS1_Int            ((uint32_t)(1<<7))    /**< Set Enable Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_IESET_POS2_Int            ((uint32_t)(1<<8))    /**< Set Enable Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_IESET_REV_Int            ((uint32_t)(1<<9))    /**< Set Enable Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_IESET_POS0REV_Int        ((uint32_t)(1<<10))    /**< Set Enable Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_IESET_POS1REV_Int        ((uint32_t)(1<<11))    /**< Set Enable Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_IESET_POS2REV_Int        ((uint32_t)(1<<12))    /**< Set Enable Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_IESET_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable Set register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for QEI Interrupt Enable Clear register\n **********************************************************************/\n#define QEI_IECLR_INX_Int            ((uint32_t)(1<<0))    /**< Clear Enabled Interrupt Bit Indicates that an index pulse was detected */\n#define QEI_IECLR_TIM_Int            ((uint32_t)(1<<1))    /**< Clear Enabled Interrupt Bit Indicates that a velocity timer overflow occurred */\n#define QEI_IECLR_VELC_Int            ((uint32_t)(1<<2))    /**< Clear Enabled Interrupt Bit Indicates that capture velocity is less than compare velocity */\n#define QEI_IECLR_DIR_Int            ((uint32_t)(1<<3))    /**< Clear Enabled Interrupt Bit Indicates that a change of direction was detected */\n#define QEI_IECLR_ERR_Int            ((uint32_t)(1<<4))    /**< Clear Enabled Interrupt Bit Indicates that an encoder phase error was detected */\n#define QEI_IECLR_ENCLK_Int            ((uint32_t)(1<<5))    /**< Clear Enabled Interrupt Bit Indicates that and encoder clock pulse was detected */\n#define QEI_IECLR_POS0_Int            ((uint32_t)(1<<6))    /**< Clear Enabled Interrupt Bit Indicates that the position 0 compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_POS1_Int            ((uint32_t)(1<<7))    /**< Clear Enabled Interrupt Bit Indicates that the position 1compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_POS2_Int            ((uint32_t)(1<<8))    /**< Clear Enabled Interrupt Bit Indicates that the position 2 compare value is equal to the\n                                                        current position */\n#define QEI_IECLR_REV_Int            ((uint32_t)(1<<9))    /**< Clear Enabled Interrupt Bit Indicates that the index compare value is equal to the current\n                                                        index count */\n#define QEI_IECLR_POS0REV_Int        ((uint32_t)(1<<10))    /**< Clear Enabled Interrupt Bit that combined position 0 and revolution count interrupt */\n#define QEI_IECLR_POS1REV_Int        ((uint32_t)(1<<11))    /**< Clear Enabled Interrupt Bit that Combined position 1 and revolution count interrupt */\n#define QEI_IECLR_POS2REV_Int        ((uint32_t)(1<<12))    /**< Clear Enabled Interrupt Bit that Combined position 2 and revolution count interrupt */\n#define QEI_IECLR_BITMASK            ((uint32_t)(0x1FFF))    /**< QEI Interrupt Enable Clear register bit-mask */\n\n/*********************************************************************//**\n * Macro defines for PCONP register QEI-related bits\n **********************************************************************/\n#define PCONP_QEI_ENABLE             ((uint32_t)(1<<18))     /**< QEI peripheral power enable bit */\n#define PCONP_QEI_DISABLE            ~((uint32_t)(1<<18))     /**< QEI peripheral power disable bit-mask */\n\n/*********************************************************************//**\n * Macro defines for PCLKSELx register QEI-related bits\n **********************************************************************/\n#define PCLKSEL_CCLK_DIV_1              1UL                 /**< Set PCLK to CCLK/1 */\n#define PCLKSEL_CCLK_DIV_2              2UL                 /**< Set PCLK to CCLK/2 */\n#define PCLKSEL_CCLK_DIV_4              0UL                 /**< Set PCLK to CCLK/4 */\n#define PCLKSEL_CCLK_DIV_8              3UL                 /**< Set PCLK to CCLK/8 */\n#define PCLKSEL1_PCLK_QEI_MASK          ((uint32_t)(3<<0))  /**< PCLK_QEI PCLK_QEI bit field mask */\n/*********************************************************************//**\n * Macro defines for PINSEL3 register QEI-related bits\n **********************************************************************/\n#define PINSEL3_MCI0                ((uint32_t)(1<<8))     /**< MCIO (PhA) pin select */\n#define PINSEL3_MCI0_MASK          ~((uint32_t)(3<<8))     /**< MCIO (PhA) pin mask */\n#define PINSEL3_MCI1                ((uint32_t)(1<<14))    /**< MCI1 (PhB) pin select */\n#define PINSEL3_MCI1_MASK          ~((uint32_t)(3<<14))    /**< MCI2 (PhB) pin mask */\n#define PINSEL3_MCI2                ((uint32_t)(1<<16))    /**< MCI2 (Index) pin select */\n#define PINSEL3_MCI2_MASK          ~((uint32_t)(3<<16))    /**< MCI2 (Index) pin mask */\n\n/*********************************************************************//**\n * Macro defines for PINMODE3 register QEI-related bits\n **********************************************************************/\n#define PIN_PULL_UP                     0UL\n#define PIN_REPEATER                    1UL\n#define PIN_NORESISTOR                  2UL\n#define PIN_PULL_DOWN                   3UL     \n\n#define PINMODE3_MCI0                ((uint32_t)(PIN_NORESISTOR<<8))     /**< MCIO (PhA) resistor selection */\n#define PINMODE3_GPIO1p20            ((uint32_t)(PIN_PULL_DOWN<<8))      /**< GPIO 1.20) resistor selection */\n#define PINMODE3_MCI0_MASK          ~((uint32_t)(3<<8))                  /**< MCIO (PhA) resistor mask */\n\n#define PINMODE3_MCI1                ((uint32_t)(PIN_NORESISTOR<<14))    /**< MCI1 (PhB) resistor selection */\n#define PINMODE3_GPIO1p23            ((uint32_t)(PIN_PULL_DOWN<<14))      /**< GPIO 1.23) resistor selection */\n#define PINMODE3_MCI1_MASK          ~((uint32_t)(3<<14))                 /**< MCI1 (PhB) resistor mask */\n\n#define PINMODE3_MCI2                ((uint32_t)(PIN_PULL_UP<<16))       /**< MCI2 (Index) resistor selection */\n#define PINMODE3_GPIO1p24            ((uint32_t)(PIN_PULL_DOWN<<16))      /**< GPIO 1.24) resistor selection */\n#define PINMODE3_MCI2_MASK          ~((uint32_t)(3<<16))                 /**< MCI2 (Index) resistor mask */\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the USB bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n    //\n    // Note: DMAC has highest priority, then Base thread and then Servo thread\n    //       to ensure SPI data transfer is reliable\n\n    NVIC_SetPriority(DMA_IRQn, 1);\n\n    baseThread = new pruThread(LPC_TIM0, TIMER0_IRQn, base_freq);\n    NVIC_SetVector(TIMER0_IRQn, (uint32_t)TIMER0_IRQHandler);\n    NVIC_SetPriority(TIMER0_IRQn, 2);\n\n    servoThread = new pruThread(LPC_TIM1, TIMER1_IRQn, servo_freq);\n    NVIC_SetVector(TIMER1_IRQn, (uint32_t)TIMER1_IRQHandler);\n    NVIC_SetPriority(TIMER1_IRQn, 3);\n\n    commsThread = new pruThread(LPC_TIM2, TIMER2_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIMER2_IRQn, (uint32_t)TIMER2_IRQHandler);\n    NVIC_SetPriority(TIMER2_IRQn, 4);\n\n    // for QEI modudule\n    NVIC_SetVector(QEI_IRQn, (uint32_t)QEI_IRQHandler);\n    NVIC_SetPriority(QEI_IRQn, 5);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"LPC17xx.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\nvoid Interrupt::TIMER0_Wrapper(void)\n{\n\tISRVectorTable[TIMER0_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIMER1_Wrapper(void)\n{\n\tISRVectorTable[TIMER1_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIMER2_Wrapper(void)\n{\n\tISRVectorTable[TIMER2_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::QEI_Wrapper(void)\n{\n\tISRVectorTable[QEI_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t32\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n\t\tstatic void TIMER0_Wrapper();\n\t\tstatic void TIMER1_Wrapper();\n        static void TIMER2_Wrapper();\n        static void QEI_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n\n/******  LPC17xx Specific Interrupt Numbers ******************************************************\n  WDT_IRQn                      = 0,        Watchdog Timer Interrupt\n  TIMER0_IRQn                   = 1,        Timer0 Interrupt\n  TIMER1_IRQn                   = 2,        Timer1 Interrupt\n  TIMER2_IRQn                   = 3,        Timer2 Interrupt\n  TIMER3_IRQn                   = 4,        Timer3 Interrupt\n  UART0_IRQn                    = 5,        UART0 Interrupt\n  UART1_IRQn                    = 6,        UART1 Interrupt\n  UART2_IRQn                    = 7,        UART2 Interrupt\n  UART3_IRQn                    = 8,        UART3 Interrupt\n  PWM1_IRQn                     = 9,        PWM1 Interrupt\n  I2C0_IRQn                     = 10,       I2C0 Interrupt\n  I2C1_IRQn                     = 11,       I2C1 Interrupt\n  I2C2_IRQn                     = 12,       I2C2 Interrupt\n  SPI_IRQn                      = 13,       SPI Interrupt\n  SSP0_IRQn                     = 14,       SSP0 Interrupt\n  SSP1_IRQn                     = 15,       SSP1 Interrupt\n  PLL0_IRQn                     = 16,       PLL0 Lock (Main PLL) Interrupt\n  RTC_IRQn                      = 17,       Real Time Clock Interrupt\n  EINT0_IRQn                    = 18,       External Interrupt 0 Interrupt\n  EINT1_IRQn                    = 19,       External Interrupt 1 Interrupt\n  EINT2_IRQn                    = 20,       External Interrupt 2 Interrupt\n  EINT3_IRQn                    = 21,       External Interrupt 3 Interrupt\n  ADC_IRQn                      = 22,       A/D Converter Interrupt\n  BOD_IRQn                      = 23,       Brown-Out Detect Interrupt\n  USB_IRQn                      = 24,       USB Interrupt\n  CAN_IRQn                      = 25,       CAN Interrupt\n  DMA_IRQn                      = 26,       General Purpose DMA Interrupt\n  I2S_IRQn                      = 27,       I2S Interrupt\n  ENET_IRQn                     = 28,       Ethernet Interrupt\n  RIT_IRQn                      = 29,       Repetitive Interrupt Timer Interrupt\n  MCPWM_IRQn                    = 30,       Motor Control PWM Interrupt\n  QEI_IRQn                      = 31,       Quadrature Encoder Interface Interrupt\n  PLL1_IRQn                     = 32,       PLL1 Lock (USB PLL) Interrupt\n\nPERIPH_COUNT_IRQn    = 32  < Number of peripheral IDs */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\nvoid TIMER0_IRQHandler()\n{\n    // Base thread interrupt handler\n    unsigned int isrMask = LPC_TIM0->IR;\n    LPC_TIM0->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER0_Wrapper();\n}\n\n\nvoid TIMER1_IRQHandler(void)\n{\n    // Servo thread interrupt handler\n    unsigned int isrMask = LPC_TIM1->IR;\n    LPC_TIM1->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER1_Wrapper();\n}\n\n\nvoid TIMER2_IRQHandler(void)\n{\n    // Servo thread interrupt handler\n    unsigned int isrMask = LPC_TIM2->IR;\n    LPC_TIM2->IR = isrMask; /* Clear the Interrupt Bit */\n\n    Interrupt::TIMER2_Wrapper();\n}\n\n\nvoid QEI_IRQHandler(void)\n{\n    // QEI (quatrature encoder interface) index interrupt handler\n    LPC_QEI->QEICLR = ((uint32_t)(1<<0));   \n    Interrupt:: QEI_Wrapper();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"LPC17xx.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tLPC_TIM_TypeDef* \ttimer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/qeiInterrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"qeiInterrupt.h\"\n#include \"qei.h\"\n\n\nqeiInterrupt::qeiInterrupt(int interruptNumber, QEIdriver* owner)\n{\n\t// Allows interrupt to access owner's data\n\tInterruptOwnerPtr = owner;\n\n\t// When a device interrupt object is instantiated, the Register function must be called to let the\n\t// Interrupt base class know that there is an appropriate ISR function for the given interrupt.\n\tInterrupt::Register(interruptNumber, this);\n}\n\n\nvoid qeiInterrupt::ISR_Handler(void)\n{\n\tthis->InterruptOwnerPtr->interruptHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/qeiInterrupt.h",
    "content": "#ifndef QEIINTERRUPT_H\n#define QEIINTERRUPT_H\n\n// Derived class for timer interrupts\n\nclass QEIdriver; // forward declatation\n\nclass qeiInterrupt : public Interrupt\n{\n\tprivate:\n\t    \n\t\tQEIdriver* InterruptOwnerPtr;\n\t\n\tpublic:\n\n\t\tqeiInterrupt(int interruptNumber, QEIdriver* ownerptr);\n    \n\t\tvoid ISR_Handler(void);\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"LPC17xx.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n#define SBIT_TIMER0  1\n#define SBIT_TIMER1  2\n#define SBIT_TIMER2  22\n#define SBIT_TIMER3  23\n\n#define SBIT_MR0I    0\n#define SBIT_MR0R    1\n#define SBIT_CNTEN   0\n\n\n// Timer constructor\npruTimer::pruTimer(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    if (this->timer == LPC_TIM0)\n    {\n        printf(\"\tpower on Timer 0\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER0);\n    }\n    else if (this->timer == LPC_TIM1)\n    {\n        printf(\"\tpower on Timer 1\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER1);\n    }\n    else if (this->timer == LPC_TIM2)\n    {\n        printf(\"\tpower on Timer 2\\n\");\n        LPC_SC->PCONP |= (1<<SBIT_TIMER2);\n    }\n\n    printf(\"\ttimer set MCR\\n\");\n    this->timer->MCR  = (1<<SBIT_MR0I) | (1<<SBIT_MR0R);     /* Clear TC on MR0 match and Generate Interrupt*/\n    \n    printf(\"\ttimer set PR\\n\");\n    this->timer->PR   = 0x00;\n    \n    printf(\"\ttimer set PRO\\n\");\n    this->timer->MR0  = SystemCoreClock/4/this->frequency;\n    \n    printf(\"\ttimer start\\n\");\n    this->timer->TCR  = (1<<SBIT_CNTEN);                     /* Start timer by setting the Counter Enable*/\n    \n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\");\n    this->timer->TCR  = (0<<SBIT_CNTEN);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV1_4/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tLPC_TIM_TypeDef* \ttimer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(LPC_TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV2/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_0 = 0,\n    DAC_1\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE,\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV2/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to VBUS_FS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to OTG_FS_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to LD4 [Green Led]\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD3 [Orange Led]\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to LD5 [Red Led]\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to LD6 [Blue Led]\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to VBUS_FS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to OTG_FS_OverCurrent\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DP\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to Audio_RST [CS43L22_RESET]\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD4 [Green Led]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DM\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SWO\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SWO\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to VBUS_FS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to I2S3_WS [CS43L22_LRCK]\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to OTG_FS_PowerSwitchOn\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT // Connected to PDM_OUT [MP45DT02_DOUT]\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV2/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0,\n    PC_11 = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n    PH_3  = 0x73,\n    PH_4  = 0x74,\n    PH_5  = 0x75,\n    PH_6  = 0x76,\n    PH_7  = 0x77,\n    PH_8  = 0x78,\n    PH_9  = 0x79,\n    PH_10 = 0x7A,\n    PH_11 = 0x7B,\n    PH_12 = 0x7C,\n    PH_13 = 0x7D,\n    PH_14 = 0x7E,\n    PH_15 = 0x7F,\n\n    PI_0  = 0x80,\n    PI_1  = 0x81,\n    PI_2  = 0x82,\n    PI_3  = 0x83,\n    PI_4  = 0x84,\n    PI_5  = 0x85,\n    PI_6  = 0x86,\n    PI_7  = 0x87,\n    PI_8  = 0x88,\n    PI_9  = 0x89,\n    PI_10 = 0x8A,\n    PI_11 = 0x8B,\n    PI_12 = 0x8C,\n    PI_13 = 0x8D,\n    PI_14 = 0x8E,\n    PI_15 = 0x8F,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PD_13, // LD3 as LD1 is not a user LED\n    LED2        = PD_12, // LD4 as LD2 is not a user LED\n    LED3        = PD_13, // orange\n    LED4        = PD_12, // green\n    LED5        = PD_14, // red\n    LED6        = PD_15, // blue\n    LED_RED     = LED5,\n    USER_BUTTON = PA_0,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, /* USART2 */\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX, /* USART2 */\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8, /* I2C1 */\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD1 = PB_13,\n    ETH_TXD2 = PC_2,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3,\n    ETH_TX_EN = PB_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED3 = PE_6,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV2/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 168\n  * AHBCLK (MHz)        | 168\n  * APB1CLK (MHz)       | 42\n  * APB2CLK (MHz)       | 84\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO2 pin(PC9) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); // 84 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM            = 8;             // VCO input clock = 1 MHz (8 MHz / 8)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> OK for USB\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;   // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;   // 84 MHz (SPI1 clock...)\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    /*\n    if (bypass == 0)\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz\n    else\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n    */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI;\n    RCC_OscInitStruct.PLL.PLLM            = 16;            // VCO input clock = 1 MHz (16 MHz / 16)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> freq is ok but not precise enough\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;           // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;           // 84 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 16 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n * SPDX-License-Identifier: BSD-3-Clause\n ******************************************************************************\n *\n * Copyright (c) 2016-2021 STMicroelectronics.\n * All rights reserved.\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n *\n * Automatically generated from STM32CubeMX/db/mcu/STM32H743ZITx.xml\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)}, // ADC1_INP16\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC1_INP17 // Connected to ETH_REF_CLK\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_INP14 // Connected to ETH_MDIO\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_INP14 // Connected to ETH_MDIO\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_INP15\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_INP15\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // ADC1_INP18\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // ADC2_INP18\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 19, 0)}, // ADC1_INP19\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 19, 0)}, // ADC2_INP19\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_INP3\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_INP3\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_INP7 // Connected to ETH_CRS_DV\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_INP7 // Connected to ETH_CRS_DV\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_INP9 // Connected to LD1 [Green Led]\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_INP9 // Connected to LD1 [Green Led]\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_INP5\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_INP5\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_INP10\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_INP10\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_INP10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_INP11 // Connected to ETH_MDC\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_INP11 // Connected to ETH_MDC\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_INP11 // Connected to ETH_MDC\n    {PC_2C,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_INP0\n    {PC_3C,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_INP1\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_INP4 // Connected to ETH_RXD0\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_INP4 // Connected to ETH_RXD0\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_INP8 // Connected to ETH_RXD1\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_INP8 // Connected to ETH_RXD1\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_INP5\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_INP9\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_INP4\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_INP8\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_INP3\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_INP7\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_INP2\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_INP6\n    {PF_11,      ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_INP2\n    {PF_12,      ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_INP6\n    {PF_13,      ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_INP2\n    {PF_14,      ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_INP6\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_3,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)}, // ADC3_INP18\n    {ADC_VREF,   ADC_3,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 19, 0)}, // ADC3_INP19\n    {ADC_VBAT,   ADC_3,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)}, // ADC3_INP17\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC1_OUT1\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC1_OUT2\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)},\n    {PB_7_ALT0,  I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9_ALT0,  I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)},\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PD_13,      I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)},\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_15,      I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to USB_OTG_FS_SOF\n    {PB_6,       I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)},\n    {PB_6_ALT0,  I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_8_ALT0,  I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C4)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PD_12,      I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)},\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_14,      I2C_4, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C4)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\n// (update us_ticker_data.h file if another timer is chosen)\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to ETH_REF_CLK\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2 // Connected to ETH_REF_CLK\n    {PA_1_ALT0,  PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N // Connected to ETH_REF_CLK\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to ETH_MDIO\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3 // Connected to ETH_MDIO\n    {PA_2_ALT0,  PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1 // Connected to ETH_MDIO\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ETH_CRS_DV\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to ETH_CRS_DV\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to ETH_CRS_DV\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to ETH_CRS_DV\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to USB_OTG_FS_SOF\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_OTG_FS_VBUS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD1 [Green Led]\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LD1 [Green Led]\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD1 [Green Led]\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PB_6_ALT0,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_7_ALT0,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PB_9_ALT0,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to ETH_TXD1\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD3 [Red Led]\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD3 [Red Led]\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM12, 1, 0)}, // TIM12_CH1 // Connected to LD3 [Red Led]\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PE_4,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 1)}, // TIM15_CH1N\n    {PE_5,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 1, 0)}, // TIM15_CH1\n    {PE_6,       PWM_15, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF4_TIM15, 2, 0)}, // TIM15_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {PF_6,       PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 0)}, // TIM16_CH1\n    {PF_7,       PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 0)}, // TIM17_CH1\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PF_8_ALT0,  PWM_16, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM16, 1, 1)}, // TIM16_CH1N\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {PF_9_ALT0,  PWM_17, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF1_TIM17, 1, 1)}, // TIM17_CH1N\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_2,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ETH_MDIO\n    {PA_9,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_VBUS\n    {PA_9_ALT0,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // Connected to USB_OTG_FS_VBUS\n    {PA_12,      UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // Connected to USB_OTG_FS_DP\n    {PA_15,      UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)},\n    {PB_4,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)},\n    {PB_6,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_6_ALT0,  UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)},\n    {PB_6_ALT1,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)},\n    {PB_9,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_10,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PB_13,      UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)}, // Connected to ETH_TXD1\n    {PB_14,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)}, // Connected to LD3 [Red Led]\n    {PC_6,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {PC_10,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_10_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PC_12,      UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_1,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_5,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_8,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_TX\n    {PE_1,       UART_8,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)}, // Connected to LD2 [Yellow Led]\n    {PE_8,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PF_7,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PG_14,      UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to ETH_REF_CLK\n    {PA_3,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_8,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, // Connected to USB_OTG_FS_SOF\n    {PA_10,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PA_10_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)},\n    {PA_11,      UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // Connected to USB_OTG_FS_DM\n    {PB_3,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)},\n    {PB_5,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)},\n    {PB_7,       UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_7_ALT0,  LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_LPUART)},\n    {PB_8,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_11,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PB_12,      UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF14_UART5)},\n    {PB_15,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF4_USART1)},\n    {PC_7,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {PC_11,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_0,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_RX\n    {PE_0,       UART_8,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},\n    {PE_7,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PF_6,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PG_9,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to ETH_REF_CLK\n    {PA_12,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DP\n    {PA_12_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // Connected to USB_OTG_FS_DP\n    {PA_15,      UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_14,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD3 [Red Led]\n    {PB_14_ALT0, UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to LD3 [Red Led]\n    {PC_8,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_4,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_12,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_15,      UART_8,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},\n    {PE_9,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PF_8,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PG_8,       UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {PG_12,      UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_11,      UART_1,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_OTG_FS_DM\n    {PA_11_ALT0, LPUART_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, // Connected to USB_OTG_FS_DM\n    {PB_0,       UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to LD1 [Green Led]\n    {PB_13,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to ETH_TXD1\n    {PB_15,      UART_4,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PC_9,       UART_5,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_3,       UART_2,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_14,      UART_8,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART8)},\n    {PE_10,      UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PF_9,       UART_7,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART7)},\n    {PG_13,      UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)}, // Connected to ETH_TXD0\n    {PG_15,      UART_6,   STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART6)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ETH_CRS_DV\n    {PA_7_ALT0,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)}, // Connected to ETH_CRS_DV\n    {PB_2,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)},\n    {PB_5_ALT1,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ETH_MDC\n    {PC_3C,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PD_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PF_9,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\n    {PF_11,      SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\n    {PG_14,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_6_ALT0,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_4_ALT1,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LD3 [Red Led]\n    {PC_2C,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PF_8,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\n    {PG_9,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PG_12,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_5_ALT0,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PA_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_OTG_FS_VBUS\n    {PA_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_OTG_FS_DP\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_3_ALT1,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to ETH_TXD1\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PF_7,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\n    {PG_11,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to ETH_TX_EN\n    {PG_13,      SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)}, // Connected to ETH_TXD0\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PA_4_ALT1,  SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF8_SPI6)},\n    {PA_11,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_OTG_FS_DM\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PA_15_ALT1, SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI6)},\n    {PB_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PF_6,       SPI_5, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI5)},\n    {PG_8,       SPI_6, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI6)},\n    {PG_10,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // Connected to USB_OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)}, // Connected to USB_OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)},\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN2)}, // Connected to ETH_TXD1\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_FDCAN1)},\n    {NC, NC, 0}\n};\n\n//*** QUADSPI ***\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA0[] = {\n    {PC_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO0\n    {PD_11,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO0\n    {PF_8,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)},  // QUADSPI_BK1_IO0\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA1[] = {\n    {PC_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO1\n    {PD_12,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO1\n    {PF_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)},  // QUADSPI_BK1_IO1\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA2[] = {\n    {PE_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO2\n    {PF_7,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO2\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA3[] = {\n    {PA_1,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO3 // Connected to ETH_REF_CLK\n    {PD_13,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO3\n    {PF_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_IO3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SCLK[] = {\n    {PB_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_CLK\n    {PF_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_CLK\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SSEL[] = {\n    {PB_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)},  // QUADSPI_BK1_NCS\n    {PB_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QUADSPI)},  // QUADSPI_BK1_NCS\n    {PG_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QUADSPI)},  // QUADSPI_BK1_NCS\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_SOF // Connected to USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to USB_OTG_FS_VBUS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DM // Connected to USB_OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG1_FS)}, // USB_OTG_FS_DP // Connected to USB_OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_SOF\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS // Connected to ETH_TXD1\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DM // Connected to LD3 [Red Led]\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG2_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_CK\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D1 // Connected to LD1 [Green Led]\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D3\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_D6 // Connected to ETH_TXD1\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_STP\n    {PC_2C,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3C,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG2_HS)}, // USB_OTG_HS_ULPI_NXT\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n * SPDX-License-Identifier: BSD-3-Clause\n ******************************************************************************\n *\n * Copyright (c) 2016-2021 STMicroelectronics.\n * All rights reserved.\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n *\n * Automatically generated from STM32CubeMX/db/mcu/STM32H743ZITx.xml\n */\n\n/* MBED TARGET LIST: NUCLEO_H743ZI2 */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define DUAL_PAD 0xF00\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400,\n    ALT4  = 0x500,\n} ALTx;\n\ntypedef enum {\n    PA_0       = 0x00,\n    PA_1       = 0x01,\n    PA_1_ALT0  = PA_1  | ALT0, // same pin used for alternate HW\n    PA_2       = 0x02,\n    PA_2_ALT0  = PA_2  | ALT0, // same pin used for alternate HW\n    PA_3       = 0x03,\n    PA_3_ALT0  = PA_3  | ALT0, // same pin used for alternate HW\n    PA_4       = 0x04,\n    PA_4_ALT0  = PA_4  | ALT0, // same pin used for alternate HW\n    PA_4_ALT1  = PA_4  | ALT1, // same pin used for alternate HW\n    PA_5       = 0x05,\n    PA_5_ALT0  = PA_5  | ALT0, // same pin used for alternate HW\n    PA_5_ALT1  = PA_5  | ALT1, // same pin used for alternate HW\n    PA_5_ALT2  = PA_5  | ALT2, // same pin used for alternate HW\n    PA_6       = 0x06,\n    PA_6_ALT0  = PA_6  | ALT0, // same pin used for alternate HW\n    PA_7       = 0x07,\n    PA_7_ALT0  = PA_7  | ALT0, // same pin used for alternate HW\n    PA_7_ALT1  = PA_7  | ALT1, // same pin used for alternate HW\n    PA_7_ALT2  = PA_7  | ALT2, // same pin used for alternate HW\n    PA_8       = 0x08,\n    PA_9       = 0x09,\n    PA_9_ALT0  = PA_9  | ALT0, // same pin used for alternate HW\n    PA_10      = 0x0A,\n    PA_10_ALT0 = PA_10 | ALT0, // same pin used for alternate HW\n    PA_11      = 0x0B,\n    PA_11_ALT0 = PA_11 | ALT0, // same pin used for alternate HW\n    PA_12      = 0x0C,\n    PA_12_ALT0 = PA_12 | ALT0, // same pin used for alternate HW\n    PA_13      = 0x0D,\n    PA_14      = 0x0E,\n    PA_15      = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0, // same pin used for alternate HW\n    PA_15_ALT1 = PA_15 | ALT1, // same pin used for alternate HW\n    PB_0       = 0x10,\n    PB_0_ALT0  = PB_0  | ALT0, // same pin used for alternate HW\n    PB_0_ALT1  = PB_0  | ALT1, // same pin used for alternate HW\n    PB_0_ALT2  = PB_0  | ALT2, // same pin used for alternate HW\n    PB_1       = 0x11,\n    PB_1_ALT0  = PB_1  | ALT0, // same pin used for alternate HW\n    PB_1_ALT1  = PB_1  | ALT1, // same pin used for alternate HW\n    PB_2       = 0x12,\n    PB_3       = 0x13,\n    PB_3_ALT0  = PB_3  | ALT0, // same pin used for alternate HW\n    PB_3_ALT1  = PB_3  | ALT1, // same pin used for alternate HW\n    PB_4       = 0x14,\n    PB_4_ALT0  = PB_4  | ALT0, // same pin used for alternate HW\n    PB_4_ALT1  = PB_4  | ALT1, // same pin used for alternate HW\n    PB_5       = 0x15,\n    PB_5_ALT0  = PB_5  | ALT0, // same pin used for alternate HW\n    PB_5_ALT1  = PB_5  | ALT1, // same pin used for alternate HW\n    PB_6       = 0x16,\n    PB_6_ALT0  = PB_6  | ALT0, // same pin used for alternate HW\n    PB_6_ALT1  = PB_6  | ALT1, // same pin used for alternate HW\n    PB_7       = 0x17,\n    PB_7_ALT0  = PB_7  | ALT0, // same pin used for alternate HW\n    PB_8       = 0x18,\n    PB_8_ALT0  = PB_8  | ALT0, // same pin used for alternate HW\n    PB_9       = 0x19,\n    PB_9_ALT0  = PB_9  | ALT0, // same pin used for alternate HW\n    PB_10      = 0x1A,\n    PB_11      = 0x1B,\n    PB_12      = 0x1C,\n    PB_13      = 0x1D,\n    PB_14      = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0, // same pin used for alternate HW\n    PB_14_ALT1 = PB_14 | ALT1, // same pin used for alternate HW\n    PB_15      = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0, // same pin used for alternate HW\n    PB_15_ALT1 = PB_15 | ALT1, // same pin used for alternate HW\n    PC_0       = 0x20,\n    PC_0_ALT0  = PC_0  | ALT0, // same pin used for alternate HW\n    PC_0_ALT1  = PC_0  | ALT1, // same pin used for alternate HW\n    PC_1       = 0x21,\n    PC_1_ALT0  = PC_1  | ALT0, // same pin used for alternate HW\n    PC_1_ALT1  = PC_1  | ALT1, // same pin used for alternate HW\n    PC_1_ALT2  = PC_1  | ALT2, // same pin used for alternate HW\n    PC_1_ALT3  = PC_1  | ALT3, // same pin used for alternate HW\n    PC_1_ALT4  = PC_1  | ALT4, // same pin used for alternate HW\n    PC_2       = 0x22,\n    PC_2C      = PC_2  | DUAL_PAD, // dual pad\n    PC_2C_ALT0 = PC_2C | ALT0, // same pin used for alternate HW\n    PC_3       = 0x23,\n    PC_3C      = PC_3  | DUAL_PAD, // dual pad\n    PC_4       = 0x24,\n    PC_4_ALT0  = PC_4  | ALT0, // same pin used for alternate HW\n    PC_5       = 0x25,\n    PC_5_ALT0  = PC_5  | ALT0, // same pin used for alternate HW\n    PC_5_ALT1  = PC_5  | ALT1, // same pin used for alternate HW\n    PC_5_ALT2  = PC_5  | ALT2, // same pin used for alternate HW\n    PC_6       = 0x26,\n    PC_6_ALT0  = PC_6  | ALT0, // same pin used for alternate HW\n    PC_7       = 0x27,\n    PC_7_ALT0  = PC_7  | ALT0, // same pin used for alternate HW\n    PC_8       = 0x28,\n    PC_8_ALT0  = PC_8  | ALT0, // same pin used for alternate HW\n    PC_9       = 0x29,\n    PC_9_ALT0  = PC_9  | ALT0, // same pin used for alternate HW\n    PC_10      = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0, // same pin used for alternate HW\n    PC_11      = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0, // same pin used for alternate HW\n    PC_12      = 0x2C,\n    PC_13      = 0x2D,\n    PC_14      = 0x2E,\n    PC_15      = 0x2F,\n    PD_0       = 0x30,\n    PD_1       = 0x31,\n    PD_2       = 0x32,\n    PD_3       = 0x33,\n    PD_4       = 0x34,\n    PD_5       = 0x35,\n    PD_6       = 0x36,\n    PD_7       = 0x37,\n    PD_8       = 0x38,\n    PD_9       = 0x39,\n    PD_10      = 0x3A,\n    PD_11      = 0x3B,\n    PD_12      = 0x3C,\n    PD_13      = 0x3D,\n    PD_14      = 0x3E,\n    PD_15      = 0x3F,\n    PE_0       = 0x40,\n    PE_1       = 0x41,\n    PE_2       = 0x42,\n    PE_3       = 0x43,\n    PE_4       = 0x44,\n    PE_5       = 0x45,\n    PE_6       = 0x46,\n    PE_7       = 0x47,\n    PE_8       = 0x48,\n    PE_9       = 0x49,\n    PE_10      = 0x4A,\n    PE_11      = 0x4B,\n    PE_12      = 0x4C,\n    PE_13      = 0x4D,\n    PE_14      = 0x4E,\n    PE_15      = 0x4F,\n    PF_0       = 0x50,\n    PF_1       = 0x51,\n    PF_2       = 0x52,\n    PF_3       = 0x53,\n    PF_4       = 0x54,\n    PF_4_ALT0  = PF_4  | ALT0, // same pin used for alternate HW\n    PF_5       = 0x55,\n    PF_6       = 0x56,\n    PF_6_ALT0  = PF_6  | ALT0, // same pin used for alternate HW\n    PF_7       = 0x57,\n    PF_8       = 0x58,\n    PF_8_ALT0  = PF_8  | ALT0, // same pin used for alternate HW\n    PF_9       = 0x59,\n    PF_9_ALT0  = PF_9  | ALT0, // same pin used for alternate HW\n    PF_10      = 0x5A,\n    PF_10_ALT0 = PF_10 | ALT0, // same pin used for alternate HW\n    PF_11      = 0x5B,\n    PF_12      = 0x5C,\n    PF_12_ALT0 = PF_12 | ALT0, // same pin used for alternate HW\n    PF_13      = 0x5D,\n    PF_14      = 0x5E,\n    PF_14_ALT0 = PF_14 | ALT0, // same pin used for alternate HW\n    PF_15      = 0x5F,\n    PG_0       = 0x60,\n    PG_1       = 0x61,\n    PG_2       = 0x62,\n    PG_3       = 0x63,\n    PG_4       = 0x64,\n    PG_5       = 0x65,\n    PG_6       = 0x66,\n    PG_7       = 0x67,\n    PG_8       = 0x68,\n    PG_9       = 0x69,\n    PG_10      = 0x6A,\n    PG_11      = 0x6B,\n    PG_12      = 0x6C,\n    PG_13      = 0x6D,\n    PG_14      = 0x6E,\n    PG_15      = 0x6F,\n    PH_0       = 0x70,\n    PH_1       = 0x71,\n\n    /**** ADC internal channels ****/\n\n    ADC_TEMP = 0xF0, // Internal pin virtual value\n    ADC_VREF = 0xF1, // Internal pin virtual value\n    ADC_VBAT = 0xF2, // Internal pin virtual value\n\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    CONSOLE_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    CONSOLE_TX = PA_9,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    CONSOLE_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    CONSOLE_RX = PA_10,\n#endif\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2C,\n    USB_OTG_HS_ULPI_NXT = PC_3C,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PG_8,\n    ETH_PPS_OUT_ALT0 = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD0_ALT0 = PG_13,\n    ETH_TXD1 = PB_13,\n    ETH_TXD1_ALT0 = PG_12,\n    ETH_TXD1_ALT1 = PG_14,\n    ETH_TXD2 = PC_2C,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3C,\n    ETH_TX_EN = PB_11,\n    ETH_TX_EN_ALT0 = PG_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    DEBUG_JTCK_SWCLK = PA_14,\n    DEBUG_JTDI = PA_15,\n    DEBUG_JTDO_SWO = PB_3,\n    DEBUG_JTMS_SWDIO = PA_13,\n    DEBUG_JTRST = PB_4,\n    DEBUG_TRACECLK = PE_2,\n    DEBUG_TRACED0 = PE_3,\n    DEBUG_TRACED0_ALT0 = PC_1,\n    DEBUG_TRACED0_ALT1 = PG_13,\n    DEBUG_TRACED1 = PE_4,\n    DEBUG_TRACED1_ALT0 = PC_8,\n    DEBUG_TRACED1_ALT1 = PG_14,\n    DEBUG_TRACED2 = PE_5,\n    DEBUG_TRACED2_ALT0 = PD_2,\n    DEBUG_TRACED3 = PE_6,\n    DEBUG_TRACED3_ALT0 = PC_12,\n    DEBUG_TRGIO = PC_7,\n    PWR_PVD_IN = PB_7,\n    PWR_WKUP0 = PA_0,\n    PWR_WKUP1 = PA_2,\n    PWR_WKUP2 = PC_13,\n    PWR_WKUP5 = PC_1,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n// Standardized LED and button names\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKRV3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n * SPDX-License-Identifier: BSD-3-Clause\n ******************************************************************************\n *\n * Copyright (c) 2015-2020 STMicroelectronics.\n * All rights reserved.\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n */\n\n/**\n  * This file configures the system clock as follows:\n  *--------------------------------------------------------------------\n  * System clock source   | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                       | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                       | 3- USE_PLL_HSI (internal 64 MHz clock)\n  *--------------------------------------------------------------------\n  * SYSCLK(MHz)           |            480\n  * AHBCLK (MHz)          |            240\n  * APB1CLK (MHz)         |            120\n  * APB2CLK (MHz)         |            120\n  * APB3CLK (MHz)         |            120\n  * APB4CLK (MHz)         |            120\n  * USB capable (48 MHz)  |            YES\n  *--------------------------------------------------------------------\n**/\n\n#include \"stm32h7xx.h\"\n#include \"mbed_error.h\"\n\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x00000 /*!< Vector Table base offset field. \n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\n\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock (MCO from STLink PCB part) */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                error(\"SetSysClock failed\\n\");\n            }\n        }\n    }\n}\n\n#define USE_HSI48   (0)\n#define USE_PLL1Q   (1)\n#define USE_PLL3Q   (2)\n#define USE_USBCLOCK    USE_PLL3Q\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\n uint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n    RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n    //RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n    /* Configure the main internal regulator output voltage */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);\n\n    while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n    /* Enable HSE Oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI48;\n    if (bypass) {\n        RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n    } else {\n        RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n    }\n    RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n#if HSE_VALUE==8000000\n    RCC_OscInitStruct.PLL.PLLM = 4;   // 2 MHz\n    RCC_OscInitStruct.PLL.PLLN = 480; // 960 MHz\n#elif HSE_VALUE==25000000\n    RCC_OscInitStruct.PLL.PLLM = 5;   // 5 MHz\n    RCC_OscInitStruct.PLL.PLLN = 192; // 960 MHz\n#else\n#error Unsupported externall clock value, check HSE_VALUE define\n#endif\n    RCC_OscInitStruct.PLL.PLLP = 2;   // PLLCLK = SYSCLK = 480 MHz\n    RCC_OscInitStruct.PLL.PLLQ = 4;  // PLL1Q used for FDCAN = 10 MHz\n    RCC_OscInitStruct.PLL.PLLR = 2;\n    RCC_OscInitStruct.PLL.PLLFRACN = 0;\n    RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;\n    RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure bus clocks dividers */\n    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                  RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 |\n                                  RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_D3PCLK1;\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n    RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n    RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if DEVICE_USBDEVICE\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    HAL_PWREx_EnableUSBVoltageDetector();\n#endif /* DEVICE_USBDEVICE */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n\n    /* Configure the main internal regulator output voltage */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n    while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n    // Enable HSI oscillator and activate PLL with HSI as source\n    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_CSI;\n    RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState = RCC_HSE_OFF;\n    RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n    RCC_OscInitStruct.PLL.PLLM = 8;    // 8 MHz\n    RCC_OscInitStruct.PLL.PLLN = 120;  // 960 MHz\n    RCC_OscInitStruct.PLL.PLLP = 2;    // 480 MHz\n    RCC_OscInitStruct.PLL.PLLQ = 96;   // PLL1Q used for FDCAN = 10 MHz\n    RCC_OscInitStruct.PLL.PLLR = 2;\n    RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;\n    RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure  bus clocks dividers */\n    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \\\n                                   RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n    RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n    RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKR_MINI_E3/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKR_MINI_E3/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n//  {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2 // Connected to STDIO_UART_TX\n//  {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3 // Connected to STDIO_UART_RX\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to LD2 [Green Led]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 2)}, // GPIO_Remap_I2C1\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM4 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM2_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM2_CH2\n//  {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM2_CH3 // Connected to STDIO_UART_TX\n//  {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM2_CH4 // Connected to STDIO_UART_RX\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM3_CH1\n    {PA_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM3_CH2\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM1_CH2\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM1_CH3\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM1_CH4\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM3_CH3\n    {PB_1,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM3_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 7, 2, 0)}, // TIM3_CH2\n//  {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 0)}, // TIM4_CH1\n//  {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 0)}, // TIM4_CH2\n//  {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 0)}, // TIM4_CH3\n//  {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 4, 0)}, // TIM4_CH4\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 8, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 2, 1)}, // TIM1_CH2N\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 0, 3, 1)}, // TIM1_CH3N\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 1, 0)}, // TIM3_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 2, 0)}, // TIM3_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 3, 0)}, // TIM3_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, 9, 4, 0)}, // TIM3_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_TX\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)}, // Connected to STDIO_UART_RX\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 3)}, // GPIO_Remap_USART1\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 0)},\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_INPUT, GPIO_PULLUP, 5)}, // GPIO_PartialRemap_USART3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, 0)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)}, // Connected to LD2 [Green Led]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1 // Connected to SWO\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 1)}, // GPIO_Remap_SPI1\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 10)}, // Remap CAN_RX to PB_8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 0)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, 10)}, // Remap CAN_TX to PB_9\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, 0)}, // USB_DP\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKR_MINI_E3/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_1  = 0x01,\n    PA_2  = 0x02,\n    PA_3  = 0x03,\n    PA_4  = 0x04,\n    PA_5  = 0x05,\n    PA_6  = 0x06,\n    PA_7  = 0x07,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n\n    PB_0  = 0x10,\n    PB_1  = 0x11,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_4  = 0x14,\n    PB_5  = 0x15,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_9  = 0x19,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_15 = 0x1F,\n\n    PC_0  = 0x20,\n    PC_1  = 0x21,\n    PC_2  = 0x22,\n    PC_3  = 0x23,\n    PC_4  = 0x24,\n    PC_5  = 0x25,\n    PC_6  = 0x26,\n    PC_7  = 0x27,\n    PC_8  = 0x28,\n    PC_9  = 0x29,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n\n    // Arduino connector namings\n    A0          = PA_0,\n    A1          = PA_1,\n    A2          = PA_4,\n    A3          = PB_0,\n    A4          = PC_1,\n    A5          = PC_0,\n    D0          = PA_3,\n    D1          = PA_2,\n    D2          = PA_10,\n    D3          = PB_3,\n    D4          = PB_5,\n    D5          = PB_4,\n    D6          = PB_10,\n    D7          = PA_8,\n    D8          = PA_9,\n    D9          = PC_7,\n    D10         = PB_6,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PA_5,\n    LED2        = PA_5,\n    LED3        = PA_5,\n    LED4        = PA_5,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX,\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX,\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8,\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB pins ****/\n    USB_DM = PA_11,\n    USB_DP = PA_12,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PD_0,\n    RCC_OSC_OUT = PD_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_TRACESWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_NJTRST = PB_4,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SKR_MINI_E3/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-------------------------------------------------------------------------------------------\n  * System clock source                | 1- PLL_HSE_EXTC  / DEVICE_USBDEVICE   | 3- PLL_HSI / DEVICE_USBDEVICE\n  *                                    | (external 8 MHz clock)                | (internal 8 MHz)\n  *                                    | 2- PLL_HSE_XTAL / DEVICE_USBDEVICE    |\n  *                                    | (external 8 MHz xtal)                 |\n  *-------------------------------------------------------------------------------------------\n  * SYSCLK(MHz)                        | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * AHBCLK (MHz)                       | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  * APB1CLK (MHz)                      | 36 / 36                               | 32 / 24\n  *-------------------------------------------------------------------------------------------\n  * APB2CLK (MHz)                      | 72 / 72                               | 64 / 48\n  *-------------------------------------------------------------------------------------------\n  */\n\n#include \"stm32f1xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x7000 /*!< Vector Table base offset field.\n                                  This value must be a multiple of 0x200. */\n\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_1); // 72 MHz or 64 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSEPredivValue      = RCC_HSE_PREDIV_DIV1;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL9; // 72 MHz (8 MHz * 9)\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 72 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 72 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 36 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 72 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n/******************************************************************************/\n/*            PLL (clocked by HSI) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSI(void)\n{\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n#if (DEVICE_USBDEVICE)\n    RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInit;\n#endif /* DEVICE_USBDEVICE */\n\n    /* Enable HSI oscillator and activate PLL with HSI as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSIState            = RCC_HSI_ON;\n    RCC_OscInitStruct.HSEState            = RCC_HSE_OFF;\n    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSI_DIV2;\n#if (DEVICE_USBDEVICE)\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL12; // 48 MHz (8 MHz/2 * 12)\n#else /* DEVICE_USBDEVICE */\n    RCC_OscInitStruct.PLL.PLLMUL          = RCC_PLL_MUL16; // 64 MHz (8 MHz/2 * 16)\n#endif /* DEVICE_USBDEVICE */\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if (DEVICE_USBDEVICE)\n    /* USB clock selection */\n    RCC_PeriphCLKInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n    RCC_PeriphCLKInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n    HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInit);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 64 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;         // 64 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;           // 32 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;           // 64 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSI, RCC_MCODIV_1); // 8 MHz\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_1 = (int)DAC_BASE\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE\n} UARTName;\n\n#define DEVICE_SPI_COUNT 4\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE,\n    SPI_4 = (int)SPI4_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE,\n    FMPI2C_1 = (int)FMPI2C1_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    QSPI_1 = (int)QSPI_R_BASE,\n} QSPIName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8 // Connected to LD1\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8 // Connected to LD1\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {PF_3,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC3_IN9\n    {PF_4,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC3_IN14\n    {PF_5,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC3_IN15\n    {PF_6,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC3_IN4\n    {PF_7,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC3_IN5\n    {PF_8,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC3_IN6\n    {PF_9,       ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC3_IN7\n    {PF_10,      ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC3_IN8\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_3,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PB_4,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to LD2 [Blue]\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_7,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PC_12,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PD_13,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_0,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_15,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)}, // Connected to USB_SOF [TP1]\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_6,       FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_12,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PD_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {PF_1,       I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PF_14,      FMPI2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_FMPI2C1)},\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1 // Connected to USB_SOF [TP1]\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to USB_VBUS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to USB_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to USB_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD1\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3 // Connected to LD1\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD1\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD2 [Blue]\n    {PB_8,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_8_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT1,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n    {PB_9_ALT0,  PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PB_9_ALT1,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N // Connected to LD3 [Red]\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1 // Connected to LD3 [Red]\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {PF_6,       PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PF_7,       PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1\n    {PF_8,       PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1\n    {PF_9,       PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_VBUS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n//  {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_10,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_TX\n    {PE_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_14,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to LD2 [Blue]\n//  {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_5,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n//  {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // STDIO UART\n    {PC_11,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to STDIO_UART_RX\n    {PE_7,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PG_9,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DP\n    {PA_15,      UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD3 [Red]\n    {PC_8,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_8,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_12,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to USB_DM\n    {PB_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to LD1\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_9,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_UART5)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PG_13,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PG_15,      UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)}, // Connected to LD1\n    {PB_2,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI3)},\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PC_1_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_6,       SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI3)},\n    {PE_6,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to LD3 [Red]\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_0,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_5,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_13,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to USB_VBUS\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_7,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PD_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PE_2,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_12,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_4,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PD_1,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF7_SPI2)},\n    {PE_4,       SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PE_11,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI4)},\n    {PG_14,      SPI_4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI4)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to USB_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** QUADSPI ***\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA0[] = {\n    {PC_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PD_11,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO0\n    {PF_8,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO0\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA1[] = {\n    {PC_10,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PD_12,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO1\n    {PF_9,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_IO1\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA2[] = {\n    {PE_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {PF_7,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO2\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_DATA3[] = {\n    {PA_1,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PD_13,     QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {PF_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_BK1_IO3\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SCLK[] = {\n    {PB_2,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {PD_3,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_QSPI)},  // QUADSPI_CLK\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_QSPI_SSEL[] = {\n    {PB_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS\n    {PG_6,      QSPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_QSPI)},  // QUADSPI_BK1_NCS // Connected to USB_PowerSwitchOn [STMPS2151STR_EN]\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF // Connected to USB_SOF [TP1]\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to USB_VBUS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to USB_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to USB_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to USB_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM // Connected to LD3 [Red]\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_11 = 0x2B,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // Arduino connector namings\n    A0          = PA_3,\n    A1          = PC_0,\n    A2          = PC_3,\n    A3          = PF_3,\n    A4          = PF_5,\n    A5          = PF_10,\n    D0          = PG_9,\n    D1          = PG_14,\n    D2          = PF_15,\n    D3          = PE_13,\n    D4          = PF_14,\n    D5          = PE_11,\n    D6          = PE_9,\n    D7          = PF_13,\n    D8          = PF_12,\n    D9          = PD_15,\n    D10         = PD_14,\n    D11         = PA_7,\n    D12         = PA_6,\n    D13         = PA_5,\n    D14         = PB_9,\n    D15         = PB_8,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PD_8,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PD_9,\n#endif\n\n    // Generic signals namings\n    LED1        = PB_0,\n    LED2        = PB_7,\n    LED3        = PB_14,\n    LED4        = LED1,\n    LED_RED     = LED3,\n    USER_BUTTON = PC_13,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, // Virtual Com Port\n    CONSOLE_RX   = STDIO_UART_RX, // Virtual Com Port\n    //USBTX       = STDIO_UART_TX, // Virtual Com Port\n    //USBRX       = STDIO_UART_RX, // Virtual Com Port\n    I2C_SCL     = D15,\n    I2C_SDA     = D14,\n    SPI_MOSI    = D11,\n    SPI_MISO    = D12,\n    SPI_SCK     = D13,\n    SPI_CS      = D10,\n    PWM_OUT     = D9,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_2,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED0_ALT0 = PC_8,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED1_ALT0 = PD_3,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED2_ALT0 = PG_13,\n    SYS_TRACED3 = PE_6,\n    SYS_TRACED3_ALT0 = PG_14,\n    SYS_WKUP0 = PA_0,\n    SYS_WKUP1 = PC_13,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 12 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 12 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 180\n  * AHBCLK (MHz)        | 180\n  * APB1CLK (MHz)       |  45\n  * APB2CLK (MHz)       |  90\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n#define VECT_TAB_OFFSET  0x8000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC 0x8 // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL 0x4 // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI      0x2 // Use HSI internal clock\n\n//#define DEBUG_MCO        (1) // Output the MCO1/MCO2 on PA8/PC9 for debugging (0=OFF, 1=ON)\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\n\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    // Output clock on MCO2 pin(PC9) for debugging purpose\n#if DEBUG_MCO == 1\n    HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_4);\n#endif\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n    /* Enable Power Control clock */\n    __HAL_RCC_PWR_CLK_ENABLE();\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.PLL.PLLState  = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM = 6;             \n    RCC_OscInitStruct.PLL.PLLN = 180;           \n    RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; \n    RCC_OscInitStruct.PLL.PLLQ = 7;             \n    RCC_OscInitStruct.PLL.PLLR = 2;             \n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Activate the OverDrive to reach the 180 MHz Frequency\n    if (HAL_PWREx_EnableOverDrive() != HAL_OK) {\n        return 0; // FAIL\n    }\n\n#if DEVICE_USBDEVICE\n    // Select PLLSAI output as USB clock source\n    PeriphClkInitStruct.PLLSAI.PLLSAIM = 6;\n    PeriphClkInitStruct.PLLSAI.PLLSAIN = 96;\n    PeriphClkInitStruct.PLLSAI.PLLSAIP = RCC_PLLSAIP_DIV4;\n    PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n    PeriphClkInitStruct.Clk48ClockSelection = RCC_CLK48CLKSOURCE_PLLSAIP;\n    HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n#endif /* DEVICE_USBDEVICE */\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 180 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  //  45 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  //  90 MHz\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    // Output clock on MCO1 pin(PA8) for debugging purpose\n#if DEBUG_MCO == 1\n    if (bypass == 0) {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2);    // 4 MHz with xtal\n    } else {\n        HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1);    // 8 MHz with external clock (MCO)\n    }\n#endif\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER_KING/PeripheralNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2014, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n#ifndef MBED_PERIPHERALNAMES_H\n#define MBED_PERIPHERALNAMES_H\n\n#include \"cmsis.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ADC_1 = (int)ADC1_BASE,\n    ADC_2 = (int)ADC2_BASE,\n    ADC_3 = (int)ADC3_BASE\n} ADCName;\n\ntypedef enum {\n    DAC_0 = 0,\n    DAC_1\n} DACName;\n\ntypedef enum {\n    UART_1 = (int)USART1_BASE,\n    UART_2 = (int)USART2_BASE,\n    UART_3 = (int)USART3_BASE,\n    UART_4 = (int)UART4_BASE,\n    UART_5 = (int)UART5_BASE,\n    UART_6 = (int)USART6_BASE,\n} UARTName;\n\n#define DEVICE_SPI_COUNT 3\ntypedef enum {\n    SPI_1 = (int)SPI1_BASE,\n    SPI_2 = (int)SPI2_BASE,\n    SPI_3 = (int)SPI3_BASE\n} SPIName;\n\ntypedef enum {\n    I2C_1 = (int)I2C1_BASE,\n    I2C_2 = (int)I2C2_BASE,\n    I2C_3 = (int)I2C3_BASE\n} I2CName;\n\ntypedef enum {\n    PWM_1  = (int)TIM1_BASE,\n    PWM_2  = (int)TIM2_BASE,\n    PWM_3  = (int)TIM3_BASE,\n    PWM_4  = (int)TIM4_BASE,\n    PWM_5  = (int)TIM5_BASE,\n    PWM_8  = (int)TIM8_BASE,\n    PWM_9  = (int)TIM9_BASE,\n    PWM_10 = (int)TIM10_BASE,\n    PWM_11 = (int)TIM11_BASE,\n    PWM_12 = (int)TIM12_BASE,\n    PWM_13 = (int)TIM13_BASE,\n    PWM_14 = (int)TIM14_BASE\n} PWMName;\n\ntypedef enum {\n    CAN_1 = (int)CAN1_BASE,\n    CAN_2 = (int)CAN2_BASE\n} CANName;\n\ntypedef enum {\n    USB_FS = (int)USB_OTG_FS_PERIPH_BASE,\n    USB_HS = (int)USB_OTG_HS_PERIPH_BASE\n} USBName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER_KING/PeripheralPins.c",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#include \"PeripheralPins.h\"\n#include \"mbed_toolchain.h\"\n\n//==============================================================================\n// Notes\n//\n// - The pins mentioned Px_y_ALTz are alternative possibilities which use other\n//   HW peripheral instances. You can use them the same way as any other \"normal\"\n//   pin (i.e. PwmOut pwm(PA_7_ALT0);). These pins are not displayed on the board\n//   pinout image on mbed.org.\n//\n// - The pins which are connected to other components present on the board have\n//   the comment \"Connected to xxx\". The pin function may not work properly in this\n//   case. These pins may not be displayed on the board pinout image on mbed.org.\n//   Please read the board reference manual and schematic for more information.\n//\n// - Warning: pins connected to the default STDIO_UART_TX and STDIO_UART_RX pins are commented\n//   See https://os.mbed.com/teams/ST/wiki/STDIO for more information.\n//\n//==============================================================================\n\n\n//*** ADC ***\n\nMBED_WEAK const PinMap PinMap_ADC[] = {\n    {PA_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC1_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC2_IN0 // Connected to B1 [Blue PushButton]\n    {PA_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 0, 0)}, // ADC3_IN0 // Connected to B1 [Blue PushButton]\n    {PA_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC1_IN1\n    {PA_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC2_IN1\n    {PA_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // ADC3_IN1\n    {PA_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC1_IN2\n    {PA_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC2_IN2\n    {PA_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // ADC3_IN2\n    {PA_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC1_IN3\n    {PA_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC2_IN3\n    {PA_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 3, 0)}, // ADC3_IN3\n    {PA_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC1_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 4, 0)}, // ADC2_IN4 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC1_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 5, 0)}, // ADC2_IN5 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC1_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 6, 0)}, // ADC2_IN6 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC1_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 7, 0)}, // ADC2_IN7 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC1_IN8\n    {PB_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 8, 0)}, // ADC2_IN8\n    {PB_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC1_IN9\n    {PB_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 9, 0)}, // ADC2_IN9\n    {PC_0,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC1_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC2_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_0_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 10, 0)}, // ADC3_IN10 // Connected to OTG_FS_PowerSwitchOn\n    {PC_1,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC1_IN11\n    {PC_1_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC2_IN11\n    {PC_1_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 11, 0)}, // ADC3_IN11\n    {PC_2,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC1_IN12\n    {PC_2_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC2_IN12\n    {PC_2_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 12, 0)}, // ADC3_IN12\n    {PC_3,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC1_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC2_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_3_ALT1,  ADC_3, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 13, 0)}, // ADC3_IN13 // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_4,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC1_IN14\n    {PC_4_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 14, 0)}, // ADC2_IN14\n    {PC_5,       ADC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC1_IN15\n    {PC_5_ALT0,  ADC_2, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 15, 0)}, // ADC2_IN15\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_ADC_Internal[] = {\n    {ADC_TEMP,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 16, 0)},\n    {ADC_VREF,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 17, 0)},\n    {ADC_VBAT,   ADC_1,    STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 18, 0)},\n    {NC, NC, 0}\n};\n\n//*** DAC ***\n\nMBED_WEAK const PinMap PinMap_DAC[] = {\n    {PA_4,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 1, 0)}, // DAC_OUT1 // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_5,       DAC_1, STM_PIN_DATA_EXT(STM_MODE_ANALOG, GPIO_NOPULL, 0, 2, 0)}, // DAC_OUT2 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {NC, NC, 0}\n};\n\n//*** I2C ***\n\nMBED_WEAK const PinMap PinMap_I2C_SDA[] = {\n    {PB_7,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_9,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_11,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)},\n    {PC_9,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_I2C_SCL[] = {\n    {PA_8,       I2C_3, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C3)},\n    {PB_6,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_8,       I2C_1, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C1)},\n    {PB_10,      I2C_2, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_NOPULL, GPIO_AF4_I2C2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {NC, NC, 0}\n};\n\n//*** PWM ***\n\n// TIM5 cannot be used because already used by the us_ticker\nMBED_WEAK const PinMap PinMap_PWM[] = {\n    {PA_0,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to B1 [Blue PushButton]\n//  {PA_0,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 1, 0)}, // TIM5_CH1 // Connected to B1 [Blue PushButton]\n    {PA_1,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2\n//  {PA_1,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 2, 0)}, // TIM5_CH2\n    {PA_2,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3\n//  {PA_2,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 3, 0)}, // TIM5_CH3\n    {PA_2_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PA_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n//  {PA_3,       PWM_5,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM5, 4, 0)}, // TIM5_CH4\n    {PA_3_ALT0,  PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PA_5,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1 // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_5_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PA_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_6_ALT0,  PWM_13, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM13, 1, 0)}, // TIM13_CH1 // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PA_7,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 1)}, // TIM8_CH1N // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_7_ALT2,  PWM_14, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM14, 1, 0)}, // TIM14_CH1 // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PA_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PA_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2 // Connected to VBUS_FS\n    {PA_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3 // Connected to OTG_FS_ID\n    {PA_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4 // Connected to OTG_FS_DM\n    {PA_15,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 1, 0)}, // TIM2_CH1\n    {PB_0,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_0_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PB_0_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_1,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_1_ALT0,  PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PB_1_ALT1,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_3,       PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 2, 0)}, // TIM2_CH2 // Connected to SWO\n    {PB_4,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PB_5,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2\n    {PB_6,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_7,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2\n    {PB_8,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3\n    {PB_8_ALT0,  PWM_10, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM10, 1, 0)}, // TIM10_CH1\n    {PB_9,       PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_9_ALT0,  PWM_11, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM11, 1, 0)}, // TIM11_CH1 // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_10,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 3, 0)}, // TIM2_CH3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,      PWM_2,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM2, 4, 0)}, // TIM2_CH4\n    {PB_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PB_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PB_14_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 1)}, // TIM8_CH2N\n    {PB_14_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 1, 0)}, // TIM12_CH1\n    {PB_15,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PB_15_ALT0, PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 1)}, // TIM8_CH3N\n    {PB_15_ALT1, PWM_12, STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF9_TIM12, 2, 0)}, // TIM12_CH2\n    {PC_6,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 1, 0)}, // TIM3_CH1\n    {PC_6_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 1, 0)}, // TIM8_CH1\n    {PC_7,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 2, 0)}, // TIM3_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_7_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 2, 0)}, // TIM8_CH2 // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_8,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 3, 0)}, // TIM3_CH3\n    {PC_8_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 3, 0)}, // TIM8_CH3\n    {PC_9,       PWM_3,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM3, 4, 0)}, // TIM3_CH4\n    {PC_9_ALT0,  PWM_8,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM8, 4, 0)}, // TIM8_CH4\n    {PD_12,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 1, 0)}, // TIM4_CH1 // Connected to LD4 [Green Led]\n    {PD_13,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 2, 0)}, // TIM4_CH2 // Connected to LD3 [Orange Led]\n    {PD_14,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 3, 0)}, // TIM4_CH3 // Connected to LD5 [Red Led]\n    {PD_15,      PWM_4,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF2_TIM4, 4, 0)}, // TIM4_CH4 // Connected to LD6 [Blue Led]\n    {PE_5,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 1, 0)}, // TIM9_CH1\n    {PE_6,       PWM_9,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_TIM9, 2, 0)}, // TIM9_CH2\n    {PE_8,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 1)}, // TIM1_CH1N\n    {PE_9,       PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 1, 0)}, // TIM1_CH1\n    {PE_10,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 1)}, // TIM1_CH2N\n    {PE_11,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 2, 0)}, // TIM1_CH2\n    {PE_12,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 1)}, // TIM1_CH3N\n    {PE_13,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 3, 0)}, // TIM1_CH3\n    {PE_14,      PWM_1,  STM_PIN_DATA_EXT(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF1_TIM1, 4, 0)}, // TIM1_CH4\n    {NC, NC, 0}\n};\n\n//*** SERIAL ***\n\nMBED_WEAK const PinMap PinMap_UART_TX[] = {\n    {PA_0,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to B1 [Blue PushButton]\n    {PA_2,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_9,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to VBUS_FS\n    {PB_6,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PC_6,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)},\n    {PC_10,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_10_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {PC_12,      UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {PD_5,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to OTG_FS_OverCurrent\n    {PD_8,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RX[] = {\n    {PA_1,       UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PA_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_10,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_ID\n    {PB_7,       UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},\n    {PB_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_7,       UART_6,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_USART6)}, // Connected to I2S3_MCK [CS43L22_MCLK]\n    {PC_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PC_11_ALT0, UART_4,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)},\n    {PD_2,       UART_5,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART5)},\n    {PD_6,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_9,       UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_RTS[] = {\n    {PA_1,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PA_12,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DP\n    {PB_14,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_4,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to Audio_RST [CS43L22_RESET]\n    {PD_12,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)}, // Connected to LD4 [Green Led]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_UART_CTS[] = {\n    {PA_0,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // Connected to B1 [Blue PushButton]\n    {PA_11,      UART_1,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)}, // Connected to OTG_FS_DM\n    {PB_13,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {PD_3,       UART_2,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)},\n    {PD_11,      UART_3,  STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART3)},\n    {NC, NC, 0}\n};\n\n//*** SPI ***\n\nMBED_WEAK const PinMap PinMap_SPI_MOSI[] = {\n    {PA_7,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MOSI [LIS302DL_SDA/SDI/SDO]\n    {PB_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_5_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_15,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_3,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to PDM_OUT [MP45DT02_DOUT]\n    {PC_12,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SD [CS43L22_SDIN]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_MISO[] = {\n    {PA_6,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_MISO [LIS302DL_SDO]\n    {PB_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PB_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_14,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_2,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_11,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SCLK[] = {\n    {PA_5,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_3,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to SWO\n    {PB_3_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to SWO\n    {PB_10,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_13,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {PC_10,      SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_SCK [CS43L22_SCLK]\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_SPI_SSEL[] = {\n    {PA_4,       SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_4_ALT0,  SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)}, // Connected to I2S3_WS [CS43L22_LRCK]\n    {PA_15,      SPI_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI1)},\n    {PA_15_ALT0, SPI_3, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF6_SPI3)},\n    {PB_9,       SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_12,      SPI_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF5_SPI2)},\n    {NC, NC, 0}\n};\n\n//*** CAN ***\n\nMBED_WEAK const PinMap PinMap_CAN_RD[] = {\n    {PA_11,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DM\n    {PB_5,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PB_8,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {PB_12,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_0,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\nMBED_WEAK const PinMap PinMap_CAN_TD[] = {\n    {PA_12,      CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to OTG_FS_DP\n    {PB_6,       CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)}, // Connected to Audio_SCL [CS43L22_SCL]\n    {PB_9,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)}, // Connected to Audio_SDA [CS43L22_SDA]\n    {PB_13,      CAN_2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN2)},\n    {PD_1,       CAN_1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_NOPULL, GPIO_AF9_CAN1)},\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_FS[] = {\n//  {PA_8,      USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_SOF\n    {PA_9,      USB_FS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_FS_VBUS // Connected to VBUS_FS\n    {PA_10,     USB_FS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_ID // Connected to OTG_FS_ID\n    {PA_11,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DM // Connected to OTG_FS_DM\n    {PA_12,     USB_FS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_FS)}, // USB_OTG_FS_DP // Connected to OTG_FS_DP\n    {NC, NC, 0}\n};\n\n//*** USBDEVICE ***\n\nMBED_WEAK const PinMap PinMap_USB_HS[] = {\n#if (MBED_CONF_TARGET_USB_SPEED == USE_USB_HS_IN_FS)\n//  {PA_4,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_SOF // Connected to I2S3_WS [CS43L22_LRCK]\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_OD, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_ID\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_INPUT, GPIO_NOPULL, GPIO_AF_NONE)}, // USB_OTG_HS_VBUS\n    {PB_14,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DM\n    {PB_15,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF12_OTG_HS_FS)}, // USB_OTG_HS_DP\n#else /* MBED_CONF_TARGET_USB_SPEED */\n    {PA_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D0\n    {PA_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_CK // Connected to SPI1_SCK [LIS302DL_SCL/SPC]\n    {PB_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D1\n    {PB_1,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D2\n    {PB_5,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D7\n    {PB_10,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D3 // Connected to CLK_IN [MP45DT02_CLK]\n    {PB_11,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D4\n    {PB_12,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D5\n    {PB_13,     USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_D6\n    {PC_0,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_STP // Connected to OTG_FS_PowerSwitchOn\n    {PC_2,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_DIR\n    {PC_3,      USB_HS, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF10_OTG_HS)}, // USB_OTG_HS_ULPI_NXT // Connected to PDM_OUT [MP45DT02_DOUT]\n#endif /* MBED_CONF_TARGET_USB_SPEED */\n    {NC, NC, 0}\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER_KING/PinNames.h",
    "content": "/* mbed Microcontroller Library\n *******************************************************************************\n * Copyright (c) 2018, STMicroelectronics\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n *    this list of conditions and the following disclaimer in the documentation\n *    and/or other materials provided with the distribution.\n * 3. Neither the name of STMicroelectronics nor the names of its contributors\n *    may be used to endorse or promote products derived from this software\n *    without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *******************************************************************************\n */\n\n#ifndef MBED_PINNAMES_H\n#define MBED_PINNAMES_H\n\n#include \"cmsis.h\"\n#include \"PinNamesTypes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef enum {\n    ALT0  = 0x100,\n    ALT1  = 0x200,\n    ALT2  = 0x300,\n    ALT3  = 0x400\n} ALTx;\n\ntypedef enum {\n    PA_0  = 0x00,\n    PA_0_ALT0 = PA_0 | ALT0,\n    PA_0_ALT1 = PA_0 | ALT1,\n    PA_1  = 0x01,\n    PA_1_ALT0 = PA_1 | ALT0,\n    PA_1_ALT1 = PA_1 | ALT1,\n    PA_2  = 0x02,\n    PA_2_ALT0 = PA_2 | ALT0,\n    PA_2_ALT1 = PA_2 | ALT1,\n    PA_3  = 0x03,\n    PA_3_ALT0 = PA_3 | ALT0,\n    PA_3_ALT1 = PA_3 | ALT1,\n    PA_4  = 0x04,\n    PA_4_ALT0 = PA_4 | ALT0,\n    PA_5  = 0x05,\n    PA_5_ALT0 = PA_5 | ALT0,\n    PA_6  = 0x06,\n    PA_6_ALT0 = PA_6 | ALT0,\n    PA_7  = 0x07,\n    PA_7_ALT0 = PA_7 | ALT0,\n    PA_7_ALT1 = PA_7 | ALT1,\n    PA_7_ALT2 = PA_7 | ALT2,\n    PA_8  = 0x08,\n    PA_9  = 0x09,\n    PA_10 = 0x0A,\n    PA_11 = 0x0B,\n    PA_12 = 0x0C,\n    PA_13 = 0x0D,\n    PA_14 = 0x0E,\n    PA_15 = 0x0F,\n    PA_15_ALT0 = PA_15 | ALT0,\n\n    PB_0  = 0x10,\n    PB_0_ALT0 = PB_0 | ALT0,\n    PB_0_ALT1 = PB_0 | ALT1,\n    PB_1  = 0x11,\n    PB_1_ALT0 = PB_1 | ALT0,\n    PB_1_ALT1 = PB_1 | ALT1,\n    PB_2  = 0x12,\n    PB_3  = 0x13,\n    PB_3_ALT0 = PB_3 | ALT0,\n    PB_4  = 0x14,\n    PB_4_ALT0 = PB_4 | ALT0,\n    PB_4_ALT1 = PB_4 | ALT1,\n    PB_5  = 0x15,\n    PB_5_ALT0 = PB_5 | ALT0,\n    PB_5_ALT1 = PB_5 | ALT1,\n    PB_6  = 0x16,\n    PB_7  = 0x17,\n    PB_8  = 0x18,\n    PB_8_ALT0 = PB_8 | ALT0,\n    PB_8_ALT1 = PB_8 | ALT1,\n    PB_9  = 0x19,\n    PB_9_ALT0 = PB_9 | ALT0,\n    PB_9_ALT1 = PB_9 | ALT1,\n    PB_10 = 0x1A,\n    PB_11 = 0x1B,\n    PB_12 = 0x1C,\n    PB_13 = 0x1D,\n    PB_14 = 0x1E,\n    PB_14_ALT0 = PB_14 | ALT0,\n    PB_14_ALT1 = PB_14 | ALT1,\n    PB_15 = 0x1F,\n    PB_15_ALT0 = PB_15 | ALT0,\n    PB_15_ALT1 = PB_15 | ALT1,\n\n    PC_0  = 0x20,\n    PC_0_ALT0 = PC_0 | ALT0,\n    PC_0_ALT1 = PC_0 | ALT1,\n    PC_1  = 0x21,\n    PC_1_ALT0 = PC_1 | ALT0,\n    PC_1_ALT1 = PC_1 | ALT1,\n    PC_2  = 0x22,\n    PC_2_ALT0 = PC_2 | ALT0,\n    PC_2_ALT1 = PC_2 | ALT1,\n    PC_3  = 0x23,\n    PC_3_ALT0 = PC_3 | ALT0,\n    PC_3_ALT1 = PC_3 | ALT1,\n    PC_4  = 0x24,\n    PC_4_ALT0 = PC_4 | ALT0,\n    PC_5  = 0x25,\n    PC_5_ALT0 = PC_5 | ALT0,\n    PC_6  = 0x26,\n    PC_6_ALT0 = PC_6 | ALT0,\n    PC_7  = 0x27,\n    PC_7_ALT0 = PC_7 | ALT0,\n    PC_8  = 0x28,\n    PC_8_ALT0 = PC_8 | ALT0,\n    PC_9  = 0x29,\n    PC_9_ALT0 = PC_9 | ALT0,\n    PC_10 = 0x2A,\n    PC_10_ALT0 = PC_10 | ALT0,\n    PC_11 = 0x2B,\n    PC_11_ALT0 = PC_11 | ALT0,\n    PC_12 = 0x2C,\n    PC_13 = 0x2D,\n    PC_14 = 0x2E,\n    PC_15 = 0x2F,\n\n    PD_0  = 0x30,\n    PD_1  = 0x31,\n    PD_2  = 0x32,\n    PD_3  = 0x33,\n    PD_4  = 0x34,\n    PD_5  = 0x35,\n    PD_6  = 0x36,\n    PD_7  = 0x37,\n    PD_8  = 0x38,\n    PD_9  = 0x39,\n    PD_10 = 0x3A,\n    PD_11 = 0x3B,\n    PD_12 = 0x3C,\n    PD_13 = 0x3D,\n    PD_14 = 0x3E,\n    PD_15 = 0x3F,\n\n    PE_0  = 0x40,\n    PE_1  = 0x41,\n    PE_2  = 0x42,\n    PE_3  = 0x43,\n    PE_4  = 0x44,\n    PE_5  = 0x45,\n    PE_6  = 0x46,\n    PE_7  = 0x47,\n    PE_8  = 0x48,\n    PE_9  = 0x49,\n    PE_10 = 0x4A,\n    PE_11 = 0x4B,\n    PE_12 = 0x4C,\n    PE_13 = 0x4D,\n    PE_14 = 0x4E,\n    PE_15 = 0x4F,\n\n    PF_0  = 0x50,\n    PF_1  = 0x51,\n    PF_2  = 0x52,\n    PF_3  = 0x53,\n    PF_4  = 0x54,\n    PF_5  = 0x55,\n    PF_6  = 0x56,\n    PF_7  = 0x57,\n    PF_8  = 0x58,\n    PF_9  = 0x59,\n    PF_10 = 0x5A,\n    PF_11 = 0x5B,\n    PF_12 = 0x5C,\n    PF_13 = 0x5D,\n    PF_14 = 0x5E,\n    PF_15 = 0x5F,\n\n    PG_0  = 0x60,\n    PG_1  = 0x61,\n    PG_2  = 0x62,\n    PG_3  = 0x63,\n    PG_4  = 0x64,\n    PG_5  = 0x65,\n    PG_6  = 0x66,\n    PG_7  = 0x67,\n    PG_8  = 0x68,\n    PG_9  = 0x69,\n    PG_10 = 0x6A,\n    PG_11 = 0x6B,\n    PG_12 = 0x6C,\n    PG_13 = 0x6D,\n    PG_14 = 0x6E,\n    PG_15 = 0x6F,\n\n    PH_0  = 0x70,\n    PH_1  = 0x71,\n    PH_2  = 0x72,\n    PH_3  = 0x73,\n    PH_4  = 0x74,\n    PH_5  = 0x75,\n    PH_6  = 0x76,\n    PH_7  = 0x77,\n    PH_8  = 0x78,\n    PH_9  = 0x79,\n    PH_10 = 0x7A,\n    PH_11 = 0x7B,\n    PH_12 = 0x7C,\n    PH_13 = 0x7D,\n    PH_14 = 0x7E,\n    PH_15 = 0x7F,\n\n    PI_0  = 0x80,\n    PI_1  = 0x81,\n    PI_2  = 0x82,\n    PI_3  = 0x83,\n    PI_4  = 0x84,\n    PI_5  = 0x85,\n    PI_6  = 0x86,\n    PI_7  = 0x87,\n    PI_8  = 0x88,\n    PI_9  = 0x89,\n    PI_10 = 0x8A,\n    PI_11 = 0x8B,\n    PI_12 = 0x8C,\n    PI_13 = 0x8D,\n    PI_14 = 0x8E,\n    PI_15 = 0x8F,\n\n    // ADC internal channels\n    ADC_TEMP = 0xF0,\n    ADC_VREF = 0xF1,\n    ADC_VBAT = 0xF2,\n\n    // STDIO for console print\n#ifdef MBED_CONF_TARGET_STDIO_UART_TX\n    STDIO_UART_TX = MBED_CONF_TARGET_STDIO_UART_TX,\n#else\n    STDIO_UART_TX = PA_2,\n#endif\n#ifdef MBED_CONF_TARGET_STDIO_UART_RX\n    STDIO_UART_RX = MBED_CONF_TARGET_STDIO_UART_RX,\n#else\n    STDIO_UART_RX = PA_3,\n#endif\n\n    // Generic signals namings\n    LED1        = PD_13, // LD3 as LD1 is not a user LED\n    LED2        = PD_12, // LD4 as LD2 is not a user LED\n    LED3        = PD_13, // orange\n    LED4        = PD_12, // green\n    LED5        = PD_14, // red\n    LED6        = PD_15, // blue\n    LED_RED     = LED5,\n    USER_BUTTON = PA_0,\n    // Standardized button names\n    BUTTON1 = USER_BUTTON,\n    CONSOLE_TX   = STDIO_UART_TX, /* USART2 */\n    CONSOLE_RX   = STDIO_UART_RX,\n    //USBTX       = STDIO_UART_TX, /* USART2 */\n    //USBRX       = STDIO_UART_RX,\n    I2C_SCL     = PB_8, /* I2C1 */\n    I2C_SDA     = PB_9,\n    SPI_MOSI    = PA_7,\n    SPI_MISO    = PA_6,\n    SPI_SCK     = PA_5,\n    SPI_CS      = PB_6,\n    PWM_OUT     = PB_3,\n\n    /**** USB FS pins ****/\n    USB_OTG_FS_DM = PA_11,\n    USB_OTG_FS_DP = PA_12,\n    USB_OTG_FS_ID = PA_10,\n    USB_OTG_FS_SOF = PA_8,\n    USB_OTG_FS_VBUS = PA_9,\n\n    /**** USB HS pins ****/\n    USB_OTG_HS_DM = PB_14,\n    USB_OTG_HS_DP = PB_15,\n    USB_OTG_HS_ID = PB_12,\n    USB_OTG_HS_SOF = PA_4,\n    USB_OTG_HS_ULPI_CK = PA_5,\n    USB_OTG_HS_ULPI_D0 = PA_3,\n    USB_OTG_HS_ULPI_D1 = PB_0,\n    USB_OTG_HS_ULPI_D2 = PB_1,\n    USB_OTG_HS_ULPI_D3 = PB_10,\n    USB_OTG_HS_ULPI_D4 = PB_11,\n    USB_OTG_HS_ULPI_D5 = PB_12,\n    USB_OTG_HS_ULPI_D6 = PB_13,\n    USB_OTG_HS_ULPI_D7 = PB_5,\n    USB_OTG_HS_ULPI_DIR = PC_2,\n    USB_OTG_HS_ULPI_NXT = PC_3,\n    USB_OTG_HS_ULPI_STP = PC_0,\n    USB_OTG_HS_VBUS = PB_13,\n\n    /**** ETHERNET pins ****/\n    ETH_COL = PA_3,\n    ETH_CRS = PA_0,\n    ETH_CRS_DV = PA_7,\n    ETH_MDC = PC_1,\n    ETH_MDIO = PA_2,\n    ETH_PPS_OUT = PB_5,\n    ETH_REF_CLK = PA_1,\n    ETH_RXD0 = PC_4,\n    ETH_RXD1 = PC_5,\n    ETH_RXD2 = PB_0,\n    ETH_RXD3 = PB_1,\n    ETH_RX_CLK = PA_1,\n    ETH_RX_DV = PA_7,\n    ETH_RX_ER = PB_10,\n    ETH_TXD0 = PB_12,\n    ETH_TXD1 = PB_13,\n    ETH_TXD2 = PC_2,\n    ETH_TXD3 = PE_2,\n    ETH_TXD3_ALT0 = PB_8,\n    ETH_TX_CLK = PC_3,\n    ETH_TX_EN = PB_11,\n\n    /**** OSCILLATOR pins ****/\n    RCC_OSC32_IN = PC_14,\n    RCC_OSC32_OUT = PC_15,\n    RCC_OSC_IN = PH_0,\n    RCC_OSC_OUT = PH_1,\n\n    /**** DEBUG pins ****/\n    SYS_JTCK_SWCLK = PA_14,\n    SYS_JTDI = PA_15,\n    SYS_JTDO_SWO = PB_3,\n    SYS_JTMS_SWDIO = PA_13,\n    SYS_JTRST = PB_4,\n    SYS_TRACECLK = PE_2,\n    SYS_TRACED0 = PE_3,\n    SYS_TRACED1 = PE_4,\n    SYS_TRACED2 = PE_5,\n    SYS_TRACED3 = PE_6,\n    SYS_WKUP = PA_0,\n\n    // Not connected\n    NC = (int)0xFFFFFFFF\n} PinName;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_SPIDER_KING/system_clock.c",
    "content": "/* mbed Microcontroller Library\n* Copyright (c) 2006-2017 ARM Limited\n*\n* Licensed under the Apache License, Version 2.0 (the \"License\");\n* you may not use this file except in compliance with the License.\n* You may obtain a copy of the License at\n*\n*     http://www.apache.org/licenses/LICENSE-2.0\n*\n* Unless required by applicable law or agreed to in writing, software\n* distributed under the License is distributed on an \"AS IS\" BASIS,\n* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n* See the License for the specific language governing permissions and\n* limitations under the License.\n*/\n\n/**\n  * This file configures the system clock as follows:\n  *-----------------------------------------------------------------------------\n  * System clock source | 1- USE_PLL_HSE_EXTC (external 8 MHz clock)\n  *                     | 2- USE_PLL_HSE_XTAL (external 8 MHz xtal)\n  *                     | 3- USE_PLL_HSI (internal 16 MHz)\n  *-----------------------------------------------------------------------------\n  * SYSCLK(MHz)         | 168\n  * AHBCLK (MHz)        | 168\n  * APB1CLK (MHz)       | 42\n  * APB2CLK (MHz)       | 84\n  * USB capable         | YES\n  *-----------------------------------------------------------------------------\n**/\n\n#include \"stm32f4xx.h\"\n#include \"mbed_error.h\"\n\n/*!< Uncomment the following line if you need to relocate your vector Table in\n     Internal SRAM. */\n/* #define VECT_TAB_SRAM */\n//#define VECT_TAB_OFFSET  0x8000\n#define VECT_TAB_OFFSET  0x0000 /*!< Vector Table base offset field.\n                                   This value must be a multiple of 0x200. */\n\n\n// clock source is selected with CLOCK_SOURCE in json config\n#define USE_PLL_HSE_EXTC     0x8  // Use external clock (ST Link MCO)\n#define USE_PLL_HSE_XTAL     0x4  // Use external xtal (X3 on board - not provided by default)\n#define USE_PLL_HSI          0x2  // Use HSI internal clock\n\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\nuint8_t SetSysClock_PLL_HSI(void);\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSI) */\n\n\n/**\n  * @brief  Setup the microcontroller system\n  *         Initialize the FPU setting, vector table location and External memory\n  *         configuration.\n  * @param  None\n  * @retval None\n  */\nvoid SystemInit(void)\n{\n    /* FPU settings ------------------------------------------------------------*/\n#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10 and CP11 Full Access */\n#endif\n    /* Reset the RCC clock configuration to the default reset state ------------*/\n    /* Set HSION bit */\n    RCC->CR |= (uint32_t)0x00000001;\n\n    /* Reset CFGR register */\n    RCC->CFGR = 0x00000000;\n\n    /* Reset HSEON, CSSON and PLLON bits */\n    RCC->CR &= (uint32_t)0xFEF6FFFF;\n\n    /* Reset PLLCFGR register */\n    RCC->PLLCFGR = 0x24003010;\n\n    /* Reset HSEBYP bit */\n    RCC->CR &= (uint32_t)0xFFFBFFFF;\n\n    /* Disable all interrupts */\n    RCC->CIR = 0x00000000;\n\n#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM)\n    SystemInit_ExtMemCtl();\n#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */\n\n    /* Configure the Vector Table location add offset address ------------------*/\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */\n#endif\n\n}\n\n/**\n  * @brief  Configures the System clock source, PLL Multiplier and Divider factors,\n  *               AHB/APBx prescalers and Flash settings\n  * @note   This function should be called only once the RCC clock configuration\n  *         is reset to the default reset state (done in SystemInit() function).\n  * @param  None\n  * @retval None\n  */\nvoid SetSysClock(void)\n{\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC)\n    /* 1- Try to start with HSE and external clock */\n    if (SetSysClock_PLL_HSE(1) == 0)\n#endif\n    {\n#if ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL)\n        /* 2- If fail try to start with HSE and external xtal */\n        if (SetSysClock_PLL_HSE(0) == 0)\n#endif\n        {\n#if ((CLOCK_SOURCE) & USE_PLL_HSI)\n            /* 3- If fail start with HSI clock */\n            if (SetSysClock_PLL_HSI() == 0)\n#endif\n            {\n                {\n                    error(\"SetSysClock failed\\n\");\n                }\n            }\n        }\n    }\n\n    /* Output clock on MCO2 pin(PC9) for debugging purpose */\n    //HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1); // 84 MHz\n}\n\n#if ( ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) )\n/******************************************************************************/\n/*            PLL (clocked by HSE) used as System clock source                */\n/******************************************************************************/\nuint8_t SetSysClock_PLL_HSE(uint8_t bypass)\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct;\n    RCC_ClkInitTypeDef RCC_ClkInitStruct;\n\n    /* The voltage scaling allows optimizing the power consumption when the device is\n       clocked below the maximum system frequency, to update the voltage scaling value\n       regarding system frequency refer to product datasheet. */\n    __HAL_RCC_PWR_CLK_ENABLE();\n    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n    /* Enable HSE oscillator and activate PLL with HSE as source */\n    RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_HSE;\n    if (bypass == 0) {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_ON; /* External 8 MHz xtal on OSC_IN/OSC_OUT */\n    } else {\n        RCC_OscInitStruct.HSEState          = RCC_HSE_BYPASS; /* External 8 MHz clock on OSC_IN */\n    }\n    RCC_OscInitStruct.HSIState            = RCC_HSI_OFF;\n    RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL.PLLM            = 8;             // VCO input clock = 1 MHz (8 MHz / 8)\n    RCC_OscInitStruct.PLL.PLLN            = 336;           // VCO output clock = 336 MHz (1 MHz * 336)\n    RCC_OscInitStruct.PLL.PLLP            = RCC_PLLP_DIV2; // PLLCLK = 168 MHz (336 MHz / 2)\n    RCC_OscInitStruct.PLL.PLLQ            = 7;             // USB clock = 48 MHz (336 MHz / 7) --> OK for USB\n    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n    RCC_ClkInitStruct.ClockType      = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n    RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK; // 168 MHz\n    RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1; // 168 MHz\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;   // 42 MHz\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;   // 84 MHz (SPI1 clock...)\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) {\n        return 0; // FAIL\n    }\n\n    /* Output clock on MCO1 pin(PA8) for debugging purpose */\n    /*\n    if (bypass == 0)\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_2); // 4 MHz\n    else\n      HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_1); // 8 MHz\n    */\n\n    return 1; // OK\n}\n#endif /* ((CLOCK_SOURCE) & USE_PLL_HSE_XTAL) || ((CLOCK_SOURCE) & USE_PLL_HSE_EXTC) */\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32f1xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin),\n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PA_4)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PA_15)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI15_10_IRQn , 5, 0);\n    }\n    else if (this->interruptPin == PC_1)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI1_IRQn , 5, 0);\n    }\n\n    //slaveSelect.rise(callback(this, &RemoraComms::processPacket));\n    slaveSelect.rise(callback(this, &RemoraComms::NSSinterrupt));\n}\n\nvoid RemoraComms:: update()\n{\n\tif (this->data)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = true;\n\t}\n\telse\n\t{\n\t\tthis->noDataCount++;\n\t}\n\n\tif (this->noDataCount > DATA_ERR_MAX)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = false;\n\t}\n\n\tthis->data = false;    \n}\n\n\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising SPI1 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PA4     ------> SPI1_NSS\n        PA5     ------> SPI1_SCK\n        PA6     ------> SPI1_MISO\n        PA7     ------> SPI1_MOSI\n        */\n\n        GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_7;\n        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_6;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI1_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        }\n        this->spiHandle.Init.BaudRatePrescaler        = SPI_BAUDRATEPRESCALER_2;\n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n \n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOA_CLK_ENABLE();\n        __HAL_RCC_DMA1_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA1_Channel3;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        \n         HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA1_Channel3_IRQn, (uint32_t)&DMA1_Channel3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA1_Channel2;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);\n        //NVIC_SetVector(DMA1_Channel2_IRQn, (uint32_t)&DMA1_Channel2_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::NSSinterrupt()\n{\n    // NSS / CS has gone high, packet recieved\n    this->NSS = true;\n}\n\nvoid RemoraComms::SPItasks()\n{\n    if (this->NSS)\n    {\n        this->NSS = false;\n\n        this->DMArxCnt = 0;\n        this->ticksStart = HAL_GetTick();\n\n        // wait for DMA to complete and break if DMA is not complete in time\n        while (this->DMArxCnt != SPI_BUFF_SIZE)\n        {\n            this->DMArxCnt = __HAL_DMA_GET_COUNTER(&this->hdma_spi_rx);\n            this->ticks = HAL_GetTick() - this->ticksStart;\n\n            if (this->ticks > 2)\n            {\n                this->resetSPI = true;\n                break;\n            }\n        }\n\n        if (this->resetSPI)\n        {\n            // for testing, not needed / implemented\n            printf(\"  Reset SPI now\\n\");\n            this->resetSPI = false;\n        }\n\n        switch (this->spiRxBuffer.header)\n        {\n            case PRU_READ:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // READ so do nothing with the received data\n                break;\n\n            case PRU_WRITE:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // we've got a good WRITE header, move the data to rxData\n\n                // ensure an atomic access to the rxBuffer\n                // disable thread interrupts\n                __disable_irq(); \n\n                for (int i = 0; i < SPI_BUFF_SIZE; i++)\n                {\n                    this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n                }\n\n                // re-enable thread interrupts\n                __enable_irq();\n                \n                break;\n\n            default:\n                this->rejectCnt++;\n                if (this->rejectCnt > 5)\n                {\n                    this->SPIdataError = true;\n                }\n        }\n    }\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->CommsStatus;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->CommsStatus = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32f1xx_hal.h\"\n\n#include \"modules/module.h\"\n\nclass RemoraComms : public Module\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        uint32_t            transferCompleteFlag;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n\n        uint8_t\t\t        noDataCount;\n        uint8_t             rejectCnt;\n        uint8_t             dataCnt;\n\n        uint8_t             DMArxCnt;\n        uint32_t            ticksStart;\n        uint32_t            ticks;\n\n        bool                NSS;\n        bool                resetSPI;\n\n        bool                data;\n        bool                CommsStatus;\n\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void NSSinterrupt(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n\n        virtual void update(void);\n\n        void init(void);\n        void start(void);\n        void SPItasks(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[5] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        //if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        //if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PC_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PC_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PC_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PC_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PC_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PC_5); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->init();\n\n}\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(NC)\n{\n    this->init();;\n}\n\nvoid QEIdriver::interruptHandler()\n{\n\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return false;\n}\n\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n    printf(\"        This target does not support a QEI module\\n\");\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f1xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM1, TIM1_UP_IRQn, base_freq);\n    NVIC_SetVector(TIM1_UP_IRQn, (uint32_t)TIM1_IRQHandler);\n    NVIC_SetPriority(TIM1_UP_IRQn, 2);\n\n    servoThread = new pruThread(TIM2, TIM2_IRQn , servo_freq);\n    NVIC_SetVector(TIM2_IRQn , (uint32_t)TIM2_IRQHandler);\n    NVIC_SetPriority(TIM2_IRQn , 3);\n\n    commsThread = new pruThread(TIM3, TIM3_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM3_IRQn, (uint32_t)TIM3_IRQHandler);\n    NVIC_SetPriority(TIM3_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32f1xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\nvoid Interrupt::TIM1_Wrapper(void)\n{\n\tISRVectorTable[TIM1_UP_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM2_Wrapper(void)\n{\n\tISRVectorTable[TIM2_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM3_Wrapper(void)\n{\n\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t60\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n\t\tstatic void TIM1_Wrapper();\n        static void TIM2_Wrapper();\n        static void TIM3_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !< Window WatchDog Interrupt                            \n  PVD_IRQn                    = 1,      !< PVD through EXTI Line detection Interrupt            \n  TAMPER_IRQn                 = 2,      !< Tamper Interrupt                                     \n  RTC_IRQn                    = 3,      !< RTC global Interrupt                                 \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                               \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                 \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                 \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                 \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                 \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                 \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                 \n  DMA1_Channel1_IRQn          = 11,     !< DMA1 Channel 1 global Interrupt                      \n  DMA1_Channel2_IRQn          = 12,     !< DMA1 Channel 2 global Interrupt                      \n  DMA1_Channel3_IRQn          = 13,     !< DMA1 Channel 3 global Interrupt                      \n  DMA1_Channel4_IRQn          = 14,     !< DMA1 Channel 4 global Interrupt                      \n  DMA1_Channel5_IRQn          = 15,     !< DMA1 Channel 5 global Interrupt                      \n  DMA1_Channel6_IRQn          = 16,     !< DMA1 Channel 6 global Interrupt                      \n  DMA1_Channel7_IRQn          = 17,     !< DMA1 Channel 7 global Interrupt                      \n  ADC1_2_IRQn                 = 18,     !< ADC1 and ADC2 global Interrupt                       \n  USB_HP_CAN1_TX_IRQn         = 19,     !< USB Device High Priority or CAN1 TX Interrupts       \n  USB_LP_CAN1_RX0_IRQn        = 20,     !< USB Device Low Priority or CAN1 RX0 Interrupts       \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                   \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                   \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                        \n  TIM1_BRK_IRQn               = 24,     !< TIM1 Break Interrupt                                 \n  TIM1_UP_IRQn                = 25,     !< TIM1 Update Interrupt                                \n  TIM1_TRG_COM_IRQn           = 26,     !< TIM1 Trigger and Commutation Interrupt               \n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                       \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                 \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                 \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                 \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                 \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                              \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                              \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                              \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                      \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm through EXTI Line Interrupt                \n  USBWakeUp_IRQn              = 42,     !< USB Device WakeUp from suspend through EXTI Line Interrupt \n  TIM8_BRK_IRQn               = 43,     !< TIM8 Break Interrupt                                 \n  TIM8_UP_IRQn                = 44,     !< TIM8 Update Interrupt                                \n  TIM8_TRG_COM_IRQn           = 45,     !< TIM8 Trigger and Commutation Interrupt               \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare Interrupt                       \n  ADC3_IRQn                   = 47,     !< ADC3 global Interrupt                                \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                               \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                               \n  TIM6_IRQn                   = 54,     !< TIM6 global Interrupt                                \n  TIM7_IRQn                   = 55,     !< TIM7 global Interrupt                                \n  DMA2_Channel1_IRQn          = 56,     !< DMA2 Channel 1 global Interrupt                      \n  DMA2_Channel2_IRQn          = 57,     !< DMA2 Channel 2 global Interrupt                      \n  DMA2_Channel3_IRQn          = 58,     !< DMA2 Channel 3 global Interrupt                      \n  DMA2_Channel4_5_IRQn        = 59,     !< DMA2 Channel 4 and Channel 5 global Interrupt                                                   \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n\nvoid TIM1_IRQHandler()\n{\n  if(TIM1->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM1->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM1_Wrapper();\n  }\n}\n\nvoid TIM2_IRQHandler()\n{\n  if(TIM2->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM2->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM2_Wrapper();\n  }\n}\n\nvoid TIM3_IRQHandler()\n{\n  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM3_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\nvoid pruThread::registerModulePost(Module* module)\n{\n\tthis->vThreadPost.push_back(module);\n\tthis->hasThreadPost = true;\n}\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n\n    // iterate over the second vector that contains module pointers to run after (post) the main vector\n\tif (hasThreadPost)\n\t{\n\t\tfor (iter = vThreadPost.begin(); iter != vThreadPost.end(); ++iter) (*iter)->runModulePost();\n\t}\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32f1xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n        bool hasThreadPost;\t\t// run updatePost() vector\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n        vector<Module*> vThreadPost;\t\t// vector containing pointers to Thread modules that run after the main vector modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void registerModulePost(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32f1xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM1)\n    {\n        printf(\"\tpower on Timer 1\\n\\r\");\n        __HAL_RCC_TIM1_CLK_ENABLE();\n        TIM_CLK = APB2CLK;\n    }\n    else if (this->timer == TIM2)\n    {\n        printf(\"\tpower on Timer 2\\n\\r\");\n        __HAL_RCC_TIM2_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 30\\n\\r\");\n        __HAL_RCC_TIM3_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n\n\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F1/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 1\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/SDIO/SDIOBlockDevice.cpp",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include <errno.h>\n#include \"platform/mbed_debug.h\"\n#include \"platform/mbed_wait_api.h\"\n#include \"SDIOBlockDevice.h\"\n\nnamespace mbed\n{\n\n/*\n *  defines\n */\n\n#define SD_DBG 0       /*!< 1 - Enable debugging */\n#define SD_CMD_TRACE 0 /*!< 1 - Enable SD command tracing */\n\n#define SD_BLOCK_DEVICE_ERROR_WOULD_BLOCK -5001           /*!< operation would block */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED -5002           /*!< unsupported operation */\n#define SD_BLOCK_DEVICE_ERROR_PARAMETER -5003             /*!< invalid parameter */\n#define SD_BLOCK_DEVICE_ERROR_NO_INIT -5004               /*!< uninitialized */\n#define SD_BLOCK_DEVICE_ERROR_NO_DEVICE -5005             /*!< device is missing or not connected */\n#define SD_BLOCK_DEVICE_ERROR_WRITE_PROTECTED -5006       /*!< write protected */\n#define SD_BLOCK_DEVICE_ERROR_UNUSABLE -5007              /*!< unusable card */\n#define SD_BLOCK_DEVICE_ERROR_NO_RESPONSE -5008           /*!< No response from device */\n#define SD_BLOCK_DEVICE_ERROR_CRC -5009                   /*!< CRC error */\n#define SD_BLOCK_DEVICE_ERROR_ERASE -5010                 /*!< Erase error: reset/sequence */\n#define SD_BLOCK_DEVICE_ERROR_WRITE -5011                 /*!< SPI Write error: !SPI_DATA_ACCEPTED */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE -5012 /*!< unsupported blocksize, only 512 byte supported */\n#define SD_BLOCK_DEVICE_ERROR_READBLOCKS -5013            /*!< read data blocks from SD failed */\n#define SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS -5014           /*!< write data blocks to SD failed */\n#define SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS -5015           /*!< erase data blocks to SD failed */\n\n#define BLOCK_SIZE_HC 512 /*!< Block size supported for SD card is 512 bytes  */\n\n// Types\n#define SDCARD_NONE 0  /**< No card is present */\n#define SDCARD_V1 1    /**< v1.x Standard Capacity */\n#define SDCARD_V2 2    /**< v2.x Standard capacity SD card */\n#define SDCARD_V2HC 3  /**< v2.x High capacity SD card */\n#define CARD_UNKNOWN 4 /**< Unknown or unsupported card */\n\n#ifndef MBED_CONF_SD_TIMEOUT\n#define MBED_CONF_SD_TIMEOUT (30 * 1000) /* ms */\n#endif\n\nSDIOBlockDevice::SDIOBlockDevice(PinName cardDetect) : _cardDetect(cardDetect),\n                                                       _is_initialized(0),\n                                                       _sectors(0),\n                                                       _init_ref_count(0)\n{\n    _card_type = SDCARD_NONE;\n\n    // Only HC block size is supported.\n    _block_size = BLOCK_SIZE_HC;\n    _erase_size = BLOCK_SIZE_HC;\n}\n\nSDIOBlockDevice::~SDIOBlockDevice()\n{\n    if (_is_initialized)\n    {\n        deinit();\n    }\n}\n\nint SDIOBlockDevice::init()\n{\n    debug_if(SD_DBG, \"init Card...\\r\\n\");\n\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n    }\n\n    _init_ref_count++;\n\n    if (_init_ref_count != 1)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n\n    int status = SD_Init();\n    if (BD_ERROR_OK != status)\n    {\n        unlock();\n        return BD_ERROR_DEVICE_ERROR;\n    }\n\n    SD_GetCardInfo(&_cardInfo);\n    _is_initialized = true;\n    debug_if(SD_DBG, \"SD initialized: type: %ld  version: %ld  class: %ld\\n\",\n             _cardInfo.CardType, _cardInfo.CardVersion, _cardInfo.Class);\n    debug_if(SD_DBG, \"SD size: %ld MB\\n\",\n             _cardInfo.LogBlockNbr / 2 / 1024);\n\n    // get sectors count from cardinfo\n    _sectors = _cardInfo.LogBlockNbr;\n    if (BLOCK_SIZE_HC != _cardInfo.BlockSize)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::deinit()\n{\n    debug_if(SD_DBG, \"deinit Card...\\r\\n\");\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    _init_ref_count--;\n\n    if (_init_ref_count)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    int status = SD_DeInit();\n    _is_initialized = false;\n\n    _sectors = 0;\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_read(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    uint32_t *_buffer = static_cast<uint32_t *>(buffer);\n\n    // ReadBlocks uses byte unit address\n    // SDHC and SDXC Cards different addressing is handled in ReadBlocks()\n    bd_addr_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n    }\n\n    // receive the data : one block/ multiple blocks is handled in ReadBlocks()\n    int status = SD_ReadBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"ReadBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_ReadPending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"ReadBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_program(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    // HAL layer uses uint32_t for addr/size\n    uint32_t *_buffer = (uint32_t *)(buffer);\n\n    // Get block count\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n\n    int status = SD_WriteBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"WriteBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_WritePending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"WriteBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::trim(bd_addr_t addr, bd_size_t size)\n{\n    debug_if(SD_DBG, \"trim Card...\\r\\n\");\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!_is_valid_trim(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    int status = SD_Erase(addr, blockCnt);\n    if (status != 0)\n    {\n        debug_if(SD_DBG, \"Erase blocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n    }\n    else\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n            }\n        }\n    }\n\n    unlock();\n    return status;\n}\n\nbd_size_t SDIOBlockDevice::get_read_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::get_program_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::size() const\n{\n    return _block_size * _sectors;\n}\n\nvoid SDIOBlockDevice::debug(bool dbg)\n{\n}\n\nbool SDIOBlockDevice::_is_valid_trim(bd_addr_t addr, bd_size_t size)\n{\n    return (\n        addr % _erase_size == 0 &&\n        size % _erase_size == 0 &&\n        addr + size <= this->size());\n}\n\nbool SDIOBlockDevice::isPresent(void)\n{\n    if (_cardDetect.is_connected()) {\n        return (_cardDetect.read() == 0);\n    }\n    else {\n        return true;\n    }\n}\n\nconst char *SDIOBlockDevice::get_type() const\n{\n    return \"SDIO\";\n}\n\n} // namespace mbed\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/SDIO/SDIOBlockDevice.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#define MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#include \"BlockDevice.h\"\n#include \"DigitalIn.h\"\n#include \"PlatformMutex.h\"\n#include \"sdio_device.h\"\n\nnamespace mbed\n{\n\nclass SDIOBlockDevice : public BlockDevice\n{\n  public:\n    SDIOBlockDevice(PinName cardDetect = NC);\n    virtual ~SDIOBlockDevice();\n    /** Initialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int init();\n\n    /** Deinitialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int deinit();\n\n    /** Read blocks from a block device\n     *\n     *  @param buffer   Buffer to write blocks to\n     *  @param addr     Address of block to begin reading from\n     *  @param size     Size to read in bytes, must be a multiple of read block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Program blocks to a block device\n     *\n     *  The blocks must have been erased prior to being programmed\n     *\n     *  @param buffer   Buffer of data to write to blocks\n     *  @param addr     Address of block to begin writing to\n     *  @param size     Size to write in bytes, must be a multiple of program block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Mark blocks as no longer in use\n     *\n     *  This function provides a hint to the underlying block device that a region of blocks\n     *  is no longer in use and may be erased without side effects. Erase must still be called\n     *  before programming, but trimming allows flash-translation-layers to schedule erases when\n     *  the device is not busy.\n     *\n     *  @param addr     Address of block to mark as unused\n     *  @param size     Size to mark as unused in bytes, must be a multiple of erase block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int trim(bd_addr_t addr, bd_size_t size);\n\n    /** Get the size of a readable block\n     *\n     *  @return         Size of a readable block in bytes\n     */\n    virtual bd_size_t get_read_size() const;\n\n    /** Get the size of a programable block\n     *\n     *  @return         Size of a programable block in bytes\n     *  @note Must be a multiple of the read size\n     */\n    virtual bd_size_t get_program_size() const;\n\n    /** Get the total size of the underlying device\n     *\n     *  @return         Size of the underlying device in bytes\n     */\n    virtual bd_size_t size() const;\n\n    /** Enable or disable debugging\n     *\n     *  @param dbg        State of debugging\n     */\n    virtual void debug(bool dbg);\n\n    /** Set the transfer frequency\n     *\n     *  @param freq     Transfer frequency\n     *  @note Max frequency supported is 25MHZ\n     */\n    virtual int frequency(uint64_t freq) { return BD_ERROR_OK; };\n\n    /** check if SD is present\n     *\n     *  @note check physical present switch. Maybe not support by hardware, then function will always return true.\n     */\n    virtual bool isPresent(void);\n\n     /** Get the BlockDevice class type.\n     *\n     *  @return         A string representation of the BlockDevice class type.\n     */\n    virtual const char *get_type() const;\n\n\n  private:\n    DigitalIn _cardDetect;\n    bool _is_initialized;\n    bd_size_t _block_size;\n    bd_size_t _erase_size;\n    bd_size_t _sectors;\n    uint32_t _init_ref_count;\n    SD_Cardinfo_t _cardInfo;\n    uint32_t _card_type;\n\n    PlatformMutex _mutex;\n    virtual void lock()\n    {\n        _mutex.lock();\n    }\n\n    virtual void unlock()\n    {\n        _mutex.unlock();\n    }\n\n    bool _is_valid_trim(bd_addr_t addr, bd_size_t size);\n};\n\n} // namespace mbed\n\n#endif /* MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_ */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/SDIO/sdio_device.c",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n#include \"sdio_device.h\"\n#include \"platform/mbed_error.h\"\n\n/* Extern variables ---------------------------------------------------------*/\n\nSD_HandleTypeDef hsd;\nDMA_HandleTypeDef hdma_sdio_rx;\nDMA_HandleTypeDef hdma_sdio_tx;\n\n// simple flags for DMA pending signaling\nvolatile uint8_t SD_DMA_ReadPendingState = SD_TRANSFER_OK;\nvolatile uint8_t SD_DMA_WritePendingState = SD_TRANSFER_OK;\n\n/* DMA Handlers are global, there is only one SDIO interface */\n\n/**\n* @brief This function handles SDIO global interrupt.\n*/\nvoid _SDIO_IRQHandler(void)\n{\n    HAL_SD_IRQHandler(&hsd);\n}\n\n/**\n* @brief This function handles DMAx stream_n global interrupt. DMA Rx\n*/\nvoid _DMA_Stream_Rx_IRQHandler(void)\n{\n    HAL_DMA_IRQHandler(hsd.hdmarx);\n}\n\n/**\n* @brief This function handles DMAx stream_n global interrupt. DMA Tx\n*/\nvoid _DMA_Stream_Tx_IRQHandler(void)\n{\n    HAL_DMA_IRQHandler(hsd.hdmatx);\n}\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspInit(SD_HandleTypeDef *hsd)\n{\n    IRQn_Type IRQn;\n    GPIO_InitTypeDef GPIO_InitStruct;\n\n    if (hsd->Instance == SDIO)\n    {\n        /* Peripheral clock enable */\n        __HAL_RCC_SDIO_CLK_ENABLE();\n        __HAL_RCC_DMA2_CLK_ENABLE();\n\n        /* Enable GPIOs clock */\n        __HAL_RCC_GPIOC_CLK_ENABLE();\n        __HAL_RCC_GPIOD_CLK_ENABLE();\n\n        /**SDIO GPIO Configuration\n         PC12     ------> SDIO_CK\n         PC11     ------> SDIO_D3\n         PC10     ------> SDIO_D2\n         PD2     ------> SDIO_CMD\n         PC9     ------> SDIO_D1\n         PC8     ------> SDIO_D0\n         */\n        GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_PULLUP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;\n        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_2;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_PULLUP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;\n        HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);\n\n        /* NVIC configuration for SDIO interrupts */\n        IRQn = SDIO_IRQn;\n        HAL_NVIC_SetPriority(IRQn, 0x0E, 0);\n        NVIC_SetVector(IRQn, (uint32_t)&_SDIO_IRQHandler);\n        HAL_NVIC_EnableIRQ(IRQn);\n\n        /* SDIO DMA Init */\n        /* SDIO_RX Init */\n        hdma_sdio_rx.Instance = DMA2_Stream3;\n        hdma_sdio_rx.Init.Channel = DMA_CHANNEL_4;\n        hdma_sdio_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;\n        hdma_sdio_rx.Init.PeriphInc = DMA_PINC_DISABLE;\n        hdma_sdio_rx.Init.MemInc = DMA_MINC_ENABLE;\n        hdma_sdio_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;\n        hdma_sdio_rx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;\n        hdma_sdio_rx.Init.Mode = DMA_PFCTRL;\n        hdma_sdio_rx.Init.Priority = DMA_PRIORITY_LOW;\n        hdma_sdio_rx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;\n        hdma_sdio_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;\n        hdma_sdio_rx.Init.MemBurst = DMA_MBURST_INC4;\n        hdma_sdio_rx.Init.PeriphBurst = DMA_PBURST_INC4;\n        if (HAL_DMA_Init(&hdma_sdio_rx) != HAL_OK)\n        {\n            error(\"SDIO DMA Init error at %d in %s\", __LINE__, __FILE__);\n        }\n\n        __HAL_LINKDMA(hsd, hdmarx, hdma_sdio_rx);\n\n        /* Deinitialize the stream for new transfer */\n        HAL_DMA_DeInit(&hdma_sdio_rx);\n\n        /* Configure the DMA stream */\n        HAL_DMA_Init(&hdma_sdio_rx);\n\n        /* SDIO_TX Init */\n        hdma_sdio_tx.Instance = DMA2_Stream6;\n        hdma_sdio_tx.Init.Channel = DMA_CHANNEL_4;\n        hdma_sdio_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;\n        hdma_sdio_tx.Init.PeriphInc = DMA_PINC_DISABLE;\n        hdma_sdio_tx.Init.MemInc = DMA_MINC_ENABLE;\n        hdma_sdio_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;\n        hdma_sdio_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;\n        hdma_sdio_tx.Init.Mode = DMA_PFCTRL;\n        hdma_sdio_tx.Init.Priority = DMA_PRIORITY_LOW;\n        hdma_sdio_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE;\n        hdma_sdio_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;\n        hdma_sdio_tx.Init.MemBurst = DMA_MBURST_INC4;\n        hdma_sdio_tx.Init.PeriphBurst = DMA_PBURST_INC4;\n        if (HAL_DMA_Init(&hdma_sdio_tx) != HAL_OK)\n        {\n            error(\"SDIO DMA Init error at %d in %s\", __LINE__, __FILE__);\n        }\n\n        __HAL_LINKDMA(hsd, hdmatx, hdma_sdio_tx);\n\n        /* Deinitialize the stream for new transfer */\n        HAL_DMA_DeInit(&hdma_sdio_tx);\n\n        /* Configure the DMA stream */\n        HAL_DMA_Init(&hdma_sdio_tx);\n\n        /* Enable NVIC for DMA transfer complete interrupts */\n        IRQn = DMA2_Stream3_IRQn;\n        NVIC_SetVector(IRQn, (uint32_t)&_DMA_Stream_Rx_IRQHandler);\n        HAL_NVIC_SetPriority(IRQn, 0x0F, 0);\n        HAL_NVIC_EnableIRQ(IRQn);\n\n        IRQn = DMA2_Stream6_IRQn;\n        NVIC_SetVector(IRQn, (uint32_t)&_DMA_Stream_Tx_IRQHandler);\n        HAL_NVIC_SetPriority(IRQn, 0x0F, 0);\n        HAL_NVIC_EnableIRQ(IRQn);\n    }\n}\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)\n{\n\n    if (hsd->Instance == SDIO)\n    {\n        /* Peripheral clock disable */\n        __HAL_RCC_SDIO_CLK_DISABLE();\n\n        /**SDIO GPIO Configuration\n         PC12     ------> SDIO_CK\n         PC11     ------> SDIO_D3\n         PC10     ------> SDIO_D2\n         PD2     ------> SDIO_CMD\n         PC9     ------> SDIO_D1\n         PC8     ------> SDIO_D0\n         */\n        HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12 | GPIO_PIN_11 | GPIO_PIN_10 | GPIO_PIN_9 | GPIO_PIN_8);\n\n        HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);\n\n        /* SDIO DMA DeInit */\n        HAL_DMA_DeInit(hsd->hdmarx);\n        HAL_DMA_DeInit(hsd->hdmatx);\n    }\n}\n\n/**\n * @brief  DeInitializes the SD MSP.\n * @param  hsd: SD handle\n * @param  Params : pointer on additional configuration parameters, can be NULL.\n */\n__weak void SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)\n{\n    static DMA_HandleTypeDef dma_rx_handle;\n    static DMA_HandleTypeDef dma_tx_handle;\n\n    /* Disable NVIC for DMA transfer complete interrupts */\n    HAL_NVIC_DisableIRQ(DMA2_Stream3_IRQn);\n    HAL_NVIC_DisableIRQ(DMA2_Stream6_IRQn);\n\n    /* Deinitialize the stream for new transfer */\n    dma_rx_handle.Instance = DMA2_Stream3;\n    HAL_DMA_DeInit(&dma_rx_handle);\n\n    /* Deinitialize the stream for new transfer */\n    dma_tx_handle.Instance = DMA2_Stream6;\n    HAL_DMA_DeInit(&dma_tx_handle);\n\n    /* Disable NVIC for SDIO interrupts */\n    HAL_NVIC_DisableIRQ(SDIO_IRQn);\n\n    /* Disable SDIO clock */\n    __HAL_RCC_SDIO_CLK_DISABLE();\n}\n\n/**\n  * @brief  Enables the SDIO wide bus mode.\n  * @param  hsd pointer to SD handle\n  * @retval error state\n  */\nstatic uint32_t SD_WideBus_Enable(SD_HandleTypeDef *hsd)\n{\n    uint32_t errorstate = HAL_SD_ERROR_NONE;\n\n    if ((SDIO_GetResponse(hsd->Instance, SDIO_RESP1) & SDMMC_CARD_LOCKED) == SDMMC_CARD_LOCKED)\n    {\n        return HAL_SD_ERROR_LOCK_UNLOCK_FAILED;\n    }\n\n    /* Send CMD55 APP_CMD with argument as card's RCA.*/\n    errorstate = SDMMC_CmdAppCommand(hsd->Instance, (uint32_t)(hsd->SdCard.RelCardAdd << 16U));\n    if (errorstate != HAL_OK)\n    {\n        return errorstate;\n    }\n\n    /* Send ACMD6 APP_CMD with argument as 2 for wide bus mode */\n    errorstate = SDMMC_CmdBusWidth(hsd->Instance, 2U);\n    if (errorstate != HAL_OK)\n    {\n        return errorstate;\n    }\n\n    hsd->Init.BusWide = SDIO_BUS_WIDE_4B;\n    SDIO_Init(hsd->Instance, hsd->Init);\n\n    return HAL_SD_ERROR_NONE;\n}\n\n/**\n * @brief  Initializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_Init(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    hsd.Instance = SDIO;\n    hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;\n    hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;\n    hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;\n    hsd.Init.BusWide = SDIO_BUS_WIDE_1B;\n    hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;\n    hsd.Init.ClockDiv = 0;\n\n    /* HAL SD initialization */\n    sd_state = HAL_SD_Init(&hsd);\n    /* Configure SD Bus width (4 bits mode selected) */\n    if (sd_state == MSD_OK)\n    {\n        /* Enable wide operation */\n        if (SD_WideBus_Enable(&hsd) != HAL_OK)\n        {\n            sd_state = MSD_ERROR;\n        }\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  DeInitializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_DeInit(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    hsd.Instance = SDIO;\n\n    /* HAL SD deinitialization */\n    if (HAL_SD_DeInit(&hsd) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    /* Msp SD deinitialization */\n    hsd.Instance = SDIO;\n    SD_MspDeInit(&hsd, NULL);\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @param  Timeout: Timeout for read operation\n * @retval SD status\n */\nuint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_ReadBlocks(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @param  Timeout: Timeout for write operation\n * @retval SD status\n */\nuint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_WriteBlocks(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @retval SD status\n */\nuint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)\n{\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_ReadPendingState = SD_TRANSFER_BUSY;\n\n    /* Read block(s) in DMA transfer mode */\n    if (HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @retval SD status\n */\nuint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)\n{\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_WritePendingState = SD_TRANSFER_BUSY;\n\n    /* Write block(s) in DMA transfer mode */\n    if (HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_WritePendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Erases the specified memory area of the given SD card.\n * @param  StartAddr: Start byte address\n * @param  EndAddr: End byte address\n * @retval SD status\n */\nuint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_Erase(&hsd, StartAddr, EndAddr) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Gets the current SD card data status.\n * @param  None\n * @retval Data transfer state.\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_GetCardState(void)\n{\n    return ((HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY);\n}\n\n/**\n * @brief  Get SD information about specific SD card.\n * @param  CardInfo: Pointer to HAL_SD_CardInfoTypedef structure\n * @retval None\n */\nvoid SD_GetCardInfo(SD_Cardinfo_t *CardInfo)\n{\n    /* Get SD card Information, copy structure for portability */\n    HAL_SD_CardInfoTypeDef HAL_CardInfo;\n\n    HAL_SD_GetCardInfo(&hsd, &HAL_CardInfo);\n\n    if (CardInfo)\n    {\n        CardInfo->CardType = HAL_CardInfo.CardType;\n        CardInfo->CardVersion = HAL_CardInfo.CardVersion;\n        CardInfo->Class = HAL_CardInfo.Class;\n        CardInfo->RelCardAdd = HAL_CardInfo.RelCardAdd;\n        CardInfo->BlockNbr = HAL_CardInfo.BlockNbr;\n        CardInfo->BlockSize = HAL_CardInfo.BlockSize;\n        CardInfo->LogBlockNbr = HAL_CardInfo.LogBlockNbr;\n        CardInfo->LogBlockSize = HAL_CardInfo.LogBlockSize;\n    }\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_ReadPending(void)\n{\n    return SD_DMA_ReadPendingState;\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_WritePending(void)\n{\n    return SD_DMA_WritePendingState;\n}\n\n/**\n  * @brief Rx Transfer completed callbacks\n  * @param hsd Pointer SD handle\n  * @retval None\n  */\nvoid HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n}\n\n/**\n  * @brief Tx Transfer completed callbacks\n  * @param hsd Pointer to SD handle\n  * @retval None\n  */\nvoid HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_WritePendingState = SD_TRANSFER_OK;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/SDIO/sdio_device.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __SDIO_DEVICE_H\n#define __SDIO_DEVICE_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"stm32f4xx_hal.h\"\n\n  /* Typedefs */\n\n  typedef struct\n  {\n    uint32_t CardType;     /* Specifies the card Type                         */\n    uint32_t CardVersion;  /* Specifies the card version                      */\n    uint32_t Class;        /* Specifies the class of the card class           */\n    uint32_t RelCardAdd;   /* Specifies the Relative Card Address             */\n    uint32_t BlockNbr;     /* Specifies the Card Capacity in blocks           */\n    uint32_t BlockSize;    /* Specifies one block size in bytes               */\n    uint32_t LogBlockNbr;  /* Specifies the Card logical Capacity in blocks   */\n    uint32_t LogBlockSize; /* Specifies logical block size in bytes           */\n  } SD_Cardinfo_t;\n\n  /* External Global var  */\n\n  extern SD_HandleTypeDef hsd;\n\n/* Exported types */\n/** \n  * @brief SD Card information structure \n  */\n#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef\n\n/* Exported constants */\n/**\n  * @brief  SD status structure definition  \n  */\n#define MSD_OK ((uint8_t)0x00)\n#define MSD_ERROR ((uint8_t)0x01)\n\n/** \n  * @brief  SD transfer state definition  \n  */\n#define SD_TRANSFER_OK ((uint8_t)0x00)\n#define SD_TRANSFER_BUSY ((uint8_t)0x01)\n\n  /* Exported functions */\n  uint8_t SD_Init(void);\n  uint8_t SD_DeInit(void);\n  uint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks);\n  uint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks);\n  uint8_t SD_DMA_ReadPending(void);\n  uint8_t SD_DMA_WritePending(void);\n  uint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr);\n\n  uint8_t SD_GetCardState(void);\n  void SD_GetCardInfo(SD_Cardinfo_t *CardInfo);\n\n  /* callback function for DMA Rx/Tx completete, called by HAL SDIO interrupt handler */\n  void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd);\n  void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __SDIO_DEVICE_H */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32f4xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin), \n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PA_4)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PB_12)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PE_10)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI15_10_IRQn , 5, 0);\n    }\n    else if (this->interruptPin == PC_6)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI9_5_IRQn , 5, 0);\n    }\n\n\n    //slaveSelect.rise(callback(this, &RemoraComms::processPacket));\n    slaveSelect.rise(callback(this, &RemoraComms::NSSinterrupt));\n}\n\nvoid RemoraComms:: update()\n{\n\tif (this->data)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = true;\n\t}\n\telse\n\t{\n\t\tthis->noDataCount++;\n\t}\n\n\tif (this->noDataCount > DATA_ERR_MAX)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = false;\n\t}\n\n\tthis->data = false;    \n}\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising SPI1 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PA4     ------> SPI1_NSS (YELLOW)\n        PA5     ------> SPI1_SCK (GREEN)\n        PA6     ------> SPI1_MISO (ORANGE)\n        PA7     ------> SPI1_MOSI (RED)\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI1_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        } \n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n    }\n    else if(this->spiHandle.Instance == SPI2)\n    {\n        printf(\"Initialising SPI2 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI2 GPIO Configuration\n        PB12     ------> SPI2_NSS (YELLOW)\n        PB13     ------> SPI2_SCK (GREEN)\n        PB14     ------> SPI2_MISO (ORANGE)\n        PB15     ------> SPI2_MOSI (RED)\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;\n        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI2_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        } \n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n    }\n\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOA_CLK_ENABLE();\n        __HAL_RCC_DMA2_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA2_Stream3;\n        this->hdma_spi_tx.Init.Channel               = DMA_CHANNEL_3;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_tx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n        \n        HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA2_Stream3_IRQn, (uint32_t)&DMA2_Stream3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA2_Stream0;\n        this->hdma_spi_rx.Init.Channel               = DMA_CHANNEL_3;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_rx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);\n        //NVIC_SetVector(DMA2_Stream0_IRQn, (uint32_t)&DMA2_Stream0_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);\n        \n        this->hdma_memtomem_dma2_stream1.Instance                 = DMA2_Stream1;\n        this->hdma_memtomem_dma2_stream1.Init.Channel             = DMA_CHANNEL_0;\n        this->hdma_memtomem_dma2_stream1.Init.Direction           = DMA_MEMORY_TO_MEMORY;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphInc           = DMA_PINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.MemInc              = DMA_MINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.Mode                = DMA_NORMAL;\n        this->hdma_memtomem_dma2_stream1.Init.Priority            = DMA_PRIORITY_LOW;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;\n        this->hdma_memtomem_dma2_stream1.Init.MemBurst            = DMA_MBURST_SINGLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphBurst         = DMA_PBURST_SINGLE;\n\n        HAL_DMA_Init(&this->hdma_memtomem_dma2_stream1);\n\n    }\n    else if(this->spiHandle.Instance == SPI2)\n    {\n        printf(\"Initialising DMA for SPI2\\n\");\n\n        __HAL_RCC_GPIOB_CLK_ENABLE();\n        __HAL_RCC_DMA1_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA1_Stream4;\n        this->hdma_spi_tx.Init.Channel               = DMA_CHANNEL_0;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_tx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n        \n        HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA2_Stream3_IRQn, (uint32_t)&DMA2_Stream3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA1_Stream3;\n        this->hdma_spi_rx.Init.Channel               = DMA_CHANNEL_0;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_rx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 0, 0);\n        //NVIC_SetVector(DMA2_Stream0_IRQn, (uint32_t)&DMA2_Stream0_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn);\n        \n        this->hdma_memtomem_dma2_stream1.Instance                 = DMA2_Stream1;\n        this->hdma_memtomem_dma2_stream1.Init.Channel             = DMA_CHANNEL_0;\n        this->hdma_memtomem_dma2_stream1.Init.Direction           = DMA_MEMORY_TO_MEMORY;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphInc           = DMA_PINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.MemInc              = DMA_MINC_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;\n        this->hdma_memtomem_dma2_stream1.Init.Mode                = DMA_NORMAL;\n        this->hdma_memtomem_dma2_stream1.Init.Priority            = DMA_PRIORITY_LOW;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOMode            = DMA_FIFOMODE_ENABLE;\n        this->hdma_memtomem_dma2_stream1.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;\n        this->hdma_memtomem_dma2_stream1.Init.MemBurst            = DMA_MBURST_SINGLE;\n        this->hdma_memtomem_dma2_stream1.Init.PeriphBurst         = DMA_PBURST_SINGLE;\n\n        HAL_DMA_Init(&this->hdma_memtomem_dma2_stream1);\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::NSSinterrupt()\n{\n    // NSS / CS has gone high, packet recieved\n    this->NSS = true;\n}\n\nvoid RemoraComms::SPItasks()\n{\n    if (this->NSS)\n    {\n        this->NSS = false;\n\n        this->DMArxCnt = 0;\n        this->ticksStart = HAL_GetTick();\n\n        // wait for DMA to complete and break if DMA is not complete in time\n        while (this->DMArxCnt != SPI_BUFF_SIZE)\n        {\n            this->DMArxCnt = __HAL_DMA_GET_COUNTER(&this->hdma_spi_rx);\n            this->ticks = HAL_GetTick() - this->ticksStart;\n\n            if (this->ticks > 2)\n            {\n                this->resetSPI = true;\n                break;\n            }\n        }\n\n        if (this->resetSPI)\n        {\n            // for testing, not needed / implemented\n            printf(\"  Reset SPI now\\n\");\n            this->resetSPI = false;\n        }\n\n        switch (this->spiRxBuffer.header)\n        {\n            case PRU_READ:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // READ so do nothing with the received data\n                break;\n\n            case PRU_WRITE:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // we've got a good WRITE header, move the data to rxData\n\n                // ensure an atomic access to the rxBuffer\n                // disable thread interrupts\n                __disable_irq(); \n\n                for (int i = 0; i < SPI_BUFF_SIZE; i++)\n                {\n                    this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n                }\n\n                // re-enable thread interrupts\n                __enable_irq();\n                \n                break;\n\n            default:\n                this->rejectCnt++;\n                if (this->rejectCnt > 5)\n                {\n                    this->SPIdataError = true;\n                }\n        }\n    }\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->CommsStatus;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->CommsStatus = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32f4xx_hal.h\"\n\n#include \"modules/module.h\"\n\nclass RemoraComms : public Module\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        uint32_t            transferCompleteFlag;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n\n        uint8_t\t\t        noDataCount;\n        uint8_t             rejectCnt;\n        uint8_t             dataCnt;\n\n        uint8_t             DMArxCnt;\n        uint32_t            ticksStart;\n        uint32_t            ticks;\n\n        bool                NSS;\n        bool                resetSPI;\n\n        bool                data;\n        bool                CommsStatus;\n\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void NSSinterrupt(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n\n        virtual void update(void);\n\n        void init(void);\n        void start(void);\n        void SPItasks(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[8] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,GPIOH};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n        \n        case 5:\n            __HAL_RCC_GPIOF_CLK_ENABLE();\n            break;\n        \n        case 6:\n            __HAL_RCC_GPIOG_CLK_ENABLE();\n            break;\n        \n        case 7:\n            __HAL_RCC_GPIOH_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PA_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PA_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PA_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PA_11); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PA_15); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PB_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PB_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PB_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PB_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PB_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PB_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PB_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PB_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PB_11); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PB_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PB_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PB_15); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PC_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PC_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PC_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PC_9); }\n    }\n    else if (this->portIndex == 3)\n    {\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PD_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PD_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PD_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PD_15); }\n    }\n    else if (this->portIndex == 4)\n    {\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PE_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PE_6); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PE_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PE_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PE_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PE_11); }\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PE_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PE_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PE_14); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->hasIndex = false;\n    this->init();\n}\n\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(PE_13)\n{\n    this->hasIndex = true;\n    this->irq = EXTI15_10_IRQn;\n\n    this->init();\n\n    qeiIndex.rise(callback(this, &QEIdriver::interruptHandler));\n    //NVIC_EnableIRQ(this->irq);\n    HAL_NVIC_SetPriority(this->irq, 0, 0);\n}\n\n\nvoid QEIdriver::interruptHandler()\n{\n    this->indexDetected = true;\n    this->indexCount = this->get();\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return __HAL_TIM_GET_COUNTER(&htim);\n}\n\n\n// reference https://os.mbed.com/users/gregeric/code/Nucleo_Hello_Encoder/\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n\n    this->htim.Instance = TIM1;\n    this->htim.Init.Prescaler = 0;\n    this->htim.Init.CounterMode = TIM_COUNTERMODE_UP;\n    this->htim.Init.Period = 65535;\n    //this->htim.Init.Period = 0xffffffff; // 32-bit count for TIM2\n    this->htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n    this->htim.Init.RepetitionCounter = 0;\n\n    this->sConfig.EncoderMode = TIM_ENCODERMODE_TI12;\n\n    this->sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC1Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC1Filter = 0;\n\n    this->sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC2Filter = 0;\n\n    if (HAL_TIM_Encoder_Init(&this->htim, &this->sConfig) != HAL_OK)\n    {\n        printf(\"Couldn't Init Encoder\\r\\n\");\n    }\n\n    this->sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\n    this->sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\n    HAL_TIMEx_MasterConfigSynchronization(&this->htim, &this->sMasterConfig);\n\n    if (HAL_TIM_Encoder_Start(&this->htim, TIM_CHANNEL_2)!=HAL_OK)\n    {\n        printf(\"Couldn't Start Encoder\\r\\n\");\n    }\n}\n\n\nvoid HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* htim_encoder)\n{\n    GPIO_InitTypeDef GPIO_InitStruct = {0};\n    if(htim_encoder->Instance==TIM1)\n    {\n        __HAL_RCC_TIM1_CLK_ENABLE();\n\n        __HAL_RCC_GPIOE_CLK_ENABLE();\n        /**TIM1 GPIO Configuration\n        PE9     ------> TIM1_CH1\n        PE11     ------> TIM1_CH2\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\n        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;\n        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32f4xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM9, TIM1_BRK_TIM9_IRQn, base_freq);\n    NVIC_SetVector(TIM1_BRK_TIM9_IRQn, (uint32_t)TIM9_IRQHandler);\n    NVIC_SetPriority(TIM1_BRK_TIM9_IRQn, 2);\n\n    servoThread = new pruThread(TIM10, TIM1_UP_TIM10_IRQn, servo_freq);\n    NVIC_SetVector(TIM1_UP_TIM10_IRQn, (uint32_t)TIM10_IRQHandler);\n    NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 3);\n\n    commsThread = new pruThread(TIM11, TIM1_TRG_COM_TIM11_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM1_TRG_COM_TIM11_IRQn, (uint32_t)TIM11_IRQHandler);\n    NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32f4xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\n//void Interrupt::TIM3_Wrapper(void)\n//{\n//\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n//}\n\nvoid Interrupt::TIM9_Wrapper(void)\n{\n\tISRVectorTable[TIM1_BRK_TIM9_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM10_Wrapper(void)\n{\n\tISRVectorTable[TIM1_UP_TIM10_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM11_Wrapper(void)\n{\n\tISRVectorTable[TIM1_TRG_COM_TIM11_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t82\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n        //static void TIM3_Wrapper();\n\t\tstatic void TIM9_Wrapper();\n        static void TIM10_Wrapper();\n        static void TIM11_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !<Window WatchDog Interrupt                                         \n  PVD_IRQn                    = 1,      !<PVD through EXTI Line detection Interrupt                         \n  TAMP_STAMP_IRQn             = 2,      !< Tamper and TimeStamp interrupts through the EXTI line             \n  RTC_WKUP_IRQn               = 3,      !< RTC Wakeup interrupt through the EXTI line                        \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                                            \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                              \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                              \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                              \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                              \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                              \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                              \n  DMA1_Stream0_IRQn           = 11,     !< DMA1 Stream 0 global Interrupt                                    \n  DMA1_Stream1_IRQn           = 12,     !< DMA1 Stream 1 global Interrupt                                    \n  DMA1_Stream2_IRQn           = 13,     !< DMA1 Stream 2 global Interrupt                                    \n  DMA1_Stream3_IRQn           = 14,     !< DMA1 Stream 3 global Interrupt                                    \n  DMA1_Stream4_IRQn           = 15,     !< DMA1 Stream 4 global Interrupt                                    \n  DMA1_Stream5_IRQn           = 16,     !< DMA1 Stream 5 global Interrupt                                    \n  DMA1_Stream6_IRQn           = 17,     !< DMA1 Stream 6 global Interrupt                                    \n  ADC_IRQn                    = 18,     !< ADC1, ADC2 and ADC3 global Interrupts                             \n  CAN1_TX_IRQn                = 19,     !< CAN1 TX Interrupt                                                 \n  CAN1_RX0_IRQn               = 20,     !< CAN1 RX0 Interrupt                                               \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                                \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                                \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                                     \n  TIM1_BRK_TIM9_IRQn          = 24,     !< TIM1 Break interrupt and TIM9 global interrupt                    \n  TIM1_UP_TIM10_IRQn          = 25,     !< TIM1 Update Interrupt and TIM10 global interrupt                  \n  TIM1_TRG_COM_TIM11_IRQn     = 26,     !< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt\n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                                   \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                             \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                             \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                             \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                              \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                              \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                              \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                              \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                             \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                             \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                                           \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                                           \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                                           \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                                   \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm (A and B) through EXTI Line Interrupt                   \n  OTG_FS_WKUP_IRQn            = 42,     !< USB OTG FS Wakeup through EXTI line interrupt                     \n  TIM8_BRK_TIM12_IRQn         = 43,     !< TIM8 Break Interrupt and TIM12 global interrupt                   \n  TIM8_UP_TIM13_IRQn          = 44,     !< TIM8 Update Interrupt and TIM13 global interrupt                  \n  TIM8_TRG_COM_TIM14_IRQn     = 45,     !< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare global interrupt                             \n  DMA1_Stream7_IRQn           = 47,     !< DMA1 Stream7 Interrupt                                            \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                             \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                             \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                             \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                             \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                                            \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                                            \n  TIM6_DAC_IRQn               = 54,     !< TIM6 global and DAC1&2 underrun error  interrupts                 \n  TIM7_IRQn                   = 55,     !< TIM7 global interrupt                                             \n  DMA2_Stream0_IRQn           = 56,     !< DMA2 Stream 0 global Interrupt                                    \n  DMA2_Stream1_IRQn           = 57,     !< DMA2 Stream 1 global Interrupt                                    \n  DMA2_Stream2_IRQn           = 58,     !< DMA2 Stream 2 global Interrupt                                    \n  DMA2_Stream3_IRQn           = 59,     !< DMA2 Stream 3 global Interrupt                                    \n  DMA2_Stream4_IRQn           = 60,     !< DMA2 Stream 4 global Interrupt                                    \n  ETH_IRQn                    = 61,     !< Ethernet global Interrupt                                         \n  ETH_WKUP_IRQn               = 62,     !< Ethernet Wakeup through EXTI line Interrupt                      \n  CAN2_TX_IRQn                = 63,     !< CAN2 TX Interrupt                                                 \n  CAN2_RX0_IRQn               = 64,     !< CAN2 RX0 Interrupt                                                \n  CAN2_RX1_IRQn               = 65,     !< CAN2 RX1 Interrupt                                                \n  CAN2_SCE_IRQn               = 66,     !< CAN2 SCE Interrupt                                                \n  OTG_FS_IRQn                 = 67,     !< USB OTG FS global Interrupt                                       \n  DMA2_Stream5_IRQn           = 68,     !< DMA2 Stream 5 global interrupt                                    \n  DMA2_Stream6_IRQn           = 69,     !< DMA2 Stream 6 global interrupt                                    \n  DMA2_Stream7_IRQn           = 70,     !< DMA2 Stream 7 global interrupt                                  \n  USART6_IRQn                 = 71,     !< USART6 global interrupt                                           \n  I2C3_EV_IRQn                = 72,     !< I2C3 event interrupt                                             \n  I2C3_ER_IRQn                = 73,     !< I2C3 error interrupt                                             \n  OTG_HS_EP1_OUT_IRQn         = 74,     !< USB OTG HS End Point 1 Out global interrupt                       \n  OTG_HS_EP1_IN_IRQn          = 75,     !< USB OTG HS End Point 1 In global interrupt                        \n  OTG_HS_WKUP_IRQn            = 76,     !< USB OTG HS Wakeup through EXTI interrupt                          \n  OTG_HS_IRQn                 = 77,     !< USB OTG HS global interrupt                                       \n  DCMI_IRQn                   = 78,     !< DCMI global interrupt                                             \n  RNG_IRQn                    = 80,     !< RNG global Interrupt                                              \n  FPU_IRQn                    = 81      !< FPU global interrupt                                               \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n//void TIM3_IRQHandler()\n//{\n//  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n//  {\n//    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n//    Interrupt::TIM3_Wrapper();\n//  }\n//}\n\n\nvoid TIM9_IRQHandler()\n{\n  if(TIM9->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM9->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM9_Wrapper();\n  }\n}\n\nvoid TIM10_IRQHandler()\n{\n  if(TIM10->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM10->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM10_Wrapper();\n  }\n}\n\nvoid TIM11_IRQHandler()\n{\n  if(TIM11->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM11->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM11_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\nvoid pruThread::registerModulePost(Module* module)\n{\n\tthis->vThreadPost.push_back(module);\n\tthis->hasThreadPost = true;\n}\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n\n    // iterate over the second vector that contains module pointers to run after (post) the main vector\n\tif (hasThreadPost)\n\t{\n\t\tfor (iter = vThreadPost.begin(); iter != vThreadPost.end(); ++iter) (*iter)->runModulePost();\n\t}\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32f4xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n        bool hasThreadPost;\t\t// run updatePost() vector\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n        vector<Module*> vThreadPost;\t\t// vector containing pointers to Thread modules that run after the main vector modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void registerModulePost(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32f4xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 3\\n\\r\");\n        __TIM3_CLK_ENABLE();\n        TIM_CLK = APB2CLK;\n    }\n    else if (this->timer == TIM9)\n    {\n        printf(\"\tpower on Timer 9\\n\\r\");\n        __TIM9_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM10)\n    {\n        printf(\"\tpower on Timer 10\\n\\r\");\n        __TIM10_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM11)\n    {\n        printf(\"\tpower on Timer 11\\n\\r\");\n        __TIM11_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32F4/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 4\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock/2\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32g0xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin),\n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PB_12)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_15_IRQn, 5, 0);\n    }\n    else if (this->interruptPin == PA_15)\n    {\n        // interrupt pin is not the NSS pin, ie the board shares the SPI bus with the SD card\n        // configure the SPI in software NSS mode and always on\n        sharedSPI = true;\n        HAL_NVIC_SetPriority(EXTI4_15_IRQn , 5, 0);\n    }\n\n\n    slaveSelect.rise(callback(this, &RemoraComms::processPacket));  \n}\n\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI2)\n    {\n        printf(\"Initialising SPI2 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PB12     ------> SPI2_NSS\n        PB13     ------> SPI2_SCK\n        PB14     ------> SPI2_MISO\n        PB11     ------> SPI2_MOSI\n        */\n\n        GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_11;\n        GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_14;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n        HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI2_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        }\n        this->spiHandle.Init.BaudRatePrescaler        = SPI_BAUDRATEPRESCALER_2;\n        this->spiHandle.Init.FirstBit       = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode         = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial  = 10;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n \n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOB_CLK_ENABLE();\n        __HAL_RCC_DMA1_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA1_Channel3;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        \n         HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);\n        ///NVIC_SetVector(DMA1_Channel3_IRQn, (uint32_t)&DMA1_Channel3_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);\n\n        this->hdma_spi_rx.Instance                   = DMA1_Channel2;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n\n        //HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);\n        //NVIC_SetVector(DMA1_Channel2_IRQn, (uint32_t)&DMA1_Channel2_IRQHandler);\n        //HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::processPacket()\n{\n    switch (this->spiRxBuffer.header)\n    {\n      case PRU_READ:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // READ so do nothing with the received data\n        break;\n\n      case PRU_WRITE:\n        this->SPIdata = true;\n        this->rejectCnt = 0;\n        // we've got a good WRITE header, move the data to rxData\n\n        // **** would like to use DMA for this but cannot when the stream is in CIRCULAR mode for the SPI transfer ****\n        // TODO: figure out how to use NORMAL mode for SPI...\n        //this->status = HAL_DMA_Start(&hdma_memtomem_dma2_stream1, (uint32_t)&this->spiRxBuffer.rxBuffer, (uint32_t)this->rxData->rxBuffer, SPI_BUFF_SIZE);\n        //if (this->status != HAL_OK) printf(\"F\\n\");\n\n        // Do it the slower way. This does not seem to impact performance but not great to stay in ISR context for longer.. :-(\n        for (int i = 0; i < SPI_BUFF_SIZE; i++)\n        {\n            this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n        }\n\n        break;\n\n      default:\n        this->rejectCnt++;\n        if (this->rejectCnt > 5)\n        {\n            this->SPIdataError = true;\n        }\n        // reset SPI somehow\n    }\n\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->SPIdata;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->SPIdata = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32g0xx_hal.h\"\n\n\n\nclass RemoraComms\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n        uint8_t             rejectCnt;\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void processPacket(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n        void init(void);\n        void start(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32g0xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[5] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        //if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        //if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PC_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PC_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PC_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PC_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PC_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PC_5); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32g0xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->init();\n\n}\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(NC)\n{\n    this->init();;\n}\n\nvoid QEIdriver::interruptHandler()\n{\n\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return false;\n}\n\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n    printf(\"        This target does not support a QEI module\\n\");\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32g0xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM1, TIM1_BRK_UP_TRG_COM_IRQn, base_freq);\n    NVIC_SetVector(TIM1_BRK_UP_TRG_COM_IRQn, (uint32_t)TIM1_IRQHandler);\n    NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 2);\n\n    servoThread = new pruThread(TIM2, TIM2_IRQn, servo_freq);\n    NVIC_SetVector(TIM2_IRQn, (uint32_t)TIM2_IRQHandler);\n    NVIC_SetPriority(TIM2_IRQn , 3);\n\n    commsThread = new pruThread(TIM3, TIM3_TIM4_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM3_TIM4_IRQn, (uint32_t)TIM3_IRQHandler);\n    NVIC_SetPriority(TIM3_TIM4_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32g0xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\nvoid Interrupt::TIM1_Wrapper(void)\n{\n\tISRVectorTable[TIM1_BRK_UP_TRG_COM_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM2_Wrapper(void)\n{\n\tISRVectorTable[TIM2_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM3_Wrapper(void)\n{\n\tISRVectorTable[TIM3_TIM4_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t31\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n\t\tstatic void TIM1_Wrapper();\n        static void TIM2_Wrapper();\n        static void TIM3_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !< Window WatchDog Interrupt                            \n  PVD_IRQn                    = 1,      !< PVD through EXTI Line detection Interrupt            \n  TAMPER_IRQn                 = 2,      !< Tamper Interrupt                                     \n  RTC_IRQn                    = 3,      !< RTC global Interrupt                                 \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                               \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                 \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                 \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                 \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                 \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                 \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                 \n  DMA1_Channel1_IRQn          = 11,     !< DMA1 Channel 1 global Interrupt                      \n  DMA1_Channel2_IRQn          = 12,     !< DMA1 Channel 2 global Interrupt                      \n  DMA1_Channel3_IRQn          = 13,     !< DMA1 Channel 3 global Interrupt                      \n  DMA1_Channel4_IRQn          = 14,     !< DMA1 Channel 4 global Interrupt                      \n  DMA1_Channel5_IRQn          = 15,     !< DMA1 Channel 5 global Interrupt                      \n  DMA1_Channel6_IRQn          = 16,     !< DMA1 Channel 6 global Interrupt                      \n  DMA1_Channel7_IRQn          = 17,     !< DMA1 Channel 7 global Interrupt                      \n  ADC1_2_IRQn                 = 18,     !< ADC1 and ADC2 global Interrupt                       \n  USB_HP_CAN1_TX_IRQn         = 19,     !< USB Device High Priority or CAN1 TX Interrupts       \n  USB_LP_CAN1_RX0_IRQn        = 20,     !< USB Device Low Priority or CAN1 RX0 Interrupts       \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                   \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                   \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                        \n  TIM1_BRK_IRQn               = 24,     !< TIM1 Break Interrupt                                 \n  TIM1_UP_IRQn                = 25,     !< TIM1 Update Interrupt                                \n  TIM1_TRG_COM_IRQn           = 26,     !< TIM1 Trigger and Commutation Interrupt               \n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                       \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                 \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                 \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                 \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                 \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                              \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                              \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                              \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                      \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm through EXTI Line Interrupt                \n  USBWakeUp_IRQn              = 42,     !< USB Device WakeUp from suspend through EXTI Line Interrupt \n  TIM8_BRK_IRQn               = 43,     !< TIM8 Break Interrupt                                 \n  TIM8_UP_IRQn                = 44,     !< TIM8 Update Interrupt                                \n  TIM8_TRG_COM_IRQn           = 45,     !< TIM8 Trigger and Commutation Interrupt               \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare Interrupt                       \n  ADC3_IRQn                   = 47,     !< ADC3 global Interrupt                                \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                               \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                               \n  TIM6_IRQn                   = 54,     !< TIM6 global Interrupt                                \n  TIM7_IRQn                   = 55,     !< TIM7 global Interrupt                                \n  DMA2_Channel1_IRQn          = 56,     !< DMA2 Channel 1 global Interrupt                      \n  DMA2_Channel2_IRQn          = 57,     !< DMA2 Channel 2 global Interrupt                      \n  DMA2_Channel3_IRQn          = 58,     !< DMA2 Channel 3 global Interrupt                      \n  DMA2_Channel4_5_IRQn        = 59,     !< DMA2 Channel 4 and Channel 5 global Interrupt                                                   \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n\nvoid TIM1_IRQHandler()\n{\n  if(TIM1->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM1->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM1_Wrapper();\n  }\n}\n\nvoid TIM2_IRQHandler()\n{\n  if(TIM2->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM2->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM2_Wrapper();\n  }\n}\n\nvoid TIM3_IRQHandler()\n{\n  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM3_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32g0xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32g0xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM1)\n    {\n        printf(\"\tpower on Timer 1\\n\\r\");\n        __HAL_RCC_TIM1_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM2)\n    {\n        printf(\"\tpower on Timer 2\\n\\r\");\n        __HAL_RCC_TIM2_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 30\\n\\r\");\n        __HAL_RCC_TIM3_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n\n\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32G0/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 1\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/SDIO/SDIOBlockDevice.cpp",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"mbed.h\"\n#include <errno.h>\n#include \"platform/mbed_debug.h\"\n#include \"platform/mbed_wait_api.h\"\n#include \"SDIOBlockDevice.h\"\n\nnamespace mbed\n{\n\n/*\n *  defines\n */\n\n#define SD_DBG 1       /*!< 1 - Enable debugging */\n#define SD_CMD_TRACE 0 /*!< 1 - Enable SD command tracing */\n\n#define SD_BLOCK_DEVICE_ERROR_WOULD_BLOCK -5001           /*!< operation would block */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED -5002           /*!< unsupported operation */\n#define SD_BLOCK_DEVICE_ERROR_PARAMETER -5003             /*!< invalid parameter */\n#define SD_BLOCK_DEVICE_ERROR_NO_INIT -5004               /*!< uninitialized */\n#define SD_BLOCK_DEVICE_ERROR_NO_DEVICE -5005             /*!< device is missing or not connected */\n#define SD_BLOCK_DEVICE_ERROR_WRITE_PROTECTED -5006       /*!< write protected */\n#define SD_BLOCK_DEVICE_ERROR_UNUSABLE -5007              /*!< unusable card */\n#define SD_BLOCK_DEVICE_ERROR_NO_RESPONSE -5008           /*!< No response from device */\n#define SD_BLOCK_DEVICE_ERROR_CRC -5009                   /*!< CRC error */\n#define SD_BLOCK_DEVICE_ERROR_ERASE -5010                 /*!< Erase error: reset/sequence */\n#define SD_BLOCK_DEVICE_ERROR_WRITE -5011                 /*!< SPI Write error: !SPI_DATA_ACCEPTED */\n#define SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE -5012 /*!< unsupported blocksize, only 512 byte supported */\n#define SD_BLOCK_DEVICE_ERROR_READBLOCKS -5013            /*!< read data blocks from SD failed */\n#define SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS -5014           /*!< write data blocks to SD failed */\n#define SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS -5015           /*!< erase data blocks to SD failed */\n\n#define BLOCK_SIZE_HC 512 /*!< Block size supported for SD card is 512 bytes  */\n\n// Types\n#define SDCARD_NONE 0  /**< No card is present */\n#define SDCARD_V1 1    /**< v1.x Standard Capacity */\n#define SDCARD_V2 2    /**< v2.x Standard capacity SD card */\n#define SDCARD_V2HC 3  /**< v2.x High capacity SD card */\n#define CARD_UNKNOWN 4 /**< Unknown or unsupported card */\n\n#ifndef MBED_CONF_SD_TIMEOUT\n#define MBED_CONF_SD_TIMEOUT (30 * 1000) /* ms */\n#endif\n\nconstexpr auto delayTime = 2ms;\n\nSDIOBlockDevice::SDIOBlockDevice(PinName cardDetect) : _cardDetect(cardDetect),\n                                                       _is_initialized(0),\n                                                       _sectors(0),\n                                                       _init_ref_count(0)\n{\n    _card_type = SDCARD_NONE;\n\n    // Only HC block size is supported.\n    _block_size = BLOCK_SIZE_HC;\n    _erase_size = BLOCK_SIZE_HC;\n}\n\nSDIOBlockDevice::~SDIOBlockDevice()\n{\n    if (_is_initialized)\n    {\n        deinit();\n    }\n}\n\nint SDIOBlockDevice::init()\n{\n    debug_if(SD_DBG, \"init Card...\\r\\n\");\n\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n    }\n\n    _init_ref_count++;\n\n    if (_init_ref_count != 1)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n\n    int status = SD_Init();\n    if (BD_ERROR_OK != status)\n    {\n        unlock();\n        return BD_ERROR_DEVICE_ERROR;\n    }\n\n    SD_GetCardInfo(&_cardInfo);\n    _is_initialized = true;\n    debug_if(SD_DBG, \"SD initialized: type: %ld  version: %ld  class: %ld\\n\",\n             _cardInfo.CardType, _cardInfo.CardVersion, _cardInfo.Class);\n    debug_if(SD_DBG, \"SD size: %ld MB\\n\",\n             _cardInfo.LogBlockNbr / 2 / 1024);\n\n    // get sectors count from cardinfo\n    _sectors = _cardInfo.LogBlockNbr;\n    if (BLOCK_SIZE_HC != _cardInfo.BlockSize)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_UNSUPPORTED_BLOCKSIZE;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::deinit()\n{\n    debug_if(SD_DBG, \"deinit Card...\\r\\n\");\n    lock();\n\n    if (!_is_initialized)\n    {\n        _init_ref_count = 0;\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    _init_ref_count--;\n\n    if (_init_ref_count)\n    {\n        unlock();\n        return BD_ERROR_OK;\n    }\n\n    int status = SD_DeInit();\n    _is_initialized = false;\n\n    _sectors = 0;\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::read(void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_read(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    uint32_t *_buffer = static_cast<uint32_t *>(buffer);\n\n    // ReadBlocks uses byte unit address\n    // SDHC and SDXC Cards different addressing is handled in ReadBlocks()\n    bd_addr_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n            ThisThread::sleep_for(delayTime);\n        }\n    }\n\n    // receive the data : one block/ multiple blocks is handled in ReadBlocks()\n    int status = SD_ReadBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"ReadBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_ReadPending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n            ThisThread::sleep_for(delayTime);\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n            }\n            ThisThread::sleep_for(delayTime);\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"ReadBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_READBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::program(const void *buffer, bd_addr_t addr, bd_size_t size)\n{\n    lock();\n\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!is_valid_program(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    // HAL layer uses uint32_t for addr/size\n    uint32_t *_buffer = (uint32_t *)(buffer);\n\n    // Get block count\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    // make sure card is ready\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n\n    int status = SD_WriteBlocks_DMA(_buffer, addr, blockCnt);\n    debug_if(SD_DBG, \"WriteBlocks dbgtest addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n\n    if (status == MSD_OK)\n    {\n        // wait until DMA finished\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_DMA_WritePending() != SD_TRANSFER_OK)\n        {\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n        // make sure card is ready\n        tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n            }\n        }\n    }\n    else\n    {\n        debug_if(SD_DBG, \"WriteBlocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_WRITEBLOCKS;\n    }\n\n    unlock();\n    return status;\n}\n\nint SDIOBlockDevice::trim(bd_addr_t addr, bd_size_t size)\n{\n    debug_if(SD_DBG, \"trim Card...\\r\\n\");\n    lock();\n    if (isPresent() == false)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_DEVICE;\n    }\n    if (!_is_valid_trim(addr, size))\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_PARAMETER;\n    }\n\n    if (!_is_initialized)\n    {\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_NO_INIT;\n    }\n\n    bd_size_t blockCnt = size / _block_size;\n    addr = addr / _block_size;\n\n    int status = SD_Erase(addr, blockCnt);\n    if (status != 0)\n    {\n        debug_if(SD_DBG, \"Erase blocks failed! addr: %lld  blockCnt: %lld \\n\", addr, blockCnt);\n        unlock();\n        return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n    }\n    else\n    {\n        uint32_t tickstart = HAL_GetTick();\n        while (SD_GetCardState() != SD_TRANSFER_OK)\n        {\n            // wait until SD ready\n            if ((HAL_GetTick() - tickstart) >= MBED_CONF_SD_TIMEOUT)\n            {\n                unlock();\n                return SD_BLOCK_DEVICE_ERROR_ERASEBLOCKS;\n            }\n        }\n    }\n\n    unlock();\n    return status;\n}\n\nbd_size_t SDIOBlockDevice::get_read_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::get_program_size() const\n{\n    return _block_size;\n}\n\nbd_size_t SDIOBlockDevice::size() const\n{\n    return _block_size * _sectors;\n}\n\nvoid SDIOBlockDevice::debug(bool dbg)\n{\n}\n\nbool SDIOBlockDevice::_is_valid_trim(bd_addr_t addr, bd_size_t size)\n{\n    return (\n        addr % _erase_size == 0 &&\n        size % _erase_size == 0 &&\n        addr + size <= this->size());\n}\n\nbool SDIOBlockDevice::isPresent(void)\n{\n    if (_cardDetect.is_connected()) {\n        return (_cardDetect.read() == 0);\n    }\n    else {\n        return true;\n    }\n}\n\nconst char *SDIOBlockDevice::get_type() const\n{\n    return \"SDIO\";\n}\n\n} // namespace mbed\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/SDIO/SDIOBlockDevice.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#define MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_\n\n#include \"BlockDevice.h\"\n#include \"DigitalIn.h\"\n#include \"rtos/Mutex.h\"\n#include \"sdio_device.h\"\n\nnamespace mbed\n{\n\nclass SDIOBlockDevice : public BlockDevice\n{\n  public:\n    SDIOBlockDevice(PinName cardDetect = NC);\n    virtual ~SDIOBlockDevice();\n    /** Initialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int init();\n\n    /** Deinitialize a block device\n     *\n     *  @return         0 on success or a negative error code on failure\n     */\n    virtual int deinit();\n\n    /** Read blocks from a block device\n     *\n     *  @param buffer   Buffer to write blocks to\n     *  @param addr     Address of block to begin reading from\n     *  @param size     Size to read in bytes, must be a multiple of read block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int read(void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Program blocks to a block device\n     *\n     *  The blocks must have been erased prior to being programmed\n     *\n     *  @param buffer   Buffer of data to write to blocks\n     *  @param addr     Address of block to begin writing to\n     *  @param size     Size to write in bytes, must be a multiple of program block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int program(const void *buffer, bd_addr_t addr, bd_size_t size);\n\n    /** Mark blocks as no longer in use\n     *\n     *  This function provides a hint to the underlying block device that a region of blocks\n     *  is no longer in use and may be erased without side effects. Erase must still be called\n     *  before programming, but trimming allows flash-translation-layers to schedule erases when\n     *  the device is not busy.\n     *\n     *  @param addr     Address of block to mark as unused\n     *  @param size     Size to mark as unused in bytes, must be a multiple of erase block size\n     *  @return         0 on success, negative error code on failure\n     */\n    virtual int trim(bd_addr_t addr, bd_size_t size);\n\n    /** Get the size of a readable block\n     *\n     *  @return         Size of a readable block in bytes\n     */\n    virtual bd_size_t get_read_size() const;\n\n    /** Get the size of a programable block\n     *\n     *  @return         Size of a programable block in bytes\n     *  @note Must be a multiple of the read size\n     */\n    virtual bd_size_t get_program_size() const;\n\n    /** Get the total size of the underlying device\n     *\n     *  @return         Size of the underlying device in bytes\n     */\n    virtual bd_size_t size() const;\n\n    /** Enable or disable debugging\n     *\n     *  @param dbg        State of debugging\n     */\n    virtual void debug(bool dbg);\n\n    /** Set the transfer frequency\n     *\n     *  @param freq     Transfer frequency\n     *  @note Max frequency supported is 25MHZ\n     */\n    virtual int frequency(uint64_t freq) { return BD_ERROR_OK; };\n\n    /** check if SD is present\n     *\n     *  @note check physical present switch. Maybe not support by hardware, then function will always return true.\n     */\n    virtual bool isPresent(void);\n\n     /** Get the BlockDevice class type.\n     *\n     *  @return         A string representation of the BlockDevice class type.\n     */\n    virtual const char *get_type() const;\n\n\n  private:\n    DigitalIn _cardDetect;\n    bool _is_initialized;\n    bd_size_t _block_size;\n    bd_size_t _erase_size;\n    bd_size_t _sectors;\n    uint32_t _init_ref_count;\n    SD_Cardinfo_t _cardInfo;\n    uint32_t _card_type;\n\n    mutable rtos::Mutex _mutex;\n    virtual void lock()\n    {\n        _mutex.lock();\n    }\n\n    virtual void unlock()\n    {\n        _mutex.unlock();\n    }\n\n    bool _is_valid_trim(bd_addr_t addr, bd_size_t size);\n};\n\n} // namespace mbed\n\n#endif /* MBED_OS_FEATURES_STORAGE_BLOCKDEVICE_SDIOBLOCKDEVICE_H_ */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/SDIO/sdio_device.c",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n#include \"sdio_device.h\"\n#include \"platform/mbed_error.h\"\n\n/* Extern variables ---------------------------------------------------------*/\n\nSD_HandleTypeDef hsd;\n\n// simple flags for DMA pending signaling\nvolatile uint8_t SD_DMA_ReadPendingState = SD_TRANSFER_OK;\nvolatile uint8_t SD_DMA_WritePendingState = SD_TRANSFER_OK;\n\nstatic void _SDMMC1_IRQHandler(void)\n{\n    HAL_SD_IRQHandler(&hsd);\n}\n\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspInit(SD_HandleTypeDef *hsd)\n{\n    IRQn_Type IRQn;\n    GPIO_InitTypeDef GPIO_InitStruct = {0};\n    RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n    if (hsd->Instance == SDMMC1)\n    {\n        PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC;\n        PeriphClkInitStruct.PLL2.PLL2M = 5;         // 25 MHz / 5 = 5 MHz\n        PeriphClkInitStruct.PLL2.PLL2N = 160;       // 5 MHz * 160 = 800 MHz (140: 700 MHz, 120: 600 MHz)\n        PeriphClkInitStruct.PLL2.PLL2P = 4;\n        PeriphClkInitStruct.PLL2.PLL2Q = 8;\n        PeriphClkInitStruct.PLL2.PLL2R = 4;        // 64: 12.5 MHz  32: 25 MHz 16: 50 MHz   8: 100 MHz  4: 200 MHz\n        PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_2;\n        PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;\n        PeriphClkInitStruct.PLL2.PLL2FRACN = 0;\n        PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL2;\n        if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)\n        {\n            error(\"SDMMC clock Init error at %d in %s\", __LINE__, __FILE__);\n        }\n\n        /* Peripheral clock enable */\n        __HAL_RCC_SDMMC1_CLK_ENABLE();\n\n        __HAL_RCC_GPIOC_CLK_ENABLE();\n        __HAL_RCC_GPIOD_CLK_ENABLE();\n        /**SDMMC1 GPIO Configuration\n        PC8     ------> SDMMC1_D0\n        PC9     ------> SDMMC1_D1\n        PC10     ------> SDMMC1_D2\n        PC11     ------> SDMMC1_D3\n        PC12     ------> SDMMC1_CK\n        PD2     ------> SDMMC1_CMD\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;\n        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n        GPIO_InitStruct.Pin = GPIO_PIN_2;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1;\n        HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);\n\n        // SDMMC1 interrupt Init\n        IRQn = SDMMC1_IRQn;\n        HAL_NVIC_SetPriority(IRQn, 0, 0);   // 0: highest prio, 15 lowest\n        NVIC_SetVector(IRQn, (uint32_t)&_SDMMC1_IRQHandler);\n        HAL_NVIC_EnableIRQ(IRQn);\n    }\n    \n}\n\n/**\n *\n * @param hsd:  Handle for SD handle Structure definition\n */\nvoid HAL_SD_MspDeInit(SD_HandleTypeDef *hsd)\n{\n    if (hsd->Instance == SDMMC1) {\n        __HAL_RCC_SDMMC1_CLK_DISABLE();\n\n        /**SDMMC1 GPIO Configuration\n        PC8     ------> SDMMC1_D0\n        PC9     ------> SDMMC1_D1\n        PC10     ------> SDMMC1_D2\n        PC11     ------> SDMMC1_D3\n        PC12     ------> SDMMC1_CK\n        PD2     ------> SDMMC1_CMD\n        */\n        HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11\n                            |GPIO_PIN_12);\n\n        HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);\n    }\n}\n\n/**\n * @brief  DeInitializes the SD MSP.\n * @param  hsd: SD handle\n * @param  Params : pointer on additional configuration parameters, can be NULL.\n */\nvoid SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)\n{\n\n#if 0\n    if (hsd->Instance == SDMMC2) {\n    }\n#endif\n}\n\n\n\n/**\n * @brief  Initializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_Init(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    hsd.Instance = SDMMC1;\n    hsd.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;\n    hsd.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_ENABLE;\n    hsd.Init.BusWide = SDMMC_BUS_WIDE_4B;\n    hsd.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_ENABLE;\n    hsd.Init.ClockDiv = 2;          // SDMMC kernel clock / (2 * 2) = 50 MHz\n\n    /* HAL SD initialization */\n    sd_state = HAL_SD_Init(&hsd);\n\n    sd_state = HAL_SD_ConfigSpeedBusOperation(&hsd, SDMMC_SPEED_MODE_AUTO);\n\n   \n    return sd_state;\n}\n\n/**\n * @brief  DeInitializes the SD card device.\n * @retval SD status\n */\nuint8_t SD_DeInit(void)\n{\n    uint8_t sd_state = MSD_OK;\n\n    /* HAL SD deinitialization */\n    if (HAL_SD_DeInit(&hsd) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    /* Msp SD deinitialization */\n    SD_MspDeInit(&hsd, NULL);\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @param  Timeout: Timeout for read operation\n * @retval SD status\n */\nuint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_ReadBlocks(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in polling mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @param  Timeout: Timeout for write operation\n * @retval SD status\n */\nuint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_WriteBlocks(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Reads block(s) from a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  ReadAddr: Address from where data is to be read\n * @param  NumOfBlocks: Number of SD blocks to read\n * @retval SD status\n */\nuint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks)\n{\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_ReadPendingState = SD_TRANSFER_BUSY;\n\n    if ((uint32_t)pData & 3) {\n        __BKPT(0);\n    }\n\n    /*\n    the SCB_InvalidateDCache_by_Addr() requires a 32-Byte aligned address,\n    adjust the address and the D-Cache size to invalidate accordingly.\n    */\n    uint32_t alignedAddr = (uint32_t)pData & ~0x1F;\n    SCB_InvalidateDCache_by_Addr((uint32_t*)alignedAddr, NumOfBlocks*BLOCKSIZE + ((uint32_t)pData - alignedAddr));\n    \n    /* Read block(s) in DMA transfer mode */\n    if (HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Writes block(s) to a specified address in an SD card, in DMA mode.\n * @param  pData: Pointer to the buffer that will contain the data to transmit\n * @param  WriteAddr: Address from where data is to be written\n * @param  NumOfBlocks: Number of SD blocks to write\n * @retval SD status\n */\nuint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks)\n{\n    // Ensure the data is flushed to main memory\n    SCB_CleanDCache_by_Addr(pData, NumOfBlocks * 512);      // Todo: use real blocksize\n\n    uint8_t sd_state = MSD_OK;\n    SD_DMA_WritePendingState = SD_TRANSFER_BUSY;\n\n    /* Write block(s) in DMA transfer mode */\n    if (HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n        SD_DMA_WritePendingState = SD_TRANSFER_OK;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Erases the specified memory area of the given SD card.\n * @param  StartAddr: Start byte address\n * @param  EndAddr: End byte address\n * @retval SD status\n */\nuint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr)\n{\n    uint8_t sd_state = MSD_OK;\n\n    if (HAL_SD_Erase(&hsd, StartAddr, EndAddr) != HAL_OK)\n    {\n        sd_state = MSD_ERROR;\n    }\n\n    return sd_state;\n}\n\n/**\n * @brief  Gets the current SD card data status.\n * @param  None\n * @retval Data transfer state.\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_GetCardState(void)\n{\n    return ((HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY);\n}\n\n/**\n * @brief  Get SD information about specific SD card.\n * @param  CardInfo: Pointer to HAL_SD_CardInfoTypedef structure\n * @retval None\n */\nvoid SD_GetCardInfo(SD_Cardinfo_t *CardInfo)\n{\n    /* Get SD card Information, copy structure for portability */\n    HAL_SD_CardInfoTypeDef HAL_CardInfo;\n\n    HAL_SD_GetCardInfo(&hsd, &HAL_CardInfo);\n\n    if (CardInfo)\n    {\n        CardInfo->CardType = HAL_CardInfo.CardType;\n        CardInfo->CardVersion = HAL_CardInfo.CardVersion;\n        CardInfo->Class = HAL_CardInfo.Class;\n        CardInfo->RelCardAdd = HAL_CardInfo.RelCardAdd;\n        CardInfo->BlockNbr = HAL_CardInfo.BlockNbr;\n        CardInfo->BlockSize = HAL_CardInfo.BlockSize;\n        CardInfo->LogBlockNbr = HAL_CardInfo.LogBlockNbr;\n        CardInfo->LogBlockSize = HAL_CardInfo.LogBlockSize;\n    }\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_ReadPending(void)\n{\n    return SD_DMA_ReadPendingState;\n}\n\n/**\n * @brief  Check if a DMA operation is pending\n * @retval DMA operation is pending\n *          This value can be one of the following values:\n *            @arg  SD_TRANSFER_OK: No data transfer is acting\n *            @arg  SD_TRANSFER_BUSY: Data transfer is acting\n */\nuint8_t SD_DMA_WritePending(void)\n{\n    return SD_DMA_WritePendingState;\n}\n\n/**\n  * @brief Rx Transfer completed callbacks\n  * @param hsd Pointer SD handle\n  * @retval None\n  */\nvoid HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_ReadPendingState = SD_TRANSFER_OK;\n}\n\n/**\n  * @brief Tx Transfer completed callbacks\n  * @param hsd Pointer to SD handle\n  * @retval None\n  */\nvoid HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)\n{\n    SD_DMA_WritePendingState = SD_TRANSFER_OK;\n}\n\n/**\n  * @brief SD Abort callbacks\n  * @param hsd: SD handle\n  * @retval None\n  */\nvoid HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)\n{\n      //BSP_SD_AbortCallback();\n}\n\nvoid HAL_SD_ErrorCallback(SD_HandleTypeDef *hsd)\n{\n    printf(\"SD_Error: 0x%x\\n\", hsd->ErrorCode);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/SDIO/sdio_device.h",
    "content": "/* mbed Microcontroller Library\n * Copyright (c) 2017 ARM Limited\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __SDIO_DEVICE_H\n#define __SDIO_DEVICE_H\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"stm32h7xx_hal.h\"\n\n  /* Typedefs */\n\n  typedef struct\n  {\n    uint32_t CardType;     /* Specifies the card Type                         */\n    uint32_t CardVersion;  /* Specifies the card version                      */\n    uint32_t Class;        /* Specifies the class of the card class           */\n    uint32_t RelCardAdd;   /* Specifies the Relative Card Address             */\n    uint32_t BlockNbr;     /* Specifies the Card Capacity in blocks           */\n    uint32_t BlockSize;    /* Specifies one block size in bytes               */\n    uint32_t LogBlockNbr;  /* Specifies the Card logical Capacity in blocks   */\n    uint32_t LogBlockSize; /* Specifies logical block size in bytes           */\n  } SD_Cardinfo_t;\n\n  /* External Global var  */\n\n  extern SD_HandleTypeDef hsd;\n\n/* Exported types */\n/** \n  * @brief SD Card information structure \n  */\n#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef\n\n/* Exported constants */\n/**\n  * @brief  SD status structure definition  \n  */\n#define MSD_OK ((uint8_t)0x00)\n#define MSD_ERROR ((uint8_t)0x01)\n\n/** \n  * @brief  SD transfer state definition  \n  */\n#define SD_TRANSFER_OK ((uint8_t)0x00)\n#define SD_TRANSFER_BUSY ((uint8_t)0x01)\n\n  /* Exported functions */\n  uint8_t SD_Init(void);\n  uint8_t SD_DeInit(void);\n  uint8_t SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout);\n  uint8_t SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks);\n  uint8_t SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks);\n  uint8_t SD_DMA_ReadPending(void);\n  uint8_t SD_DMA_WritePending(void);\n  uint8_t SD_Erase(uint32_t StartAddr, uint32_t EndAddr);\n\n  uint8_t SD_GetCardState(void);\n  void SD_GetCardInfo(SD_Cardinfo_t *CardInfo);\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __SDIO_DEVICE_H */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/comms/RemoraComms.cpp",
    "content": "#include \"mbed.h\"\n#include \"RemoraComms.h\"\n\n#include \"stm32h7xx_hal.h\"\n\nRemoraComms::RemoraComms(volatile rxData_t* ptrRxData, volatile txData_t* ptrTxData, SPI_TypeDef* spiType, PinName interruptPin) :\n    ptrRxData(ptrRxData),\n    ptrTxData(ptrTxData),\n    spiType(spiType),\n    interruptPin(interruptPin), \n    slaveSelect(interruptPin)\n{\n    this->spiHandle.Instance = this->spiType;\n\n    if (this->interruptPin == PA_4)\n    {\n        // interrupt pin is the NSS pin\n        sharedSPI = false;\n        HAL_NVIC_SetPriority(EXTI4_IRQn, 5, 0);\n    }\n\n    //slaveSelect.rise(callback(this, &RemoraComms::processPacket));\n    slaveSelect.rise(callback(this, &RemoraComms::NSSinterrupt));\n}\n\nvoid RemoraComms:: update()\n{\n\tif (this->data)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = true;\n\t}\n\telse\n\t{\n\t\tthis->noDataCount++;\n\t}\n\n\tif (this->noDataCount > DATA_ERR_MAX)\n\t{\n\t\tthis->noDataCount = 0;\n\t\tthis->CommsStatus = false;\n\t}\n\n\tthis->data = false;    \n}\n\n\nvoid RemoraComms::init()\n{\n    if(this->spiHandle.Instance == SPI1)\n    {\n        printf(\"Initialising SPI1 slave\\n\");\n\n        GPIO_InitTypeDef GPIO_InitStruct;\n\n        /**SPI1 GPIO Configuration\n        PA4     ------> SPI1_NSS\n        PA5     ------> SPI1_SCK\n        PA6     ------> SPI1_MISO\n        PA7     ------> SPI1_MOSI\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n        GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;\n        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n        __HAL_RCC_SPI1_CLK_ENABLE();\n\n        this->spiHandle.Init.Mode           = SPI_MODE_SLAVE;\n        this->spiHandle.Init.Direction      = SPI_DIRECTION_2LINES;\n        this->spiHandle.Init.DataSize       = SPI_DATASIZE_8BIT;\n        this->spiHandle.Init.CLKPolarity    = SPI_POLARITY_LOW;\n        this->spiHandle.Init.CLKPhase       = SPI_PHASE_1EDGE;\n        if (sharedSPI)\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_SOFT;\n            printf(\"SPI is shared with SD card\\n\");\n        }\n        else\n        {\n            this->spiHandle.Init.NSS            = SPI_NSS_HARD_INPUT;\n        } \n        this->spiHandle.Init.FirstBit                   = SPI_FIRSTBIT_MSB;\n        this->spiHandle.Init.TIMode                     = SPI_TIMODE_DISABLE;\n        this->spiHandle.Init.CRCCalculation             = SPI_CRCCALCULATION_DISABLE;\n        this->spiHandle.Init.CRCPolynomial              = 0x0;\n        this->spiHandle.Init.NSSPMode                   = SPI_NSS_PULSE_DISABLE;\n        this->spiHandle.Init.NSSPolarity                = SPI_NSS_POLARITY_LOW;\n        this->spiHandle.Init.FifoThreshold              = SPI_FIFO_THRESHOLD_01DATA;\n        this->spiHandle.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;\n        this->spiHandle.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;\n        this->spiHandle.Init.MasterSSIdleness           = SPI_MASTER_SS_IDLENESS_00CYCLE;\n        this->spiHandle.Init.MasterInterDataIdleness    = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;\n        this->spiHandle.Init.MasterReceiverAutoSusp     = SPI_MASTER_RX_AUTOSUSP_DISABLE;\n        this->spiHandle.Init.MasterKeepIOState          = SPI_MASTER_KEEP_IO_STATE_DISABLE;\n        this->spiHandle.Init.IOSwap                     = SPI_IO_SWAP_DISABLE;\n\n        HAL_SPI_Init(&this->spiHandle);\n\n        if (sharedSPI)\n        {\n            // set SSI (Slave Select Internal) low, ie same as NSS going low\n             CLEAR_BIT(this->spiHandle.Instance->CR1, SPI_CR1_SSI);\n        }\n\n        printf(\"Initialising DMA for SPI\\n\");\n\n        __HAL_RCC_GPIOA_CLK_ENABLE();\n        __HAL_RCC_DMA2_CLK_ENABLE();\n\n        this->hdma_spi_tx.Instance                   = DMA1_Stream1;\n        this->hdma_spi_tx.Init.Request               = DMA_REQUEST_SPI1_TX;\n        this->hdma_spi_tx.Init.Direction             = DMA_MEMORY_TO_PERIPH;\n        this->hdma_spi_tx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_tx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_tx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_tx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_tx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_tx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_tx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n        \n        HAL_DMA_Init(&this->hdma_spi_tx);\n\n        __HAL_LINKDMA(&this->spiHandle, hdmatx, this->hdma_spi_tx);\n\n        this->hdma_spi_rx.Instance                   = DMA1_Stream2;\n        this->hdma_spi_rx.Init.Request               = DMA_REQUEST_SPI1_RX;\n        this->hdma_spi_rx.Init.Direction             = DMA_PERIPH_TO_MEMORY;\n        this->hdma_spi_rx.Init.PeriphInc             = DMA_PINC_DISABLE;\n        this->hdma_spi_rx.Init.MemInc                = DMA_MINC_ENABLE;\n        this->hdma_spi_rx.Init.PeriphDataAlignment   = DMA_PDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.MemDataAlignment      = DMA_MDATAALIGN_BYTE;\n        this->hdma_spi_rx.Init.Mode                  = DMA_CIRCULAR;\n        //this->hdma_spi_rx.Init.Mode                  = DMA_NORMAL;\n        this->hdma_spi_rx.Init.Priority              = DMA_PRIORITY_VERY_HIGH;\n        this->hdma_spi_rx.Init.FIFOMode              = DMA_FIFOMODE_DISABLE;\n\n        HAL_DMA_Init(&this->hdma_spi_rx);\n\n        __HAL_LINKDMA(&this->spiHandle,hdmarx,this->hdma_spi_rx);\n    }\n}\n\nvoid RemoraComms::start()\n{\n    this->ptrTxData->header = PRU_DATA;\n    SCB_CleanDCache_by_Addr((uint32_t*)(((uint32_t)this->ptrTxData->txBuffer) & ~(uint32_t)0x1F), SPI_BUFF_SIZE+32);\n    SCB_CleanDCache_by_Addr((uint32_t*)(((uint32_t)this->spiRxBuffer.rxBuffer) & ~(uint32_t)0x1F), SPI_BUFF_SIZE+32);\n    HAL_SPI_TransmitReceive_DMA(&this->spiHandle, (uint8_t *)this->ptrTxData->txBuffer, (uint8_t *)this->spiRxBuffer.rxBuffer, SPI_BUFF_SIZE);\n}\n\nvoid RemoraComms::NSSinterrupt()\n{\n    // NSS / CS has gone high, packet recieved\n    this->NSS = true;\n}\n\nvoid RemoraComms::SPItasks()\n{\n    if (this->NSS)\n    {\n        this->NSS = false;\n\n        this->DMArxCnt = 0;\n        this->ticksStart = HAL_GetTick();\n\n        // wait for DMA to complete and break if DMA is not complete in time\n        while (this->DMArxCnt != SPI_BUFF_SIZE)\n        {\n            this->DMArxCnt = __HAL_DMA_GET_COUNTER(&this->hdma_spi_rx);\n            this->ticks = HAL_GetTick() - this->ticksStart;\n\n            if (this->ticks > 2)\n            {\n                this->resetSPI = true;\n                break;\n            }\n        }\n\n        if (this->resetSPI)\n        {\n            // for testing, not needed / implemented\n            printf(\"  Reset SPI now\\n\");\n            this->resetSPI = false;\n        }\n\n        switch (this->spiRxBuffer.header)\n        {\n            case PRU_READ:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // READ so do nothing with the received data\n                break;\n\n            case PRU_WRITE:\n                this->data = true;\n                this->rejectCnt = 0;\n                ++this->dataCnt;\n                // we've got a good WRITE header, move the data to rxData\n\n                // ensure an atomic access to the rxBuffer\n                // disable thread interrupts\n                __disable_irq(); \n\n                for (int i = 0; i < SPI_BUFF_SIZE; i++)\n                {\n                    this->ptrRxData->rxBuffer[i] = this->spiRxBuffer.rxBuffer[i];\n                }\n\n                // re-enable thread interrupts\n                __enable_irq();\n                \n                break;\n\n            default:\n                this->rejectCnt++;\n                if (this->rejectCnt > 5)\n                {\n                    this->SPIdataError = true;\n                }\n        }\n    }\n}\n\n\nbool RemoraComms::getStatus(void)\n{\n    return this->CommsStatus;\n}\n\nvoid RemoraComms::setStatus(bool status)\n{\n    this->CommsStatus = status;\n}\n\nbool RemoraComms::getError(void)\n{\n    return this->SPIdataError;\n}\n\nvoid RemoraComms::setError(bool error)\n{\n    this->SPIdataError = error;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/comms/RemoraComms.h",
    "content": "#ifndef REMORASPI_H\n#define REMORASPI_H\n\n#include \"mbed.h\"\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"stm32h7xx_hal.h\"\n\n\n#include \"modules/module.h\"\n\nclass RemoraComms : public Module\n{\n    private:\n\n        SPI_TypeDef*        spiType;\n        SPI_HandleTypeDef   spiHandle;\n        DMA_HandleTypeDef   hdma_spi_tx;\n        DMA_HandleTypeDef   hdma_spi_rx;\n        DMA_HandleTypeDef   hdma_memtomem_dma2_stream1;\n        HAL_StatusTypeDef   status;\n\n        uint32_t            transferCompleteFlag;\n\n        volatile rxData_t*  ptrRxData;\n        volatile txData_t*  ptrTxData;\n        rxData_t            spiRxBuffer;\n\n        uint8_t\t\t        noDataCount;\n        uint8_t             rejectCnt;\n        uint8_t             dataCnt;\n\n        uint8_t             DMArxCnt;\n        uint32_t            ticksStart;\n        uint32_t            ticks;\n\n        bool                NSS;\n        bool                resetSPI;\n\n        bool                data;\n        bool                CommsStatus;\n\n        bool                SPIdata;\n        bool                SPIdataError;\n        \n        PinName             interruptPin;\n        InterruptIn         slaveSelect;\n        bool                sharedSPI;\n        \n        void NSSinterrupt(void);\n\n    public:\n\n        RemoraComms(volatile rxData_t*, volatile txData_t*, SPI_TypeDef*, PinName);\n\n        virtual void update(void);\n\n        void init(void);\n        void start(void);\n        void SPItasks(void);\n        bool getStatus(void);\n        void setStatus(bool);\n        bool getError(void);\n        void setError(bool);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/pin/pin.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"pin.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string>\n\n#include \"stm32h7xx_hal.h\"\n\nPin::Pin(std::string portAndPin, int dir) :\n    portAndPin(portAndPin),\n    dir(dir)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n        this->pull = GPIO_NOPULL;\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n    this->configPin();\n}\n\nPin::Pin(std::string portAndPin, int dir, int modifier) :\n    portAndPin(portAndPin),\n    dir(dir),\n    modifier(modifier)\n{\n    // Set direction\n    if (this->dir == INPUT)\n    {\n        this->mode = GPIO_MODE_INPUT;\n\n        // Set pin  modifier\n        switch(this->modifier)\n        {\n            case PULLUP:\n                printf(\"  Setting pin as Pull Up\\n\");\n                this->pull = GPIO_PULLUP;\n                break;\n            case PULLDOWN:\n                printf(\"  Setting pin as Pull Down\\n\");\n                this->pull = GPIO_PULLDOWN;\n                break;\n            case NONE:\n            case PULLNONE:\n                printf(\"  Setting pin as No Pull\\n\");\n                this->pull = GPIO_NOPULL;\n                break;\n        }\n    }\n    else\n    {\n        this->mode = GPIO_MODE_OUTPUT_PP;\n        this->pull = GPIO_NOPULL;\n    }\n\n\n    this->configPin();\n}\n\nvoid Pin::configPin()\n{\n    printf(\"Creating Pin @\\n\");\n\n    //x can be (A..H) to select the GPIO peripheral for STM32F40XX and STM32F427X devices.\n    GPIO_TypeDef* gpios[8] ={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG,GPIOH};\n    \n\n    if (this->portAndPin[0] == 'P') // PXXX e.g.PA2 PC15\n    {  \n        this->portIndex     = this->portAndPin[1] - 'A';\n        this->pinNumber     = this->portAndPin[3] - '0';       \n        uint16_t pin2       = this->portAndPin[4] - '0';       \n\n        if (pin2 <= 8) \n        {\n            this->pinNumber = this->pinNumber * 10 + pin2;\n        }\n\n        this->pin = 1 << this->pinNumber; // this is equivalent to GPIO_PIN_x definition\n    }\n    else\n    {\n        printf(\"  Invalid port and pin definition\\n\");\n        return;\n    }    \n\n    printf(\"  port = GPIO%c\\n\", char('A' + this->portIndex));\n    printf(\"  pin = %d\\n\", this->pinNumber);\n\n    // translate port index into something useful\n    this->GPIOx = gpios[this->portIndex];\n\n    // enable the peripheral clock\n    switch (portIndex){\n        case 0:\n            __HAL_RCC_GPIOA_CLK_ENABLE();\n            break;\n\n        case 1:\n            __HAL_RCC_GPIOB_CLK_ENABLE();\n            break;\n\n        case 2:\n            __HAL_RCC_GPIOC_CLK_ENABLE();\n            break;\n        \n        case 3:\n            __HAL_RCC_GPIOD_CLK_ENABLE();\n            break;\n\n        case 4:\n            __HAL_RCC_GPIOE_CLK_ENABLE();\n            break;\n        \n        case 5:\n            __HAL_RCC_GPIOF_CLK_ENABLE();\n            break;\n        \n        case 6:\n            __HAL_RCC_GPIOG_CLK_ENABLE();\n            break;\n        \n        case 7:\n            __HAL_RCC_GPIOH_CLK_ENABLE();\n            break;\n    }\n\n    this->initPin();\n}\n\n\nvoid Pin::initPin()\n{\n    // Configure GPIO pin Output Level\n    HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n\n    // Configure the GPIO pin\n    this->GPIO_InitStruct.Pin = this->pin;\n    this->GPIO_InitStruct.Mode = this->mode;\n    this->GPIO_InitStruct.Pull = this->pull;\n    this->GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n    HAL_GPIO_Init(this->GPIOx, &this->GPIO_InitStruct);  \n}\n\nvoid Pin::setAsOutput()\n{\n    this->mode = GPIO_MODE_OUTPUT_PP;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::setAsInput()\n{\n    this->mode = GPIO_MODE_INPUT;\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_none()\n{\n    this->pull = GPIO_NOPULL;\n    this->initPin();\n}\n\n\nvoid Pin::pull_up()\n{\n    this->pull = GPIO_PULLUP;\n    this->initPin();\n}\n\n\nvoid Pin::pull_down()\n{\n    this->pull = GPIO_PULLDOWN;\n    this->initPin();\n}\n\n\nPinName Pin::pinToPinName()\n{\n    printf(\"PinName = 0x%x\\n\", (this->portIndex << 4) | this->pinNumber);\n    return static_cast<PinName>((this->portIndex << 4) | this->pinNumber);\n}\n\n\n// If available on this pin, return mbed hardware pwm class for this pin\nPwmOut* Pin::hardware_pwm()\n{\n    if (this->portIndex == 0)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PA_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PA_1); }\n        if (this->pinNumber == 2) { return new mbed::PwmOut(PA_2); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PA_3); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PA_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PA_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PA_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PA_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PA_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PA_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PA_11); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PA_15); }\n    }\n    else if (this->portIndex == 1)\n    {\n        if (this->pinNumber == 0) { return new mbed::PwmOut(PB_0); }\n        if (this->pinNumber == 1) { return new mbed::PwmOut(PB_1); }\n        if (this->pinNumber == 3) { return new mbed::PwmOut(PB_3); }\n        if (this->pinNumber == 4) { return new mbed::PwmOut(PB_4); }\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PB_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PB_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PB_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PB_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PB_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PB_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PB_11); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PB_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PB_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PB_15); }\n    }\n    else if (this->portIndex == 2)\n    {\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PC_6); }\n        if (this->pinNumber == 7) { return new mbed::PwmOut(PC_7); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PC_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PC_9); }\n    }\n    else if (this->portIndex == 3)\n    {\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PD_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PD_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PD_14); }\n        if (this->pinNumber == 15) { return new mbed::PwmOut(PD_15); }\n    }\n    else if (this->portIndex == 4)\n    {\n        if (this->pinNumber == 5) { return new mbed::PwmOut(PE_5); }\n        if (this->pinNumber == 6) { return new mbed::PwmOut(PE_6); }\n        if (this->pinNumber == 8) { return new mbed::PwmOut(PE_8); }\n        if (this->pinNumber == 9) { return new mbed::PwmOut(PE_9); }\n        if (this->pinNumber == 10) { return new mbed::PwmOut(PE_10); }\n        if (this->pinNumber == 11) { return new mbed::PwmOut(PE_11); }\n        if (this->pinNumber == 12) { return new mbed::PwmOut(PE_12); }\n        if (this->pinNumber == 13) { return new mbed::PwmOut(PE_13); }\n        if (this->pinNumber == 14) { return new mbed::PwmOut(PE_14); }\n    }\n    return nullptr;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/pin/pin.h",
    "content": "#ifndef PIN_H\n#define PIN_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32h7xx_hal.h\"\n\n#define INPUT 0x0\n#define OUTPUT 0x1\n\n#define NONE        0b000\n#define OPENDRAIN   0b001\n#define PULLUP      0b010\n#define PULLDOWN    0b011\n#define PULLNONE    0b100\n\nclass Pin\n{\n    private:\n\n        std::string         portAndPin;\n        uint8_t             dir;\n        uint8_t             modifier;\n        uint8_t             portIndex;\n        uint16_t            pinNumber;\n        uint16_t            pin;\n        uint32_t            mode;\n        uint32_t            pull;\n        uint32_t            speed;\n        GPIO_TypeDef*       GPIOx;\n        GPIO_InitTypeDef    GPIO_InitStruct = {0};\n\n    public:\n\n        Pin(std::string, int);\n        Pin(std::string, int, int);\n\n        PwmOut* hardware_pwm();\n\n        void configPin();\n        void initPin();\n        void setAsOutput();\n        void setAsInput();\n        void pull_none();\n        void pull_up();\n        void pull_down();\n        PinName pinToPinName();\n\n        inline bool get()\n        {\n            return HAL_GPIO_ReadPin(this->GPIOx, this->pin);\n        }\n\n        inline void set(bool value)\n        {\n            if (value)\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_SET);\n            }\n            else\n            {\n                HAL_GPIO_WritePin(this->GPIOx, this->pin, GPIO_PIN_RESET);\n            }\n        }\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/qei/qeiDriver.cpp",
    "content": "#include \"mbed.h\"\n\n#include \"qeiDriver.h\"\n\nQEIdriver::QEIdriver() :\n    qeiIndex(NC)\n{\n    this->hasIndex = false;\n    this->init();\n}\n\n\nQEIdriver::QEIdriver(bool hasIndex) :\n    hasIndex(hasIndex),\n    qeiIndex(PE_13)\n{\n    this->hasIndex = true;\n    this->irq = EXTI15_10_IRQn;\n\n    this->init();\n\n    qeiIndex.rise(callback(this, &QEIdriver::interruptHandler));\n    //NVIC_EnableIRQ(this->irq);\n    HAL_NVIC_SetPriority(this->irq, 0, 0);\n}\n\n\nvoid QEIdriver::interruptHandler()\n{\n    this->indexDetected = true;\n    this->indexCount = this->get();\n}\n\n\nuint32_t QEIdriver::get()\n{\n    return __HAL_TIM_GET_COUNTER(&htim);\n}\n\n\n// reference https://os.mbed.com/users/gregeric/code/Nucleo_Hello_Encoder/\n\nvoid QEIdriver::init()\n{\n    printf(\"  Initialising hardware QEI module\\n\");\n\n    this->htim.Instance = TIM1;\n    this->htim.Init.Prescaler = 0;\n    this->htim.Init.CounterMode = TIM_COUNTERMODE_UP;\n    this->htim.Init.Period = 65535;\n    this->htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n    this->htim.Init.RepetitionCounter = 0;\n\n    this->sConfig.EncoderMode = TIM_ENCODERMODE_TI12;\n\n    this->sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC1Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC1Filter = 0;\n\n    this->sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;\n    this->sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;\n    this->sConfig.IC2Prescaler = TIM_ICPSC_DIV1;\n    this->sConfig.IC2Filter = 0;\n\n    if (HAL_TIM_Encoder_Init(&this->htim, &this->sConfig) != HAL_OK)\n    {\n        printf(\"Couldn't Init Encoder\\r\\n\");\n    }\n\n    this->sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;\n    this->sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;\n    HAL_TIMEx_MasterConfigSynchronization(&this->htim, &this->sMasterConfig);\n\n    if (HAL_TIM_Encoder_Start(&this->htim, TIM_CHANNEL_2)!=HAL_OK)\n    {\n        printf(\"Couldn't Start Encoder\\r\\n\");\n    }\n}\n\n\nvoid HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* htim_encoder)\n{\n    GPIO_InitTypeDef GPIO_InitStruct = {0};\n    if(htim_encoder->Instance==TIM1)\n    {\n        __HAL_RCC_TIM1_CLK_ENABLE();\n\n        __HAL_RCC_GPIOE_CLK_ENABLE();\n        /**TIM1 GPIO Configuration\n        PE9     ------> TIM1_CH1\n        PE11     ------> TIM1_CH2\n        */\n        GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_11;\n        GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n        GPIO_InitStruct.Pull = GPIO_NOPULL;\n        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;\n        GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;\n        HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);\n    }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/drivers/qei/qeiDriver.h",
    "content": "#ifndef QEIDRIVER_H\n#define QEIDRIVER_H\n\n#include \"mbed.h\"\n\n#include <cstdint>\n#include <cstdlib>\n#include <cstdio>\n#include <string>\n\n#include \"stm32h7xx_hal.h\"\n\n\nclass QEIdriver\n{\n    private:\n\n        TIM_HandleTypeDef       htim;\n        TIM_Encoder_InitTypeDef sConfig  = {0};\n        TIM_MasterConfigTypeDef sMasterConfig  = {0};\n\n        InterruptIn             qeiIndex;\n        IRQn_Type \t\t        irq;\n\n        void interruptHandler();\n\n    public:\n\n        bool                    hasIndex;\n        bool                    indexDetected;\n        int32_t                 indexCount;\n\n        QEIdriver();            // for channel A & B\n        QEIdriver(bool);        // For channels A & B, and index\n\n        void init(void);\n        uint32_t get(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/createThreads.h",
    "content": "#include \"extern.h\"\n\n\nvoid createThreads(void)\n{\n    // Create the thread objects and set the interrupt vectors to RAM. This is needed\n    // as we are using the SD bootloader that requires a different code starting\n    // address. Also set interrupt priority with NVIC_SetPriority.\n\n    baseThread = new pruThread(TIM3, TIM3_IRQn, base_freq);\n    NVIC_SetVector(TIM3_IRQn, (uint32_t)TIM3_IRQHandler);\n    NVIC_SetPriority(TIM3_IRQn, 2);\n\n    servoThread = new pruThread(TIM4, TIM4_IRQn, servo_freq);\n    NVIC_SetVector(TIM4_IRQn, (uint32_t)TIM4_IRQHandler);\n    NVIC_SetPriority(TIM4_IRQn, 3);\n\n    commsThread = new pruThread(TIM5, TIM5_IRQn, PRU_COMMSFREQ);\n    NVIC_SetVector(TIM5_IRQn, (uint32_t)TIM5_IRQHandler);\n    NVIC_SetPriority(TIM5_IRQn, 4);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/interrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"stm32h7xx_hal.h\"\n\n#include <cstdio>\n\n// Define the vector table, it is only declared in the class declaration\nInterrupt* Interrupt::ISRVectorTable[] = {0};\n\n// Constructor\nInterrupt::Interrupt(void){}\n\n\n// Methods\n\nvoid Interrupt::Register(int interruptNumber, Interrupt* intThisPtr)\n{\n\tprintf(\"Registering interrupt for interrupt number = %d\\n\", interruptNumber);\n\tISRVectorTable[interruptNumber] = intThisPtr;\n}\n\n//void Interrupt::TIM3_Wrapper(void)\n//{\n//\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n//}\n\nvoid Interrupt::TIM3_Wrapper(void)\n{\n\tISRVectorTable[TIM3_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM4_Wrapper(void)\n{\n\tISRVectorTable[TIM4_IRQn]->ISR_Handler();\n}\n\nvoid Interrupt::TIM5_Wrapper(void)\n{\n\tISRVectorTable[TIM5_IRQn]->ISR_Handler();\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/interrupt.h",
    "content": "#ifndef INTERRUPT_H\n#define INTERRUPT_H\n\n// Base class for all interrupt derived classes\n\n#define PERIPH_COUNT_IRQn\t150\t\t\t\t// Total number of device interrupt sources\n\nclass Interrupt\n{\n\tprotected:\n\n\t\tstatic Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\tpublic:\n\n\t\tInterrupt(void);\n\n\t\t//static Interrupt* ISRVectorTable[PERIPH_COUNT_IRQn];\n\n\t\tstatic void Register(int interruptNumber, Interrupt* intThisPtr);\n\n\t\t// wrapper functions to ISR_Handler()\n        //static void TIM3_Wrapper();\n\t\tstatic void TIM3_Wrapper();\n        static void TIM4_Wrapper();\n        static void TIM5_Wrapper();\n\n\t\tvirtual void ISR_Handler(void) = 0;\n\n};\n\n#endif\n\n/******  STM32 specific Interrupt Numbers *********************************************************************\n  WWDG_IRQn                   = 0,      !<Window WatchDog Interrupt                                         \n  PVD_IRQn                    = 1,      !<PVD through EXTI Line detection Interrupt                         \n  TAMP_STAMP_IRQn             = 2,      !< Tamper and TimeStamp interrupts through the EXTI line             \n  RTC_WKUP_IRQn               = 3,      !< RTC Wakeup interrupt through the EXTI line                        \n  FLASH_IRQn                  = 4,      !< FLASH global Interrupt                                            \n  RCC_IRQn                    = 5,      !< RCC global Interrupt                                              \n  EXTI0_IRQn                  = 6,      !< EXTI Line0 Interrupt                                              \n  EXTI1_IRQn                  = 7,      !< EXTI Line1 Interrupt                                              \n  EXTI2_IRQn                  = 8,      !< EXTI Line2 Interrupt                                              \n  EXTI3_IRQn                  = 9,      !< EXTI Line3 Interrupt                                              \n  EXTI4_IRQn                  = 10,     !< EXTI Line4 Interrupt                                              \n  DMA1_Stream0_IRQn           = 11,     !< DMA1 Stream 0 global Interrupt                                    \n  DMA1_Stream1_IRQn           = 12,     !< DMA1 Stream 1 global Interrupt                                    \n  DMA1_Stream2_IRQn           = 13,     !< DMA1 Stream 2 global Interrupt                                    \n  DMA1_Stream3_IRQn           = 14,     !< DMA1 Stream 3 global Interrupt                                    \n  DMA1_Stream4_IRQn           = 15,     !< DMA1 Stream 4 global Interrupt                                    \n  DMA1_Stream5_IRQn           = 16,     !< DMA1 Stream 5 global Interrupt                                    \n  DMA1_Stream6_IRQn           = 17,     !< DMA1 Stream 6 global Interrupt                                    \n  ADC_IRQn                    = 18,     !< ADC1, ADC2 and ADC3 global Interrupts                             \n  CAN1_TX_IRQn                = 19,     !< CAN1 TX Interrupt                                                 \n  CAN1_RX0_IRQn               = 20,     !< CAN1 RX0 Interrupt                                               \n  CAN1_RX1_IRQn               = 21,     !< CAN1 RX1 Interrupt                                                \n  CAN1_SCE_IRQn               = 22,     !< CAN1 SCE Interrupt                                                \n  EXTI9_5_IRQn                = 23,     !< External Line[9:5] Interrupts                                     \n  TIM1_BRK_TIM9_IRQn          = 24,     !< TIM1 Break interrupt and TIM9 global interrupt                    \n  TIM1_UP_TIM10_IRQn          = 25,     !< TIM1 Update Interrupt and TIM10 global interrupt                  \n  TIM1_TRG_COM_TIM11_IRQn     = 26,     !< TIM1 Trigger and Commutation Interrupt and TIM11 global interrupt\n  TIM1_CC_IRQn                = 27,     !< TIM1 Capture Compare Interrupt                                   \n  TIM2_IRQn                   = 28,     !< TIM2 global Interrupt                                             \n  TIM3_IRQn                   = 29,     !< TIM3 global Interrupt                                             \n  TIM4_IRQn                   = 30,     !< TIM4 global Interrupt                                             \n  I2C1_EV_IRQn                = 31,     !< I2C1 Event Interrupt                                              \n  I2C1_ER_IRQn                = 32,     !< I2C1 Error Interrupt                                              \n  I2C2_EV_IRQn                = 33,     !< I2C2 Event Interrupt                                              \n  I2C2_ER_IRQn                = 34,     !< I2C2 Error Interrupt                                              \n  SPI1_IRQn                   = 35,     !< SPI1 global Interrupt                                             \n  SPI2_IRQn                   = 36,     !< SPI2 global Interrupt                                             \n  USART1_IRQn                 = 37,     !< USART1 global Interrupt                                           \n  USART2_IRQn                 = 38,     !< USART2 global Interrupt                                           \n  USART3_IRQn                 = 39,     !< USART3 global Interrupt                                           \n  EXTI15_10_IRQn              = 40,     !< External Line[15:10] Interrupts                                   \n  RTC_Alarm_IRQn              = 41,     !< RTC Alarm (A and B) through EXTI Line Interrupt                   \n  OTG_FS_WKUP_IRQn            = 42,     !< USB OTG FS Wakeup through EXTI line interrupt                     \n  TIM8_BRK_TIM12_IRQn         = 43,     !< TIM8 Break Interrupt and TIM12 global interrupt                   \n  TIM8_UP_TIM13_IRQn          = 44,     !< TIM8 Update Interrupt and TIM13 global interrupt                  \n  TIM8_TRG_COM_TIM14_IRQn     = 45,     !< TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt \n  TIM8_CC_IRQn                = 46,     !< TIM8 Capture Compare global interrupt                             \n  DMA1_Stream7_IRQn           = 47,     !< DMA1 Stream7 Interrupt                                            \n  FSMC_IRQn                   = 48,     !< FSMC global Interrupt                                             \n  SDIO_IRQn                   = 49,     !< SDIO global Interrupt                                             \n  TIM5_IRQn                   = 50,     !< TIM5 global Interrupt                                             \n  SPI3_IRQn                   = 51,     !< SPI3 global Interrupt                                             \n  UART4_IRQn                  = 52,     !< UART4 global Interrupt                                            \n  UART5_IRQn                  = 53,     !< UART5 global Interrupt                                            \n  TIM6_DAC_IRQn               = 54,     !< TIM6 global and DAC1&2 underrun error  interrupts                 \n  TIM7_IRQn                   = 55,     !< TIM7 global interrupt                                             \n  DMA2_Stream0_IRQn           = 56,     !< DMA2 Stream 0 global Interrupt                                    \n  DMA2_Stream1_IRQn           = 57,     !< DMA2 Stream 1 global Interrupt                                    \n  DMA2_Stream2_IRQn           = 58,     !< DMA2 Stream 2 global Interrupt                                    \n  DMA2_Stream3_IRQn           = 59,     !< DMA2 Stream 3 global Interrupt                                    \n  DMA2_Stream4_IRQn           = 60,     !< DMA2 Stream 4 global Interrupt                                    \n  ETH_IRQn                    = 61,     !< Ethernet global Interrupt                                         \n  ETH_WKUP_IRQn               = 62,     !< Ethernet Wakeup through EXTI line Interrupt                      \n  CAN2_TX_IRQn                = 63,     !< CAN2 TX Interrupt                                                 \n  CAN2_RX0_IRQn               = 64,     !< CAN2 RX0 Interrupt                                                \n  CAN2_RX1_IRQn               = 65,     !< CAN2 RX1 Interrupt                                                \n  CAN2_SCE_IRQn               = 66,     !< CAN2 SCE Interrupt                                                \n  OTG_FS_IRQn                 = 67,     !< USB OTG FS global Interrupt                                       \n  DMA2_Stream5_IRQn           = 68,     !< DMA2 Stream 5 global interrupt                                    \n  DMA2_Stream6_IRQn           = 69,     !< DMA2 Stream 6 global interrupt                                    \n  DMA2_Stream7_IRQn           = 70,     !< DMA2 Stream 7 global interrupt                                  \n  USART6_IRQn                 = 71,     !< USART6 global interrupt                                           \n  I2C3_EV_IRQn                = 72,     !< I2C3 event interrupt                                             \n  I2C3_ER_IRQn                = 73,     !< I2C3 error interrupt                                             \n  OTG_HS_EP1_OUT_IRQn         = 74,     !< USB OTG HS End Point 1 Out global interrupt                       \n  OTG_HS_EP1_IN_IRQn          = 75,     !< USB OTG HS End Point 1 In global interrupt                        \n  OTG_HS_WKUP_IRQn            = 76,     !< USB OTG HS Wakeup through EXTI interrupt                          \n  OTG_HS_IRQn                 = 77,     !< USB OTG HS global interrupt                                       \n  DCMI_IRQn                   = 78,     !< DCMI global interrupt                                             \n  RNG_IRQn                    = 80,     !< RNG global Interrupt                                              \n  FPU_IRQn                    = 81      !< FPU global interrupt                                               \n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/irqHandlers.h",
    "content": "#include \"interrupt.h\"\n\n//void TIM3_IRQHandler()\n//{\n//  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n//  {\n//    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n//    Interrupt::TIM3_Wrapper();\n//  }\n//}\n\n\nvoid TIM3_IRQHandler()\n{\n  if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM3_Wrapper();\n  }\n}\n\nvoid TIM4_IRQHandler()\n{\n  if(TIM4->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM4->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM4_Wrapper();\n  }\n}\n\nvoid TIM5_IRQHandler()\n{\n  if(TIM5->SR & TIM_SR_UIF) // if UIF flag is set\n  {\n    TIM5->SR &= ~TIM_SR_UIF; // clear UIF flag\n    \n    Interrupt::TIM5_Wrapper();\n  }\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/pruThread.cpp",
    "content": "#include \"pruThread.h\"\n#include \"modules/module.h\"\n\n\nusing namespace std;\n\n// Thread constructor\npruThread::pruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency) :\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency)\n{\n\tprintf(\"Creating thread %d\\n\", this->frequency);\n}\n\nvoid pruThread::startThread(void)\n{\n\tTimerPtr = new pruTimer(this->timer, this->irq, this->frequency, this);\n}\n\nvoid pruThread::stopThread(void)\n{\n    this->TimerPtr->stopTimer();\n}\n\n\nvoid pruThread::registerModule(Module* module)\n{\n\tthis->vThread.push_back(module);\n}\n\nvoid pruThread::registerModulePost(Module* module)\n{\n\tthis->vThreadPost.push_back(module);\n\tthis->hasThreadPost = true;\n}\n\nvoid pruThread::unregisterModule(Module* module)\n{\n\titer = std::remove(vThread.begin(),vThread.end(), module);\n    vThread.erase(iter, vThread.end());\n}\n\nvoid pruThread::run(void)\n{\n\t// iterate over the Thread pointer vector to run all instances of Module::runModule()\n\tfor (iter = vThread.begin(); iter != vThread.end(); ++iter) (*iter)->runModule();\n\n    // iterate over the second vector that contains module pointers to run after (post) the main vector\n\tif (hasThreadPost)\n\t{\n\t\tfor (iter = vThreadPost.begin(); iter != vThreadPost.end(); ++iter) (*iter)->runModulePost();\n\t}\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/pruThread.h",
    "content": "#ifndef PRUTHREAD_H\n#define PRUTHREAD_H\n\n#include \"stm32h7xx_hal.h\"\n#include \"timer.h\"\n\n// Standard Template Library (STL) includes\n#include <iostream>\n#include <vector>\n\nusing namespace std;\n\nclass Module;\n\nclass pruThread\n{\n\n\tprivate:\n\n\t\tpruTimer* \t\t    TimerPtr;\n\t\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\n        bool hasThreadPost;\t\t// run updatePost() vector\n\n\t\tvector<Module*> vThread;\t\t// vector containing pointers to Thread modules\n        vector<Module*> vThreadPost;\t\t// vector containing pointers to Thread modules that run after the main vector modules\n\t\tvector<Module*>::iterator iter;\n\n\tpublic:\n\n\t\tpruThread(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency);\n\n\t\tvoid registerModule(Module *module);\n        void registerModulePost(Module *module);\n        void unregisterModule(Module *module);\n\t\tvoid startThread(void);\n        void stopThread(void);\n\t\tvoid run(void);\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/timer.cpp",
    "content": "#include \"mbed.h\"\n#include \"stm32h7xx_hal.h\"\n\n#include <iostream>\n#include <stdio.h>\n\n#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n#include \"pruThread.h\"\n\n\n\n// Timer constructor\npruTimer::pruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr):\n\ttimer(timer),\n\tirq(irq),\n\tfrequency(frequency),\n\ttimerOwnerPtr(ownerPtr)\n{\n\tinterruptPtr = new TimerInterrupt(this->irq, this);\t// Instantiate a new Timer Interrupt object and pass \"this\" pointer\n\n\tthis->startTimer();\n}\n\n\nvoid pruTimer::timerTick(void)\n{\n\t//Do something here\n\tthis->timerOwnerPtr->run();\n}\n\n\n\nvoid pruTimer::startTimer(void)\n{\n    uint32_t TIM_CLK;\n\n    if (this->timer == TIM3)\n    {\n        printf(\"\tpower on Timer 3\\n\\r\");\n        __TIM3_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM4)\n    {\n        printf(\"\tpower on Timer 4\\n\\r\");\n        __TIM4_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    else if (this->timer == TIM5)\n    {\n        printf(\"\tpower on Timer 5\\n\\r\");\n        __TIM5_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n    /**\n    else if (this->timer == TIM11)\n    {\n        printf(\"\tpower on Timer 11\\n\\r\");\n        __TIM11_CLK_ENABLE();\n        TIM_CLK = APB1CLK;\n    }\n*/\n    //timer uptade frequency = TIM_CLK/(TIM_PSC+1)/(TIM_ARR + 1)\n\n    this->timer->CR2 &= 0;                                            // UG used as trigg output\n    this->timer->PSC = TIM_PSC-1;                                     // prescaler\n    this->timer->ARR = ((TIM_CLK / TIM_PSC / this->frequency) - 1);   // period           \n    this->timer->EGR = TIM_EGR_UG;                                    // reinit the counter\n    this->timer->DIER = TIM_DIER_UIE;                                 // enable update interrupts\n\n    this->timer->CR1 |= TIM_CR1_CEN;                                  // enable timer\n\n    NVIC_EnableIRQ(this->irq);\n}\n\nvoid pruTimer::stopTimer()\n{\n    NVIC_DisableIRQ(this->irq);\n\n    printf(\"\ttimer stop\\n\\r\");\n    this->timer->CR1 &= (~(TIM_CR1_CEN));     // disable timer\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TARGET_STM32H7/thread/timer.h",
    "content": "#ifndef TIMER_H\n#define TIMER_H\n\n#include \"mbed.h\"\n#include <stdint.h>\n\n#define TIM_PSC 4\n#define APB1CLK SystemCoreClock\n#define APB2CLK SystemCoreClock/2\n\nclass TimerInterrupt; // forward declatation\nclass pruThread; // forward declatation\n\nclass pruTimer\n{\n\tfriend class TimerInterrupt;\n\n\tprivate:\n\n\t\tTimerInterrupt* \tinterruptPtr;\n\t\tTIM_TypeDef* \t    timer;\n\t\tIRQn_Type \t\t\tirq;\n\t\tuint32_t \t\t\tfrequency;\n\t\tpruThread* \t\t\ttimerOwnerPtr;\n\n\t\tvoid startTimer(void);\n\t\tvoid timerTick();\t\t\t// Private timer tiggered method\n\n\tpublic:\n\n\t\tpruTimer(TIM_TypeDef* timer, IRQn_Type irq, uint32_t frequency, pruThread* ownerPtr);\n        void stopTimer(void);\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/CHOPCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) CHOPCONF_register.SETTING = B; write(CHOPCONF_register.address, CHOPCONF_register.sr)\n\n// CHOPCONF\n/*\nuint32_t TMC2130Stepper::CHOPCONF() {\n    return read(CHOPCONF_register.address);\n}\nvoid TMC2130Stepper::CHOPCONF(uint32_t input) {\n    CHOPCONF_register.sr = input;\n    write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\n\nvoid TMC2130Stepper::toff(      uint8_t B ) { SET_REG(toff);    }\nvoid TMC2130Stepper::hstrt(     uint8_t B ) { SET_REG(hstrt);   }\nvoid TMC2130Stepper::hend(      uint8_t B ) { SET_REG(hend);    }\n//void TMC2130Stepper::fd(      uint8_t B ) { SET_REG(fd);      }\nvoid TMC2130Stepper::disfdcc(   bool    B ) { SET_REG(disfdcc); }\nvoid TMC2130Stepper::rndtf(     bool    B ) { SET_REG(rndtf);   }\nvoid TMC2130Stepper::chm(       bool    B ) { SET_REG(chm);     }\nvoid TMC2130Stepper::tbl(       uint8_t B ) { SET_REG(tbl);     }\nvoid TMC2130Stepper::vsense(    bool    B ) { SET_REG(vsense);  }\nvoid TMC2130Stepper::vhighfs(   bool    B ) { SET_REG(vhighfs); }\nvoid TMC2130Stepper::vhighchm(  bool    B ) { SET_REG(vhighchm);}\nvoid TMC2130Stepper::sync(      uint8_t B ) { SET_REG(sync);    }\nvoid TMC2130Stepper::mres(      uint8_t B ) { SET_REG(mres);    }\nvoid TMC2130Stepper::intpol(    bool    B ) { SET_REG(intpol);  }\nvoid TMC2130Stepper::dedge(     bool    B ) { SET_REG(dedge);   }\nvoid TMC2130Stepper::diss2g(    bool    B ) { SET_REG(diss2g);  }\n\nuint8_t TMC2130Stepper::toff()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff;    }\nuint8_t TMC2130Stepper::hstrt()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt;   }\nuint8_t TMC2130Stepper::hend()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend;    }\n//uint8_t TMC2130Stepper::fd()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.fd;      }\nbool    TMC2130Stepper::disfdcc()   { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.disfdcc; }\nbool    TMC2130Stepper::rndtf()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.rndtf;   }\nbool    TMC2130Stepper::chm()       { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.chm;     }\nuint8_t TMC2130Stepper::tbl()       { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl;     }\nbool    TMC2130Stepper::vsense()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense;  }\nbool    TMC2130Stepper::vhighfs()   { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighfs; }\nbool    TMC2130Stepper::vhighchm()  { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vhighchm;}\nuint8_t TMC2130Stepper::sync()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.sync;    }\nuint8_t TMC2130Stepper::mres()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres;    }\nbool    TMC2130Stepper::intpol()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol;  }\nbool    TMC2130Stepper::dedge()     { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge;   }\nbool    TMC2130Stepper::diss2g()    { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g;  }\n\nvoid TMC5160Stepper::diss2vs(bool B){ SET_REG(diss2vs); }\nvoid TMC5160Stepper::tpfd(uint8_t B){ SET_REG(tpfd);    }\nbool TMC5160Stepper::diss2vs()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs; }\nuint8_t TMC5160Stepper::tpfd()      { CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tpfd;    }\n*/\nvoid TMC2208Stepper::CHOPCONF(uint32_t input) {\n    CHOPCONF_register.sr = input;\n    write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\nuint32_t TMC2208Stepper::CHOPCONF() {\n    return read(CHOPCONF_register.address);\n}\nvoid TMC2208Stepper::toff   ( uint8_t  B )  { SET_REG(toff);    }\nvoid TMC2208Stepper::hstrt  ( uint8_t  B )  { SET_REG(hstrt);   }\nvoid TMC2208Stepper::hend   ( uint8_t  B )  { SET_REG(hend);    }\nvoid TMC2208Stepper::tbl    ( uint8_t  B )  { SET_REG(tbl);     }\nvoid TMC2208Stepper::vsense ( bool     B )  { SET_REG(vsense);  }\nvoid TMC2208Stepper::mres   ( uint8_t  B )  { SET_REG(mres);    }\nvoid TMC2208Stepper::intpol ( bool     B )  { SET_REG(intpol);  }\nvoid TMC2208Stepper::dedge  ( bool     B )  { SET_REG(dedge);   }\nvoid TMC2208Stepper::diss2g ( bool     B )  { SET_REG(diss2g);  }\nvoid TMC2208Stepper::diss2vs( bool     B )  { SET_REG(diss2vs); }\n\nuint8_t TMC2208Stepper::toff()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.toff;     }\nuint8_t TMC2208Stepper::hstrt()     { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hstrt;    }\nuint8_t TMC2208Stepper::hend()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.hend;     }\nuint8_t TMC2208Stepper::tbl()       { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.tbl;      }\nbool    TMC2208Stepper::vsense()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.vsense;   }\nuint8_t TMC2208Stepper::mres()      { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.mres;     }\nbool    TMC2208Stepper::intpol()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.intpol;   }\nbool    TMC2208Stepper::dedge()     { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.dedge;    }\nbool    TMC2208Stepper::diss2g()    { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2g;   }\nbool    TMC2208Stepper::diss2vs()   { TMC2208_n::CHOPCONF_t r{0}; r.sr = CHOPCONF(); return r.diss2vs;  }\n/*\n#define GET_REG_2660(SETTING) return CHOPCONF_register.SETTING;\n\nuint32_t TMC2660Stepper::CHOPCONF() { return CHOPCONF_register.sr; }\nvoid TMC2660Stepper::CHOPCONF(uint32_t data) {\n  CHOPCONF_register.sr = data;\n  write(CHOPCONF_register.address, CHOPCONF_register.sr);\n}\n\nvoid TMC2660Stepper::toff(uint8_t B)    {\n    SET_REG(toff);\n    if (B>0) _savedToff = B;\n}\nvoid TMC2660Stepper::hstrt(uint8_t B)   { SET_REG(hstrt);   }\nvoid TMC2660Stepper::hend(uint8_t B)    { SET_REG(hend);    }\nvoid TMC2660Stepper::hdec(uint8_t B)    { SET_REG(hdec);    }\nvoid TMC2660Stepper::rndtf(bool B)  { SET_REG(rndtf);   }\nvoid TMC2660Stepper::chm(bool B)    { SET_REG(chm); }\nvoid TMC2660Stepper::tbl(uint8_t B)     { SET_REG(tbl); }\n\nuint8_t TMC2660Stepper::toff()  { GET_REG_2660(toff);   }\nuint8_t TMC2660Stepper::hstrt()     { GET_REG_2660(hstrt);  }\nuint8_t TMC2660Stepper::hend() { GET_REG_2660(hend);    }\nuint8_t TMC2660Stepper::hdec()  { GET_REG_2660(hdec);   }\nbool TMC2660Stepper::rndtf() { GET_REG_2660(rndtf); }\nbool TMC2660Stepper::chm()  { GET_REG_2660(chm);    }\nuint8_t TMC2660Stepper::tbl() { GET_REG_2660(tbl);  }\n*/"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/COOLCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) COOLCONF_register.SETTING = B; write(COOLCONF_register.address, COOLCONF_register.sr);\n#define GET_REG(SETTING) return COOLCONF_register.SETTING;\n\n// COOLCONF\nuint16_t TMC2209Stepper::COOLCONF() { return COOLCONF_register.sr; }\nvoid TMC2209Stepper::COOLCONF(uint16_t input) {\n\tCOOLCONF_register.sr = input;\n\twrite(COOLCONF_register.address, COOLCONF_register.sr);\n}\n\nvoid TMC2209Stepper::semin(\tuint8_t B )\t{ SET_REG(semin);\t}\nvoid TMC2209Stepper::seup(\tuint8_t B )\t{ SET_REG(seup);\t}\nvoid TMC2209Stepper::semax(\tuint8_t B )\t{ SET_REG(semax);\t}\nvoid TMC2209Stepper::sedn(\tuint8_t B )\t{ SET_REG(sedn);\t}\nvoid TMC2209Stepper::seimin(bool \tB )\t{ SET_REG(seimin);\t}\n\nuint8_t TMC2209Stepper::semin()\t{ GET_REG(semin);\t}\nuint8_t TMC2209Stepper::seup()\t{ GET_REG(seup);\t}\nuint8_t TMC2209Stepper::semax()\t{ GET_REG(semax);\t}\nuint8_t TMC2209Stepper::sedn()\t{ GET_REG(sedn);\t}\nbool \tTMC2209Stepper::seimin(){ GET_REG(seimin);\t}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/DRV_STATUS.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define GET_REG(NS, SETTING) NS::DRV_STATUS_t r{0}; r.sr = DRV_STATUS(); return r.SETTING\n/*\nuint32_t TMC2130Stepper::DRV_STATUS() { return read(DRV_STATUS_t::address); }\n\nuint16_t TMC2130Stepper::sg_result(){ GET_REG(TMC2130_n, sg_result);    }\nbool TMC2130Stepper::fsactive()     { GET_REG(TMC2130_n, fsactive);     }\nuint8_t TMC2130Stepper::cs_actual() { GET_REG(TMC2130_n, cs_actual);    }\nbool TMC2130Stepper::stallguard()   { GET_REG(TMC2130_n, stallGuard);   }\nbool TMC2130Stepper::ot()           { GET_REG(TMC2130_n, ot);           }\nbool TMC2130Stepper::otpw()         { GET_REG(TMC2130_n, otpw);         }\nbool TMC2130Stepper::s2ga()         { GET_REG(TMC2130_n, s2ga);         }\nbool TMC2130Stepper::s2gb()         { GET_REG(TMC2130_n, s2gb);         }\nbool TMC2130Stepper::ola()          { GET_REG(TMC2130_n, ola);          }\nbool TMC2130Stepper::olb()          { GET_REG(TMC2130_n, olb);          }\nbool TMC2130Stepper::stst()         { GET_REG(TMC2130_n, stst);         }\n*/\nuint32_t TMC2208Stepper::DRV_STATUS() {\n    return read(TMC2208_n::DRV_STATUS_t::address);\n}\n\nbool        TMC2208Stepper::otpw()      { GET_REG(TMC2208_n, otpw);         }\nbool        TMC2208Stepper::ot()        { GET_REG(TMC2208_n, ot);           }\nbool        TMC2208Stepper::s2ga()      { GET_REG(TMC2208_n, s2ga);         }\nbool        TMC2208Stepper::s2gb()      { GET_REG(TMC2208_n, s2gb);         }\nbool        TMC2208Stepper::s2vsa()     { GET_REG(TMC2208_n, s2vsa);        }\nbool        TMC2208Stepper::s2vsb()     { GET_REG(TMC2208_n, s2vsb);        }\nbool        TMC2208Stepper::ola()       { GET_REG(TMC2208_n, ola);          }\nbool        TMC2208Stepper::olb()       { GET_REG(TMC2208_n, olb);          }\nbool        TMC2208Stepper::t120()      { GET_REG(TMC2208_n, t120);         }\nbool        TMC2208Stepper::t143()      { GET_REG(TMC2208_n, t143);         }\nbool        TMC2208Stepper::t150()      { GET_REG(TMC2208_n, t150);         }\nbool        TMC2208Stepper::t157()      { GET_REG(TMC2208_n, t157);         }\nuint16_t    TMC2208Stepper::cs_actual() { GET_REG(TMC2208_n, cs_actual);    }\nbool        TMC2208Stepper::stealth()   { GET_REG(TMC2208_n, stealth);      }\nbool        TMC2208Stepper::stst()      { GET_REG(TMC2208_n, stst);         }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/GCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) GCONF_register.SETTING = B; write(GCONF_register.address, GCONF_register.sr)\n\n// GCONF\n/*\nuint32_t TMC2130Stepper::GCONF() {\n    return read(GCONF_register.address);\n}\nvoid TMC2130Stepper::GCONF(uint32_t input) {\n    GCONF_register.sr = input;\n    write(GCONF_register.address, GCONF_register.sr);\n}\n\nvoid TMC2130Stepper::I_scale_analog(bool B)         { SET_REG(i_scale_analog);          }\nvoid TMC2130Stepper::internal_Rsense(bool B)        { SET_REG(internal_rsense);         }\nvoid TMC2130Stepper::en_pwm_mode(bool B)            { SET_REG(en_pwm_mode);             }\nvoid TMC2130Stepper::enc_commutation(bool B)        { SET_REG(enc_commutation);         }\nvoid TMC2130Stepper::shaft(bool B)                  { SET_REG(shaft);                   }\nvoid TMC2130Stepper::diag0_error(bool B)            { SET_REG(diag0_error);             }\nvoid TMC2130Stepper::diag0_otpw(bool B)             { SET_REG(diag0_otpw);              }\nvoid TMC2130Stepper::diag0_stall(bool B)            { SET_REG(diag0_stall);             }\nvoid TMC2130Stepper::diag1_stall(bool B)            { SET_REG(diag1_stall);             }\nvoid TMC2130Stepper::diag1_index(bool B)            { SET_REG(diag1_index);             }\nvoid TMC2130Stepper::diag1_onstate(bool B)          { SET_REG(diag1_onstate);           }\nvoid TMC2130Stepper::diag1_steps_skipped(bool B)    { SET_REG(diag1_steps_skipped);     }\nvoid TMC2130Stepper::diag0_int_pushpull(bool B)     { SET_REG(diag0_int_pushpull);      }\nvoid TMC2130Stepper::diag1_pushpull(bool B)         { SET_REG(diag1_poscomp_pushpull);  }\nvoid TMC2130Stepper::small_hysteresis(bool B)       { SET_REG(small_hysteresis);        }\nvoid TMC2130Stepper::stop_enable(bool B)            { SET_REG(stop_enable);             }\nvoid TMC2130Stepper::direct_mode(bool B)            { SET_REG(direct_mode);             }\n\nbool TMC2130Stepper::I_scale_analog()               { GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog;        }\nbool TMC2130Stepper::internal_Rsense()              { GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense;       }\nbool TMC2130Stepper::en_pwm_mode()                  { GCONF_t r{0}; r.sr = GCONF(); return r.en_pwm_mode;           }\nbool TMC2130Stepper::enc_commutation()              { GCONF_t r{0}; r.sr = GCONF(); return r.enc_commutation;       }\nbool TMC2130Stepper::shaft()                        { GCONF_t r{0}; r.sr = GCONF(); return r.shaft;                 }\nbool TMC2130Stepper::diag0_error()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_error;           }\nbool TMC2130Stepper::diag0_otpw()                   { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_otpw;            }\nbool TMC2130Stepper::diag0_stall()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_stall;           }\nbool TMC2130Stepper::diag1_stall()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_stall;           }\nbool TMC2130Stepper::diag1_index()                  { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_index;           }\nbool TMC2130Stepper::diag1_onstate()                { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_onstate;         }\nbool TMC2130Stepper::diag1_steps_skipped()          { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_steps_skipped;   }\nbool TMC2130Stepper::diag0_int_pushpull()           { GCONF_t r{0}; r.sr = GCONF(); return r.diag0_int_pushpull;    }\nbool TMC2130Stepper::diag1_pushpull()               { GCONF_t r{0}; r.sr = GCONF(); return r.diag1_poscomp_pushpull;}\nbool TMC2130Stepper::small_hysteresis()             { GCONF_t r{0}; r.sr = GCONF(); return r.small_hysteresis;      }\nbool TMC2130Stepper::stop_enable()                  { GCONF_t r{0}; r.sr = GCONF(); return r.stop_enable;           }\nbool TMC2130Stepper::direct_mode()                  { GCONF_t r{0}; r.sr = GCONF(); return r.direct_mode;           }\n*/\n/*\nbit 18 not implemented:\ntest_mode 0:\nNormal operation 1:\nEnable analog test output on pin DCO. IHOLD[1..0] selects the function of DCO:\n0…2: T120, DAC, VDDH Attention:\nNot for user, set to 0 for normal operation!\n*/\n/*\nvoid TMC5160Stepper::recalibrate(bool B)            { SET_REG(recalibrate);             }\nvoid TMC5160Stepper::faststandstill(bool B)         { SET_REG(faststandstill);          }\nvoid TMC5160Stepper::multistep_filt(bool B)         { SET_REG(multistep_filt);          }\nbool TMC5160Stepper::recalibrate()                  { GCONF_t r{0}; r.sr = GCONF(); return r.recalibrate;   }\nbool TMC5160Stepper::faststandstill()               { GCONF_t r{0}; r.sr = GCONF(); return r.faststandstill;    }\nbool TMC5160Stepper::multistep_filt()               { GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt;    }\n*/\nuint32_t TMC2208Stepper::GCONF() {\n    return read(GCONF_register.address);\n}\nvoid TMC2208Stepper::GCONF(uint32_t input) {\n    GCONF_register.sr = input;\n    write(GCONF_register.address, GCONF_register.sr);\n}\n\nvoid TMC2208Stepper::I_scale_analog(bool B)     { SET_REG(i_scale_analog);  }\nvoid TMC2208Stepper::internal_Rsense(bool B)    { SET_REG(internal_rsense); }\nvoid TMC2208Stepper::en_spreadCycle(bool B)     { SET_REG(en_spreadcycle);  }\nvoid TMC2208Stepper::shaft(bool B)              { SET_REG(shaft);           }\nvoid TMC2208Stepper::index_otpw(bool B)         { SET_REG(index_otpw);      }\nvoid TMC2208Stepper::index_step(bool B)         { SET_REG(index_step);      }\nvoid TMC2208Stepper::pdn_disable(bool B)        { SET_REG(pdn_disable);     }\nvoid TMC2208Stepper::mstep_reg_select(bool B)   { SET_REG(mstep_reg_select);}\nvoid TMC2208Stepper::multistep_filt(bool B)     { SET_REG(multistep_filt);  }\n\nbool TMC2208Stepper::I_scale_analog()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.i_scale_analog;     }\nbool TMC2208Stepper::internal_Rsense()  { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.internal_rsense;    }\nbool TMC2208Stepper::en_spreadCycle()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.en_spreadcycle;     }\nbool TMC2208Stepper::shaft()            { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.shaft;              }\nbool TMC2208Stepper::index_otpw()       { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_otpw;         }\nbool TMC2208Stepper::index_step()       { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.index_step;         }\nbool TMC2208Stepper::pdn_disable()      { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.pdn_disable;        }\nbool TMC2208Stepper::mstep_reg_select() { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.mstep_reg_select;   }\nbool TMC2208Stepper::multistep_filt()   { TMC2208_n::GCONF_t r{0}; r.sr = GCONF(); return r.multistep_filt;     }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/IHOLD_IRUN.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) IHOLD_IRUN_register.SETTING = B; write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr);\n#define GET_REG(SETTING) return IHOLD_IRUN_register.SETTING;\n\n// IHOLD_IRUN\nuint32_t TMCStepper::IHOLD_IRUN() { return IHOLD_IRUN_register.sr; }\nvoid TMCStepper::IHOLD_IRUN(uint32_t input) {\n    IHOLD_IRUN_register.sr = input;\n    write(IHOLD_IRUN_register.address, IHOLD_IRUN_register.sr);\n}\n\nvoid    TMCStepper::ihold(uint8_t B)        { SET_REG(ihold);       }\nvoid    TMCStepper::irun(uint8_t B)         { SET_REG(irun);        }\nvoid    TMCStepper::iholddelay(uint8_t B)   { SET_REG(iholddelay);  }\n\nuint8_t TMCStepper::ihold()                 { GET_REG(ihold);       }\nuint8_t TMCStepper::irun()                  { GET_REG(irun);        }\nuint8_t TMCStepper::iholddelay()            { GET_REG(iholddelay);  }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/PWMCONF.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n#define SET_REG(SETTING) PWMCONF_register.SETTING = B; write(PWMCONF_register.address, PWMCONF_register.sr)\n#define GET_REG(SETTING) return PWMCONF_register.SETTING\n\n// PWMCONF\n/*\nuint32_t TMC2130Stepper::PWMCONF() { return PWMCONF_register.sr; }\nvoid TMC2130Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2130Stepper::pwm_ampl(\t\tuint8_t B )\t{ SET_REG(pwm_ampl);\t\t}\nvoid TMC2130Stepper::pwm_grad(\t\tuint8_t B )\t{ SET_REG(pwm_grad);\t\t}\nvoid TMC2130Stepper::pwm_freq(\t\tuint8_t B )\t{ SET_REG(pwm_freq);\t\t}\nvoid TMC2130Stepper::pwm_autoscale(\tbool \tB )\t{ SET_REG(pwm_autoscale);\t}\nvoid TMC2130Stepper::pwm_symmetric(\tbool \tB )\t{ SET_REG(pwm_symmetric);\t}\nvoid TMC2130Stepper::freewheel(\t\tuint8_t B )\t{ SET_REG(freewheel);\t\t}\n\nuint8_t TMC2130Stepper::pwm_ampl()\t\t{ GET_REG(pwm_ampl);\t\t}\nuint8_t TMC2130Stepper::pwm_grad()\t\t{ GET_REG(pwm_grad);\t\t}\nuint8_t TMC2130Stepper::pwm_freq()\t\t{ GET_REG(pwm_freq);\t\t}\nbool \tTMC2130Stepper::pwm_autoscale()\t{ GET_REG(pwm_autoscale);\t}\nbool \tTMC2130Stepper::pwm_symmetric()\t{ GET_REG(pwm_symmetric);\t}\nuint8_t TMC2130Stepper::freewheel()\t\t{ GET_REG(freewheel);\t\t}\n\nuint32_t TMC2160Stepper::PWMCONF() {\n\treturn PWMCONF_register.sr;\n}\nvoid TMC2160Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2160Stepper::pwm_ofs\t\t( uint8_t B ) { PWMCONF_register.pwm_ofs = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_grad\t\t( uint8_t B ) { PWMCONF_register.pwm_grad = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_freq\t\t( uint8_t B ) { PWMCONF_register.pwm_freq = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_autoscale\t( bool \t  B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_autograd\t( bool    B ) { PWMCONF_register.pwm_autograd = B; \twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::freewheel\t\t( uint8_t B ) { PWMCONF_register.freewheel = B; \twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_reg\t\t( uint8_t B ) { PWMCONF_register.pwm_reg = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2160Stepper::pwm_lim\t\t( uint8_t B ) { PWMCONF_register.pwm_lim = B; \t\twrite(PWMCONF_register.address, PWMCONF_register.sr); }\n\nuint8_t TMC2160Stepper::pwm_ofs()\t\t{ return PWMCONF_register.pwm_ofs;\t\t}\nuint8_t TMC2160Stepper::pwm_grad()\t\t{ return PWMCONF_register.pwm_grad;\t\t}\nuint8_t TMC2160Stepper::pwm_freq()\t\t{ return PWMCONF_register.pwm_freq;\t\t}\nbool \tTMC2160Stepper::pwm_autoscale()\t{ return PWMCONF_register.pwm_autoscale;}\nbool \tTMC2160Stepper::pwm_autograd()\t{ return PWMCONF_register.pwm_autograd;\t}\nuint8_t TMC2160Stepper::freewheel()\t\t{ return PWMCONF_register.freewheel;\t}\nuint8_t TMC2160Stepper::pwm_reg()\t\t{ return PWMCONF_register.pwm_reg;\t\t}\nuint8_t TMC2160Stepper::pwm_lim()\t\t{ return PWMCONF_register.pwm_lim;\t\t}\n*/\nuint32_t TMC2208Stepper::PWMCONF() {\n\treturn read(PWMCONF_register.address);\n}\nvoid TMC2208Stepper::PWMCONF(uint32_t input) {\n\tPWMCONF_register.sr = input;\n\twrite(PWMCONF_register.address, PWMCONF_register.sr);\n}\n\nvoid TMC2208Stepper::pwm_ofs\t\t( uint8_t B ) { PWMCONF_register.pwm_ofs = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_grad\t\t( uint8_t B ) { PWMCONF_register.pwm_grad = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_freq\t\t( uint8_t B ) { PWMCONF_register.pwm_freq = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_autoscale\t( bool \t  B ) { PWMCONF_register.pwm_autoscale = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_autograd\t( bool    B ) { PWMCONF_register.pwm_autograd = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::freewheel\t\t( uint8_t B ) { PWMCONF_register.freewheel = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_reg\t\t( uint8_t B ) { PWMCONF_register.pwm_reg = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\nvoid TMC2208Stepper::pwm_lim\t\t( uint8_t B ) { PWMCONF_register.pwm_lim = B; write(PWMCONF_register.address, PWMCONF_register.sr); }\n\nuint8_t TMC2208Stepper::pwm_ofs()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_ofs;\t\t}\nuint8_t TMC2208Stepper::pwm_grad()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_grad;\t\t}\nuint8_t TMC2208Stepper::pwm_freq()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_freq;\t\t}\nbool \tTMC2208Stepper::pwm_autoscale()\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autoscale;\t}\nbool \tTMC2208Stepper::pwm_autograd()\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_autograd;\t}\nuint8_t TMC2208Stepper::freewheel()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.freewheel;\t\t}\nuint8_t TMC2208Stepper::pwm_reg()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_reg;\t\t}\nuint8_t TMC2208Stepper::pwm_lim()\t\t{ TMC2208_n::PWMCONF_t r{0}; r.sr = PWMCONF(); return r.pwm_lim;\t\t}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMC2208Stepper.cpp",
    "content": "#include \"TMCStepper.h\"\n#include \"TMC_MACROS.h\"\n\n// Protected\n// addr needed for TMC2209\nTMC2208Stepper::TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr) :\n    SWRXpin(SWRXpin),\n    SWTXpin(SWRXpin),\n    TMCStepper(RS),\n    //RXTX_pin(SW_RX_pin == SW_TX_pin ? SW_RX_pin : 0),\n    slave_address(addr)\n    {\n        SoftwareSerial *SWSerialObj = new SoftwareSerial(SWRXpin, SWTXpin);\n        SWSerial = SWSerialObj;\n        defaults();\n\n\n        #if defined TARGET_LPC176X\n        //this->debug1 = new DigitalOut(P1_30);\n        //this->debug2 = new DigitalOut(P0_28);\n        #elif defined TARGET_STM32F4\n        //this->debug1 = new DigitalOut(PE_5);\n        //this->debug2 = new DigitalOut(PE_4);\n        #endif\n\n    }\n\n\nvoid TMC2208Stepper::beginSerial(uint32_t baudrate) {\n\n    SWSerial->begin(baudrate);\n}\n\n\nvoid TMC2208Stepper::begin() {\n\n    beginSerial(19600);\n    pdn_disable(true);\n    mstep_reg_select(true);\n    //Wait to initialize\n    wait_us(replyDelay);\n\n}\n\nvoid TMC2208Stepper::defaults() {\n    GCONF_register.i_scale_analog = 1;\n    GCONF_register.internal_rsense = 0; // OTP\n    GCONF_register.en_spreadcycle = 0; // OTP\n    GCONF_register.multistep_filt = 1; // OTP\n    IHOLD_IRUN_register.iholddelay = 1; // OTP\n    TPOWERDOWN_register.sr = 20;\n    CHOPCONF_register.sr = 0x10000053;\n    PWMCONF_register.sr = 0xC10D0024;\n  //MSLUT0_register.sr = ???;\n  //MSLUT1_register.sr = ???;\n  //MSLUT2_register.sr = ???;\n  //MSLUT3_register.sr = ???;\n  //MSLUT4_register.sr = ???;\n  //MSLUT5_register.sr = ???;\n  //MSLUT6_register.sr = ???;\n  //MSLUT7_register.sr = ???;\n  //MSLUTSTART_register.start_sin90 = 247;\n}\n\nvoid TMC2208Stepper::push() {\n    GCONF(GCONF_register.sr);\n    IHOLD_IRUN(IHOLD_IRUN_register.sr);\n    SLAVECONF(SLAVECONF_register.sr);\n    TPOWERDOWN(TPOWERDOWN_register.sr);\n    TPWMTHRS(TPWMTHRS_register.sr);\n    VACTUAL(VACTUAL_register.sr);\n    CHOPCONF(CHOPCONF_register.sr);\n    PWMCONF(PWMCONF_register.sr);\n}\n\nbool TMC2208Stepper::isEnabled() { return !enn() && toff(); }\n\nuint8_t TMC2208Stepper::calcCRC(uint8_t datagram[], uint8_t len) {\n    uint8_t crc = 0;\n    for (uint8_t i = 0; i < len; i++) {\n        uint8_t currentByte = datagram[i];\n        for (uint8_t j = 0; j < 8; j++) {\n            if ((crc >> 7) ^ (currentByte & 0x01)) {\n                crc = (crc << 1) ^ 0x07;\n            } else {\n                crc = (crc << 1);\n            }\n            crc &= 0xff;\n            currentByte = currentByte >> 1;\n        }\n    }\n    return crc;\n}\n\n__attribute__((weak))\nint TMC2208Stepper::available() {\n    int out = 0;\n\n\tout = SWSerial->available();\n\n    return out;\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::preWriteCommunication() {\n    //this->debug1->write(1);\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::preReadCommunication() {\n\n\tSWSerial->listen();\t\n    //this->debug2->write(1);\t\t\t\t\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::postWriteCommunication() {\n    //this->debug1->write(0);\n}\n\n\n__attribute__((weak))\nvoid TMC2208Stepper::postReadCommunication() {\n    //this->debug2->write(0);\n}\n\n\n__attribute__((weak))\nint16_t TMC2208Stepper::serial_read() {\n    int16_t out = 0;\n     \n    out = SWSerial->read();\n\n\treturn out;\n}\n\n__attribute__((weak))\nuint8_t TMC2208Stepper::serial_write(const uint8_t data) {\n    int out = 0;\n\n    SWSerial->write(data);\n\n    return out;\n}\n\n\nvoid TMC2208Stepper::write(uint8_t addr, uint32_t regVal) {\n    uint8_t len = 7;\n    addr |= TMC_WRITE;\n    uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, (uint8_t)(regVal>>24), (uint8_t)(regVal>>16), (uint8_t)(regVal>>8), (uint8_t)(regVal>>0), 0x00};\n\t\n    datagram[len] = calcCRC(datagram, len);\n\t\n\t//printf(\"write datagram = %x, %x, %x, %x, %x, %x, %x, %x\\n\", datagram[0], datagram[1], datagram[2], datagram[3], datagram[4], datagram[5], datagram[6], datagram[7]);\n    \n    preWriteCommunication();\n\n    for(uint8_t i=0; i<=len; i++) {\n        bytesWritten += serial_write(datagram[i]);\n    }\n    postWriteCommunication();\n\n    //delay(replyDelay);\n    //ThisThread::sleep_for(150);\n    wait_us(5000);\n}\n\nuint64_t TMC2208Stepper::_sendDatagram(uint8_t datagram[], const uint8_t len, uint16_t timeout) {\n\t\n    while (available() > 0) serial_read(); // Flush\n\n    tmcTimer.reset();\n    tmcTimer.start(); \n\n    preWriteCommunication();\n\tfor(int i=0; i<=len; i++)\n    {   \n        serial_write(datagram[i]);\n    }\n\t//delay(replyDelay);\n    //ThisThread::sleep_for(replyDelay);\n    postWriteCommunication();\n\n\t// scan for the rx frame and read it\n\tuint32_t ms = tmcTimer.read_ms();\n\tuint32_t sync_target = (static_cast<uint32_t>(datagram[0])<<16) | 0xFF00 | datagram[2];\n\tuint32_t sync = 0;\n\n\tdo {\n\t\tuint32_t ms2 = tmcTimer.read_ms();\n\t\tif (ms2 != ms) {\n\t\t\t// 1ms tick\n\t\t\tms = ms2;\n\t\t\ttimeout--;\n\t\t}\n\t\tif (!timeout) return 0;\n\n\t\tint16_t res = serial_read();\n\t\tif (res < 0) continue;\n\n\t\tsync <<= 8;\n\t\tsync |= res & 0xFF;\n\t\tsync &= 0xFFFFFF;\n\n\t} while (sync != sync_target);\n\n\tuint64_t out = sync;\n\tms = tmcTimer.read_ms();\n\ttimeout = this->abort_window;\n\t\t \n\tfor(uint8_t i=0; i<5;) {\n\t\tuint32_t ms2 = tmcTimer.read_ms();\n\t\tif (ms2 != ms) {\n\t\t\t// 1ms tick\n\t\t\tms = ms2;\n\t\t\ttimeout--;\n\t\t}\n\t\tif (!timeout) return 0;\n\n\t\tint16_t res = serial_read();\n\t\tif (res < 0) continue;\n\n\t\tout <<= 8;\n\t\tout |= res & 0xFF;\n\t\ti++;\n\t}\n\n    tmcTimer.stop();\n\t\t\n\twhile (available() > 0) serial_read(); // Flush\n\n\treturn out;\n}\n\nuint32_t TMC2208Stepper::read(uint8_t addr) {\n    constexpr uint8_t len = 3;\n    addr |= TMC_READ;\n    uint8_t datagram[] = {TMC2208_SYNC, slave_address, addr, 0x00};\n    datagram[len] = calcCRC(datagram, len);\n    uint64_t out = 0x00000000UL;\n\n    for (uint8_t i = 0; i < max_retries; i++) {\t\t\t \n        preReadCommunication();\n        out = _sendDatagram(datagram, len, abort_window);\n        postReadCommunication();\n\n//        delay(replyDelay);\n        //ThisThread::sleep_for(replyDelay);\n        wait_us(5000);\n\n        CRCerror = false;\n        uint8_t out_datagram[] = {\n            static_cast<uint8_t>(out>>56),\n            static_cast<uint8_t>(out>>48),\n            static_cast<uint8_t>(out>>40),\n            static_cast<uint8_t>(out>>32),\n            static_cast<uint8_t>(out>>24),\n            static_cast<uint8_t>(out>>16),\n            static_cast<uint8_t>(out>> 8),\n            static_cast<uint8_t>(out>> 0)\n        };\n        //printf(\"read  datagram = %x, %x, %x, %x, %x, %x, %x, %x\\n\", out_datagram[0], out_datagram[1], out_datagram[2], out_datagram[3], out_datagram[4], out_datagram[5], out_datagram[6], out_datagram[7]);\n\t\t\n        uint8_t crc = calcCRC(out_datagram, 7);\n        if ((crc != static_cast<uint8_t>(out)) || crc == 0 ) {\n            CRCerror = true;\n            out = 0;\n        } else {\n            break;\n        }\n    }\n\n    return out>>8;\n}\n\nuint8_t TMC2208Stepper::IFCNT() {\n    return read(IFCNT_t::address);\n}\n\nvoid TMC2208Stepper::SLAVECONF(uint16_t input) {\n    SLAVECONF_register.sr = input&0xF00;\n    write(SLAVECONF_register.address, SLAVECONF_register.sr);\n}\nuint16_t TMC2208Stepper::SLAVECONF() {\n    return SLAVECONF_register.sr;\n}\nvoid TMC2208Stepper::senddelay(uint8_t B)   { SLAVECONF_register.senddelay = B; write(SLAVECONF_register.address, SLAVECONF_register.sr); }\nuint8_t TMC2208Stepper::senddelay()         { return SLAVECONF_register.senddelay; }\n\nvoid TMC2208Stepper::OTP_PROG(uint16_t input) {\n    write(OTP_PROG_t::address, input);\n}\n\nuint32_t TMC2208Stepper::OTP_READ() {\n    return read(OTP_READ_t::address);\n}\n\nuint32_t TMC2208Stepper::IOIN() {\n    return read(TMC2208_n::IOIN_t::address);\n}\nbool TMC2208Stepper::enn()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2208Stepper::ms1()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2208Stepper::ms2()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2208Stepper::diag()         { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag;     }\nbool TMC2208Stepper::pdn_uart()     { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2208Stepper::step()         { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2208Stepper::sel_a()        { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a;    }\nbool TMC2208Stepper::dir()          { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2208Stepper::version()   { TMC2208_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n\n/*\nuint32_t TMC2224Stepper::IOIN() {\n    return read(TMC2224_n::IOIN_t::address);\n}\nbool TMC2224Stepper::enn()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2224Stepper::ms1()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2224Stepper::ms2()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2224Stepper::pdn_uart()     { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2224Stepper::spread()       { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread;   }\nbool TMC2224Stepper::step()         { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2224Stepper::sel_a()        { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.sel_a;    }\nbool TMC2224Stepper::dir()          { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2224Stepper::version()   { TMC2224_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n*/\nuint16_t TMC2208Stepper::FACTORY_CONF() {\n    return read(FACTORY_CONF_register.address);\n}\nvoid TMC2208Stepper::FACTORY_CONF(uint16_t input) {\n    FACTORY_CONF_register.sr = input;\n    write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr);\n}\nvoid TMC2208Stepper::fclktrim(uint8_t B){ FACTORY_CONF_register.fclktrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); }\nvoid TMC2208Stepper::ottrim(uint8_t B)  { FACTORY_CONF_register.ottrim = B; write(FACTORY_CONF_register.address, FACTORY_CONF_register.sr); }\nuint8_t TMC2208Stepper::fclktrim()      { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.fclktrim; }\nuint8_t TMC2208Stepper::ottrim()        { FACTORY_CONF_t r{0}; r.sr = FACTORY_CONF(); return r.ottrim; }\n\nvoid TMC2208Stepper::VACTUAL(uint32_t input) {\n    VACTUAL_register.sr = input;\n    write(VACTUAL_register.address, VACTUAL_register.sr);\n}\nuint32_t TMC2208Stepper::VACTUAL() {\n    return VACTUAL_register.sr;\n}\n\nuint32_t TMC2208Stepper::PWM_SCALE() {\n    return read(TMC2208_n::PWM_SCALE_t::address);\n}\nuint8_t TMC2208Stepper::pwm_scale_sum() {\n    TMC2208_n::PWM_SCALE_t r{0};\n    r.sr = PWM_SCALE();\n    return r.pwm_scale_sum;\n}\n\nint16_t TMC2208Stepper::pwm_scale_auto() {\n    TMC2208_n::PWM_SCALE_t r{0};\n    r.sr = PWM_SCALE();\n    return r.pwm_scale_auto;\n    // Not two's complement? 9nth bit determines sign\n    /*\n    uint32_t d = PWM_SCALE();\n    int16_t response = (d>>PWM_SCALE_AUTO_bp)&0xFF;\n    if (((d&PWM_SCALE_AUTO_bm) >> 24) & 0x1) return -response;\n    else return response;\n    */\n}\n\n// R: PWM_AUTO\nuint32_t TMC2208Stepper::PWM_AUTO() {\n    return read(PWM_AUTO_t::address);\n}\nuint8_t TMC2208Stepper::pwm_ofs_auto()  { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_ofs_auto; }\nuint8_t TMC2208Stepper::pwm_grad_auto() { PWM_AUTO_t r{0}; r.sr = PWM_AUTO(); return r.pwm_grad_auto; }"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMC2208_bitfields.h",
    "content": "#pragma once\n#pragma pack(push, 1)\n\nnamespace TMC2208_n {\n  struct GCONF_t {\n    constexpr static uint8_t address = 0x00;\n    union {\n      uint16_t sr : 10;\n      struct {\n        bool  i_scale_analog : 1,\n              internal_rsense : 1,\n              en_spreadcycle : 1,\n              shaft : 1,\n              index_otpw : 1,\n              index_step : 1,\n              pdn_disable : 1,\n              mstep_reg_select : 1,\n              multistep_filt : 1,\n              test_mode : 1;\n      };\n    };\n  };\n}\n\nnamespace TMC2208_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  enn : 1,\n              : 1,\n              ms1 : 1,\n              ms2 : 1,\n              diag : 1,\n              : 1,\n              pdn_uart : 1,\n              step : 1,\n              sel_a : 1,\n              dir : 1;\n        uint16_t : 14;\n        uint8_t version : 8;\n      };\n    };\n  };\n}\n\nnamespace TMC2224_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  : 1,\n              pdn_uart : 1,\n              spread : 1,\n              dir : 1,\n              enn : 1,\n              step : 1,\n              ms1 : 1,\n              ms2 : 1,\n              sel_a : 1;\n        uint16_t : 15;\n        uint8_t version : 8;\n      };\n    };\n  };\n}\n\nstruct FACTORY_CONF_t {\n  constexpr static uint8_t address = 0x07;\n  union {\n    uint16_t sr;\n    struct {\n        uint8_t fclktrim : 5,\n                         : 3,\n                ottrim : 2;\n    };\n  };\n};\n\nnamespace TMC2208_n {\n  struct VACTUAL_t {\n    constexpr static uint8_t address = 0x22;\n    uint32_t sr;\n  };\n}\n\nstruct MSCURACT_t {\n  constexpr static uint8_t address = 0x6B;\n  union {\n    uint32_t sr : 25;\n    struct {\n      int16_t cur_a : 9,\n                    : 7,\n              cur_b : 9;\n    };\n  };\n};\n\nnamespace TMC2208_n {\n  struct CHOPCONF_t {\n    constexpr static uint8_t address = 0x6C;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t toff : 4,\n                hstrt : 3,\n                hend : 4,\n                     : 4,\n                tbl : 2;\n        bool    vsense : 1;\n        uint8_t : 6,\n                mres : 4;\n        bool    intpol : 1,\n                dedge : 1,\n                diss2g : 1,\n                diss2vs : 1;\n      };\n    };\n  };\n\n  struct PWMCONF_t {\n    constexpr static uint8_t address = 0x70;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t pwm_ofs : 8,\n                pwm_grad : 8,\n                pwm_freq : 2;\n        bool pwm_autoscale : 1,\n             pwm_autograd : 1;\n        uint8_t freewheel : 2,\n                          : 2,\n                pwm_reg : 4,\n                pwm_lim : 4;\n      };\n    };\n  };\n\n  struct DRV_STATUS_t {\n    constexpr static uint8_t address = 0x6F;\n    union {\n      uint32_t sr;\n      struct {\n        bool otpw : 1,\n             ot : 1,\n             s2ga : 1,\n             s2gb : 1,\n             s2vsa : 1,\n             s2vsb : 1,\n             ola : 1,\n             olb : 1,\n             t120 : 1,\n             t143 : 1,\n             t150 : 1,\n             t157 : 1;\n        uint8_t : 4,\n                cs_actual : 5,\n                : 3,\n                : 6;\n        bool stealth : 1,\n             stst : 1;\n      };\n    };\n  };\n\n  struct PWM_SCALE_t {\n    constexpr static uint8_t address = 0x71;\n    union {\n      uint32_t sr;\n      struct {\n        uint8_t pwm_scale_sum : 8,\n                : 8;\n        int16_t pwm_scale_auto : 9;\n      };\n    };\n  };\n}\n\n#pragma pack(pop)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMC2209Stepper.cpp",
    "content": "#include \"TMCStepper.h\"\n\nuint32_t TMC2209Stepper::IOIN() {\n    return read(TMC2209_n::IOIN_t::address);\n}\nbool TMC2209Stepper::enn()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.enn;      }\nbool TMC2209Stepper::ms1()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms1;      }\nbool TMC2209Stepper::ms2()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.ms2;      }\nbool TMC2209Stepper::diag()         { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.diag;     }\nbool TMC2209Stepper::pdn_uart()     { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.pdn_uart; }\nbool TMC2209Stepper::step()         { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.step;     }\nbool TMC2209Stepper::spread_en()    { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.spread_en;}\nbool TMC2209Stepper::dir()          { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.dir;      }\nuint8_t TMC2209Stepper::version()   { TMC2209_n::IOIN_t r{0}; r.sr = IOIN(); return r.version;  }\n\nvoid TMC2209Stepper::push() {\n    IHOLD_IRUN(IHOLD_IRUN_register.sr);\n    TPOWERDOWN(TPOWERDOWN_register.sr);\n    TPWMTHRS(TPWMTHRS_register.sr);\n    GCONF(GCONF_register.sr);\n    SLAVECONF(SLAVECONF_register.sr);\n    VACTUAL(VACTUAL_register.sr);\n    CHOPCONF(CHOPCONF_register.sr);\n    PWMCONF(PWMCONF_register.sr);\n    TCOOLTHRS(TCOOLTHRS_register.sr);\n}\n\nvoid TMC2209Stepper::SGTHRS(uint8_t input) {\n    SGTHRS_register.sr = input;\n    write(SGTHRS_register.address, SGTHRS_register.sr);\n}\nuint8_t TMC2209Stepper::SGTHRS() {\n    return SGTHRS_register.sr;\n}\n\n// W: TCOOLTHRS\nuint32_t TMC2209Stepper::TCOOLTHRS() { return TCOOLTHRS_register.sr; }\nvoid TMC2209Stepper::TCOOLTHRS(uint32_t input) {\n  TCOOLTHRS_register.sr = input;\n  write(TCOOLTHRS_register.address, TCOOLTHRS_register.sr);\n}\n\nuint16_t TMC2209Stepper::SG_RESULT() {\n    return read(TMC2209_n::SG_RESULT_t::address);\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMC2209_bitfields.h",
    "content": "#pragma once\n#pragma pack(push, 1)\n\nnamespace TMC2209_n {\n  struct IOIN_t {\n    constexpr static uint8_t address = 0x06;\n    union {\n      uint32_t sr;\n      struct {\n        bool  enn : 1,\n                  : 1,\n              ms1 : 1,\n              ms2 : 1,\n              diag : 1,\n                   : 1,\n              pdn_uart : 1,\n              step : 1,\n              spread_en : 1,\n              dir : 1;\n        uint16_t : 14;\n        uint8_t version : 8;\n      };\n    };\n  };\n\n  struct SGTHRS_t {\n    constexpr static uint8_t address = 0x40;\n    uint8_t sr : 8;\n  };\n\n  struct SG_RESULT_t {\n    constexpr static uint8_t address = 0x41;\n    uint16_t sr : 10;\n  };\n\n  struct COOLCONF_t {\n    constexpr static uint8_t address = 0x42;\n    union {\n      uint16_t sr;\n      struct {\n        uint8_t semin : 4,\n                      : 1,\n                seup : 2,\n                      : 1,\n                semax : 4,\n                      : 1,\n                sedn : 2;\n        bool    seimin : 1;\n      };\n    };\n  };\n\n} //namespace \n//////////////////////////////////////////////////////\nstruct SLAVECONF_t {\n  constexpr static uint8_t address = 0x03;\n  union {\n    uint16_t sr : 12;\n    struct {\n      uint8_t slaveaddr : 8;\n      uint8_t senddelay : 4;\n    };\n  };\n};\n\nstruct PWM_AUTO_t {\n  constexpr static uint8_t address = 0x72;\n  union {\n    uint32_t sr : 24;\n    struct {\n      uint8_t pwm_ofs_auto : 8,\n                           : 8,\n              pwm_grad_auto : 8;\n    };\n  };\n};\n\nstruct GCONF_t {\n  constexpr static uint8_t address = 0x00;\n  union {\n    uint32_t sr : 18;\n    struct {\n      bool  i_scale_analog : 1, // 2130, 5130\n            internal_rsense : 1, // 2130, 5130\n            en_pwm_mode : 1,\n            enc_commutation : 1, // 2130, 5130\n            shaft : 1,\n            diag0_error : 1,\n            diag0_otpw : 1,\n            diag0_stall : 1,\n            diag1_stall : 1,\n            diag1_index : 1,\n            diag1_onstate : 1,\n            diag1_steps_skipped : 1,\n            diag0_int_pushpull : 1,\n            diag1_pushpull : 1,\n            small_hysteresis : 1,\n            stop_enable : 1,\n            direct_mode : 1;\n    };\n    struct { // TMC5160\n      bool recalibrate : 1,\n           faststandstill : 1,\n                          : 1,\n           multistep_filt : 1,\n                    : 3,\n           diag0_step : 1,\n           diag1_dir : 1,\n                 : 4,\n           diag1_poscomp_pushpull : 1;\n    };\n  };\n};\n\nstruct IHOLD_IRUN_t {\n  constexpr static uint8_t address = 0x10;\n  union {\n    uint32_t sr : 20;\n    struct {\n      uint8_t ihold : 5,\n                    : 3,\n              irun : 5,\n                   : 3,\n              iholddelay : 4;\n    };\n  };\n};\n\nstruct GSTAT_t {\n  constexpr static uint8_t address = 0x01;\n  union {\n    uint8_t sr : 3;\n    struct {\n      bool  reset : 1,\n            drv_err : 1,\n            uv_cp : 1;\n    };\n  };\n};\n\nstruct TPOWERDOWN_t {\n  constexpr static uint8_t address = 0x11;\n  uint8_t sr : 8;\n};\n\nstruct TPWMTHRS_t {\n  constexpr static uint8_t address = 0x13;\n  uint32_t sr : 20;\n};\n\nstruct TCOOLTHRS_t {\n  constexpr static uint8_t address = 0x14;\n  uint32_t sr : 20;\n};\n\nstruct THIGH_t {\n  constexpr static uint8_t address = 0x15;\n  uint32_t sr : 20;\n};\n\nstruct XDIRECT_t {\n  constexpr static uint8_t address = 0x2D;\n  union {\n    uint32_t sr : 25;\n    struct {\n      int16_t coil_A : 9;\n      int8_t         : 7;\n      int16_t coil_B : 9;\n    };\n  };\n};\n\nstruct VDCMIN_t {\n  constexpr static uint8_t address = 0x33;\n  uint32_t sr : 23;\n};\n\nstruct CHOPCONF_t {\n  constexpr static uint8_t address = 0x6C;\n  union {\n    uint32_t sr : 32;\n    struct {\n      uint8_t toff : 4,\n              hstrt : 3,\n              hend : 4,\n                   : 1;\n      bool    disfdcc : 1,\n              rndtf : 1,\n              chm : 1;\n      uint8_t tbl : 2;\n      bool    vsense : 1,\n              vhighfs : 1,\n              vhighchm : 1;\n      uint8_t sync : 4, // 2130, 5130\n              mres : 4;\n      bool    intpol : 1,\n              dedge : 1,\n              diss2g : 1;\n    };\n    struct { // TMC5160\n      uint32_t     : 20;\n      uint8_t tpfd : 4; // 5160\n      uint16_t     : 7;\n      bool diss2vs : 1; // TMC5160 only\n    };\n  };\n};\n\nstruct DCCTRL_t {\n    constexpr static uint8_t address = 0x6E;\n    union {\n        uint32_t sr : 24;\n        struct {\n            uint16_t dc_time : 10,\n                : 6;\n            uint8_t dc_sg : 8;\n        };\n    };\n};\n\nstruct PWMCONF_t {\n  constexpr static uint8_t address = 0x70;\n  union {\n    uint32_t sr : 22;\n    struct {\n      uint8_t pwm_ampl : 8,\n              pwm_grad : 8,\n              pwm_freq : 2;\n      bool pwm_autoscale : 1,\n           pwm_symmetric : 1;\n      uint8_t freewheel : 2;\n    };\n  };\n};\n\nstruct ENCM_CTRL_t {\n  constexpr static uint8_t address = 0x72;\n  union {\n    uint8_t sr : 2;\n    struct {\n      bool  inv : 1,\n            maxspeed : 1;\n    };\n  };\n};  \n  \n#pragma pack(pop)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMCStepper.cpp",
    "content": "#include \"TMCStepper.h\"\n\n\n/*\n  Requested current = mA = I_rms/1000\n  Equation for current:\n  I_rms = (CS+1)/32 * V_fs/(R_sense+0.02ohm) * 1/sqrt(2)\n  Solve for CS ->\n  CS = 32*sqrt(2)*I_rms*(R_sense+0.02)/V_fs - 1\n\n  Example:\n  vsense = 0b0 -> V_fs = 0.325V\n  mA = 1640mA = I_rms/1000 = 1.64A\n  R_sense = 0.10 Ohm\n  ->\n  CS = 32*sqrt(2)*1.64*(0.10+0.02)/0.325 - 1 = 26.4\n  CS = 26\n*/\n\nuint16_t TMCStepper::cs2rms(uint8_t CS) {\n  return (float)(CS+1)/32.0 * (vsense() ? 0.180 : 0.325)/(Rsense+0.02) / 1.41421 * 1000;\n}\n\nvoid TMCStepper::rms_current(uint16_t mA) {\n  uint8_t CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.325 - 1;\n  // If Current Scale is too low, turn on high sensitivity R_sense and calculate again\n  if (CS < 16) {\n    vsense(true);\n    CS = 32.0*1.41421*mA/1000.0*(Rsense+0.02)/0.180 - 1;\n  } else { // If CS >= 16, turn off high_sense_r\n    vsense(false);\n  }\n\n  if (CS > 31)\n    CS = 31;\n\n  irun(CS);\n  ihold(CS*holdMultiplier);\n  //val_mA = mA;\n}\nvoid TMCStepper::rms_current(uint16_t mA, float mult) {\n  holdMultiplier = mult;\n  rms_current(mA);\n}\n\nuint16_t TMCStepper::rms_current() {\n  return cs2rms(irun());\n}\n\nuint8_t TMCStepper::test_connection() {\n  uint32_t drv_status = DRV_STATUS();\n  switch (drv_status) {\n      case 0xFFFFFFFF: return 1;\n      case 0: return 2;\n      default: return 0;\n  }\n}\n\nvoid TMCStepper::hysteresis_end(int8_t value) { hend(value+3); }\nint8_t TMCStepper::hysteresis_end() { return hend()-3; };\n\nvoid TMCStepper::hysteresis_start(uint8_t value) { hstrt(value-1); }\nuint8_t TMCStepper::hysteresis_start() { return hstrt()+1; }\n\nvoid TMCStepper::microsteps(uint16_t ms) {\n  switch(ms) {\n    case 256: mres(0); break;\n    case 128: mres(1); break;\n    case  64: mres(2); break;\n    case  32: mres(3); break;\n    case  16: mres(4); break;\n    case   8: mres(5); break;\n    case   4: mres(6); break;\n    case   2: mres(7); break;\n    case   1: mres(8); break;\n    default: break;\n  }\n}\n\nuint16_t TMCStepper::microsteps() {\n  switch(mres()) {\n    case 0: return 256;\n    case 1: return 128;\n    case 2: return  64;\n    case 3: return  32;\n    case 4: return  16;\n    case 5: return   8;\n    case 6: return   4;\n    case 7: return   2;\n    case 8: return   1;\n  }\n  return 1;\n}\n\nvoid TMCStepper::blank_time(uint8_t value) {\n  switch (value) {\n    case 16: tbl(0b00); break;\n    case 24: tbl(0b01); break;\n    case 36: tbl(0b10); break;\n    case 54: tbl(0b11); break;\n  }\n}\n\nuint8_t TMCStepper::blank_time() {\n  switch (tbl()) {\n    case 0b00: return 16;\n    case 0b01: return 24;\n    case 0b10: return 36;\n    case 0b11: return 54;\n  }\n  return 0;\n}\n\n///////////////////////////////////////////////////////////////////////////////////////\n// R+C: GSTAT\nuint8_t TMCStepper::GSTAT()  { return read(GSTAT_t::address); }\nvoid  TMCStepper::GSTAT(uint8_t){ write(GSTAT_t::address, 0b111); }\nbool  TMCStepper::reset()    { GSTAT_t r; r.sr = GSTAT(); return r.reset; }\nbool  TMCStepper::drv_err()  { GSTAT_t r; r.sr = GSTAT(); return r.drv_err; }\nbool  TMCStepper::uv_cp()    { GSTAT_t r; r.sr = GSTAT(); return r.uv_cp; }\n///////////////////////////////////////////////////////////////////////////////////////\n// W: TPOWERDOWN\nuint8_t TMCStepper::TPOWERDOWN() { return TPOWERDOWN_register.sr; }\nvoid TMCStepper::TPOWERDOWN(uint8_t input) {\n  TPOWERDOWN_register.sr = input;\n  write(TPOWERDOWN_register.address, TPOWERDOWN_register.sr);\n}\n///////////////////////////////////////////////////////////////////////////////////////\n// R: TSTEP\nuint32_t TMCStepper::TSTEP() { return read(TSTEP_t::address); }\n///////////////////////////////////////////////////////////////////////////////////////\n// W: TPWMTHRS\nuint32_t TMCStepper::TPWMTHRS() { return TPWMTHRS_register.sr; }\nvoid TMCStepper::TPWMTHRS(uint32_t input) {\n  TPWMTHRS_register.sr = input;\n  write(TPWMTHRS_register.address, TPWMTHRS_register.sr);\n}\n\nuint16_t TMCStepper::MSCNT() {\n  return read(MSCNT_t::address);\n}\n\nuint32_t TMCStepper::MSCURACT() { return read(MSCURACT_t::address); }\nint16_t TMCStepper::cur_a() {\n  MSCURACT_t r{0};\n  r.sr = MSCURACT();\n  int16_t value = r.cur_a;\n  if (value > 255) value -= 512;\n  return value;\n}\nint16_t TMCStepper::cur_b() {\n  MSCURACT_t r{0};\n  r.sr = MSCURACT();\n  int16_t value = r.cur_b;\n  if (value > 255) value -= 512;\n  return value;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMCStepper.h",
    "content": "#include \"mbed.h\"\n#include <cstdint>\n#include \"../SoftwareSerial/SoftwareSerial.h\"\n#include \"../pin/pin.h\"\n\n//#include \"TMC2130_bitfields.h\"\n//#include \"TMC2160_bitfields.h\"\n//#include \"TMC5130_bitfields.h\"\n//#include \"TMC5160_bitfields.h\"\n#include \"TMC2208_bitfields.h\"\n#include \"TMC2209_bitfields.h\"\n//#include \"TMC2660_bitfields.h\"\n\n\n#define INIT_REGISTER(REG) REG##_t REG##_register = REG##_t\n#define INIT2208_REGISTER(REG) TMC2208_n::REG##_t REG##_register = TMC2208_n::REG##_t\n#define SET_ALIAS(TYPE, DRIVER, NEW, ARG, OLD) TYPE (DRIVER::*NEW)(ARG) = &DRIVER::OLD\n\n#define TMCSTEPPER_VERSION 0x000701 // v0.7.1\n\nclass TMCStepper {\n    public:\n        uint16_t cs2rms(uint8_t CS);\n        void rms_current(uint16_t mA);\n        void rms_current(uint16_t mA, float mult);\n        uint16_t rms_current();\n        void hold_multiplier(float val) { holdMultiplier = val; }\n        float hold_multiplier() { return holdMultiplier; }\n        uint8_t test_connection();\n\n        // Helper functions\n        void microsteps(uint16_t ms);\n        uint16_t microsteps();\n        void blank_time(uint8_t value);\n        uint8_t blank_time();\n        void hysteresis_end(int8_t value);\n        int8_t hysteresis_end();\n        void hysteresis_start(uint8_t value);\n        uint8_t hysteresis_start();\n\n        // R+WC: GSTAT\n        void    GSTAT(                          uint8_t input);\n        uint8_t GSTAT();\n        bool    reset();\n        bool    drv_err();\n        bool    uv_cp();\n\n        // W: IHOLD_IRUN\n        void IHOLD_IRUN(                    uint32_t input);\n        uint32_t IHOLD_IRUN();\n        void    ihold(                          uint8_t B);\n        void    irun(                               uint8_t B);\n        void    iholddelay(                 uint8_t B);\n        uint8_t ihold();\n        uint8_t irun();\n        uint8_t iholddelay();\n\n        // W: TPOWERDOWN\n        uint8_t TPOWERDOWN();\n        void TPOWERDOWN(                    uint8_t input);\n\n        // R: TSTEP\n        uint32_t TSTEP();\n\n        // W: TPWMTHRS\n        uint32_t TPWMTHRS();\n        void TPWMTHRS(                      uint32_t input);\n\n        // R: MSCNT\n        uint16_t MSCNT();\n\n        // R: MSCURACT\n        uint32_t MSCURACT();\n        int16_t cur_a();\n        int16_t cur_b();\n\n\t\tTimer tmcTimer;\n\n    protected:\n        TMCStepper(float RS) : Rsense(RS) {};\n        INIT_REGISTER(IHOLD_IRUN){{.sr=0}}; // 32b\n        INIT_REGISTER(TPOWERDOWN){.sr=0};       // 8b\n        INIT_REGISTER(TPWMTHRS){.sr=0};         // 32b\n\n        static constexpr uint8_t TMC_READ = 0x00,\n                                 TMC_WRITE = 0x80;\n\n        struct TSTEP_t { constexpr static uint8_t address = 0x12; };\n        struct MSCNT_t { constexpr static uint8_t address = 0x6A; };\n\n        virtual void write(uint8_t, uint32_t) = 0;\n        virtual uint32_t read(uint8_t) = 0;\n        virtual void vsense(bool) = 0;\n        virtual bool vsense(void) = 0;\n        virtual uint32_t DRV_STATUS() = 0;\n        virtual void hend(uint8_t) = 0;\n        virtual uint8_t hend() = 0;\n        virtual void hstrt(uint8_t) = 0;\n        virtual uint8_t hstrt() = 0;\n        virtual void mres(uint8_t) = 0;\n        virtual uint8_t mres() = 0;\n        virtual void tbl(uint8_t) = 0;\n        virtual uint8_t tbl() = 0;\n\n        const float Rsense;\n        float holdMultiplier = 0.5;\n};\n\n\nclass TMC2208Stepper : public TMCStepper {\n    public:\n\n        TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS) :\n                TMC2208Stepper(SWRXpin, SWTXpin, RS, TMC2208_SLAVE_ADDR)\n                {}\n\n        SoftwareSerial * SWSerial = nullptr;\n\n        void defaults();\n        void push();\n        void begin();\n        void beginSerial(uint32_t baudrate) __attribute__((weak));\n\n        bool isEnabled();\n\n        // RW: GCONF\n        void GCONF(uint32_t input);\n        void I_scale_analog(bool B);\n        void internal_Rsense(bool B);\n        void en_spreadCycle(bool B);\n        void shaft(bool B);\n        void index_otpw(bool B);\n        void index_step(bool B);\n        void pdn_disable(bool B);\n        void mstep_reg_select(bool B);\n        void multistep_filt(bool B);\n        uint32_t GCONF();\n        bool I_scale_analog();\n        bool internal_Rsense();\n        bool en_spreadCycle();\n        bool shaft();\n        bool index_otpw();\n        bool index_step();\n        bool pdn_disable();\n        bool mstep_reg_select();\n        bool multistep_filt();\n\n        // R: IFCNT\n        uint8_t IFCNT();\n\n        // W: SLAVECONF\n        void SLAVECONF(uint16_t input);\n        uint16_t SLAVECONF();\n        void senddelay(uint8_t B);\n        uint8_t senddelay();\n\n        // W: OTP_PROG\n        void OTP_PROG(uint16_t input);\n\n        // R: OTP_READ\n        uint32_t OTP_READ();\n\n        // R: IOIN\n        uint32_t IOIN();\n        bool enn();\n        bool ms1();\n        bool ms2();\n        bool diag();\n        bool pdn_uart();\n        bool step();\n        bool sel_a();\n        bool dir();\n        uint8_t version();\n\n        // RW: FACTORY_CONF\n        void FACTORY_CONF(uint16_t input);\n        uint16_t FACTORY_CONF();\n        void fclktrim(uint8_t B);\n        void ottrim(uint8_t B);\n        uint8_t fclktrim();\n        uint8_t ottrim();\n\n        // W: VACTUAL\n        void VACTUAL(uint32_t input);\n        uint32_t VACTUAL();\n\n        // RW: CHOPCONF\n        void CHOPCONF(uint32_t input);\n        void toff(uint8_t B);\n        void hstrt(uint8_t B);\n        void hend(uint8_t B);\n        void tbl(uint8_t B);\n        void vsense(bool B);\n        void mres(uint8_t B);\n        void intpol(bool B);\n        void dedge(bool B);\n        void diss2g(bool B);\n        void diss2vs(bool B);\n        uint32_t CHOPCONF();\n        uint8_t toff();\n        uint8_t hstrt();\n        uint8_t hend();\n        uint8_t tbl();\n        bool vsense();\n        uint8_t mres();\n        bool intpol();\n        bool dedge();\n        bool diss2g();\n        bool diss2vs();\n\n        // R: DRV_STATUS\n        uint32_t DRV_STATUS();\n        bool otpw();\n        bool ot();\n        bool s2ga();\n        bool s2gb();\n        bool s2vsa();\n        bool s2vsb();\n        bool ola();\n        bool olb();\n        bool t120();\n        bool t143();\n        bool t150();\n        bool t157();\n        uint16_t cs_actual();\n        bool stealth();\n        bool stst();\n\n        // RW: PWMCONF\n        void PWMCONF(uint32_t input);\n        void pwm_ofs(uint8_t B);\n        void pwm_grad(uint8_t B);\n        void pwm_freq(uint8_t B);\n        void pwm_autoscale(bool B);\n        void pwm_autograd(bool B);\n        void freewheel(uint8_t B);\n        void pwm_reg(uint8_t B);\n        void pwm_lim(uint8_t B);\n        uint32_t PWMCONF();\n        uint8_t pwm_ofs();\n        uint8_t pwm_grad();\n        uint8_t pwm_freq();\n        bool pwm_autoscale();\n        bool pwm_autograd();\n        uint8_t freewheel();\n        uint8_t pwm_reg();\n        uint8_t pwm_lim();\n\n        // R: PWM_SCALE\n        uint32_t PWM_SCALE();\n        uint8_t pwm_scale_sum();\n        int16_t pwm_scale_auto();\n\n        // R: PWM_AUTO (0x72)\n        uint32_t PWM_AUTO();\n        uint8_t pwm_ofs_auto();\n        uint8_t pwm_grad_auto();\n\n        uint16_t bytesWritten = 0;\n        float Rsense = 0.11;\n        bool CRCerror = false;\n    protected:\n        INIT2208_REGISTER(GCONF)            {{.sr=0}};\n        INIT_REGISTER(SLAVECONF)            {{.sr=0}};\n        INIT_REGISTER(FACTORY_CONF)     {{.sr=0}};\n        INIT2208_REGISTER(VACTUAL)      {.sr=0};\n        INIT2208_REGISTER(CHOPCONF)     {{.sr=0}};\n        INIT2208_REGISTER(PWMCONF)      {{.sr=0}};\n\n        struct IFCNT_t      { constexpr static uint8_t address = 0x02; };\n        struct OTP_PROG_t   { constexpr static uint8_t address = 0x04; };\n        struct OTP_READ_t   { constexpr static uint8_t address = 0x05; };\n\n        //SoftwareSerial * SWSerial = nullptr;\n\n        TMC2208Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr);\n\n        std::string SWTXpin;\n        std::string SWRXpin;\n\n        DigitalOut* debug1;\n        DigitalOut* debug2;\n\n        int available();\n        void preWriteCommunication();\n        void preReadCommunication();\n        int16_t serial_read();\n        uint8_t serial_write(const uint8_t data);\n        void postWriteCommunication();\n        void postReadCommunication();\n        void write(uint8_t, uint32_t);\n        uint32_t read(uint8_t);\n        const uint8_t slave_address;\n        uint8_t calcCRC(uint8_t datagram[], uint8_t len);\n        static constexpr uint8_t  TMC2208_SYNC = 0x05,\n                                  TMC2208_SLAVE_ADDR = 0x00;\n        static constexpr uint8_t replyDelay = 2;  //ms\n        static constexpr uint8_t abort_window = 5;\n        static constexpr uint8_t max_retries = 2;\n\n        uint64_t _sendDatagram(uint8_t [], const uint8_t, uint16_t);\n};\n\nclass TMC2209Stepper : public TMC2208Stepper {\n    public:\n\n        TMC2209Stepper(std::string SWRXpin, std::string SWTXpin, float RS, uint8_t addr) :\n                TMC2208Stepper(SWRXpin, SWTXpin, RS, addr) {}\n\n        void push();\n\n        // R: IOIN\n        uint32_t IOIN();\n        bool enn();\n        bool ms1();\n        bool ms2();\n        bool diag();\n        bool pdn_uart();\n        bool step();\n        bool spread_en();\n        bool dir();\n        uint8_t version();\n\n        // W: TCOOLTHRS\n        uint32_t TCOOLTHRS();\n        void TCOOLTHRS(uint32_t input);\n\n        // W: SGTHRS\n        void SGTHRS(uint8_t B);\n        uint8_t SGTHRS();\n\n        // R: SG_RESULT\n        uint16_t SG_RESULT();\n\n        // W: COOLCONF\n        void COOLCONF(uint16_t B);\n        uint16_t COOLCONF();\n        void semin(uint8_t B);\n        void seup(uint8_t B);\n        void semax(uint8_t B);\n        void sedn(uint8_t B);\n        void seimin(bool B);\n        uint8_t semin();\n        uint8_t seup();\n        uint8_t semax();\n        uint8_t sedn();\n        bool seimin();\n\n    protected:\n        INIT_REGISTER(TCOOLTHRS){.sr=0};\n        TMC2209_n::SGTHRS_t SGTHRS_register{.sr=0};\n        TMC2209_n::COOLCONF_t COOLCONF_register{{.sr=0}};\n};\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/TMCStepper/TMC_MACROS.h",
    "content": "#pragma once\n\n#define DEBUG_PRINT(CFG, VAL) Serial.print(CFG); Serial.print('('); Serial.print(VAL, HEX); Serial.println(')')\n//#define WRITE_REG(R) write(R##_register.address, R##_register.sr)\n//#define READ_REG(R) read(R##_register.address)"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/configuration.h",
    "content": "#ifndef CONFIGURATION_H\n#define CONFIGURATION_H\n\n#define PRU_BASEFREQ    \t40000 //24000   // PRU Base thread ISR update frequency (hz)\n#define PRU_SERVOFREQ       1000            // PRU Servo thread ISR update freqency (hz)\n#define OVERSAMPLE          3\n#define SWBAUDRATE          19200           // Software serial baud rate\n#define PRU_COMMSFREQ       (SWBAUDRATE * OVERSAMPLE)\n\n#define STEPBIT     \t\t22            \t// bit location in DDS accum\n#define STEP_MASK   \t\t  (1L<<STEPBIT)\n\n#define JSON_BUFF_SIZE\t    10000\t\t\t// Jason dynamic buffer size\n\n#define JOINTS\t\t\t    8\t\t\t\t// Number of joints - set this the same as LinuxCNC HAL compenent. Max 8 joints\n#define VARIABLES           6             \t// Number of command values - set this the same as the LinuxCNC HAL compenent\n\n#define PRU_DATA\t\t    0x64617461 \t    // \"data\" SPI payload\n#define PRU_READ            0x72656164      // \"read\" SPI payload\n#define PRU_WRITE           0x77726974      // \"writ\" SPI payload\n#define PRU_ESTOP           0x65737470      // \"estp\" SPI payload\n\n\n// Serial configuration\n#define TXD0                P0_2            // MBED pin number\n#define RXD0                P0_3\n#define PC_BAUD             115200          // UART baudrate\n\n\n//#define LOOP_TIME           .1\n#define DATA_ERR_MAX         5\n// PRU reset will occur in SPI_ERR_MAX * LOOP_TIME = 0.5sec\n\n// SPI configuration\n#define SPI_BUFF_SIZE \t\t64            \t// Size of SPI recieve buffer - same as HAL component, 64\n\n#define MOSI0               P0_18           // RPi SPI\n#define MISO0               P0_17\n#define SCK0                P0_15\n#define SSEL0               P0_16\n\n//#define MOSI1               P0_9            // SD card\n//#define MISO1               P0_8\n//#define SCK1                P0_7\n//#define SSEL1               P0_6\n\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/custom_targets.json",
    "content": "{\n    \"MANTA8\": {\n        \"inherits\": [\"MCU_STM32G0\"],\n        \"extra_labels_add\": [\n            \"STM32G0\",\n            \"STM32G0B1xE\"\n        ],\n        \"macros_add\": [\n            \"STM32G0B1xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"SD\"\n        ],\n              \"device_has_remove\": [\"LPTICKER\"],\n        \"device_name\": \"STM32G0B1RETx\",\n        \"bootloader_supported\": true\n    },\n    \"SKRV3\": {\n        \"inherits\": [\n            \"MCU_STM32H743xI\"\n        ],\n        \"extra_labels_add\": [\"STM32H743xI\"],\n        \"config\": {\n            \"hse_value\": {\n                \"help\": \"HSE default value is 25MHz in HAL\",\n                \"value\": \"25000000\",\n                \"macro_name\": \"HSE_VALUE\"\n            }\n        },\n        \"overrides\": {\n            \"clock_source\": \"USE_PLL_HSE_XTAL\",\n            \"lse_available\": 0\n        },\n        \"macros_add\": [\n            \"STM32H743xx\"\n        ],\n        \"device_has_add\": [\n            \"FLASH\",\n            \"SERIAL_ASYNCH\",\n            \"MPU\"\n        ],\n        \n        \"device_name\": \"STM32H743VITx\"\n    },\n    \"SKRV2\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F407\",\n            \"STM32F407xG\",\n            \"STM32F407VG\"\n        ],\n        \"macros_add\": [\n            \"STM32F407xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"FLASH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F407VGTx\",\n        \"bootloader_supported\": true\n\n    }, \n    \"MONSTER8\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F407\",\n            \"STM32F407xE\",\n            \"STM32F407VE\"\n        ],\n        \"macros_add\": [\n            \"STM32F407xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F407VETx\"\n\n    },\n    \"ROBIN_3\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F407\",\n            \"STM32F407xE\",\n            \"STM32F407VE\"\n        ],\n        \"macros_add\": [\n            \"STM32F407xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F407VETx\"\n    },\n    \n    \"SPIDER_KING\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F407\",\n            \"STM32F407xE\",\n            \"STM32F407ZE\"\n        ],\n        \"macros_add\": [\n            \"STM32F407xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"FLASH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F407ZETx\"\n\n    }, \n\n    \"BLACK_F407VE\": {\n        \"inherits\": [\"ARCH_MAX\"]\n    },\n    \"OCTOPUS_429\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\",\n            \"STM32F429\",\n            \"STM32F429xG\"\n          \n        ],\n           \"macros_add\": [\n            \"STM32F429xx\"],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"overrides\": { \"lse_available\": 0 ,\n        \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"},\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"TRNG\",\n            \"MPU\"\n        ],\n               \"device_has_remove\": [\n        \"FLASH\"\n        ],\n        \"device_name\": \"STM32F429ZGTx\",\n        \"bootloader_supported\": true\n    },\n    \"OCTOPUS_446\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\", \n            \"STM32F446xE\", \n            \"STM32F446ZE\"],\n        \"macros_add\": [\n            \"STM32F446xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"config\": {     \"hse_value\": {\n                \"help\": \"HSE default value is 8MHz in stm32g4xx_hal_conf.h\",\n                \"value\": \"12000000\",\n                \"macro_name\": \"HSE_VALUE\"\n            }\n     \n        },\n         \"overrides\": { \"lse_available\": 0 ,\n            \"clock_source\":  \"USE_PLL_HSE_XTAL\"\n         },\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"SERIAL_ASYNCH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F446ZETx\",\n        \"bootloader_supported\": true\n    },\n    \"SPIDER\": {\n        \"inherits\": [\"MCU_STM32F4\"],\n        \"core\": \"Cortex-M4F\",\n        \"extra_labels_add\": [\n            \"STM32F4\", \n            \"STM32F446xE\", \n            \"STM32F446VE\"],\n        \"macros_add\": [\n            \"STM32F446xx\"\n        ],\n        \"supported_toolchains\": [\"ARM\", \"uARM\", \"GCC_ARM\", \"IAR\"],\n\n        \"config\": {     \"hse_value\": {\n                \"help\": \"HSE default value is 8MHz in stm32g4xx_hal_conf.h\",\n                \"value\": \"12000000\",\n                \"macro_name\": \"HSE_VALUE\"\n            }\n     \n        },\n         \"overrides\": { \"lse_available\": 0 ,\n            \"clock_source\":  \"USE_PLL_HSE_XTAL\"\n         },\n        \"device_has_add\": [\n            \"ANALOGOUT\",\n            \"SERIAL_ASYNCH\",\n            \"MPU\"\n        ],\n        \"device_name\": \"STM32F446VETx\",\n        \"bootloader_supported\": true\n        \n    },\n    \"ROBIN_E3\": {\n        \"inherits\": [\"MCU_STM32F1\"],\n        \"c_lib\": \"std\",\n        \"core\": \"Cortex-M3\",\n        \"extra_labels_add\": [\"STM32F103xC\"],\n        \"macros_add\": [\"STM32F103xE\"],\n        \"supported_toolchains\": [\"ARMC6\"],\n\n        \"device_has_add\": [\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"FLASH\",\n            \"CRC\",\n            \"SD\",\n            \"PWM\"\n        ],\n\n        \"overrides\": {\n            \"tickless-from-us-ticker\": true,\n            \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"\n        },\n        \"device_name\": \"STM32F103RC\",\n\t\t\"bootloader_supported\": true\n    },\n    \"SKR_MINI_E3\": {\n        \"inherits\": [\"MCU_STM32F1\"],\n        \"c_lib\": \"std\",\n        \"core\": \"Cortex-M3\",\n        \"extra_labels_add\": [\"STM32F103xC\"],\n        \"macros_add\": [\"STM32F103xE\"],\n        \"supported_toolchains\": [\"ARMC6\"],\n\n        \"device_has_add\": [\n            \"CAN\",\n            \"SERIAL_ASYNCH\",\n            \"FLASH\",\n            \"CRC\",\n            \"SD\",\n            \"PWM\"\n        ],\n\n        \"overrides\": {\n            \"tickless-from-us-ticker\": true,\n            \"clock_source\": \"USE_PLL_HSE_XTAL|USE_PLL_HSI\"\n        },\n        \"device_name\": \"STM32F103RC\",\n\t\t\"bootloader_supported\": true\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/drivers/softPwm/softPwm.cpp",
    "content": "#include \"softPwm.h\"\n\n#include <algorithm>\n\n#define confine(value, min, max) (((value) < (min))?(min):(((value) > (max))?(max):(value)))\n#define PID_PWM_MAX 256\t\t// 8 bit resolution\n\nusing namespace std;\n\nSoftPWM::SoftPWM(std::string pin) :\n\tpin(pin),\n\tpwmMax(PID_PWM_MAX-1),\n\tpwmSP(0),\n\tSDaccumulator(0),\n\tSDdirection(false)\n{\n\tthis->pwmPin = new Pin(this->pin, OUTPUT);\n}\n\n\nvoid SoftPWM::setMaxPwm(int pwmMax)\n{\n\tthis->pwmMax = confine(pwmMax, 0, PID_PWM_MAX-1);\n}\n\n\nvoid SoftPWM::setPwmSP(int newPwmSP)\n{\n\tthis->pwmSP = newPwmSP; //confine(newPwmSP, 0, pwmMax);\n}\n\n\nvoid SoftPWM::update()\n{\n\t// Use the standard Moudle interface\n\n\tif ((this->pwmSP < 0) || this->pwmSP >= PID_PWM_MAX)\n\t{\n        return;\n    }\n    else if (this->pwmSP == 0)\n\t{\n\t\tthis->pwmPin->set(false);\n        return;\n    }\n    else if (this->pwmSP == PID_PWM_MAX-1)\n\t{\n\t\tthis->pwmPin->set(true);\n        return;\n    }\n\n\n    // this line should never actually do anything, it's just a sanity check in case our accumulator gets corrupted somehow.\n    // If we didn't check and the accumulator is corrupted, we could leave a heater on for quite a long time\n    // the accumulator is kept within these limits by the normal operation of the Sigma-Delta algorithm\n\n    SDaccumulator = confine(SDaccumulator, -PID_PWM_MAX, PID_PWM_MAX << 1);\n\n    // when SDdirection == false, our output is 0 and our accumulator is increasing by pwmSP\n    if (this->SDdirection == false)\n    {\n        // increment accumulator\n        this->SDaccumulator += this->pwmSP;\n        // if we've reached half of max, flip our direction\n        if (this->SDaccumulator >= (PID_PWM_MAX >> 1))\n            this->SDdirection = true;\n    }\n    // when SDdirection == true, our output is 1 and our accumulator is decreasing by (maxPwm - pwmSP)\n    else\n    {\n        // decrement accumulator\n        this->SDaccumulator -= (PID_PWM_MAX - this->pwmSP);\n        // if we've reached 0, flip our direction\n        if (this->SDaccumulator <= 0)\n            this->SDdirection = false;\n    }\n\n\tthis->pwmPin->set(this->SDdirection);\n\n    return;\n}\n\nvoid SoftPWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/drivers/softPwm/softPwm.h",
    "content": "#ifndef SOFTPWM_H\n#define SOFTPWM_H\n\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass SoftPWM : public Module\n{\n\tprivate:\n\n\t\tstd::string pin;\t\t\t// PWM output pin\n\t\tint pwmMax;\t\t\t\t\t\t// maximum PWM output: 8 bit resolution (ie 0 to 255)\n\t\tint pwmSP;\t\t\t\t\t\t// PWM setpoint as a percentage of maxPwm\n\t\tint SDaccumulator;\t\t// Sigma-Delta accumulator\n\t\tbool SDdirection;\t\t\t// direction the SD accumulator is being updated\n\n\t\tPin* pwmPin;\t\t\t\t\t// pin object\n\n\tpublic:\n\n\t\tSoftPWM(std::string);\t\t\t\t\t// constructor\n\n\t\tvoid setMaxPwm(int pwmMax);\n\t\tvoid setPwmSP(int newPwmSP);\n\n\t\tvirtual void update(void);           // Module default interface\n\t\tvirtual void slowUpdate(void);           // Module default interface\n};\n\n#endif\n\n\n/*\n\t The following is taken from Smoothieware...\n\n     * Sigma-Delta PWM algorithm\n     *\n     * This Sigma-Delta implementation works by increasing _sd_accumulator by _pwm until we reach _half_ of max,\n     * then decreasing by (max - target_pwm) until we hit zero\n     *\n     * While we're increasing, the output is 0 and while we're decreasing the output is 1\n     *\n     * For example, with pwm=128 and a max of 256, we'll see the following pattern:\n     * ACC  ADD OUT\n     *   0  128   1 // after the add, we hit 256/2 = 128 so we change direction\n     * 128 -128   0 // after the add, we hit 0 so we change direction again\n     *   0  128   1\n     * 128 -128   0\n     *  as expected\n     *\n     * with a pwm value of 192 (75%) we'll see this:\n     *  ACC  ADD OUT\n     *    0  192   0 // after the add, we are beyond max/2 so we change direction\n     *  192  -64   1 // haven't reached 0 yet\n     *  128  -64   1 // haven't reached 0 yet\n     *   64  -64   1 // after this add we reach 0, and change direction\n     *    0  192   0\n     *  192  -64   1\n     *  128  -64   1\n     *   64  -64   1\n     *    0  192   0\n     * etcetera\n     *\n     * with a pwm value of 75 (about 29%) we'll see this pattern:\n     *  ACC  ADD OUT\n     *    0   75   0\n     *   75   75   0\n     *  150 -181   1\n     *  -31   75   0\n     *   44   75   0\n     *  119   75   0\n     *  194 -181   1\n     *   13 -181   1\n     * -168   75   0\n     *  -93   75   0\n     *  -18   75   0\n     *   57   75   0\n     *  132 -181   1\n     *  -49   75   0\n     *   26   75   0\n     *  101   75   0\n     *  176 -181   1\n     *   -5   75   0\n     *   70   75   0\n     *  145 -181   1\n     *  -36   75   0\n     * etcetera. This pattern has 6 '1's over a total of 21 lines which is on 28.57% of the time. If we let it run longer, it would get closer to the target as time went on\n     */\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/extern.h",
    "content": "#ifndef EXTERN_H\n#define EXTERN_H\n\n#include \"configuration.h\"\n#include \"remora.h\"\n\n#include \"ArduinoJson.h\"\n#include \"pruThread.h\"\n\nextern uint32_t base_freq;\nextern uint32_t servo_freq;\n\nextern JsonObject module;\n\nextern volatile bool PRUreset;\n\n// unions for RX and TX data\nextern volatile rxData_t rxData;\nextern volatile txData_t txData;\n\n// pointers to objects with global scope\nextern pruThread* baseThread;\nextern pruThread* servoThread;\nextern pruThread* commsThread;\n\n// pointers to data\nextern volatile rxData_t*  ptrRxData;\nextern volatile txData_t*  ptrTxData;\nextern volatile int32_t*   ptrTxHeader;  \nextern volatile bool*      ptrPRUreset;\nextern volatile int32_t*   ptrJointFreqCmd[JOINTS];\nextern volatile int32_t*   ptrJointFeedback[JOINTS];\nextern volatile uint8_t*   ptrJointEnable;\nextern volatile float*     ptrSetPoint[VARIABLES];\nextern volatile float*     ptrProcessVariable[VARIABLES];\nextern volatile uint16_t*   ptrInputs;\nextern volatile uint16_t*   ptrOutputs;\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ArrayFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Collection/CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) {\n  return arr ? arr->add(pool) : 0;\n}\n\ntemplate <typename Visitor>\ninline void arrayAccept(const CollectionData *arr, Visitor &visitor) {\n  if (arr)\n    visitor.visitArray(*arr);\n  else\n    visitor.visitNull();\n}\n\ninline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) {\n  if (lhs == rhs) return true;\n  if (!lhs || !rhs) return false;\n\n  return lhs->equalsArray(*rhs);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ArrayImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Object/ObjectRef.hpp\"\n#include \"ArrayRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TArray>\ninline ArrayRef ArrayShortcuts<TArray>::createNestedArray() const {\n  return impl()->addElement().template to<ArrayRef>();\n}\n\ntemplate <typename TArray>\ninline ObjectRef ArrayShortcuts<TArray>::createNestedObject() const {\n  return impl()->addElement().template to<ObjectRef>();\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ArrayIterator.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/SlotFunctions.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass VariantPtr {\n public:\n  VariantPtr(MemoryPool *pool, VariantData *data) : _variant(pool, data) {}\n\n  VariantRef *operator->() {\n    return &_variant;\n  }\n\n  VariantRef &operator*() {\n    return _variant;\n  }\n\n private:\n  VariantRef _variant;\n};\n\nclass ArrayIterator {\n public:\n  ArrayIterator() : _slot(0) {}\n  explicit ArrayIterator(MemoryPool *pool, VariantSlot *slot)\n      : _pool(pool), _slot(slot) {}\n\n  VariantRef operator*() const {\n    return VariantRef(_pool, _slot->data());\n  }\n  VariantPtr operator->() {\n    return VariantPtr(_pool, _slot->data());\n  }\n\n  bool operator==(const ArrayIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ArrayIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ArrayIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ArrayIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  MemoryPool *_pool;\n  VariantSlot *_slot;\n};\n\nclass VariantConstPtr {\n public:\n  VariantConstPtr(const VariantData *data) : _variant(data) {}\n\n  VariantConstRef *operator->() {\n    return &_variant;\n  }\n\n  VariantConstRef &operator*() {\n    return _variant;\n  }\n\n private:\n  VariantConstRef _variant;\n};\n\nclass ArrayConstRefIterator {\n public:\n  ArrayConstRefIterator() : _slot(0) {}\n  explicit ArrayConstRefIterator(const VariantSlot *slot) : _slot(slot) {}\n\n  VariantConstRef operator*() const {\n    return VariantConstRef(_slot->data());\n  }\n  VariantConstPtr operator->() {\n    return VariantConstPtr(_slot->data());\n  }\n\n  bool operator==(const ArrayConstRefIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ArrayConstRefIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ArrayConstRefIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ArrayConstRefIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  const VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  const VariantSlot *_slot;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ArrayRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantData.hpp\"\n#include \"ArrayFunctions.hpp\"\n#include \"ArrayIterator.hpp\"\n\n// Returns the size (in bytes) of an array with n elements.\n// Can be very handy to determine the size of a StaticMemoryPool.\n#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \\\n  ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot))\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ObjectRef;\ntemplate <typename>\nclass ElementProxy;\n\ntemplate <typename TData>\nclass ArrayRefBase {\n public:\n  operator VariantConstRef() const {\n    const void* data = _data;  // prevent warning cast-align\n    return VariantConstRef(reinterpret_cast<const VariantData*>(data));\n  }\n\n  template <typename Visitor>\n  FORCE_INLINE void accept(Visitor& visitor) const {\n    arrayAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return _data == 0;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  FORCE_INLINE size_t size() const {\n    return _data ? _data->size() : 0;\n  }\n\n protected:\n  ArrayRefBase(TData* data) : _data(data) {}\n  TData* _data;\n};\n\nclass ArrayConstRef : public ArrayRefBase<const CollectionData>,\n                      public Visitable {\n  friend class ArrayRef;\n  typedef ArrayRefBase<const CollectionData> base_type;\n\n public:\n  typedef ArrayConstRefIterator iterator;\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  FORCE_INLINE ArrayConstRef() : base_type(0) {}\n  FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {}\n\n  FORCE_INLINE bool operator==(ArrayConstRef rhs) const {\n    return arrayEquals(_data, rhs._data);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const {\n    return getElement(index);\n  }\n\n  FORCE_INLINE VariantConstRef getElement(size_t index) const {\n    return VariantConstRef(_data ? _data->get(index) : 0);\n  }\n};\n\nclass ArrayRef : public ArrayRefBase<CollectionData>,\n                 public ArrayShortcuts<ArrayRef>,\n                 public Visitable {\n  typedef ArrayRefBase<CollectionData> base_type;\n\n public:\n  typedef ArrayIterator iterator;\n\n  FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {}\n  FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data)\n      : base_type(data), _pool(pool) {}\n\n  operator VariantRef() {\n    void* data = _data;  // prevent warning cast-align\n    return VariantRef(_pool, reinterpret_cast<VariantData*>(data));\n  }\n\n  operator ArrayConstRef() const {\n    return ArrayConstRef(_data);\n  }\n\n  VariantRef addElement() const {\n    return VariantRef(_pool, arrayAdd(_data, _pool));\n  }\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_pool, _data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  // Copy a ArrayRef\n  FORCE_INLINE bool set(ArrayConstRef src) const {\n    if (!_data || !src._data) return false;\n    return _data->copyFrom(*src._data, _pool);\n  }\n\n  FORCE_INLINE bool operator==(ArrayRef rhs) const {\n    return arrayEquals(_data, rhs._data);\n  }\n\n  // Gets the value at the specified index.\n  FORCE_INLINE VariantRef getElement(size_t index) const {\n    return VariantRef(_pool, _data ? _data->get(index) : 0);\n  }\n\n  // Removes element at specified position.\n  FORCE_INLINE void remove(iterator it) const {\n    if (!_data) return;\n    _data->remove(it.internal());\n  }\n\n  // Removes element at specified index.\n  FORCE_INLINE void remove(size_t index) const {\n    if (!_data) return;\n    _data->remove(index);\n  }\n\n private:\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ArrayShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n// Forward declarations.\ntemplate <typename>\nclass ElementProxy;\n\ntemplate <typename TArray>\nclass ArrayShortcuts {\n public:\n  // Returns the element at specified index if the variant is an array.\n  FORCE_INLINE ElementProxy<const TArray &> operator[](size_t index) const;\n\n  FORCE_INLINE ObjectRef createNestedObject() const;\n\n  FORCE_INLINE ArrayRef createNestedArray() const;\n\n  // Adds the specified value at the end of the array.\n  //\n  // bool add(TValue);\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ObjectRef\n  template <typename T>\n  FORCE_INLINE bool add(const T &value) const {\n    return impl()->addElement().set(value);\n  }\n  //\n  // bool add(TValue);\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename T>\n  FORCE_INLINE bool add(T *value) const {\n    return impl()->addElement().set(value);\n  }\n\n private:\n  const TArray *impl() const {\n    return static_cast<const TArray *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/ElementProxy.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4522)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TArray>\nclass ElementProxy : public VariantOperators<ElementProxy<TArray> >,\n                     public Visitable {\n  typedef ElementProxy<TArray> this_type;\n\n public:\n  FORCE_INLINE ElementProxy(TArray array, size_t index)\n      : _array(array), _index(index) {}\n\n  FORCE_INLINE this_type& operator=(const this_type& src) {\n    getUpstreamElement().set(src.as<VariantConstRef>());\n    return *this;\n  }\n\n  // Replaces the value\n  //\n  // operator=(const TValue&)\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ArrayRef, ObjectRef\n  template <typename T>\n  FORCE_INLINE this_type& operator=(const T& src) {\n    getUpstreamElement().set(src);\n    return *this;\n  }\n  //\n  // operator=(TValue)\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename T>\n  FORCE_INLINE this_type& operator=(T* src) {\n    getUpstreamElement().set(src);\n    return *this;\n  }\n\n  FORCE_INLINE void clear() const {\n    getUpstreamElement().clear();\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return getUpstreamElement().isNull();\n  }\n\n  template <typename T>\n  FORCE_INLINE typename VariantAs<T>::type as() const {\n    return getUpstreamElement().template as<T>();\n  }\n\n  template <typename T>\n  FORCE_INLINE bool is() const {\n    return getUpstreamElement().template is<T>();\n  }\n\n  template <typename T>\n  FORCE_INLINE typename VariantTo<T>::type to() const {\n    return getUpstreamElement().template to<T>();\n  }\n\n  // Replaces the value\n  //\n  // bool set(const TValue&)\n  // TValue = bool, long, int, short, float, double, serialized, VariantRef,\n  //          std::string, String, ArrayRef, ObjectRef\n  template <typename TValue>\n  FORCE_INLINE bool set(const TValue& value) const {\n    return getUpstreamElement().set(value);\n  }\n  //\n  // bool set(TValue)\n  // TValue = char*, const char*, const __FlashStringHelper*\n  template <typename TValue>\n  FORCE_INLINE bool set(TValue* value) const {\n    return getUpstreamElement().set(value);\n  }\n\n  template <typename Visitor>\n  void accept(Visitor& visitor) const {\n    return getUpstreamElement().accept(visitor);\n  }\n\n  FORCE_INLINE size_t size() const {\n    return getUpstreamElement().size();\n  }\n\n  template <typename TNestedKey>\n  VariantRef getMember(TNestedKey* key) const {\n    return getUpstreamElement().getMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getMember(const TNestedKey& key) const {\n    return getUpstreamElement().getMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getOrAddMember(TNestedKey* key) const {\n    return getUpstreamElement().getOrAddMember(key);\n  }\n\n  template <typename TNestedKey>\n  VariantRef getOrAddMember(const TNestedKey& key) const {\n    return getUpstreamElement().getOrAddMember(key);\n  }\n\n  VariantRef addElement() const {\n    return getUpstreamElement().addElement();\n  }\n\n  VariantRef getElement(size_t index) const {\n    return getUpstreamElement().getElement(index);\n  }\n\n  FORCE_INLINE void remove(size_t index) const {\n    getUpstreamElement().remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(\n      TChar* key) const {\n    getUpstreamElement().remove(key);\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString& key) const {\n    getUpstreamElement().remove(key);\n  }\n\n private:\n  FORCE_INLINE VariantRef getUpstreamElement() const {\n    return _array.getElement(_index);\n  }\n\n  TArray _array;\n  const size_t _index;\n};\n\ntemplate <typename TArray>\ninline ElementProxy<const TArray&> ArrayShortcuts<TArray>::operator[](\n    size_t index) const {\n  return ElementProxy<const TArray&>(*impl(), index);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Array/Utilities.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ArrayRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Copy a 1D array to a JsonArray\ntemplate <typename T, size_t N>\ninline bool copyArray(T (&src)[N], ArrayRef dst) {\n  return copyArray(src, N, dst);\n}\n\n// Copy a 1D array to a JsonArray\ntemplate <typename T>\ninline bool copyArray(T* src, size_t len, ArrayRef dst) {\n  bool ok = true;\n  for (size_t i = 0; i < len; i++) {\n    ok &= dst.add(src[i]);\n  }\n  return ok;\n}\n\n// Copy a 2D array to a JsonArray\ntemplate <typename T, size_t N1, size_t N2>\ninline bool copyArray(T (&src)[N1][N2], ArrayRef dst) {\n  bool ok = true;\n  for (size_t i = 0; i < N1; i++) {\n    ArrayRef nestedArray = dst.createNestedArray();\n    for (size_t j = 0; j < N2; j++) {\n      ok &= nestedArray.add(src[i][j]);\n    }\n  }\n  return ok;\n}\n\n// Copy a JsonArray to a 1D array\ntemplate <typename T, size_t N>\ninline size_t copyArray(ArrayConstRef src, T (&dst)[N]) {\n  return copyArray(src, dst, N);\n}\n\n// Copy a JsonArray to a 1D array\ntemplate <typename T>\ninline size_t copyArray(ArrayConstRef src, T* dst, size_t len) {\n  size_t i = 0;\n  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < len;\n       ++it)\n    dst[i++] = *it;\n  return i;\n}\n\n// Copy a JsonArray to a 2D array\ntemplate <typename T, size_t N1, size_t N2>\ninline void copyArray(ArrayConstRef src, T (&dst)[N1][N2]) {\n  size_t i = 0;\n  for (ArrayConstRef::iterator it = src.begin(); it != src.end() && i < N1;\n       ++it) {\n    copyArray(it->as<ArrayConstRef>(), dst[i++]);\n  }\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Collection/CollectionData.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass MemoryPool;\nclass VariantData;\nclass VariantSlot;\n\nclass CollectionData {\n  VariantSlot *_head;\n  VariantSlot *_tail;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n  VariantSlot *addSlot(MemoryPool *);\n\n  VariantData *add(MemoryPool *pool);\n\n  template <typename TAdaptedString>\n  VariantData *add(TAdaptedString key, MemoryPool *pool);\n\n  void clear();\n\n  template <typename TAdaptedString>\n  bool containsKey(const TAdaptedString &key) const;\n\n  bool copyFrom(const CollectionData &src, MemoryPool *pool);\n\n  bool equalsArray(const CollectionData &other) const;\n  bool equalsObject(const CollectionData &other) const;\n\n  VariantData *get(size_t index) const;\n\n  template <typename TAdaptedString>\n  VariantData *get(TAdaptedString key) const;\n\n  VariantSlot *head() const {\n    return _head;\n  }\n\n  void remove(size_t index);\n\n  template <typename TAdaptedString>\n  void remove(TAdaptedString key) {\n    remove(getSlot(key));\n  }\n\n  void remove(VariantSlot *slot);\n\n  size_t memoryUsage() const;\n  size_t nesting() const;\n  size_t size() const;\n\n private:\n  VariantSlot *getSlot(size_t index) const;\n\n  template <typename TAdaptedString>\n  VariantSlot *getSlot(TAdaptedString key) const;\n\n  VariantSlot *getPreviousSlot(VariantSlot *) const;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Collection/CollectionImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantData.hpp\"\n#include \"CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline VariantSlot* CollectionData::addSlot(MemoryPool* pool) {\n  VariantSlot* slot = pool->allocVariant();\n  if (!slot) return 0;\n\n  if (_tail) {\n    _tail->setNextNotNull(slot);\n    _tail = slot;\n  } else {\n    _head = slot;\n    _tail = slot;\n  }\n\n  slot->clear();\n  return slot;\n}\n\ninline VariantData* CollectionData::add(MemoryPool* pool) {\n  return slotData(addSlot(pool));\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData* CollectionData::add(TAdaptedString key, MemoryPool* pool) {\n  VariantSlot* slot = addSlot(pool);\n  if (!slotSetKey(slot, key, pool)) return 0;\n  return slot->data();\n}\n\ninline void CollectionData::clear() {\n  _head = 0;\n  _tail = 0;\n}\n\ntemplate <typename TAdaptedString>\ninline bool CollectionData::containsKey(const TAdaptedString& key) const {\n  return getSlot(key) != 0;\n}\n\ninline bool CollectionData::copyFrom(const CollectionData& src,\n                                     MemoryPool* pool) {\n  clear();\n  for (VariantSlot* s = src._head; s; s = s->next()) {\n    VariantData* var;\n    if (s->key() != 0) {\n      if (s->ownsKey())\n        var = add(RamStringAdapter(s->key()), pool);\n      else\n        var = add(ConstRamStringAdapter(s->key()), pool);\n    } else {\n      var = add(pool);\n    }\n    if (!var) return false;\n    if (!var->copyFrom(*s->data(), pool)) return false;\n  }\n  return true;\n}\n\ninline bool CollectionData::equalsObject(const CollectionData& other) const {\n  size_t count = 0;\n  for (VariantSlot* slot = _head; slot; slot = slot->next()) {\n    VariantData* v1 = slot->data();\n    VariantData* v2 = other.get(adaptString(slot->key()));\n    if (!variantEquals(v1, v2)) return false;\n    count++;\n  }\n  return count == other.size();\n}\n\ninline bool CollectionData::equalsArray(const CollectionData& other) const {\n  VariantSlot* s1 = _head;\n  VariantSlot* s2 = other._head;\n  for (;;) {\n    if (s1 == s2) return true;\n    if (!s1 || !s2) return false;\n    if (!variantEquals(s1->data(), s2->data())) return false;\n    s1 = s1->next();\n    s2 = s2->next();\n  }\n}\n\ntemplate <typename TAdaptedString>\ninline VariantSlot* CollectionData::getSlot(TAdaptedString key) const {\n  VariantSlot* slot = _head;\n  while (slot) {\n    if (key.equals(slot->key())) break;\n    slot = slot->next();\n  }\n  return slot;\n}\n\ninline VariantSlot* CollectionData::getSlot(size_t index) const {\n  return _head->next(index);\n}\n\ninline VariantSlot* CollectionData::getPreviousSlot(VariantSlot* target) const {\n  VariantSlot* current = _head;\n  while (current) {\n    VariantSlot* next = current->next();\n    if (next == target) return current;\n    current = next;\n  }\n  return 0;\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData* CollectionData::get(TAdaptedString key) const {\n  VariantSlot* slot = getSlot(key);\n  return slot ? slot->data() : 0;\n}\n\ninline VariantData* CollectionData::get(size_t index) const {\n  VariantSlot* slot = getSlot(index);\n  return slot ? slot->data() : 0;\n}\n\ninline void CollectionData::remove(VariantSlot* slot) {\n  if (!slot) return;\n  VariantSlot* prev = getPreviousSlot(slot);\n  VariantSlot* next = slot->next();\n  if (prev)\n    prev->setNext(next);\n  else\n    _head = next;\n  if (!next) _tail = prev;\n}\n\ninline void CollectionData::remove(size_t index) {\n  remove(getSlot(index));\n}\n\ninline size_t CollectionData::memoryUsage() const {\n  size_t total = 0;\n  for (VariantSlot* s = _head; s; s = s->next()) {\n    total += sizeof(VariantSlot) + s->data()->memoryUsage();\n    if (s->ownsKey()) total += strlen(s->key()) + 1;\n  }\n  return total;\n}\n\ninline size_t CollectionData::nesting() const {\n  size_t maxChildNesting = 0;\n  for (VariantSlot* s = _head; s; s = s->next()) {\n    size_t childNesting = s->data()->nesting();\n    if (childNesting > maxChildNesting) maxChildNesting = childNesting;\n  }\n  return maxChildNesting + 1;\n}\n\ninline size_t CollectionData::size() const {\n  return slotSize(_head);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Configuration.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if defined(_MSC_VER)\n#define ARDUINOJSON_HAS_INT64 1\n#else\n#define ARDUINOJSON_HAS_INT64 0\n#endif\n\n#if __cplusplus >= 201103L\n#define ARDUINOJSON_HAS_LONG_LONG 1\n#else\n#define ARDUINOJSON_HAS_LONG_LONG 0\n#endif\n\n// Small or big machine?\n#ifndef ARDUINOJSON_EMBEDDED_MODE\n#if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \\\n    defined(__ARMCC_VERSION)\n#define ARDUINOJSON_EMBEDDED_MODE 1\n#else\n#define ARDUINOJSON_EMBEDDED_MODE 0\n#endif\n#endif\n\n#if ARDUINOJSON_EMBEDDED_MODE\n\n// Store floats by default to reduce the memory usage (issue #134)\n#ifndef ARDUINOJSON_USE_DOUBLE\n#define ARDUINOJSON_USE_DOUBLE 0\n#endif\n\n// Store longs by default, because they usually match the size of a float.\n#ifndef ARDUINOJSON_USE_LONG_LONG\n#define ARDUINOJSON_USE_LONG_LONG 0\n#endif\n\n// Embedded systems usually don't have std::string\n#ifndef ARDUINOJSON_ENABLE_STD_STRING\n#define ARDUINOJSON_ENABLE_STD_STRING 0\n#endif\n\n// Embedded systems usually don't have std::stream\n#ifndef ARDUINOJSON_ENABLE_STD_STREAM\n#define ARDUINOJSON_ENABLE_STD_STREAM 0\n#endif\n\n// Limit nesting as the stack is likely to be small\n#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT\n#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10\n#endif\n\n#else  // ARDUINOJSON_EMBEDDED_MODE\n\n// On a computer we have plenty of memory so we can use doubles\n#ifndef ARDUINOJSON_USE_DOUBLE\n#define ARDUINOJSON_USE_DOUBLE 1\n#endif\n\n// Use long long when available\n#ifndef ARDUINOJSON_USE_LONG_LONG\n#if ARDUINOJSON_HAS_LONG_LONG || ARDUINOJSON_HAS_INT64\n#define ARDUINOJSON_USE_LONG_LONG 1\n#else\n#define ARDUINOJSON_USE_LONG_LONG 0\n#endif\n#endif\n\n// On a computer, we can use std::string\n#ifndef ARDUINOJSON_ENABLE_STD_STRING\n#define ARDUINOJSON_ENABLE_STD_STRING 1\n#endif\n\n// On a computer, we can assume std::stream\n#ifndef ARDUINOJSON_ENABLE_STD_STREAM\n#define ARDUINOJSON_ENABLE_STD_STREAM 1\n#endif\n\n// On a computer, the stack is large so we can increase nesting limit\n#ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT\n#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50\n#endif\n\n#endif  // ARDUINOJSON_EMBEDDED_MODE\n\n#ifdef ARDUINO\n\n// Enable support for Arduino's String class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING\n#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1\n#endif\n\n// Enable support for Arduino's Stream class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM\n#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1\n#endif\n\n// Enable support for Arduino's Print class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT\n#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 1\n#endif\n\n#else  // ARDUINO\n\n// Enable support for Arduino's String class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING\n#define ARDUINOJSON_ENABLE_ARDUINO_STRING 0\n#endif\n\n// Enable support for Arduino's Stream class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM\n#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0\n#endif\n\n// Enable support for Arduino's Print class\n#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT\n#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 0\n#endif\n\n#endif  // ARDUINO\n\n#ifndef ARDUINOJSON_ENABLE_PROGMEM\n#ifdef PROGMEM\n#define ARDUINOJSON_ENABLE_PROGMEM 1\n#else\n#define ARDUINOJSON_ENABLE_PROGMEM 0\n#endif\n#endif\n\n// Convert unicode escape sequence (\\u0123) to UTF-8\n#ifndef ARDUINOJSON_DECODE_UNICODE\n#define ARDUINOJSON_DECODE_UNICODE 0\n#endif\n\n// Control the exponentiation threshold for big numbers\n// CAUTION: cannot be more that 1e9 !!!!\n#ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD\n#define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7\n#endif\n\n// Control the exponentiation threshold for small numbers\n#ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD\n#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5\n#endif\n\n#ifndef ARDUINOJSON_LITTLE_ENDIAN\n#if defined(_MSC_VER) ||                                                      \\\n    (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \\\n    defined(__LITTLE_ENDIAN__) || defined(__i386) || defined(__x86_64)\n#define ARDUINOJSON_LITTLE_ENDIAN 1\n#else\n#define ARDUINOJSON_LITTLE_ENDIAN 0\n#endif\n#endif\n\n#ifndef ARDUINOJSON_TAB\n#define ARDUINOJSON_TAB \"  \"\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/ArduinoStreamReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STREAM\n\n#include <Stream.h>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct ArduinoStreamReader {\n  Stream& _stream;\n  char _current;\n  bool _ended;\n\n public:\n  explicit ArduinoStreamReader(Stream& stream)\n      : _stream(stream), _current(0), _ended(false) {}\n\n  char read() {\n    // don't use _stream.read() as it ignores the timeout\n    char c = 0;\n    _ended = _stream.readBytes(&c, 1) == 0;\n    return c;\n  }\n\n  bool ended() const {\n    return _ended;\n  }\n};\n\ninline ArduinoStreamReader makeReader(Stream& input) {\n  return ArduinoStreamReader(input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/CharPointerReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass UnsafeCharPointerReader {\n  const char* _ptr;\n\n public:\n  explicit UnsafeCharPointerReader(const char* ptr)\n      : _ptr(ptr ? ptr : reinterpret_cast<const char*>(\"\")) {}\n\n  char read() {\n    return static_cast<char>(*_ptr++);\n  }\n\n  bool ended() const {\n    // we cannot know, that's why it's unsafe\n    return false;\n  }\n};\n\nclass SafeCharPointerReader {\n  const char* _ptr;\n  const char* _end;\n\n public:\n  explicit SafeCharPointerReader(const char* ptr, size_t len)\n      : _ptr(ptr ? ptr : reinterpret_cast<const char*>(\"\")), _end(_ptr + len) {}\n\n  char read() {\n    return static_cast<char>(*_ptr++);\n  }\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n};\n\ntemplate <typename TChar>\ninline UnsafeCharPointerReader makeReader(TChar* input) {\n  return UnsafeCharPointerReader(reinterpret_cast<const char*>(input));\n}\n\ntemplate <typename TChar>\ninline SafeCharPointerReader makeReader(TChar* input, size_t n) {\n  return SafeCharPointerReader(reinterpret_cast<const char*>(input), n);\n}\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\ninline SafeCharPointerReader makeReader(const ::String& input) {\n  return SafeCharPointerReader(input.c_str(), input.length());\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/DeserializationError.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n#include <ostream>\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass DeserializationError {\n  // safe bool idiom\n  typedef void (DeserializationError::*bool_type)() const;\n  void safeBoolHelper() const {}\n\n public:\n  enum Code {\n    Ok,\n    IncompleteInput,\n    InvalidInput,\n    NoMemory,\n    NotSupported,\n    TooDeep\n  };\n\n  DeserializationError() {}\n  DeserializationError(Code c) : _code(c) {}\n\n  // Compare with DeserializationError\n  friend bool operator==(const DeserializationError& lhs,\n                         const DeserializationError& rhs) {\n    return lhs._code == rhs._code;\n  }\n  friend bool operator!=(const DeserializationError& lhs,\n                         const DeserializationError& rhs) {\n    return lhs._code != rhs._code;\n  }\n\n  // Compare with Code\n  friend bool operator==(const DeserializationError& lhs, Code rhs) {\n    return lhs._code == rhs;\n  }\n  friend bool operator==(Code lhs, const DeserializationError& rhs) {\n    return lhs == rhs._code;\n  }\n  friend bool operator!=(const DeserializationError& lhs, Code rhs) {\n    return lhs._code != rhs;\n  }\n  friend bool operator!=(Code lhs, const DeserializationError& rhs) {\n    return lhs != rhs._code;\n  }\n\n  // Behaves like a bool\n  operator bool_type() const {\n    return _code != Ok ? &DeserializationError::safeBoolHelper : 0;\n  }\n  friend bool operator==(bool value, const DeserializationError& err) {\n    return static_cast<bool>(err) == value;\n  }\n  friend bool operator==(const DeserializationError& err, bool value) {\n    return static_cast<bool>(err) == value;\n  }\n  friend bool operator!=(bool value, const DeserializationError& err) {\n    return static_cast<bool>(err) != value;\n  }\n  friend bool operator!=(const DeserializationError& err, bool value) {\n    return static_cast<bool>(err) != value;\n  }\n\n  // Returns internal enum, useful for switch statement\n  Code code() const {\n    return _code;\n  }\n\n  const char* c_str() const {\n    switch (_code) {\n      case Ok:\n        return \"Ok\";\n      case TooDeep:\n        return \"TooDeep\";\n      case NoMemory:\n        return \"NoMemory\";\n      case InvalidInput:\n        return \"InvalidInput\";\n      case IncompleteInput:\n        return \"IncompleteInput\";\n      case NotSupported:\n        return \"NotSupported\";\n      default:\n        return \"???\";\n    }\n  }\n\n private:\n  Code _code;\n};\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ninline std::ostream& operator<<(std::ostream& s,\n                                const DeserializationError& e) {\n  s << e.c_str();\n  return s;\n}\n\ninline std::ostream& operator<<(std::ostream& s, DeserializationError::Code c) {\n  s << DeserializationError(c).c_str();\n  return s;\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/FlashStringReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_PROGMEM\n\nnamespace ARDUINOJSON_NAMESPACE {\nclass UnsafeFlashStringReader {\n  const char* _ptr;\n\n public:\n  explicit UnsafeFlashStringReader(const __FlashStringHelper* ptr)\n      : _ptr(reinterpret_cast<const char*>(ptr)) {}\n\n  char read() {\n    return pgm_read_byte_near(_ptr++);\n  }\n\n  bool ended() const {\n    // this reader cannot detect the end\n    return false;\n  }\n};\n\nclass SafeFlashStringReader {\n  const char* _ptr;\n  const char* _end;\n\n public:\n  explicit SafeFlashStringReader(const __FlashStringHelper* ptr, size_t size)\n      : _ptr(reinterpret_cast<const char*>(ptr)), _end(_ptr + size) {}\n\n  char read() {\n    return pgm_read_byte_near(_ptr++);\n  }\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n};\n\ninline UnsafeFlashStringReader makeReader(const __FlashStringHelper* input) {\n  return UnsafeFlashStringReader(input);\n}\n\ninline SafeFlashStringReader makeReader(const __FlashStringHelper* input,\n                                        size_t size) {\n  return SafeFlashStringReader(input, size);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/IteratorReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TIterator>\nclass IteratorReader {\n  TIterator _ptr, _end;\n\n public:\n  explicit IteratorReader(TIterator begin, TIterator end)\n      : _ptr(begin), _end(end) {}\n\n  bool ended() const {\n    return _ptr == _end;\n  }\n\n  char read() {\n    return char(*_ptr++);\n  }\n};\n\ntemplate <typename TInput>\ninline IteratorReader<typename TInput::const_iterator> makeReader(\n    const TInput& input) {\n  return IteratorReader<typename TInput::const_iterator>(input.begin(),\n                                                         input.end());\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/NestingLimit.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct NestingLimit {\n  NestingLimit() : value(ARDUINOJSON_DEFAULT_NESTING_LIMIT) {}\n  explicit NestingLimit(uint8_t n) : value(n) {}\n\n  uint8_t value;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/StdStreamReader.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n\n#include <istream>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StdStreamReader {\n  std::istream& _stream;\n  char _current;\n\n public:\n  explicit StdStreamReader(std::istream& stream)\n      : _stream(stream), _current(0) {}\n\n  bool ended() const {\n    return _stream.eof();\n  }\n\n  char read() {\n    return static_cast<char>(_stream.get());\n  }\n\n private:\n  StdStreamReader& operator=(const StdStreamReader&);  // Visual Studio C4512\n};\n\ninline StdStreamReader makeReader(std::istream& input) {\n  return StdStreamReader(input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Deserialization/deserialize.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../StringStorage/StringStorage.hpp\"\n#include \"ArduinoStreamReader.hpp\"\n#include \"CharPointerReader.hpp\"\n#include \"DeserializationError.hpp\"\n#include \"FlashStringReader.hpp\"\n#include \"IteratorReader.hpp\"\n#include \"NestingLimit.hpp\"\n#include \"StdStreamReader.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename, typename> class TDeserializer, typename TReader,\n          typename TWriter>\nTDeserializer<TReader, TWriter> makeDeserializer(MemoryPool &pool,\n                                                 TReader reader, TWriter writer,\n                                                 uint8_t nestingLimit) {\n  return TDeserializer<TReader, TWriter>(pool, reader, writer, nestingLimit);\n}\n\n// deserialize(JsonDocument&, const std::string&);\n// deserialize(JsonDocument&, const String&);\ntemplate <template <typename, typename> class TDeserializer, typename TString>\ntypename enable_if<!is_array<TString>::value, DeserializationError>::type\ndeserialize(JsonDocument &doc, const TString &input,\n            NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, char*);\n// deserialize(JsonDocument&, const char*);\n// deserialize(JsonDocument&, const __FlashStringHelper*);\ntemplate <template <typename, typename> class TDeserializer, typename TChar>\nDeserializationError deserialize(JsonDocument &doc, TChar *input,\n                                 NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, char*, size_t);\n// deserialize(JsonDocument&, const char*, size_t);\n// deserialize(JsonDocument&, const __FlashStringHelper*, size_t);\ntemplate <template <typename, typename> class TDeserializer, typename TChar>\nDeserializationError deserialize(JsonDocument &doc, TChar *input,\n                                 size_t inputSize, NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input, inputSize),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n//\n// deserialize(JsonDocument&, std::istream&);\n// deserialize(JsonDocument&, Stream&);\ntemplate <template <typename, typename> class TDeserializer, typename TStream>\nDeserializationError deserialize(JsonDocument &doc, TStream &input,\n                                 NestingLimit nestingLimit) {\n  doc.clear();\n  return makeDeserializer<TDeserializer>(\n             doc.memoryPool(), makeReader(input),\n             makeStringStorage(doc.memoryPool(), input), nestingLimit.value)\n      .parse(doc.data());\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Document/BasicJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"JsonDocument.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TAllocator>\nclass AllocatorOwner {\n protected:\n  AllocatorOwner() {}\n  AllocatorOwner(const AllocatorOwner& src) : _allocator(src._allocator) {}\n  AllocatorOwner(TAllocator allocator) : _allocator(allocator) {}\n\n  void* allocate(size_t n) {\n    return _allocator.allocate(n);\n  }\n\n  void deallocate(void* p) {\n    _allocator.deallocate(p);\n  }\n\n private:\n  TAllocator _allocator;\n};\n\ntemplate <typename TAllocator>\nclass BasicJsonDocument : AllocatorOwner<TAllocator>, public JsonDocument {\n public:\n  explicit BasicJsonDocument(size_t capa, TAllocator allocator = TAllocator())\n      : AllocatorOwner<TAllocator>(allocator), JsonDocument(allocPool(capa)) {}\n\n  BasicJsonDocument(const BasicJsonDocument& src)\n      : AllocatorOwner<TAllocator>(src),\n        JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  template <typename T>\n  BasicJsonDocument(const T& src,\n                    typename enable_if<IsVisitable<T>::value>::type* = 0)\n      : JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  // disambiguate\n  BasicJsonDocument(VariantRef src)\n      : JsonDocument(allocPool(src.memoryUsage())) {\n    set(src);\n  }\n\n  ~BasicJsonDocument() {\n    freePool();\n  }\n\n  BasicJsonDocument& operator=(const BasicJsonDocument& src) {\n    reallocPoolIfTooSmall(src.memoryUsage());\n    set(src);\n    return *this;\n  }\n\n  template <typename T>\n  BasicJsonDocument& operator=(const T& src) {\n    reallocPoolIfTooSmall(src.memoryUsage());\n    set(src);\n    return *this;\n  }\n\n private:\n  MemoryPool allocPool(size_t requiredSize) {\n    size_t capa = addPadding(requiredSize);\n    return MemoryPool(reinterpret_cast<char*>(this->allocate(capa)), capa);\n  }\n\n  void reallocPoolIfTooSmall(size_t requiredSize) {\n    if (requiredSize <= capacity()) return;\n    freePool();\n    replacePool(allocPool(addPadding(requiredSize)));\n  }\n\n  void freePool() {\n    this->deallocate(memoryPool().buffer());\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Document/DynamicJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"BasicJsonDocument.hpp\"\n\n#include <stdlib.h>  // malloc, free\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct DefaultAllocator {\n  void* allocate(size_t n) {\n    return malloc(n);\n  }\n\n  void deallocate(void* p) {\n    free(p);\n  }\n};\n\ntypedef BasicJsonDocument<DefaultAllocator> DynamicJsonDocument;\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Document/JsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Object/ObjectRef.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n#include \"../Variant/VariantTo.hpp\"\n\n#include \"../Array/ElementProxy.hpp\"\n#include \"../Object/MemberProxy.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass JsonDocument : public Visitable {\n public:\n  template <typename Visitor>\n  void accept(Visitor& visitor) const {\n    return getVariant().accept(visitor);\n  }\n\n  template <typename T>\n  typename VariantAs<T>::type as() {\n    return getVariant().template as<T>();\n  }\n\n  template <typename T>\n  typename VariantConstAs<T>::type as() const {\n    return getVariant().template as<T>();\n  }\n\n  void clear() {\n    _pool.clear();\n    _data.setNull();\n  }\n\n  template <typename T>\n  bool is() const {\n    return getVariant().template is<T>();\n  }\n\n  bool isNull() const {\n    return getVariant().isNull();\n  }\n\n  size_t memoryUsage() const {\n    return _pool.size();\n  }\n\n  size_t nesting() const {\n    return _data.nesting();\n  }\n\n  size_t capacity() const {\n    return _pool.capacity();\n  }\n\n  size_t size() const {\n    return _data.size();\n  }\n\n  bool set(const JsonDocument& src) {\n    return to<VariantRef>().set(src.as<VariantRef>());\n  }\n\n  template <typename T>\n  typename enable_if<!is_base_of<JsonDocument, T>::value, bool>::type set(\n      const T& src) {\n    return to<VariantRef>().set(src);\n  }\n\n  template <typename T>\n  typename VariantTo<T>::type to() {\n    clear();\n    return getVariant().template to<T>();\n  }\n\n  // for internal use only\n  MemoryPool& memoryPool() {\n    return _pool;\n  }\n\n  VariantData& data() {\n    return _data;\n  }\n\n  ArrayRef createNestedArray() {\n    return addElement().to<ArrayRef>();\n  }\n\n  // createNestedArray(char*)\n  // createNestedArray(const char*)\n  // createNestedArray(const __FlashStringHelper*)\n  template <typename TChar>\n  ArrayRef createNestedArray(TChar* key) {\n    return getOrAddMember(key).template to<ArrayRef>();\n  }\n\n  // createNestedArray(const std::string&)\n  // createNestedArray(const String&)\n  template <typename TString>\n  ArrayRef createNestedArray(const TString& key) {\n    return getOrAddMember(key).template to<ArrayRef>();\n  }\n\n  ObjectRef createNestedObject() {\n    return addElement().to<ObjectRef>();\n  }\n\n  // createNestedObject(char*)\n  // createNestedObject(const char*)\n  // createNestedObject(const __FlashStringHelper*)\n  template <typename TChar>\n  ObjectRef createNestedObject(TChar* key) {\n    return getOrAddMember(key).template to<ObjectRef>();\n  }\n\n  // createNestedObject(const std::string&)\n  // createNestedObject(const String&)\n  template <typename TString>\n  ObjectRef createNestedObject(const TString& key) {\n    return getOrAddMember(key).template to<ObjectRef>();\n  }\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  bool containsKey(TChar* key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  bool containsKey(const TString& key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // operator[](const std::string&)\n  // operator[](const String&)\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value,\n                         MemberProxy<JsonDocument&, const TString&> >::type\n      operator[](const TString& key) {\n    return MemberProxy<JsonDocument&, const TString&>(*this, key);\n  }\n\n  // operator[](char*)\n  // operator[](const char*)\n  // operator[](const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value,\n                                  MemberProxy<JsonDocument&, TChar*> >::type\n  operator[](TChar* key) {\n    return MemberProxy<JsonDocument&, TChar*>(*this, key);\n  }\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString& key) const {\n    return getMember(key);\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar*>::value, VariantConstRef>::type\n      operator[](TChar* key) const {\n    return getMember(key);\n  }\n\n  FORCE_INLINE ElementProxy<JsonDocument&> operator[](size_t index) {\n    return ElementProxy<JsonDocument&>(*this, index);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const {\n    return getElement(index);\n  }\n\n  FORCE_INLINE VariantRef getElement(size_t index) {\n    return VariantRef(&_pool, _data.getElement(index));\n  }\n\n  FORCE_INLINE VariantConstRef getElement(size_t index) const {\n    return VariantConstRef(_data.getElement(index));\n  }\n\n  // JsonVariantConst getMember(char*) const\n  // JsonVariantConst getMember(const char*) const\n  // JsonVariantConst getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantConstRef getMember(TChar* key) const {\n    return VariantConstRef(_data.getMember(adaptString(key)));\n  }\n\n  // JsonVariantConst getMember(const std::string&) const\n  // JsonVariantConst getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      getMember(const TString& key) const {\n    return VariantConstRef(_data.getMember(adaptString(key)));\n  }\n\n  // JsonVariant getMember(char*)\n  // JsonVariant getMember(const char*)\n  // JsonVariant getMember(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar* key) {\n    return VariantRef(&_pool, _data.getMember(adaptString(key)));\n  }\n\n  // JsonVariant getMember(const std::string&)\n  // JsonVariant getMember(const String&)\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type\n  getMember(const TString& key) {\n    return VariantRef(&_pool, _data.getMember(adaptString(key)));\n  }\n\n  // getOrAddMember(char*)\n  // getOrAddMember(const char*)\n  // getOrAddMember(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar* key) {\n    return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));\n  }\n\n  // getOrAddMember(const std::string&)\n  // getOrAddMember(const String&)\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString& key) {\n    return VariantRef(&_pool, _data.getOrAddMember(adaptString(key), &_pool));\n  }\n\n  FORCE_INLINE VariantRef addElement() {\n    return VariantRef(&_pool, _data.addElement(&_pool));\n  }\n\n  template <typename TValue>\n  FORCE_INLINE bool add(const TValue& value) {\n    return addElement().set(value);\n  }\n\n  // add(char*) const\n  // add(const char*) const\n  // add(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool add(TChar* value) {\n    return addElement().set(value);\n  }\n\n  FORCE_INLINE void remove(size_t index) {\n    _data.remove(index);\n  }\n  // remove(char*)\n  // remove(const char*)\n  // remove(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar*>::value>::type remove(\n      TChar* key) {\n    _data.remove(adaptString(key));\n  }\n  // remove(const std::string&)\n  // remove(const String&)\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString& key) {\n    _data.remove(adaptString(key));\n  }\n\n protected:\n  JsonDocument(MemoryPool pool) : _pool(pool) {\n    _data.setNull();\n  }\n\n  JsonDocument(char* buf, size_t capa) : _pool(buf, capa) {\n    _data.setNull();\n  }\n\n  void replacePool(MemoryPool pool) {\n    _pool = pool;\n  }\n\n private:\n  VariantRef getVariant() {\n    return VariantRef(&_pool, &_data);\n  }\n\n  VariantConstRef getVariant() const {\n    return VariantConstRef(&_data);\n  }\n\n  MemoryPool _pool;\n  VariantData _data;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Document/StaticJsonDocument.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"JsonDocument.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <size_t desiredCapacity>\nclass StaticJsonDocument : public JsonDocument {\n  static const size_t _capacity =\n      AddPadding<Max<1, desiredCapacity>::value>::value;\n\n public:\n  StaticJsonDocument() : JsonDocument(_buffer, _capacity) {}\n\n  StaticJsonDocument(const StaticJsonDocument& src)\n      : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  template <typename T>\n  StaticJsonDocument(const T& src,\n                     typename enable_if<IsVisitable<T>::value>::type* = 0)\n      : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  // disambiguate\n  StaticJsonDocument(VariantRef src) : JsonDocument(_buffer, _capacity) {\n    set(src);\n  }\n\n  StaticJsonDocument operator=(const StaticJsonDocument& src) {\n    set(src);\n    return *this;\n  }\n\n  template <typename T>\n  StaticJsonDocument operator=(const T& src) {\n    set(src);\n    return *this;\n  }\n\n private:\n  char _buffer[_capacity];\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/EscapeSequence.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass EscapeSequence {\n public:\n  // Optimized for code size on a 8-bit AVR\n  static char escapeChar(char c) {\n    const char *p = escapeTable(false);\n    while (p[0] && p[1] != c) {\n      p += 2;\n    }\n    return p[0];\n  }\n\n  // Optimized for code size on a 8-bit AVR\n  static char unescapeChar(char c) {\n    const char *p = escapeTable(true);\n    for (;;) {\n      if (p[0] == '\\0') return c;\n      if (p[0] == c) return p[1];\n      p += 2;\n    }\n  }\n\n private:\n  static const char *escapeTable(bool excludeIdenticals) {\n    return &\"\\\"\\\"\\\\\\\\b\\bf\\fn\\nr\\rt\\t\"[excludeIdenticals ? 4 : 0];\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/JsonDeserializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Deserialization/deserialize.hpp\"\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Numbers/parseNumber.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"EscapeSequence.hpp\"\n#include \"Utf8.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TReader, typename TStringStorage>\nclass JsonDeserializer {\n  typedef typename remove_reference<TStringStorage>::type::StringBuilder\n      StringBuilder;\n\n public:\n  JsonDeserializer(MemoryPool &pool, TReader reader,\n                   TStringStorage stringStorage, uint8_t nestingLimit)\n      : _pool(&pool),\n        _reader(reader),\n        _stringStorage(stringStorage),\n        _nestingLimit(nestingLimit),\n        _loaded(false) {}\n  DeserializationError parse(VariantData &variant) {\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    switch (current()) {\n      case '[':\n        return parseArray(variant.toArray());\n\n      case '{':\n        return parseObject(variant.toObject());\n\n      default:\n        return parseValue(variant);\n    }\n  }\n\n private:\n  JsonDeserializer &operator=(const JsonDeserializer &);  // non-copiable\n\n  char current() {\n    if (!_loaded) {\n      if (_reader.ended())\n        _current = 0;\n      else\n        _current = _reader.read();\n      _loaded = true;\n    }\n    return _current;\n  }\n\n  void move() {\n    _loaded = false;\n  }\n\n  FORCE_INLINE bool eat(char charToSkip) {\n    if (current() != charToSkip) return false;\n    move();\n    return true;\n  }\n\n  DeserializationError parseArray(CollectionData &array) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n\n    // Check opening braket\n    if (!eat('[')) return DeserializationError::InvalidInput;\n\n    // Skip spaces\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    // Empty array?\n    if (eat(']')) return DeserializationError::Ok;\n\n    // Read each value\n    for (;;) {\n      // Allocate slot in array\n      VariantData *value = array.add(_pool);\n      if (!value) return DeserializationError::NoMemory;\n\n      // 1 - Parse value\n      _nestingLimit--;\n      err = parse(*value);\n      _nestingLimit++;\n      if (err) return err;\n\n      // 2 - Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n\n      // 3 - More values?\n      if (eat(']')) return DeserializationError::Ok;\n      if (!eat(',')) return DeserializationError::InvalidInput;\n    }\n  }\n\n  DeserializationError parseObject(CollectionData &object) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n\n    // Check opening brace\n    if (!eat('{')) return DeserializationError::InvalidInput;\n\n    // Skip spaces\n    DeserializationError err = skipSpacesAndComments();\n    if (err) return err;\n\n    // Empty object?\n    if (eat('}')) return DeserializationError::Ok;\n\n    // Read each key value pair\n    for (;;) {\n      // Allocate slot in object\n      VariantSlot *slot = object.addSlot(_pool);\n      if (!slot) return DeserializationError::NoMemory;\n\n      // Parse key\n      const char *key;\n      err = parseKey(key);\n      if (err) return err;\n      slot->setOwnedKey(make_not_null(key));\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;  // Colon\n      if (!eat(':')) return DeserializationError::InvalidInput;\n\n      // Parse value\n      _nestingLimit--;\n      err = parse(*slot->data());\n      _nestingLimit++;\n      if (err) return err;\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n\n      // More keys/values?\n      if (eat('}')) return DeserializationError::Ok;\n      if (!eat(',')) return DeserializationError::InvalidInput;\n\n      // Skip spaces\n      err = skipSpacesAndComments();\n      if (err) return err;\n    }\n  }\n\n  DeserializationError parseValue(VariantData &variant) {\n    if (isQuote(current())) {\n      return parseStringValue(variant);\n    } else {\n      return parseNumericValue(variant);\n    }\n  }\n\n  DeserializationError parseKey(const char *&key) {\n    if (isQuote(current())) {\n      return parseQuotedString(key);\n    } else {\n      return parseNonQuotedString(key);\n    }\n  }\n\n  DeserializationError parseStringValue(VariantData &variant) {\n    const char *value;\n    DeserializationError err = parseQuotedString(value);\n    if (err) return err;\n    variant.setOwnedString(make_not_null(value));\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseQuotedString(const char *&result) {\n    StringBuilder builder = _stringStorage.startString();\n    const char stopChar = current();\n\n    move();\n    for (;;) {\n      char c = current();\n      move();\n      if (c == stopChar) break;\n\n      if (c == '\\0') return DeserializationError::IncompleteInput;\n\n      if (c == '\\\\') {\n        c = current();\n        if (c == '\\0') return DeserializationError::IncompleteInput;\n        if (c == 'u') {\n#if ARDUINOJSON_DECODE_UNICODE\n          uint16_t codepoint;\n          move();\n          DeserializationError err = parseCodepoint(codepoint);\n          if (err) return err;\n          Utf8::encodeCodepoint(codepoint, builder);\n          continue;\n#else\n          return DeserializationError::NotSupported;\n#endif\n        }\n        // replace char\n        c = EscapeSequence::unescapeChar(c);\n        if (c == '\\0') return DeserializationError::InvalidInput;\n        move();\n      }\n\n      builder.append(c);\n    }\n\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseNonQuotedString(const char *&result) {\n    StringBuilder builder = _stringStorage.startString();\n\n    char c = current();\n    if (c == '\\0') return DeserializationError::IncompleteInput;\n\n    if (canBeInNonQuotedString(c)) {  // no quotes\n      do {\n        move();\n        builder.append(c);\n        c = current();\n      } while (canBeInNonQuotedString(c));\n    } else {\n      return DeserializationError::InvalidInput;\n    }\n\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseNumericValue(VariantData &result) {\n    char buffer[64];\n    uint8_t n = 0;\n\n    char c = current();\n    while (canBeInNonQuotedString(c) && n < 63) {\n      move();\n      buffer[n++] = c;\n      c = current();\n    }\n    buffer[n] = 0;\n\n    c = buffer[0];\n    if (c == 't') {  // true\n      result.setBoolean(true);\n      return n == 4 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n    if (c == 'f') {  // false\n      result.setBoolean(false);\n      return n == 5 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n    if (c == 'n') {  // null\n      // the variant is already null\n      return n == 4 ? DeserializationError::Ok\n                    : DeserializationError::IncompleteInput;\n    }\n\n    ParsedNumber<Float, UInt> num = parseNumber<Float, UInt>(buffer);\n\n    switch (num.type()) {\n      case VALUE_IS_NEGATIVE_INTEGER:\n        result.setNegativeInteger(num.uintValue);\n        return DeserializationError::Ok;\n\n      case VALUE_IS_POSITIVE_INTEGER:\n        result.setPositiveInteger(num.uintValue);\n        return DeserializationError::Ok;\n\n      case VALUE_IS_FLOAT:\n        result.setFloat(num.floatValue);\n        return DeserializationError::Ok;\n    }\n\n    return DeserializationError::InvalidInput;\n  }\n\n  DeserializationError parseCodepoint(uint16_t &codepoint) {\n    codepoint = 0;\n    for (uint8_t i = 0; i < 4; ++i) {\n      char digit = current();\n      if (!digit) return DeserializationError::IncompleteInput;\n      uint8_t value = decodeHex(digit);\n      if (value > 0x0F) return DeserializationError::InvalidInput;\n      codepoint = uint16_t((codepoint << 4) | value);\n      move();\n    }\n    return DeserializationError::Ok;\n  }\n\n  static inline bool isBetween(char c, char min, char max) {\n    return min <= c && c <= max;\n  }\n\n  static inline bool canBeInNonQuotedString(char c) {\n    return isBetween(c, '0', '9') || isBetween(c, '_', 'z') ||\n           isBetween(c, 'A', 'Z') || c == '+' || c == '-' || c == '.';\n  }\n\n  static inline bool isQuote(char c) {\n    return c == '\\'' || c == '\\\"';\n  }\n\n  static inline uint8_t decodeHex(char c) {\n    if (c < 'A') return uint8_t(c - '0');\n    c = char(c & ~0x20);  // uppercase\n    return uint8_t(c - 'A' + 10);\n  }\n\n  DeserializationError skipSpacesAndComments() {\n    for (;;) {\n      switch (current()) {\n        // end of string\n        case '\\0':\n          return DeserializationError::IncompleteInput;\n\n        // spaces\n        case ' ':\n        case '\\t':\n        case '\\r':\n        case '\\n':\n          move();\n          continue;\n\n        // comments\n        case '/':\n          move();  // skip '/'\n          switch (current()) {\n            // block comment\n            case '*': {\n              move();  // skip '*'\n              bool wasStar = false;\n              for (;;) {\n                char c = current();\n                if (c == '\\0') return DeserializationError::IncompleteInput;\n                if (c == '/' && wasStar) {\n                  move();\n                  break;\n                }\n                wasStar = c == '*';\n                move();\n              }\n              break;\n            }\n\n            // trailing comment\n            case '/':\n              // no need to skip \"//\"\n              for (;;) {\n                move();\n                char c = current();\n                if (c == '\\0') return DeserializationError::IncompleteInput;\n                if (c == '\\n') break;\n              }\n              break;\n\n            // not a comment, just a '/'\n            default:\n              return DeserializationError::InvalidInput;\n          }\n          break;\n\n        default:\n          return DeserializationError::Ok;\n      }\n    }\n  }\n\n  MemoryPool *_pool;\n  TReader _reader;\n  TStringStorage _stringStorage;\n  uint8_t _nestingLimit;\n  char _current;\n  bool _loaded;\n};\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, const TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput *input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput *input, size_t inputSize,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, inputSize, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeJson(\n    JsonDocument &doc, TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<JsonDeserializer>(doc, input, nestingLimit);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/JsonSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Misc/Visitable.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"TextFormatter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass JsonSerializer {\n public:\n  JsonSerializer(TWriter &writer) : _formatter(writer) {}\n\n  FORCE_INLINE void visitArray(const CollectionData &array) {\n    write('[');\n\n    VariantSlot *slot = array.head();\n\n    while (slot != 0) {\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      if (slot == 0) break;\n\n      write(',');\n    }\n\n    write(']');\n  }\n\n  void visitObject(const CollectionData &object) {\n    write('{');\n\n    VariantSlot *slot = object.head();\n\n    while (slot != 0) {\n      _formatter.writeString(slot->key());\n      write(':');\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      if (slot == 0) break;\n\n      write(',');\n    }\n\n    write('}');\n  }\n\n  void visitFloat(Float value) {\n    _formatter.writeFloat(value);\n  }\n\n  void visitString(const char *value) {\n    _formatter.writeString(value);\n  }\n\n  void visitRawJson(const char *data, size_t n) {\n    _formatter.writeRaw(data, n);\n  }\n\n  void visitNegativeInteger(UInt value) {\n    _formatter.writeNegativeInteger(value);\n  }\n\n  void visitPositiveInteger(UInt value) {\n    _formatter.writePositiveInteger(value);\n  }\n\n  void visitBoolean(bool value) {\n    _formatter.writeBoolean(value);\n  }\n\n  void visitNull() {\n    _formatter.writeRaw(\"null\");\n  }\n\n  size_t bytesWritten() const {\n    return _formatter.bytesWritten();\n  }\n\n protected:\n  void write(char c) {\n    _formatter.writeRaw(c);\n  }\n\n  void write(const char *s) {\n    _formatter.writeRaw(s);\n  }\n\n private:\n  TextFormatter<TWriter> _formatter;\n};\n\ntemplate <typename TSource, typename TDestination>\nsize_t serializeJson(const TSource &source, TDestination &destination) {\n  return serialize<JsonSerializer>(source, destination);\n}\n\ntemplate <typename TSource>\nsize_t serializeJson(const TSource &source, char *buffer, size_t bufferSize) {\n  return serialize<JsonSerializer>(source, buffer, bufferSize);\n}\n\ntemplate <typename TSource>\nsize_t measureJson(const TSource &source) {\n  return measure<JsonSerializer>(source);\n}\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ntemplate <typename T>\ninline typename enable_if<IsVisitable<T>::value, std::ostream &>::type\noperator<<(std::ostream &os, const T &source) {\n  serializeJson(source, os);\n  return os;\n}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/PrettyJsonSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"JsonSerializer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass PrettyJsonSerializer : public JsonSerializer<TWriter> {\n  typedef JsonSerializer<TWriter> base;\n\n public:\n  PrettyJsonSerializer(TWriter &writer) : base(writer), _nesting(0) {}\n\n  void visitArray(const CollectionData &array) {\n    VariantSlot *slot = array.head();\n    if (!slot) return base::write(\"[]\");\n\n    base::write(\"[\\r\\n\");\n    _nesting++;\n    while (slot != 0) {\n      indent();\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      base::write(slot ? \",\\r\\n\" : \"\\r\\n\");\n    }\n    _nesting--;\n    indent();\n    base::write(\"]\");\n  }\n\n  void visitObject(const CollectionData &object) {\n    VariantSlot *slot = object.head();\n    if (!slot) return base::write(\"{}\");\n\n    base::write(\"{\\r\\n\");\n    _nesting++;\n    while (slot != 0) {\n      indent();\n      base::visitString(slot->key());\n      base::write(\": \");\n      slot->data()->accept(*this);\n\n      slot = slot->next();\n      base::write(slot ? \",\\r\\n\" : \"\\r\\n\");\n    }\n    _nesting--;\n    indent();\n    base::write(\"}\");\n  }\n\n private:\n  void indent() {\n    for (uint8_t i = 0; i < _nesting; i++) base::write(ARDUINOJSON_TAB);\n  }\n\n  uint8_t _nesting;\n};\n\ntemplate <typename TSource, typename TDestination>\nsize_t serializeJsonPretty(const TSource &source, TDestination &destination) {\n  return serialize<PrettyJsonSerializer>(source, destination);\n}\n\ntemplate <typename TSource>\nsize_t serializeJsonPretty(const TSource &source, char *buffer,\n                           size_t bufferSize) {\n  return serialize<PrettyJsonSerializer>(source, buffer, bufferSize);\n}\n\ntemplate <typename TSource>\nsize_t measureJsonPretty(const TSource &source) {\n  return measure<PrettyJsonSerializer>(source);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/TextFormatter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stdint.h>\n#include <string.h>  // for strlen\n#include \"../Numbers/FloatParts.hpp\"\n#include \"../Numbers/Integer.hpp\"\n#include \"../Polyfills/attributes.hpp\"\n#include \"EscapeSequence.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass TextFormatter {\n public:\n  explicit TextFormatter(TWriter &writer) : _writer(writer), _length(0) {}\n\n  // Returns the number of bytes sent to the TWriter implementation.\n  size_t bytesWritten() const {\n    return _length;\n  }\n\n  void writeBoolean(bool value) {\n    if (value)\n      writeRaw(\"true\");\n    else\n      writeRaw(\"false\");\n  }\n\n  void writeString(const char *value) {\n    if (!value) {\n      writeRaw(\"null\");\n    } else {\n      writeRaw('\\\"');\n      while (*value) writeChar(*value++);\n      writeRaw('\\\"');\n    }\n  }\n\n  void writeChar(char c) {\n    char specialChar = EscapeSequence::escapeChar(c);\n    if (specialChar) {\n      writeRaw('\\\\');\n      writeRaw(specialChar);\n    } else {\n      writeRaw(c);\n    }\n  }\n\n  template <typename T>\n  void writeFloat(T value) {\n    if (isnan(value)) return writeRaw(\"NaN\");\n\n    if (value < 0.0) {\n      writeRaw('-');\n      value = -value;\n    }\n\n    if (isinf(value)) return writeRaw(\"Infinity\");\n\n    FloatParts<T> parts(value);\n\n    writePositiveInteger(parts.integral);\n    if (parts.decimalPlaces) writeDecimals(parts.decimal, parts.decimalPlaces);\n\n    if (parts.exponent < 0) {\n      writeRaw(\"e-\");\n      writePositiveInteger(-parts.exponent);\n    }\n\n    if (parts.exponent > 0) {\n      writeRaw('e');\n      writePositiveInteger(parts.exponent);\n    }\n  }\n\n  void writeNegativeInteger(UInt value) {\n    writeRaw('-');\n    writePositiveInteger(value);\n  }\n\n  template <typename T>\n  void writePositiveInteger(T value) {\n    char buffer[22];\n    char *end = buffer + sizeof(buffer);\n    char *begin = end;\n\n    // write the string in reverse order\n    do {\n      *--begin = char(value % 10 + '0');\n      value = T(value / 10);\n    } while (value);\n\n    // and dump it in the right order\n    writeRaw(begin, end);\n  }\n\n  void writeDecimals(uint32_t value, int8_t width) {\n    // buffer should be big enough for all digits and the dot\n    char buffer[16];\n    char *end = buffer + sizeof(buffer);\n    char *begin = end;\n\n    // write the string in reverse order\n    while (width--) {\n      *--begin = char(value % 10 + '0');\n      value /= 10;\n    }\n    *--begin = '.';\n\n    // and dump it in the right order\n    writeRaw(begin, end);\n  }\n\n  void writeRaw(const char *s) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), strlen(s));\n  }\n\n  void writeRaw(const char *s, size_t n) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), n);\n  }\n\n  void writeRaw(const char *begin, const char *end) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(begin),\n                             static_cast<size_t>(end - begin));\n  }\n\n  template <size_t N>\n  void writeRaw(const char (&s)[N]) {\n    _length += _writer.write(reinterpret_cast<const uint8_t *>(s), N - 1);\n  }\n  void writeRaw(char c) {\n    _length += _writer.write(static_cast<uint8_t>(c));\n  }\n\n protected:\n  TWriter &_writer;\n  size_t _length;\n\n private:\n  TextFormatter &operator=(const TextFormatter &);  // cannot be assigned\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Json/Utf8.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nnamespace Utf8 {\ntemplate <typename TStringBuilder>\ninline void encodeCodepoint(uint16_t codepoint, TStringBuilder &str) {\n  if (codepoint < 0x80) {\n    str.append(char(codepoint));\n    return;\n  }\n\n  if (codepoint >= 0x00000800) {\n    str.append(char(0xe0 /*0b11100000*/ | (codepoint >> 12)));\n    str.append(char(((codepoint >> 6) & 0x3f /*0b00111111*/) | 0x80));\n  } else {\n    str.append(char(0xc0 /*0b11000000*/ | (codepoint >> 6)));\n  }\n  str.append(char((codepoint & 0x3f /*0b00111111*/) | 0x80));\n}\n}  // namespace Utf8\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Memory/Alignment.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline bool isAligned(void *ptr) {\n  const size_t mask = sizeof(void *) - 1;\n  size_t addr = reinterpret_cast<size_t>(ptr);\n  return (addr & mask) == 0;\n}\n\ninline size_t addPadding(size_t bytes) {\n  const size_t mask = sizeof(void *) - 1;\n  return (bytes + mask) & ~mask;\n}\n\ntemplate <size_t bytes>\nstruct AddPadding {\n  static const size_t mask = sizeof(void *) - 1;\n  static const size_t value = (bytes + mask) & ~mask;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Memory/MemoryPool.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/assert.hpp\"\n#include \"../Polyfills/mpl/max.hpp\"\n#include \"../Variant/VariantSlot.hpp\"\n#include \"Alignment.hpp\"\n#include \"MemoryPool.hpp\"\n#include \"StringSlot.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// _begin                                _end\n// v                                        v\n// +-------------+--------------+-----------+\n// | strings...  |   (free)     |  ...slots |\n// +-------------+--------------+-----------+\n//               ^              ^\n//             _left          _right\n\nclass MemoryPool {\n public:\n  MemoryPool(char* buf, size_t capa)\n      : _begin(buf),\n        _left(buf),\n        _right(buf ? buf + capa : 0),\n        _end(buf ? buf + capa : 0) {\n    ARDUINOJSON_ASSERT(isAligned(_begin));\n    ARDUINOJSON_ASSERT(isAligned(_right));\n    ARDUINOJSON_ASSERT(isAligned(_end));\n  }\n\n  void* buffer() {\n    return _begin;\n  }\n\n  // Gets the capacity of the memoryPool in bytes\n  size_t capacity() const {\n    return size_t(_end - _begin);\n  }\n\n  size_t size() const {\n    return size_t(_left - _begin + _end - _right);\n  }\n\n  VariantSlot* allocVariant() {\n    return allocRight<VariantSlot>();\n  }\n\n  char* allocFrozenString(size_t n) {\n    if (!canAlloc(n)) return 0;\n    char* s = _left;\n    _left += n;\n    checkInvariants();\n    return s;\n  }\n\n  StringSlot allocExpandableString() {\n    StringSlot s;\n    s.value = _left;\n    s.size = size_t(_right - _left);\n    _left = _right;\n    checkInvariants();\n    return s;\n  }\n\n  void freezeString(StringSlot& s, size_t newSize) {\n    _left -= (s.size - newSize);\n    s.size = newSize;\n    checkInvariants();\n  }\n\n  void clear() {\n    _left = _begin;\n    _right = _end;\n  }\n\n  bool canAlloc(size_t bytes) const {\n    return _left + bytes <= _right;\n  }\n\n  bool owns(void* p) const {\n    return _begin <= p && p < _end;\n  }\n\n  template <typename T>\n  T* allocRight() {\n    return reinterpret_cast<T*>(allocRight(sizeof(T)));\n  }\n\n  void* allocRight(size_t bytes) {\n    if (!canAlloc(bytes)) return 0;\n    _right -= bytes;\n    return _right;\n  }\n\n  // Workaround for missing placement new\n  void* operator new(size_t, void* p) {\n    return p;\n  }\n\n private:\n  StringSlot* allocStringSlot() {\n    return allocRight<StringSlot>();\n  }\n\n  void checkInvariants() {\n    ARDUINOJSON_ASSERT(_begin <= _left);\n    ARDUINOJSON_ASSERT(_left <= _right);\n    ARDUINOJSON_ASSERT(_right <= _end);\n    ARDUINOJSON_ASSERT(isAligned(_right));\n  }\n\n  char *_begin, *_left, *_right, *_end;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Memory/StringBuilder.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"MemoryPool.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringBuilder {\n public:\n  explicit StringBuilder(MemoryPool* parent) : _parent(parent), _size(0) {\n    _slot = _parent->allocExpandableString();\n  }\n\n  void append(const char* s) {\n    while (*s) append(*s++);\n  }\n\n  void append(const char* s, size_t n) {\n    while (n-- > 0) append(*s++);\n  }\n\n  void append(char c) {\n    if (!_slot.value) return;\n\n    if (_size >= _slot.size) {\n      _slot.value = 0;\n      return;\n    }\n\n    _slot.value[_size++] = c;\n  }\n\n  char* complete() {\n    append('\\0');\n    if (_slot.value) {\n      _parent->freezeString(_slot, _size);\n    }\n    return _slot.value;\n  }\n\n private:\n  MemoryPool* _parent;\n  size_t _size;\n  StringSlot _slot;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Memory/StringSlot.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n#include \"../Configuration.hpp\"\n\n#define JSON_STRING_SIZE(SIZE) (SIZE)\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct StringSlot {\n  char *value;\n  size_t size;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Misc/SerializedValue.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Strings/StringAdapters.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A special type of data that can be used to insert pregenerated JSON portions.\ntemplate <typename T>\nclass SerializedValue {\n public:\n  explicit SerializedValue(T str) : _str(str) {}\n  operator T() const {\n    return _str;\n  }\n\n  const char* data() const {\n    return _str.c_str();\n  }\n\n  size_t size() const {\n    // CAUTION: the old Arduino String doesn't have size()\n    return _str.length();\n  }\n\n private:\n  T _str;\n};\n\ntemplate <typename TChar>\nclass SerializedValue<TChar*> {\n public:\n  explicit SerializedValue(TChar* p, size_t n) : _data(p), _size(n) {}\n  operator TChar*() const {\n    return _data;\n  }\n\n  TChar* data() const {\n    return _data;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n private:\n  TChar* _data;\n  size_t _size;\n};\n\ntemplate <typename T>\ninline SerializedValue<T> serialized(T str) {\n  return SerializedValue<T>(str);\n}\n\ntemplate <typename TChar>\ninline SerializedValue<TChar*> serialized(TChar* p) {\n  return SerializedValue<TChar*>(p, adaptString(p).size());\n}\n\ntemplate <typename TChar>\ninline SerializedValue<TChar*> serialized(TChar* p, size_t n) {\n  return SerializedValue<TChar*>(p, n);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Misc/Visitable.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nstruct Visitable {\n  // template<Visitor>\n  // void accept(Visitor&) const;\n};\n\ntemplate <typename T>\nstruct IsVisitable : is_base_of<Visitable, T> {};\n\ntemplate <typename T>\nstruct IsVisitable<T&> : IsVisitable<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/MsgPack/MsgPackDeserializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Deserialization/deserialize.hpp\"\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"endianess.hpp\"\n#include \"ieee754.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TReader, typename TStringStorage>\nclass MsgPackDeserializer {\n  typedef typename remove_reference<TStringStorage>::type::StringBuilder\n      StringBuilder;\n\n public:\n  MsgPackDeserializer(MemoryPool &pool, TReader reader,\n                      TStringStorage stringStorage, uint8_t nestingLimit)\n      : _pool(&pool),\n        _reader(reader),\n        _stringStorage(stringStorage),\n        _nestingLimit(nestingLimit) {}\n\n  DeserializationError parse(VariantData &variant) {\n    uint8_t code;\n    if (!readByte(code)) return DeserializationError::IncompleteInput;\n\n    if ((code & 0x80) == 0) {\n      variant.setUnsignedInteger(code);\n      return DeserializationError::Ok;\n    }\n\n    if ((code & 0xe0) == 0xe0) {\n      // TODO: add setNegativeInteger()\n      variant.setSignedInteger(static_cast<int8_t>(code));\n      return DeserializationError::Ok;\n    }\n\n    if ((code & 0xe0) == 0xa0) {\n      return readString(variant, code & 0x1f);\n    }\n\n    if ((code & 0xf0) == 0x90) {\n      return readArray(variant.toArray(), code & 0x0F);\n    }\n\n    if ((code & 0xf0) == 0x80) {\n      return readObject(variant.toObject(), code & 0x0F);\n    }\n\n    switch (code) {\n      case 0xc0:\n        // already null\n        return DeserializationError::Ok;\n\n      case 0xc2:\n        variant.setBoolean(false);\n        return DeserializationError::Ok;\n\n      case 0xc3:\n        variant.setBoolean(true);\n        return DeserializationError::Ok;\n\n      case 0xcc:\n        return readInteger<uint8_t>(variant);\n\n      case 0xcd:\n        return readInteger<uint16_t>(variant);\n\n      case 0xce:\n        return readInteger<uint32_t>(variant);\n\n      case 0xcf:\n#if ARDUINOJSON_USE_LONG_LONG\n        return readInteger<uint64_t>(variant);\n#else\n        return DeserializationError::NotSupported;\n#endif\n\n      case 0xd0:\n        return readInteger<int8_t>(variant);\n\n      case 0xd1:\n        return readInteger<int16_t>(variant);\n\n      case 0xd2:\n        return readInteger<int32_t>(variant);\n\n      case 0xd3:\n#if ARDUINOJSON_USE_LONG_LONG\n        return readInteger<int64_t>(variant);\n#else\n        return DeserializationError::NotSupported;\n#endif\n\n      case 0xca:\n        return readFloat<float>(variant);\n\n      case 0xcb:\n        return readDouble<double>(variant);\n\n      case 0xd9:\n        return readString<uint8_t>(variant);\n\n      case 0xda:\n        return readString<uint16_t>(variant);\n\n      case 0xdb:\n        return readString<uint32_t>(variant);\n\n      case 0xdc:\n        return readArray<uint16_t>(variant.toArray());\n\n      case 0xdd:\n        return readArray<uint32_t>(variant.toArray());\n\n      case 0xde:\n        return readObject<uint16_t>(variant.toObject());\n\n      case 0xdf:\n        return readObject<uint32_t>(variant.toObject());\n\n      default:\n        return DeserializationError::NotSupported;\n    }\n  }\n\n private:\n  // Prevent VS warning \"assignment operator could not be generated\"\n  MsgPackDeserializer &operator=(const MsgPackDeserializer &);\n\n  bool skip(uint8_t n) {\n    while (n--) {\n      if (_reader.ended()) return false;\n      _reader.read();\n    }\n    return true;\n  }\n\n  bool readByte(uint8_t &value) {\n    if (_reader.ended()) return false;\n    value = static_cast<uint8_t>(_reader.read());\n    return true;\n  }\n\n  bool readBytes(uint8_t *p, size_t n) {\n    for (size_t i = 0; i < n; i++) {\n      if (!readByte(p[i])) return false;\n    }\n    return true;\n  }\n\n  template <typename T>\n  bool readBytes(T &value) {\n    return readBytes(reinterpret_cast<uint8_t *>(&value), sizeof(value));\n  }\n\n  template <typename T>\n  T readInteger() {\n    T value;\n    readBytes(value);\n    fixEndianess(value);\n    return value;\n  }\n\n  template <typename T>\n  bool readInteger(T &value) {\n    if (!readBytes(value)) return false;\n    fixEndianess(value);\n    return true;\n  }\n\n  template <typename T>\n  DeserializationError readInteger(VariantData &variant) {\n    T value;\n    if (!readInteger(value)) return DeserializationError::IncompleteInput;\n    variant.setInteger(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4, DeserializationError>::type readFloat(\n      VariantData &variant) {\n    T value;\n    if (!readBytes(value)) return DeserializationError::IncompleteInput;\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 8, DeserializationError>::type readDouble(\n      VariantData &variant) {\n    T value;\n    if (!readBytes(value)) return DeserializationError::IncompleteInput;\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4, DeserializationError>::type readDouble(\n      VariantData &variant) {\n    uint8_t i[8];  // input is 8 bytes\n    T value;       // output is 4 bytes\n    uint8_t *o = reinterpret_cast<uint8_t *>(&value);\n    if (!readBytes(i, 8)) return DeserializationError::IncompleteInput;\n    doubleToFloat(i, o);\n    fixEndianess(value);\n    variant.setFloat(value);\n    return DeserializationError::Ok;\n  }\n\n  template <typename T>\n  DeserializationError readString(VariantData &variant) {\n    T size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readString(variant, size);\n  }\n\n  template <typename T>\n  DeserializationError readString(const char *&str) {\n    T size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readString(str, size);\n  }\n\n  DeserializationError readString(VariantData &variant, size_t n) {\n    const char *s;\n    DeserializationError err = readString(s, n);\n    if (!err) variant.setOwnedString(make_not_null(s));\n    return err;\n  }\n\n  DeserializationError readString(const char *&result, size_t n) {\n    StringBuilder builder = _stringStorage.startString();\n    for (; n; --n) {\n      uint8_t c;\n      if (!readBytes(c)) return DeserializationError::IncompleteInput;\n      builder.append(static_cast<char>(c));\n    }\n    result = builder.complete();\n    if (!result) return DeserializationError::NoMemory;\n    return DeserializationError::Ok;\n  }\n\n  template <typename TSize>\n  DeserializationError readArray(CollectionData &array) {\n    TSize size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readArray(array, size);\n  }\n\n  DeserializationError readArray(CollectionData &array, size_t n) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n    --_nestingLimit;\n    for (; n; --n) {\n      VariantData *value = array.add(_pool);\n      if (!value) return DeserializationError::NoMemory;\n\n      DeserializationError err = parse(*value);\n      if (err) return err;\n    }\n    ++_nestingLimit;\n    return DeserializationError::Ok;\n  }\n\n  template <typename TSize>\n  DeserializationError readObject(CollectionData &object) {\n    TSize size;\n    if (!readInteger(size)) return DeserializationError::IncompleteInput;\n    return readObject(object, size);\n  }\n\n  DeserializationError readObject(CollectionData &object, size_t n) {\n    if (_nestingLimit == 0) return DeserializationError::TooDeep;\n    --_nestingLimit;\n    for (; n; --n) {\n      VariantSlot *slot = object.addSlot(_pool);\n      if (!slot) return DeserializationError::NoMemory;\n\n      const char *key;\n      DeserializationError err = parseKey(key);\n      if (err) return err;\n      slot->setOwnedKey(make_not_null(key));\n\n      err = parse(*slot->data());\n      if (err) return err;\n    }\n    ++_nestingLimit;\n    return DeserializationError::Ok;\n  }\n\n  DeserializationError parseKey(const char *&key) {\n    uint8_t code;\n    if (!readByte(code)) return DeserializationError::IncompleteInput;\n\n    if ((code & 0xe0) == 0xa0) return readString(key, code & 0x1f);\n\n    switch (code) {\n      case 0xd9:\n        return readString<uint8_t>(key);\n\n      case 0xda:\n        return readString<uint16_t>(key);\n\n      case 0xdb:\n        return readString<uint32_t>(key);\n\n      default:\n        return DeserializationError::NotSupported;\n    }\n  }\n\n  MemoryPool *_pool;\n  TReader _reader;\n  TStringStorage _stringStorage;\n  uint8_t _nestingLimit;\n};\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, const TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput *input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput *input, size_t inputSize,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, inputSize, nestingLimit);\n}\n\ntemplate <typename TInput>\nDeserializationError deserializeMsgPack(\n    JsonDocument &doc, TInput &input,\n    NestingLimit nestingLimit = NestingLimit()) {\n  return deserialize<MsgPackDeserializer>(doc, input, nestingLimit);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/MsgPack/MsgPackSerializer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Serialization/measure.hpp\"\n#include \"../Serialization/serialize.hpp\"\n#include \"../Variant/VariantData.hpp\"\n#include \"endianess.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TWriter>\nclass MsgPackSerializer {\n public:\n  MsgPackSerializer(TWriter& writer) : _writer(&writer), _bytesWritten(0) {}\n\n  template <typename T>\n  typename enable_if<sizeof(T) == 4>::type visitFloat(T value32) {\n    writeByte(0xCA);\n    writeInteger(value32);\n  }\n\n  template <typename T>\n  ARDUINOJSON_NO_SANITIZE(\"float-cast-overflow\")\n  typename enable_if<sizeof(T) == 8>::type visitFloat(T value64) {\n    float value32 = float(value64);\n    if (value32 == value64) {\n      writeByte(0xCA);\n      writeInteger(value32);\n    } else {\n      writeByte(0xCB);\n      writeInteger(value64);\n    }\n  }\n\n  void visitArray(const CollectionData& array) {\n    size_t n = array.size();\n    if (n < 0x10) {\n      writeByte(uint8_t(0x90 + array.size()));\n    } else if (n < 0x10000) {\n      writeByte(0xDC);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDD);\n      writeInteger(uint32_t(n));\n    }\n    for (VariantSlot* slot = array.head(); slot; slot = slot->next()) {\n      slot->data()->accept(*this);\n    }\n  }\n\n  void visitObject(const CollectionData& object) {\n    size_t n = object.size();\n    if (n < 0x10) {\n      writeByte(uint8_t(0x80 + n));\n    } else if (n < 0x10000) {\n      writeByte(0xDE);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDF);\n      writeInteger(uint32_t(n));\n    }\n    for (VariantSlot* slot = object.head(); slot; slot = slot->next()) {\n      visitString(slot->key());\n      slot->data()->accept(*this);\n    }\n  }\n\n  void visitString(const char* value) {\n    if (!value) return writeByte(0xC0);  // nil\n\n    size_t n = strlen(value);\n\n    if (n < 0x20) {\n      writeByte(uint8_t(0xA0 + n));\n    } else if (n < 0x100) {\n      writeByte(0xD9);\n      writeInteger(uint8_t(n));\n    } else if (n < 0x10000) {\n      writeByte(0xDA);\n      writeInteger(uint16_t(n));\n    } else {\n      writeByte(0xDB);\n      writeInteger(uint32_t(n));\n    }\n    writeBytes(reinterpret_cast<const uint8_t*>(value), n);\n  }\n\n  void visitRawJson(const char* data, size_t size) {\n    writeBytes(reinterpret_cast<const uint8_t*>(data), size);\n  }\n\n  void visitNegativeInteger(UInt value) {\n    UInt negated = UInt(~value + 1);\n    if (value <= 0x20) {\n      writeInteger(int8_t(negated));\n    } else if (value <= 0x80) {\n      writeByte(0xD0);\n      writeInteger(int8_t(negated));\n    } else if (value <= 0x8000) {\n      writeByte(0xD1);\n      writeInteger(int16_t(negated));\n    } else if (value <= 0x80000000) {\n      writeByte(0xD2);\n      writeInteger(int32_t(negated));\n    }\n#if ARDUINOJSON_USE_LONG_LONG\n    else {\n      writeByte(0xD3);\n      writeInteger(int64_t(negated));\n    }\n#endif\n  }\n\n  void visitPositiveInteger(UInt value) {\n    if (value <= 0x7F) {\n      writeInteger(uint8_t(value));\n    } else if (value <= 0xFF) {\n      writeByte(0xCC);\n      writeInteger(uint8_t(value));\n    } else if (value <= 0xFFFF) {\n      writeByte(0xCD);\n      writeInteger(uint16_t(value));\n    } else if (value <= 0xFFFFFFFF) {\n      writeByte(0xCE);\n      writeInteger(uint32_t(value));\n    }\n#if ARDUINOJSON_USE_LONG_LONG\n    else {\n      writeByte(0xCF);\n      writeInteger(uint64_t(value));\n    }\n#endif\n  }\n\n  void visitBoolean(bool value) {\n    writeByte(value ? 0xC3 : 0xC2);\n  }\n\n  void visitNull() {\n    writeByte(0xC0);\n  }\n\n  size_t bytesWritten() const {\n    return _bytesWritten;\n  }\n\n private:\n  void writeByte(uint8_t c) {\n    _bytesWritten += _writer->write(c);\n  }\n\n  void writeBytes(const uint8_t* p, size_t n) {\n    _bytesWritten += _writer->write(p, n);\n  }\n\n  template <typename T>\n  void writeInteger(T value) {\n    fixEndianess(value);\n    writeBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));\n  }\n\n  TWriter* _writer;\n  size_t _bytesWritten;\n};\n\ntemplate <typename TSource, typename TDestination>\ninline size_t serializeMsgPack(const TSource& source, TDestination& output) {\n  return serialize<MsgPackSerializer>(source, output);\n}\n\ntemplate <typename TSource, typename TDestination>\ninline size_t serializeMsgPack(const TSource& source, TDestination* output,\n                               size_t size) {\n  return serialize<MsgPackSerializer>(source, output, size);\n}\n\ntemplate <typename TSource>\ninline size_t measureMsgPack(const TSource& source) {\n  return measure<MsgPackSerializer>(source);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/MsgPack/endianess.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Polyfills/utility.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_LITTLE_ENDIAN\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 8>) {\n  swap(p[0], p[7]);\n  swap(p[1], p[6]);\n  swap(p[2], p[5]);\n  swap(p[3], p[4]);\n}\n\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 4>) {\n  swap(p[0], p[3]);\n  swap(p[1], p[2]);\n}\n\ninline void fixEndianess(uint8_t *p, integral_constant<size_t, 2>) {\n  swap(p[0], p[1]);\n}\n\ninline void fixEndianess(uint8_t *, integral_constant<size_t, 1>) {}\n\ntemplate <typename T>\ninline void fixEndianess(T &value) {\n  fixEndianess(reinterpret_cast<uint8_t *>(&value),\n               integral_constant<size_t, sizeof(T)>());\n}\n#else\ntemplate <typename T>\ninline void fixEndianess(T &) {}\n#endif\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/MsgPack/ieee754.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline void doubleToFloat(const uint8_t d[8], uint8_t f[4]) {\n  f[0] = uint8_t((d[0] & 0xC0) | (d[0] << 3 & 0x3f) | (d[1] >> 5));\n  f[1] = uint8_t((d[1] << 3) | (d[2] >> 5));\n  f[2] = uint8_t((d[2] << 3) | (d[3] >> 5));\n  f[3] = uint8_t((d[3] << 3) | (d[4] >> 5));\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Namespace.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"version.hpp\"\n\n#include \"Configuration.hpp\"\n\n#define ARDUINOJSON_DO_CONCAT(A, B) A##B\n#define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_DO_CONCAT(A, B)\n#define ARDUINOJSON_CONCAT4(A, B, C, D) \\\n  ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), ARDUINOJSON_CONCAT2(C, D))\n#define ARDUINOJSON_CONCAT8(A, B, C, D, E, F, G, H)    \\\n  ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT4(A, B, C, D), \\\n                      ARDUINOJSON_CONCAT4(E, F, G, H))\n\n#define ARDUINOJSON_NAMESPACE                                                  \\\n  ARDUINOJSON_CONCAT8(ArduinoJson, ARDUINOJSON_VERSION_MAJOR,                  \\\n                      ARDUINOJSON_VERSION_MINOR, ARDUINOJSON_VERSION_REVISION, \\\n                      _, ARDUINOJSON_USE_LONG_LONG, ARDUINOJSON_USE_DOUBLE,    \\\n                      ARDUINOJSON_DECODE_UNICODE)\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/Float.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_USE_DOUBLE\ntypedef double Float;\n#else\ntypedef float Float;\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/FloatParts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/math.hpp\"\n#include \"./FloatTraits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TFloat>\nstruct FloatParts {\n  uint32_t integral;\n  uint32_t decimal;\n  int16_t exponent;\n  int8_t decimalPlaces;\n\n  FloatParts(TFloat value) {\n    uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000;\n    decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6;\n\n    exponent = normalize(value);\n\n    integral = uint32_t(value);\n    // reduce number of decimal places by the number of integral places\n    for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) {\n      maxDecimalPart /= 10;\n      decimalPlaces--;\n    }\n\n    TFloat remainder = (value - TFloat(integral)) * TFloat(maxDecimalPart);\n\n    decimal = uint32_t(remainder);\n    remainder = remainder - TFloat(decimal);\n\n    // rounding:\n    // increment by 1 if remainder >= 0.5\n    decimal += uint32_t(remainder * 2);\n    if (decimal >= maxDecimalPart) {\n      decimal = 0;\n      integral++;\n      if (exponent && integral >= 10) {\n        exponent++;\n        integral = 1;\n      }\n    }\n\n    // remove trailing zeros\n    while (decimal % 10 == 0 && decimalPlaces > 0) {\n      decimal /= 10;\n      decimalPlaces--;\n    }\n  }\n\n  static int16_t normalize(TFloat& value) {\n    typedef FloatTraits<TFloat> traits;\n    int16_t powersOf10 = 0;\n\n    int8_t index = sizeof(TFloat) == 8 ? 8 : 5;\n    int bit = 1 << index;\n\n    if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) {\n      for (; index >= 0; index--) {\n        if (value >= traits::positiveBinaryPowerOfTen(index)) {\n          value *= traits::negativeBinaryPowerOfTen(index);\n          powersOf10 = int16_t(powersOf10 + bit);\n        }\n        bit >>= 1;\n      }\n    }\n\n    if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) {\n      for (; index >= 0; index--) {\n        if (value < traits::negativeBinaryPowerOfTenPlusOne(index)) {\n          value *= traits::positiveBinaryPowerOfTen(index);\n          powersOf10 = int16_t(powersOf10 - bit);\n        }\n        bit >>= 1;\n      }\n    }\n\n    return powersOf10;\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/FloatTraits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n#include <stdint.h>\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/alias_cast.hpp\"\n#include \"../Polyfills/math.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, size_t = sizeof(T)>\nstruct FloatTraits {};\n\ntemplate <typename T>\nstruct FloatTraits<T, 8 /*64bits*/> {\n  typedef uint64_t mantissa_type;\n  static const short mantissa_bits = 52;\n  static const mantissa_type mantissa_max =\n      (mantissa_type(1) << mantissa_bits) - 1;\n\n  typedef int16_t exponent_type;\n  static const exponent_type exponent_max = 308;\n\n  template <typename TExponent>\n  static T make_float(T m, TExponent e) {\n    if (e > 0) {\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= positiveBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    } else {\n      e = TExponent(-e);\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= negativeBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    }\n    return m;\n  }\n\n  static T positiveBinaryPowerOfTen(int index) {\n    static T factors[] = {\n        1e1,\n        1e2,\n        1e4,\n        1e8,\n        1e16,\n        forge(0x4693B8B5, 0xB5056E17),  // 1e32\n        forge(0x4D384F03, 0xE93FF9F5),  // 1e64\n        forge(0x5A827748, 0xF9301D32),  // 1e128\n        forge(0x75154FDD, 0x7F73BF3C)   // 1e256\n    };\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTen(int index) {\n    static T factors[] = {\n        forge(0x3FB99999, 0x9999999A),  // 1e-1\n        forge(0x3F847AE1, 0x47AE147B),  // 1e-2\n        forge(0x3F1A36E2, 0xEB1C432D),  // 1e-4\n        forge(0x3E45798E, 0xE2308C3A),  // 1e-8\n        forge(0x3C9CD2B2, 0x97D889BC),  // 1e-16\n        forge(0x3949F623, 0xD5A8A733),  // 1e-32\n        forge(0x32A50FFD, 0x44F4A73D),  // 1e-64\n        forge(0x255BBA08, 0xCF8C979D),  // 1e-128\n        forge(0x0AC80628, 0x64AC6F43)   // 1e-256\n    };\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTenPlusOne(int index) {\n    static T factors[] = {\n        1e0,\n        forge(0x3FB99999, 0x9999999A),  // 1e-1\n        forge(0x3F50624D, 0xD2F1A9FC),  // 1e-3\n        forge(0x3E7AD7F2, 0x9ABCAF48),  // 1e-7\n        forge(0x3CD203AF, 0x9EE75616),  // 1e-15\n        forge(0x398039D6, 0x65896880),  // 1e-31\n        forge(0x32DA53FC, 0x9631D10D),  // 1e-63\n        forge(0x25915445, 0x81B7DEC2),  // 1e-127\n        forge(0x0AFE07B2, 0x7DD78B14)   // 1e-255\n    };\n    return factors[index];\n  }\n\n  static T nan() {\n    return forge(0x7ff80000, 0x00000000);\n  }\n\n  static T inf() {\n    return forge(0x7ff00000, 0x00000000);\n  }\n\n  static T highest() {\n    return forge(0x7FEFFFFF, 0xFFFFFFFF);\n  }\n\n  static T lowest() {\n    return forge(0xFFEFFFFF, 0xFFFFFFFF);\n  }\n\n  // constructs a double floating point values from its binary representation\n  // we use this function to workaround platforms with single precision literals\n  // (for example, when -fsingle-precision-constant is passed to GCC)\n  static T forge(uint32_t msb, uint32_t lsb) {\n    return alias_cast<T>((uint64_t(msb) << 32) | lsb);\n  }\n};\n\ntemplate <typename T>\nstruct FloatTraits<T, 4 /*32bits*/> {\n  typedef uint32_t mantissa_type;\n  static const short mantissa_bits = 23;\n  static const mantissa_type mantissa_max =\n      (mantissa_type(1) << mantissa_bits) - 1;\n\n  typedef int8_t exponent_type;\n  static const exponent_type exponent_max = 38;\n\n  template <typename TExponent>\n  static T make_float(T m, TExponent e) {\n    if (e > 0) {\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= positiveBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    } else {\n      e = -e;\n      for (uint8_t index = 0; e != 0; index++) {\n        if (e & 1) m *= negativeBinaryPowerOfTen(index);\n        e >>= 1;\n      }\n    }\n    return m;\n  }\n\n  static T positiveBinaryPowerOfTen(int index) {\n    static T factors[] = {1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f};\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTen(int index) {\n    static T factors[] = {1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f};\n    return factors[index];\n  }\n\n  static T negativeBinaryPowerOfTenPlusOne(int index) {\n    static T factors[] = {1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f};\n    return factors[index];\n  }\n\n  static T forge(uint32_t bits) {\n    return alias_cast<T>(bits);\n  }\n\n  static T nan() {\n    return forge(0x7fc00000);\n  }\n\n  static T inf() {\n    return forge(0x7f800000);\n  }\n\n  static T highest() {\n    return forge(0x7f7fffff);\n  }\n\n  static T lowest() {\n    return forge(0xFf7fffff);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/Integer.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\n#include <stdint.h>  // int64_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n#if ARDUINOJSON_USE_LONG_LONG\ntypedef int64_t Integer;\ntypedef uint64_t UInt;\n#else\ntypedef long Integer;\ntypedef unsigned long UInt;\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/convertNumber.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wconversion\"\n#elif defined(__GNUC__)\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)\n#pragma GCC diagnostic push\n#endif\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#endif\n\n#include \"../Polyfills/limits.hpp\"\n#include \"Float.hpp\"\n#include \"FloatTraits.hpp\"\n#include \"Integer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && sizeof(TOut) <= sizeof(TIn),\n                   bool>::type\ncanStorePositiveInteger(TIn value) {\n  return value <= TIn(numeric_limits<TOut>::highest());\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && sizeof(TIn) < sizeof(TOut),\n                   bool>::type\ncanStorePositiveInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, bool>::type\ncanStorePositiveInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, bool>::type\ncanStoreNegativeInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&\n                       sizeof(TOut) <= sizeof(TIn),\n                   bool>::type\ncanStoreNegativeInteger(TIn value) {\n  return value <= TIn(numeric_limits<TOut>::highest()) + 1;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_signed<TOut>::value &&\n                       sizeof(TIn) < sizeof(TOut),\n                   bool>::type\ncanStoreNegativeInteger(TIn) {\n  return true;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_integral<TOut>::value && is_unsigned<TOut>::value,\n                   bool>::type\ncanStoreNegativeInteger(TIn) {\n  return false;\n}\n\ntemplate <typename TOut, typename TIn>\nTOut convertPositiveInteger(TIn value) {\n  return canStorePositiveInteger<TOut>(value) ? TOut(value) : 0;\n}\n\ntemplate <typename TOut, typename TIn>\nTOut convertNegativeInteger(TIn value) {\n  return canStoreNegativeInteger<TOut>(value) ? TOut(~value + 1) : 0;\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<is_floating_point<TOut>::value, TOut>::type convertFloat(\n    TIn value) {\n  return TOut(value);\n}\n\ntemplate <typename TOut, typename TIn>\ntypename enable_if<!is_floating_point<TOut>::value, TOut>::type convertFloat(\n    TIn value) {\n  return value >= numeric_limits<TOut>::lowest() &&\n                 value <= numeric_limits<TOut>::highest()\n             ? TOut(value)\n             : 0;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#elif defined(__GNUC__)\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)\n#pragma GCC diagnostic pop\n#endif\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/parseFloat.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"convertNumber.hpp\"\n#include \"parseNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline T parseFloat(const char* s) {\n  // try to reuse the same parameters as JsonDeserializer\n  typedef typename choose_largest<Float, T>::type TFloat;\n  return parseNumber<TFloat, UInt>(s).template as<T>();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/parseInteger.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n#include \"convertNumber.hpp\"\n#include \"parseNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\nT parseInteger(const char *s) {\n  // try to reuse the same parameters as JsonDeserializer\n  typedef typename choose_largest<UInt, typename make_unsigned<T>::type>::type\n      TUInt;\n  return parseNumber<Float, TUInt>(s).template as<T>();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Numbers/parseNumber.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/assert.hpp\"\n#include \"../Polyfills/ctype.hpp\"\n#include \"../Polyfills/math.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantContent.hpp\"\n#include \"FloatTraits.hpp\"\n#include \"convertNumber.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TFloat, typename TUInt>\nstruct ParsedNumber {\n  ParsedNumber() : uintValue(0), floatValue(0), _type(VALUE_IS_NULL) {}\n\n  ParsedNumber(TUInt value, bool is_negative)\n      : uintValue(value),\n        floatValue(TFloat(value)),\n        _type(uint8_t(is_negative ? VALUE_IS_NEGATIVE_INTEGER\n                                  : VALUE_IS_POSITIVE_INTEGER)) {}\n  ParsedNumber(TFloat value) : floatValue(value), _type(VALUE_IS_FLOAT) {}\n\n  template <typename T>\n  T as() const {\n    switch (_type) {\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return convertNegativeInteger<T>(uintValue);\n      case VALUE_IS_POSITIVE_INTEGER:\n        return convertPositiveInteger<T>(uintValue);\n      case VALUE_IS_FLOAT:\n        return convertFloat<T>(floatValue);\n      default:\n        return 0;\n    }\n  }\n\n  uint8_t type() const {\n    return _type;\n  }\n\n  TUInt uintValue;\n  TFloat floatValue;\n  uint8_t _type;\n};\n\ntemplate <typename A, typename B>\nstruct choose_largest : conditional<(sizeof(A) > sizeof(B)), A, B> {};\n\ntemplate <typename TFloat, typename TUInt>\ninline ParsedNumber<TFloat, TUInt> parseNumber(const char *s) {\n  typedef FloatTraits<TFloat> traits;\n  typedef typename choose_largest<typename traits::mantissa_type, TUInt>::type\n      mantissa_t;\n  typedef typename traits::exponent_type exponent_t;\n  typedef ParsedNumber<TFloat, TUInt> return_type;\n\n  ARDUINOJSON_ASSERT(s != 0);\n\n  bool is_negative = false;\n  switch (*s) {\n    case '-':\n      is_negative = true;\n      s++;\n      break;\n    case '+':\n      s++;\n      break;\n  }\n\n  if (*s == 'n' || *s == 'N') return traits::nan();\n  if (*s == 'i' || *s == 'I')\n    return is_negative ? -traits::inf() : traits::inf();\n  if (!isdigit(*s) && *s != '.') return return_type();\n\n  mantissa_t mantissa = 0;\n  exponent_t exponent_offset = 0;\n  const mantissa_t maxUint = TUInt(-1);\n\n  while (isdigit(*s)) {\n    uint8_t digit = uint8_t(*s - '0');\n    if (mantissa > maxUint / 10) break;\n    mantissa *= 10;\n    if (mantissa > maxUint - digit) break;\n    mantissa += digit;\n    s++;\n  }\n\n  if (*s == '\\0') return return_type(TUInt(mantissa), is_negative);\n\n  // avoid mantissa overflow\n  while (mantissa > traits::mantissa_max) {\n    mantissa /= 10;\n    exponent_offset++;\n  }\n\n  // remaing digits can't fit in the mantissa\n  while (isdigit(*s)) {\n    exponent_offset++;\n    s++;\n  }\n\n  if (*s == '.') {\n    s++;\n    while (isdigit(*s)) {\n      if (mantissa < traits::mantissa_max / 10) {\n        mantissa = mantissa * 10 + uint8_t(*s - '0');\n        exponent_offset--;\n      }\n      s++;\n    }\n  }\n\n  int exponent = 0;\n  if (*s == 'e' || *s == 'E') {\n    s++;\n    bool negative_exponent = false;\n    if (*s == '-') {\n      negative_exponent = true;\n      s++;\n    } else if (*s == '+') {\n      s++;\n    }\n\n    while (isdigit(*s)) {\n      exponent = exponent * 10 + (*s - '0');\n      if (exponent + exponent_offset > traits::exponent_max) {\n        if (negative_exponent)\n          return is_negative ? -0.0f : 0.0f;\n        else\n          return is_negative ? -traits::inf() : traits::inf();\n      }\n      s++;\n    }\n    if (negative_exponent) exponent = -exponent;\n  }\n  exponent += exponent_offset;\n\n  // we should be at the end of the string, otherwise it's an error\n  if (*s != '\\0') return return_type();\n\n  TFloat result = traits::make_float(static_cast<TFloat>(mantissa), exponent);\n\n  return is_negative ? -result : result;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/MemberProxy.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4522)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TObject, typename TStringRef>\nclass MemberProxy : public VariantOperators<MemberProxy<TObject, TStringRef> >,\n                    public Visitable {\n  typedef MemberProxy<TObject, TStringRef> this_type;\n\n public:\n  FORCE_INLINE MemberProxy(TObject variant, TStringRef key)\n      : _object(variant), _key(key) {}\n\n  FORCE_INLINE operator VariantConstRef() const {\n    return getUpstreamMember();\n  }\n\n  FORCE_INLINE this_type &operator=(const this_type &src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename enable_if<!is_array<TValue>::value, this_type &>::type\n  operator=(const TValue &src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  // operator=(char*)\n  // operator=(const char*)\n  // operator=(const __FlashStringHelper*)\n  template <typename TChar>\n  FORCE_INLINE this_type &operator=(TChar *src) {\n    getOrAddUpstreamMember().set(src);\n    return *this;\n  }\n\n  FORCE_INLINE void clear() const {\n    getUpstreamMember().clear();\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return getUpstreamMember().isNull();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename VariantAs<TValue>::type as() const {\n    return getUpstreamMember().template as<TValue>();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE bool is() const {\n    return getUpstreamMember().template is<TValue>();\n  }\n\n  FORCE_INLINE size_t size() const {\n    return getUpstreamMember().size();\n  }\n\n  FORCE_INLINE void remove(size_t index) const {\n    getUpstreamMember().remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(\n      TChar *key) const {\n    getUpstreamMember().remove(key);\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString &key) const {\n    getUpstreamMember().remove(key);\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename VariantTo<TValue>::type to() {\n    return getOrAddUpstreamMember().template to<TValue>();\n  }\n\n  template <typename TValue>\n  FORCE_INLINE typename enable_if<!is_array<TValue>::value, bool>::type set(\n      const TValue &value) {\n    return getOrAddUpstreamMember().set(value);\n  }\n\n  // set(char*) const\n  // set(const char*) const\n  // set(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool set(const TChar *value) {\n    return getOrAddUpstreamMember().set(value);\n  }\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    return getUpstreamMember().accept(visitor);\n  }\n\n  FORCE_INLINE VariantRef addElement() const {\n    return getOrAddUpstreamMember().addElement();\n  }\n\n  // getElement(size_t) const\n  FORCE_INLINE VariantRef getElement(size_t index) const {\n    return getUpstreamMember().getElement(index);\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar *key) const {\n    return getUpstreamMember().getMember(key);\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getMember(const TString &key) const {\n    return getUpstreamMember().getMember(key);\n  }\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar *key) const {\n    return getOrAddUpstreamMember().getOrAddMember(key);\n  }\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString &key) const {\n    return getOrAddUpstreamMember().getOrAddMember(key);\n  }\n\n private:\n  FORCE_INLINE VariantRef getUpstreamMember() const {\n    return _object.getMember(_key);\n  }\n\n  FORCE_INLINE VariantRef getOrAddUpstreamMember() const {\n    return _object.getOrAddMember(_key);\n  }\n\n  TObject _object;\n  TStringRef _key;\n};\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value,\n                          MemberProxy<const TObject &, const TString &> >::type\n    ObjectShortcuts<TObject>::operator[](const TString &key) const {\n  return MemberProxy<const TObject &, const TString &>(*impl(), key);\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString *>::value,\n                          MemberProxy<const TObject &, TString *> >::type\n    ObjectShortcuts<TObject>::operator[](TString *key) const {\n  return MemberProxy<const TObject &, TString *>(*impl(), key);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/ObjectFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Collection/CollectionData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename Visitor>\nvoid objectAccept(const CollectionData *obj, Visitor &visitor) {\n  if (obj)\n    visitor.visitObject(*obj);\n  else\n    visitor.visitNull();\n}\n\ninline bool objectEquals(const CollectionData *lhs, const CollectionData *rhs) {\n  if (lhs == rhs) return true;\n  if (!lhs || !rhs) return false;\n  return lhs->equalsObject(*rhs);\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData *objectGet(const CollectionData *obj, TAdaptedString key) {\n  if (!obj) return 0;\n  return obj->get(key);\n}\n\ntemplate <typename TAdaptedString>\nvoid objectRemove(CollectionData *obj, TAdaptedString key) {\n  if (!obj) return;\n  obj->remove(key);\n}\n\ntemplate <typename TAdaptedString>\ninline VariantData *objectGetOrCreate(CollectionData *obj, TAdaptedString key,\n                                      MemoryPool *pool) {\n  if (!obj) return 0;\n\n  // ignore null key\n  if (key.isNull()) return 0;\n\n  // search a matching key\n  VariantData *var = obj->get(key);\n  if (var) return var;\n\n  return obj->add(key, pool);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/ObjectImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Array/ArrayRef.hpp\"\n#include \"ObjectRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline ArrayRef ObjectShortcuts<TObject>::createNestedArray(\n    const TString& key) const {\n  return impl()->getOrAddMember(key).template to<ArrayRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline ArrayRef ObjectShortcuts<TObject>::createNestedArray(TChar* key) const {\n  return impl()->getOrAddMember(key).template to<ArrayRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline ObjectRef ObjectShortcuts<TObject>::createNestedObject(\n    const TString& key) const {\n  return impl()->getOrAddMember(key).template to<ObjectRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline ObjectRef ObjectShortcuts<TObject>::createNestedObject(\n    TChar* key) const {\n  return impl()->getOrAddMember(key).template to<ObjectRef>();\n}\n\ntemplate <typename TObject>\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value, bool>::type\nObjectShortcuts<TObject>::containsKey(const TString& key) const {\n  return !impl()->getMember(key).isUndefined();\n}\n\ntemplate <typename TObject>\ntemplate <typename TChar>\ninline typename enable_if<IsString<TChar*>::value, bool>::type\nObjectShortcuts<TObject>::containsKey(TChar* key) const {\n  return !impl()->getMember(key).isUndefined();\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/ObjectIterator.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/SlotFunctions.hpp\"\n#include \"Pair.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass PairPtr {\n public:\n  PairPtr(MemoryPool *pool, VariantSlot *slot) : _pair(pool, slot) {}\n\n  const Pair *operator->() const {\n    return &_pair;\n  }\n\n  const Pair &operator*() const {\n    return _pair;\n  }\n\n private:\n  Pair _pair;\n};\n\nclass ObjectIterator {\n public:\n  ObjectIterator() : _slot(0) {}\n\n  explicit ObjectIterator(MemoryPool *pool, VariantSlot *slot)\n      : _pool(pool), _slot(slot) {}\n\n  Pair operator*() const {\n    return Pair(_pool, _slot);\n  }\n  PairPtr operator->() {\n    return PairPtr(_pool, _slot);\n  }\n\n  bool operator==(const ObjectIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ObjectIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ObjectIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ObjectIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  MemoryPool *_pool;\n  VariantSlot *_slot;\n};\n\nclass PairConstPtr {\n public:\n  PairConstPtr(const VariantSlot *slot) : _pair(slot) {}\n\n  const PairConst *operator->() const {\n    return &_pair;\n  }\n\n  const PairConst &operator*() const {\n    return _pair;\n  }\n\n private:\n  PairConst _pair;\n};\n\nclass ObjectConstIterator {\n public:\n  ObjectConstIterator() : _slot(0) {}\n\n  explicit ObjectConstIterator(const VariantSlot *slot) : _slot(slot) {}\n\n  PairConst operator*() const {\n    return PairConst(_slot);\n  }\n  PairConstPtr operator->() {\n    return PairConstPtr(_slot);\n  }\n\n  bool operator==(const ObjectConstIterator &other) const {\n    return _slot == other._slot;\n  }\n\n  bool operator!=(const ObjectConstIterator &other) const {\n    return _slot != other._slot;\n  }\n\n  ObjectConstIterator &operator++() {\n    _slot = _slot->next();\n    return *this;\n  }\n\n  ObjectConstIterator &operator+=(size_t distance) {\n    _slot = _slot->next(distance);\n    return *this;\n  }\n\n  const VariantSlot *internal() {\n    return _slot;\n  }\n\n private:\n  const VariantSlot *_slot;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/ObjectRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ObjectFunctions.hpp\"\n#include \"ObjectIterator.hpp\"\n\n// Returns the size (in bytes) of an object with n elements.\n// Can be very handy to determine the size of a StaticMemoryPool.\n#define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \\\n  ((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot))\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TData>\nclass ObjectRefBase {\n public:\n  operator VariantConstRef() const {\n    const void* data = _data;  // prevent warning cast-align\n    return VariantConstRef(reinterpret_cast<const VariantData*>(data));\n  }\n\n  template <typename Visitor>\n  FORCE_INLINE void accept(Visitor& visitor) const {\n    objectAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return _data == 0;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  FORCE_INLINE size_t size() const {\n    return _data ? _data->size() : 0;\n  }\n\n protected:\n  ObjectRefBase(TData* data) : _data(data) {}\n  TData* _data;\n};\n\nclass ObjectConstRef : public ObjectRefBase<const CollectionData>,\n                       public Visitable {\n  friend class ObjectRef;\n  typedef ObjectRefBase<const CollectionData> base_type;\n\n public:\n  typedef ObjectConstIterator iterator;\n\n  ObjectConstRef() : base_type(0) {}\n  ObjectConstRef(const CollectionData* data) : base_type(data) {}\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  FORCE_INLINE bool containsKey(const TString& key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE bool containsKey(TChar* key) const {\n    return !getMember(key).isUndefined();\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantConstRef getMember(const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantConstRef getMember(TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar*>::value, VariantConstRef>::type\n      operator[](TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  FORCE_INLINE bool operator==(ObjectConstRef rhs) const {\n    return objectEquals(_data, rhs._data);\n  }\n\n private:\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantConstRef get_impl(TAdaptedString key) const {\n    return VariantConstRef(objectGet(_data, key));\n  }\n};\n\nclass ObjectRef : public ObjectRefBase<CollectionData>,\n                  public ObjectShortcuts<ObjectRef>,\n                  public Visitable {\n  typedef ObjectRefBase<CollectionData> base_type;\n\n public:\n  typedef ObjectIterator iterator;\n\n  FORCE_INLINE ObjectRef() : base_type(0), _pool(0) {}\n  FORCE_INLINE ObjectRef(MemoryPool* buf, CollectionData* data)\n      : base_type(data), _pool(buf) {}\n\n  operator VariantRef() const {\n    void* data = _data;  // prevent warning cast-align\n    return VariantRef(_pool, reinterpret_cast<VariantData*>(data));\n  }\n\n  operator ObjectConstRef() const {\n    return ObjectConstRef(_data);\n  }\n\n  FORCE_INLINE iterator begin() const {\n    if (!_data) return iterator();\n    return iterator(_pool, _data->head());\n  }\n\n  FORCE_INLINE iterator end() const {\n    return iterator();\n  }\n\n  void clear() const {\n    if (!_data) return;\n    _data->clear();\n  }\n\n  FORCE_INLINE bool set(ObjectConstRef src) {\n    if (!_data || !src._data) return false;\n    return _data->copyFrom(*src._data, _pool);\n  }\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getMember(const TString& key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getMember(char*) const\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar* key) const {\n    return get_impl(adaptString(key));\n  }\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString& key) const {\n    return getOrCreate_impl(adaptString(key));\n  }\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar* key) const {\n    return getOrCreate_impl(adaptString(key));\n  }\n\n  FORCE_INLINE bool operator==(ObjectRef rhs) const {\n    return objectEquals(_data, rhs._data);\n  }\n\n  FORCE_INLINE void remove(iterator it) const {\n    if (!_data) return;\n    _data->remove(it.internal());\n  }\n\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE void remove(const TString& key) const {\n    objectRemove(_data, adaptString(key));\n  }\n\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE void remove(TChar* key) const {\n    objectRemove(_data, adaptString(key));\n  }\n\n private:\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantRef get_impl(TAdaptedString key) const {\n    return VariantRef(_pool, objectGet(_data, key));\n  }\n\n  template <typename TAdaptedString>\n  FORCE_INLINE VariantRef getOrCreate_impl(TAdaptedString key) const {\n    return VariantRef(_pool, objectGetOrCreate(_data, key, _pool));\n  }\n\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/ObjectShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Strings/StringAdapters.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename TParent, typename TStringRef>\nclass MemberProxy;\n\ntemplate <typename TObject>\nclass ObjectShortcuts {\n public:\n  // containsKey(const std::string&) const\n  // containsKey(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, bool>::type\n  containsKey(const TString &key) const;\n\n  // containsKey(char*) const\n  // containsKey(const char*) const\n  // containsKey(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value, bool>::type\n  containsKey(TChar *key) const;\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value,\n                         MemberProxy<const TObject &, const TString &> >::type\n      operator[](const TString &key) const;\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value,\n                                  MemberProxy<const TObject &, TChar *> >::type\n  operator[](TChar *key) const;\n\n  // createNestedArray(const std::string&) const\n  // createNestedArray(const String&) const\n  template <typename TString>\n  FORCE_INLINE ArrayRef createNestedArray(const TString &key) const;\n\n  // createNestedArray(char*) const\n  // createNestedArray(const char*) const\n  // createNestedArray(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE ArrayRef createNestedArray(TChar *key) const;\n\n  // createNestedObject(const std::string&) const\n  // createNestedObject(const String&) const\n  template <typename TString>\n  ObjectRef createNestedObject(const TString &key) const;\n\n  // createNestedObject(char*) const\n  // createNestedObject(const char*) const\n  // createNestedObject(const __FlashStringHelper*) const\n  template <typename TChar>\n  ObjectRef createNestedObject(TChar *key) const;\n\n private:\n  const TObject *impl() const {\n    return static_cast<const TObject *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Object/Pair.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Strings/String.hpp\"\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n// A key value pair for CollectionData.\nclass Pair {\n public:\n  Pair(MemoryPool* pool, VariantSlot* slot) {\n    if (slot) {\n      _key = String(slot->key(), !slot->ownsKey());\n      _value = VariantRef(pool, slot->data());\n    }\n  }\n\n  String key() const {\n    return _key;\n  }\n\n  VariantRef value() const {\n    return _value;\n  }\n\n private:\n  String _key;\n  VariantRef _value;\n};\n\nclass PairConst {\n public:\n  PairConst(const VariantSlot* slot) {\n    if (slot) {\n      _key = String(slot->key(), !slot->ownsKey());\n      _value = VariantConstRef(slot->data());\n    }\n  }\n\n  String key() const {\n    return _key;\n  }\n\n  VariantConstRef value() const {\n    return _value;\n  }\n\n private:\n  String _key;\n  VariantConstRef _value;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Operators/VariantCasts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantCasts {\n public:\n  template <typename T>\n  FORCE_INLINE operator T() const {\n    return impl()->template as<T>();\n  }\n\n private:\n  const TImpl *impl() const {\n    return static_cast<const TImpl *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Operators/VariantComparisons.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Variant/VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\nstruct is_simple_value {\n  static const bool value = is_integral<T>::value ||\n                            is_floating_point<T>::value ||\n                            is_same<T, bool>::value;\n};\n\ntemplate <typename TVariant>\nclass VariantComparisons {\n public:\n  // const char* == TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator==(\n      T *lhs, TVariant rhs) {\n    return adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // std::string == TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator==(\n      const T &lhs, TVariant rhs) {\n    return adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // TVariant == const char*\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator==(\n      TVariant lhs, T *rhs) {\n    return adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // TVariant == std::string\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator==(\n      TVariant lhs, const T &rhs) {\n    return adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // bool/int/float == TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator==(\n      const T &lhs, TVariant rhs) {\n    return lhs == rhs.template as<T>();\n  }\n\n  // TVariant == bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator==(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() == rhs;\n  }\n\n  // const char* != TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator!=(\n      T *lhs, TVariant rhs) {\n    return !adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // std::string != TVariant\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator!=(\n      const T &lhs, TVariant rhs) {\n    return !adaptString(lhs).equals(rhs.template as<const char *>());\n  }\n\n  // TVariant != const char*\n  template <typename T>\n  friend typename enable_if<IsString<T *>::value, bool>::type operator!=(\n      TVariant lhs, T *rhs) {\n    return !adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // TVariant != std::string\n  template <typename T>\n  friend typename enable_if<IsString<T>::value, bool>::type operator!=(\n      TVariant lhs, const T &rhs) {\n    return !adaptString(rhs).equals(lhs.template as<const char *>());\n  }\n\n  // bool/int/float != TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator!=(\n      const T &lhs, TVariant rhs) {\n    return lhs != rhs.template as<T>();\n  }\n\n  // TVariant != bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator!=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() != rhs;\n  }\n\n  // bool/int/float < TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<(\n      const T &lhs, TVariant rhs) {\n    return lhs < rhs.template as<T>();\n  }\n\n  // TVariant < bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() < rhs;\n  }\n\n  // bool/int/float <= TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<=(\n      const T &lhs, TVariant rhs) {\n    return lhs <= rhs.template as<T>();\n  }\n\n  // TVariant <= bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator<=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() <= rhs;\n  }\n\n  // bool/int/float > TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>(\n      const T &lhs, TVariant rhs) {\n    return lhs > rhs.template as<T>();\n  }\n\n  // TVariant > bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() > rhs;\n  }\n\n  // bool/int/float >= TVariant\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>=(\n      const T &lhs, TVariant rhs) {\n    return lhs >= rhs.template as<T>();\n  }\n\n  // TVariant >= bool/int/float\n  template <typename T>\n  friend typename enable_if<is_simple_value<T>::value, bool>::type operator>=(\n      TVariant lhs, const T &rhs) {\n    return lhs.template as<T>() >= rhs;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Operators/VariantOperators.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"VariantCasts.hpp\"\n#include \"VariantComparisons.hpp\"\n#include \"VariantOr.hpp\"\n#include \"VariantShortcuts.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantOperators : public VariantCasts<TImpl>,\n                         public VariantComparisons<TImpl>,\n                         public VariantOr<TImpl>,\n                         public VariantShortcuts<TImpl> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Operators/VariantOr.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/attributes.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantAs.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TImpl>\nclass VariantOr {\n public:\n  // Returns the default value if the VariantRef is undefined of incompatible\n  template <typename T>\n  typename enable_if<!is_integral<T>::value, T>::type operator|(\n      const T &defaultValue) const {\n    if (impl()->template is<T>())\n      return impl()->template as<T>();\n    else\n      return defaultValue;\n  }\n\n  // Returns the default value if the VariantRef is undefined of incompatible\n  // Special case for string: null is treated as undefined\n  const char *operator|(const char *defaultValue) const {\n    const char *value = impl()->template as<const char *>();\n    return value ? value : defaultValue;\n  }\n\n  // Returns the default value if the VariantRef is undefined of incompatible\n  // Special case for integers: we also accept double\n  template <typename Integer>\n  typename enable_if<is_integral<Integer>::value, Integer>::type operator|(\n      const Integer &defaultValue) const {\n    if (impl()->template is<double>())\n      return impl()->template as<Integer>();\n    else\n      return defaultValue;\n  }\n\n private:\n  const TImpl *impl() const {\n    return static_cast<const TImpl *>(this);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Operators/VariantShortcuts.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Array/ArrayShortcuts.hpp\"\n#include \"../Object/ObjectShortcuts.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TVariant>\nclass VariantShortcuts : public ObjectShortcuts<TVariant>,\n                         public ArrayShortcuts<TVariant> {\n public:\n  using ArrayShortcuts<TVariant>::createNestedArray;\n  using ArrayShortcuts<TVariant>::createNestedObject;\n  using ArrayShortcuts<TVariant>::operator[];\n  using ObjectShortcuts<TVariant>::createNestedArray;\n  using ObjectShortcuts<TVariant>::createNestedObject;\n  using ObjectShortcuts<TVariant>::operator[];\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/alias_cast.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stdint.h>\n#include <stdlib.h>  // for size_t\n#include \"../Configuration.hpp\"\n#include \"../Polyfills/math.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, typename F>\nstruct alias_cast_t {\n  union {\n    F raw;\n    T data;\n  };\n};\n\ntemplate <typename T, typename F>\nT alias_cast(F raw_data) {\n  alias_cast_t<T, F> ac;\n  ac.raw = raw_data;\n  return ac.data;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/assert.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef ARDUINOJSON_DEBUG\n#include <assert.h>\n#define ARDUINOJSON_ASSERT(X) assert(X)\n#else\n#define ARDUINOJSON_ASSERT(X) ((void)0)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/attributes.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef _MSC_VER  // Visual Studio\n\n#define FORCE_INLINE  // __forceinline causes C4714 when returning std::string\n#define NO_INLINE __declspec(noinline)\n#define DEPRECATED(msg) __declspec(deprecated(msg))\n\n#elif defined(__GNUC__)  // GCC or Clang\n\n#define FORCE_INLINE __attribute__((always_inline))\n#define NO_INLINE __attribute__((noinline))\n#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\n#define DEPRECATED(msg) __attribute__((deprecated(msg)))\n#else\n#define DEPRECATED(msg) __attribute__((deprecated))\n#endif\n\n#else  // Other compilers\n\n#define FORCE_INLINE\n#define NO_INLINE\n#define DEPRECATED(msg)\n\n#endif\n\n#if __cplusplus >= 201103L\n#define NOEXCEPT noexcept\n#else\n#define NOEXCEPT throw()\n#endif\n\n#if defined(__has_attribute)\n#if __has_attribute(no_sanitize)\n#define ARDUINOJSON_NO_SANITIZE(check) __attribute__((no_sanitize(check)))\n#else\n#define ARDUINOJSON_NO_SANITIZE(check)\n#endif\n#else\n#define ARDUINOJSON_NO_SANITIZE(check)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/ctype.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ninline bool isdigit(char c) {\n  return '0' <= c && c <= '9';\n}\n\ninline bool issign(char c) {\n  return '-' == c || c == '+';\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/gsl/not_null.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../assert.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nclass not_null {\n public:\n  explicit not_null(T ptr) : _ptr(ptr) {\n    ARDUINOJSON_ASSERT(ptr != NULL);\n  }\n\n  T get() const {\n    ARDUINOJSON_ASSERT(_ptr != NULL);\n    return _ptr;\n  }\n\n private:\n  T _ptr;\n};\n\ntemplate <typename T>\nnot_null<T> make_not_null(T ptr) {\n  ARDUINOJSON_ASSERT(ptr != NULL);\n  return not_null<T>(ptr);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/limits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable : 4310)\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Differs from standard because we can't use the symbols \"min\" and \"max\"\ntemplate <typename T, typename Enable = void>\nstruct numeric_limits;\n\ntemplate <typename T>\nstruct numeric_limits<T, typename enable_if<is_unsigned<T>::value>::type> {\n  static T lowest() {\n    return 0;\n  }\n  static T highest() {\n    return T(-1);\n  }\n};\n\ntemplate <typename T>\nstruct numeric_limits<\n    T, typename enable_if<is_integral<T>::value && is_signed<T>::value>::type> {\n  static T lowest() {\n    return T(T(1) << (sizeof(T) * 8 - 1));\n  }\n  static T highest() {\n    return T(~lowest());\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/math.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Some libraries #define isnan() and isinf() so we need to check before\n// using this name\n\n#ifndef isnan\ntemplate <typename T>\nbool isnan(T x) {\n  return x != x;\n}\n#endif\n\n#ifndef isinf\ntemplate <typename T>\nbool isinf(T x) {\n  return x != 0.0 && x * 2 == x;\n}\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/mpl/max.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // for size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns the highest value\ntemplate <size_t X, size_t Y, bool MaxIsX = (X > Y)>\nstruct Max {};\n\ntemplate <size_t X, size_t Y>\nstruct Max<X, Y, true> {\n  static const size_t value = X;\n};\n\ntemplate <size_t X, size_t Y>\nstruct Max<X, Y, false> {\n  static const size_t value = Y;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/conditional.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <bool Condition, class TrueType, class FalseType>\nstruct conditional {\n  typedef TrueType type;\n};\n\ntemplate <class TrueType, class FalseType>\nstruct conditional<false, TrueType, FalseType> {\n  typedef FalseType type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/enable_if.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T if Condition is true.\ntemplate <bool Condition, typename T = void>\nstruct enable_if {};\n\ntemplate <typename T>\nstruct enable_if<true, T> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/integral_constant.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T, T v>\nstruct integral_constant {\n  static const T value = v;\n};\n\ntypedef integral_constant<bool, true> true_type;\ntypedef integral_constant<bool, false> false_type;\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_array.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct is_array : false_type {};\n\ntemplate <typename T>\nstruct is_array<T[]> : true_type {};\n\ntemplate <typename T, size_t N>\nstruct is_array<T[N]> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_base_of.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if Derived inherits from TBase is an\n// integral type.\ntemplate <typename TBase, typename TDerived>\nclass is_base_of {\n protected:  // <- to avoid GCC's \"all member functions in class are private\"\n  typedef char Yes[1];\n  typedef char No[2];\n\n  static Yes &probe(const TBase *);\n  static No &probe(...);\n\n public:\n  static const bool value =\n      sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes);\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_const.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the const modifier\ntemplate <typename T>\nstruct is_const : false_type {};\n\ntemplate <typename T>\nstruct is_const<const T> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_floating_point.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_floating_point : false_type {};\n\ntemplate <>\nstruct is_floating_point<float> : true_type {};\n\ntemplate <>\nstruct is_floating_point<double> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_integral.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../../Configuration.hpp\"\n#include \"is_same.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if T is an integral type.\ntemplate <typename T>\nstruct is_integral {\n  static const bool value =\n      is_same<T, signed char>::value || is_same<T, unsigned char>::value ||\n      is_same<T, signed short>::value || is_same<T, unsigned short>::value ||\n      is_same<T, signed int>::value || is_same<T, unsigned int>::value ||\n      is_same<T, signed long>::value || is_same<T, unsigned long>::value ||\n#if ARDUINOJSON_HAS_LONG_LONG\n      is_same<T, signed long long>::value ||\n      is_same<T, unsigned long long>::value ||\n#endif\n#if ARDUINOJSON_HAS_INT64\n      is_same<T, signed __int64>::value ||\n      is_same<T, unsigned __int64>::value ||\n#endif\n      is_same<T, char>::value;\n\n  // CAUTION: differs from std::is_integral as it doesn't include bool\n};\n\ntemplate <typename T>\nstruct is_integral<const T> : is_integral<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_same.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that returns true if types T and U are the same.\ntemplate <typename T, typename U>\nstruct is_same : false_type {};\n\ntemplate <typename T>\nstruct is_same<T, T> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_signed.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_signed : false_type {};\n\ntemplate <>\nstruct is_signed<char> : true_type {};\n\ntemplate <>\nstruct is_signed<signed char> : true_type {};\n\ntemplate <>\nstruct is_signed<signed short> : true_type {};\n\ntemplate <>\nstruct is_signed<signed int> : true_type {};\n\ntemplate <>\nstruct is_signed<signed long> : true_type {};\n\ntemplate <>\nstruct is_signed<float> : true_type {};\n\ntemplate <>\nstruct is_signed<double> : true_type {};\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct is_signed<signed long long> : true_type {};\n#endif\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct is_signed<signed __int64> : true_type {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/is_unsigned.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct is_unsigned : false_type {};\n\ntemplate <>\nstruct is_unsigned<bool> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned char> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned short> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned int> : true_type {};\n\ntemplate <>\nstruct is_unsigned<unsigned long> : true_type {};\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct is_unsigned<unsigned __int64> : true_type {};\n#endif\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct is_unsigned<unsigned long long> : true_type {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/make_unsigned.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"type_identity.hpp\"\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct make_unsigned;\n\ntemplate <>\nstruct make_unsigned<char> : type_identity<unsigned char> {};\n\ntemplate <>\nstruct make_unsigned<signed char> : type_identity<unsigned char> {};\ntemplate <>\nstruct make_unsigned<unsigned char> : type_identity<unsigned char> {};\n\ntemplate <>\nstruct make_unsigned<signed short> : type_identity<unsigned short> {};\ntemplate <>\nstruct make_unsigned<unsigned short> : type_identity<unsigned short> {};\n\ntemplate <>\nstruct make_unsigned<signed int> : type_identity<unsigned int> {};\ntemplate <>\nstruct make_unsigned<unsigned int> : type_identity<unsigned int> {};\n\ntemplate <>\nstruct make_unsigned<signed long> : type_identity<unsigned long> {};\ntemplate <>\nstruct make_unsigned<unsigned long> : type_identity<unsigned long> {};\n\n#if ARDUINOJSON_HAS_LONG_LONG\ntemplate <>\nstruct make_unsigned<signed long long> : type_identity<unsigned long long> {};\ntemplate <>\nstruct make_unsigned<unsigned long long> : type_identity<unsigned long long> {};\n#endif\n\n#if ARDUINOJSON_HAS_INT64\ntemplate <>\nstruct make_unsigned<signed __int64> : type_identity<unsigned __int64> {};\ntemplate <>\nstruct make_unsigned<unsigned __int64> : type_identity<unsigned __int64> {};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/remove_const.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the const modifier\ntemplate <typename T>\nstruct remove_const {\n  typedef T type;\n};\ntemplate <typename T>\nstruct remove_const<const T> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/remove_reference.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A meta-function that return the type T without the reference modifier.\ntemplate <typename T>\nstruct remove_reference {\n  typedef T type;\n};\ntemplate <typename T>\nstruct remove_reference<T&> {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits/type_identity.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"integral_constant.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\nstruct type_identity {\n  typedef T type;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/type_traits.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"type_traits/conditional.hpp\"\n#include \"type_traits/enable_if.hpp\"\n#include \"type_traits/integral_constant.hpp\"\n#include \"type_traits/is_array.hpp\"\n#include \"type_traits/is_base_of.hpp\"\n#include \"type_traits/is_const.hpp\"\n#include \"type_traits/is_floating_point.hpp\"\n#include \"type_traits/is_integral.hpp\"\n#include \"type_traits/is_same.hpp\"\n#include \"type_traits/is_signed.hpp\"\n#include \"type_traits/is_unsigned.hpp\"\n#include \"type_traits/make_unsigned.hpp\"\n#include \"type_traits/remove_const.hpp\"\n#include \"type_traits/remove_reference.hpp\"\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Polyfills/utility.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename T>\ninline void swap(T& a, T& b) {\n  T t(a);\n  a = b;\n  b = t;\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/DummyWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass DummyWriter {\n public:\n  size_t write(uint8_t) {\n    return 1;\n  }\n\n  size_t write(const uint8_t*, size_t n) {\n    return n;\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/DynamicStringWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/type_traits.hpp\"\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\n#include <WString.h>\n#endif\n\n#if ARDUINOJSON_ENABLE_STD_STRING\n#include <string>\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename>\nstruct IsWriteableString : false_type {};\n\n// A Print implementation that allows to write in a String\ntemplate <typename TString>\nclass DynamicStringWriter {};\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\ntemplate <>\nstruct IsWriteableString<String> : true_type {};\n\ntemplate <>\nclass DynamicStringWriter<String> {\n public:\n  DynamicStringWriter(String &str) : _str(&str) {}\n\n  size_t write(uint8_t c) {\n    _str->operator+=(static_cast<char>(c));\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    // CAUTION: Arduino String doesn't have append()\n    // and old version doesn't have size() either\n    _str->reserve(_str->length() + n);\n    while (n > 0) {\n      _str->operator+=(static_cast<char>(*s++));\n      n--;\n    }\n    return n;\n  }\n\n private:\n  String *_str;\n};\n#endif\n\n#if ARDUINOJSON_ENABLE_STD_STRING\ntemplate <>\nstruct IsWriteableString<std::string> : true_type {};\n\ntemplate <>\nclass DynamicStringWriter<std::string> {\n public:\n  DynamicStringWriter(std::string &str) : _str(&str) {}\n\n  size_t write(uint8_t c) {\n    _str->operator+=(static_cast<char>(c));\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    _str->append(reinterpret_cast<const char *>(s), n);\n    return n;\n  }\n\n private:\n  std::string *_str;\n};\n#endif\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/StaticStringWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// A Print implementation that allows to write in a char[]\nclass StaticStringWriter {\n public:\n  StaticStringWriter(char *buf, size_t size) : end(buf + size - 1), p(buf) {\n    *p = '\\0';\n  }\n\n  size_t write(uint8_t c) {\n    if (p >= end) return 0;\n    *p++ = static_cast<char>(c);\n    *p = '\\0';\n    return 1;\n  }\n\n  size_t write(const uint8_t *s, size_t n) {\n    char *begin = p;\n    while (p < end && n > 0) {\n      *p++ = static_cast<char>(*s++);\n      n--;\n    }\n    *p = '\\0';\n    return size_t(p - begin);\n  }\n\n private:\n  char *end;\n  char *p;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/StreamWriter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n\n#include <ostream>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StreamWriter {\n public:\n  explicit StreamWriter(std::ostream& os) : _os(os) {}\n\n  size_t write(uint8_t c) {\n    _os << c;\n    return 1;\n  }\n\n  size_t write(const uint8_t* s, size_t n) {\n    _os.write(reinterpret_cast<const char*>(s),\n              static_cast<std::streamsize>(n));\n    return n;\n  }\n\n private:\n  // cannot be assigned\n  StreamWriter& operator=(const StreamWriter&);\n\n  std::ostream& _os;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#endif  // ARDUINOJSON_ENABLE_STD_STREAM\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/measure.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./DummyWriter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t measure(const TSource &source) {\n  DummyWriter dp;\n  TSerializer<DummyWriter> serializer(dp);\n  source.accept(serializer);\n  return serializer.bytesWritten();\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Serialization/serialize.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./DynamicStringWriter.hpp\"\n#include \"./StaticStringWriter.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\n#include \"./StreamWriter.hpp\"\n#endif\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <template <typename> class TSerializer, typename TSource,\n          typename TDestination>\nsize_t doSerialize(const TSource &source, TDestination &destination) {\n  TSerializer<TDestination> serializer(destination);\n  source.accept(serializer);\n  return serializer.bytesWritten();\n}\n\n#if ARDUINOJSON_ENABLE_STD_STREAM\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, std::ostream &destination) {\n  StreamWriter writer(destination);\n  return doSerialize<TSerializer>(source, writer);\n}\n#endif\n\n#if ARDUINOJSON_ENABLE_ARDUINO_PRINT\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, Print &destination) {\n  return doSerialize<TSerializer>(source, destination);\n}\n#endif\n\ntemplate <template <typename> class TSerializer, typename TSource>\nsize_t serialize(const TSource &source, char *buffer, size_t bufferSize) {\n  StaticStringWriter writer(buffer, bufferSize);\n  return doSerialize<TSerializer>(source, writer);\n}\n\ntemplate <template <typename> class TSerializer, typename TSource, size_t N>\nsize_t serialize(const TSource &source, char (&buffer)[N]) {\n  StaticStringWriter writer(buffer, N);\n  return doSerialize<TSerializer>(source, writer);\n}\n\ntemplate <template <typename> class TSerializer, typename TSource,\n          typename TString>\ntypename enable_if<IsWriteableString<TString>::value, size_t>::type serialize(\n    const TSource &source, TString &str) {\n  DynamicStringWriter<TString> writer(str);\n  return doSerialize<TSerializer>(source, writer);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/StringStorage/StringCopier.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Memory/StringBuilder.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringCopier {\n public:\n  typedef ARDUINOJSON_NAMESPACE::StringBuilder StringBuilder;\n\n  StringCopier(MemoryPool* pool) : _pool(pool) {}\n\n  StringBuilder startString() {\n    return StringBuilder(_pool);\n  }\n\n private:\n  MemoryPool* _pool;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/StringStorage/StringMover.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StringMover {\n public:\n  class StringBuilder {\n   public:\n    StringBuilder(char** ptr) : _writePtr(ptr), _startPtr(*ptr) {}\n\n    void append(char c) {\n      *(*_writePtr)++ = char(c);\n    }\n\n    char* complete() const {\n      *(*_writePtr)++ = 0;\n      return _startPtr;\n    }\n\n   private:\n    char** _writePtr;\n    char* _startPtr;\n  };\n\n  StringMover(char* ptr) : _ptr(ptr) {}\n\n  StringBuilder startString() {\n    return StringBuilder(&_ptr);\n  }\n\n private:\n  char* _ptr;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/StringStorage/StringStorage.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"./StringCopier.hpp\"\n#include \"./StringMover.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TInput, typename Enable = void>\nstruct StringStorage {\n  typedef StringCopier type;\n\n  static type create(MemoryPool& pool, TInput&) {\n    return type(&pool);\n  }\n};\n\ntemplate <typename TChar>\nstruct StringStorage<TChar*,\n                     typename enable_if<!is_const<TChar>::value>::type> {\n  typedef StringMover type;\n\n  static type create(MemoryPool&, TChar* input) {\n    return type(reinterpret_cast<char*>(input));\n  }\n};\n\ntemplate <typename TInput>\ntypename StringStorage<TInput>::type makeStringStorage(MemoryPool& pool,\n                                                       TInput& input) {\n  return StringStorage<TInput>::create(pool, input);\n}\n\ntemplate <typename TChar>\ntypename StringStorage<TChar*>::type makeStringStorage(MemoryPool& pool,\n                                                       TChar* input) {\n  return StringStorage<TChar*>::create(pool, input);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/ArduinoStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <WString.h>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ArduinoStringAdapter {\n public:\n  ArduinoStringAdapter(const ::String& str) : _str(&str) {}\n\n  char* save(MemoryPool* pool) const {\n    if (isNull()) return NULL;\n    size_t n = _str->length() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str->c_str(), n);\n    return dup;\n  }\n\n  bool isNull() const {\n    // Arduino's String::c_str() can return NULL\n    return !_str->c_str();\n  }\n\n  bool equals(const char* expected) const {\n    // Arduino's String::c_str() can return NULL\n    const char* actual = _str->c_str();\n    if (!actual || !expected) return actual == expected;\n    return 0 == strcmp(actual, expected);\n  }\n\n  const char* data() const {\n    return _str->c_str();\n  }\n\n  size_t size() const {\n    return _str->length();\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const ::String* _str;\n};\n\ntemplate <>\nstruct IsString< ::String> : true_type {};\n\ntemplate <>\nstruct IsString< ::StringSumHelper> : true_type {};\n\ninline ArduinoStringAdapter adaptString(const ::String& str) {\n  return ArduinoStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/ConstRamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n#include <string.h>  // strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ConstRamStringAdapter {\n public:\n  ConstRamStringAdapter(const char* str = 0) : _str(str) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = _str;\n    if (!actual || !expected) return actual == expected;\n    return strcmp(actual, expected) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  template <typename TMemoryPool>\n  char* save(TMemoryPool*) const {\n    return 0;\n  }\n\n  size_t size() const {\n    if (!_str) return 0;\n    return strlen(_str);\n  }\n\n  const char* data() const {\n    return _str;\n  }\n\n  bool isStatic() const {\n    return true;\n  }\n\n protected:\n  const char* _str;\n};\n\ninline ConstRamStringAdapter adaptString(const char* str) {\n  return ConstRamStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/FlashStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass FlashStringAdapter {\n public:\n  FlashStringAdapter(const __FlashStringHelper* str) : _str(str) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strcmp_P(expected, actual) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    size_t n = size() + 1;  // copy the terminator\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy_P(dup, reinterpret_cast<const char*>(_str), n);\n    return dup;\n  }\n\n  const char* data() const {\n    return 0;\n  }\n\n  size_t size() const {\n    if (!_str) return 0;\n    return strlen_P(reinterpret_cast<const char*>(_str));\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const __FlashStringHelper* _str;\n};\n\ninline FlashStringAdapter adaptString(const __FlashStringHelper* str) {\n  return FlashStringAdapter(str);\n}\n\ntemplate <>\nstruct IsString<const __FlashStringHelper*> : true_type {};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/RamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ConstRamStringAdapter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass RamStringAdapter : public ConstRamStringAdapter {\n public:\n  RamStringAdapter(const char* str) : ConstRamStringAdapter(str) {}\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    size_t n = size() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str, n);\n    return dup;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n};\n\ntemplate <typename TChar>\ninline RamStringAdapter adaptString(const TChar* str) {\n  return RamStringAdapter(reinterpret_cast<const char*>(str));\n}\n\ninline RamStringAdapter adaptString(char* str) {\n  return RamStringAdapter(str);\n}\n\ntemplate <typename TChar>\nstruct IsString<TChar*> {\n  static const bool value = sizeof(TChar) == 1;\n};\n\ntemplate <>\nstruct IsString<void*> {\n  static const bool value = false;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/SizedFlashStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass SizedFlashStringAdapter {\n public:\n  SizedFlashStringAdapter(const __FlashStringHelper* str, size_t sz)\n      : _str(str), _size(sz) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strncmp_P(expected, actual, _size) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    char* dup = pool->allocFrozenString(_size);\n    if (!dup) memcpy_P(dup, (const char*)_str, _size);\n    return dup;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const __FlashStringHelper* _str;\n  size_t _size;\n};\n\ninline SizedFlashStringAdapter adaptString(const __FlashStringHelper* str,\n                                           size_t sz) {\n  return SizedFlashStringAdapter(str, sz);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/SizedRamStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <string.h>  // strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass SizedRamStringAdapter {\n public:\n  SizedRamStringAdapter(const char* str, size_t n) : _str(str), _size(n) {}\n\n  bool equals(const char* expected) const {\n    const char* actual = reinterpret_cast<const char*>(_str);\n    if (!actual || !expected) return actual == expected;\n    return strcmp(actual, expected) == 0;\n  }\n\n  bool isNull() const {\n    return !_str;\n  }\n\n  char* save(MemoryPool* pool) const {\n    if (!_str) return NULL;\n    char* dup = pool->allocFrozenString(_size);\n    if (dup) memcpy(dup, _str, _size);\n    return dup;\n  }\n\n  size_t size() const {\n    return _size;\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const char* _str;\n  size_t _size;\n};\n\ntemplate <typename TChar>\ninline SizedRamStringAdapter adaptString(const TChar* str, size_t size) {\n  return SizedRamStringAdapter(reinterpret_cast<const char*>(str), size);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/StlStringAdapter.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <string>\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass StlStringAdapter {\n public:\n  StlStringAdapter(const std::string& str) : _str(&str) {}\n\n  char* save(MemoryPool* pool) const {\n    size_t n = _str->length() + 1;\n    char* dup = pool->allocFrozenString(n);\n    if (dup) memcpy(dup, _str->c_str(), n);\n    return dup;\n  }\n\n  bool isNull() const {\n    return false;\n  }\n\n  bool equals(const char* expected) const {\n    if (!expected) return false;\n    return *_str == expected;\n  }\n\n  const char* data() const {\n    return _str->data();\n  }\n\n  size_t size() const {\n    return _str->size();\n  }\n\n  bool isStatic() const {\n    return false;\n  }\n\n private:\n  const std::string* _str;\n};\n\ntemplate <>\nstruct IsString<std::string> : true_type {};\n\ninline StlStringAdapter adaptString(const std::string& str) {\n  return StlStringAdapter(str);\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/String.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"ConstRamStringAdapter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass String {\n public:\n  String() : _data(0), _isStatic(true) {}\n  String(const char* data, bool isStaticData = true)\n      : _data(data), _isStatic(isStaticData) {}\n\n  const char* c_str() const {\n    return _data;\n  }\n\n  bool isNull() const {\n    return !_data;\n  }\n\n  bool isStatic() const {\n    return _isStatic;\n  }\n\n  friend bool operator==(String lhs, String rhs) {\n    if (lhs._data == rhs._data) return true;\n    if (!lhs._data) return false;\n    if (!rhs._data) return false;\n    return strcmp(lhs._data, rhs._data) == 0;\n  }\n\n private:\n  const char* _data;\n  bool _isStatic;\n};\n\nclass StringAdapter : public RamStringAdapter {\n public:\n  StringAdapter(const String& str)\n      : RamStringAdapter(str.c_str()), _isStatic(str.isStatic()) {}\n\n  bool isStatic() const {\n    return _isStatic;\n  }\n\n  /*  const char* save(MemoryPool* pool) const {\n      if (_isStatic) return c_str();\n      return RamStringAdapter::save(pool);\n    }*/\n\n private:\n  bool _isStatic;\n};\n\ntemplate <>\nstruct IsString<String> : true_type {};\n\ninline StringAdapter adaptString(const String& str) {\n  return StringAdapter(str);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Strings/StringAdapters.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\ntemplate <typename>\nstruct IsString : false_type {};\n\ntemplate <typename T>\nstruct IsString<const T> : IsString<T> {};\n\ntemplate <typename T>\nstruct IsString<T&> : IsString<T> {};\n}  // namespace ARDUINOJSON_NAMESPACE\n\n#include \"ConstRamStringAdapter.hpp\"\n#include \"RamStringAdapter.hpp\"\n#include \"SizedRamStringAdapter.hpp\"\n\n#if ARDUINOJSON_ENABLE_STD_STRING\n#include \"StlStringAdapter.hpp\"\n#endif\n\n#if ARDUINOJSON_ENABLE_ARDUINO_STRING\n#include \"ArduinoStringAdapter.hpp\"\n#endif\n\n#if ARDUINOJSON_ENABLE_PROGMEM\n#include \"FlashStringAdapter.hpp\"\n#include \"SizedFlashStringAdapter.hpp\"\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/SlotFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Polyfills/assert.hpp\"\n#include \"../Strings/StringAdapters.hpp\"\n#include \"VariantData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename TAdaptedString>\ninline bool slotSetKey(VariantSlot* var, TAdaptedString key, MemoryPool* pool) {\n  if (!var) return false;\n  if (key.isStatic()) {\n    var->setLinkedKey(make_not_null(key.data()));\n  } else {\n    const char* dup = key.save(pool);\n    if (!dup) return false;\n    var->setOwnedKey(make_not_null(dup));\n  }\n  return true;\n}\n\ninline size_t slotSize(const VariantSlot* var) {\n  size_t n = 0;\n  while (var) {\n    n++;\n    var = var->next();\n  }\n  return n;\n}\n\ninline VariantData* slotData(VariantSlot* slot) {\n  return reinterpret_cast<VariantData*>(slot);\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantAs.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Serialization/DynamicStringWriter.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass ArrayRef;\nclass ArrayConstRef;\nclass ObjectRef;\nclass ObjectConstRef;\nclass VariantRef;\nclass VariantConstRef;\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::as<T>()\ntemplate <typename T>\nstruct VariantAs {\n  typedef T type;\n};\n\ntemplate <>\nstruct VariantAs<char*> {\n  typedef const char* type;\n};\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::as<T>()\ntemplate <typename T>\nstruct VariantConstAs {\n  typedef typename VariantAs<T>::type type;\n};\n\ntemplate <>\nstruct VariantConstAs<VariantRef> {\n  typedef VariantConstRef type;\n};\n\ntemplate <>\nstruct VariantConstAs<ObjectRef> {\n  typedef ObjectConstRef type;\n};\n\ntemplate <>\nstruct VariantConstAs<ArrayRef> {\n  typedef ArrayConstRef type;\n};\n\n// ---\n\ntemplate <typename T>\ninline typename enable_if<is_integral<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asIntegral<T>() : T(0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, bool>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asBoolean() : false;\n}\n\ntemplate <typename T>\ninline typename enable_if<is_floating_point<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return _data != 0 ? _data->asFloat<T>() : T(0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, const char*>::value ||\n                              is_same<T, char*>::value,\n                          const char*>::type\nvariantAs(const VariantData* _data) {\n  return _data != 0 ? _data->asString() : 0;\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<ArrayConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<is_same<ObjectConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<is_same<VariantConstRef, T>::value, T>::type\nvariantAs(const VariantData* _data);\n\ntemplate <typename T>\ninline typename enable_if<IsWriteableString<T>::value, T>::type variantAs(\n    const VariantData* _data);\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantAsImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Serialization/DynamicStringWriter.hpp\"\n#include \"VariantFunctions.hpp\"\n#include \"VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline typename enable_if<is_same<ArrayConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return ArrayConstRef(variantAsArray(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<ObjectConstRef, T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  return ObjectConstRef(variantAsObject(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<VariantConstRef, T>::value, T>::type\nvariantAs(const VariantData* _data) {\n  return VariantConstRef(_data);\n}\n\ntemplate <typename T>\ninline typename enable_if<IsWriteableString<T>::value, T>::type variantAs(\n    const VariantData* _data) {\n  const char* cstr = _data != 0 ? _data->asString() : 0;\n  if (cstr) return T(cstr);\n  T s;\n  serializeJson(VariantConstRef(_data), s);\n  return s;\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantContent.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>  // size_t\n\n#include \"../Collection/CollectionData.hpp\"\n#include \"../Numbers/Float.hpp\"\n#include \"../Numbers/Integer.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n//\nenum {\n  VALUE_MASK = 0x7F,\n\n  VALUE_IS_NULL = 0,\n  VALUE_IS_LINKED_RAW = 0x01,\n  VALUE_IS_OWNED_RAW = 0x02,\n  VALUE_IS_LINKED_STRING = 0x03,\n  VALUE_IS_OWNED_STRING = 0x04,\n  VALUE_IS_BOOLEAN = 0x05,\n  VALUE_IS_POSITIVE_INTEGER = 0x06,\n  VALUE_IS_NEGATIVE_INTEGER = 0x07,\n  VALUE_IS_FLOAT = 0x08,\n\n  COLLECTION_MASK = 0x60,\n  VALUE_IS_OBJECT = 0x20,\n  VALUE_IS_ARRAY = 0x40,\n\n  KEY_IS_OWNED = 0x80\n};\n\nstruct RawData {\n  const char *data;\n  size_t size;\n};\n\nunion VariantContent {\n  Float asFloat;\n  UInt asInteger;\n  CollectionData asCollection;\n  const char *asString;\n  struct {\n    const char *data;\n    size_t size;\n  } asRaw;\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantData.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Misc/SerializedValue.hpp\"\n#include \"../Numbers/convertNumber.hpp\"\n#include \"../Polyfills/gsl/not_null.hpp\"\n#include \"VariantContent.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\nclass VariantData {\n  VariantContent _content;  // must be first to allow cast from array to variant\n  uint8_t _flags;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    switch (type()) {\n      case VALUE_IS_FLOAT:\n        return visitor.visitFloat(_content.asFloat);\n\n      case VALUE_IS_ARRAY:\n        return visitor.visitArray(_content.asCollection);\n\n      case VALUE_IS_OBJECT:\n        return visitor.visitObject(_content.asCollection);\n\n      case VALUE_IS_LINKED_STRING:\n      case VALUE_IS_OWNED_STRING:\n        return visitor.visitString(_content.asString);\n\n      case VALUE_IS_OWNED_RAW:\n      case VALUE_IS_LINKED_RAW:\n        return visitor.visitRawJson(_content.asRaw.data, _content.asRaw.size);\n\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return visitor.visitNegativeInteger(_content.asInteger);\n\n      case VALUE_IS_POSITIVE_INTEGER:\n        return visitor.visitPositiveInteger(_content.asInteger);\n\n      case VALUE_IS_BOOLEAN:\n        return visitor.visitBoolean(_content.asInteger != 0);\n\n      default:\n        return visitor.visitNull();\n    }\n  }\n\n  template <typename T>\n  T asIntegral() const;\n\n  template <typename T>\n  T asFloat() const;\n\n  const char *asString() const;\n\n  bool asBoolean() const;\n\n  CollectionData *asArray() {\n    return isArray() ? &_content.asCollection : 0;\n  }\n\n  const CollectionData *asArray() const {\n    return const_cast<VariantData *>(this)->asArray();\n  }\n\n  CollectionData *asObject() {\n    return isObject() ? &_content.asCollection : 0;\n  }\n\n  const CollectionData *asObject() const {\n    return const_cast<VariantData *>(this)->asObject();\n  }\n\n  bool copyFrom(const VariantData &src, MemoryPool *pool) {\n    switch (src.type()) {\n      case VALUE_IS_ARRAY:\n        return toArray().copyFrom(src._content.asCollection, pool);\n      case VALUE_IS_OBJECT:\n        return toObject().copyFrom(src._content.asCollection, pool);\n      case VALUE_IS_OWNED_STRING:\n        return setOwnedString(RamStringAdapter(src._content.asString), pool);\n      case VALUE_IS_OWNED_RAW:\n        return setOwnedRaw(\n            serialized(src._content.asRaw.data, src._content.asRaw.size), pool);\n      default:\n        setType(src.type());\n        _content = src._content;\n        return true;\n    }\n  }\n\n  bool equals(const VariantData &other) const {\n    if (type() != other.type()) return false;\n\n    switch (type()) {\n      case VALUE_IS_LINKED_STRING:\n      case VALUE_IS_OWNED_STRING:\n        return !strcmp(_content.asString, other._content.asString);\n\n      case VALUE_IS_LINKED_RAW:\n      case VALUE_IS_OWNED_RAW:\n        return _content.asRaw.size == other._content.asRaw.size &&\n               !memcmp(_content.asRaw.data, other._content.asRaw.data,\n                       _content.asRaw.size);\n\n      case VALUE_IS_BOOLEAN:\n      case VALUE_IS_POSITIVE_INTEGER:\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return _content.asInteger == other._content.asInteger;\n\n      case VALUE_IS_ARRAY:\n        return _content.asCollection.equalsArray(other._content.asCollection);\n\n      case VALUE_IS_OBJECT:\n        return _content.asCollection.equalsObject(other._content.asCollection);\n\n      case VALUE_IS_FLOAT:\n        return _content.asFloat == other._content.asFloat;\n\n      case VALUE_IS_NULL:\n      default:\n        return true;\n    }\n  }\n\n  bool isArray() const {\n    return (_flags & VALUE_IS_ARRAY) != 0;\n  }\n\n  bool isBoolean() const {\n    return type() == VALUE_IS_BOOLEAN;\n  }\n\n  bool isCollection() const {\n    return (_flags & COLLECTION_MASK) != 0;\n  }\n\n  template <typename T>\n  bool isInteger() const {\n    switch (type()) {\n      case VALUE_IS_POSITIVE_INTEGER:\n        return canStorePositiveInteger<T>(_content.asInteger);\n\n      case VALUE_IS_NEGATIVE_INTEGER:\n        return canStoreNegativeInteger<T>(_content.asInteger);\n\n      default:\n        return false;\n    }\n  }\n\n  bool isFloat() const {\n    return type() == VALUE_IS_FLOAT || type() == VALUE_IS_POSITIVE_INTEGER ||\n           type() == VALUE_IS_NEGATIVE_INTEGER;\n  }\n\n  bool isString() const {\n    return type() == VALUE_IS_LINKED_STRING || type() == VALUE_IS_OWNED_STRING;\n  }\n\n  bool isObject() const {\n    return (_flags & VALUE_IS_OBJECT) != 0;\n  }\n\n  bool isNull() const {\n    return type() == VALUE_IS_NULL;\n  }\n\n  void remove(size_t index) {\n    if (isArray()) _content.asCollection.remove(index);\n  }\n\n  template <typename TAdaptedString>\n  void remove(TAdaptedString key) {\n    if (isObject()) _content.asCollection.remove(key);\n  }\n\n  void setBoolean(bool value) {\n    setType(VALUE_IS_BOOLEAN);\n    _content.asInteger = static_cast<UInt>(value);\n  }\n\n  void setFloat(Float value) {\n    setType(VALUE_IS_FLOAT);\n    _content.asFloat = value;\n  }\n\n  void setLinkedRaw(SerializedValue<const char *> value) {\n    if (value.data()) {\n      setType(VALUE_IS_LINKED_RAW);\n      _content.asRaw.data = value.data();\n      _content.asRaw.size = value.size();\n    } else {\n      setType(VALUE_IS_NULL);\n    }\n  }\n\n  template <typename T>\n  bool setOwnedRaw(SerializedValue<T> value, MemoryPool *pool) {\n    char *dup = adaptString(value.data(), value.size()).save(pool);\n    if (dup) {\n      setType(VALUE_IS_OWNED_RAW);\n      _content.asRaw.data = dup;\n      _content.asRaw.size = value.size();\n      return true;\n    } else {\n      setType(VALUE_IS_NULL);\n      return false;\n    }\n  }\n\n  template <typename T>\n  typename enable_if<is_unsigned<T>::value>::type setInteger(T value) {\n    setUnsignedInteger(value);\n  }\n\n  template <typename T>\n  typename enable_if<is_signed<T>::value>::type setInteger(T value) {\n    setSignedInteger(value);\n  }\n\n  template <typename T>\n  void setSignedInteger(T value) {\n    if (value >= 0) {\n      setPositiveInteger(static_cast<UInt>(value));\n    } else {\n      setNegativeInteger(~static_cast<UInt>(value) + 1);\n    }\n  }\n\n  void setPositiveInteger(UInt value) {\n    setType(VALUE_IS_POSITIVE_INTEGER);\n    _content.asInteger = value;\n  }\n\n  void setNegativeInteger(UInt value) {\n    setType(VALUE_IS_NEGATIVE_INTEGER);\n    _content.asInteger = value;\n  }\n\n  void setLinkedString(const char *value) {\n    if (value) {\n      setType(VALUE_IS_LINKED_STRING);\n      _content.asString = value;\n    } else {\n      setType(VALUE_IS_NULL);\n    }\n  }\n\n  void setNull() {\n    setType(VALUE_IS_NULL);\n  }\n\n  void setOwnedString(not_null<const char *> s) {\n    setType(VALUE_IS_OWNED_STRING);\n    _content.asString = s.get();\n  }\n\n  bool setOwnedString(const char *s) {\n    if (s) {\n      setOwnedString(make_not_null(s));\n      return true;\n    } else {\n      setType(VALUE_IS_NULL);\n      return false;\n    }\n  }\n\n  template <typename T>\n  bool setOwnedString(T value, MemoryPool *pool) {\n    return setOwnedString(value.save(pool));\n  }\n\n  void setUnsignedInteger(UInt value) {\n    setType(VALUE_IS_POSITIVE_INTEGER);\n    _content.asInteger = static_cast<UInt>(value);\n  }\n\n  CollectionData &toArray() {\n    setType(VALUE_IS_ARRAY);\n    _content.asCollection.clear();\n    return _content.asCollection;\n  }\n\n  CollectionData &toObject() {\n    setType(VALUE_IS_OBJECT);\n    _content.asCollection.clear();\n    return _content.asCollection;\n  }\n\n  size_t memoryUsage() const {\n    switch (type()) {\n      case VALUE_IS_OWNED_STRING:\n        return strlen(_content.asString) + 1;\n      case VALUE_IS_OWNED_RAW:\n        return _content.asRaw.size;\n      case VALUE_IS_OBJECT:\n      case VALUE_IS_ARRAY:\n        return _content.asCollection.memoryUsage();\n      default:\n        return 0;\n    }\n  }\n\n  size_t nesting() const {\n    return isCollection() ? _content.asCollection.nesting() : 0;\n  }\n\n  size_t size() const {\n    return isCollection() ? _content.asCollection.size() : 0;\n  }\n\n  VariantData *addElement(MemoryPool *pool) {\n    if (isNull()) toArray();\n    if (!isArray()) return 0;\n    return _content.asCollection.add(pool);\n  }\n\n  VariantData *getElement(size_t index) const {\n    return isArray() ? _content.asCollection.get(index) : 0;\n  }\n\n  template <typename TAdaptedString>\n  VariantData *getMember(TAdaptedString key) const {\n    return isObject() ? _content.asCollection.get(key) : 0;\n  }\n\n  template <typename TAdaptedString>\n  VariantData *getOrAddMember(TAdaptedString key, MemoryPool *pool) {\n    if (isNull()) toObject();\n    if (!isObject()) return 0;\n    VariantData *var = _content.asCollection.get(key);\n    if (var) return var;\n    return _content.asCollection.add(key, pool);\n  }\n\n private:\n  uint8_t type() const {\n    return _flags & VALUE_MASK;\n  }\n\n  void setType(uint8_t t) {\n    _flags &= KEY_IS_OWNED;\n    _flags |= t;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantFunctions.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"VariantData.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename Visitor>\ninline void variantAccept(const VariantData *var, Visitor &visitor) {\n  if (var != 0)\n    var->accept(visitor);\n  else\n    visitor.visitNull();\n}\n\ninline const CollectionData *variantAsArray(const VariantData *var) {\n  return var != 0 ? var->asArray() : 0;\n}\n\ninline const CollectionData *variantAsObject(const VariantData *var) {\n  return var != 0 ? var->asObject() : 0;\n}\n\ninline CollectionData *variantAsObject(VariantData *var) {\n  return var != 0 ? var->asObject() : 0;\n}\n\ninline bool variantCopyFrom(VariantData *dst, const VariantData *src,\n                            MemoryPool *pool) {\n  if (!dst) return false;\n  if (!src) {\n    dst->setNull();\n    return true;\n  }\n  return dst->copyFrom(*src, pool);\n}\n\ninline bool variantEquals(const VariantData *a, const VariantData *b) {\n  if (a == b) return true;\n  if (!a || !b) return false;\n  return a->equals(*b);\n}\n\ninline bool variantIsArray(const VariantData *var) {\n  return var && var->isArray();\n}\n\ninline bool variantIsBoolean(const VariantData *var) {\n  return var && var->isBoolean();\n}\n\ntemplate <typename T>\ninline bool variantIsInteger(const VariantData *var) {\n  return var && var->isInteger<T>();\n}\n\ninline bool variantIsFloat(const VariantData *var) {\n  return var && var->isFloat();\n}\n\ninline bool variantIsString(const VariantData *var) {\n  return var && var->isString();\n}\n\ninline bool variantIsObject(const VariantData *var) {\n  return var && var->isObject();\n}\n\ninline bool variantIsNull(const VariantData *var) {\n  return var == 0 || var->isNull();\n}\n\ninline bool variantSetBoolean(VariantData *var, bool value) {\n  if (!var) return false;\n  var->setBoolean(value);\n  return true;\n}\n\ninline bool variantSetFloat(VariantData *var, Float value) {\n  if (!var) return false;\n  var->setFloat(value);\n  return true;\n}\n\ninline bool variantSetLinkedRaw(VariantData *var,\n                                SerializedValue<const char *> value) {\n  if (!var) return false;\n  var->setLinkedRaw(value);\n  return true;\n}\n\ntemplate <typename T>\ninline bool variantSetOwnedRaw(VariantData *var, SerializedValue<T> value,\n                               MemoryPool *pool) {\n  return var != 0 && var->setOwnedRaw(value, pool);\n}\n\ntemplate <typename T>\ninline bool variantSetSignedInteger(VariantData *var, T value) {\n  if (!var) return false;\n  var->setSignedInteger(value);\n  return true;\n}\n\ninline bool variantSetLinkedString(VariantData *var, const char *value) {\n  if (!var) return false;\n  var->setLinkedString(value);\n  return true;\n}\n\ninline void variantSetNull(VariantData *var) {\n  if (!var) return;\n  var->setNull();\n}\n\ninline bool variantSetOwnedString(VariantData *var, char *value) {\n  if (!var) return false;\n  var->setOwnedString(value);\n  return true;\n}\n\ntemplate <typename T>\ninline bool variantSetOwnedString(VariantData *var, T value, MemoryPool *pool) {\n  return var != 0 && var->setOwnedString(value, pool);\n}\n\ninline bool variantSetUnsignedInteger(VariantData *var, UInt value) {\n  if (!var) return false;\n  var->setUnsignedInteger(value);\n  return true;\n}\n\ninline size_t variantSize(const VariantData *var) {\n  return var != 0 ? var->size() : 0;\n}\n\ninline CollectionData *variantToArray(VariantData *var) {\n  if (!var) return 0;\n  return &var->toArray();\n}\n\ninline CollectionData *variantToObject(VariantData *var) {\n  if (!var) return 0;\n  return &var->toObject();\n}\n\ninline NO_INLINE VariantData *variantAdd(VariantData *var, MemoryPool *pool) {\n  return var != 0 ? var->addElement(pool) : 0;\n}\n\ntemplate <typename TChar>\nNO_INLINE VariantData *variantGetOrCreate(VariantData *var, TChar *key,\n                                          MemoryPool *pool) {\n  return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0;\n}\n\ntemplate <typename TString>\nNO_INLINE VariantData *variantGetOrCreate(VariantData *var, const TString &key,\n                                          MemoryPool *pool) {\n  return var != 0 ? var->getOrAddMember(adaptString(key), pool) : 0;\n}\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantImpl.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Configuration.hpp\"\n#include \"../Numbers/convertNumber.hpp\"\n#include \"../Numbers/parseFloat.hpp\"\n#include \"../Numbers/parseInteger.hpp\"\n#include \"VariantRef.hpp\"\n\n#include <string.h>  // for strcmp\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntemplate <typename T>\ninline T VariantData::asIntegral() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n      return convertPositiveInteger<T>(_content.asInteger);\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return convertNegativeInteger<T>(_content.asInteger);\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return parseInteger<T>(_content.asString);\n    case VALUE_IS_FLOAT:\n      return convertFloat<T>(_content.asFloat);\n    default:\n      return 0;\n  }\n}\n\ninline bool VariantData::asBoolean() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return _content.asInteger != 0;\n    case VALUE_IS_FLOAT:\n      return _content.asFloat != 0;\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return strcmp(\"true\", _content.asString) == 0;\n    default:\n      return false;\n  }\n}\n\n// T = float/double\ntemplate <typename T>\ninline T VariantData::asFloat() const {\n  switch (type()) {\n    case VALUE_IS_POSITIVE_INTEGER:\n    case VALUE_IS_BOOLEAN:\n      return static_cast<T>(_content.asInteger);\n    case VALUE_IS_NEGATIVE_INTEGER:\n      return -static_cast<T>(_content.asInteger);\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return parseFloat<T>(_content.asString);\n    case VALUE_IS_FLOAT:\n      return static_cast<T>(_content.asFloat);\n    default:\n      return 0;\n  }\n}\n\ninline const char *VariantData::asString() const {\n  switch (type()) {\n    case VALUE_IS_LINKED_STRING:\n    case VALUE_IS_OWNED_STRING:\n      return _content.asString;\n    default:\n      return 0;\n  }\n}\n\ntemplate <typename TVariant>\ntypename enable_if<IsVisitable<TVariant>::value, bool>::type VariantRef::set(\n    const TVariant &value) const {\n  VariantConstRef v = value;\n  return variantCopyFrom(_data, v._data, _pool);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ArrayRef>::value, T>::type VariantRef::as()\n    const {\n  return ArrayRef(_pool, _data != 0 ? _data->asArray() : 0);\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ObjectRef>::value, T>::type\nVariantRef::as() const {\n  return ObjectRef(_pool, variantAsObject(_data));\n}\n\ntemplate <typename T>\ninline typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type\nVariantRef::to() const {\n  return ArrayRef(_pool, variantToArray(_data));\n}\n\ntemplate <typename T>\ntypename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type\nVariantRef::to() const {\n  return ObjectRef(_pool, variantToObject(_data));\n}\n\ntemplate <typename T>\ntypename enable_if<is_same<T, VariantRef>::value, VariantRef>::type\nVariantRef::to() const {\n  variantSetNull(_data);\n  return *this;\n}\n\ninline VariantConstRef VariantConstRef::operator[](size_t index) const {\n  return ArrayConstRef(_data != 0 ? _data->asArray() : 0)[index];\n}\n\ninline VariantRef VariantRef::addElement() const {\n  return VariantRef(_pool, variantAdd(_data, _pool));\n}\n\ninline VariantRef VariantRef::getElement(size_t index) const {\n  return VariantRef(_pool, _data != 0 ? _data->getElement(index) : 0);\n}\n\ntemplate <typename TChar>\ninline VariantRef VariantRef::getMember(TChar *key) const {\n  return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0);\n}\n\ntemplate <typename TString>\ninline typename enable_if<IsString<TString>::value, VariantRef>::type\nVariantRef::getMember(const TString &key) const {\n  return VariantRef(_pool, _data != 0 ? _data->getMember(adaptString(key)) : 0);\n}\n\ntemplate <typename TChar>\ninline VariantRef VariantRef::getOrAddMember(TChar *key) const {\n  return VariantRef(_pool, variantGetOrCreate(_data, key, _pool));\n}\n\ntemplate <typename TString>\ninline VariantRef VariantRef::getOrAddMember(const TString &key) const {\n  return VariantRef(_pool, variantGetOrCreate(_data, key, _pool));\n}\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantRef.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include <stddef.h>\n#include <stdint.h>  // for uint8_t\n\n#include \"../Memory/MemoryPool.hpp\"\n#include \"../Misc/Visitable.hpp\"\n#include \"../Operators/VariantOperators.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"VariantAs.hpp\"\n#include \"VariantFunctions.hpp\"\n#include \"VariantRef.hpp\"\n\nnamespace ARDUINOJSON_NAMESPACE {\n\n// Forward declarations.\nclass ArrayRef;\nclass ObjectRef;\n\ntemplate <typename, typename>\nclass MemberProxy;\n\n// Contains the methods shared by VariantRef and VariantConstRef\ntemplate <typename TData>\nclass VariantRefBase {\n public:\n  // Tells wether the variant has the specified type.\n  // Returns true if the variant has type type T, false otherwise.\n  //\n  // bool is<char>() const;\n  // bool is<signed char>() const;\n  // bool is<signed short>() const;\n  // bool is<signed int>() const;\n  // bool is<signed long>() const;\n  // bool is<unsigned char>() const;\n  // bool is<unsigned short>() const;\n  // bool is<unsigned int>() const;\n  // bool is<unsigned long>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_integral<T>::value, bool>::type is()\n      const {\n    return variantIsInteger<T>(_data);\n  }\n  //\n  // bool is<double>() const;\n  // bool is<float>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_floating_point<T>::value, bool>::type is()\n      const {\n    return variantIsFloat(_data);\n  }\n  //\n  // bool is<bool>() const\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, bool>::value, bool>::type is()\n      const {\n    return variantIsBoolean(_data);\n  }\n  //\n  // bool is<const char*>() const;\n  // bool is<char*>() const;\n  // bool is<std::string>() const;\n  // bool is<String>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, const char *>::value ||\n                                      is_same<T, char *>::value ||\n                                      IsWriteableString<T>::value,\n                                  bool>::type\n  is() const {\n    return variantIsString(_data);\n  }\n  //\n  // bool is<ArrayRef> const;\n  // bool is<const ArrayRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<\n      is_same<typename remove_const<T>::type, ArrayRef>::value, bool>::type\n  is() const {\n    return variantIsArray(_data);\n  }\n  //\n  // bool is<ObjectRef> const;\n  // bool is<const ObjectRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<\n      is_same<typename remove_const<T>::type, ObjectRef>::value, bool>::type\n  is() const {\n    return variantIsObject(_data);\n  }\n\n  FORCE_INLINE bool isNull() const {\n    return variantIsNull(_data);\n  }\n\n  FORCE_INLINE bool isUndefined() const {\n    return !_data;\n  }\n\n  FORCE_INLINE size_t memoryUsage() const {\n    return _data ? _data->memoryUsage() : 0;\n  }\n\n  FORCE_INLINE size_t nesting() const {\n    return _data ? _data->nesting() : 0;\n  }\n\n  size_t size() const {\n    return variantSize(_data);\n  }\n\n protected:\n  VariantRefBase(TData *data) : _data(data) {}\n  TData *_data;\n};\n\n// A variant that can be a any value serializable to a JSON value.\n//\n// It can be set to:\n// - a boolean\n// - a char, short, int or a long (signed or unsigned)\n// - a string (const char*)\n// - a reference to a ArrayRef or ObjectRef\nclass VariantRef : public VariantRefBase<VariantData>,\n                   public VariantOperators<VariantRef>,\n                   public Visitable {\n  typedef VariantRefBase<VariantData> base_type;\n  friend class VariantConstRef;\n\n public:\n  // Intenal use only\n  FORCE_INLINE VariantRef(MemoryPool *pool, VariantData *data)\n      : base_type(data), _pool(pool) {}\n\n  // Creates an uninitialized VariantRef\n  FORCE_INLINE VariantRef() : base_type(0), _pool(0) {}\n\n  FORCE_INLINE void clear() const {\n    return variantSetNull(_data);\n  }\n\n  // set(bool value)\n  FORCE_INLINE bool set(bool value) const {\n    return variantSetBoolean(_data, value);\n  }\n\n  // set(double value);\n  // set(float value);\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value,\n      typename enable_if<is_floating_point<T>::value>::type * = 0) const {\n    return variantSetFloat(_data, static_cast<Float>(value));\n  }\n\n  // set(char)\n  // set(signed short)\n  // set(signed int)\n  // set(signed long)\n  // set(signed char)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value,\n      typename enable_if<is_integral<T>::value && is_signed<T>::value>::type * =\n          0) const {\n    return variantSetSignedInteger(_data, value);\n  }\n\n  // set(unsigned short)\n  // set(unsigned int)\n  // set(unsigned long)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T value, typename enable_if<is_integral<T>::value &&\n                                  is_unsigned<T>::value>::type * = 0) const {\n    return variantSetUnsignedInteger(_data, static_cast<UInt>(value));\n  }\n\n  // set(SerializedValue<const char *>)\n  FORCE_INLINE bool set(SerializedValue<const char *> value) const {\n    return variantSetLinkedRaw(_data, value);\n  }\n\n  // set(SerializedValue<std::string>)\n  // set(SerializedValue<String>)\n  // set(SerializedValue<const __FlashStringHelper*>)\n  template <typename T>\n  FORCE_INLINE bool set(\n      SerializedValue<T> value,\n      typename enable_if<!is_same<const char *, T>::value>::type * = 0) const {\n    return variantSetOwnedRaw(_data, value, _pool);\n  }\n\n  // set(const std::string&)\n  // set(const String&)\n  template <typename T>\n  FORCE_INLINE bool set(\n      const T &value,\n      typename enable_if<IsString<T>::value>::type * = 0) const {\n    return variantSetOwnedString(_data, adaptString(value), _pool);\n  }\n\n  // set(char*)\n  // set(const __FlashStringHelper*)\n  template <typename T>\n  FORCE_INLINE bool set(\n      T *value, typename enable_if<IsString<T *>::value>::type * = 0) const {\n    return variantSetOwnedString(_data, adaptString(value), _pool);\n  }\n\n  // set(const char*);\n  FORCE_INLINE bool set(const char *value) const {\n    return variantSetLinkedString(_data, value);\n  }\n\n  // set(VariantRef)\n  // set(VariantConstRef)\n  // set(ArrayRef)\n  // set(ArrayConstRef)\n  // set(ObjectRef)\n  // set(ObjecConstRef)\n  template <typename TVariant>\n  typename enable_if<IsVisitable<TVariant>::value, bool>::type set(\n      const TVariant &value) const;\n\n  // Get the variant as the specified type.\n  //\n  // std::string as<std::string>() const;\n  // String as<String>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<!is_same<T, ArrayRef>::value &&\n                                      !is_same<T, ObjectRef>::value &&\n                                      !is_same<T, VariantRef>::value,\n                                  typename VariantAs<T>::type>::type\n  as() const {\n    return variantAs<T>(_data);\n  }\n  //\n  // ArrayRef as<ArrayRef>() const;\n  // const ArrayRef as<const ArrayRef>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, ArrayRef>::value, T>::type as()\n      const;\n  //\n  // ObjectRef as<ObjectRef>() const;\n  // const ObjectRef as<const ObjectRef>() const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, ObjectRef>::value, T>::type as()\n      const;\n  //\n  // VariantRef as<VariantRef> const;\n  template <typename T>\n  FORCE_INLINE typename enable_if<is_same<T, VariantRef>::value, T>::type as()\n      const {\n    return *this;\n  }\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    variantAccept(_data, visitor);\n  }\n\n  FORCE_INLINE bool operator==(VariantRef lhs) const {\n    return variantEquals(_data, lhs._data);\n  }\n\n  FORCE_INLINE bool operator!=(VariantRef lhs) const {\n    return !variantEquals(_data, lhs._data);\n  }\n\n  // Change the type of the variant\n  //\n  // ArrayRef to<ArrayRef>()\n  template <typename T>\n  typename enable_if<is_same<T, ArrayRef>::value, ArrayRef>::type to() const;\n  //\n  // ObjectRef to<ObjectRef>()\n  template <typename T>\n  typename enable_if<is_same<T, ObjectRef>::value, ObjectRef>::type to() const;\n  //\n  // ObjectRef to<VariantRef>()\n  template <typename T>\n  typename enable_if<is_same<T, VariantRef>::value, VariantRef>::type to()\n      const;\n\n  VariantRef addElement() const;\n\n  FORCE_INLINE VariantRef getElement(size_t) const;\n\n  // getMember(const char*) const\n  // getMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getMember(TChar *) const;\n\n  // getMember(const std::string&) const\n  // getMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value, VariantRef>::type\n  getMember(const TString &) const;\n\n  // getOrAddMember(char*) const\n  // getOrAddMember(const char*) const\n  // getOrAddMember(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE VariantRef getOrAddMember(TChar *) const;\n\n  // getOrAddMember(const std::string&) const\n  // getOrAddMember(const String&) const\n  template <typename TString>\n  FORCE_INLINE VariantRef getOrAddMember(const TString &) const;\n\n  FORCE_INLINE void remove(size_t index) const {\n    if (_data) _data->remove(index);\n  }\n  // remove(char*) const\n  // remove(const char*) const\n  // remove(const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE typename enable_if<IsString<TChar *>::value>::type remove(\n      TChar *key) const {\n    if (_data) _data->remove(adaptString(key));\n  }\n  // remove(const std::string&) const\n  // remove(const String&) const\n  template <typename TString>\n  FORCE_INLINE typename enable_if<IsString<TString>::value>::type remove(\n      const TString &key) const {\n    if (_data) _data->remove(adaptString(key));\n  }\n\n private:\n  MemoryPool *_pool;\n};  // namespace ARDUINOJSON_NAMESPACE\n\nclass VariantConstRef : public VariantRefBase<const VariantData>,\n                        public VariantOperators<VariantConstRef>,\n                        public Visitable {\n  typedef VariantRefBase<const VariantData> base_type;\n  friend class VariantRef;\n\n public:\n  VariantConstRef() : base_type(0) {}\n  VariantConstRef(const VariantData *data) : base_type(data) {}\n  VariantConstRef(VariantRef var) : base_type(var._data) {}\n\n  template <typename Visitor>\n  void accept(Visitor &visitor) const {\n    variantAccept(_data, visitor);\n  }\n\n  // Get the variant as the specified type.\n  //\n  template <typename T>\n  FORCE_INLINE typename VariantConstAs<T>::type as() const {\n    return variantAs<typename VariantConstAs<T>::type>(_data);\n  }\n\n  FORCE_INLINE VariantConstRef operator[](size_t index) const;\n\n  // operator[](const std::string&) const\n  // operator[](const String&) const\n  template <typename TString>\n  FORCE_INLINE\n      typename enable_if<IsString<TString>::value, VariantConstRef>::type\n      operator[](const TString &key) const {\n    return VariantConstRef(objectGet(variantAsObject(_data), adaptString(key)));\n  }\n\n  // operator[](char*) const\n  // operator[](const char*) const\n  // operator[](const __FlashStringHelper*) const\n  template <typename TChar>\n  FORCE_INLINE\n      typename enable_if<IsString<TChar *>::value, VariantConstRef>::type\n      operator[](TChar *key) const {\n    const CollectionData *obj = variantAsObject(_data);\n    return VariantConstRef(obj ? obj->get(adaptString(key)) : 0);\n  }\n};\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantSlot.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#include \"../Polyfills/gsl/not_null.hpp\"\n#include \"../Polyfills/type_traits.hpp\"\n#include \"../Variant/VariantContent.hpp\"\n\n#include <stdint.h>  // int8_t, int16_t\n\nnamespace ARDUINOJSON_NAMESPACE {\n\ntypedef conditional<sizeof(void*) <= 2, int8_t, int16_t>::type VariantSlotDiff;\n\nclass VariantSlot {\n  // CAUTION: same layout as VariantData\n  // we cannot use composition because it adds padding\n  // (+20% on ESP8266 for example)\n  VariantContent _content;\n  uint8_t _flags;\n  VariantSlotDiff _next;\n  const char* _key;\n\n public:\n  // Must be a POD!\n  // - no constructor\n  // - no destructor\n  // - no virtual\n  // - no inheritance\n\n  VariantData* data() {\n    return reinterpret_cast<VariantData*>(&_content);\n  }\n\n  const VariantData* data() const {\n    return reinterpret_cast<const VariantData*>(&_content);\n  }\n\n  VariantSlot* next() {\n    return _next ? this + _next : 0;\n  }\n\n  const VariantSlot* next() const {\n    return const_cast<VariantSlot*>(this)->next();\n  }\n\n  VariantSlot* next(size_t distance) {\n    VariantSlot* slot = this;\n    while (distance--) {\n      if (!slot->_next) return 0;\n      slot += slot->_next;\n    }\n    return slot;\n  }\n\n  const VariantSlot* next(size_t distance) const {\n    return const_cast<VariantSlot*>(this)->next(distance);\n  }\n\n  void setNext(VariantSlot* slot) {\n    _next = VariantSlotDiff(slot ? slot - this : 0);\n  }\n\n  void setNextNotNull(VariantSlot* slot) {\n    ARDUINOJSON_ASSERT(slot != 0);\n    _next = VariantSlotDiff(slot - this);\n  }\n\n  void setOwnedKey(not_null<const char*> k) {\n    _flags |= KEY_IS_OWNED;\n    _key = k.get();\n  }\n\n  void setLinkedKey(not_null<const char*> k) {\n    _flags &= VALUE_MASK;\n    _key = k.get();\n  }\n\n  const char* key() const {\n    return _key;\n  }\n\n  bool ownsKey() const {\n    return (_flags & KEY_IS_OWNED) != 0;\n  }\n\n  void clear() {\n    _next = 0;\n    _flags = 0;\n    _key = 0;\n  }\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/Variant/VariantTo.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\nnamespace ARDUINOJSON_NAMESPACE {\nclass ArrayRef;\nclass ObjectRef;\nclass VariantRef;\n\n// A metafunction that returns the type of the value returned by\n// VariantRef::to<T>()\ntemplate <typename T>\nstruct VariantTo {};\n\ntemplate <>\nstruct VariantTo<ArrayRef> {\n  typedef ArrayRef type;\n};\ntemplate <>\nstruct VariantTo<ObjectRef> {\n  typedef ObjectRef type;\n};\ntemplate <>\nstruct VariantTo<VariantRef> {\n  typedef VariantRef type;\n};\n\n}  // namespace ARDUINOJSON_NAMESPACE\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/compatibility.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n//\n// clang-format off\n\n#ifdef __GNUC__\n\n#define ARDUINOJSON_PRAGMA(x) _Pragma(#x)\n\n#define ARDUINOJSON_COMPILE_ERROR(msg) ARDUINOJSON_PRAGMA(GCC error msg)\n\n#define ARDUINOJSON_STRINGIFY(S) #S\n\n#define ARDUINOJSON_DEPRECATION_ERROR(X, Y) \\\n  ARDUINOJSON_COMPILE_ERROR(ARDUINOJSON_STRINGIFY(X is a Y from ArduinoJson 5. Please see arduinojson.org/upgrade to learn how to upgrade your program to ArduinoJson version 6))\n\n#define StaticJsonBuffer ARDUINOJSON_DEPRECATION_ERROR(StaticJsonBuffer, class)\n#define DynamicJsonBuffer ARDUINOJSON_DEPRECATION_ERROR(DynamicJsonBuffer, class)\n#define JsonBuffer ARDUINOJSON_DEPRECATION_ERROR(JsonBuffer, class)\n#define RawJson ARDUINOJSON_DEPRECATION_ERROR(RawJson, function)\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson/version.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#define ARDUINOJSON_VERSION \"6.10.1\"\n#define ARDUINOJSON_VERSION_MAJOR 6\n#define ARDUINOJSON_VERSION_MINOR 10\n#define ARDUINOJSON_VERSION_REVISION 1\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson.h",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifdef __cplusplus\n\n#include \"ArduinoJson.hpp\"\n\nusing namespace ArduinoJson;\n\n#else\n\n#error ArduinoJson requires a C++ compiler, please change file extension to .cc or .cpp\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/lib/ArduinoJson6/ArduinoJson.hpp",
    "content": "// ArduinoJson - arduinojson.org\n// Copyright Benoit Blanchon 2014-2019\n// MIT License\n\n#pragma once\n\n#ifndef ARDUINOJSON_DEBUG\n#ifdef __clang__\n#pragma clang system_header\n#elif defined __GNUC__\n#pragma GCC system_header\n#endif\n#endif\n\n#include \"ArduinoJson/Namespace.hpp\"\n\n#include \"ArduinoJson/Array/ArrayRef.hpp\"\n#include \"ArduinoJson/Object/ObjectRef.hpp\"\n#include \"ArduinoJson/Variant/VariantRef.hpp\"\n\n#include \"ArduinoJson/Document/DynamicJsonDocument.hpp\"\n#include \"ArduinoJson/Document/StaticJsonDocument.hpp\"\n\n#include \"ArduinoJson/Array/ArrayImpl.hpp\"\n#include \"ArduinoJson/Array/ElementProxy.hpp\"\n#include \"ArduinoJson/Array/Utilities.hpp\"\n#include \"ArduinoJson/Collection/CollectionImpl.hpp\"\n#include \"ArduinoJson/Object/MemberProxy.hpp\"\n#include \"ArduinoJson/Object/ObjectImpl.hpp\"\n#include \"ArduinoJson/Variant/VariantAsImpl.hpp\"\n#include \"ArduinoJson/Variant/VariantImpl.hpp\"\n\n#include \"ArduinoJson/Json/JsonDeserializer.hpp\"\n#include \"ArduinoJson/Json/JsonSerializer.hpp\"\n#include \"ArduinoJson/Json/PrettyJsonSerializer.hpp\"\n#include \"ArduinoJson/MsgPack/MsgPackDeserializer.hpp\"\n#include \"ArduinoJson/MsgPack/MsgPackSerializer.hpp\"\n\n#include \"ArduinoJson/compatibility.hpp\"\n\nnamespace ArduinoJson {\ntypedef ARDUINOJSON_NAMESPACE::ArrayConstRef JsonArrayConst;\ntypedef ARDUINOJSON_NAMESPACE::ArrayRef JsonArray;\ntypedef ARDUINOJSON_NAMESPACE::Float JsonFloat;\ntypedef ARDUINOJSON_NAMESPACE::Integer JsonInteger;\ntypedef ARDUINOJSON_NAMESPACE::ObjectConstRef JsonObjectConst;\ntypedef ARDUINOJSON_NAMESPACE::ObjectRef JsonObject;\ntypedef ARDUINOJSON_NAMESPACE::Pair JsonPair;\ntypedef ARDUINOJSON_NAMESPACE::String JsonString;\ntypedef ARDUINOJSON_NAMESPACE::UInt JsonUInt;\ntypedef ARDUINOJSON_NAMESPACE::VariantConstRef JsonVariantConst;\ntypedef ARDUINOJSON_NAMESPACE::VariantRef JsonVariant;\nusing ARDUINOJSON_NAMESPACE::BasicJsonDocument;\nusing ARDUINOJSON_NAMESPACE::copyArray;\nusing ARDUINOJSON_NAMESPACE::DeserializationError;\nusing ARDUINOJSON_NAMESPACE::deserializeJson;\nusing ARDUINOJSON_NAMESPACE::deserializeMsgPack;\nusing ARDUINOJSON_NAMESPACE::DynamicJsonDocument;\nusing ARDUINOJSON_NAMESPACE::JsonDocument;\nusing ARDUINOJSON_NAMESPACE::serialized;\nusing ARDUINOJSON_NAMESPACE::serializeJson;\nusing ARDUINOJSON_NAMESPACE::serializeJsonPretty;\nusing ARDUINOJSON_NAMESPACE::serializeMsgPack;\nusing ARDUINOJSON_NAMESPACE::StaticJsonDocument;\n\nnamespace DeserializationOption {\nusing ARDUINOJSON_NAMESPACE::NestingLimit;\n}\n}  // namespace ArduinoJson\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/main.cpp",
    "content": "\n/*\nRemora PRU firmware for LinuxCNC\nCopyright (C) 2021  Scott Alford (scotta)\n\nThis program is free software; you can redistribute it and/or\nmodify it under the terms of the GNU General Public License version 2\nof the License.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.\n*/\n\n// MBED includes\n#include \"mbed.h\"\n#include <cstdio>\n#include <cerrno>\n#include <string> \n#include \"FATFileSystem.h\"\n\n#if defined TARGET_LPC176X || TARGET_STM32F1 || TARGET_SPIDER || TARGET_SPIDER_KING || TARGET_MONSTER8 || TARGET_ROBIN_3 || TARGET_MANTA8\n#include \"SDBlockDevice.h\"\n#elif defined TARGET_SKRV2 || TARGET_OCTOPUS_446 || TARGET_BLACK_F407VE || TARGET_OCTOPUS_429 | TARGET_SKRV3\n#include \"SDIOBlockDevice.h\"\n#endif\n\n#include \"configuration.h\"\n#include \"remora.h\"\n\n// libraries\n#include \"ArduinoJson.h\"\n\n// drivers\n#include \"RemoraComms.h\"\n#include \"pin.h\"\n#include \"softPwm.h\"\n\n// threads\n#include \"irqHandlers.h\"\n#include \"interrupt.h\"\n#include \"pruThread.h\"\n#include \"createThreads.h\"\n\n// modules\n#include \"module.h\"\n#include \"blink.h\"\n#include \"debug.h\"\n#include \"digitalPin.h\"\n#include \"encoder.h\"\n#include \"eStop.h\"\n#include \"hardwarePwm.h\"\n#include \"mcp4451.h\"\n#include \"motorPower.h\"\n#include \"pwm.h\"\n#include \"rcservo.h\"\n#include \"resetPin.h\"\n#include \"stepgen.h\"\n#include \"switch.h\"\n#include \"temperature.h\"\n#include \"tmc.h\"\n#include \"qei.h\"\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\n// state machine\nenum State {\n    ST_SETUP = 0,\n    ST_START,\n    ST_IDLE,\n    ST_RUNNING,\n    ST_STOP,\n    ST_RESET,\n    ST_WDRESET\n};\n\nuint8_t resetCnt;\nuint32_t base_freq = PRU_BASEFREQ;\nuint32_t servo_freq = PRU_SERVOFREQ;\n\n// boolean\nvolatile bool PRUreset;\nbool configError = false;\nbool threadsRunning = false;\n\n// pointers to objects with global scope\npruThread* servoThread;\npruThread* baseThread;\npruThread* commsThread;\n\n// unions for RX and TX data\n//volatile rxData_t spiRxBuffer1;  // this buffer is used to check for valid data before moving it to rxData\n//volatile rxData_t spiRxBuffer2;  // this buffer is used to check for valid data before moving it to rxData\nvolatile rxData_t rxData;\nvolatile txData_t txData;\n\n// pointers to data\nvolatile rxData_t*  ptrRxData = &rxData;\nvolatile txData_t*  ptrTxData = &txData;\nvolatile int32_t* ptrTxHeader;  \nvolatile bool*    ptrPRUreset;\nvolatile int32_t* ptrJointFreqCmd[JOINTS];\nvolatile int32_t* ptrJointFeedback[JOINTS];\nvolatile uint8_t* ptrJointEnable;\nvolatile float*   ptrSetPoint[VARIABLES];\nvolatile float*   ptrProcessVariable[VARIABLES];\nvolatile uint16_t* ptrInputs;\nvolatile uint16_t* ptrOutputs;\n\n\n/***********************************************************************\n        OBJECTS etc                                           \n************************************************************************/\n\n// SD card access and Remora communication protocol\n#if defined TARGET_SKRV1_4\n    SDBlockDevice blockDevice(P0_9, P0_8, P0_7, P0_6);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData);\n\n#elif defined TARGET_SKRV2 || TARGET_OCTOPUS_446 || TARGET_BLACK_F407VE || TARGET_OCTOPUS_429 || TARGET_SKRV3\n    SDIOBlockDevice blockDevice;\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PA_4);\n\n#elif defined TARGET_MONSTER8\n    SDBlockDevice blockDevice(PC_12, PC_11, PC_10, PC_9);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PA_4);\n\n#elif defined TARGET_ROBIN_3\n    SDBlockDevice blockDevice(PC_12, PC_11, PC_10, PC_9);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PE_10);  //use PE_10 as \"slave select\"\n\n#elif defined TARGET_ROBIN_E3\n    SDBlockDevice blockDevice(PB_15, PB_14, PB_13, PA_15);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PA_4);\n\n#elif defined TARGET_SKR_MINI_E3\n    SDBlockDevice blockDevice(PA_7, PA_6, PA_5, PA_4);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PC_1);    // use PC_1 as \"slave select\"\n\n#elif defined TARGET_SPIDER\n    SDBlockDevice blockDevice(PA_7, PA_6, PA_5, PA_4);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PC_6);    // use PC_6 as \"slave select\"\n\n#elif defined TARGET_SPIDER_KING\n    SDBlockDevice blockDevice(PA_7, PA_6, PA_5, PA_4);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI2, PB_12);    // use PB_12 as \"slave select\" on SPI2\n\n#elif defined TARGET_MANTA8\n    SDBlockDevice blockDevice(PA_7, PA_6, PA_5, PA_8);  // mosi, miso, sclk, cs\n    RemoraComms* comms = new RemoraComms(ptrRxData, ptrTxData, SPI1, PB_12);    // use PB_12 as \"slave select\"\n\n#endif\n\n// Watchdog\nWatchdog& watchdog = Watchdog::get_instance();\n\n// Json configuration file stuff\nFATFileSystem fileSystem(\"fs\");\nFILE *jsonFile;\nstring strJson;\nDynamicJsonDocument doc(JSON_BUFF_SIZE);\nJsonObject thread;\nJsonObject module;\n\n/***********************************************************************\n        INTERRUPT HANDLERS - add NVIC_SetVector etc to setup()\n************************************************************************/\n\n// Add these to /thread/irqHandlers.h in the TARGET_target\n\n\n/***********************************************************************\n        ROUTINES\n************************************************************************/\n\nvoid readJsonConfig()\n{\n    printf(\"1. Reading json configuration file\\n\");\n\n    // Try to mount the filesystem\n    printf(\"Mounting the filesystem... \");\n    fflush(stdout);\n \n    int err = fileSystem.mount(&blockDevice);\n    printf(\"%s\\n\", (err ? \"Fail :(\" : \"OK\"));\n    if (err) {\n        printf(\"No filesystem found... \");\n        fflush(stdout);\n     }\n\n    // Open the config file\n    printf(\"Opening \\\"/fs/config.txt\\\"... \");\n    fflush(stdout);\n    jsonFile = fopen(\"/fs/config.txt\", \"r+\");\n    printf(\"%s\\n\", (!jsonFile ? \"Fail :(\" : \"OK\"));\n\n    fseek (jsonFile, 0, SEEK_END);\n    int32_t length = ftell (jsonFile);\n    fseek (jsonFile, 0, SEEK_SET);\n\n    printf(\"Json config file lenght = %2d\\n\", length);\n\n    strJson.reserve(length+1);\n\n    while (!feof(jsonFile)) {\n        int c = fgetc(jsonFile);\n        strJson.push_back(c);\n    }\n\n    // Remove comments from next line to print out the JSON config file\n    //printf(\"%s\\n\", strJson.c_str());\n\n    printf(\"\\rClosing \\\"/fs/config.txt\\\"... \");\n    fflush(stdout);\n    fclose(jsonFile);\n}\n\n\nvoid setup()\n{\n    printf(\"\\n2. Setting up DMA and threads\\n\");\n\n    // TODO: we can probably just deinit the blockdevice for all targets....?\n\n    #if defined TARGET_STM32F4\n    // deinitialise the SDIO device to avoid DMA issues with the SPI DMA Slave on the STM32F4\n    blockDevice.deinit();\n    #endif\n\n    #if defined TARGET_SKR_MINI_E3 | TARGET_MANTA8\n    // remove the SD device as we are sharing the SPI with the comms module\n    blockDevice.deinit();\n    #endif\n\n    // initialise the Remora comms \n    comms->init();\n    comms->start();\n}\n\n\nvoid deserialiseJSON()\n{\n    printf(\"\\n3. Parsing json configuration file\\n\");\n\n    const char *json = strJson.c_str();\n\n    // parse the json configuration file\n    DeserializationError error = deserializeJson(doc, json);\n\n    printf(\"Config deserialisation - \");\n\n    switch (error.code())\n    {\n        case DeserializationError::Ok:\n            printf(\"Deserialization succeeded\\n\");\n            break;\n        case DeserializationError::InvalidInput:\n            printf(\"Invalid input!\\n\");\n            configError = true;\n            break;\n        case DeserializationError::NoMemory:\n            printf(\"Not enough memory\\n\");\n            configError = true;\n            break;\n        default:\n            printf(\"Deserialization failed\\n\");\n            configError = true;\n            break;\n    }\n}\n\n\nvoid configThreads()\n{\n    if (configError) return;\n\n    printf(\"\\n4. Config threads\\n\");\n\n    JsonArray Threads = doc[\"Threads\"];\n\n    // create objects from json data\n    for (JsonArray::iterator it=Threads.begin(); it!=Threads.end(); ++it)\n    {\n        thread = *it;\n        \n        const char* configor = thread[\"Thread\"];\n        uint32_t    freq = thread[\"Frequency\"];\n\n        if (!strcmp(configor,\"Base\"))\n        {\n            base_freq = freq;\n            printf(\"Setting BASE thread frequency to %d\\n\", base_freq);\n        }\n        else if (!strcmp(configor,\"Servo\"))\n        {\n            servo_freq = freq;\n            printf(\"Setting SERVO thread frequency to %d\\n\", servo_freq);\n        }\n    }\n}\n\n\nvoid loadModules()\n{\n    if (configError) return;\n\n    printf(\"\\n5. Loading modules\\n\");\n\n    // SPI communication monitoring\n    servoThread->registerModule(comms);\n\n    JsonArray Modules = doc[\"Modules\"];\n\n    // create objects from json data\n    for (JsonArray::iterator it=Modules.begin(); it!=Modules.end(); ++it)\n    {\n        module = *it;\n        \n        const char* thread = module[\"Thread\"];\n        const char* type = module[\"Type\"];\n\n        if (!strcmp(thread,\"Base\"))\n        {\n            printf(\"\\nBase thread object\\n\");\n\n            if (!strcmp(type,\"Stepgen\"))\n            {\n                createStepgen();\n            }\n            else if (!strcmp(type,\"Encoder\"))\n            {\n                createEncoder();\n            }\n            else if (!strcmp(type,\"RCServo\"))\n            {\n                createRCServo();\n            }\n        }\n        else if (!strcmp(thread,\"Servo\"))\n        {\n            printf(\"\\nServo thread object\\n\");\n\n            if (!strcmp(type, \"eStop\"))\n            {\n                createEStop();\n            }\n            else if (!strcmp(type, \"Reset Pin\"))\n            {\n                createResetPin();\n            }\n            else if (!strcmp(type, \"Blink\"))\n            {\n                createBlink();\n            }\n            else if (!strcmp(type,\"Digital Pin\"))\n            {\n                createDigitalPin();\n            }\n            else if (!strcmp(type,\"PWM\"))\n            {\n                createPWM();\n            }\n            else if (!strcmp(type,\"Temperature\"))\n            { \n                createTemperature();\n            }\n            else if (!strcmp(type,\"Switch\"))\n            {\n                createSwitch();\n            }\n            else if (!strcmp(type,\"QEI\"))\n            {\n                createQEI();\n            }\n        }\n        else if (!strcmp(thread,\"On load\"))\n        {\n            printf(\"\\nOn load - run once module\\n\");\n\n\n            if (!strcmp(type,\"MCP4451\")) // digipot\n            {\n\t\t\t\tcreateMCP4451();\n            }\n            else if (!strcmp(type,\"Motor Power\"))\n            {\n                createMotorPower();\n            }\n            else if (!strcmp(type,\"TMC2208\"))\n            {\n                createTMC2208();\n            }\n            else if (!strcmp(type,\"TMC2209\"))\n            {\n                createTMC2209();\n            }\n        }\n    }\n}\n\n\nvoid debugThreadHigh()\n{\n    //Module* debugOnB = new Debug(\"PC_1\", 1);\n    //baseThread->registerModule(debugOnB);\n\n    //Module* debugOnS = new Debug(\"PC_3\", 1);\n    //servoThread->registerModule(debugOnS);\n\n    //Module* debugOnC = new Debug(\"PE_6\", 1);\n    //commsThread->registerModule(debugOnC);\n}\n\nvoid debugThreadLow()\n{\n    //Module* debugOffB = new Debug(\"PC_1\", 0);\n    //baseThread->registerModule(debugOffB); \n\n    //Module* debugOffS = new Debug(\"PC_3\", 0);\n    //servoThread->registerModule(debugOffS);\n\n    //commsThread->startThread();\n    //Module* debugOffC = new Debug(\"PE_6\", 0);\n    //commsThread->registerModule(debugOffC); \n}\n\nint main()\n{\n    \n    enum State currentState;\n    enum State prevState;\n\n    comms->setStatus(false);\n    comms->setError(false);\n    currentState = ST_SETUP;\n    prevState = ST_RESET;\n\n    printf(\"\\nRemora PRU - Programmable Realtime Unit \\n\");\n    printf(\"\\n Mbed-OS6 \\n\");\n    printf(\"\\n Remora-spi Driver \\n\");\n\n    watchdog.start(2000);\n\n    while(1)\n    {\n      // the main loop does very little, keeping the Watchdog serviced and\n      // resetting the rxData buffer if there is a loss of SPI commmunication\n      // with LinuxCNC. Everything else is done via DMA and within the\n      // two threads- Base and Servo threads that run the Modules.\n\n    watchdog.kick();\n\n    switch(currentState){\n        case ST_SETUP:\n            // do setup tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering SETUP state\\n\");\n            }\n            prevState = currentState;\n\n            readJsonConfig();\n            setup();\n            deserialiseJSON();\n            configThreads();\n            createThreads();\n            //debugThreadHigh();\n            loadModules();\n            //debugThreadLow();\n\n            currentState = ST_START;\n            break; \n\n        case ST_START:\n            // do start tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering START state\\n\");\n            }\n            prevState = currentState;\n\n            if (!threadsRunning)\n            {\n                // Start the threads\n                printf(\"\\nStarting the BASE thread\\n\");\n                baseThread->startThread();\n                \n                printf(\"\\nStarting the SERVO thread\\n\");\n                servoThread->startThread();\n\n                threadsRunning = true;\n\n                // wait for threads to read IO before testing for PRUreset\n                //wait(1);\n                //ThisThread::sleep_for(100);\n                wait_us(1000000);\n            }\n\n            if (PRUreset)\n            {\n                // RPi outputs default is high until configured when LinuxCNC spiPRU component is started, PRUreset pin will be high\n                // stay in start state until LinuxCNC is started\n                currentState = ST_START;\n            }\n            else\n            {\n                currentState = ST_IDLE;\n            }\n            \n            break;\n\n\n        case ST_IDLE:\n            // do something when idle\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering IDLE state\\n\");\n            }\n            prevState = currentState;\n\n            // check to see if there there has been SPI errors\n            if (comms->getError())\n            {\n                printf(\"Communication data error\\n\");\n                comms->setError(false);\n            }\n\n            //wait for SPI data before changing to running state\n            if (comms->getStatus())\n            {\n                currentState = ST_RUNNING;\n            }\n\n            if (PRUreset) \n            {\n                currentState = ST_WDRESET;\n            }\n\n            break;\n\n        case ST_RUNNING:\n            // do running tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering RUNNING state\\n\");\n            }\n            prevState = currentState;\n\n            if (comms->getStatus() == false)\n            {\n                currentState = ST_RESET;\n            }\n\n            if (PRUreset) \n            {\n                currentState = ST_WDRESET;\n            }\n\n            break;\n\n        case ST_STOP:\n            // do stop tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering STOP state\\n\");\n            }\n            prevState = currentState;\n\n\n            currentState = ST_STOP;\n            break;\n\n        case ST_RESET:\n            // do reset tasks\n            if (currentState != prevState)\n            {\n                printf(\"\\n## Entering RESET state\\n\");\n            }\n            prevState = currentState;\n\n            // set all of the rxData buffer to 0\n            // rxData.rxBuffer is volatile so need to do this the long way. memset cannot be used for volatile\n            printf(\"   Resetting rxBuffer\\n\");\n            {\n                int n = sizeof(rxData.rxBuffer);\n                while(n-- > 0)\n                {\n                    rxData.rxBuffer[n] = 0;\n                }\n            }\n\n            currentState = ST_IDLE;\n            break;\n\n        case ST_WDRESET:\n            // do a watch dog reset\n            printf(\"\\n## Entering WDRESET state\\n\");\n\n            // force a watchdog reset by looping here\n            while(1){}\n\n            break;\n      }\n\n    comms->SPItasks();\n\n    //ThisThread::sleep_for(LOOP_TIME);\n    //wait(LOOP_TIME);\n    //wait_us(LOOP_TIME * 1000000);\n\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/mbed-os.lib",
    "content": "https://github.com/ARMmbed/mbed-os/#17dc3dc2e6e2817a8bd3df62f38583319f0e4fed"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/mbed_app.json",
    "content": "{\n    \"requires\": [\n        \"bare-metal\",\n        \"rtos-api\", \n        \"sd\",\n        \"filesystem\",\n        \"fat_chan\"\n    ],\n    \n    \"artifact_name\": \"firmware\",\n\n    \"target_overrides\": {\n        \"LPC1768\": {\n            \"target.mbed_app_start\": \"0x4000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"LPC1769\": {\n            \"target.mbed_app_start\": \"0x4000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.features_add\": [\"STORAGE\"],\n            \"target.components_add\" : [\"SD\"]\n        },\n        \n        \"MANTA8\": {\n            \"target.mbed_app_start\": \"0x08002000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PE_8\",\n            \"target.stdio_uart_rx\": \"PE_9\",\n            \"target.c_lib\": \"std\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PA_7\",\n            \"sd.SPI_MISO\": \"PA_6\",\n            \"sd.SPI_CLK\":  \"PA_4\",\n            \"sd.SPI_CS\":   \"PA_8\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"SKRV3\": {\n            \"target.mbed_app_start\": \"0x08020000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n\n        \"SKRV2\": {\n            \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"MONSTER8\": {\n      \n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PC_12\",\n            \"sd.SPI_MISO\": \"PC_11\",\n            \"sd.SPI_CLK\":  \"PC_10\",\n            \"sd.SPI_CS\":   \"PC_9\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"ROBIN_3\": {\n      \n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PC_12\",\n            \"sd.SPI_MISO\": \"PC_11\",\n            \"sd.SPI_CLK\":  \"PC_10\",\n            \"sd.SPI_CS\":   \"PC_9\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"SPIDER_KING\": {\n           \n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PA_7\",\n            \"sd.SPI_MISO\": \"PA_6\",\n            \"sd.SPI_CLK\":  \"PA_5\",\n            \"sd.SPI_CS\":   \"PA_4\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"BLACK_F407VE\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"OCTOPUS_429\": {\n            \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"SPIDER\": {\n           \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PA_7\",\n            \"sd.SPI_MISO\": \"PA_6\",\n            \"sd.SPI_CLK\":  \"PA_5\",\n            \"sd.SPI_CS\":   \"PA_4\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"OCTOPUS_446\": {\n            \"target.mbed_app_start\": \"0x08008000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n        \"BLACK_F407VE\": {\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"]\n        },\n\n        \"ROBIN_E3\": {\n            \"target.mbed_app_start\": \"0x08005000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PB_15\",\n            \"sd.SPI_MISO\": \"PB_14\",\n            \"sd.SPI_CLK\":  \"PB_13\",\n            \"sd.SPI_CS\":   \"PA_15\",\n            \"target.components_add\" : [\"SD\"]\n        },\n        \"SKR_MINI_E3\": {\n            \"target.mbed_app_start\": \"0x08007000\",\n            \"platform.stdio-baud-rate\": 115200,\n            \"target.stdio_uart_tx\": \"PA_9\",\n            \"target.stdio_uart_rx\": \"PA_10\",\n            \"target.features_add\": [\"STORAGE\"],\n            \"sd.SPI_MOSI\": \"PA_7\",\n            \"sd.SPI_MISO\": \"PA_6\",\n            \"sd.SPI_CLK\":  \"PA_5\",\n            \"sd.SPI_CS\":   \"PA_4\",\n            \"target.components_add\" : [\"SD\"]\n        }\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/blink/blink.cpp",
    "content": "#include \"blink.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createBlink()\n{\n    const char* pin = module[\"Pin\"];\n    int frequency = module[\"Frequency\"];\n    \n    printf(\"Make Blink at pin %s\\n\", pin);\n        \n    Module* blink = new Blink(pin, PRU_SERVOFREQ, frequency);\n    servoThread->registerModule(blink);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nBlink::Blink(std::string portAndPin, uint32_t threadFreq, uint32_t freq)\n{\n\n\tthis->periodCount = threadFreq / freq;\n\tthis->blinkCount = 0;\n\tthis->bState = false;\n\n\tthis->blinkPin = new Pin(portAndPin, OUTPUT);\n\tthis->blinkPin->set(bState);\n}\n\nvoid Blink::update(void)\n{\n\t++this->blinkCount;\n\tif (this->blinkCount >= this->periodCount / 2)\n\t{\n\t\tthis->blinkPin->set(this->bState=!this->bState);\n\t\tthis->blinkCount = 0;\n\t}\n}\n\nvoid Blink::slowUpdate(void)\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/blink/blink.h",
    "content": "#ifndef BLINK_H\n#define BLINK_H\n\n#include <cstdint>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createBlink(void);\n\nclass Blink : public Module\n{\n\n\tprivate:\n\n\t\tbool \t\tbState;\n\t\tuint32_t \tperiodCount;\n\t\tuint32_t \tblinkCount;\n\n\t\tPin *blinkPin;\t// class object members - Pin objects\n\n\tpublic:\n\n\t\tBlink(std::string, uint32_t, uint32_t);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/debug/debug.cpp",
    "content": "#include \"debug.h\"\n\n\nDebug::Debug(std::string portAndPin, bool bstate) :\n    bState(bstate)\n{\n\tthis->debugPin = new Pin(portAndPin, OUTPUT);\n}\n\nvoid Debug::update(void)\n{\n\tthis->debugPin->set(bState);\n}\n\nvoid Debug::slowUpdate(void)\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/debug/debug.h",
    "content": "#ifndef DEBUG_H\n#define DEBUG_H\n\n#include <cstdint>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass Debug : public Module\n{\n\n\tprivate:\n\n\t\tbool \t\tbState;\n\n\t\tPin*        debugPin;\t// class object members - Pin objects\n\n\tpublic:\n\n\t\tDebug(std::string, bool);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/digipot/DigipotBase.h",
    "content": "#ifndef DIGIPOTBASE_H\n#define DIGIPOTBASE_H\n\n// adapted from Smoothieware\n\n#include \"modules/module.h\"\n\nclass DigipotBase : public Module\n{\n  protected:\n\n    float factor;\n    float max_current;\n\n  public:\n\n      DigipotBase(){}\n      virtual ~DigipotBase(){}\n\n      virtual void set_current( int channel, float current )= 0;\n      virtual float get_current(int channel)= 0;\n      void set_max_current(float c) { max_current= c; }\n      void set_factor(float f) { factor= f; }\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/digipot/mcp4451.cpp",
    "content": "#include \"mcp4451.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createMCP4451()\n{\n    printf(\"Make MCP4451 Digipot object\\n\");\n\n    const char* sda = module[\"I2C SDA pin\"];\n    const char* scl = module[\"I2C SCL pin\"];\n    int address = module[\"I2C address\"];\n    float maxCurrent = module[\"Max current\"];\n    float factor = module[\"Factor\"];\n    float c0 = module[\"Current 0\"];\n    float c1 = module[\"Current 1\"];\n    float c2 = module[\"Current 2\"];\n    float c3 = module[\"Current 3\"];\n\n    Module* digipot = new MCP4451(sda, scl, address, maxCurrent, factor, c0, c1, c2, c3);\n    digipot->update();\n    delete digipot;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n\nMCP4451::MCP4451(std::string sda, std::string scl, char address, float maxCurrent, float factor, float c0, float c1, float c2, float c3) :\n  sda(sda),\n  scl(scl),\n  address(address),\n  maxCurrent(maxCurrent),\n  factor(factor),\n  c0(c0),\n  c1(c1),\n  c2(c2),\n  c3(c3)\n{\n  this->sclPin = new Pin(this->scl, -1); // dir = -1 so not configured as IO\n  this->sdaPin = new Pin(this->sda, -1);\n\n  // I2C com\n  //this->i2c = new I2C(p9, p10);\n  this->i2c = new I2C(this->sdaPin->pinToPinName(), this->sclPin->pinToPinName());\n  this->i2c->frequency(20000);\n  for (int i = 0; i < 4; i++) this->currents[i] = -1;\n}\n\nMCP4451::~MCP4451()\n{\n    delete this->i2c;\n    delete this->sclPin;\n    delete this->sdaPin;\n}\n\nvoid MCP4451::set_current( int channel, float current)\n{\n    if(current < 0) {\n        currents[channel]= -1;\n        return;\n    }\n    current = min( (float) max( current, 0.0f ), this->maxCurrent );\n    currents[channel] = current;\n    char addr = 0x58 + this->address;\n\n    // Initial setup\n    this->i2c_send( addr, 0x40, 0xff );\n    this->i2c_send( addr, 0xA0, 0xff );\n\n    // Set actual wiper value\n    char addresses[4] = { 0x00, 0x10, 0x60, 0x70 };\n    this->i2c_send( addr, addresses[channel], this->current_to_wiper(current) );\n}\n\nvoid MCP4451::i2c_send( char first, char second, char third )\n{\n    this->i2c->start();\n    this->i2c->write(first);\n    this->i2c->write(second);\n    this->i2c->write(third);\n    this->i2c->stop();\n}\n\nchar MCP4451::current_to_wiper( float current )\n{\n    int c= ceilf(this->factor*current);\n    if(c > 255) c= 255;\n    return c;\n}\n\nvoid MCP4451::update()\n{\n  this->set_max_current(this->maxCurrent);\n  this->set_factor(this->factor);\n\n  this->set_current(0, this->c0);\n  this->set_current(1, this->c1);\n  this->set_current(2, this->c2);\n  this->set_current(3, this->c3);\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/digipot/mcp4451.h",
    "content": "#ifndef MCP4451_H\n#define MCP4451_H\n\n#include \"mbed.h\"\n#include <string>\n\n#include \"module.h\"\n#include \"pin.h\"\n\n#include \"extern.h\"\n\n\nvoid createMCP4451(void);\n\nclass MCP4451 : public Module\n{\n  private:\n\n    std::string scl, sda; // i2c SCL and SDA portAndPin\n    Pin *sclPin, *sdaPin;\n    I2C *i2c;\n\n    char address;       // on the i2c bus, set by address bits A1:A0\n    float c0, c1, c2, c3;\n    float currents[4];  // the mcp4451 only has 4 wipers\n\n    float factor;\n    float maxCurrent;\n\n    void i2c_send(char, char, char);\n    char current_to_wiper(float);\n\n  public:\n\n    MCP4451(std::string, std::string, char, float, float, float, float, float, float);\n    //mcp4451(std::string, std::string, char);\n    ~MCP4451();\n\n    void set_max_current(float c) { maxCurrent= c; }\n    void set_factor(float f) { factor= f; }\n    void set_current(int, float);\n\n    virtual void update(void);           // Module default interface\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/digitalPin/digitalPin.cpp",
    "content": "#include \"digitalPin.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createDigitalPin()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n    const char* mode = module[\"Mode\"];\n    const char* invert = module[\"Invert\"];\n    const char* modifier = module[\"Modifier\"];\n    int dataBit = module[\"Data Bit\"];\n\n    int mod;\n    bool inv;\n\n    if (!strcmp(modifier,\"Open Drain\"))\n    {\n        mod = OPENDRAIN;\n    }\n    else if (!strcmp(modifier,\"Pull Up\"))\n    {\n        mod = PULLUP;\n    }\n    else if (!strcmp(modifier,\"Pull Down\"))\n    {\n        mod = PULLDOWN;\n    }\n    else if (!strcmp(modifier,\"Pull None\"))\n    {\n        mod = PULLNONE;\n    }\n    else\n    {\n        mod = NONE;\n    }\n\n    if (!strcmp(invert,\"True\"))\n    {\n        inv = true;\n    }\n    else inv = false;\n\n    ptrOutputs = &rxData.outputs;\n    ptrInputs = &txData.inputs;\n\n    printf(\"Make Digital %s at pin %s\\n\", mode, pin);\n\n    if (!strcmp(mode,\"Output\"))\n    {\n        //Module* digitalPin = new DigitalPin(*ptrOutputs, 1, pin, dataBit, invert);\n        Module* digitalPin = new DigitalPin(*ptrOutputs, 1, pin, dataBit, inv, mod);\n        servoThread->registerModule(digitalPin);\n    }\n    else if (!strcmp(mode,\"Input\"))\n    {\n        //Module* digitalPin = new DigitalPin(*ptrInputs, 0, pin, dataBit, invert);\n        Module* digitalPin = new DigitalPin(*ptrInputs, 0, pin, dataBit, inv, mod);\n        servoThread->registerModule(digitalPin);\n    }\n    else\n    {\n        printf(\"Error - incorrectly defined Digital Pin\\n\");\n    }\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nDigitalPin::DigitalPin(volatile uint16_t &ptrData, int mode, std::string portAndPin, int bitNumber, bool invert, int modifier) :\n\tptrData(&ptrData),\n\tmode(mode),\n\tportAndPin(portAndPin),\n\tbitNumber(bitNumber),\n    invert(invert),\n\tmodifier(modifier)\n{\n\tthis->pin = new Pin(this->portAndPin, this->mode, this->modifier);\t\t// Input 0x0, Output 0x1\n\tthis->mask = 1 << this->bitNumber;\n}\n\n\nvoid DigitalPin::update()\n{\n\tbool pinState;\n\n\tif (this->mode == 0)\t\t\t\t\t\t\t\t\t// the pin is configured as an input\n\t{\n\t\tpinState = this->pin->get();\n\t\tif(this->invert)\n\t\t{\n\t\t\tpinState = !pinState;\n\t\t}\n\n\t\tif (pinState == 1)\t\t\t\t\t\t\t\t// input is high\n\t\t{\n\t\t\t*(this->ptrData) |= this->mask;\n\t\t}\n\t\telse\t\t\t\t\t\t\t\t\t\t\t// input is low\n\t\t{\n\t\t\t*(this->ptrData) &= ~this->mask;\n\t\t}\n\t}\n\telse\t\t\t\t\t\t\t\t\t\t\t\t// the pin is configured as an output\n\t{\n\t\tpinState = *(this->ptrData) & this->mask;\t\t// get the value of the bit in the data source\n\t\tif(this->invert)\n\t\t{\n\t\t\tpinState = !pinState;\n\t\t}\n\t\tthis->pin->set(pinState);\t\t\t// simple conversion to boolean\n\t}\n}\n\nvoid DigitalPin::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/digitalPin/digitalPin.h",
    "content": "#ifndef DIGITALPIN_H\n#define DIGITALPIN_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createDigitalPin(void);\n\nclass DigitalPin : public Module\n{\n\tprivate:\n\n\t\tvolatile uint16_t *ptrData; \t// pointer to the data source\n\t\tint bitNumber;\t\t\t\t// location in the data source\n\t\tbool invert;\n\t\tint mask;\n\n\t\tint mode;\n        int modifier;\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n        DigitalPin(volatile uint16_t&, int, std::string, int, bool, int);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/eStop/eStop.cpp",
    "content": "#include \"eStop.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createEStop()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    ptrTxHeader = &txData.header;\n\n    printf(\"Make eStop at pin %s\\n\", pin);\n\n    Module* estop = new eStop(*ptrTxHeader, pin);\n    servoThread->registerModule(estop);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\neStop::eStop(volatile int32_t &ptrTxHeader, std::string portAndPin) :\n    ptrTxHeader(&ptrTxHeader),\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0);\t\t// Input 0x0, Output 0x1\n}\n\n\nvoid eStop::update()\n{\n    if (this->pin->get() == 1)\n    {\n        *ptrTxHeader = PRU_ESTOP;\n    }\n    else {\n        *ptrTxHeader = PRU_DATA;\n    }\n}\n\nvoid eStop::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/eStop/eStop.h",
    "content": "#ifndef ESTOP_H\n#define ESTOP_H\n\n#include <cstdint>\n#include <iostream>\n#include <string>\n\n#include \"../../configuration.h\"\n#include \"../../remora.h\"\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createEStop(void);\n\nclass eStop : public Module\n{\n\n\tprivate:\n\n        volatile int32_t *ptrTxHeader;\n\t\tstd::string \tportAndPin;\n\n        Pin *pin;\n\n\n\tpublic:\n\n\t\teStop(volatile int32_t&, std::string);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/encoder/encoder.cpp",
    "content": "#include \"encoder.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createEncoder()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    const char* pinA = module[\"ChA Pin\"];\n    const char* pinB = module[\"ChB Pin\"];\n    const char* pinI = module[\"Index Pin\"];\n    int dataBit = module[\"Data Bit\"];\n    const char* modifier = module[\"Modifier\"];\n\n    printf(\"Creating Quadrature Encoder at pins %s and %s\\n\", pinA, pinB);\n\n    int mod;\n\n    if (!strcmp(modifier,\"Open Drain\"))\n    {\n        mod = OPENDRAIN;\n    }\n    else if (!strcmp(modifier,\"Pull Up\"))\n    {\n        mod = PULLUP;\n    }\n    else if (!strcmp(modifier,\"Pull Down\"))\n    {\n        mod = PULLDOWN;\n    }\n    else if (!strcmp(modifier,\"Pull None\"))\n    {\n        mod = PULLNONE;\n    }\n    else\n    {\n        mod = NONE;\n    }\n    \n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n    ptrInputs = &txData.inputs;\n\n    if (pinI == nullptr)\n    {\n        Module* encoder = new Encoder(*ptrProcessVariable[pv], pinA, pinB, mod);\n        baseThread->registerModule(encoder);\n    }\n    else\n    {\n        printf(\"  Encoder has index at pin %s\\n\", pinI);\n        Module* encoder = new Encoder(*ptrProcessVariable[pv], *ptrInputs, dataBit, pinA, pinB, pinI, mod);\n        baseThread->registerModule(encoder);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nEncoder::Encoder(volatile float &ptrEncoderCount, std::string ChA, std::string ChB, int modifier) :\n\tptrEncoderCount(&ptrEncoderCount),\n\tChA(ChA),\n\tChB(ChB),\n    modifier(modifier)\n{\n\tthis->pinA = new Pin(this->ChA, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinB = new Pin(this->ChB, INPUT, this->modifier);\t\t\t// create Pin\n    this->hasIndex = false;\n\tthis->count = 0;\t\t\t\t\t\t\t\t                // initialise the count to 0\n}\n\nEncoder::Encoder(volatile float &ptrEncoderCount, volatile uint16_t &ptrData, int bitNumber, std::string ChA, std::string ChB, std::string Index, int modifier) :\n\tptrEncoderCount(&ptrEncoderCount),\n    ptrData(&ptrData),\n    bitNumber(bitNumber),\n\tChA(ChA),\n\tChB(ChB),\n    Index(Index),\n    modifier(modifier)\n{\n\tthis->pinA = new Pin(this->ChA, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinB = new Pin(this->ChB, INPUT, this->modifier);\t\t\t// create Pin\n    this->pinI = new Pin(this->Index, INPUT, this->modifier);\t\t// create Pin\n    this->hasIndex = true;\n    this->indexPulse = (PRU_BASEFREQ / PRU_SERVOFREQ) * 3;          // output the index pulse for 3 servo thread periods so LinuxCNC sees it\n    this->indexCount = 0;\n\tthis->count = 0;\t\t\t\t\t\t\t\t                // initialise the count to 0\n    this->pulseCount = 0;                                           // number of base thread periods to pulse the index output    \n    this->mask = 1 << this->bitNumber;\n}\n\nvoid Encoder::update()\n{\n    uint8_t s = this->state & 3;\n\n    if (this->pinA->get()) s |= 4;\n    if (this->pinB->get()) s |= 8;\n\n    switch (s) {\n\t\tcase 0: case 5: case 10: case 15:\n\t\t\tbreak;\n\t\tcase 1: case 7: case 8: case 14:\n\t\t\tcount++; break;\n\t\tcase 2: case 4: case 11: case 13:\n\t\t\tcount--; break;\n\t\tcase 3: case 12:\n\t\t\tcount += 2; break;\n\t\tdefault:\n\t\t\tcount -= 2; break;\n\t}\n\n\tthis->state = (s >> 2);\n\n    if (this->hasIndex)                                     // we have an index pin\n    {\n        // handle index, index pulse and pulse count\n        if (this->pinI->get() && (this->pulseCount == 0))    // rising edge on index pulse\n        {\n            this->indexCount = this->count;                 //  capture the encoder count at the index, send this to linuxCNC for one servo period \n            *(this->ptrEncoderCount) = this->indexCount;\n            this->pulseCount = this->indexPulse;        \n            *(this->ptrData) |= this->mask;                 // set bit in data source high\n        }\n        else if (this->pulseCount > 0)                      // maintain both index output and encoder count for the latch period\n        {\n            this->pulseCount--;                             // decrement the counter\n        }\n        else\n        {\n            *(this->ptrData) &= ~this->mask;                // set bit in data source low\n            *(this->ptrEncoderCount) = this->count;         // update encoder count\n        }\n    }\n    else\n    {\n        *(this->ptrEncoderCount) = this->count;             // update encoder count\n    }\n}\n\n\n// credit to https://github.com/PaulStoffregen/Encoder/blob/master/Encoder.h\n\n//                           _______         _______       \n//               PinA ______|       |_______|       |______ PinA\n// negative <---         _______         _______         __      --> positive\n//               PinB __|       |_______|       |_______|   PinB\n\n\t\t//\tnew\tnew\told\told\n\t\t//\tpinB\tpinA\tpinB\tpinA\tResult\n\t\t//\t----\t----\t----\t----\t------\n\t\t//\t0\t0\t0\t0\tno movement\n\t\t//\t0\t0\t0\t1\t+1\n\t\t//\t0\t0\t1\t0\t-1\n\t\t//\t0\t0\t1\t1\t+2  (assume pinA edges only)\n\t\t//\t0\t1\t0\t0\t-1\n\t\t//\t0\t1\t0\t1\tno movement\n\t\t//\t0\t1\t1\t0\t-2  (assume pinA edges only)\n\t\t//\t0\t1\t1\t1\t+1\n\t\t//\t1\t0\t0\t0\t+1\n\t\t//\t1\t0\t0\t1\t-2  (assume pinA edges only)\n\t\t//\t1\t0\t1\t0\tno movement\n\t\t//\t1\t0\t1\t1\t-1\n\t\t//\t1\t1\t0\t0\t+2  (assume pinA edges only)\n\t\t//\t1\t1\t0\t1\t-1\n\t\t//\t1\t1\t1\t0\t+1\n\t\t//\t1\t1\t1\t1\tno movement\n/*\n\t// Simple, easy-to-read \"documentation\" version :-)\n\t//\n\tvoid update(void) {\n\t\tuint8_t s = state & 3;\n\t\tif (digitalRead(pinA)) s |= 4;\n\t\tif (digitalRead(pinB)) s |= 8;\n\t\tswitch (s) {\n\t\t\tcase 0: case 5: case 10: case 15:\n\t\t\t\tbreak;\n\t\t\tcase 1: case 7: case 8: case 14:\n\t\t\t\tposition++; break;\n\t\t\tcase 2: case 4: case 11: case 13:\n\t\t\t\tposition--; break;\n\t\t\tcase 3: case 12:\n\t\t\t\tposition += 2; break;\n\t\t\tdefault:\n\t\t\t\tposition -= 2; break;\n\t\t}\n\t\tstate = (s >> 2);\n\t}\n*/\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/encoder/encoder.h",
    "content": "#ifndef ENCODER_H\n#define ENCODER_H\n\n#include <cstdint>\n#include <iostream>\n#include <string>\n\n#include \"configuration.h\"\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createEncoder(void);\n\nclass Encoder : public Module\n{\n\n\tprivate:\n\n\t\tstd::string ChA;\t\t\t// physical pin connection\n        std::string ChB;\t\t\t// physical pin connection\n        \n        std::string Index;\t\t\t// physical pin connection\n        bool hasIndex;\n        volatile uint16_t *ptrData; \t// pointer to the data source\n\t\tint bitNumber;\t\t\t\t// location in the data source\n        int mask;\n\n\t\tvolatile float *ptrEncoderCount; \t// pointer to the data source\n\n        int8_t  modifier;\n        uint8_t state;\n        int32_t count;\n        int32_t indexCount;\n        int8_t  indexPulse;\n        int8_t  pulseCount;\n\n\tpublic:\n\n\t\tPin* pinA;      // channel A\n        Pin* pinB;      // channel B\n        Pin* pinI;      // index       \n\n\t\tEncoder(volatile float&, std::string, std::string, int);\n        Encoder(volatile float&, volatile uint16_t&, int, std::string, std::string, std::string, int);\n\n\t\tvirtual void update(void);\t// Module default interface\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/module.cpp",
    "content": "#include \"module.h\"\n\n#include <cstdio>\n\nModule::Module()\n{\n\tthis->counter = 0;\n\tthis->updateCount = 1;\n\tprintf(\"\\nCreating a std module\\n\");\n}\n\n\nModule::Module(int32_t threadFreq, int32_t slowUpdateFreq) :\n\tthreadFreq(threadFreq),\n\tslowUpdateFreq(slowUpdateFreq)\n{\n\tthis->counter = 0;\n\tthis->updateCount = this->threadFreq / this->slowUpdateFreq;\n\tprintf(\"\\nCreating a slower module, updating every %d thread cycles\\n\",this->updateCount);\n}\n\nModule::~Module(){}\n\n\nvoid Module::runModule()\n{\n\t++this->counter;\n\n\tif (this->counter >= this->updateCount)\n\t{\n\t\tthis->slowUpdate();\n\t\tthis->counter = 0;\n\t}\n\n\tthis->update();\n}\n\n\nvoid Module::runModulePost()\n{\n\tthis->updatePost();\n}\n\nvoid Module::update(){}\nvoid Module::updatePost(){}\nvoid Module::slowUpdate(){}\nvoid Module::configure(){}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/module.h",
    "content": "#ifndef MODULE_H\n#define MODULE_H\n\n#include <cstdint>\n\n// Module base class\n// All modules are derived from this base class\n\nclass Module\n{\n\tprotected:\n\n\t\tint32_t threadFreq;\n\t\tint32_t slowUpdateFreq;\n\t\tint32_t updateCount;\n\t\tint32_t counter;\n\n\n\tpublic:\n\n\t\tModule();\t\t\t\t\t// constructor to run the module at the thread frequency\n\t\tModule(int32_t, int32_t);\t// constructor to run the module at a \"slow update frequency\" < thread frequency\n\n\t\tvirtual ~Module();\n\t\tvoid runModule();\t\t\t// the standard interface that the thread runs at the thread frequency, this calls update() at the module frequency\n\t\tvoid runModulePost();\n        virtual void update();\t\t// the standard interface for update of the module - use for stepgen, PWM etc\n\t\tvirtual void updatePost();\n        virtual void slowUpdate();\t// the standard interface for the slow update - use for PID controller etc\n        virtual void configure();   // the standard interface for one off configuration\n\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/motorPower/motorPower.cpp",
    "content": "#include \"motorPower.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createMotorPower()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    printf(\"Make Motor Power at pin %s\\n\", pin);\n\n    Module* motPower = new MotorPower(pin);\n    delete motPower;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nMotorPower::MotorPower(std::string portAndPin) :\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0x1);\t\t// Input 0x0, Output 0x1\n    this->update();\n}\n\n\nvoid MotorPower::update()\n{\n\tthis->pin->set(true);\t\t\t// turn motor power ON\n}\n\nvoid MotorPower::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/motorPower/motorPower.h",
    "content": "#ifndef MOTORPOWER_H\n#define MOTORPOWER_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createMotorPower(void);\n\nclass MotorPower : public Module\n{\n\tprivate:\n\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n        MotorPower(std::string);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/pwm/hardwarePwm.cpp",
    "content": "#include \"hardwarePwm.h\"\n\nusing namespace std;\n\n#define PWMPERIOD 200\n\nHardwarePWM::HardwarePWM(volatile float &ptrPwmPulseWidth, int pwmPeriod, std::string pin) :\n    ptrPwmPulseWidth(&ptrPwmPulseWidth),\n    pwmPeriod(pwmPeriod),\n\tpin(pin)\n{\n    cout << \"Creating Hardware PWM at pin \" << this->pin << endl;\n\n    variablePeriod = false;\n\n    if (pwmPeriod == 0)\n    {\n        this->pwmPeriod = PWMPERIOD;\n    }\n\n    Pin* dummyPin = new Pin(pin, 1);\n    this->pwmPin = dummyPin->hardware_pwm();\n\n    if (this->pwmPin == NULL) {\n        printf(\"  Error: Hardware PWM cannot this pin (Refer to Hardware Documents for Pin Information)\\n\");\n        delete dummyPin;\n        return;\n    }\n\n    this->pwmPin->period_us(this->pwmPeriod);\n}\n\n\nHardwarePWM::HardwarePWM(volatile float &ptrPwmPeriod, volatile float &ptrPwmPulseWidth, int pwmPeriod, std::string pin) :\n    ptrPwmPeriod(&ptrPwmPeriod),\n    ptrPwmPulseWidth(&ptrPwmPulseWidth),\n    pwmPeriod(pwmPeriod),\n\tpin(pin)\n{\n    cout << \"Creating variable frequency Hardware PWM at pin \" << this->pin << endl;\n\n    variablePeriod = true;\n\n    if (pwmPeriod == 0)\n    {\n        this->pwmPeriod = PWMPERIOD;\n    }\n\n    Pin* dummyPin = new Pin(pin, 1);\n    this->pwmPin = dummyPin->hardware_pwm();\n\n    if (this->pwmPin == NULL) {\n        printf(\"  Error: Hardware PWM cannot this pin (Refer to Hardware Documents for Pin Information)\\n\");\n        delete dummyPin;\n        return;\n    }\n\n    this->pwmPin->period_us(this->pwmPeriod);\n}\n\n\nvoid HardwarePWM::update()\n{\n    if (variablePeriod)\n    {\n        if (*(this->ptrPwmPeriod) != 0 && (*(this->ptrPwmPeriod) != this->pwmPeriod))\n        {\n            // PWM period has changed\n            this->pwmPeriod = *(this->ptrPwmPeriod);\n            this->pwmPin->period_us(this->pwmPeriod);\n            this->pwmPulseWidth_us = (this->pwmPeriod * this->pwmPulseWidth) / 100.0;\n            this->pwmPin->pulsewidth_us(this->pwmPulseWidth_us);\n        }\n    }\n\n    if (*(this->ptrPwmPulseWidth) != this->pwmPulseWidth)\n    {\n        // PWM duty has changed\n        this->pwmPulseWidth = *(this->ptrPwmPulseWidth);\n        this->pwmPulseWidth_us = (this->pwmPeriod * this->pwmPulseWidth) / 100.0;\n        this->pwmPin->pulsewidth_us(this->pwmPulseWidth_us);\n    } \n\n    return;\n}\n\n\nvoid HardwarePWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/pwm/hardwarePwm.h",
    "content": "#ifndef HARDWAREPWM_H\n#define HARDWAREPWM_H\n\n#include <string>\n#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\nclass HardwarePWM : public Module\n{\n\tprivate:\n\n\t\tstd::string pin;\t\t\t        // PWM output pin\n\t\tint pwmMax;\t\t\t\t\t        // maximum PWM output\n\t\tint pwmSP;\t\t\t\t\t        // PWM setpoint as a percentage of maxPwm\n\n\t\tPin* dummyPin;\t\t\t\t        // pin object\n        PwmOut *pwmPin;                     // PWM out object\n\n        volatile float *ptrPwmPeriod; \t    // pointer to the data source\n        volatile float *ptrPwmPulseWidth; \t// pointer to the data source\n\n        int pwmPeriod;                      // Period (us)\n        float pwmPulseWidth;                // Pulse width (%)\n        int pwmPulseWidth_us;               // Pulse width (us)\n\n        bool variablePeriod;\n\n\tpublic:\n\n\t\tHardwarePWM(volatile float&, int, std::string);\t\t\t        \n        HardwarePWM(volatile float&, volatile float&, int, std::string);\t\n\n\t\tvirtual void update(void);          // Module default interface\n\t\tvirtual void slowUpdate(void);      // Module default interface\n};\n\n#endif\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/pwm/pwm.cpp",
    "content": "#include \"pwm.h\"\n#include \"hardwarePwm.h\"\n\n#define PID_PWM_MAX 256\t\t// 8 bit resolution\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createPWM()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int sp = module[\"SP[i]\"];\n    int pwmMax = module[\"PWM Max\"];\n    const char* pin = module[\"PWM Pin\"];\n\n    const char* hardware = module[\"Hardware PWM\"];\n    const char* variable = module[\"Variable Freq\"];\n    int period_sp = module[\"Period SP[i]\"];\n    int period = module[\"Period us\"];\n\n    printf(\"Make PWM at pin %s\\n\", pin);\n    \n    ptrSetPoint[sp] = &rxData.setPoint[sp];\n\n    if (!strcmp(hardware,\"True\"))\n    {\n        // Hardware PWM\n        if (!strcmp(variable,\"True\"))\n        {\n            // Variable frequency hardware PWM\n            ptrSetPoint[period_sp] = &rxData.setPoint[period_sp];\n\n            Module* pwm = new HardwarePWM(*ptrSetPoint[period_sp], *ptrSetPoint[sp], period, pin);\n            servoThread->registerModule(pwm);\n        }\n        else\n        {\n            // Fixed frequency hardware PWM\n            Module* pwm = new HardwarePWM(*ptrSetPoint[sp], period, pin);\n            servoThread->registerModule(pwm);\n        }\n    }\n    else\n    {\n        // Software PWM\n        if (pwmMax != 0) // use configuration file value for pwmMax - useful for 12V on 24V systems\n        {\n            Module* pwm = new PWM(*ptrSetPoint[sp], pin, pwmMax);\n            servoThread->registerModule(pwm);\n        }\n        else // use default value of pwmMax\n        {\n            Module* pwm = new PWM(*ptrSetPoint[sp], pin);\n            servoThread->registerModule(pwm);\n        }\n    }\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nPWM::PWM(volatile float &ptrSP, std::string portAndPin) :\n\tptrSP(&ptrSP),\n\tportAndPin(portAndPin)\n{\n\tprintf(\"Creating software PWM @ pin %s\\n\", this->portAndPin.c_str());\n    //cout << \"Creating software PWM @ pin \" << this->portAndPin << endl;\n\n\tthis->pwm = new SoftPWM(this->portAndPin);\n\tthis->pwmMax = PID_PWM_MAX-1;\n\tthis->pwm->setMaxPwm(this->pwmMax);\n}\n\n// use the following constructor when using 12v devices on a 24v system\nPWM::PWM(volatile float &ptrSP, std::string portAndPin, int pwmMax) :\n\tptrSP(&ptrSP),\n\tportAndPin(portAndPin),\n\tpwmMax(pwmMax)\n{\n\tprintf(\"Creating software PWM with PWM Max @ pin %s\\n\", this->portAndPin.c_str());\n    //cout << \"Creating software PWM with PWM Max @ pin \" << this->portAndPin << endl;\n\n\tthis->pwm = new SoftPWM(this->portAndPin);\n\tthis->pwm->setMaxPwm(this->pwmMax);\n}\n\n\n\nvoid PWM::update()\n{\n\tfloat SP;\n\n\t// update the speed SP\n\tthis->SP = *(this->ptrSP);\n\n    // ensure SP is within range. LinuxCNC PID can have -ve command value\n\tif (this->SP > 100) this->SP = 100;\n    if (this->SP < 0) this->SP = 0;\n\n\t// the SP is as a percentage (%)\n\t// scale the pwm output range (0 - pwmMax) = (0 - 100%)\n\n\tSP = this->pwmMax * (this->SP / 100.0);\n\n\tthis->pwm->setPwmSP(int(SP));\n\n\tthis->pwm->update();\n}\n\nvoid PWM::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/pwm/pwm.h",
    "content": "#ifndef PWM_H\n#define PWM_H\n\n#include <cstdint>\n//#include <iostream>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/softPwm/softPwm.h\"\n\n#include \"extern.h\"\n\nvoid createPWM(void);\n\nclass PWM : public Module\n{\n\n\tprivate:\n\n\t\tvolatile float* ptrSP; \t\t\t// pointer to the data source\n\t\tint \t\t\tSP;\n\t\tstd::string \tportAndPin;\n\t\tint \t\t\tpwmMax;\n\n\t\tSoftPWM* \t\tpwm;\t\t\t// pointer to PWM object - output\n\n\n\tpublic:\n\n\t\tPWM(volatile float&, std::string);\n\t\tPWM(volatile float&, std::string, int);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/qei/qei.cpp",
    "content": "#include \"mbed.h\"\n#include \"qei.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createQEI()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    int dataBit = module[\"Data Bit\"];\n    const char* index = module[\"Enable Index\"];\n\n    printf(\"Creating QEI, hardware quadrature encoder interface\\n\");\n\n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n    ptrInputs = &txData.inputs;\n\n    if (!strcmp(index,\"True\"))\n    {\n        printf(\"  Encoder has index\\n\");\n        Module* qei = new QEI(*ptrProcessVariable[pv], *ptrInputs, dataBit);\n        baseThread->registerModule(qei);\n    }\n    else\n    {\n        Module* qei = new QEI(*ptrProcessVariable[pv]);\n        baseThread->registerModule(qei);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nQEI::QEI(volatile float &ptrEncoderCount) :\n\tptrEncoderCount(&ptrEncoderCount)\n{\n    qei = new QEIdriver();\n    this->hasIndex = false;\n}\n\nQEI::QEI(volatile float &ptrEncoderCount, volatile uint16_t &ptrData, int bitNumber) :\n\tptrEncoderCount(&ptrEncoderCount),\n    ptrData(&ptrData),\n    bitNumber(bitNumber)\n{\n    qei = new QEIdriver(true);\n    this->hasIndex = true;\n    this->indexPulse = 100;                             \n\tthis->count = 0;\t\t\t\t\t\t\t\t    \n    this->pulseCount = 0;                               \n    this->mask = 1 << this->bitNumber;\n}\n\n\nvoid QEI::update()\n{\n    this->count = this->qei->get();\n\n    if (this->hasIndex)                                     // we have an index pin\n    {\n        // handle index, index pulse and pulse count\n        if (this->qei->indexDetected && (this->pulseCount == 0))    // index interrupt occured: rising edge on index pulse\n        {\n            *(this->ptrEncoderCount) = this->qei->indexCount;\n            this->pulseCount = this->indexPulse;        \n            *(this->ptrData) |= this->mask;                 // set bit in data source high\n        }\n        else if (this->pulseCount > 0)                      // maintain both index output and encoder count for the latch period\n        {\n            this->qei->indexDetected = false;\n            this->pulseCount--;                             // decrement the counter\n        }\n        else\n        {\n            *(this->ptrData) &= ~this->mask;                // set bit in data source low\n            *(this->ptrEncoderCount) = this->count;         // update encoder count\n        }\n    }\n    else\n    {\n        *(this->ptrEncoderCount) = this->count;             // update encoder count\n    }\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/qei/qei.h",
    "content": "#ifndef QEI_H\n#define QEI_H\n\n#include \"mbed.h\"\n#include <cstdint>\n\n#include \"module.h\"\n#include \"qeiDriver.h\"\n\n#include \"extern.h\"\n\nvoid createQEI(void);\n\nclass QEI : public Module\n{\n\n\tprivate:\n\n        QEIdriver*              qei;\n\n        volatile uint16_t*      ptrData; \t// pointer to the data source\n\t\tint                     bitNumber;\t\t\t\t// location in the data source\n        int                     mask;\n\n\t\tvolatile float*         ptrEncoderCount; \t// pointer to the data source\n\n        bool                    hasIndex;\n        int32_t                 count;\n        int8_t                  indexPulse;\n        int8_t                  pulseCount;\n\n\tpublic:\n\n        QEI(volatile float&);                           // for channel A & B\n        QEI(volatile float&, volatile uint16_t&, int);   // For channels A & B, and index\n\n\t\tvirtual void update(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/rcservo/rcservo.cpp",
    "content": "#include \"rcservo.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createRCServo()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int sp = module[\"SP[i]\"];\n    const char* pin = module[\"Servo Pin\"];\n\n    printf(\"Make RC Servo at pin %s\\n\", pin);\n    \n    ptrSetPoint[sp] = &rxData.setPoint[sp];\n\n    // slow module with 10 hz update\n    int updateHz = 10;\n    Module* rcservo = new RCServo(*ptrSetPoint[sp], pin, PRU_BASEFREQ, updateHz);\n    baseThread->registerModule(rcservo);\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\n\nRCServo::RCServo(volatile float &ptrPositionCmd, std::string pin, int32_t threadFreq, int32_t slowUpdateFreq) :\n\tModule(threadFreq, slowUpdateFreq),\n\tptrPositionCmd(&ptrPositionCmd),\n\tpin(pin),\n\tthreadFreq(threadFreq)\n{\n    printf(\"Creating RC servo\\n\");\n\t//cout << \"Creating RC servo at pin \" << this->pin << endl;\n\n\tthis->servoPin = new Pin(this->pin, OUTPUT);\t\t\t// create Pin\n\n\tthis->T_ms = 20; \t// 50hz\n\tthis->T_compare = this->T_ms * this->threadFreq / 1000;\n\tthis->pinState = false;\n\tthis->counter = 0;\n\tthis->positionCommand = 0;\n\t\n\tthis->t_compare = (this->threadFreq / 1000)*(1 + (int)this->positionCommand / 180);\n}\n\nvoid RCServo::update()\n{\n\tcounter++;\n\n\tif (counter == this->t_compare)\n\t{\n\t\tpinState = false;\t\t// falling edge of pulse\n\t}\n\telse if (counter == this->T_compare)\n\t{\n\t\tpinState = true; \t\t// rising edge of pulse\n\t\tcounter = 0;\n\t}\n\n\tthis->servoPin->set(pinState);\n}\n\nvoid RCServo::slowUpdate()\n{\n\t// the slowUpate is used to update the position set-point\n\n\tthis->positionCommand = *(this->ptrPositionCmd); \n\tint t = this->threadFreq*(180 + (int)this->positionCommand)/(1000*180);\n\tthis->t_compare = (int)t;\n}"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/rcservo/rcservo.h",
    "content": "#ifndef RCSERVO_H\n#define RCSERVO_H\n\n#include <cstdint>\n#include <string>\n//#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createRCServo(void);\n\nclass RCServo : public Module\n{\n\n\tprivate:\n\n\t\tstd::string pin;\t\t\t// physical pin connection\n\t\tint threadFreq;\t\t\t\t// thread frequency\n\t\tint T_ms;\t\t\t\t\t\t\t// servo pulse period\n\t\tint T_compare;\t\t\t\t// thread period counts compare for 20ms (50hz) pulses\n\t\tint t_compare;\t\t\t\t// thread period counts compare for pulse period\n\t\tint counter;\n\n\t\tbool pinState;\t\t\t\t// the state of the output pin\n\n\t\tvolatile float *ptrPositionCmd; \t// pointer to the data source\n\t\tfloat positionCommand;\t// the current servo position command\n\n\n\n\tpublic:\n\n\t\tPin* servoPin;\n\n\t\tRCServo(volatile float&, std::string, int32_t, int32_t);\n\n\t\tvirtual void update(void);\t// Module default interface\n\t\tvirtual void slowUpdate();\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/resetPin/resetPin.cpp",
    "content": "#include \"resetPin.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createResetPin()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n\n    ptrPRUreset = &PRUreset;\n\n    printf(\"Make Reset Pin at pin %s\\n\", pin);\n\n    Module* resetPin = new ResetPin(*ptrPRUreset, pin);\n    servoThread->registerModule(resetPin);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nResetPin::ResetPin(volatile bool &ptrReset, std::string portAndPin) :\n\tptrReset(&ptrReset),\n\tportAndPin(portAndPin)\n{\n\tthis->pin = new Pin(this->portAndPin, 0);\t\t// Input 0x0, Output 0x1\n}\n\n\nvoid ResetPin::update()\n{\n\t*(this->ptrReset) = this->pin->get();\n}\n\nvoid ResetPin::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/resetPin/resetPin.h",
    "content": "#ifndef RESETPIN_H\n#define RESETPIN_H\n\n#include <cstdint>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createResetPin(void);\n\nclass ResetPin : public Module\n{\n\tprivate:\n\n\t\tvolatile bool *ptrReset; \t// pointer to the data source\n\t\tstd::string portAndPin;\n\n\t\tPin *pin;\n\n\tpublic:\n\n\t\tResetPin(volatile bool&, std::string);\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/stepgen/stepgen.cpp",
    "content": "#include \"stepgen.h\"\n\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createStepgen()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int joint = module[\"Joint Number\"];\n    const char* enable = module[\"Enable Pin\"];\n    const char* step = module[\"Step Pin\"];\n    const char* dir = module[\"Direction Pin\"];\n\n    // configure pointers to data source and feedback location\n    ptrJointFreqCmd[joint] = &rxData.jointFreqCmd[joint];\n    ptrJointFeedback[joint] = &txData.jointFeedback[joint];\n    ptrJointEnable = &rxData.jointEnable;\n\n    // create the step generator, register it in the thread\n    Module* stepgen = new Stepgen(base_freq, joint, enable, step, dir, STEPBIT, *ptrJointFreqCmd[joint], *ptrJointFeedback[joint], *ptrJointEnable);\n    baseThread->registerModule(stepgen);\n    baseThread->registerModulePost(stepgen);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nStepgen::Stepgen(int32_t threadFreq, int jointNumber, std::string enable, std::string step, std::string direction, int stepBit, volatile int32_t &ptrFrequencyCommand, volatile int32_t &ptrFeedback, volatile uint8_t &ptrJointEnable) :\n\tjointNumber(jointNumber),\n\tenable(enable),\n\tstep(step),\n\tdirection(direction),\n\tstepBit(stepBit),\n\tptrFrequencyCommand(&ptrFrequencyCommand),\n\tptrFeedback(&ptrFeedback),\n\tptrJointEnable(&ptrJointEnable)\n{\n\tthis->enablePin = new Pin(this->enable, OUTPUT);\t\t\t// create Pins\n\tthis->stepPin = new Pin(this->step, OUTPUT);\n\tthis->directionPin = new Pin(this->direction, OUTPUT);\n    this->rawCount = 0;\n\tthis->DDSaccumulator = 0;\n\tthis->frequencyScale = (float)(1 << this->stepBit) / (float)threadFreq;\n\tthis->mask = 1 << this->jointNumber;\n\tthis->isEnabled = false;\n\tthis->isForward = false;\n}\n\n\nvoid Stepgen::update()\n{\n\t// Use the standard Module interface to run makePulses()\n\tthis->makePulses();\n}\n\nvoid Stepgen::updatePost()\n{\n\tthis->stopPulses();\n}\n\nvoid Stepgen::slowUpdate()\n{\n\treturn;\n}\n\nvoid Stepgen::makePulses()\n{\n\tint32_t stepNow = 0;\n\n\tthis->isEnabled = ((*(this->ptrJointEnable) & this->mask) != 0);\n\n\tif (this->isEnabled == true)  \t\t\t\t\t\t\t\t\t\t\t\t// this Step generator is enables so make the pulses\n\t{\n\t\tthis->enablePin->set(false);                                \t\t\t// Enable the driver - CHANGE THIS TO MAKE THE OUTPUT VALUE CONFIGURABLE???\n\n\t\tthis->frequencyCommand = *(this->ptrFrequencyCommand);            \t\t// Get the latest frequency command via pointer to the data source\n\t\tthis->DDSaddValue = this->frequencyCommand * this->frequencyScale;\t\t// Scale the frequency command to get the DDS add value\n\t\tstepNow = this->DDSaccumulator;                           \t\t\t\t// Save the current DDS accumulator value\n\t\tthis->DDSaccumulator += this->DDSaddValue;           \t  \t\t\t\t// Update the DDS accumulator with the new add value\n\t\tstepNow ^= this->DDSaccumulator;                          \t\t\t\t// Test for changes in the low half of the DDS accumulator\n\t\tstepNow &= (1L << this->stepBit);                         \t\t\t\t// Check for the step bit\n\t\t//this->rawCount = this->DDSaccumulator >> this->stepBit;   \t\t\t\t// Update the position raw count\n\n\t\tif (this->DDSaddValue > 0)\t\t\t\t\t\t\t\t\t\t\t\t// The sign of the DDS add value indicates the desired direction\n\t\t{\n\t\t\tthis->isForward = true;\n\t\t}\n\t\telse //if (this->DDSaddValue < 0)\n\t\t{\n\t\t\tthis->isForward = false;\n\t\t}\n\n\t\tif (stepNow)\n\t\t{\n\t\t\tthis->directionPin->set(this->isForward);             \t\t    // Set direction pin\n\t\t\tthis->stepPin->set(true);\t\t\t\t\t\t\t\t\t\t// Raise step pin - A4988 / DRV8825 stepper drivers only need 200ns setup time\n            if (this->isForward)\n            {\n                ++this->rawCount;\n            }\n            else\n            {\n                --this->rawCount;\n            }\n\t\t\t//*(this->ptrFeedback) = this->DDSaccumulator;                     // Update position feedback via pointer to the data receiver\n            *(this->ptrFeedback) = this->rawCount;\n            this->isStepping = true;\n\t\t}\n\n\n\t}\n\telse\n\t{\n\t\tthis->enablePin->set(true);\n\t}\n\n}\n\nvoid Stepgen::stopPulses()\n{\n\tthis->stepPin->set(false);\t// Reset step pin\n\tthis->isStepping = false;\n}\n\n\nvoid Stepgen::setEnabled(bool state)\n{\n\tthis->isEnabled = state;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/stepgen/stepgen.h",
    "content": "#ifndef STEPGEN_H\n#define STEPGEN_H\n\n#include <cstdint>\n#include <string>\n#include <iostream>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createStepgen(void);\n\nclass Stepgen : public Module\n{\n  private:\n\n    int jointNumber;              \t// LinuxCNC joint number\n    int mask;\n\n    std::string enable, step, direction;\t // physical pins connections\n\n    bool isEnabled;        \t// flag to enable the step generator\n    bool isForward;        \t// current diretion\n        bool isStepping;\n\n    int32_t frequencyCommand;     \t// the joint frequency command generated by LinuxCNC\n    volatile int32_t *ptrFrequencyCommand; \t// pointer to the data source where to get the frequency command\n    int32_t rawCount;             \t// current position raw count - not currently used - mirrors original stepgen.c\n    volatile int32_t *ptrFeedback;       \t// pointer where to put the feedback\n    volatile uint8_t *ptrJointEnable;\n    int32_t DDSaccumulator;       \t// Direct Digital Synthesis (DDS) accumulator\n    float   frequencyScale;\t\t  \t  // frequency scale\n  \tint32_t\tDDSaddValue;\t\t  \t    // DDS accumulator add vdd value\n    int32_t stepBit;                // position in the DDS accumulator that triggers a step pulse\n\n  public:\n\n    Stepgen(int32_t, int, std::string, std::string, std::string, int, volatile int32_t&, volatile int32_t&, volatile uint8_t&);  // constructor\n\n    Pin *enablePin, *stepPin, *directionPin;\t\t// class object members - Pin objects\n\n    virtual void update(void);           // Module default interface\n    virtual void updatePost(void);\n    virtual void slowUpdate(void);\n    void makePulses();\n    void stopPulses();\n    void setEnabled(bool);\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/switch/switch.cpp",
    "content": "#include \"switch.h\"\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createSwitch()\n{\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* pin = module[\"Pin\"];\n    const char* mode = module[\"Mode\"];\n    int pv = module[\"PV[i]\"];\n    float sp = module[\"SP\"];\n\n    printf(\"Make Switch (%s) at pin %s\\n\", mode, pin);\n\n    if (!strcmp(mode,\"On\"))\n    {\n        Module* SoftSwitch = new Switch(sp, *ptrProcessVariable[pv], pin, 1);\n        servoThread->registerModule(SoftSwitch);\n    }\n    else if (!strcmp(mode,\"Off\"))\n    {\n        Module* SoftSwitch = new Switch(sp, *ptrProcessVariable[pv], pin, 0);\n        servoThread->registerModule(SoftSwitch);\n    }\n    else\n    {\n        printf(\"Error - incorrectly defined Switch\\n\");\n    }\n}\n\nSwitch::Switch(float SP, volatile float &ptrPV, std::string portAndPin, bool mode) :\n\tSP(SP),\n\tptrPV(&ptrPV),\n\tportAndPin(portAndPin),\n\tmode(mode)\n{\n    printf(\"Creating a Switch\\n\");\n\t//cout << \"Creating a Switch @ pin \" << this->portAndPin << endl;\n\tint output = 0x1; // an output\n\tthis->pin = new Pin(this->portAndPin, output);\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\nvoid Switch::update()\n{\n\tbool pinState;\n\n\tpinState = this->mode;\n\n\t// update the SP\n\tthis->PV = *(this->ptrPV);\n\n\tif (this->PV > this->SP)\n\t{\n\t\tthis->pin->set(pinState);\n\t}\n\telse\n\t{\n\t\tpinState = !pinState;\n\t\tthis->pin->set(pinState);\n\t}\n\n}\n\n\nvoid Switch::slowUpdate()\n{\n\treturn;\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/switch/switch.h",
    "content": "#ifndef SWITCH_H\n#define SWITCH_H\n\n#include <cstdint>\n//#include <iostream>\n#include <string>\n\n#include \"modules/module.h\"\n#include \"drivers/pin/pin.h\"\n\n#include \"extern.h\"\n\nvoid createSwitch(void);\n\nclass Switch : public Module\n{\n\n\tprivate:\n\n\t\tvolatile float* ptrPV; \t\t\t// pointer to the data source\n\t\tfloat \t\t\tPV;\n\t\tfloat \t\t\tSP;\n\t\tbool\t\t\tmode;\t\t\t// 0 switch off, 1 switch on\n\t\tstd::string \tportAndPin;\n\n\t\tPin \t\t\t*pin;\n\n\n\tpublic:\n\n\t\tSwitch(float, volatile float&, std::string, bool);\n\n\t\tvirtual void update(void);\n\t\tvirtual void slowUpdate(void);\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/temperature/temperature.cpp",
    "content": "#include \"temperature.h\"\n\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\n\nvoid createTemperature()\n{\n    printf(\"Make Temperature measurement object\\n\");\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    int pv = module[\"PV[i]\"];\n    const char* sensor = module[\"Sensor\"];\n\n    ptrProcessVariable[pv]  = &txData.processVariable[pv];\n\n    if (!strcmp(sensor, \"Thermistor\"))\n    {\n        const char* pinSensor = module[\"Thermistor\"][\"Pin\"];\n        float beta =  module[\"Thermistor\"][\"beta\"];\n        int r0 = module[\"Thermistor\"][\"r0\"];\n        int t0 = module[\"Thermistor\"][\"t0\"];\n\n        // slow module with 1 hz update\n        int updateHz = 1;\n        Module* temperature = new Temperature(*ptrProcessVariable[pv], PRU_SERVOFREQ, updateHz, sensor, pinSensor, beta, r0, t0);\n        servoThread->registerModule(temperature);\n    }\n}\n\n/***********************************************************************\n*                METHOD DEFINITIONS                                    *\n************************************************************************/\n\nTemperature::Temperature(volatile float &ptrFeedback, int32_t threadFreq, int32_t slowUpdateFreq, std::string sensorType, std::string pinSensor, float beta, int r0, int t0) :\n  Module(threadFreq, slowUpdateFreq),\n  ptrFeedback(&ptrFeedback),\n  sensorType(sensorType),\n  pinSensor(pinSensor),\n\tbeta(beta),\n\tr0(r0),\n\tt0(t0)\n{\n    if (this->sensorType == \"Thermistor\")\n    {\n        printf(\"Creating Thermistor Tempearture measurement @ pin %s\\n\", this->pinSensor.c_str());\n        //cout <<\"Creating Thermistor Tempearture measurement @ pin \" << this->pinSensor << endl;\n        this->Sensor = new Thermistor(this->pinSensor, this->beta, this->r0, this->t0);\n    }\n    // TODO: Add more sensor types as needed\n\n    // Take some readings to get the ADC up and running before moving on\n    this->slowUpdate();\n    this->slowUpdate();\n    printf(\"Start temperature = %f\\n\", this->temperaturePV);\n    //cout << \"Start temperature = \" << this->temperaturePV << endl;\n}\n\nvoid Temperature::update()\n{\n  return;\n}\n\nvoid Temperature::slowUpdate()\n{\n\tthis->temperaturePV = this->Sensor->getTemperature();\n\n    // check for disconnected temperature sensor\n    if (this->temperaturePV > 0)\n    {\n        *(this->ptrFeedback) = this->temperaturePV;\n    }\n    else\n    {\n        printf(\"Temperature sensor error, pin %s reading = %f\\n\", this->pinSensor.c_str(), this->temperaturePV);\n        //cout << \"Temperature sensor error, pin \" << this->pinSensor << \" reading = \" << this->temperaturePV << endl;\n        *(this->ptrFeedback) = 999;\n    }\n\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/temperature/temperature.h",
    "content": "#ifndef TEMPERATURE_H\n#define TEMPERATURE_H\n\n#include <cstdint>\n#include <string>\n//#include <iostream>\n\n#include \"modules/module.h\"\n#include \"sensors/tempSensor.h\"\n#include \"sensors/thermistor/thermistor.h\"\n\n#include \"extern.h\"\n\nvoid createTemperature(void);\n\nclass Temperature : public Module\n{\n  private:\n\n    std::string sensorType;       // temperature sensor type\n    std::string pinSensor;\t             // physical pins connections\n\n    volatile float* ptrFeedback;       \t   // pointer where to put the feedback\n\n    float temperaturePV;\n\n    // thermistor parameters\n    float beta;\n    float r0;\n\t\tfloat t0;\n\n  public:\n\n    Temperature(volatile float&, int32_t, int32_t, std::string, std::string, float, int, int);  // Thermistor type constructor\n\n    TempSensor* Sensor;\n\n    virtual void update(void);           // Module default interface\n    virtual void slowUpdate(void);\n};\n\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/tmc/tmc.h",
    "content": "#ifndef TMCMODULE_H\n#define TMCMODULE_H\n\n#include \"mbed.h\"\n#include <cstdint>\n#include <string>\n\n#include \"module.h\"\n#include \"/TMCStepper/TMCStepper.h\"\n\n#include \"extern.h\"\n\n\nvoid createTMC2208(void);\nvoid createTMC2209(void);\n\nclass TMC : public Module\n{\n  protected:\n\n    float       Rsense;\n\n  public:\n\n    virtual void update(void) = 0;           // Module default interface\n    virtual void configure(void) = 0;\n};\n\n\nclass TMC2208 : public TMC\n{\n  protected:\n\n    std::string rxtxPin;     // default to half duplex\n    uint16_t    mA;\n    uint16_t    microsteps;\n    bool        stealth;\n\n    TMC2208Stepper* driver;\n\n  public:\n\n    // SW Serial pin, Rsense, mA, microsteps, stealh\n    TMC2208(std::string, float, uint16_t, uint16_t, bool);\n    ~TMC2208();\n\n    void update(void);           // Module default interface\n    void configure(void);\n};\n\n\nclass TMC2209 : public TMC\n{\n  protected:\n\n    std::string rxtxPin;     // default to half duplex\n    uint16_t    mA;\n    uint16_t    microsteps;\n    bool        stealth;\n    uint8_t     addr;\n    uint16_t    stall;\n\n    TMC2209Stepper* driver;\n\n  public:\n\n    // SW Serial pin, Rsense, addr, mA, microsteps, stealh, hybrid, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    ~TMC2209();\n\n    void update(void);           // Module default interface\n    void configure(void);\n};\n\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/tmc/tmc2208.cpp",
    "content": "\n#include \"tmc.h\"\n#include <cstdint>\n\n#define TOFF_VALUE  4 // [1... 15]\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createTMC2208()\n{\n    printf(\"Make TMC2208\\n\");\n\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* RxPin = module[\"RX pin\"];\n    float RSense = module[\"RSense\"];\n    uint8_t address = module[\"Address\"];\n    uint16_t current = module[\"Current\"];\n    uint16_t microsteps = module[\"Microsteps\"];\n    const char* stealth = module[\"Stealth chop\"];\n    uint16_t stall = module[\"Stall sensitivity\"];\n\n    bool stealthchop;\n\n    if (!strcmp(stealth, \"on\"))\n    {\n        stealthchop = true;\n    }\n    else\n    {\n        stealthchop = false;   \n    }\n\n    // SW Serial pin, RSense, mA, microsteps, stealh\n    // TMC2208(std::string, float, uint8_t, uint16_t, uint16_t, bool);\n    Module* tmc = new TMC2208(RxPin, RSense, current, microsteps, stealthchop);\n\n    printf(\"\\nStarting the COMMS thread\\n\");\n    commsThread->startThread();\n    commsThread->registerModule(tmc);\n\n    tmc->configure();\n\n    printf(\"\\nStopping the COMMS thread\\n\");\n    commsThread->stopThread();\n    commsThread->unregisterModule(tmc);\n\n    delete tmc;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n    // SW Serial pin, RSense, mA, microsteps, stealh, hybrid\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool);\nTMC2208::TMC2208(std::string rxtxPin, float Rsense, uint16_t mA, uint16_t microsteps, bool stealth) :\n    rxtxPin(rxtxPin),\n    mA(mA),\n    microsteps(microsteps),\n    stealth(stealth)\n{\n    this->Rsense = Rsense;\n    this->driver = new TMC2208Stepper(this->rxtxPin, this->rxtxPin, this->Rsense);\n}\n\nTMC2208::~TMC2208()\n{\n    delete this->driver;\n}\n\nvoid TMC2208::configure()\n{\n    uint16_t result;\n\n    driver->begin();\n    \n    printf(\"Testing connection to TMC driver...\");\n    result = driver->test_connection();\n    if (result) {\n        printf(\"failed!\\n\");\n        printf(\"Likely cause: \");\n        switch(result) {\n            case 1: printf(\"loose connection\\n\"); break;\n            case 2: printf(\"no power\\n\"); break;\n        }\n        printf(\"  Fix the problem and reset board.\\n\");\n        //abort();\n    }\n    else   \n    {\n        printf(\"OK\\n\");\n    }\n\n\n    // Sets the slow decay time (off time) [1... 15]. This setting also limits\n    // the maximum chopper frequency. For operation with StealthChop,\n    // this parameter is not used, but it is required to enable the motor.\n    // In case of operation with StealthChop only, any setting is OK.\n    driver->toff(TOFF_VALUE);\n\n    // Comparator blank time. This time needs to safely cover the switching\n    // event and the duration of the ringing on the sense resistor. For most\n    // applications, a setting of 16 or 24 is good. For highly capacitive\n    // loads, a setting of 32 or 40 will be required.\n    driver->blank_time(24);\n\n    driver->rms_current(this->mA);\n    driver->microsteps(this->microsteps);\n\n    // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!\n    driver->en_spreadCycle(!this->stealth);            \n\n    // Needed for StealthChop\n    driver->pwm_autoscale(true);             \n\n     driver->iholddelay(10);\n\n    driver->TPOWERDOWN(128);    // ~2s until driver lowers to hold current\n    \n}\n\nvoid TMC2208::update()\n{\n    this->driver->SWSerial->tickerHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/modules/tmc/tmc2209.cpp",
    "content": "\n#include \"tmc.h\"\n#include <cstdint>\n\n#define TOFF_VALUE  4 // [1... 15]\n\n/***********************************************************************\n                MODULE CONFIGURATION AND CREATION FROM JSON     \n************************************************************************/\nvoid createTMC2209()\n{\n    printf(\"Make TMC2209\\n\");\n\n    const char* comment = module[\"Comment\"];\n    printf(\"%s\\n\",comment);\n\n    const char* RxPin = module[\"RX pin\"];\n    float RSense = module[\"RSense\"];\n    uint8_t address = module[\"Address\"];\n    uint16_t current = module[\"Current\"];\n    uint16_t microsteps = module[\"Microsteps\"];\n    const char* stealth = module[\"Stealth chop\"];\n    uint16_t stall = module[\"Stall sensitivity\"];\n\n    bool stealthchop;\n\n    if (!strcmp(stealth, \"on\"))\n    {\n        stealthchop = true;\n    }\n    else\n    {\n        stealthchop = false;   \n    }\n\n    // SW Serial pin, RSense, addr, mA, microsteps, stealh, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\n    Module* tmc = new TMC2209(RxPin, RSense, address, current, microsteps, stealthchop, stall);\n    commsThread->registerModule(tmc);\n\n    printf(\"\\nStarting the COMMS thread\\n\");\n    commsThread->startThread(); \n    tmc->configure();\n\n    printf(\"\\nStopping the COMMS thread\\n\");\n    commsThread->stopThread();\n    commsThread->unregisterModule(tmc);\n    delete tmc;\n}\n\n\n/***********************************************************************\n                METHOD DEFINITIONS\n************************************************************************/\n\n    // SW Serial pin, RSense, addr, mA, microsteps, stealh, hybrid, stall\n    // TMC2209(std::string, float, uint8_t, uint16_t, uint16_t, bool, uint16_t);\nTMC2209::TMC2209(std::string rxtxPin, float Rsense, uint8_t addr, uint16_t mA, uint16_t microsteps, bool stealth, uint16_t stall) :\n    rxtxPin(rxtxPin),\n    mA(mA),\n    microsteps(microsteps),\n    stealth(stealth),\n    addr(addr),\n    stall(stall)\n{\n    this->Rsense = Rsense;\n    this->driver = new TMC2209Stepper(this->rxtxPin, this->rxtxPin, this->Rsense, this->addr);\n}\n\nTMC2209::~TMC2209()\n{\n    delete this->driver;\n}\n\nvoid TMC2209::configure()\n{\n    uint16_t result;\n\n    driver->begin();\n    \n    printf(\"Testing connection to TMC driver...\");\n    result = driver->test_connection();\n    if (result) {\n        printf(\"failed!\\n\");\n        printf(\"Likely cause: \");\n        switch(result) {\n            case 1: printf(\"loose connection\\n\"); break;\n            case 2: printf(\"no power\\n\"); break;\n        }\n        printf(\"  Fix the problem and reset board.\\n\");\n        //abort();\n    }\n    else   \n    {\n        printf(\"OK\\n\");\n    }\n\n\n    // Sets the slow decay time (off time) [1... 15]. This setting also limits\n    // the maximum chopper frequency. For operation with StealthChop,\n    // this parameter is not used, but it is required to enable the motor.\n    // In case of operation with StealthChop only, any setting is OK.\n    driver->toff(TOFF_VALUE);\n\n    // Comparator blank time. This time needs to safely cover the switching\n    // event and the duration of the ringing on the sense resistor. For most\n    // applications, a setting of 16 or 24 is good. For highly capacitive\n    // loads, a setting of 32 or 40 will be required.\n    driver->blank_time(24);\n\n    driver->rms_current(this->mA);\n    driver->microsteps(this->microsteps);\n\n    // Lower threshold velocity for switching on smart energy CoolStep and StallGuard to DIAG output\n    driver->TCOOLTHRS(0xFFFFF); // 20bit max\n    \n    // CoolStep lower threshold [0... 15].\n    // If SG_RESULT goes below this threshold, CoolStep increases the current to both coils.\n    // 0: disable CoolStep\n    driver->semin(5);\n\n    // CoolStep upper threshold [0... 15].\n    // If SG is sampled equal to or above this threshold enough times,\n    // CoolStep decreases the current to both coils.\n    driver->semax(2);\n\n    // Sets the number of StallGuard2 readings above the upper threshold necessary\n    // for each current decrement of the motor current.\n    driver->sedn(0b01);\n\n    // Toggle spreadCycle on TMC2208/2209/2224: default false, true: much faster!!!!\n    driver->en_spreadCycle(!this->stealth);            \n    \n    // Needed for StealthChop\n    driver->pwm_autoscale(true);             \n\n    // StallGuard is only possible if StealthChop is enabled\n    if (this->stealth && this->stall)\n    {\n        // StallGuard4 threshold [0... 255] level for stall detection. It compensates for\n        // motor specific characteristics and controls sensitivity. A higher value gives a higher\n        // sensitivity. A higher value makes StallGuard4 more sensitive and requires less torque to\n        // indicate a stall. The double of this value is compared to SG_RESULT.\n        // The stall output becomes active if SG_RESULT fall below this value.\n        driver->SGTHRS(this->stall);             \n    }\n\n    driver->iholddelay(10);\n\n    driver->TPOWERDOWN(128);    // ~2s until driver lowers to hold current\n    \n}\n\nvoid TMC2209::update()\n{\n    this->driver->SWSerial->tickerHandler();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/remora.h",
    "content": "#ifndef REMORA_H\n#define REMORA_H\n#pragma pack(push, 1)\n\n\ntypedef union\n{\n  // this allow structured access to the incoming SPI data without having to move it\n  struct\n  {\n    uint8_t rxBuffer[SPI_BUFF_SIZE];\n  };\n  struct\n  {\n    int32_t header;\n    volatile int32_t jointFreqCmd[JOINTS]; \t// Base thread commands ?? - basically motion\n    float setPoint[VARIABLES];\t\t  // Servo thread commands ?? - temperature SP, PWM etc\n    uint8_t jointEnable;\n    uint16_t outputs;\n    uint8_t spare0;\n  };\n} rxData_t;\n\nextern volatile rxData_t rxData;\n\n\ntypedef union\n{\n  // this allow structured access to the out going SPI data without having to move it\n  struct\n  {\n    uint8_t txBuffer[SPI_BUFF_SIZE];\n  };\n  struct\n  {\n    int32_t header;\n    int32_t jointFeedback[JOINTS];\t  // Base thread feedback ??\n    float processVariable[VARIABLES];\t\t     // Servo thread feedback ??\n\tuint16_t inputs;\n  };\n} txData_t;\n\nextern volatile txData_t txData;\n\n\n#pragma pack(pop)\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/sensors/tempSensor.h",
    "content": "#ifndef TEMPSENSOR_H\n#define TEMPSENSOR_H\n\n// Base class for all temperature sensor classes\n\nclass TempSensor\n{\n\tpublic:\n\t\tvirtual ~TempSensor() {}\n\n\t\t// Return temperature in degrees Celsius.\n\t\tvirtual float getTemperature() { return -1.0F; }\n\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/sensors/thermistor/thermistor.cpp",
    "content": "#include \"thermistor.h\"\n\n\nThermistor::Thermistor(std::string pin, float beta, int r0, int t0) :\n\tpin(pin),\n\tbeta(beta),\n\tr0(r0),\n\tt0(t0)\n{\n\t// Thermistor math\n\tthis->j = (1.0F / this->beta);\n\tthis->k = (1.0F / (this->t0 + 273.15F));\n\n\tthis->thermistorPin = new Pin(this->pin, INPUT);\n    this->adc = new AnalogIn(this->thermistorPin->pinToPinName());\n\tthis->r1 = 0;\n\tthis->r2 = 4700;\n}\n\n// Use FastAnalogIn library to get ADC value\nint Thermistor::newThermistorReading()\n{\n\treturn this->adc->read_u16();\n}\n\n// This is the workhorse routine that calculates the temperature\n// using the Steinhart-Hart equation for thermistors\n// https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation\nfloat Thermistor::adcValueToTemperature()\n{\n\tfloat adcValue = this->newThermistorReading();\n\tfloat t;\n\n\t// resistance of the thermistor in ohms\n\tfloat r = this->r2 / ((65536.0F / adcValue) - 1.0F);\n\n\n\tif (this->r1 > 0.0F) r = (this->r1 * r) / (this->r1 - r);\n\n\t// use Beta value\n\tt= (1.0F / (this->k + (this->j * logf(r / this->r0)))) - 273.15F;\n\n\treturn t;\n}\n\n\nfloat Thermistor::getTemperature()\n{\n\t// This is the standard interface\n\treturn this->adcValueToTemperature();\n}\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/sensors/thermistor/thermistor.h",
    "content": "#ifndef THERMISTOR_H\n#define THERMISTOR_H\n\n#include <stdint.h>\n#include <string>\n\n#include \"sensors/tempSensor.h\"\n#include \"drivers/pin/pin.h\"\n\n// Derived class from Tempsensor\n\nclass Thermistor : public TempSensor\n{\n\tprivate:\n\n\t\tstd::string pin;\n\n        AnalogIn *adc;\n\n\t\tfloat temperatureMax, temperatureMin;\n\t\tbool useSteinhartHart;\n\n\t\t// Thermistor computation settings using beta, not used if using Steinhart-Hart\n\t\tfloat r0;\n\t\tfloat t0;\n\n\t\t// on board resistor settings\n\t\tint r1;\n\t\tint r2;\n\n\t\tunion\n\t\t{\n\t\t\t// this saves memory as we only use either beta or SHH\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tfloat beta;\n\t\t\t\tfloat j;\n\t\t\t\tfloat k;\n\t\t\t};\n\t\t\tstruct\n\t\t\t{\n\t\t\t\tfloat c1;\n\t\t\t\tfloat c2;\n\t\t\t\tfloat c3;\n\t\t\t};\n\t\t};\n\n\tpublic:\n\n\t\tPin *thermistorPin;\n\n\t\tThermistor(std::string, float, int, int);\n\n\t\tint newThermistorReading();\n\t\tfloat adcValueToTemperature();\n\t\tfloat getTemperature();\n\n};\n\n#endif\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/thread/timerInterrupt.cpp",
    "content": "#include \"interrupt.h\"\n#include \"timerInterrupt.h\"\n#include \"timer.h\"\n\n\nTimerInterrupt::TimerInterrupt(int interruptNumber, pruTimer* owner)\n{\n\t// Allows interrupt to access owner's data\n\tInterruptOwnerPtr = owner;\n\n\t// When a device interrupt object is instantiated, the Register function must be called to let the\n\t// Interrupt base class know that there is an appropriate ISR function for the given interrupt.\n\tInterrupt::Register(interruptNumber, this);\n}\n\n\nvoid TimerInterrupt::ISR_Handler(void)\n{\n\tthis->InterruptOwnerPtr->timerTick();\n}\n\n"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/thread/timerInterrupt.h",
    "content": "#ifndef TIMERINTERRUPT_H\n#define TIMERINTERRUPT_H\n\n// Derived class for timer interrupts\n\nclass pruTimer; // forward declatation\n\nclass TimerInterrupt : public Interrupt\n{\n\tprivate:\n\t    \n\t\tpruTimer* InterruptOwnerPtr;\n\t\n\tpublic:\n\n\t\tTimerInterrupt(int interruptNumber, pruTimer* ownerptr);\n    \n\t\tvoid ISR_Handler(void);\n};\n\n#endif"
  },
  {
    "path": "Firmware/FirmwareSource/Remora-OS6/update_mks_robin.py",
    "content": "#!/usr/bin/env python2\n# Script to update firmware for MKS Robin bootloader\n#\n# Copyright (C) 2020  Kevin O'Connor <kevin@koconnor.net>\n#\n# This file may be distributed under the terms of the GNU GPLv3 license.\nimport optparse\n\nXOR_PATTERN = [\n    0xA3, 0xBD, 0xAD, 0x0D, 0x41, 0x11, 0xBB, 0x8D, 0xDC, 0x80,\n    0x2D, 0xD0, 0xD2, 0xC4, 0x9B, 0x1E, 0x26, 0xEB, 0xE3, 0x33,\n    0x4A, 0x15, 0xE4, 0x0A, 0xB3, 0xB1, 0x3C, 0x93, 0xBB, 0xAF,\n    0xF7, 0x3E\n]\n\ndef main():\n    # Parse command-line arguments\n    usage = \"%prog <input_file> <output_file>\"\n    opts = optparse.OptionParser(usage)\n    options, args = opts.parse_args()\n    if len(args) != 2:\n        opts.error(\"Incorrect number of arguments\")\n    infilename, outfilename = args\n    # Read input\n    f = open(infilename, \"rb\")\n    srcfirmware = f.read()\n    f.close()\n    # Update\n    firmware = bytearray(srcfirmware)\n    for pos in range(320, min(31040, len(firmware))):\n        firmware[pos] ^= XOR_PATTERN[pos & 31]\n    # Write output\n    f = open(outfilename, \"wb\")\n    f.write(firmware)\n    f.close()\n\nif __name__ == '__main__':\n    main()"
  },
  {
    "path": "LinuxCNC/Components/NVMPG/nvmpg.c",
    "content": "/********************************************************************\n* Description:  remora.c\n*               This file, 'remora.c', is a HAL component that\n*               provides and SPI connection to a external LPC1768 running Remora PRU firmware.\n*  \t\t\t\t\n*\t\t\t\tInitially developed for RaspberryPi -> Arduino Due.\n*\t\t\t\tFurther developed for RaspberryPi -> Smoothieboard and clones (LPC1768).\n*\n* Author: Scott Alford\n* License: GPL Version 2\n*\n*\t\tCredit to GP Orcullo and PICnc V2 which originally inspired this\n*\t\tand portions of this code is based on stepgen.c by John Kasunich\n*\t\tand hm2_rpspi.c by Matsche\n*\n* Copyright (c) 2021\tAll rights reserved.\n*\n* Last change:\n********************************************************************/\n\n\n#include \"rtapi.h\"\t\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"hal.h\"\t\t\t/* HAL public API decls */\n\n#include <math.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <sys/socket.h>\n#include <arpa/inet.h>\n#include <netinet/in.h>\n\n\n#define MODNAME \"nvmpg\"\n#define PREFIX \"nvmpg\"\n#define PRU_MPG\t0x6D706764 \t// \"mpgd\" mpg data payload\n\nMODULE_AUTHOR(\"Scott Alford AKA scotta\");\nMODULE_DESCRIPTION(\"Driver for Remora with NVMPG\");\nMODULE_LICENSE(\"GPL v2\");\n\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\ntypedef struct {\n\thal_float_t\t\t*updateFreq;\n\thal_bit_t\t\t*commsStatus;\n\thal_float_t\t\t*xPos;\n\thal_float_t\t\t*yPos;\n\thal_float_t\t\t*zPos;\n\thal_float_t\t\t*aPos;\n\thal_float_t\t\t*bPos;\n\thal_float_t\t\t*cPos;\n\tfloat\t\t\txPos_old;\n\tfloat\t\t\tyPos_old;\n\tfloat\t\t\tzPos_old;\n\tfloat\t\t\taPos_old;\n\tfloat\t\t\tbPos_old;\n\tfloat\t\t\tcPos_old;\n\thal_bit_t\t\t*reset;\n\thal_float_t\t\t*spindleRPM;\n\thal_bit_t\t\t*spindleOn;\n\thal_s32_t\t\t*feedOverrideCounts; \t//counts X scale = feed override percentage\n\thal_s32_t\t\tfeedOverrideCounts_old;\n\thal_float_t\t\t*feedOverrideScale;\n\thal_float_t\t\t*jogOverride;\t\t\t// what to do with Jog Override?\n\thal_s32_t\t\t*spindleOverrideCounts; //counts X scale = spindle override percentage\n\thal_s32_t\t\tspindleOverrideCounts_old;\n\thal_float_t\t\t*spindleOverrideScale;\n\thal_bit_t\t\t*parameterInc;\t\t\t// input from push button\n\thal_bit_t\t\t*axisUp;\t\t\t\t// input from push button\n\thal_bit_t\t\t*axisDown;\t\t\t\t// input from push button\n\thal_bit_t\t\t*multiplierInc;\t\t\t// input from push button\n\thal_bit_t\t\t*xSelect;\n\thal_bit_t\t\t*ySelect;\n\thal_bit_t\t\t*zSelect;\n\thal_bit_t\t\t*aSelect;\n\thal_bit_t\t\t*bSelect;\n\thal_bit_t\t\t*cSelect;\n\thal_float_t\t\t*mpgX1inc;\n\thal_float_t\t\t*mpgScale;\n} data_t;\n\nstatic data_t *data;\n\n#pragma pack(push, 1)\ntypedef union\n{\n\tstruct\n\t{\n\t\tuint8_t payload[57];\n\t};\n\tstruct\n\t{\n\t\tint32_t\theader;\n\t\tint8_t\tbyte0;\n\t\tint8_t\tbyte1;\n\t\tint32_t xPos;\n\t\tint32_t yPos;\n\t\tint32_t zPos;\n\t\tint32_t aPos;\n\t\tint32_t bPos;\n\t\tint32_t cPos;\n\t\tint8_t\tbyte24;\n\t\tint8_t\treset;\n\t\tint8_t\tbyte26;\n\t\tint32_t spindle_rpm;\n\t\tint8_t\tspindle_on;\n\t\tint8_t\tfeed_rate_override;\n\t\tint8_t\tslow_jog_rate;\n\t\tint8_t\tspindle_rate_override;\n\t\tint8_t\tspare35;\n\t\tint8_t\tparameter_select;\n\t\tint8_t\taxis_select;\n\t\tint8_t\tmpg_multiplier;\n\t\tint8_t\tspare39;\n\t\tint8_t\tspare40;\n\t\tint8_t\tspare41;\n\t\tint8_t\tspare42;\n\t\tint8_t\tspare43;\n\t\tint8_t\tspare44;\n\t\tint8_t\tspare45;\n\t\tint8_t\tspare46;\n\t\tint8_t\tspare47;\n\t\tint8_t\tspare48;\n\t\tint8_t\tspare49;\n\t\tint8_t\tspare50;\n\t};\n} mpgData_t;\n\n#pragma pack(pop)\n\nstatic mpgData_t mpgData;\n\n/* other globals */\nstatic int \t\t\tcomp_id;\t\t\t\t// component ID\nstatic const char \t*modname = MODNAME;\nstatic const char \t*prefix = PREFIX;\nstatic long \t\told_dtns;\t\t\t\t// update function period in nsec\nstatic double\t\tdt;\t\t\t\t\t\t// update funcion period in seconds\nstatic double \t\trecip_dt;\t\t\t\t// recprocal of period\n\nint update_count, update_counter;\nbool updateFlag;\nint buttonState[3];\nint selectedAxis; \nint selectedMultiplier;\n\n#define DST_PORT 27182\n#define SRC_PORT 27182\n#define SEND_TIMEOUT_US 50\n#define RECV_TIMEOUT_US 50\n\nstatic int udpSocket;\nstruct sockaddr_in dstAddr, srcAddr;\nstruct hostent *server;\nstatic const char *dstAddress = \"10.10.10.10\";\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\nstatic int UDP_init(void);\n\nstatic void update(void *arg, long period);\n\n\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\nint rtapi_app_main(void)\n{\n    char name[HAL_NAME_LEN + 1];\n\tint n, retval;\n\n    // connect to the HAL, initialise the driver\n    comp_id = hal_init(modname);\n    if (comp_id < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"%s ERROR: hal_init() failed \\n\", modname);\n\t\treturn -1;\n    }\n\n\t// allocate shared memory\n\tdata = hal_malloc(sizeof(data_t));\n\tif (data == 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\"%s: ERROR: hal_malloc() failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\t/* Initialize the UDP socket */\n\tif (UDP_init() < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Error: The board is unreachable\\n\");\n\t\treturn -1;\n\t}\n\n\t// export variables\n\tretval = hal_pin_float_newf(HAL_IN, &(data->updateFreq),\n\t\t\tcomp_id, \"%s.update-freq\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->commsStatus),\n\t\t\tcomp_id, \"%s.comms-status\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_IN, &(data->xPos),\n\t\t\tcomp_id, \"%s.x-pos\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_IN, &(data->yPos),\n\t\t\tcomp_id, \"%s.y-pos\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(data->zPos),\n\t\t\tcomp_id, \"%s.z-pos\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(data->aPos),\n\t\t\tcomp_id, \"%s.a-pos\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(data->bPos),\n\t\t\tcomp_id, \"%s.b-pos\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(data->cPos),\n\t\t\tcomp_id, \"%s.c-pos\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->reset),\n\t\t\tcomp_id, \"%s.reset\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(data->spindleRPM),\n\t\t\tcomp_id, \"%s.spindle-rpm\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->spindleOn),\n\t\t\tcomp_id, \"%s.spindle-on\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_s32_newf(HAL_IN, &(data->feedOverrideCounts),\n\t\t\tcomp_id, \"%s.feed-override-counts\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_IN, &(data->feedOverrideScale),\n\t\t\tcomp_id, \"%s.feed-override-scale\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_s32_newf(HAL_IN, &(data->spindleOverrideCounts),\n\t\t\tcomp_id, \"%s.spindle-override-counts\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_IN, &(data->spindleOverrideScale),\n\t\t\tcomp_id, \"%s.spindle-override-scale\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->parameterInc),\n\t\t\tcomp_id, \"%s.parameter-inc\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->axisUp),\n\t\t\tcomp_id, \"%s.axis-up\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->axisDown),\n\t\t\tcomp_id, \"%s.axis-down\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->multiplierInc),\n\t\t\tcomp_id, \"%s.multiplier-inc\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->xSelect),\n\t\t\tcomp_id, \"%s.x-select\", prefix);\n\tif (retval != 0) goto error;\n\t\n\t*data->xSelect = 1;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->ySelect),\n\t\t\tcomp_id, \"%s.y-select\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->zSelect),\n\t\t\tcomp_id, \"%s.z-select\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->aSelect),\n\t\t\tcomp_id, \"%s.a-select\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->bSelect),\n\t\t\tcomp_id, \"%s.b-select\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->cSelect),\n\t\t\tcomp_id, \"%s.c-select\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_IN, &(data->mpgX1inc),\n\t\t\tcomp_id, \"%s.mpg-x1-inc\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_float_newf(HAL_OUT, &(data->mpgScale),\n\t\t\tcomp_id, \"%s.mpg-scale\", prefix);\n\tif (retval != 0) goto error;\n\t\n\t*data->mpgScale = 1 * *data->mpgX1inc;\n\n\n\terror:\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: pin export failed with err=%i\\n\",\n\t\t        modname, retval);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\t// Export functions\n\trtapi_snprintf(name, sizeof(name), \"%s.update\", prefix);\n\tretval = hal_export_funct(name, update, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: update function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_print_msg(RTAPI_MSG_INFO, \"%s: installed driver\\n\", modname);\n\thal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n    hal_exit(comp_id);\n}\n\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\nint UDP_init(void)\n{\n\tint ret;\n\n\t// Create a UDP socket\n\tudpSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);\n\tif (udpSocket < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't open socket: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\n\tbzero((char*) &dstAddr, sizeof(dstAddr));\n\tdstAddr.sin_family = AF_INET;\n\tdstAddr.sin_addr.s_addr = inet_addr(dstAddress);\n\tdstAddr.sin_port = htons(DST_PORT);\n\n\tbzero((char*) &srcAddr, sizeof(srcAddr));\n\tsrcAddr.sin_family = AF_INET;\n\tsrcAddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tsrcAddr.sin_port = htons(SRC_PORT);\n\t\n\t// bind the local socket to SCR_PORT\n\tret = bind(udpSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));\n\tif (ret < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't bind: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\t\n\t// Connect to send and receive only to the server_addr\n\tret = connect(udpSocket, (struct sockaddr*) &dstAddr, sizeof(struct sockaddr_in));\n\tif (ret < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't connect: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\n\tstruct timeval timeout;\n\ttimeout.tv_sec = 0;\n\ttimeout.tv_usec = RECV_TIMEOUT_US;\n\n\tret = setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(timeout));\n\tif (ret < 0) {\n\trtapi_print(\"ERROR: can't set receive timeout socket option: %s\\n\",\n\t\tstrerror(errno));\n\treturn -errno;\n\t}\n\n\ttimeout.tv_usec = SEND_TIMEOUT_US;\n\tret = setsockopt(udpSocket, SOL_SOCKET, SO_SNDTIMEO, (char*) &timeout,\n\t  sizeof(timeout));\n\tif (ret < 0) {\n\trtapi_print(\"ERROR: can't set send timeout socket option: %s\\n\",\n\t\tstrerror(errno));\n\treturn -errno;\n\t}\n\n\treturn 0;\n}\n\n\nvoid update(void *arg, long period)\n{\n\tint ret;\n\tdata_t *data = (data_t *)arg;\n\t\n\tint32_t update_freq;\n\n    // calc constants related to the period of this function\n    // only recalc constants if period changes\n    if (period != old_dtns) \t\t\t\n\t{\n\t\told_dtns = period;\t\t\t\t// get ready to detect future period changes\n\t\tdt = period * 0.000000001; \t\t// dt is the period of this thread\n\t\trecip_dt = 1.0 / dt;\t\t\t// recipt_dt is the frequency of this thread\n    }\n\n\t// calculate the update_count\n\tupdate_count = recip_dt / *data->updateFreq;\n\t//rtapi_print(\"update_count = %d\\n\", update_count);\n\n\t// update the mpg at the updateFreq;\n\tif (update_counter >= update_count)\n\t{\n\t\tupdate_counter = 0;\n\t\t\n\t\t//rtapi_print(\"Update the mpg\\n\");\n\t\t\n\t\t// do updates\n\t\tif (*data->xPos != data->xPos_old) \n\t\t{\n\t\t\tdata->xPos_old = *data->xPos;\n\t\t\tmpgData.xPos = *data->xPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->yPos != data->yPos_old) \n\t\t{\n\t\t\tdata->yPos_old = *data->yPos;\n\t\t\tmpgData.yPos = *data->yPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->zPos != data->zPos_old) \n\t\t{\n\t\t\tdata->zPos_old = *data->zPos;\n\t\t\tmpgData.zPos = *data->zPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\n\t\tif (*data->aPos != data->aPos_old) \n\t\t{\n\t\t\tdata->aPos_old = *data->aPos;\n\t\t\tmpgData.aPos = *data->aPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->bPos != data->bPos_old) \n\t\t{\n\t\t\tdata->bPos_old = *data->bPos;\n\t\t\tmpgData.bPos = *data->bPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->cPos != data->cPos_old) \n\t\t{\n\t\t\tdata->cPos_old = *data->cPos;\n\t\t\tmpgData.cPos = *data->cPos * 1000;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->spindleRPM != mpgData.spindle_rpm) \n\t\t{\n\t\t\tmpgData.spindle_rpm = *data->spindleRPM;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->spindleOn != mpgData.spindle_on) \n\t\t{\n\t\t\tmpgData.spindle_on = *data->spindleOn;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->feedOverrideCounts != data->feedOverrideCounts_old)\n\t\t{\n\t\t\tdata->feedOverrideCounts_old = *data->feedOverrideCounts;\n\t\t\tmpgData.feed_rate_override = *data->feedOverrideCounts * *data->feedOverrideScale;\n\t\t\tupdateFlag = true;\n\t\t}\n\n\t\tif (*data->spindleOverrideCounts != data->spindleOverrideCounts_old)\n\t\t{\n\t\t\tdata->spindleOverrideCounts_old = *data->spindleOverrideCounts;\n\t\t\tmpgData.spindle_rate_override = *data->spindleOverrideCounts * *data->spindleOverrideScale;\n\t\t\tupdateFlag = true;\n\t\t}\n\t\n\t\tif ((*data->axisUp != buttonState[0]) || (*data->axisDown != buttonState[1]))\n\t\t{\n\t\t\tbuttonState[0] = *data->axisUp;\n\t\t\tbuttonState[1] = *data->axisDown;\n\t\t\tif (buttonState[0] == 1)\n\t\t\t{\n\t\t\t\tselectedAxis--;\n\t\t\t}\n\t\t\telse if (buttonState[1] == 1)\n\t\t\t{\n\t\t\t\tselectedAxis++;\n\t\t\t}\t\n\t\t\t\n\t\t\tif (selectedAxis > 5) selectedAxis = 0;\n\t\t\tif (selectedAxis < 0) selectedAxis = 5;\n\t\t\tmpgData.axis_select = selectedAxis;\n\t\t\t\t\n\t\t\t*data->xSelect = 0;\n\t\t\t*data->ySelect = 0;\n\t\t\t*data->zSelect = 0;\n\t\t\t*data->aSelect = 0;\n\t\t\t*data->bSelect = 0;\n\t\t\t*data->cSelect = 0;\n\t\t\t\t\t\n\t\t\tswitch (selectedAxis)\n\t\t\t{\n\t\t\t\tcase 0:\n\t\t\t\t\t*data->xSelect = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\t\t\t\t\t*data->ySelect = 1;\n\t\t\t\t\tbreak;\t\n\t\t\t\t\t\n\t\t\t\tcase 2:\n\t\t\t\t\t*data->zSelect = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\t*data->aSelect = 1;\n\t\t\t\t\tbreak;\t\n\n\t\t\t\tcase 4:\n\t\t\t\t\t*data->bSelect = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 5:\n\t\t\t\t\t*data->cSelect = 1;\n\t\t\t\t\tbreak;\t\t\t\t\t\t\t\n\t\t\t}\n\t\t\tupdateFlag = true;\n\t\t}\n\t\t\n\t\tif (*data->multiplierInc != buttonState[2])\n\t\t{\n\t\t\tbuttonState[2] = *data->multiplierInc;\n\t\t\tif (buttonState[2] == 1)\n\t\t\t{\n\t\t\t\tselectedMultiplier++;\n\t\t\t\tif (selectedMultiplier > 3) selectedMultiplier = 0;\n\t\t\t\tmpgData.mpg_multiplier = selectedMultiplier;\n\t\t\t\tswitch (selectedMultiplier)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\t*data->mpgScale = 1 * *data->mpgX1inc;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\t*data->mpgScale = 10 * *data->mpgX1inc;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\t*data->mpgScale = 100 * *data->mpgX1inc;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\tcase 3:\n\t\t\t\t\t\t*data->mpgScale = 1000 * *data->mpgX1inc;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tupdateFlag = true;\n\t\t\t}\n\t\t}\n\t\n\t\tif (updateFlag && *(data->commsStatus))\n\t\t{\n\t\t\tmpgData.header = PRU_MPG;\n\t\t\tmpgData.byte0 = 0x5a;\n\t\t\tmpgData.byte1 = 0x5a;\n\t\t\t\n\t\t\t// Send datagram\n\t\t\tret = send(udpSocket, mpgData.payload, sizeof(mpgData.payload), 0);\n\t\t\tif (ret < 0)\n\t\t\t{\n\t\t\t\trtapi_print(\"ERROR: send (WRITE), %s\\n\", strerror(errno));\n\t\t\t}\n\t\t\t\n\t\t\tupdateFlag = false;\n\t\t}\n\t}\n\t\n\tupdate_counter++;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/PIDcontroller/PIDcontroller.c",
    "content": "/********************************************************************\n* Description:  PIDcontroller.c\n*\n*               This file, 'PIDcontroller.c', is a HAL component that\n*               provides a a generic PID controller.\n*\n*\t\t\t\tBased on Arduino PID v1.2.1 by Bret Beauregard\n*\t\t\t\tpid.c used as a basis for command line passing\n*\n* Author: Scott Alford\n* License: GPL Version 2\n*\n* Copyright (c) 2019\tAll rights reserved.\n*\n* Last change:\n********************************************************************/\n\n#include \"rtapi.h\"\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"rtapi_string.h\"\n#include \"hal.h\"\t\t/* HAL public API decls */\n\n/* module information */\nMODULE_AUTHOR(\"Scott Alford\");\nMODULE_DESCRIPTION(\"Generic PID controller\");\nMODULE_LICENSE(\"GPL v2\");\n\n\nstatic int num_chan;\t\t/* number of channels */\nstatic int default_num_chan = 3;\nRTAPI_MP_INT(num_chan, \"number of channels\");\n\nstatic int howmany;\n#define MAX_CHAN 16\nchar *names[MAX_CHAN] ={0,};\nRTAPI_MP_ARRAY_STRING(names, MAX_CHAN,\"pid names\");\n\n#define AUTOMATIC\t1\n#define MANUAL\t    0       // default behaviour\n#define DIRECT      0       // default behaviour if direction pin not connected\n#define REVERSE     1\n#define P_ON_M      1\n#define P_ON_E      0       // default behaviour if pOnM pin not connected\n\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\n\ntypedef struct {\n\thal_bit_t   *Auto;\t\t// pin: auto enable input\n\thal_bit_t   *pOnM;\t\t// pin: Proportional on Measurement, default is Proportional on Error\n    hal_bit_t   *direction; // pin: controller direction\n    hal_float_t *setpoint;\t// pin: setpoint (SP), ie commanded value\n    hal_float_t *input;\t\t// pin: input (PV), ie feedback value\n    hal_float_t *error;\t\t// pin: command - feedback\n\thal_float_t *output;\t// pin: the output value\n\thal_float_t *kp;\t\t// pin: proportional gain\n    hal_float_t *ki;\t\t// pin: integral gain\n    hal_float_t *kd;\t\t// pin: derivative gain\n    hal_float_t *SPmin;\t    // pin: setpoint minimum value\n\thal_float_t *SPmax;\t    // pin: setpoint maximum value\n\thal_float_t *CVmin;\t    // pin: output minimum value\n\thal_float_t *CVmax;\t    // pin: output maximum value\n    bool         inAuto;\n    double       outputSum;\n    double       lastInput;\n} hal_pid_t;\n\n/* pointer to array of pid_t structs in shared memory, 1 per loop */\nstatic hal_pid_t *pid_array;\n\n/* other globals */\nstatic int comp_id;\t\t/* component ID */\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\n\nstatic int export_pid(hal_pid_t * addr,char * prefix);\nstatic void compute(void *arg, long period);\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\n\nint rtapi_app_main(void)\n{\n    int n, retval,i;\n\n    if(num_chan && names[0]) {\n        rtapi_print_msg(RTAPI_MSG_ERR,\"num_chan= and names= are mutually exclusive\\n\");\n        return -EINVAL;\n    }\n    if(!num_chan && !names[0]) num_chan = default_num_chan;\n\n    if(num_chan) {\n        howmany = num_chan;\n    } else {\n        howmany = 0;\n        for (i = 0; i < MAX_CHAN; i++) {\n            if ( (names[i] == NULL) || (*names[i] == 0) ){\n                break;\n            }\n            howmany = i + 1;\n        }\n    }\n\n    /* test for number of channels */\n    if ((howmany <= 0) || (howmany > MAX_CHAN)) {\n\trtapi_print_msg(RTAPI_MSG_ERR,\n\t    \"PID: ERROR: invalid number of channels: %d\\n\", howmany);\n\treturn -1;\n    }\n\n    /* have good config info, connect to the HAL */\n    comp_id = hal_init(\"PIDcontroller\");\n    if (comp_id < 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR, \"PID: ERROR: hal_init() failed\\n\");\n\treturn -1;\n    }\n\n    /* allocate shared memory for pid loop data */\n    pid_array = hal_malloc(howmany * sizeof(hal_pid_t));\n    if (pid_array == 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR, \"PID: ERROR: hal_malloc() failed\\n\");\n\thal_exit(comp_id);\n\treturn -1;\n    }\n\n    /* export variables and function for each PID loop */\n    i = 0; // for names= items\n    for (n = 0; n < howmany; n++) {\n\t/* export everything for this loop */\n        if(num_chan) {\n            char buf[HAL_NAME_LEN + 1];\n            rtapi_snprintf(buf, sizeof(buf), \"pid.%d\", n);\n\t    retval = export_pid(&(pid_array[n]), buf);\n        } else {\n\t    retval = export_pid(&(pid_array[n]), names[i++]);\n        }\n\n\tif (retval != 0) {\n\t    rtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\"PID: ERROR: loop %d var export failed\\n\", n);\n\t    hal_exit(comp_id);\n\t    return -1;\n\t}\n    }\n    rtapi_print_msg(RTAPI_MSG_INFO, \"PID: installed %d PID loops\\n\",\n\thowmany);\n    hal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n    hal_exit(comp_id);\n}\n\n/***********************************************************************\n*                   REALTIME PID LOOP CALCULATIONS                     *\n************************************************************************/\n\nstatic void compute(void *arg, long period)\n{\n    hal_pid_t *pid;\n    double minSetpoint, maxSetpoint;\n    double minOutput, maxOutput; \n    double setpoint, input, output;\n    double error, dInput;\n    double kp, ki, kd;\n    int controllerDirection, mode, pOn, pOnE;\n    double periodfp, periodrecip;\n\n    // point to the data for this PID loop\n    pid = arg;\n\n    // precalculate the timing constants\n    periodfp = period * 0.000000001;\n    periodrecip = 1.0 / periodfp;\n\n\t// set the controller direction, mode and \"propotional on\" (error or measurement)\n    controllerDirection = *(pid->direction);\n    mode = *(pid->Auto);\n    pOn = *(pid->pOnM);\n    pOnE = (pOn == P_ON_E);\n\n\t// set the controller tunnings\n    kp = *(pid->kp);\n    ki = *(pid->ki) * periodfp;\n    kd = *(pid->kd) / periodfp;\n\n    if(controllerDirection ==REVERSE)\n    {\n        kp = (0 - kp);\n        ki = (0 - ki);\n        kd = (0 - kd);\n    }\n\n\t// set the controller input and output limits\n    minSetpoint = *(pid->SPmin);\n    maxSetpoint = *(pid->SPmax);\n    minOutput = *(pid->CVmin);\n    maxOutput = *(pid->CVmax);\n\n    bool newAuto = (mode == AUTOMATIC);\n    if(newAuto && !(pid->inAuto))\n    {  /*we just went from manual to auto*/\n        pid->outputSum = *(pid->output);\n        pid->lastInput = *(pid->input);\n        if(pid->outputSum > maxOutput) pid->outputSum = maxOutput;\n        else if(pid->outputSum < minOutput) pid->outputSum = minOutput;\n    }\n    pid->inAuto = newAuto;\n\n    if(pid->inAuto)\n    {\n        /*Compute all the working error variables*/\n        setpoint = *(pid->setpoint);\n        \n        if(setpoint > maxSetpoint) setpoint = maxSetpoint;\n        else if(setpoint < minSetpoint) setpoint = minSetpoint;\n\n        input = *(pid->input);\n        error = setpoint - input;\n\t    *pid->error = error;\n        dInput = input - pid->lastInput;\n        pid->outputSum += (ki * error);\n\n        /*Add Proportional on Measurement, if P_ON_M is specified*/\n        if(!pOnE) pid->outputSum -= kp * dInput;\n\n        if(pid->outputSum > maxOutput) pid->outputSum = maxOutput;\n        else if(pid->outputSum < minOutput) pid->outputSum= minOutput;\n\n        /*Add Proportional on Error, if P_ON_E is specified*/\n        if(pOnE) output = kp * error;\n        else output = 0;\n\n        /*Compute Rest of PID Output*/\n        output += pid->outputSum - kd * dInput;\n\n        if(output > maxOutput) output = maxOutput;\n        else if(output < minOutput) output = minOutput;\n\t    if (setpoint == 0) output = 0;\n\t    *(pid->output) = output;\n\n        /*Remember some variables for next time*/\n        pid->lastInput = input;\n    }\n    else\n    {\n        // TODO: change this for manual mode, just set to zero for now\n        *(pid->output) = 0;\n    }\n\n    /* done */\n}\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\nstatic int export_pid(hal_pid_t * addr, char * prefix)\n{\n    int retval, msg;\n    char buf[HAL_NAME_LEN + 1];\n\n    /* This function exports a lot of stuff, which results in a lot of\n       logging if msg_level is at INFO or ALL. So we save the current value\n       of msg_level and restore it later.  If you actually need to log this\n       function's actions, change the second line below */\n    msg = rtapi_get_msg_level();\n    rtapi_set_msg_level(RTAPI_MSG_WARN);\n\n    /* export pins */\n    retval = hal_pin_bit_newf(HAL_IN, &(addr->Auto), comp_id,\n\t\t\t      \"%s.auto\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_bit_newf(HAL_IN, &(addr->pOnM), comp_id,\n\t\t\t      \"%s.pOnM\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n\tretval = hal_pin_bit_newf(HAL_IN, &(addr->direction), comp_id,\n\t\t\t      \"%s.direction\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->setpoint), comp_id,\n\t\t\t\t\"%s.SP\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->input), comp_id,\n\t\t\t\t\"%s.PV\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_OUT, &(addr->error), comp_id,\n\t\t\t\t\"%s.ER\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_OUT, &(addr->output), comp_id,\n\t\t\t\t\"%s.CV\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->kp), comp_id,\n\t\t\t\t\"%s.KP\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->ki), comp_id,\n\t\t\t\t\"%s.KI\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n        retval = hal_pin_float_newf(HAL_IN, &(addr->kd), comp_id,\n\t\t\t\t\"%s.KD\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->SPmin), comp_id,\n\t\t\t\t\"%s.SPmin\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->SPmax), comp_id,\n\t\t\t\t\"%s.SPmax\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->CVmin), comp_id,\n\t\t\t\t\"%s.CVmin\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->CVmax), comp_id,\n\t\t\t\t\"%s.CVmax\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n\n    /* export function for this loop */\n    rtapi_snprintf(buf, sizeof(buf), \"%s.compute\", prefix);\n    retval =\n\thal_export_funct(buf, compute, addr, 1, 0, comp_id);\n    if (retval != 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR,\n\t    \"PID: ERROR: do_pid_calcs funct export failed\\n\");\n\thal_exit(comp_id);\n\treturn -1;\n    }\n    /* restore saved message level */\n    rtapi_set_msg_level(msg);\n    return 0;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/PIDcontroller/PIDcontroller.md",
    "content": "## NAME \n\nPIDcontroller − proportional/integral/derivative controller\n\n## SYNOPSIS \n\n**loadrt PIDcontroller** [**num_chan**=*num* | **names**=*name1[,name2...]*]\n\n## DESCRIPTION \n\n**PIDcontoller** is a generic pid is a classic Proportional/Integral/Derivative controller base on very popular Arduino PID v1.2.1, by Bret Beauregard.\n\n**PIDcontroller** supports a maximum of sixteen controllers. The number that are actually loaded is set by the **num_chan** argument when the module is loaded. Alternatively, specify **names=** and unique names separated by commas.\n\nThe **num_chan=** and **names=** specifiers are mutually exclusive. If neither num_chan= nor names= are specified, the default value is three.\n\n## NAMING\n\nThe names for pins, parameters, and functions are prefixed as:  \n**pid.N.** for N=0,1,...,num−1 when using **num_chan=num**  \n**nameN.** for nameN=name1,name2,... when using **names=name1,name2,...**  \n\nThe **pid.N.** format is shown in the following descriptions.\n\n## FUNCTIONS \n\n**pid.N.compute** (uses floating-point) Does the PID calculations for control loop N.\n\n## PINS \n\n| Pin | Type | Direction | Funtion|\n| :--- | :--- | :---: | :--- |\n| pid.N.command | float | in | The desired (commanded) value for the control loop. |\n| pid.N.Pgain | float | in | Proportional gain. Results in a contribution to the output that is the error multiplied by Pgain. |\n\n\npid.N.Igain float in\nIntegral gain. Results in a contribution to the output that is the integral of the error multiplied by Igain. For example an error of 0.02 that lasted 10 seconds would result in an integrated error (errorI) of 0.2, and if Igain is 20, the integral term would add 4.0 to the output.\npid.N.Dgain float in\nDerivative gain. Results in a contribution to the output that is the rate of change (derivative) of the error multiplied by Dgain. For example an error that changed from 0.02 to 0.03 over 0.2 seconds would result in an error derivative (errorD) of of 0.05, and if Dgain is 5, the derivative term would add 0.25 to the output.\npid.N.feedback float in\nThe actual (feedback) value, from some sensor such as an encoder.\npid.N.output float out\nThe output of the PID loop, which goes to some actuator such as a motor.\npid.N.command−deriv float in\nThe derivative of the desired (commanded) value for the control loop. If no signal is connected then the derivative will be estimated numerically.\npid.N.feedback−deriv float in\nThe derivative of the actual (feedback) value for the control loop. If no signal is connected then the derivative will be estimated numerically. When the feedback is from a quantized position source (e.g., encoder feedback position), behavior of the D term can be improved by using a better velocity estimate here, such as the velocity output of encoder(9) or hostmot2(9).\npid.N.error−previous−target bit in\nUse previous invocation’s target vs. current position for error calculation, like the motion controller expects. This may make torque-mode position loops and loops requiring a large I gain easier to tune, by eliminating velocity−dependent following error.\npid.N.error float out\nThe difference between command and feedback.\npid.N.enable bit in\nWhen true, enables the PID calculations. When false, output is zero, and all internal integrators, etc, are reset.\npid.N.index−enable bit in\nOn the falling edge of index−enable, pid does not update the internal command derivative estimate. On systems which use the encoder index pulse, this pin should be connected to the index−enable signal. When this is not done, and FF1 is nonzero, a step change in the input command causes a single-cycle spike in the PID output. On systems which use exactly one of the −deriv inputs, this affects the D term as well.\npid.N.bias float in\nbias is a constant amount that is added to the output. In most cases it should be left at zero. However, it can sometimes be useful to compensate for offsets in servo amplifiers, or to balance the weight of an object that moves vertically. bias is turned off when the PID loop is disabled, just like all other components of the output. If a non-zero output is needed even when the PID loop is disabled, it should be added with an external HAL sum2 block.\npid.N.FF0 float in\nZero order feed-forward term. Produces a contribution to the output that is FF0 multiplied by the commanded value. For position loops, it should usually be left at zero. For velocity loops, FF0 can compensate for friction or motor counter-EMF and may permit better tuning if used properly.\npid.N.FF1 float in\nFirst order feed-forward term. Produces a contribution to the output that FF1 multiplied by the derivative of the commanded value. For position loops, the contribution is proportional to speed, and can be used to compensate for friction or motor CEMF. For velocity loops, it is proportional to acceleration and can compensate for inertia. In both cases, it can result in better tuning if used properly.\npid.N.FF2 float in\nSecond order feed-forward term. Produces a contribution to the output that is FF2 multiplied by the second derivative of the commanded value. For position loops, the contribution is proportional to acceleration, and can be used to compensate for inertia. For velocity loops, it should usually be left at zero.\npid.N.deadband float in\nDefines a range of \"acceptable\" error. If the absolute value of error is less than deadband, it will be treated as if the error is zero. When using feedback devices such as encoders that are inherently quantized, the deadband should be set slightly more than one-half count, to prevent the control loop from hunting back and forth if the command is between two adjacent encoder values. When the absolute value of the error is greater than the deadband, the deadband value is subtracted from the error before performing the loop calculations, to prevent a step in the transfer function at the edge of the deadband. (See BUGS.)\npid.N.maxoutput float in\nOutput limit. The absolute value of the output will not be permitted to exceed maxoutput, unless maxoutput is zero. When the output is limited, the error integrator will hold instead of integrating, to prevent windup and overshoot.\npid.N.maxerror float in\nLimit on the internal error variable used for P, I, and D. Can be used to prevent high Pgain values from generating large outputs under conditions when the error is large (for example, when the command makes a step change). Not normally needed, but can be useful when tuning non-linear systems.\npid.N.maxerrorD float in\nLimit on the error derivative. The rate of change of error used by the Dgain term will be limited to this value, unless the value is zero. Can be used to limit the effect of Dgain and prevent large output spikes due to steps on the command and/or feedback. Not normally needed.\npid.N.maxerrorI float in\nLimit on error integrator. The error integrator used by the Igain term will be limited to this value, unless it is zero. Can be used to prevent integrator windup and the resulting overshoot during/after sustained errors. Not normally needed.\npid.N.maxcmdD float in\nLimit on command derivative. The command derivative used by FF1 will be limited to this value, unless the value is zero. Can be used to prevent FF1 from producing large output spikes if there is a step change on the command. Not normally needed.\npid.N.maxcmdDD float in\nLimit on command second derivative. The command second derivative used by FF2 will be limited to this value, unless the value is zero. Can be used to prevent FF2 from producing large output spikes if there is a step change on the command. Not normally needed.\npid.N.saturated bit out\nWhen true, the current PID output is saturated. That is,\noutput = ± maxoutput.\npid.N.saturated−s float out \npid.N.saturated−count s32 out\nWhen true, the output of PID was continually saturated for this many seconds (saturated−s) or periods (saturated−count)."
  },
  {
    "path": "LinuxCNC/Components/PRUencoder/PRUencoder.c",
    "content": "/********************************************************************\n* Description:  PRUencoder.c\n*\n*               This file, 'PRUencoder.c', is a HAL component that\n*               provides an interface to the RemoraPRU raw encoder count.\n*\n*\n* Author: Scott Alford\n* License: GPL Version 2\n*\n* Copyright (c) 2020\tAll rights reserved.\n*\n* Last change:\n********************************************************************/\n\n#include \"rtapi.h\"\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"rtapi_string.h\"\n#include \"hal.h\"\t\t/* HAL public API decls */\n\n#define MODNAME \"PRUencoder\"\n#define PREFIX \"PRUencoder\"\n\n/* module information */\nMODULE_AUTHOR(\"Scott Alford\");\nMODULE_DESCRIPTION(\"Remora PRU raw encoder interface\");\nMODULE_LICENSE(\"GPL v2\");\n\n\nstatic int num_encoder;\t\t/* number of encoders */\nstatic int default_num_encoder = 3;\nstatic int howmany;\nRTAPI_MP_INT(num_encoder, \"number of encoder\");\n\n#define MAX_ENCODER 8\n\nchar *names[MAX_ENCODER] ={0,};\nRTAPI_MP_ARRAY_STRING(names, MAX_ENCODER,\"encoder names\");\n\n\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\n\ntypedef struct {\n    hal_bit_t \t\t*reset;\t\t\t\t// counter reset input\n\thal_float_t \t*raw_count;\t\t\t// pin: input, raw encoder count\n\thal_bit_t \t\t*phaseZ;\t\t\t// index pulse input\n\thal_bit_t \t\t*index_ena;\t\t\t// index enable input\n\thal_float_t \tcount;\t\t\t\t\n\thal_float_t \tindex_count;\t\t// raw count value the encoder index position\n\thal_float_t \t*pos;\t\t\t\t// scaled position (floating point)\n\thal_float_t\t\told_pos;\n\thal_float_t \t*pos_scale;\t\t\t// scaling factor for pos\n\thal_float_t\t\t*vel;\n\tdouble \t\t\told_scale;\t\t\t\n\tdouble \t\t\tscale;\n} hal_encoder_t;\n\n/* pointer to array of pid_t structs in shared memory, 1 per encoder */\nstatic hal_encoder_t *encoder_array;\n\n/* other globals */\nstatic int comp_id;\t\t/* component ID */\nstatic const char \t*modname = MODNAME;\nstatic const char \t*prefix = PREFIX;\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\n\nstatic int export_encoder(hal_encoder_t * addr,char * prefix);\nstatic void capture(void *arg, long period);\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\n\nint rtapi_app_main(void)\n{\n    int n, retval,i;\n\tchar name[HAL_NAME_LEN + 1];\n\n    if(num_encoder && names[0]) {\n        rtapi_print_msg(RTAPI_MSG_ERR,\"num_encoder= and names= are mutually exclusive\\n\");\n        return -EINVAL;\n    }\n    if(!num_encoder && !names[0]) num_encoder = default_num_encoder;\n\n    if(num_encoder) {\n        howmany = num_encoder;\n    } else {\n        howmany = 0;\n        for (i = 0; i < MAX_ENCODER; i++) {\n            if ( (names[i] == NULL) || (*names[i] == 0) ){\n                break;\n            }\n            howmany = i + 1;\n        }\n    }\n\n    /* test for number of channels */\n    if ((howmany <= 0) || (howmany > MAX_ENCODER)) {\n\trtapi_print_msg(RTAPI_MSG_ERR,\n\t    \"encoder: ERROR: invalid number of encoders: %d\\n\", howmany);\n\treturn -1;\n    }\n\n    /* have good config info, connect to the HAL */\n    comp_id = hal_init(\"PRUencoder\");\n    if (comp_id < 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR, \"encoder: ERROR: hal_init() failed\\n\");\n\treturn -1;\n    }\n\n    /* allocate shared memory for data */\n    encoder_array = hal_malloc(howmany * sizeof(hal_encoder_t));\n    if (encoder_array == 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR, \"encoder: ERROR: hal_malloc() failed\\n\");\n\thal_exit(comp_id);\n\treturn -1;\n    }\n\n    /* export variables and function for each encoder */\n    i = 0; // for names= items\n    for (n = 0; n < howmany; n++) {\n\t/* export everything for this loop */\n        if(num_encoder) {\n            char buf[HAL_NAME_LEN + 1];\n            rtapi_snprintf(buf, sizeof(buf), \"encoder.%d\", n);\n\t    retval = export_encoder(&(encoder_array[n]), buf);\n        } else {\n\t    retval = export_encoder(&(encoder_array[n]), names[i++]);\n        }\n\n\t\tif (retval != 0) {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\"PID: ERROR: loop %d var export failed\\n\", n);\n\t\t\thal_exit(comp_id);\n\t\t\treturn -1;\n\t\t}\n    }\n\t\n\t\n\trtapi_snprintf(name, sizeof(name), \"%s.capture-position\", prefix);\n\tretval = hal_export_funct(name, capture, encoder_array, 1, 0, comp_id);\n    if (retval != 0) {\n\trtapi_print_msg(RTAPI_MSG_ERR,\n\t    \"ENCODER: ERROR: capture funct export failed\\n\");\n\thal_exit(comp_id);\n\treturn -1;\n    }\n\t\n    rtapi_print_msg(RTAPI_MSG_INFO, \"PRUencoder: installed %d encoders\\n\",\n\thowmany);\n    hal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n    hal_exit(comp_id);\n}\n\n/***********************************************************************\n*                   REALTIME PID LOOP CALCULATIONS                     *\n************************************************************************/\n\nstatic void capture(void *arg, long period)\n{\n\thal_encoder_t *encoder;\n\tint n;\n\tfloat scale, delta_pos, delta_time;\n\t\n\tencoder = arg;\n\t\n    for (n = 0; n < howmany; n++) {\n\t\n\t\t/* done interacting with update() */\n\t\t/* check for change in scale value */\n\t\tif ( *(encoder->pos_scale) != encoder->old_scale ) {\n\t\t\t/* save new scale to detect future changes */\n\t\t\tencoder->old_scale = *(encoder->pos_scale);\n\t\t\t/* scale value has changed, test and update it */\n\t\t\tif ((*(encoder->pos_scale) < 1e-20) && (*(encoder->pos_scale) > -1e-20)) {\n\t\t\t/* value too small, divide by zero is a bad thing */\n\t\t\t*(encoder->pos_scale) = 1.0;\n\t\t\t}\n\t\t\t/* we actually want the reciprocal */\n\t\t\tencoder->scale = 1.0 / *(encoder->pos_scale);\n\t\t}\n\t\n\t\t// check reset input\n\t\tif (*(encoder->reset)) {\n\t\t\t// reset is active, reset the counter\n\t\t\t// note: we NEVER reset raw_counts, that is always a\n\t\t\t// running count of edges seen since startup.  The\n\t\t\t// public \"count\" is the difference between raw_count\n\t\t\t// and index_count, so it will become zero.\n\t\t\tencoder->index_count = *(encoder->raw_count);\n\t\t}\n\t\t\n\t\t// check for index enabled and rising edges\n\t\tif (*(encoder->phaseZ) && *(encoder->index_ena)) {\n\t\t\tencoder->index_count = *(encoder->raw_count);\n\t\t\t*(encoder->index_ena) = 0;\n\t\t}\n\t\t\t\n\t\t// compute net counts\n\t\tencoder->count = *(encoder->raw_count) - encoder->index_count;\n\t\t\t\t\n\t\t// scale count to make floating point position\n\t\tencoder->old_pos = *(encoder->pos);\n\t\t*(encoder->pos) = encoder->count * encoder->scale;\n\t\t\n\t\t// compute velocity\n\t\tdelta_pos = *(encoder->pos) - encoder->old_pos;\n\t\tdelta_time = period * 1e-9;\n\t\t*(encoder->vel) = delta_pos / delta_time;  // position units per second\n\t\n\t// move on to next encoder\n\tencoder++;\n\t}\n    /* done */\n}\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\nstatic int export_encoder(hal_encoder_t * addr, char * prefix)\n{\n    int retval, msg;\n    \n\n    /* This function exports a lot of stuff, which results in a lot of\n       logging if msg_level is at INFO or ALL. So we save the current value\n       of msg_level and restore it later.  If you actually need to log this\n       function's actions, change the second line below */\n    msg = rtapi_get_msg_level();\n    rtapi_set_msg_level(RTAPI_MSG_WARN);\n\n    /* export pins */\n\t\n    retval = hal_pin_bit_newf(HAL_IN, &(addr->phaseZ), comp_id,\n            \"%s.phase-Z\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_bit_newf(HAL_IO, &(addr->index_ena), comp_id,\n            \"%s.index-enable\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(addr->reset), comp_id,\n            \"%s.reset\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\n    retval = hal_pin_float_newf(HAL_IN, &(addr->raw_count), comp_id,\n\t\t\t\"%s.raw_count\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\t\n\tretval = hal_pin_float_newf(HAL_IN, &(addr->pos_scale), comp_id,\n\t\t\t\"%s.position-scale\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\t\n    retval = hal_pin_float_newf(HAL_OUT, &(addr->pos), comp_id,\n            \"%s.position\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\t\n\tretval = hal_pin_float_newf(HAL_OUT, &(addr->vel), comp_id,\n            \"%s.velocity\", prefix);\n    if (retval != 0) {\n\treturn retval;\n    }\n\t\n    /* restore saved message level */\n    rtapi_set_msg_level(msg);\n    return 0;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/README.md",
    "content": "LinuxCNC components\r\n\r\nOpen this folder in a terminal, and install the components with these commands\r\n\r\n\r\nsudo halcompile --install ./Remora-eth/remora-eth-3.0.c\r\n\r\nsudo halcompile --install ./Remora-spi/remora-spi.c\r\n\r\nsudo halcompile --install ./PRUencoder/PRUencoder.c\r\n\r\nsudo halcompile --install ./NVMPG/nvmpg.c\r\n"
  },
  {
    "path": "LinuxCNC/Components/Remora/bcm2835.c",
    "content": "/* bcm2835.c\n// C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi\n// http://elinux.org/RPi_Low-level_peripherals\n// http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf\n//\n// Author: Mike McCauley\n// Copyright (C) 2011-2013 Mike McCauley\n// $Id: bcm2835.c,v 1.28 2020/01/11 05:07:13 mikem Exp mikem $\n*/\n#include <stdlib.h>\n#include <stdio.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <string.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/types.h>\n\n#define BCK2835_LIBRARY_BUILD\n#include \"bcm2835.h\"\n\n/* This define enables a little test program (by default a blinking output on pin RPI_GPIO_PIN_11)\n// You can do some safe, non-destructive testing on any platform with:\n// gcc bcm2835.c -D BCM2835_TEST\n// ./a.out\n*/\n/*#define BCM2835_TEST*/\n\n/* Uncommenting this define compiles alternative I2C code for the version 1 RPi\n// The P1 header I2C pins are connected to SDA0 and SCL0 on V1.\n// By default I2C code is generated for the V2 RPi which has SDA1 and SCL1 connected.\n*/\n/* #define I2C_V1*/\n\n/* Physical address and size of the peripherals block\n// May be overridden on RPi2\n*/\noff_t bcm2835_peripherals_base = BCM2835_PERI_BASE;\nsize_t bcm2835_peripherals_size = BCM2835_PERI_SIZE;\n\n/* Virtual memory address of the mapped peripherals block \n */\nuint32_t *bcm2835_peripherals = (uint32_t *)MAP_FAILED;\n\n/* And the register bases within the peripherals block\n */\nvolatile uint32_t *bcm2835_gpio        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_pwm         = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_clk         = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_pads        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_spi0        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_bsc0        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_bsc1        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_st\t       = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_aux\t       = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_spi1        = (uint32_t *)MAP_FAILED;\n\n\n\n/* This variable allows us to test on hardware other than RPi.\n// It prevents access to the kernel memory, and does not do any peripheral access\n// Instead it prints out what it _would_ do if debug were 0\n */\nstatic uint8_t debug = 0;\n\n/* RPI 4 has different pullup registers - we need to know if we have that type */\n\nstatic uint8_t pud_type_rpi4 = 0;\n\n/* RPI 4 has different pullup operation - make backwards compat */\n\nstatic uint8_t pud_compat_setting = BCM2835_GPIO_PUD_OFF;\n\n/* I2C The time needed to transmit one byte. In microseconds.\n */\nstatic int i2c_byte_wait_us = 0;\n\n/* SPI bit order. BCM2835 SPI0 only supports MSBFIRST, so we instead \n * have a software based bit reversal, based on a contribution by Damiano Benedetti\n */\nstatic uint8_t bcm2835_spi_bit_order = BCM2835_SPI_BIT_ORDER_MSBFIRST;\nstatic uint8_t bcm2835_byte_reverse_table[] = \n{\n    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,\n    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,\n    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,\n    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,\n    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,\n    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,\n    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,\n    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,\n    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,\n    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,\n    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,\n    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,\n    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,\n    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,\n    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,\n    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,\n    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,\n    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,\n    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,\n    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,\n    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,\n    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,\n    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,\n    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,\n    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,\n    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,\n    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,\n    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,\n    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,\n    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,\n    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,\n    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff\n};\n\nstatic uint8_t bcm2835_correct_order(uint8_t b)\n{\n    if (bcm2835_spi_bit_order == BCM2835_SPI_BIT_ORDER_LSBFIRST)\n\treturn bcm2835_byte_reverse_table[b];\n    else\n\treturn b;\n}\n\n#ifdef BCM2835_HAVE_LIBCAP\n#include <sys/capability.h>\nstatic int bcm2835_has_capability(cap_value_t capability)\n{\n    int ok = 0;\n    cap_t cap = cap_get_proc();\n    if (cap)\n    {\n        cap_flag_value_t value;\n        if (cap_get_flag(cap,capability,CAP_EFFECTIVE,&value) == 0 && value == CAP_SET)\n            ok = 1;\n       cap_free(cap);\n    }\n    return ok;\n}\n#endif\n\n/*\n// Low level register access functions\n*/\n\n/* Function to return the pointers to the hardware register bases */\nuint32_t* bcm2835_regbase(uint8_t regbase)\n{\n    switch (regbase)\n    {\n\tcase BCM2835_REGBASE_ST:\n\t    return (uint32_t *)bcm2835_st;\n\tcase BCM2835_REGBASE_GPIO:\n\t    return (uint32_t *)bcm2835_gpio;\n\tcase BCM2835_REGBASE_PWM:\n\t    return (uint32_t *)bcm2835_pwm;\n\tcase BCM2835_REGBASE_CLK:\n\t    return (uint32_t *)bcm2835_clk;\n\tcase BCM2835_REGBASE_PADS:\n\t    return (uint32_t *)bcm2835_pads;\n\tcase BCM2835_REGBASE_SPI0:\n\t    return (uint32_t *)bcm2835_spi0;\n\tcase BCM2835_REGBASE_BSC0:\n\t    return (uint32_t *)bcm2835_bsc0;\n\tcase BCM2835_REGBASE_BSC1:\n\t    return (uint32_t *)bcm2835_st;\n\tcase BCM2835_REGBASE_AUX:\n\t    return (uint32_t *)bcm2835_aux;\n\tcase BCM2835_REGBASE_SPI1:\n\t    return (uint32_t *)bcm2835_spi1;\n\n    }\n    return (uint32_t *)MAP_FAILED;\n}\n\nvoid  bcm2835_set_debug(uint8_t d)\n{\n    debug = d;\n}\n\nunsigned int bcm2835_version(void) \n{\n    return BCM2835_VERSION;\n}\n\n/* Read with memory barriers from peripheral\n *\n */\nuint32_t bcm2835_peri_read(volatile uint32_t* paddr)\n{\n    uint32_t ret;\n    if (debug)\n    {\n\t\tprintf(\"bcm2835_peri_read  paddr %p\\n\", (void *) paddr);\n\t\treturn 0;\n    }\n    else\n    {\n       __sync_synchronize();\n       ret = *paddr;\n       __sync_synchronize();\n       return ret;\n    }\n}\n\n/* read from peripheral without the read barrier\n * This can only be used if more reads to THE SAME peripheral\n * will follow.  The sequence must terminate with memory barrier\n * before any read or write to another peripheral can occur.\n * The MB can be explicit, or one of the barrier read/write calls.\n */\nuint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_read_nb  paddr %p\\n\", paddr);\n\treturn 0;\n    }\n    else\n    {\n\treturn *paddr;\n    }\n}\n\n/* Write with memory barriers to peripheral\n */\n\nvoid bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_write paddr %p, value %08X\\n\", paddr, value);\n    }\n    else\n    {\n        __sync_synchronize();\n        *paddr = value;\n        __sync_synchronize();\n    }\n}\n\n/* write to peripheral without the write barrier */\nvoid bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_write_nb paddr %p, value %08X\\n\",\n                paddr, value);\n    }\n    else\n    {\n\t*paddr = value;\n    }\n}\n\n/* Set/clear only the bits in value covered by the mask\n * This is not atomic - can be interrupted.\n */\nvoid bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask)\n{\n    uint32_t v = bcm2835_peri_read(paddr);\n    v = (v & ~mask) | (value & mask);\n    bcm2835_peri_write(paddr, v);\n}\n\n/*\n// Low level convenience functions\n*/\n\n/* Function select\n// pin is a BCM2835 GPIO pin number NOT RPi pin number\n//      There are 6 control registers, each control the functions of a block\n//      of 10 pins.\n//      Each control register has 10 sets of 3 bits per GPIO pin:\n//\n//      000 = GPIO Pin X is an input\n//      001 = GPIO Pin X is an output\n//      100 = GPIO Pin X takes alternate function 0\n//      101 = GPIO Pin X takes alternate function 1\n//      110 = GPIO Pin X takes alternate function 2\n//      111 = GPIO Pin X takes alternate function 3\n//      011 = GPIO Pin X takes alternate function 4\n//      010 = GPIO Pin X takes alternate function 5\n//\n// So the 3 bits for port X are:\n//      X / 10 + ((X % 10) * 3)\n*/\nvoid bcm2835_gpio_fsel(uint8_t pin, uint8_t mode)\n{\n    /* Function selects are 10 pins per 32 bit word, 3 bits per pin */\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFSEL0/4 + (pin/10);\n    uint8_t   shift = (pin % 10) * 3;\n    uint32_t  mask = BCM2835_GPIO_FSEL_MASK << shift;\n    uint32_t  value = mode << shift;\n    bcm2835_peri_set_bits(paddr, value, mask);\n}\n\n/* Set output pin */\nvoid bcm2835_gpio_set(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPSET0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, 1 << shift);\n}\n\n/* Clear output pin */\nvoid bcm2835_gpio_clr(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPCLR0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, 1 << shift);\n}\n\n/* Set all output pins in the mask */\nvoid bcm2835_gpio_set_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPSET0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Clear all output pins in the mask */\nvoid bcm2835_gpio_clr_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPCLR0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Read input pin */\nuint8_t bcm2835_gpio_lev(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEV0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & (1 << shift)) ? HIGH : LOW;\n}\n\n/* See if an event detection bit is set\n// Sigh cant support interrupts yet\n*/\nuint8_t bcm2835_gpio_eds(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & (1 << shift)) ? HIGH : LOW;\n}\n\nuint32_t bcm2835_gpio_eds_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & mask);\n}\n\n/* Write a 1 to clear the bit in EDS */\nvoid bcm2835_gpio_set_eds(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_write(paddr, value);\n}\n\nvoid bcm2835_gpio_set_eds_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Rising edge detect enable */\nvoid bcm2835_gpio_ren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_ren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Falling edge detect enable */\nvoid bcm2835_gpio_fen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_fen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* High detect enable */\nvoid bcm2835_gpio_hen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPHEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_hen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPHEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Low detect enable */\nvoid bcm2835_gpio_len(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_len(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Async rising edge detect enable */\nvoid bcm2835_gpio_aren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_aren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Async falling edge detect enable */\nvoid bcm2835_gpio_afen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_afen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Set pullup/down */\nvoid bcm2835_gpio_pud(uint8_t pud)\n{\n    if( pud_type_rpi4 )\n    {\n        pud_compat_setting = pud;\n    }\n    else {\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUD/4;\n    bcm2835_peri_write(paddr, pud);\n}\n}\n\n/* Pullup/down clock\n// Clocks the value of pud into the GPIO pin\n*/\nvoid bcm2835_gpio_pudclk(uint8_t pin, uint8_t on)\n{\n    if( pud_type_rpi4 )\n    {\n        if( on )\n            bcm2835_gpio_set_pud( pin, pud_compat_setting);\n    }\n    else\n    {\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUDCLK0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, (on ? 1 : 0) << shift);\n}\n}\n\n/* Read GPIO pad behaviour for groups of GPIOs */\nuint32_t bcm2835_gpio_pad(uint8_t group)\n{\n  if (bcm2835_pads == MAP_FAILED)\n    return 0;\n  \n    volatile uint32_t* paddr = bcm2835_pads + BCM2835_PADS_GPIO_0_27/4 + group;\n    return bcm2835_peri_read(paddr);\n}\n\n/* Set GPIO pad behaviour for groups of GPIOs\n// powerup value for all pads is\n// BCM2835_PAD_SLEW_RATE_UNLIMITED | BCM2835_PAD_HYSTERESIS_ENABLED | BCM2835_PAD_DRIVE_8mA\n*/\nvoid bcm2835_gpio_set_pad(uint8_t group, uint32_t control)\n{\n  if (bcm2835_pads == MAP_FAILED)\n    return;\n  \n    volatile uint32_t* paddr = bcm2835_pads + BCM2835_PADS_GPIO_0_27/4 + group;\n    bcm2835_peri_write(paddr, control | BCM2835_PAD_PASSWRD);\n}\n\n/* Some convenient arduino-like functions\n// milliseconds\n*/\nvoid bcm2835_delay(unsigned int millis)\n{\n    struct timespec sleeper;\n    \n    sleeper.tv_sec  = (time_t)(millis / 1000);\n    sleeper.tv_nsec = (long)(millis % 1000) * 1000000;\n    nanosleep(&sleeper, NULL);\n}\n\n/* microseconds */\nvoid bcm2835_delayMicroseconds(uint64_t micros)\n{\n    struct timespec t1;\n    uint64_t        start;\n\t\n    if (debug)\n    {\n\t/* Cant access sytem timers in debug mode */\n\tprintf(\"bcm2835_delayMicroseconds %lld\\n\", (long long int) micros);\n\treturn;\n    }\n\n    /* Calling nanosleep() takes at least 100-200 us, so use it for\n    // long waits and use a busy wait on the System Timer for the rest.\n    */\n    start =  bcm2835_st_read();\n   \n    /* Not allowed to access timer registers (result is not as precise)*/\n    if (start==0)\n    {\n\tt1.tv_sec = 0;\n\tt1.tv_nsec = 1000 * (long)(micros);\n\tnanosleep(&t1, NULL);\n\treturn;\n    }\n\n    if (micros > 450)\n    {\n\tt1.tv_sec = 0;\n\tt1.tv_nsec = 1000 * (long)(micros - 200);\n\tnanosleep(&t1, NULL);\n    }    \n  \n    bcm2835_st_delay(start, micros);\n}\n\n/*\n// Higher level convenience functions\n*/\n\n/* Set the state of an output */\nvoid bcm2835_gpio_write(uint8_t pin, uint8_t on)\n{\n    if (on)\n\tbcm2835_gpio_set(pin);\n    else\n\tbcm2835_gpio_clr(pin);\n}\n\n/* Set the state of a all 32 outputs in the mask to on or off */\nvoid bcm2835_gpio_write_multi(uint32_t mask, uint8_t on)\n{\n    if (on)\n\tbcm2835_gpio_set_multi(mask);\n    else\n\tbcm2835_gpio_clr_multi(mask);\n}\n\n/* Set the state of a all 32 outputs in the mask to the values in value */\nvoid bcm2835_gpio_write_mask(uint32_t value, uint32_t mask)\n{\n    bcm2835_gpio_set_multi(value & mask);\n    bcm2835_gpio_clr_multi((~value) & mask);\n}\n\n/* Set the pullup/down resistor for a pin\n//\n// The GPIO Pull-up/down Clock Registers control the actuation of internal pull-downs on\n// the respective GPIO pins. These registers must be used in conjunction with the GPPUD\n// register to effect GPIO Pull-up/down changes. The following sequence of events is\n// required:\n// 1. Write to GPPUD to set the required control signal (i.e. Pull-up or Pull-Down or neither\n// to remove the current Pull-up/down)\n// 2. Wait 150 cycles ? this provides the required set-up time for the control signal\n// 3. Write to GPPUDCLK0/1 to clock the control signal into the GPIO pads you wish to\n// modify ? NOTE only the pads which receive a clock will be modified, all others will\n// retain their previous state.\n// 4. Wait 150 cycles ? this provides the required hold time for the control signal\n// 5. Write to GPPUD to remove the control signal\n// 6. Write to GPPUDCLK0/1 to remove the clock\n//\n// RPi has P1-03 and P1-05 with 1k8 pullup resistor\n//\n// RPI 4 uses a different PUD method - no clock\n\n*/\nvoid bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud)\n{\n    if( pud_type_rpi4 )\n    {\n        int shiftbits = (pin & 0xf) << 1;\n        uint32_t bits;\n        uint32_t pull;\n        \n        switch (pud)\n        {\n           case BCM2835_GPIO_PUD_OFF:  pull = 0; break;\n           case BCM2835_GPIO_PUD_UP:   pull = 1; break;\n           case BCM2835_GPIO_PUD_DOWN: pull = 2; break;\n           default: return;\n        }\n                \n        volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUPPDN0/4 + (pin >> 4);\n        \n        bits = bcm2835_peri_read_nb( paddr );\n        bits &= ~(3 << shiftbits);\n        bits |= (pull << shiftbits);\n        \n        bcm2835_peri_write_nb( paddr, bits );\n        \n    } else\n    {\n    bcm2835_gpio_pud(pud);\n    delayMicroseconds(10);\n    bcm2835_gpio_pudclk(pin, 1);\n    delayMicroseconds(10);\n    bcm2835_gpio_pud(BCM2835_GPIO_PUD_OFF);\n    bcm2835_gpio_pudclk(pin, 0);\n}\n\n}\n\n\nuint8_t bcm2835_gpio_get_pud(uint8_t pin)\n{\n    uint8_t ret = BCM2835_GPIO_PUD_ERROR;\n    \n    if( pud_type_rpi4 )\n    {\n        uint32_t bits;\n        volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUPPDN0/4 + (pin >> 4);\n        bits = (bcm2835_peri_read_nb( paddr ) >> ((pin & 0xf)<<1)) & 0x3;\n        \n        switch (bits)\n        {\n            case 0: ret = BCM2835_GPIO_PUD_OFF; break;\n            case 1: ret = BCM2835_GPIO_PUD_UP; break;\n            case 2: ret = BCM2835_GPIO_PUD_DOWN; break;\n            default: ret = BCM2835_GPIO_PUD_ERROR;\n        }   \n    }\n    \n    return ret;\n}\n\nstatic void bcm2835_aux_spi_reset(void)\n {\n     volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n     volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n \n     bcm2835_peri_write(cntl1, 0);\n     bcm2835_peri_write(cntl0, BCM2835_AUX_SPI_CNTL0_CLEARFIFO);\n}\n\nint bcm2835_spi_begin(void)\n{\n    volatile uint32_t* paddr;\n\n    if (bcm2835_spi0 == MAP_FAILED)\n      return 0; /* bcm2835_init() failed, or not root */\n    \n    /* Set the SPI0 pins to the Alt 0 function to enable SPI0 access on them */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_26, BCM2835_GPIO_FSEL_ALT0); /* CE1 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_24, BCM2835_GPIO_FSEL_ALT0); /* CE0 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_21, BCM2835_GPIO_FSEL_ALT0); /* MISO */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_19, BCM2835_GPIO_FSEL_ALT0); /* MOSI */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_23, BCM2835_GPIO_FSEL_ALT0); /* CLK */\n    \n    /* Set the SPI CS register to the some sensible defaults */\n    paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    bcm2835_peri_write(paddr, 0); /* All 0s */\n    \n    /* Clear TX and RX fifos */\n    bcm2835_peri_write_nb(paddr, BCM2835_SPI0_CS_CLEAR);\n\n    return 1; // OK\n}\n\nvoid bcm2835_spi_end(void)\n{  \n    /* Set all the SPI0 pins back to input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_26, BCM2835_GPIO_FSEL_INPT); /* CE1 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_24, BCM2835_GPIO_FSEL_INPT); /* CE0 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_21, BCM2835_GPIO_FSEL_INPT); /* MISO */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_19, BCM2835_GPIO_FSEL_INPT); /* MOSI */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_23, BCM2835_GPIO_FSEL_INPT); /* CLK */\n}\n\nvoid bcm2835_spi_setBitOrder(uint8_t order)\n{\n    bcm2835_spi_bit_order = order;\n}\n\n/* defaults to 0, which means a divider of 65536.\n// The divisor must be a power of 2. Odd numbers\n// rounded down. The maximum SPI clock rate is\n// of the APB clock\n*/\nvoid bcm2835_spi_setClockDivider(uint16_t divider)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CLK/4;\n    bcm2835_peri_write(paddr, divider);\n}\n\nvoid bcm2835_spi_set_speed_hz(uint32_t speed_hz)\n{\n\tuint16_t divider = (uint16_t) ((uint32_t) BCM2835_CORE_CLK_HZ / speed_hz);\n\tdivider &= 0xFFFE;\n\tbcm2835_spi_setClockDivider(divider);\n}\n\nvoid bcm2835_spi_setDataMode(uint8_t mode)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    /* Mask in the CPO and CPHA bits of CS */\n    bcm2835_peri_set_bits(paddr, mode << 2, BCM2835_SPI0_CS_CPOL | BCM2835_SPI0_CS_CPHA);\n}\n\n/* Writes (and reads) a single byte to SPI */\nuint8_t bcm2835_spi_transfer(uint8_t value)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t ret;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral? \n    // Clear TX and RX fifos\n    */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    /* Maybe wait for TXD */\n    while (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t;\n\n    /* Write to FIFO, no barrier */\n    bcm2835_peri_write_nb(fifo, bcm2835_correct_order(value));\n\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Read any byte that was sent back by the slave while we sere sending to it */\n    ret = bcm2835_correct_order(bcm2835_peri_read_nb(fifo));\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n\n    return ret;\n}\n\n/* Writes (and reads) an number of bytes to SPI */\nvoid bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t TXCnt=0;\n    uint32_t RXCnt=0;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral? \n    */\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    /* Use the FIFO's to reduce the interbyte times */\n    while((TXCnt < len)||(RXCnt < len))\n    {\n        /* TX fifo not full, so add some more bytes */\n        while(((bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))&&(TXCnt < len ))\n        {\n\t    bcm2835_peri_write_nb(fifo, bcm2835_correct_order(tbuf[TXCnt]));\n\t    TXCnt++;\n        }\n        /* Rx fifo not empty, so get the next received bytes */\n        while(((bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD))&&( RXCnt < len ))\n        {\n\t    rbuf[RXCnt] = bcm2835_correct_order(bcm2835_peri_read_nb(fifo));\n\t    RXCnt++;\n        }\n    }\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n}\n\n/* Writes an number of bytes to SPI */\nvoid bcm2835_spi_writenb(const char* tbuf, uint32_t len)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t i;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral?\n    // Answer: an ISR is required to issue the required memory barriers.\n    */\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    for (i = 0; i < len; i++)\n    {\n\t/* Maybe wait for TXD */\n\twhile (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t    ;\n\t\n\t/* Write to FIFO, no barrier */\n\tbcm2835_peri_write_nb(fifo, bcm2835_correct_order(tbuf[i]));\n\t\n\t/* Read from FIFO to prevent stalling */\n\twhile (bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD)\n\t    (void) bcm2835_peri_read_nb(fifo);\n    }\n    \n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) {\n\twhile (bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD)\n\t\t(void) bcm2835_peri_read_nb(fifo);\n    };\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n}\n\n/* Writes (and reads) an number of bytes to SPI\n// Read bytes are copied over onto the transmit buffer\n*/\nvoid bcm2835_spi_transfern(char* buf, uint32_t len)\n{\n    bcm2835_spi_transfernb(buf, buf, len);\n}\n\nvoid bcm2835_spi_chipSelect(uint8_t cs)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    /* Mask in the CS bits of CS */\n    bcm2835_peri_set_bits(paddr, cs, BCM2835_SPI0_CS_CS);\n}\n\nvoid bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    uint8_t shift = 21 + cs;\n    /* Mask in the appropriate CSPOLn bit */\n    bcm2835_peri_set_bits(paddr, active << shift, 1 << shift);\n}\n\nvoid bcm2835_spi_write(uint16_t data)\n{\n#if 0\n\tchar buf[2];\n\n\tbuf[0] = data >> 8;\n\tbuf[1] = data & 0xFF;\n\n\tbcm2835_spi_transfern(buf, 2);\n#else\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n\t/* Maybe wait for TXD */\n\twhile (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t    ;\n\n\t/* Write to FIFO */\n\tbcm2835_peri_write_nb(fifo,  (uint32_t) data >> 8);\n\tbcm2835_peri_write_nb(fifo,  data & 0xFF);\n\n\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n#endif\n}\n\nint bcm2835_aux_spi_begin(void)\n{\n    volatile uint32_t* enable = bcm2835_aux + BCM2835_AUX_ENABLE/4;\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n\n    if (bcm2835_spi1 == MAP_FAILED)\n\treturn 0; /* bcm2835_init() failed, or not root */\n\n    /* Set the SPI pins to the Alt 4 function to enable SPI1 access on them */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_36, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_CE2_N */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_35, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_MISO */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_38, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_MOSI */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_40, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_SCLK */\n\n    bcm2835_aux_spi_setClockDivider(bcm2835_aux_spi_CalcClockDivider(1000000));\t// Default 1MHz SPI\n\n    bcm2835_peri_write(enable, BCM2835_AUX_ENABLE_SPI0);\n    bcm2835_peri_write(cntl1, 0);\n    bcm2835_peri_write(cntl0, BCM2835_AUX_SPI_CNTL0_CLEARFIFO);\n\n    return 1; /* OK */\n}\n\nvoid bcm2835_aux_spi_end(void)\n{\n    /* Set all the SPI1 pins back to input */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_36, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_CE2_N */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_35, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_MISO */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_38, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_MOSI */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_40, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_SCLK */\n}\n\n#define DIV_ROUND_UP(n,d)\t(((n) + (d) - 1) / (d))\n\nuint16_t bcm2835_aux_spi_CalcClockDivider(uint32_t speed_hz)\n{\n    uint16_t divider;\n\n    if (speed_hz < (uint32_t) BCM2835_AUX_SPI_CLOCK_MIN) {\n\tspeed_hz = (uint32_t) BCM2835_AUX_SPI_CLOCK_MIN;\n    } else if (speed_hz > (uint32_t) BCM2835_AUX_SPI_CLOCK_MAX) {\n\tspeed_hz = (uint32_t) BCM2835_AUX_SPI_CLOCK_MAX;\n    }\n\n    divider = (uint16_t) DIV_ROUND_UP(BCM2835_CORE_CLK_HZ, 2 * speed_hz) - 1;\n\n    if (divider > (uint16_t) BCM2835_AUX_SPI_CNTL0_SPEED_MAX) {\n\treturn (uint16_t) BCM2835_AUX_SPI_CNTL0_SPEED_MAX;\n    }\n\n    return divider;\n}\n\nstatic uint32_t spi1_speed;\n\nvoid bcm2835_aux_spi_setClockDivider(uint16_t divider)\n{\n    spi1_speed = (uint32_t) divider;\n}\n\nvoid bcm2835_aux_spi_write(uint16_t data)\n{\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= 16; // Shift length\n\n    bcm2835_peri_write(cntl0, _cntl0);\n    bcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n    while (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL)\n\t;\n\n    bcm2835_peri_write(io, (uint32_t) data << 16);\n}\n\nvoid bcm2835_aux_spi_writenb(const char *tbuf, uint32_t len) {\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* txhold = bcm2835_spi1 + BCM2835_AUX_SPI_TXHOLD/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    char *tx = (char *) tbuf;\n    uint32_t tx_len = len;\n    uint32_t count;\n    uint32_t data;\n    uint32_t i;\n    uint8_t byte;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_VAR_WIDTH;\n\n    bcm2835_peri_write(cntl0, _cntl0);\n    bcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n    while (tx_len > 0) {\n\n\twhile (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL)\n\t    ;\n\n\tcount = MIN(tx_len, 3);\n\tdata = 0;\n\n\tfor (i = 0; i < count; i++) {\n\t    byte = (tx != NULL) ? (uint8_t) *tx++ : (uint8_t) 0;\n\t    data |= byte << (8 * (2 - i));\n\t}\n\n\tdata |= (count * 8) << 24;\n\ttx_len -= count;\n\n\tif (tx_len != 0) {\n\t    bcm2835_peri_write(txhold, data);\n\t} else {\n\t    bcm2835_peri_write(io, data);\n\t}\n\n\twhile (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY)\n\t    ;\n\n\t(void) bcm2835_peri_read(io);\n    }\n}\n\nvoid bcm2835_aux_spi_transfernb(const char *tbuf, char *rbuf, uint32_t len) {\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* txhold = bcm2835_spi1 + BCM2835_AUX_SPI_TXHOLD/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n\tchar *tx = (char *)tbuf;\n\tchar *rx = (char *)rbuf;\n\tuint32_t tx_len = len;\n\tuint32_t rx_len = len;\n\tuint32_t count;\n\tuint32_t data;\n\tuint32_t i;\n\tuint8_t byte;\n\n\tuint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_VAR_WIDTH;\n\n\tbcm2835_peri_write(cntl0, _cntl0);\n\tbcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n\twhile ((tx_len > 0) || (rx_len > 0)) {\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL) && (tx_len > 0)) {\n\t\t\tcount = MIN(tx_len, 3);\n\t\t\tdata = 0;\n\n\t\t\tfor (i = 0; i < count; i++) {\n\t\t\t\tbyte = (tx != NULL) ? (uint8_t) *tx++ : (uint8_t) 0;\n\t\t\t\tdata |= byte << (8 * (2 - i));\n\t\t\t}\n\n\t\t\tdata |= (count * 8) << 24;\n\t\t\ttx_len -= count;\n\n\t\t\tif (tx_len != 0) {\n\t\t\t\tbcm2835_peri_write(txhold, data);\n\t\t\t} else {\n\t\t\t\tbcm2835_peri_write(io, data);\n\t\t\t}\n\n\t\t}\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_RX_EMPTY) && (rx_len > 0)) {\n\t\t\tcount = MIN(rx_len, 3);\n\t\t\tdata = bcm2835_peri_read(io);\n\n\t\t\tif (rbuf != NULL) {\n\t\t\t\tswitch (count) {\n\t\t\t\tcase 3:\n\t\t\t\t\t*rx++ = (char)((data >> 16) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 2:\n\t\t\t\t\t*rx++ = (char)((data >> 8) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 1:\n\t\t\t\t\t*rx++ = (char)((data >> 0) & 0xFF);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trx_len -= count;\n\t\t}\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY) && (rx_len > 0)) {\n\t\t\tcount = MIN(rx_len, 3);\n\t\t\tdata = bcm2835_peri_read(io);\n\n\t\t\tif (rbuf != NULL) {\n\t\t\t\tswitch (count) {\n\t\t\t\tcase 3:\n\t\t\t\t\t*rx++ = (char)((data >> 16) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 2:\n\t\t\t\t\t*rx++ = (char)((data >> 8) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 1:\n\t\t\t\t\t*rx++ = (char)((data >> 0) & 0xFF);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trx_len -= count;\n\t\t}\n\t}\n}\n\nvoid bcm2835_aux_spi_transfern(char *buf, uint32_t len) {\n\tbcm2835_aux_spi_transfernb(buf, buf, len);\n}\n\n/* Writes (and reads) a single byte to AUX SPI */\nuint8_t bcm2835_aux_spi_transfer(uint8_t value)\n{\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    uint32_t data;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CPHA_IN;\n    _cntl0 |= 8; // Shift length.\n\n    uint32_t _cntl1 = BCM2835_AUX_SPI_CNTL1_MSBF_IN;\n\n    bcm2835_peri_write(cntl1, _cntl1);\n    bcm2835_peri_write(cntl0, _cntl0);\n\n    bcm2835_peri_write(io, (uint32_t) bcm2835_correct_order(value) << 24);\n\n    while (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY)\n        ;\n\n    data = bcm2835_correct_order(bcm2835_peri_read(io) & 0xff);\n\n    bcm2835_aux_spi_reset();\n\n    return data;\n}\n\n\nint bcm2835_i2c_begin(void)\n{\n    uint16_t cdiv;\n\n    if (   bcm2835_bsc0 == MAP_FAILED\n\t|| bcm2835_bsc1 == MAP_FAILED)\n      return 0; /* bcm2835_init() failed, or not root */\n\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_DIV/4;\n    /* Set the I2C/BSC0 pins to the Alt 0 function to enable I2C access on them */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_03, BCM2835_GPIO_FSEL_ALT0); /* SDA */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_05, BCM2835_GPIO_FSEL_ALT0); /* SCL */\n#else\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_DIV/4;\n    /* Set the I2C/BSC1 pins to the Alt 0 function to enable I2C access on them */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_03, BCM2835_GPIO_FSEL_ALT0); /* SDA */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_05, BCM2835_GPIO_FSEL_ALT0); /* SCL */\n#endif    \n\n    /* Read the clock divider register */\n    cdiv = bcm2835_peri_read(paddr);\n    /* Calculate time for transmitting one byte\n    // 1000000 = micros seconds in a second\n    // 9 = Clocks per byte : 8 bits + ACK\n    */\n    i2c_byte_wait_us = ((float)cdiv / BCM2835_CORE_CLK_HZ) * 1000000 * 9;\n\n    return 1;\n}\n\nvoid bcm2835_i2c_end(void)\n{\n#ifdef I2C_V1\n    /* Set all the I2C/BSC0 pins back to input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_03, BCM2835_GPIO_FSEL_INPT); /* SDA */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_05, BCM2835_GPIO_FSEL_INPT); /* SCL */\n#else\n    /* Set all the I2C/BSC1 pins back to input */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_03, BCM2835_GPIO_FSEL_INPT); /* SDA */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_05, BCM2835_GPIO_FSEL_INPT); /* SCL */\n#endif\n}\n\nvoid bcm2835_i2c_setSlaveAddress(uint8_t addr)\n{\n    /* Set I2C Device Address */\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_A/4;\n#else\t\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_A/4;\n#endif\n    bcm2835_peri_write(paddr, addr);\n}\n\n/* defaults to 0x5dc, should result in a 166.666 kHz I2C clock frequency.\n// The divisor must be a power of 2. Odd numbers\n// rounded down.\n*/\nvoid bcm2835_i2c_setClockDivider(uint16_t divider)\n{\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_DIV/4;\n#else\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_DIV/4;\n#endif    \n    bcm2835_peri_write(paddr, divider);\n    /* Calculate time for transmitting one byte\n    // 1000000 = micros seconds in a second\n    // 9 = Clocks per byte : 8 bits + ACK\n    */\n    i2c_byte_wait_us = ((float)divider / BCM2835_CORE_CLK_HZ) * 1000000 * 9;\n}\n\n/* set I2C clock divider by means of a baudrate number */\nvoid bcm2835_i2c_set_baudrate(uint32_t baudrate)\n{\n\tuint32_t divider;\n\t/* use 0xFFFE mask to limit a max value and round down any odd number */\n\tdivider = (BCM2835_CORE_CLK_HZ / baudrate) & 0xFFFE;\n\tbcm2835_i2c_setClockDivider( (uint16_t)divider );\n}\n\n/* Writes an number of bytes to I2C */\nuint8_t bcm2835_i2c_write(const char * buf, uint32_t len)\n{\n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n\n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, len);\n    /* pre populate FIFO with max buffer */\n    while( remaining && ( i < BCM2835_BSC_FIFO_SIZE ) )\n    {\n        bcm2835_peri_write_nb(fifo, buf[i]);\n        i++;\n        remaining--;\n    }\n    \n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* Transfer is over when BCM2835_BSC_S_DONE */\n    while(!(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE ))\n    {\n        while ( remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_TXD ))\n    \t{\n\t    /* Write to FIFO */\n\t    bcm2835_peri_write(fifo, buf[i]);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n\n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read an number of bytes from I2C */\nuint8_t bcm2835_i2c_read(char* buf, uint32_t len)\n{\n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n\n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write_nb(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write_nb(dlen, len);\n    /* Start read */\n    bcm2835_peri_write_nb(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST | BCM2835_BSC_C_READ);\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read_nb(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO, no barrier */\n\t    buf[i] = bcm2835_peri_read_nb(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read_nb(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO, no barrier */\n        buf[i] = bcm2835_peri_read_nb(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is received */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(status, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read an number of bytes from I2C sending a repeated start after writing\n// the required register. Only works if your device supports this mode\n*/\nuint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len)\n{   \n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\tuint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n    \n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, 1);\n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN);\n    bcm2835_peri_write(fifo, regaddr[0]);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* poll for transfer has started */\n    while ( !( bcm2835_peri_read(status) & BCM2835_BSC_S_TA ) )\n    {\n        /* Linux may cause us to miss entire transfer stage */\n        if(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE)\n            break;\n    }\n    \n    /* Send a repeated start with read bit set in address */\n    bcm2835_peri_write(dlen, len);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST  | BCM2835_BSC_C_READ );\n    \n    /* Wait for write to complete and first byte back. */\n    bcm2835_delayMicroseconds(i2c_byte_wait_us * 3);\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO */\n\t    buf[i] = bcm2835_peri_read(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO */\n        buf[i] = bcm2835_peri_read(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\t\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Sending an arbitrary number of bytes before issuing a repeated start \n// (with no prior stop) and reading a response. Some devices require this behavior.\n*/\nuint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* buf, uint32_t buf_len)\n{   \n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = cmds_len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n    \n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, cmds_len);\n \n    /* pre populate FIFO with max buffer */\n    while( remaining && ( i < BCM2835_BSC_FIFO_SIZE ) )\n    {\n        bcm2835_peri_write_nb(fifo, cmds[i]);\n        i++;\n        remaining--;\n    }\n\n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* poll for transfer has started (way to do repeated start, from BCM2835 datasheet) */\n    while ( !( bcm2835_peri_read(status) & BCM2835_BSC_S_TA ) )\n    {\n        /* Linux may cause us to miss entire transfer stage */\n        if(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE)\n            break;\n    }\n    \n    remaining = buf_len;\n    i = 0;\n\n    /* Send a repeated start with read bit set in address */\n    bcm2835_peri_write(dlen, buf_len);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST  | BCM2835_BSC_C_READ );\n    \n    /* Wait for write to complete and first byte back. */\n    bcm2835_delayMicroseconds(i2c_byte_wait_us * (cmds_len + 1));\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO, no barrier */\n\t    buf[i] = bcm2835_peri_read_nb(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO */\n        buf[i] = bcm2835_peri_read(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read the System Timer Counter (64-bits) */\nuint64_t bcm2835_st_read(void)\n{\n    volatile uint32_t* paddr;\n    uint32_t hi, lo;\n    uint64_t st;\n\n    if (bcm2835_st==MAP_FAILED)\n\treturn 0;\n\n    paddr = bcm2835_st + BCM2835_ST_CHI/4;\n    hi = bcm2835_peri_read(paddr);\n\n    paddr = bcm2835_st + BCM2835_ST_CLO/4;\n    lo = bcm2835_peri_read(paddr);\n    \n    paddr = bcm2835_st + BCM2835_ST_CHI/4;\n    st = bcm2835_peri_read(paddr);\n    \n    /* Test for overflow */\n    if (st == hi)\n    {\n        st <<= 32;\n        st += lo;\n    }\n    else\n    {\n        st <<= 32;\n        paddr = bcm2835_st + BCM2835_ST_CLO/4;\n        st += bcm2835_peri_read(paddr);\n    }\n    return st;\n}\n\n/* Delays for the specified number of microseconds with offset */\nvoid bcm2835_st_delay(uint64_t offset_micros, uint64_t micros)\n{\n    uint64_t compare = offset_micros + micros;\n\n    while(bcm2835_st_read() < compare)\n\t;\n}\n\n/* PWM */\n\nvoid bcm2835_pwm_set_clock(uint32_t divisor)\n{\n    if (   bcm2835_clk == MAP_FAILED\n        || bcm2835_pwm == MAP_FAILED)\n      return; /* bcm2835_init() failed or not root */\n  \n    /* From Gerts code */\n    divisor &= 0xfff;\n    /* Stop PWM clock */\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x01);\n    bcm2835_delay(110); /* Prevents clock going slow */\n    /* Wait for the clock to be not busy */\n    while ((bcm2835_peri_read(bcm2835_clk + BCM2835_PWMCLK_CNTL) & 0x80) != 0)\n\tbcm2835_delay(1); \n    /* set the clock divider and enable PWM clock */\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_DIV, BCM2835_PWM_PASSWRD | (divisor << 12));\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x11); /* Source=osc and enable */\n}\n\nvoid bcm2835_pwm_set_mode(uint8_t channel, uint8_t markspace, uint8_t enabled)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  uint32_t control = bcm2835_peri_read(bcm2835_pwm + BCM2835_PWM_CONTROL);\n\n  if (channel == 0)\n    {\n      if (markspace)\n\tcontrol |= BCM2835_PWM0_MS_MODE;\n      else\n\tcontrol &= ~BCM2835_PWM0_MS_MODE;\n      if (enabled)\n\tcontrol |= BCM2835_PWM0_ENABLE;\n      else\n\tcontrol &= ~BCM2835_PWM0_ENABLE;\n    }\n  else if (channel == 1)\n    {\n      if (markspace)\n\tcontrol |= BCM2835_PWM1_MS_MODE;\n      else\n\tcontrol &= ~BCM2835_PWM1_MS_MODE;\n      if (enabled)\n\tcontrol |= BCM2835_PWM1_ENABLE;\n      else\n\tcontrol &= ~BCM2835_PWM1_ENABLE;\n    }\n\n  /* If you use the barrier here, wierd things happen, and the commands dont work */\n  bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM_CONTROL, control);\n  /*  bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM_CONTROL, BCM2835_PWM0_ENABLE | BCM2835_PWM1_ENABLE | BCM2835_PWM0_MS_MODE | BCM2835_PWM1_MS_MODE); */\n\n}\n\nvoid bcm2835_pwm_set_range(uint8_t channel, uint32_t range)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  if (channel == 0)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM0_RANGE, range);\n  else if (channel == 1)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM1_RANGE, range);\n}\n\nvoid bcm2835_pwm_set_data(uint8_t channel, uint32_t data)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  if (channel == 0)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM0_DATA, data);\n  else if (channel == 1)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM1_DATA, data);\n}\n\n/* Allocate page-aligned memory. */\nvoid *malloc_aligned(size_t size)\n{\n    void *mem;\n    errno = posix_memalign(&mem, BCM2835_PAGE_SIZE, size);\n    return (errno ? NULL : mem);\n}\n\n/* Map 'size' bytes starting at 'off' in file 'fd' to memory.\n// Return mapped address on success, MAP_FAILED otherwise.\n// On error print message.\n*/\nstatic void *mapmem(const char *msg, size_t size, int fd, off_t off)\n{\n    void *map = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, off);\n    if (map == MAP_FAILED)\n\tfprintf(stderr, \"bcm2835_init: %s mmap failed: %s\\n\", msg, strerror(errno));\n    return map;\n}\n\nstatic void unmapmem(void **pmem, size_t size)\n{\n    if (*pmem == MAP_FAILED) return;\n    munmap(*pmem, size);\n    *pmem = MAP_FAILED;\n}\n\n/* Initialise this library. */\nint bcm2835_init(void)\n{\n    int  memfd;\n    int  ok;\n    FILE *fp;\n\n    if (debug) \n    {\n        bcm2835_peripherals = (uint32_t*)BCM2835_PERI_BASE;\n\n\tbcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n\tbcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n\tbcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n\tbcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n\tbcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n\tbcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4;\n\tbcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4;\n\tbcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n\tbcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n\tbcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n\treturn 1; /* Success */\n    }\n\n    /* Figure out the base and size of the peripheral address block\n    // using the device-tree. Required for RPi2/3/4, optional for RPi 1\n    */\n    if ((fp = fopen(BMC2835_RPI2_DT_FILENAME , \"rb\")))\n    {\n        unsigned char buf[16];\n        uint32_t base_address;\n        uint32_t peri_size;\n        if (fread(buf, 1, sizeof(buf), fp) >= 8)\n        {\n            base_address = (buf[4] << 24) |\n              (buf[5] << 16) |\n              (buf[6] << 8) |\n              (buf[7] << 0);\n            \n            peri_size = (buf[8] << 24) |\n              (buf[9] << 16) |\n              (buf[10] << 8) |\n              (buf[11] << 0);\n            \n            if (!base_address)\n            {\n                /* looks like RPI 4 */\n                base_address = (buf[8] << 24) |\n                      (buf[9] << 16) |\n                      (buf[10] << 8) |\n                      (buf[11] << 0);\n                      \n                peri_size = (buf[12] << 24) |\n                (buf[13] << 16) |\n                (buf[14] << 8) |\n                (buf[15] << 0);\n            }\n            /* check for valid known range formats */\n            if ((buf[0] == 0x7e) &&\n                    (buf[1] == 0x00) &&\n                    (buf[2] == 0x00) &&\n                    (buf[3] == 0x00) &&\n                    ((base_address == BCM2835_PERI_BASE) || (base_address == BCM2835_RPI2_PERI_BASE) || (base_address == BCM2835_RPI4_PERI_BASE)))\n            {\n                bcm2835_peripherals_base = (off_t)base_address;\n                bcm2835_peripherals_size = (size_t)peri_size;\n                if( base_address == BCM2835_RPI4_PERI_BASE )\n                {\n                    pud_type_rpi4 = 1;\n                }\n            }\n        \n        }\n        \n\tfclose(fp);\n    }\n    /* else we are prob on RPi 1 with BCM2835, and use the hardwired defaults */\n\n    /* Now get ready to map the peripherals block \n     * If we are not root, try for the new /dev/gpiomem interface and accept\n     * the fact that we can only access GPIO\n     * else try for the /dev/mem interface and get access to everything\n     */\n    memfd = -1;\n    ok = 0;\n    if (geteuid() == 0\n#ifdef BCM2835_HAVE_LIBCAP\n\t|| bcm2835_has_capability(CAP_SYS_RAWIO)\n#endif\n\t)\n    {\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/mem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/mem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      \n      /* Now compute the base addresses of various peripherals, \n      // which are at fixed offsets within the mapped peripherals block\n      // Caution: bcm2835_peripherals is uint32_t*, so divide offsets by 4\n      */\n      bcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n      bcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n      bcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n      bcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n      bcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n      bcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4; /* I2C */\n      bcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4; /* I2C */\n      bcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n      bcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n      bcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n      ok = 1;\n    }\n    else\n    {\n      /* Not root, try /dev/gpiomem */\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/gpiomem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/gpiomem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals_base = 0;\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      bcm2835_gpio = bcm2835_peripherals;\n      ok = 1;\n    }\n\nexit:\n    if (memfd >= 0)\n        close(memfd);\n\n    if (!ok)\n\tbcm2835_close();\n\n    return ok;\n}\n\n/* Close this library and deallocate everything */\nint bcm2835_close(void)\n{\n    if (debug) return 1; /* Success */\n\n    unmapmem((void**) &bcm2835_peripherals, bcm2835_peripherals_size);\n    bcm2835_peripherals = MAP_FAILED;\n    bcm2835_gpio = MAP_FAILED;\n    bcm2835_pwm  = MAP_FAILED;\n    bcm2835_clk  = MAP_FAILED;\n    bcm2835_pads = MAP_FAILED;\n    bcm2835_spi0 = MAP_FAILED;\n    bcm2835_bsc0 = MAP_FAILED;\n    bcm2835_bsc1 = MAP_FAILED;\n    bcm2835_st   = MAP_FAILED;\n    bcm2835_aux  = MAP_FAILED;\n    bcm2835_spi1 = MAP_FAILED;\n    return 1; /* Success */\n}    \n\n#ifdef BCM2835_TEST\n/* this is a simple test program that prints out what it will do rather than \n// actually doing it\n*/\nint main(int argc, char **argv)\n{\n    /* Be non-destructive */\n    bcm2835_set_debug(1);\n\n    if (!bcm2835_init())\n\treturn 1;\n\n    /* Configure some GPIO pins fo some testing\n    // Set RPI pin P1-11 to be an output\n    */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_11, BCM2835_GPIO_FSEL_OUTP);\n    /* Set RPI pin P1-15 to be an input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_15, BCM2835_GPIO_FSEL_INPT);\n    /*  with a pullup */\n    bcm2835_gpio_set_pud(RPI_GPIO_P1_15, BCM2835_GPIO_PUD_UP);\n    /* And a low detect enable */\n    bcm2835_gpio_len(RPI_GPIO_P1_15);\n    /* and input hysteresis disabled on GPIOs 0 to 27 */\n    bcm2835_gpio_set_pad(BCM2835_PAD_GROUP_GPIO_0_27, BCM2835_PAD_SLEW_RATE_UNLIMITED|BCM2835_PAD_DRIVE_8mA);\n\n#if 1\n    /* Blink */\n    while (1)\n    {\n\t/* Turn it on */\n\tbcm2835_gpio_write(RPI_GPIO_P1_11, HIGH);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n\t\n\t/* turn it off */\n\tbcm2835_gpio_write(RPI_GPIO_P1_11, LOW);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n#if 0\n    /* Read input */\n    while (1)\n    {\n\t/* Read some data */\n\tuint8_t value = bcm2835_gpio_lev(RPI_GPIO_P1_15);\n\tprintf(\"read from pin 15: %d\\n\", value);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n#if 0\n    /* Look for a low event detection\n    // eds will be set whenever pin 15 goes low\n    */\n    while (1)\n    {\n\tif (bcm2835_gpio_eds(RPI_GPIO_P1_15))\n\t{\n\t    /* Now clear the eds flag by setting it to 1 */\n\t    bcm2835_gpio_set_eds(RPI_GPIO_P1_15);\n\t    printf(\"low event detect for pin 15\\n\");\n\t}\n\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n    if (!bcm2835_close())\n\treturn 1;\n\n    return 0;\n}\n#endif\n\n\n\n"
  },
  {
    "path": "LinuxCNC/Components/Remora/bcm2835.h",
    "content": "/* bcm2835.h\n  \n   C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi\n  \n   Author: Mike McCauley\n   Copyright (C) 2011-2013 Mike McCauley\n   $Id: bcm2835.h,v 1.26 2020/01/11 05:07:13 mikem Exp mikem $\n*/\n\n/*! \\mainpage C library for Broadcom BCM 2835 as used in Raspberry Pi\n  \n  This is a C library for Raspberry Pi (RPi). It provides access to \n  GPIO and other IO functions on the Broadcom BCM 2835 chip, as used in the RaspberryPi,\n  allowing access to the GPIO pins on the\n  26 pin IDE plug on the RPi board so you can control and interface with various external devices.\n  \n  It provides functions for reading digital inputs and setting digital outputs, using SPI and I2C,\n  and for accessing the system timers.\n  Pin event detection is supported by polling (interrupts are not supported).\n\n  Works on all versions upt to and including RPI 4. \n  Works with all versions of Debian up to and including Debian Buster 10.\n  \n  It is C++ compatible, and installs as a header file and non-shared library on \n  any Linux-based distro (but clearly is no use except on Raspberry Pi or another board with \n  BCM 2835).\n  \n  The version of the package that this documentation refers to can be downloaded \n  from http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz\n  You can find the latest version at http://www.airspayce.com/mikem/bcm2835\n  \n  Several example programs are provided.\n  \n  Based on data in http://elinux.org/RPi_Low-level_peripherals and \n  http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf\n  and http://www.scribd.com/doc/101830961/GPIO-Pads-Control2\n  \n  You can also find online help and discussion at http://groups.google.com/group/bcm2835\n  Please use that group for all questions and discussions on this topic. \n  Do not contact the author directly, unless it is to discuss commercial licensing.\n  Before asking a question or reporting a bug, please read \n  - http://en.wikipedia.org/wiki/Wikipedia:Reference_desk/How_to_ask_a_software_question\n  - http://www.catb.org/esr/faqs/smart-questions.html\n  - http://www.chiark.greenend.org.uk/~shgtatham/bugs.html\n  \n  Tested on debian6-19-04-2012, 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian\n  and Occidentalisv01, 2016-02-09 Raspbian Jessie.\n  CAUTION: it has been observed that when detect enables such as bcm2835_gpio_len() \n  are used and the pin is pulled LOW\n  it can cause temporary hangs on 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian\n  and Occidentalisv01.\n  Reason for this is not yet determined, but we suspect that an interrupt handler is\n  hitting a hard loop on those OSs.\n  If you must use bcm2835_gpio_len() and friends, make sure you disable the pins with \n  bcm2835_gpio_clr_len() and friends after use. \n  \n  \\par Running as root\n\n  Prior to the release of Raspbian Jessie in Feb 2016, access to any\n  peripheral device via /dev/mem on the RPi required the process to\n  run as root. Raspbian Jessie permits non-root users to access the\n  GPIO peripheral (only) via /dev/gpiomem, and this library supports\n  that limited mode of operation.\n\n  If the library runs with effective UID of 0 (ie root), then\n  bcm2835_init() will attempt to open /dev/mem, and, if successful, it\n  will permit use of all peripherals and library functions.\n\n  If the library runs with any other effective UID (ie not root), then\n  bcm2835_init() will attempt to open /dev/gpiomem, and, if\n  successful, will only permit GPIO operations. In particular,\n  bcm2835_spi_begin() and bcm2835_i2c_begin() will return false and all\n  other non-gpio operations may fail silently or crash.\n\n  If your program needs acccess to /dev/mem but not as root, \n  and if you have the libcap-dev package installed on the target, \n  you can compile this library to use\n  libcap2 so that it tests whether the exceutable has the cap_sys_rawio capability, and therefore\n  permission to access /dev/mem.\n  To enable this ability, uncomment the #define BCM2835_HAVE_LIBCAP in bcm2835.h or \n  -DBCM2835_HAVE_LIBCAP on your compiler command line.\n  After your program has been compiled:\n  \\code\n  sudo setcap cap_sys_rawio+ep *myprogname*\n  \\endcode\n  You also need to do these steps on the host once, to support libcap and not-root read/write access \n  to /dev/mem:\n  1. Install libcap support\n  \\code\n    sudo apt-get install libcap2 libcap-dev\n  2. Add current user to kmem group\n  \\code\n    sudo adduser $USER kmem\n  \\endcode\n  3. Allow write access to /dev/mem by members of kmem group\n  \\code\n    echo 'SUBSYSTEM==\"mem\", KERNEL==\"mem\", GROUP=\"kmem\", MODE=\"0660\"' | sudo tee /etc/udev/rules.d/98-mem.rules\n  \\endcode\n  \\code\n    sudo reboot\n  \\endcode\n\n  \\par Installation\n  \n  This library consists of a single non-shared library and header file, which will be\n  installed in the usual places by make install\n  \n  \\code\n  # download the latest version of the library, say bcm2835-1.xx.tar.gz, then:\n  tar zxvf bcm2835-1.xx.tar.gz\n  cd bcm2835-1.xx\n  ./configure\n  make\n  sudo make check\n  sudo make install\n  \\endcode\n  \n  \\par Physical Addresses\n  \n  The functions bcm2835_peri_read(), bcm2835_peri_write() and bcm2835_peri_set_bits() \n  are low level peripheral register access functions. They are designed to use\n  physical addresses as described in section 1.2.3 ARM physical addresses\n  of the BCM2835 ARM Peripherals manual. \n  Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals. The bus\n  addresses for peripherals are set up to map onto the peripheral bus address range starting at\n  0x7E000000. Thus a peripheral advertised in the manual at bus address 0x7Ennnnnn is available at\n  physical address 0x20nnnnnn.\n  \n  On RPI 2, the peripheral addresses are different and the bcm2835 library gets them \n  from reading /proc/device-tree/soc/ranges. This is only availble with recent versions of the kernel on RPI 2.\n  \n  After initialisation, the base address of the various peripheral \n  registers are available with the following\n  externals:\n  bcm2835_gpio\n  bcm2835_pwm\n  bcm2835_clk\n  bcm2835_pads\n  bcm2835_spio0\n  bcm2835_st\n  bcm2835_bsc0\n  bcm2835_bsc1\n  bcm2835_aux\n  bcm2835_spi1\n\n  \\par Raspberry Pi 2 (RPI2)\n\n  For this library to work correctly on RPI2, you MUST have the device tree support enabled in the kernel.\n  You should also ensure you are using the latest version of Linux. The library has been tested on RPI2\n  with 2015-02-16-raspbian-wheezy and ArchLinuxARM-rpi-2 as of 2015-03-29.\n\n  When device tree suport is enabled, the file /proc/device-tree/soc/ranges will appear in the file system, \n  and the bcm2835 module relies on its presence to correctly run on RPI2 (it is optional for RPI1). \n  Without device tree support enabled and the presence of this file, it will not work on RPI2.\n\n  To enable device tree support:\n\n  \\code\n  sudo raspi-config\n   under Advanced Options - enable Device Tree\n   Reboot.\n  \\endcode\n  \n  \\par Pin Numbering\n  \n  The GPIO pin numbering as used by RPi is different to and inconsistent with the underlying \n  BCM 2835 chip pin numbering. http://elinux.org/RPi_BCM2835_GPIOs\n   \n  RPi has a 26 pin IDE header that provides access to some of the GPIO pins on the BCM 2835,\n  as well as power and ground pins. Not all GPIO pins on the BCM 2835 are available on the \n  IDE header.\n  \n  RPi Version 2 also has a P5 connector with 4 GPIO pins, 5V, 3.3V and Gnd.\n  \n  The functions in this library are designed to be passed the BCM 2835 GPIO pin number and _not_ \n  the RPi pin number. There are symbolic definitions for each of the available pins\n  that you should use for convenience. See \\ref RPiGPIOPin.\n  \n  \\par SPI Pins\n   \n  The bcm2835_spi_* functions allow you to control the BCM 2835 SPI0 interface, \n  allowing you to send and received data by SPI (Serial Peripheral Interface).\n  For more information about SPI, see http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus\n  \n  When bcm2835_spi_begin() is called it changes the bahaviour of the SPI interface pins from their \n  default GPIO behaviour in order to support SPI. While SPI is in use, you will not be able \n  to control the state of the SPI pins through the usual bcm2835_spi_gpio_write().\n  When bcm2835_spi_end() is called, the SPI pins will all revert to inputs, and can then be\n  configured and controled with the usual bcm2835_gpio_* calls.\n  \n  The Raspberry Pi GPIO pins used for SPI are:\n   \n  - P1-19 (MOSI)\n  - P1-21 (MISO) \n  - P1-23 (CLK) \n  - P1-24 (CE0) \n  - P1-26 (CE1)\n\n  Although it is possible to select high speeds for the SPI interface, up to 125MHz (see bcm2835_spi_setClockDivider())\n  you should not expect to actually achieve those sorts of speeds with the RPi wiring. Our tests on RPi 2 show that the\n  SPI CLK line when unloaded has a resonant frequency of about 40MHz, and when loaded, the MOSI and MISO lines\n  ring at an even lower frequency. Measurements show that SPI waveforms are very poor and unusable at 62 and 125MHz.\n  Dont expect any speed faster than 31MHz to work reliably.\n\n  The bcm2835_aux_spi_* functions allow you to control the BCM 2835 SPI1 interface,\n  allowing you to send and received data by SPI (Serial Peripheral Interface).\n\n  The Raspberry Pi GPIO pins used for AUX SPI (SPI1) are:\n\n  - P1-38 (MOSI)\n  - P1-35 (MISO)\n  - P1-40 (CLK)\n  - P1-36 (CE2)\n\n  \\par I2C Pins\n  \n  The bcm2835_i2c_* functions allow you to control the BCM 2835 BSC interface,\n  allowing you to send and received data by I2C (\"eye-squared cee\"; generically referred to as \"two-wire interface\") .\n  For more information about I?C, see http://en.wikipedia.org/wiki/I%C2%B2C\n  \n  The Raspberry Pi V2 GPIO pins used for I2C are:\n  \n  - P1-03 (SDA)\n  - P1-05 (SLC)\n  \n  \\par PWM\n  \n  The BCM2835 supports hardware PWM on a limited subset of GPIO pins. This bcm2835 library provides \n  functions for configuring and controlling PWM output on these pins.\n  \n  The BCM2835 contains 2 independent PWM channels (0 and 1), each of which be connnected to a limited subset of \n  GPIO pins. The following GPIO pins may be connected to the following PWM channels (from section 9.5):\n  \\code\n  GPIO PIN    RPi pin  PWM Channel    ALT FUN\n  12                    0            0\n  13                    1            0\n  18         1-12       0            5\n  19                    1            5\n  40                    0            0\n  41                    1            0\n  45                    1            0\n  52                    0            1\n  53                    1            1\n  \\endcode\n  In order for a GPIO pin to emit output from its PWM channel, it must be set to the Alt Function given above.\n  Note carefully that current versions of the Raspberry Pi only expose one of these pins (GPIO 18 = RPi Pin 1-12)\n  on the IO headers, and therefore this is the only IO pin on the RPi that can be used for PWM.\n  Further it must be set to ALT FUN 5 to get PWM output.\n  \n  Both PWM channels are driven by the same PWM clock, whose clock dvider can be varied using \n  bcm2835_pwm_set_clock(). Each channel can be separately enabled with bcm2835_pwm_set_mode().\n  The average output of the PWM channel is determined by the ratio of DATA/RANGE for that channel.\n  Use bcm2835_pwm_set_range() to set the range and bcm2835_pwm_set_data() to set the data in that ratio\n  \n  Each PWM channel can run in either Balanced or Mark-Space mode. In Balanced mode, the hardware \n  sends a combination of clock pulses that results in an overall DATA pulses per RANGE pulses.\n  In Mark-Space mode, the hardware sets the output HIGH for DATA clock pulses wide, followed by \n  LOW for RANGE-DATA clock pulses. \n  \n  The PWM clock can be set to control the PWM pulse widths. The PWM clock is derived from \n  a 19.2MHz clock. You can set any divider, but some common ones are provided by the BCM2835_PWM_CLOCK_DIVIDER_*\n  values of \\ref bcm2835PWMClockDivider.\n   \n  For example, say you wanted to drive a DC motor with PWM at about 1kHz, \n  and control the speed in 1/1024 increments from \n  0/1024 (stopped) through to 1024/1024 (full on). In that case you might set the \n  clock divider to be 16, and the RANGE to 1024. The pulse repetition frequency will be\n  1.2MHz/1024 = 1171.875Hz.\n  \n  \\par Interactions with other systems\n \n  In order for bcm2835 library SPI to work, you may need to disable the SPI kernel module using:\n\n  \\code\n  sudo raspi-config\n   under Advanced Options - enable Device Tree\n   under Advanced Options - disable SPI\n   Reboot.\n  \\endcode\n\n  Since bcm2835 accesses the lowest level hardware interfaces (in eh intererests of speed and flexibility)\n  there can be intercations with other low level software trying to do similar things.\n\n  It seems that with \"latest\" 8.0 Jessie 4.9.24-v7+ kernel PWM just won't \n  work unless you disable audio. There's a line\n  \\code\n  dtparam=audio=on\n  \\endcode\n  in the /boot/config.txt. \n  Comment it out like this:\n  \\code\n  #dtparam=audio=on\n  \\endcode\n\n  \\par Real Time performance constraints\n  \n  The bcm2835 is a library for user programs (i.e. they run in 'userland'). \n  Such programs are not part of the kernel and are usually\n  subject to paging and swapping by the kernel while it does other things besides running your program. \n  This means that you should not expect to get real-time performance or \n  real-time timing constraints from such programs. In particular, there is no guarantee that the \n  bcm2835_delay() and bcm2835_delayMicroseconds() will return after exactly the time requested. \n  In fact, depending on other activity on the host, IO etc, you might get significantly longer delay times\n  than the one you asked for. So please dont expect to get exactly the time delay you request.\n  \n  Arjan reports that you can prevent swapping on Linux with the following code fragment:\n  \n  \\code\n  #define <sched.h>\n  #define <sys/mman.h>\n\n  struct sched_param sp;\n  memset(&sp, 0, sizeof(sp));\n  sp.sched_priority = sched_get_priority_max(SCHED_FIFO);\n  sched_setscheduler(0, SCHED_FIFO, &sp);\n  mlockall(MCL_CURRENT | MCL_FUTURE);\n  \\endcode\n  \n  \\par Crashing on some versions of Raspbian\n  Some people have reported that various versions of Rasbian will crash or hang \n  if certain GPIO pins are toggled: https://github.com/raspberrypi/linux/issues/2550\n  when using bcm2835.\n  A workaround is to add this line to your /boot/config.txt:\n  \\code\n    dtoverlay=gpio-no-irq\n  \\endcode\n\n  \\par Bindings to other languages\n  \n  mikem has made Perl bindings available at CPAN:\n  http://search.cpan.org/~mikem/Device-BCM2835-1.9/lib/Device/BCM2835.pm\n  Matthew Baker has kindly made Python bindings available at:\n  https:  github.com/mubeta06/py-libbcm2835\n  Gary Marks has created a Serial Peripheral Interface (SPI) command-line utility \n  for Raspberry Pi, based on the bcm2835 library. The \n  utility, spincl, is licensed under Open Source GNU GPLv3 by iP Solutions (http://ipsolutionscorp.com), as a \n  free download with source included: http://ipsolutionscorp.com/raspberry-pi-spi-utility/\n  \n  \\par Open Source Licensing GPL V3\n  \n  This is the appropriate option if you want to share the source code of your\n  application with everyone you distribute it to, and you also want to give them\n  the right to share who uses it. If you wish to use this software under Open\n  Source Licensing, you must contribute all your source code to the open source\n  community in accordance with the GPL Version 3 when your application is\n  distributed. See https://www.gnu.org/licenses/gpl-3.0.html and COPYING\n  \n  \\par Commercial Licensing\n\n This is the appropriate option if you are creating proprietary applications\n and you are not prepared to distribute and share the source code of your\n application. To purchase a commercial license, contact info@airspayce.com\n\n  \\par Acknowledgements\n  \n  Some of this code has been inspired by Dom and Gert.\n  The I2C code has been inspired by Alan Barr.\n   \n  \\par Revision History\n  \n  \\version 1.0 Initial release\n\n  \\version 1.1 Minor bug fixes\n\n  \\version 1.2 Added support for SPI\n\n  \\version 1.3 Added bcm2835_spi_transfern()\n\n  \\version 1.4 Fixed a problem that prevented SPI CE1 being used. Reported by David Robinson.\n\n  \\version 1.5 Added bcm2835_close() to deinit the library. Suggested by C?sar Ortiz\n\n  \\version 1.6 Document testing on 2012-07-15-wheezy-raspbian and Occidentalisv01\n  Functions bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen()\n  bcm2835_gpio_len(), bcm2835_gpio_aren() and bcm2835_gpio_afen() now \n  changes only the pin specified. Other pins that were already previously\n  enabled stay enabled.\n  Added  bcm2835_gpio_clr_ren(), bcm2835_gpio_clr_fen(), bcm2835_gpio_clr_hen()\n  bcm2835_gpio_clr_len(), bcm2835_gpio_clr_aren(), bcm2835_gpio_clr_afen() \n  to clear the enable for individual pins, suggested by Andreas Sundstrom.\n\n  \\version 1.7 Added bcm2835_spi_transfernb to support different buffers for read and write.\n\n  \\version 1.8 Improvements to read barrier, as suggested by maddin.\n\n  \\version 1.9 Improvements contributed by mikew: \n  I noticed that it was mallocing memory for the mmaps on /dev/mem.\n  It's not necessary to do that, you can just mmap the file directly,\n  so I've removed the mallocs (and frees).\n  I've also modified delayMicroseconds() to use nanosleep() for long waits,\n  and a busy wait on a high resolution timer for the rest. This is because\n  I've found that calling nanosleep() takes at least 100-200 us.\n  You need to link using '-lrt' using this version.\n  I've added some unsigned casts to the debug prints to silence compiler\n  warnings I was getting, fixed some typos, and changed the value of\n  BCM2835_PAD_HYSTERESIS_ENABLED to 0x08 as per Gert van Loo's doc at\n  http://www.scribd.com/doc/101830961/GPIO-Pads-Control2\n  Also added a define for the passwrd value that Gert says is needed to\n  change pad control settings.\n\n  \\version 1.10 Changed the names of the delay functions to bcm2835_delay() \n  and bcm2835_delayMicroseconds() to prevent collisions with wiringPi.\n  Macros to map delay()-> bcm2835_delay() and\n  Macros to map delayMicroseconds()-> bcm2835_delayMicroseconds(), which\n  can be disabled by defining BCM2835_NO_DELAY_COMPATIBILITY\n\n  \\version 1.11 Fixed incorrect link to download file\n\n  \\version 1.12 New GPIO pin definitions for RPi version 2 (which has a different GPIO mapping)             \n\n  \\version 1.13 New GPIO pin definitions for RPi version 2 plug P5\n  Hardware base pointers are now available (after initialisation) externally as bcm2835_gpio\n  bcm2835_pwm bcm2835_clk bcm2835_pads bcm2835_spi0.\n\n  \\version 1.14 Now compiles even if CLOCK_MONOTONIC_RAW is not available, uses CLOCK_MONOTONIC instead.\n  Fixed errors in documentation of SPI divider frequencies based on 250MHz clock. \n  Reported by Ben Simpson.\n\n  \\version 1.15 Added bcm2835_close() to end of examples as suggested by Mark Wolfe.\n\n  \\version 1.16 Added bcm2835_gpio_set_multi, bcm2835_gpio_clr_multi and bcm2835_gpio_write_multi\n  to allow a mask of pins to be set all at once. Requested by Sebastian Loncar.\n\n  \\version 1.17  Added bcm2835_gpio_write_mask. Requested by Sebastian Loncar.\n\n  \\version 1.18 Added bcm2835_i2c_* functions. Changes to bcm2835_delayMicroseconds: \n  now uses the RPi system timer counter, instead of clock_gettime, for improved accuracy. \n  No need to link with -lrt now. Contributed by Arjan van Vught.\n  \\version 1.19 Removed inlines added by previous patch since they don't seem to work everywhere. \n  Reported by olly.\n\n  \\version 1.20 Patch from Mark Dootson to close /dev/mem after access to the peripherals has been granted.\n\n  \\version 1.21 delayMicroseconds is now not susceptible to 32 bit timer overruns. \n  Patch courtesy Jeremy Mortis.\n\n  \\version 1.22 Fixed incorrect definition of BCM2835_GPFEN0 which broke the ability to set \n  falling edge events. Reported by Mark Dootson.\n\n  \\version 1.23 Added bcm2835_i2c_set_baudrate and bcm2835_i2c_read_register_rs. \n  Improvements to bcm2835_i2c_read and bcm2835_i2c_write functions\n  to fix ocasional reads not completing. Patched by Mark Dootson.\n\n  \\version 1.24 Mark Dootson p[atched a problem with his previously submitted code\n  under high load from other processes. \n\n  \\version 1.25 Updated author and distribution location details to airspayce.com\n\n  \\version 1.26 Added missing unmapmem for pads in bcm2835_close to prevent a memory leak. \n  Reported by Hartmut Henkel.\n\n  \\version 1.27 bcm2835_gpio_set_pad() no longer needs BCM2835_PAD_PASSWRD: it is\n  now automatically included.\n  Added support for PWM mode with bcm2835_pwm_* functions.\n\n  \\version 1.28 Fixed a problem where bcm2835_spi_writenb() would have problems with transfers of more than\n  64 bytes dues to read buffer filling. Patched by Peter Würtz.\n\n  \\version 1.29 Further fix to SPI from Peter Würtz.\n\n  \\version 1.30 10 microsecond delays from bcm2835_spi_transfer and bcm2835_spi_transfern for\n  significant performance improvements, Patch by Alan Watson.\n\n  \\version 1.31 Fix a GCC warning about dummy variable, patched by Alan Watson. Thanks.\n\n  \\version 1.32 Added option I2C_V1 definition to compile for version 1 RPi. \n  By default I2C code is generated for the V2 RPi which has SDA1 and SCL1 connected.\n  Contributed by Malcolm Wiles based on work by Arvi Govindaraj.\n\n  \\version 1.33 Added command line utilities i2c and gpio to examples. Contributed by Shahrooz Shahparnia.\n\n  \\version 1.34 Added bcm2835_i2c_write_read_rs() which writes an arbitrary number of bytes, \n  sends a repeat start, and reads from the device. Contributed by Eduardo Steinhorst.\n\n  \\version 1.35 Fix build errors when compiled under Qt. Also performance improvements with SPI transfers. Contributed b Udo Klaas.\n\n  \\version 1.36 Make automake's test runner detect that we're skipping tests when not root, the second\n  one makes us skip the test when using fakeroot (as used when building\n  Debian packages). Contributed by Guido Günther.\n\n  \\version 1.37 Moved confiure.in to configure.ac as receommnded by autoreconf.<br>\n  Improvements to bcm2835_st_read to account for possible timer overflow, contributed by 'Ed'.<br>\n  Added definitions for Raspberry Pi B+ J8 header GPIO pins.<br>\n\n  \\version 1.38 Added bcm2835_regbase for the benefit of C# wrappers, patch by Frank Hommers <br>\n\n  \\version 1.39 Beta version of RPi2 compatibility. Not tested here on RPi2 hardware. \n  Testers please confirm correct operation on RPi2.<br>\n  Unnecessary 'volatile' qualifiers removed from all variables and signatures.<br>\n  Removed unsupportable PWM dividers, based on a report from Christophe Cecillon.<br>\n  Minor improvements to spi.c example.<br>\n\n  \\version 1.40 Correct operation on RPi2 has been confirmed.<br>\n  Fixed a number of compiler errors and warnings that occur when bcm2835.h is included\n  in code compiled with -Wall -Woverflow -Wstrict-overflow -Wshadow -Wextra -pedantic.\n  Reported by tlhackque.<br>\n  Fixed a problem where calling bcm2835_delayMicroseconds loops forever when debug is set. Reported by tlhackque.<br>\n  Reinstated use of volatile in 2 functions where there was a danger of lost reads or writes. Reported by tlhackque.<br>\n  \n  \\version 1.41 Added BCM2835_VERSION macro and new function bcm2835_version(); Requested by tlhackque.<br>\n  Improvements to peripheral memory barriers as suggested by tlhackque.<br>\n  Reinstated some necessary volatile declarations as requested by tlhackque.<br>\n\n  \\version 1.42 Further improvements to memory barriers with the patient assistance and patches of tlhackque.<br>\n\n  \\version 1.43 Fixed problems with compiling barriers on RPI 2 with Arch Linux and gcc 4.9.2. \n  Reported and patched by Lars Christensen.<br>\n  Testing on RPI 2, with ArchLinuxARM-rpi-2-latest and 2015-02-16-raspbian-wheezy.<br>\n\n  \\version 1.44 Added documention about the need for device tree to be enabled on RPI2.<br>\n  Improvements to detection of availability of DMB instruction based on value of __ARM_ARCH macro.<br>\n\n  \\version 1.45 Fixed an error in the pad group offsets that would prevent bcm2835_gpio_set_pad() \n  and bcm2835_gpio_pad() working correctly with non-0 pad groups. Reported by Guido.\n\n  \\version 1.46 2015-09-18\n  Added symbolic definitions for remaining pins on 40 pin GPIO header on RPi 2. <br>\n\n  \\version 1.47 2015-11-18\n  Fixed possibly incorrect reads in bcm2835_i2c_read_register_rs, patch from Eckhardt Ulrich.<br>\n\n  \\version 1.48 2015-12-08\n  Added patch from Eckhardt Ulrich that fixed problems that could cause hanging with bcm2835_i2c_read_register_rs\n  and others.\n\n  \\version 1.49 2016-01-05\n  Added patch from Jonathan Perkin with new functions bcm2835_gpio_eds_multi() and bcm2835_gpio_set_eds_multi().\n\n  \\version 1.50 2016-02-28\n  Added support for running as non-root, permitting access to GPIO only. Functions\n  bcm2835_spi_begin() and bcm2835_i2c_begin() will now return 0 if not running as root \n  (which prevents access to the SPI and I2C peripherals, amongst others). \n  Testing on Raspbian Jessie.\n\n  \\version 1.51 2016-11-03\n  Added documentation about SPI clock divider and resulting SPI speeds on RPi3.\n  Fixed a problem where seg fault could occur in bcm2835_delayMicroseconds() if not running as root. Patch from Pok.\n\n  \\version 1.52 2017-02-03\n  Added link to commercial license purchasing.\n\n  \\version 1.53 2018-01-14\n  Added support for AUX SPI (SPI1)\n  Contributed by Arjan van Vught (http://www.raspberrypi-dmx.org/)\n\n  \\version 1.54 2018-01-17\n  Fixed compile errors in new AUX spi code under some circumstances.\n\n  \\version 1.55 2018-01-20\n  Fixed version numbers.\n  Fixed some warnings.\n\n  \\version 1.56 2018-06-10\n  Supports bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_LSBFIRST), after which SPI bytes are reversed on read or write.\n  Based on a suggestion by Damiano Benedetti.\n  \n  \\version 1.57 2018-08-28\n  Added SPI function bcm2835_spi_set_speed_hz(uint32_t speed_hz);\n  Contributed by Arjan van Vught (http://www.raspberrypi-dmx.org/)\n\n  \\version 1.58 2018-11-29\n  Added examples/spiram, which shows how to use the included little library (spiram.c and spiram.h)\n  to read and write SPI RAM chips such as 23K256-I/P\n\n  \\version 1.59 2019-05-22\n  Fixed a bug in bcm2835_i2c_read reported by Charles Hayward where a noisy I2C line cold cause a seg fault by\n  reading too many characters.\n  \n  \\version 1.60 2019-07-23\n  Applied patch from Mark Dootson for RPi 4 compatibility. Thanks Mark. Not tested here on RPi4, but others report it works.\n  Tested as still working correctly on earlier RPi models. Tested with Debian Buster on earlier models\n\n  \\version 1.61 2020-01-11\n  Fixed errors in the documentation for bcm2835_spi_write.\n  Fixes issue seen on Raspberry Pi 4 boards where 64-bit off_t is used by\n  default via -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.  The offset was\n  being incorrectly converted, this way is clearer and fixes the problem. Contributed by Jonathan Perkin.\n\n  \\version 1.62 2020-01-12\n  Fixed a problem that could cause compile failures with size_t and off_t\n\n  \\version 1.63 2020-03-07\n  Added bcm2835_aux_spi_transfer, contributed by Michivi\n  Adopted GPL V3 licensing\n\n  \\version 1.64 2020-04-11\n  Fixed error in definitions of BCM2835_AUX_SPI_STAT_TX_LVL and BCM2835_AUX_SPI_STAT_RX_LVL. Patch from \n  Eric Marzec. Thanks.\n\n  \\version 1.65, 1.66 2020-04-16\n  Added support for use of capability  cap_sys_rawio to determine if access to /dev/mem is available for non-root\n  users. Contributed by Doug McFadyen.\n\n  \\version 1.67, 1.66 2020-06-11\n  Fixed an error in bcm2835_i2c_read() where the status byte was not correctly updated with BCM2835_BSC_S_DONE\n  Reported by Zihan. Thanks.\n\n  \\author  Mike McCauley (mikem@airspayce.com) DO NOT CONTACT THE AUTHOR DIRECTLY: USE THE LISTS\n*/\n\n\n/* Defines for BCM2835 */\n#ifndef BCM2835_H\n#define BCM2835_H\n\n#include <stdint.h>\n\n#define BCM2835_VERSION 10066 /* Version 1.66 */\n\n// Define this if you want to use libcap2 to determine if you have the cap_sys_rawio capability\n// and therefore the capability of opening /dev/mem, even if you are not root.\n// See the comments above in the documentation for 'Running As Root'\n//#define BCM2835_HAVE_LIBCAP\n\n/* RPi 2 is ARM v7, and has DMB instruction for memory barriers.\n   Older RPis are ARM v6 and don't, so a coprocessor instruction must be used instead.\n   However, not all versions of gcc in all distros support the dmb assembler instruction even on compatible processors.\n   This test is so any ARMv7 or higher processors with suitable GCC will use DMB.\n*/\n#if __ARM_ARCH >= 7\n#define BCM2835_HAVE_DMB\n#endif\n\n/*! \\defgroup constants Constants for passing to and from library functions\n  The values here are designed to be passed to various functions in the bcm2835 library.\n  @{\n*/\n\n/*! This means pin HIGH, true, 3.3volts on a pin. */\n#define HIGH 0x1\n/*! This means pin LOW, false, 0volts on a pin. */\n#define LOW  0x0\n\n/*! Return the minimum of 2 numbers */\n#ifndef MIN\n#define MIN(a, b) (a < b ? a : b)\n#endif\n\n/*! Speed of the core clock core_clk */\n#define BCM2835_CORE_CLK_HZ\t\t250000000\t/*!< 250 MHz */\n\n/*! On all recent OSs, the base of the peripherals is read from a /proc file */\n#define BMC2835_RPI2_DT_FILENAME \"/proc/device-tree/soc/ranges\"\n\n/*! Physical addresses for various peripheral register sets\n  Base Physical Address of the BCM 2835 peripheral registers\n  Note this is different for the RPi2 BCM2836, where this is derived from /proc/device-tree/soc/ranges\n  If /proc/device-tree/soc/ranges exists on a RPi 1 OS, it would be expected to contain the\n  following numbers:\n*/\n/*! Peripherals block base address on RPi 1 */\n#define BCM2835_PERI_BASE               0x20000000\n/*! Size of the peripherals block on RPi 1 */\n#define BCM2835_PERI_SIZE               0x01000000\n/*! Alternate base address for RPI  2 / 3 */\n#define BCM2835_RPI2_PERI_BASE          0x3F000000\n/*! Alternate base address for RPI  4 */\n#define BCM2835_RPI4_PERI_BASE          0xFE000000\n/*! Alternate size for RPI  4 */\n#define BCM2835_RPI4_PERI_SIZE          0x01800000\n\n/*! Offsets for the bases of various peripherals within the peripherals block\n  /   Base Address of the System Timer registers\n*/\n#define BCM2835_ST_BASE\t\t\t\t\t0x3000\n/*! Base Address of the Pads registers */\n#define BCM2835_GPIO_PADS               0x100000\n/*! Base Address of the Clock/timer registers */\n#define BCM2835_CLOCK_BASE              0x101000\n/*! Base Address of the GPIO registers */\n#define BCM2835_GPIO_BASE               0x200000\n/*! Base Address of the SPI0 registers */\n#define BCM2835_SPI0_BASE               0x204000\n/*! Base Address of the BSC0 registers */\n#define BCM2835_BSC0_BASE \t\t\t\t0x205000\n/*! Base Address of the PWM registers */\n#define BCM2835_GPIO_PWM                0x20C000\n/*! Base Address of the AUX registers */\n#define BCM2835_AUX_BASE\t\t\t\t0x215000\n/*! Base Address of the AUX_SPI1 registers */\n#define BCM2835_SPI1_BASE\t\t\t\t0x215080\n/*! Base Address of the AUX_SPI2 registers */\n#define BCM2835_SPI2_BASE\t\t\t\t0x2150C0\n/*! Base Address of the BSC1 registers */\n#define BCM2835_BSC1_BASE\t\t\t\t0x804000\n\n#include <stdlib.h>\n\n/*! Physical address and size of the peripherals block\n  May be overridden on RPi2\n*/\nextern off_t bcm2835_peripherals_base;\n/*! Size of the peripherals block to be mapped */\nextern size_t bcm2835_peripherals_size;\n\n/*! Virtual memory address of the mapped peripherals block */\nextern uint32_t *bcm2835_peripherals;\n\n/*! Base of the ST (System Timer) registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_st;\n\n/*! Base of the GPIO registers.\n  Available after bcm2835_init has been called\n*/\nextern volatile uint32_t *bcm2835_gpio;\n\n/*! Base of the PWM registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_pwm;\n\n/*! Base of the CLK registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_clk;\n\n/*! Base of the PADS registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_pads;\n\n/*! Base of the SPI0 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_spi0;\n\n/*! Base of the BSC0 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_bsc0;\n\n/*! Base of the BSC1 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_bsc1;\n\n/*! Base of the AUX registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_aux;\n\n/*! Base of the SPI1 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_spi1;\n\n\n/*! \\brief bcm2835RegisterBase\n  Register bases for bcm2835_regbase()\n*/\ntypedef enum\n{\n    BCM2835_REGBASE_ST   = 1, /*!< Base of the ST (System Timer) registers. */\n    BCM2835_REGBASE_GPIO = 2, /*!< Base of the GPIO registers. */\n    BCM2835_REGBASE_PWM  = 3, /*!< Base of the PWM registers. */\n    BCM2835_REGBASE_CLK  = 4, /*!< Base of the CLK registers. */\n    BCM2835_REGBASE_PADS = 5, /*!< Base of the PADS registers. */\n    BCM2835_REGBASE_SPI0 = 6, /*!< Base of the SPI0 registers. */\n    BCM2835_REGBASE_BSC0 = 7, /*!< Base of the BSC0 registers. */\n    BCM2835_REGBASE_BSC1 = 8,  /*!< Base of the BSC1 registers. */\n\tBCM2835_REGBASE_AUX  = 9,  /*!< Base of the AUX registers. */\n\tBCM2835_REGBASE_SPI1 = 10  /*!< Base of the SPI1 registers. */\n} bcm2835RegisterBase;\n\n/*! Size of memory page on RPi */\n#define BCM2835_PAGE_SIZE               (4*1024)\n/*! Size of memory block on RPi */\n#define BCM2835_BLOCK_SIZE              (4*1024)\n\n\n/* Defines for GPIO\n   The BCM2835 has 54 GPIO pins.\n   BCM2835 data sheet, Page 90 onwards.\n*/\n/*! GPIO register offsets from BCM2835_GPIO_BASE. \n  Offsets into the GPIO Peripheral block in bytes per 6.1 Register View \n*/\n#define BCM2835_GPFSEL0                      0x0000 /*!< GPIO Function Select 0 */\n#define BCM2835_GPFSEL1                      0x0004 /*!< GPIO Function Select 1 */\n#define BCM2835_GPFSEL2                      0x0008 /*!< GPIO Function Select 2 */\n#define BCM2835_GPFSEL3                      0x000c /*!< GPIO Function Select 3 */\n#define BCM2835_GPFSEL4                      0x0010 /*!< GPIO Function Select 4 */\n#define BCM2835_GPFSEL5                      0x0014 /*!< GPIO Function Select 5 */\n#define BCM2835_GPSET0                       0x001c /*!< GPIO Pin Output Set 0 */\n#define BCM2835_GPSET1                       0x0020 /*!< GPIO Pin Output Set 1 */\n#define BCM2835_GPCLR0                       0x0028 /*!< GPIO Pin Output Clear 0 */\n#define BCM2835_GPCLR1                       0x002c /*!< GPIO Pin Output Clear 1 */\n#define BCM2835_GPLEV0                       0x0034 /*!< GPIO Pin Level 0 */\n#define BCM2835_GPLEV1                       0x0038 /*!< GPIO Pin Level 1 */\n#define BCM2835_GPEDS0                       0x0040 /*!< GPIO Pin Event Detect Status 0 */\n#define BCM2835_GPEDS1                       0x0044 /*!< GPIO Pin Event Detect Status 1 */\n#define BCM2835_GPREN0                       0x004c /*!< GPIO Pin Rising Edge Detect Enable 0 */\n#define BCM2835_GPREN1                       0x0050 /*!< GPIO Pin Rising Edge Detect Enable 1 */\n#define BCM2835_GPFEN0                       0x0058 /*!< GPIO Pin Falling Edge Detect Enable 0 */\n#define BCM2835_GPFEN1                       0x005c /*!< GPIO Pin Falling Edge Detect Enable 1 */\n#define BCM2835_GPHEN0                       0x0064 /*!< GPIO Pin High Detect Enable 0 */\n#define BCM2835_GPHEN1                       0x0068 /*!< GPIO Pin High Detect Enable 1 */\n#define BCM2835_GPLEN0                       0x0070 /*!< GPIO Pin Low Detect Enable 0 */\n#define BCM2835_GPLEN1                       0x0074 /*!< GPIO Pin Low Detect Enable 1 */\n#define BCM2835_GPAREN0                      0x007c /*!< GPIO Pin Async. Rising Edge Detect 0 */\n#define BCM2835_GPAREN1                      0x0080 /*!< GPIO Pin Async. Rising Edge Detect 1 */\n#define BCM2835_GPAFEN0                      0x0088 /*!< GPIO Pin Async. Falling Edge Detect 0 */\n#define BCM2835_GPAFEN1                      0x008c /*!< GPIO Pin Async. Falling Edge Detect 1 */\n#define BCM2835_GPPUD                        0x0094 /*!< GPIO Pin Pull-up/down Enable */\n#define BCM2835_GPPUDCLK0                    0x0098 /*!< GPIO Pin Pull-up/down Enable Clock 0 */\n#define BCM2835_GPPUDCLK1                    0x009c /*!< GPIO Pin Pull-up/down Enable Clock 1 */\n\n/* 2711 has a different method for pin pull-up/down/enable  */\n#define BCM2835_GPPUPPDN0                    0x00e4 /* Pin pull-up/down for pins 15:0  */\n#define BCM2835_GPPUPPDN1                    0x00e8 /* Pin pull-up/down for pins 31:16 */\n#define BCM2835_GPPUPPDN2                    0x00ec /* Pin pull-up/down for pins 47:32 */\n#define BCM2835_GPPUPPDN3                    0x00f0 /* Pin pull-up/down for pins 57:48 */\n\n/*!   \\brief bcm2835PortFunction\n  Port function select modes for bcm2835_gpio_fsel()\n*/\ntypedef enum\n{\n    BCM2835_GPIO_FSEL_INPT  = 0x00,   /*!< Input 0b000 */\n    BCM2835_GPIO_FSEL_OUTP  = 0x01,   /*!< Output 0b001 */\n    BCM2835_GPIO_FSEL_ALT0  = 0x04,   /*!< Alternate function 0 0b100 */\n    BCM2835_GPIO_FSEL_ALT1  = 0x05,   /*!< Alternate function 1 0b101 */\n    BCM2835_GPIO_FSEL_ALT2  = 0x06,   /*!< Alternate function 2 0b110, */\n    BCM2835_GPIO_FSEL_ALT3  = 0x07,   /*!< Alternate function 3 0b111 */\n    BCM2835_GPIO_FSEL_ALT4  = 0x03,   /*!< Alternate function 4 0b011 */\n    BCM2835_GPIO_FSEL_ALT5  = 0x02,   /*!< Alternate function 5 0b010 */\n    BCM2835_GPIO_FSEL_MASK  = 0x07    /*!< Function select bits mask 0b111 */\n} bcm2835FunctionSelect;\n\n/*! \\brief bcm2835PUDControl\n  Pullup/Pulldown defines for bcm2835_gpio_pud()\n*/\ntypedef enum\n{\n    BCM2835_GPIO_PUD_OFF     = 0x00,   /*!< Off ? disable pull-up/down 0b00 */\n    BCM2835_GPIO_PUD_DOWN    = 0x01,   /*!< Enable Pull Down control 0b01 */\n    BCM2835_GPIO_PUD_UP      = 0x02    /*!< Enable Pull Up control 0b10  */\n} bcm2835PUDControl;\n\n/* need a value for pud functions that can't work unless RPI 4 */\n#define BCM2835_GPIO_PUD_ERROR  0x08 \n\n/*! Pad control register offsets from BCM2835_GPIO_PADS */\n#define BCM2835_PADS_GPIO_0_27               0x002c /*!< Pad control register for pads 0 to 27 */\n#define BCM2835_PADS_GPIO_28_45              0x0030 /*!< Pad control register for pads 28 to 45 */\n#define BCM2835_PADS_GPIO_46_53              0x0034 /*!< Pad control register for pads 46 to 53 */\n\n/*! Pad Control masks */\n#define BCM2835_PAD_PASSWRD                  (0x5A << 24)  /*!< Password to enable setting pad mask */\n#define BCM2835_PAD_SLEW_RATE_UNLIMITED      0x10 /*!< Slew rate unlimited */\n#define BCM2835_PAD_HYSTERESIS_ENABLED       0x08 /*!< Hysteresis enabled */\n#define BCM2835_PAD_DRIVE_2mA                0x00 /*!< 2mA drive current */\n#define BCM2835_PAD_DRIVE_4mA                0x01 /*!< 4mA drive current */\n#define BCM2835_PAD_DRIVE_6mA                0x02 /*!< 6mA drive current */\n#define BCM2835_PAD_DRIVE_8mA                0x03 /*!< 8mA drive current */\n#define BCM2835_PAD_DRIVE_10mA               0x04 /*!< 10mA drive current */\n#define BCM2835_PAD_DRIVE_12mA               0x05 /*!< 12mA drive current */\n#define BCM2835_PAD_DRIVE_14mA               0x06 /*!< 14mA drive current */\n#define BCM2835_PAD_DRIVE_16mA               0x07 /*!< 16mA drive current */\n\n/*! \\brief bcm2835PadGroup\n  Pad group specification for bcm2835_gpio_pad()\n*/\ntypedef enum\n{\n    BCM2835_PAD_GROUP_GPIO_0_27         = 0, /*!< Pad group for GPIO pads 0 to 27 */\n    BCM2835_PAD_GROUP_GPIO_28_45        = 1, /*!< Pad group for GPIO pads 28 to 45 */\n    BCM2835_PAD_GROUP_GPIO_46_53        = 2  /*!< Pad group for GPIO pads 46 to 53 */\n} bcm2835PadGroup;\n\n/*! \\brief GPIO Pin Numbers\n  \n  Here we define Raspberry Pin GPIO pins on P1 in terms of the underlying BCM GPIO pin numbers.\n  These can be passed as a pin number to any function requiring a pin.\n  Not all pins on the RPi 26 bin IDE plug are connected to GPIO pins\n  and some can adopt an alternate function.\n  RPi version 2 has some slightly different pinouts, and these are values RPI_V2_*.\n  RPi B+ has yet differnet pinouts and these are defined in RPI_BPLUS_*.\n  At bootup, pins 8 and 10 are set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively\n  When SPI0 is in use (ie after bcm2835_spi_begin()), SPI0 pins are dedicated to SPI\n  and cant be controlled independently.\n  If you are using the RPi Compute Module, just use the GPIO number: there is no need to use one of these\n  symbolic names\n*/\ntypedef enum\n{\n    RPI_GPIO_P1_03        =  0,  /*!< Version 1, Pin P1-03 */\n    RPI_GPIO_P1_05        =  1,  /*!< Version 1, Pin P1-05 */\n    RPI_GPIO_P1_07        =  4,  /*!< Version 1, Pin P1-07 */\n    RPI_GPIO_P1_08        = 14,  /*!< Version 1, Pin P1-08, defaults to alt function 0 UART0_TXD */\n    RPI_GPIO_P1_10        = 15,  /*!< Version 1, Pin P1-10, defaults to alt function 0 UART0_RXD */\n    RPI_GPIO_P1_11        = 17,  /*!< Version 1, Pin P1-11 */\n    RPI_GPIO_P1_12        = 18,  /*!< Version 1, Pin P1-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_GPIO_P1_13        = 21,  /*!< Version 1, Pin P1-13 */\n    RPI_GPIO_P1_15        = 22,  /*!< Version 1, Pin P1-15 */\n    RPI_GPIO_P1_16        = 23,  /*!< Version 1, Pin P1-16 */\n    RPI_GPIO_P1_18        = 24,  /*!< Version 1, Pin P1-18 */\n    RPI_GPIO_P1_19        = 10,  /*!< Version 1, Pin P1-19, MOSI when SPI0 in use */\n    RPI_GPIO_P1_21        =  9,  /*!< Version 1, Pin P1-21, MISO when SPI0 in use */\n    RPI_GPIO_P1_22        = 25,  /*!< Version 1, Pin P1-22 */\n    RPI_GPIO_P1_23        = 11,  /*!< Version 1, Pin P1-23, CLK when SPI0 in use */\n    RPI_GPIO_P1_24        =  8,  /*!< Version 1, Pin P1-24, CE0 when SPI0 in use */\n    RPI_GPIO_P1_26        =  7,  /*!< Version 1, Pin P1-26, CE1 when SPI0 in use */\n\n    /* RPi Version 2 */\n    RPI_V2_GPIO_P1_03     =  2,  /*!< Version 2, Pin P1-03 */\n    RPI_V2_GPIO_P1_05     =  3,  /*!< Version 2, Pin P1-05 */\n    RPI_V2_GPIO_P1_07     =  4,  /*!< Version 2, Pin P1-07 */\n    RPI_V2_GPIO_P1_08     = 14,  /*!< Version 2, Pin P1-08, defaults to alt function 0 UART0_TXD */\n    RPI_V2_GPIO_P1_10     = 15,  /*!< Version 2, Pin P1-10, defaults to alt function 0 UART0_RXD */\n    RPI_V2_GPIO_P1_11     = 17,  /*!< Version 2, Pin P1-11 */\n    RPI_V2_GPIO_P1_12     = 18,  /*!< Version 2, Pin P1-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_V2_GPIO_P1_13     = 27,  /*!< Version 2, Pin P1-13 */\n    RPI_V2_GPIO_P1_15     = 22,  /*!< Version 2, Pin P1-15 */\n    RPI_V2_GPIO_P1_16     = 23,  /*!< Version 2, Pin P1-16 */\n    RPI_V2_GPIO_P1_18     = 24,  /*!< Version 2, Pin P1-18 */\n    RPI_V2_GPIO_P1_19     = 10,  /*!< Version 2, Pin P1-19, MOSI when SPI0 in use */\n    RPI_V2_GPIO_P1_21     =  9,  /*!< Version 2, Pin P1-21, MISO when SPI0 in use */\n    RPI_V2_GPIO_P1_22     = 25,  /*!< Version 2, Pin P1-22 */\n    RPI_V2_GPIO_P1_23     = 11,  /*!< Version 2, Pin P1-23, CLK when SPI0 in use */\n    RPI_V2_GPIO_P1_24     =  8,  /*!< Version 2, Pin P1-24, CE0 when SPI0 in use */\n    RPI_V2_GPIO_P1_26     =  7,  /*!< Version 2, Pin P1-26, CE1 when SPI0 in use */\n    RPI_V2_GPIO_P1_29     =  5,  /*!< Version 2, Pin P1-29 */\n    RPI_V2_GPIO_P1_31     =  6,  /*!< Version 2, Pin P1-31 */\n    RPI_V2_GPIO_P1_32     = 12,  /*!< Version 2, Pin P1-32 */\n    RPI_V2_GPIO_P1_33     = 13,  /*!< Version 2, Pin P1-33 */\n    RPI_V2_GPIO_P1_35     = 19,  /*!< Version 2, Pin P1-35, can be PWM channel 1 in ALT FUN 5  */\n    RPI_V2_GPIO_P1_36     = 16,  /*!< Version 2, Pin P1-36 */\n    RPI_V2_GPIO_P1_37     = 26,  /*!< Version 2, Pin P1-37 */\n    RPI_V2_GPIO_P1_38     = 20,  /*!< Version 2, Pin P1-38 */\n    RPI_V2_GPIO_P1_40     = 21,  /*!< Version 2, Pin P1-40 */\n\n    /* RPi Version 2, new plug P5 */\n    RPI_V2_GPIO_P5_03     = 28,  /*!< Version 2, Pin P5-03 */\n    RPI_V2_GPIO_P5_04     = 29,  /*!< Version 2, Pin P5-04 */\n    RPI_V2_GPIO_P5_05     = 30,  /*!< Version 2, Pin P5-05 */\n    RPI_V2_GPIO_P5_06     = 31,  /*!< Version 2, Pin P5-06 */\n\n    /* RPi B+ J8 header, also RPi 2 40 pin GPIO header */\n    RPI_BPLUS_GPIO_J8_03     =  2,  /*!< B+, Pin J8-03 */\n    RPI_BPLUS_GPIO_J8_05     =  3,  /*!< B+, Pin J8-05 */\n    RPI_BPLUS_GPIO_J8_07     =  4,  /*!< B+, Pin J8-07 */\n    RPI_BPLUS_GPIO_J8_08     = 14,  /*!< B+, Pin J8-08, defaults to alt function 0 UART0_TXD */\n    RPI_BPLUS_GPIO_J8_10     = 15,  /*!< B+, Pin J8-10, defaults to alt function 0 UART0_RXD */\n    RPI_BPLUS_GPIO_J8_11     = 17,  /*!< B+, Pin J8-11 */\n    RPI_BPLUS_GPIO_J8_12     = 18,  /*!< B+, Pin J8-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_BPLUS_GPIO_J8_13     = 27,  /*!< B+, Pin J8-13 */\n    RPI_BPLUS_GPIO_J8_15     = 22,  /*!< B+, Pin J8-15 */\n    RPI_BPLUS_GPIO_J8_16     = 23,  /*!< B+, Pin J8-16 */\n    RPI_BPLUS_GPIO_J8_18     = 24,  /*!< B+, Pin J8-18 */\n    RPI_BPLUS_GPIO_J8_19     = 10,  /*!< B+, Pin J8-19, MOSI when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_21     =  9,  /*!< B+, Pin J8-21, MISO when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_22     = 25,  /*!< B+, Pin J8-22 */\n    RPI_BPLUS_GPIO_J8_23     = 11,  /*!< B+, Pin J8-23, CLK when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_24     =  8,  /*!< B+, Pin J8-24, CE0 when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_26     =  7,  /*!< B+, Pin J8-26, CE1 when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_29     =  5,  /*!< B+, Pin J8-29,  */\n    RPI_BPLUS_GPIO_J8_31     =  6,  /*!< B+, Pin J8-31,  */\n    RPI_BPLUS_GPIO_J8_32     = 12,  /*!< B+, Pin J8-32,  */\n    RPI_BPLUS_GPIO_J8_33     = 13,  /*!< B+, Pin J8-33,  */\n    RPI_BPLUS_GPIO_J8_35     = 19,  /*!< B+, Pin J8-35, can be PWM channel 1 in ALT FUN 5 */\n    RPI_BPLUS_GPIO_J8_36     = 16,  /*!< B+, Pin J8-36,  */\n    RPI_BPLUS_GPIO_J8_37     = 26,  /*!< B+, Pin J8-37,  */\n    RPI_BPLUS_GPIO_J8_38     = 20,  /*!< B+, Pin J8-38,  */\n    RPI_BPLUS_GPIO_J8_40     = 21   /*!< B+, Pin J8-40,  */\n} RPiGPIOPin;\n\n/* Defines for AUX\n  GPIO register offsets from BCM2835_AUX_BASE.\n*/\n#define BCM2835_AUX_IRQ\t\t\t0x0000  /*!< xxx */\n#define BCM2835_AUX_ENABLE\t\t0x0004  /*!< */\n\n#define BCM2835_AUX_ENABLE_UART1\t0x01    /*!<  */\n#define BCM2835_AUX_ENABLE_SPI0\t\t0x02\t/*!< SPI0 (SPI1 in the device) */\n#define BCM2835_AUX_ENABLE_SPI1\t\t0x04\t/*!< SPI1 (SPI2 in the device) */\n\n\n#define BCM2835_AUX_SPI_CNTL0\t\t0x0000  /*!< */\n#define BCM2835_AUX_SPI_CNTL1 \t\t0x0004  /*!< */\n#define BCM2835_AUX_SPI_STAT \t\t0x0008  /*!< */\n#define BCM2835_AUX_SPI_PEEK\t\t0x000C  /*!< Read but do not take from FF */\n#define BCM2835_AUX_SPI_IO\t\t0x0020  /*!< Write = TX, read=RX */\n#define BCM2835_AUX_SPI_TXHOLD\t\t0x0030  /*!< Write = TX keep CS, read=RX */\n\n#define BCM2835_AUX_SPI_CLOCK_MIN\t30500\t\t/*!< 30,5kHz */\n#define BCM2835_AUX_SPI_CLOCK_MAX\t125000000 \t/*!< 125Mhz */\n\n#define BCM2835_AUX_SPI_CNTL0_SPEED\t0xFFF00000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SPEED_MAX\t0xFFF      /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT 20        /*!< */\n\n#define BCM2835_AUX_SPI_CNTL0_CS0_N     0x000C0000 /*!< CS 0 low */\n#define BCM2835_AUX_SPI_CNTL0_CS1_N     0x000A0000 /*!< CS 1 low */\n#define BCM2835_AUX_SPI_CNTL0_CS2_N \t0x00060000 /*!< CS 2 low */\n\n#define BCM2835_AUX_SPI_CNTL0_POSTINPUT\t0x00010000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_VAR_CS\t0x00008000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_VAR_WIDTH\t0x00004000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_DOUTHOLD\t0x00003000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_ENABLE\t0x00000800  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPHA_IN\t0x00000400  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CLEARFIFO\t0x00000200  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPHA_OUT\t0x00000100  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPOL\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_MSBF_OUT\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SHIFTLEN\t0x0000003F  /*!< */\n\n#define BCM2835_AUX_SPI_CNTL1_CSHIGH\t0x00000700  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_IDLE\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_TXEMPTY\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_MSBF_IN\t0x00000002  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_KEEP_IN\t0x00000001  /*!< */\n\n#define BCM2835_AUX_SPI_STAT_TX_LVL\t0xF0000000  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_LVL\t0x00F00000  /*!< */\n#define BCM2835_AUX_SPI_STAT_TX_FULL\t0x00000400  /*!< */\n#define BCM2835_AUX_SPI_STAT_TX_EMPTY\t0x00000200  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_FULL\t0x00000100  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_EMPTY\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_STAT_BUSY\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_STAT_BITCOUNT\t0x0000003F  /*!< */\n\n/* Defines for SPI\n   GPIO register offsets from BCM2835_SPI0_BASE. \n   Offsets into the SPI Peripheral block in bytes per 10.5 SPI Register Map\n*/\n#define BCM2835_SPI0_CS                      0x0000 /*!< SPI Master Control and Status */\n#define BCM2835_SPI0_FIFO                    0x0004 /*!< SPI Master TX and RX FIFOs */\n#define BCM2835_SPI0_CLK                     0x0008 /*!< SPI Master Clock Divider */\n#define BCM2835_SPI0_DLEN                    0x000c /*!< SPI Master Data Length */\n#define BCM2835_SPI0_LTOH                    0x0010 /*!< SPI LOSSI mode TOH */\n#define BCM2835_SPI0_DC                      0x0014 /*!< SPI DMA DREQ Controls */\n\n/* Register masks for SPI0_CS */\n#define BCM2835_SPI0_CS_LEN_LONG             0x02000000 /*!< Enable Long data word in Lossi mode if DMA_LEN is set */\n#define BCM2835_SPI0_CS_DMA_LEN              0x01000000 /*!< Enable DMA mode in Lossi mode */\n#define BCM2835_SPI0_CS_CSPOL2               0x00800000 /*!< Chip Select 2 Polarity */\n#define BCM2835_SPI0_CS_CSPOL1               0x00400000 /*!< Chip Select 1 Polarity */\n#define BCM2835_SPI0_CS_CSPOL0               0x00200000 /*!< Chip Select 0 Polarity */\n#define BCM2835_SPI0_CS_RXF                  0x00100000 /*!< RXF - RX FIFO Full */\n#define BCM2835_SPI0_CS_RXR                  0x00080000 /*!< RXR RX FIFO needs Reading (full) */\n#define BCM2835_SPI0_CS_TXD                  0x00040000 /*!< TXD TX FIFO can accept Data */\n#define BCM2835_SPI0_CS_RXD                  0x00020000 /*!< RXD RX FIFO contains Data */\n#define BCM2835_SPI0_CS_DONE                 0x00010000 /*!< Done transfer Done */\n#define BCM2835_SPI0_CS_TE_EN                0x00008000 /*!< Unused */\n#define BCM2835_SPI0_CS_LMONO                0x00004000 /*!< Unused */\n#define BCM2835_SPI0_CS_LEN                  0x00002000 /*!< LEN LoSSI enable */\n#define BCM2835_SPI0_CS_REN                  0x00001000 /*!< REN Read Enable */\n#define BCM2835_SPI0_CS_ADCS                 0x00000800 /*!< ADCS Automatically Deassert Chip Select */\n#define BCM2835_SPI0_CS_INTR                 0x00000400 /*!< INTR Interrupt on RXR */\n#define BCM2835_SPI0_CS_INTD                 0x00000200 /*!< INTD Interrupt on Done */\n#define BCM2835_SPI0_CS_DMAEN                0x00000100 /*!< DMAEN DMA Enable */\n#define BCM2835_SPI0_CS_TA                   0x00000080 /*!< Transfer Active */\n#define BCM2835_SPI0_CS_CSPOL                0x00000040 /*!< Chip Select Polarity */\n#define BCM2835_SPI0_CS_CLEAR                0x00000030 /*!< Clear FIFO Clear RX and TX */\n#define BCM2835_SPI0_CS_CLEAR_RX             0x00000020 /*!< Clear FIFO Clear RX  */\n#define BCM2835_SPI0_CS_CLEAR_TX             0x00000010 /*!< Clear FIFO Clear TX  */\n#define BCM2835_SPI0_CS_CPOL                 0x00000008 /*!< Clock Polarity */\n#define BCM2835_SPI0_CS_CPHA                 0x00000004 /*!< Clock Phase */\n#define BCM2835_SPI0_CS_CS                   0x00000003 /*!< Chip Select */\n\n/*! \\brief bcm2835SPIBitOrder SPI Bit order\n  Specifies the SPI data bit ordering for bcm2835_spi_setBitOrder()\n*/\ntypedef enum\n{\n    BCM2835_SPI_BIT_ORDER_LSBFIRST = 0,  /*!< LSB First */\n    BCM2835_SPI_BIT_ORDER_MSBFIRST = 1   /*!< MSB First */\n}bcm2835SPIBitOrder;\n\n/*! \\brief SPI Data mode\n  Specify the SPI data mode to be passed to bcm2835_spi_setDataMode()\n*/\ntypedef enum\n{\n    BCM2835_SPI_MODE0 = 0,  /*!< CPOL = 0, CPHA = 0 */\n    BCM2835_SPI_MODE1 = 1,  /*!< CPOL = 0, CPHA = 1 */\n    BCM2835_SPI_MODE2 = 2,  /*!< CPOL = 1, CPHA = 0 */\n    BCM2835_SPI_MODE3 = 3   /*!< CPOL = 1, CPHA = 1 */\n}bcm2835SPIMode;\n\n/*! \\brief bcm2835SPIChipSelect\n  Specify the SPI chip select pin(s)\n*/\ntypedef enum\n{\n    BCM2835_SPI_CS0 = 0,     /*!< Chip Select 0 */\n    BCM2835_SPI_CS1 = 1,     /*!< Chip Select 1 */\n    BCM2835_SPI_CS2 = 2,     /*!< Chip Select 2 (ie pins CS1 and CS2 are asserted) */\n    BCM2835_SPI_CS_NONE = 3  /*!< No CS, control it yourself */\n} bcm2835SPIChipSelect;\n\n/*! \\brief bcm2835SPIClockDivider\n  Specifies the divider used to generate the SPI clock from the system clock.\n  Figures below give the divider, clock period and clock frequency.\n  Clock divided is based on nominal core clock rate of 250MHz on RPi1 and RPi2, and 400MHz on RPi3.\n  It is reported that (contrary to the documentation) any even divider may used.\n  The frequencies shown for each divider have been confirmed by measurement on RPi1 and RPi2.\n  The system clock frequency on RPi3 is different, so the frequency you get from a given divider will be different.\n  See comments in 'SPI Pins' for information about reliable SPI speeds.\n  Note: it is possible to change the core clock rate of the RPi 3 back to 250MHz, by putting \n  \\code\n  core_freq=250\n  \\endcode\n  in the config.txt\n*/\ntypedef enum\n{\n    BCM2835_SPI_CLOCK_DIVIDER_65536 = 0,       /*!< 65536 = 3.814697260kHz on Rpi2, 6.1035156kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_32768 = 32768,   /*!< 32768 = 7.629394531kHz on Rpi2, 12.20703125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_16384 = 16384,   /*!< 16384 = 15.25878906kHz on Rpi2, 24.4140625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_8192  = 8192,    /*!< 8192 = 30.51757813kHz on Rpi2, 48.828125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_4096  = 4096,    /*!< 4096 = 61.03515625kHz on Rpi2, 97.65625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_2048  = 2048,    /*!< 2048 = 122.0703125kHz on Rpi2, 195.3125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_1024  = 1024,    /*!< 1024 = 244.140625kHz on Rpi2, 390.625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_512   = 512,     /*!< 512 = 488.28125kHz on Rpi2, 781.25kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_256   = 256,     /*!< 256 = 976.5625kHz on Rpi2, 1.5625MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_128   = 128,     /*!< 128 = 1.953125MHz on Rpi2, 3.125MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_64    = 64,      /*!< 64 = 3.90625MHz on Rpi2, 6.250MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_32    = 32,      /*!< 32 = 7.8125MHz on Rpi2, 12.5MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_16    = 16,      /*!< 16 = 15.625MHz on Rpi2, 25MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_8     = 8,       /*!< 8 = 31.25MHz on Rpi2, 50MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_4     = 4,       /*!< 4 = 62.5MHz on Rpi2, 100MHz on RPI3. Dont expect this speed to work reliably. */\n    BCM2835_SPI_CLOCK_DIVIDER_2     = 2,       /*!< 2 = 125MHz on Rpi2, 200MHz on RPI3, fastest you can get. Dont expect this speed to work reliably.*/\n    BCM2835_SPI_CLOCK_DIVIDER_1     = 1        /*!< 1 = 3.814697260kHz on Rpi2, 6.1035156kHz on RPI3, same as 0/65536 */\n} bcm2835SPIClockDivider;\n\n/* Defines for I2C\n   GPIO register offsets from BCM2835_BSC*_BASE.\n   Offsets into the BSC Peripheral block in bytes per 3.1 BSC Register Map\n*/\n#define BCM2835_BSC_C \t\t\t0x0000 /*!< BSC Master Control */\n#define BCM2835_BSC_S \t\t\t0x0004 /*!< BSC Master Status */\n#define BCM2835_BSC_DLEN\t\t0x0008 /*!< BSC Master Data Length */\n#define BCM2835_BSC_A \t\t\t0x000c /*!< BSC Master Slave Address */\n#define BCM2835_BSC_FIFO\t\t0x0010 /*!< BSC Master Data FIFO */\n#define BCM2835_BSC_DIV\t\t\t0x0014 /*!< BSC Master Clock Divider */\n#define BCM2835_BSC_DEL\t\t\t0x0018 /*!< BSC Master Data Delay */\n#define BCM2835_BSC_CLKT\t\t0x001c /*!< BSC Master Clock Stretch Timeout */\n\n/* Register masks for BSC_C */\n#define BCM2835_BSC_C_I2CEN \t\t0x00008000 /*!< I2C Enable, 0 = disabled, 1 = enabled */\n#define BCM2835_BSC_C_INTR \t\t0x00000400 /*!< Interrupt on RX */\n#define BCM2835_BSC_C_INTT \t\t0x00000200 /*!< Interrupt on TX */\n#define BCM2835_BSC_C_INTD \t\t0x00000100 /*!< Interrupt on DONE */\n#define BCM2835_BSC_C_ST \t\t0x00000080 /*!< Start transfer, 1 = Start a new transfer */\n#define BCM2835_BSC_C_CLEAR_1 \t\t0x00000020 /*!< Clear FIFO Clear */\n#define BCM2835_BSC_C_CLEAR_2 \t\t0x00000010 /*!< Clear FIFO Clear */\n#define BCM2835_BSC_C_READ \t\t0x00000001 /*!<\tRead transfer */\n\n/* Register masks for BSC_S */\n#define BCM2835_BSC_S_CLKT \t\t0x00000200 /*!< Clock stretch timeout */\n#define BCM2835_BSC_S_ERR \t\t0x00000100 /*!< ACK error */\n#define BCM2835_BSC_S_RXF \t\t0x00000080 /*!< RXF FIFO full, 0 = FIFO is not full, 1 = FIFO is full */\n#define BCM2835_BSC_S_TXE \t\t0x00000040 /*!< TXE FIFO full, 0 = FIFO is not full, 1 = FIFO is full */\n#define BCM2835_BSC_S_RXD \t\t0x00000020 /*!< RXD FIFO contains data */\n#define BCM2835_BSC_S_TXD \t\t0x00000010 /*!< TXD FIFO can accept data */\n#define BCM2835_BSC_S_RXR \t\t0x00000008 /*!< RXR FIFO needs reading (full) */\n#define BCM2835_BSC_S_TXW \t\t0x00000004 /*!< TXW FIFO needs writing (full) */\n#define BCM2835_BSC_S_DONE \t\t0x00000002 /*!< Transfer DONE */\n#define BCM2835_BSC_S_TA \t\t0x00000001 /*!< Transfer Active */\n\n#define BCM2835_BSC_FIFO_SIZE   \t16 /*!< BSC FIFO size */\n\n/*! \\brief bcm2835I2CClockDivider\n  Specifies the divider used to generate the I2C clock from the system clock.\n  Clock divided is based on nominal base clock rate of 250MHz\n*/\ntypedef enum\n{\n    BCM2835_I2C_CLOCK_DIVIDER_2500   = 2500,      /*!< 2500 = 10us = 100 kHz */\n    BCM2835_I2C_CLOCK_DIVIDER_626    = 626,       /*!< 622 = 2.504us = 399.3610 kHz */\n    BCM2835_I2C_CLOCK_DIVIDER_150    = 150,       /*!< 150 = 60ns = 1.666 MHz (default at reset) */\n    BCM2835_I2C_CLOCK_DIVIDER_148    = 148        /*!< 148 = 59ns = 1.689 MHz */\n} bcm2835I2CClockDivider;\n\n/*! \\brief bcm2835I2CReasonCodes\n  Specifies the reason codes for the bcm2835_i2c_write and bcm2835_i2c_read functions.\n*/\ntypedef enum\n{\n    BCM2835_I2C_REASON_OK   \t     = 0x00,      /*!< Success */\n    BCM2835_I2C_REASON_ERROR_NACK    = 0x01,      /*!< Received a NACK */\n    BCM2835_I2C_REASON_ERROR_CLKT    = 0x02,      /*!< Received Clock Stretch Timeout */\n    BCM2835_I2C_REASON_ERROR_DATA    = 0x04       /*!< Not all data is sent / received */\n} bcm2835I2CReasonCodes;\n\n/* Defines for ST\n   GPIO register offsets from BCM2835_ST_BASE.\n   Offsets into the ST Peripheral block in bytes per 12.1 System Timer Registers\n   The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter.\n   BCM2835_ST_CLO is the System Timer Counter Lower bits register.\n   The system timer free-running counter lower register is a read-only register that returns the current value\n   of the lower 32-bits of the free running counter.\n   BCM2835_ST_CHI is the System Timer Counter Upper bits register.\n   The system timer free-running counter upper register is a read-only register that returns the current value\n   of the upper 32-bits of the free running counter.\n*/\n#define BCM2835_ST_CS \t\t\t0x0000 /*!< System Timer Control/Status */\n#define BCM2835_ST_CLO \t\t\t0x0004 /*!< System Timer Counter Lower 32 bits */\n#define BCM2835_ST_CHI \t\t\t0x0008 /*!< System Timer Counter Upper 32 bits */\n\n/*! @} */\n\n\n/* Defines for PWM, word offsets (ie 4 byte multiples) */\n#define BCM2835_PWM_CONTROL 0\n#define BCM2835_PWM_STATUS  1\n#define BCM2835_PWM_DMAC    2\n#define BCM2835_PWM0_RANGE  4\n#define BCM2835_PWM0_DATA   5\n#define BCM2835_PWM_FIF1    6\n#define BCM2835_PWM1_RANGE  8\n#define BCM2835_PWM1_DATA   9\n\n/* Defines for PWM Clock, word offsets (ie 4 byte multiples) */\n#define BCM2835_PWMCLK_CNTL     40\n#define BCM2835_PWMCLK_DIV      41\n#define BCM2835_PWM_PASSWRD     (0x5A << 24)  /*!< Password to enable setting PWM clock */\n\n#define BCM2835_PWM1_MS_MODE    0x8000  /*!< Run in Mark/Space mode */\n#define BCM2835_PWM1_USEFIFO    0x2000  /*!< Data from FIFO */\n#define BCM2835_PWM1_REVPOLAR   0x1000  /*!< Reverse polarity */\n#define BCM2835_PWM1_OFFSTATE   0x0800  /*!< Ouput Off state */\n#define BCM2835_PWM1_REPEATFF   0x0400  /*!< Repeat last value if FIFO empty */\n#define BCM2835_PWM1_SERIAL     0x0200  /*!< Run in serial mode */\n#define BCM2835_PWM1_ENABLE     0x0100  /*!< Channel Enable */\n\n#define BCM2835_PWM0_MS_MODE    0x0080  /*!< Run in Mark/Space mode */\n#define BCM2835_PWM_CLEAR_FIFO  0x0040  /*!< Clear FIFO */\n#define BCM2835_PWM0_USEFIFO    0x0020  /*!< Data from FIFO */\n#define BCM2835_PWM0_REVPOLAR   0x0010  /*!< Reverse polarity */\n#define BCM2835_PWM0_OFFSTATE   0x0008  /*!< Ouput Off state */\n#define BCM2835_PWM0_REPEATFF   0x0004  /*!< Repeat last value if FIFO empty */\n#define BCM2835_PWM0_SERIAL     0x0002  /*!< Run in serial mode */\n#define BCM2835_PWM0_ENABLE     0x0001  /*!< Channel Enable */\n\n/*! \\brief bcm2835PWMClockDivider\n  Specifies the divider used to generate the PWM clock from the system clock.\n  Figures below give the divider, clock period and clock frequency.\n  Clock divided is based on nominal PWM base clock rate of 19.2MHz\n  The frequencies shown for each divider have been confirmed by measurement\n*/\ntypedef enum\n{\n    BCM2835_PWM_CLOCK_DIVIDER_2048  = 2048,    /*!< 2048 = 9.375kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_1024  = 1024,    /*!< 1024 = 18.75kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_512   = 512,     /*!< 512 = 37.5kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_256   = 256,     /*!< 256 = 75kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_128   = 128,     /*!< 128 = 150kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_64    = 64,      /*!< 64 = 300kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_32    = 32,      /*!< 32 = 600.0kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_16    = 16,      /*!< 16 = 1.2MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_8     = 8,       /*!< 8 = 2.4MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_4     = 4,       /*!< 4 = 4.8MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_2     = 2,       /*!< 2 = 9.6MHz, fastest you can get */\n    BCM2835_PWM_CLOCK_DIVIDER_1     = 1        /*!< 1 = 4.6875kHz, same as divider 4096 */\n} bcm2835PWMClockDivider;\n\n/* Historical name compatibility */\n#ifndef BCM2835_NO_DELAY_COMPATIBILITY\n#define delay(x) bcm2835_delay(x)\n#define delayMicroseconds(x) bcm2835_delayMicroseconds(x)\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    /*! \\defgroup init Library initialisation and management\n      These functions allow you to intialise and control the bcm2835 library\n      @{\n    */\n\n    /*! Initialise the library by opening /dev/mem (if you are root) \n      or /dev/gpiomem (if you are not)\n      and getting pointers to the \n      internal memory for BCM 2835 device registers. You must call this (successfully)\n      before calling any other \n      functions in this library (except bcm2835_set_debug). \n      If bcm2835_init() fails by returning 0, \n      calling any other function may result in crashes or other failures.\n      If bcm2835_init() succeeds but you are not running as root, then only gpio operations\n      are permitted, and calling any other functions may result in crashes or other failures. .\n      Prints messages to stderr in case of errors.\n      \\return 1 if successful else 0\n    */\n    extern int bcm2835_init(void);\n\n    /*! Close the library, deallocating any allocated memory and closing /dev/mem\n      \\return 1 if successful else 0\n    */\n    extern int bcm2835_close(void);\n\n    /*! Sets the debug level of the library.\n      A value of 1 prevents mapping to /dev/mem, and makes the library print out\n      what it would do, rather than accessing the GPIO registers.\n      A value of 0, the default, causes normal operation.\n      Call this before calling bcm2835_init();\n      \\param[in] debug The new debug level. 1 means debug\n    */\n    extern void  bcm2835_set_debug(uint8_t debug);\n\n    /*! Returns the version number of the library, same as BCM2835_VERSION\n       \\return the current library version number\n    */\n    extern unsigned int bcm2835_version(void);\n\n    /*! @} */\n\n    /*! \\defgroup lowlevel Low level register access\n      These functions provide low level register access, and should not generally\n      need to be used \n       \n      @{\n    */\n\n    /*! Gets the base of a register\n      \\param[in] regbase You can use one of the common values BCM2835_REGBASE_*\n      in \\ref bcm2835RegisterBase\n      \\return the register base\n      \\sa Physical Addresses\n    */\n    extern uint32_t* bcm2835_regbase(uint8_t regbase);\n\n    /*! Reads 32 bit value from a peripheral address WITH a memory barrier before and after each read.\n      This is safe, but slow.  The MB before protects this read from any in-flight reads that didn't\n      use a MB.  The MB after protects subsequent reads from another peripheral.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\return the value read from the 32 bit register\n      \\sa Physical Addresses\n    */\n    extern uint32_t bcm2835_peri_read(volatile uint32_t* paddr);\n\n    /*! Reads 32 bit value from a peripheral address WITHOUT the read barriers\n      You should only use this when:\n      o your code has previously called bcm2835_peri_read() for a register\n      within the same peripheral, and no read or write to another peripheral has occurred since.\n      o your code has called bcm2835_memory_barrier() since the last access to ANOTHER peripheral.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\return the value read from the 32 bit register\n      \\sa Physical Addresses\n    */\n    extern uint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr);\n\n\n    /*! Writes 32 bit value from a peripheral address WITH a memory barrier before and after each write\n      This is safe, but slow.  The MB before ensures that any in-flight write to another peripheral\n      completes before this write is issued.  The MB after ensures that subsequent reads and writes\n      to another peripheral will see the effect of this write.\n\n      This is a tricky optimization; if you aren't sure, use the barrier version.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value);\n\n    /*! Writes 32 bit value from a peripheral address without the write barrier\n      You should only use this when:\n      o your code has previously called bcm2835_peri_write() for a register\n      within the same peripheral, and no other peripheral access has occurred since.\n      o your code has called bcm2835_memory_barrier() since the last access to ANOTHER peripheral.\n\n      This is a tricky optimization; if you aren't sure, use the barrier version.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value);\n\n    /*! Alters a number of bits in a 32 peripheral regsiter.\n      It reads the current valu and then alters the bits defines as 1 in mask, \n      according to the bit value in value. \n      All other bits that are 0 in the mask are unaffected.\n      Use this to alter a subset of the bits in a register.\n      Memory barriers are used.  Note that this is not atomic; an interrupt\n      routine can cause unexpected results.\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write, masked in by mask.\n      \\param[in] mask Bitmask that defines the bits that will be altered in the register.\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask);\n    /*! @}    end of lowlevel */\n\n    /*! \\defgroup gpio GPIO register access\n      These functions allow you to control the GPIO interface. You can set the \n      function of each GPIO pin, read the input state and set the output state.\n      @{\n    */\n\n    /*! Sets the Function Select register for the given pin, which configures\n      the pin as Input, Output or one of the 6 alternate functions.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] mode Mode to set the pin to, one of BCM2835_GPIO_FSEL_* from \\ref bcm2835FunctionSelect\n    */\n    extern void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode);\n\n    /*! Sets the specified pin output to \n      HIGH.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\sa bcm2835_gpio_write()\n    */\n    extern void bcm2835_gpio_set(uint8_t pin);\n\n    /*! Sets the specified pin output to \n      LOW.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\sa bcm2835_gpio_write()\n    */\n    extern void bcm2835_gpio_clr(uint8_t pin);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to \n      HIGH.\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\sa bcm2835_gpio_write_multi()\n    */\n    extern void bcm2835_gpio_set_multi(uint32_t mask);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to \n      LOW.\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\sa bcm2835_gpio_write_multi()\n    */\n    extern void bcm2835_gpio_clr_multi(uint32_t mask);\n\n    /*! Reads the current level on the specified \n      pin and returns either HIGH or LOW. Works whether or not the pin\n      is an input or an output.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\return the current level  either HIGH or LOW\n    */\n    extern uint8_t bcm2835_gpio_lev(uint8_t pin);\n\n    /*! Event Detect Status.\n      Tests whether the specified pin has detected a level or edge\n      as requested by bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen(), \n      bcm2835_gpio_len(), bcm2835_gpio_aren(), bcm2835_gpio_afen().\n      Clear the flag for a given pin by calling bcm2835_gpio_set_eds(pin);\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\return HIGH if the event detect status for the given pin is true.\n    */\n    extern uint8_t bcm2835_gpio_eds(uint8_t pin);\n\n    /*! Same as bcm2835_gpio_eds() but checks if any of the pins specified in\n      the mask have detected a level or edge.\n      \\param[in] mask Mask of pins to check. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\return Mask of pins HIGH if the event detect status for the given pin is true.\n    */\n    extern uint32_t bcm2835_gpio_eds_multi(uint32_t mask);\n\n    /*! Sets the Event Detect Status register for a given pin to 1, \n      which has the effect of clearing the flag. Use this afer seeing\n      an Event Detect Status on the pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_set_eds(uint8_t pin);\n\n    /*! Same as bcm2835_gpio_set_eds() but clears the flag for any pin which\n      is set in the mask.\n      \\param[in] mask Mask of pins to clear. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n    */\n    extern void bcm2835_gpio_set_eds_multi(uint32_t mask);\n    \n    /*! Enable Rising Edge Detect Enable for the specified pin.\n      When a rising edge is detected, sets the appropriate pin in Event Detect Status.\n      The GPRENn registers use\n      synchronous edge detection. This means the input signal is sampled using the\n      system clock and then it is looking for a ?011? pattern on the sampled signal. This\n      has the effect of suppressing glitches.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_ren(uint8_t pin);\n\n    /*! Disable Rising Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_ren(uint8_t pin);\n\n    /*! Enable Falling Edge Detect Enable for the specified pin.\n      When a falling edge is detected, sets the appropriate pin in Event Detect Status.\n      The GPRENn registers use\n      synchronous edge detection. This means the input signal is sampled using the\n      system clock and then it is looking for a ?100? pattern on the sampled signal. This\n      has the effect of suppressing glitches.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_fen(uint8_t pin);\n\n    /*! Disable Falling Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_fen(uint8_t pin);\n\n    /*! Enable High Detect Enable for the specified pin.\n      When a HIGH level is detected on the pin, sets the appropriate pin in Event Detect Status.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_hen(uint8_t pin);\n\n    /*! Disable High Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_hen(uint8_t pin);\n\n    /*! Enable Low Detect Enable for the specified pin.\n      When a LOW level is detected on the pin, sets the appropriate pin in Event Detect Status.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_len(uint8_t pin);\n\n    /*! Disable Low Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_len(uint8_t pin);\n\n    /*! Enable Asynchronous Rising Edge Detect Enable for the specified pin.\n      When a rising edge is detected, sets the appropriate pin in Event Detect Status.\n      Asynchronous means the incoming signal is not sampled by the system clock. As such\n      rising edges of very short duration can be detected.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_aren(uint8_t pin);\n\n    /*! Disable Asynchronous Rising Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_aren(uint8_t pin);\n\n    /*! Enable Asynchronous Falling Edge Detect Enable for the specified pin.\n      When a falling edge is detected, sets the appropriate pin in Event Detect Status.\n      Asynchronous means the incoming signal is not sampled by the system clock. As such\n      falling edges of very short duration can be detected.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_afen(uint8_t pin);\n\n    /*! Disable Asynchronous Falling Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_afen(uint8_t pin);\n\n    /*! Sets the Pull-up/down register for the given pin. This is\n      used with bcm2835_gpio_pudclk() to set the  Pull-up/down resistor for the given pin.\n      However, it is usually more convenient to use bcm2835_gpio_set_pud().\n      \\param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl\n      On the RPI 4, although this function and bcm2835_gpio_pudclk() are supported for backward\n      compatibility, new code should always use bcm2835_gpio_set_pud().\n      \\sa bcm2835_gpio_set_pud()\n    */\n    extern void bcm2835_gpio_pud(uint8_t pud);\n\n    /*! Clocks the Pull-up/down value set earlier by bcm2835_gpio_pud() into the pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] on HIGH to clock the value from bcm2835_gpio_pud() into the pin. \n      LOW to remove the clock. \n      \n      On the RPI 4, although this function and bcm2835_gpio_pud() are supported for backward\n      compatibility, new code should always use bcm2835_gpio_set_pud().\n      \n      \\sa bcm2835_gpio_set_pud()\n    */\n    extern void bcm2835_gpio_pudclk(uint8_t pin, uint8_t on);\n\n    /*! Reads and returns the Pad Control for the given GPIO group.\n      Caution: requires root access.\n      \\param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_*\n      \\return Mask of bits from BCM2835_PAD_* from \\ref bcm2835PadGroup\n    */\n    extern uint32_t bcm2835_gpio_pad(uint8_t group);\n\n    /*! Sets the Pad Control for the given GPIO group.\n      Caution: requires root access.\n      \\param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_*\n      \\param[in] control Mask of bits from BCM2835_PAD_* from \\ref bcm2835PadGroup. Note \n      that it is not necessary to include BCM2835_PAD_PASSWRD in the mask as this\n      is automatically included.\n    */\n    extern void bcm2835_gpio_set_pad(uint8_t group, uint32_t control);\n\n    /*! Delays for the specified number of milliseconds.\n      Uses nanosleep(), and therefore does not use CPU until the time is up.\n      However, you are at the mercy of nanosleep(). From the manual for nanosleep():\n      If the interval specified in req is not an exact multiple of the granularity  \n      underlying  clock  (see  time(7)),  then the interval will be\n      rounded up to the next multiple. Furthermore, after the sleep completes, \n      there may still be a delay before the CPU becomes free to once\n      again execute the calling thread.\n      \\param[in] millis Delay in milliseconds\n    */\n    extern void bcm2835_delay (unsigned int millis);\n\n    /*! Delays for the specified number of microseconds.\n      Uses a combination of nanosleep() and a busy wait loop on the BCM2835 system timers,\n      However, you are at the mercy of nanosleep(). From the manual for nanosleep():\n      If the interval specified in req is not an exact multiple of the granularity  \n      underlying  clock  (see  time(7)),  then the interval will be\n      rounded up to the next multiple. Furthermore, after the sleep completes, \n      there may still be a delay before the CPU becomes free to once\n      again execute the calling thread.\n      For times less than about 450 microseconds, uses a busy wait on the System Timer.\n      It is reported that a delay of 0 microseconds on RaspberryPi will in fact\n      result in a delay of about 80 microseconds. Your mileage may vary.\n      \\param[in] micros Delay in microseconds\n    */\n    extern void bcm2835_delayMicroseconds (uint64_t micros);\n\n    /*! Sets the output state of the specified pin\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] on HIGH sets the output to HIGH and LOW to LOW.\n    */\n    extern void bcm2835_gpio_write(uint8_t pin, uint8_t on);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to the state given by on\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\param[in] on HIGH sets the output to HIGH and LOW to LOW.\n    */\n    extern void bcm2835_gpio_write_multi(uint32_t mask, uint8_t on);\n\n    /*! Sets the first 32 GPIO output pins specified in the mask to the value given by value\n      \\param[in] value values required for each bit masked in by mask, eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n    */\n    extern void bcm2835_gpio_write_mask(uint32_t value, uint32_t mask);\n\n    /*! Sets the Pull-up/down mode for the specified pin. This is more convenient than\n      clocking the mode in with bcm2835_gpio_pud() and bcm2835_gpio_pudclk().\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl\n    */\n    extern void bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud);\n\n    /*! On the BCM2711 based RPI 4, gets the current Pull-up/down mode for the specified pin.\n      Returns one of BCM2835_GPIO_PUD_* from bcm2835PUDControl.\n      On earlier RPI versions not based on the BCM2711, returns BCM2835_GPIO_PUD_ERROR\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    \n    extern uint8_t bcm2835_gpio_get_pud(uint8_t pin);\n\n    /*! @}  */\n\n    /*! \\defgroup spi SPI access\n      These functions let you use SPI0 (Serial Peripheral Interface) to \n      interface with an external SPI device.\n      @{\n    */\n\n    /*! Start SPI operations.\n      Forces RPi SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1)\n      to alternate function ALT0, which enables those pins for SPI interface.\n      You should call bcm2835_spi_end() when all SPI funcitons are complete to return the pins to \n      their default functions.\n      \\sa  bcm2835_spi_end()\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n    */\n    extern int bcm2835_spi_begin(void);\n\n    /*! End SPI operations.\n      SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1)\n      are returned to their default INPUT behaviour.\n    */\n    extern void bcm2835_spi_end(void);\n\n    /*! Sets the SPI bit order\n      Set the bit order to be used for transmit and receive. The bcm2835 SPI0 only supports BCM2835_SPI_BIT_ORDER_MSB,\n      so if you select BCM2835_SPI_BIT_ORDER_LSB, the bytes will be reversed in software.\n      The library defaults to BCM2835_SPI_BIT_ORDER_MSB.\n      \\param[in] order The desired bit order, one of BCM2835_SPI_BIT_ORDER_*, \n      see \\ref bcm2835SPIBitOrder\n    */\n    extern void bcm2835_spi_setBitOrder(uint8_t order);\n\n    /*! Sets the SPI clock divider and therefore the \n      SPI clock speed. \n      \\param[in] divider The desired SPI clock divider, one of BCM2835_SPI_CLOCK_DIVIDER_*, \n      see \\ref bcm2835SPIClockDivider\n    */\n    extern void bcm2835_spi_setClockDivider(uint16_t divider);\n\n    /*! Sets the SPI clock divider by converting the speed parameter to\n      the equivalent SPI clock divider. ( see \\sa bcm2835_spi_setClockDivider)\n      \\param[in] speed_hz The desired SPI clock speed in Hz\n    */\n   extern void bcm2835_spi_set_speed_hz(uint32_t speed_hz);\n\n    /*! Sets the SPI data mode\n      Sets the clock polariy and phase\n      \\param[in] mode The desired data mode, one of BCM2835_SPI_MODE*, \n      see \\ref bcm2835SPIMode\n    */\n    extern void bcm2835_spi_setDataMode(uint8_t mode);\n\n    /*! Sets the chip select pin(s)\n      When an bcm2835_spi_transfer() is made, the selected pin(s) will be asserted during the\n      transfer.\n      \\param[in] cs Specifies the CS pins(s) that are used to activate the desired slave. \n      One of BCM2835_SPI_CS*, see \\ref bcm2835SPIChipSelect\n    */\n    extern void bcm2835_spi_chipSelect(uint8_t cs);\n\n    /*! Sets the chip select pin polarity for a given pin\n      When an bcm2835_spi_transfer() occurs, the currently selected chip select pin(s) \n      will be asserted to the \n      value given by active. When transfers are not happening, the chip select pin(s) \n      return to the complement (inactive) value.\n      \\param[in] cs The chip select pin to affect\n      \\param[in] active Whether the chip select pin is to be active HIGH\n    */\n    extern void bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active);\n\n    /*! Transfers one byte to and from the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) \n      during the transfer.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. \n      Returns the read data byte from the slave.\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] value The 8 bit data byte to write to MOSI\n      \\return The 8 bit byte simultaneously read from  MISO\n      \\sa bcm2835_spi_transfern()\n    */\n    extern uint8_t bcm2835_spi_transfer(uint8_t value);\n    \n    /*! Transfers any number of bytes to and from the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) \n      during the transfer.\n      Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO. \n      The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] tbuf Buffer of bytes to send. \n      \\param[out] rbuf Received bytes will by put in this buffer\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received\n      \\sa bcm2835_spi_transfer()\n    */\n    extern void bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the currently selected SPI slave\n      using bcm2835_spi_transfernb.\n      The returned data from the slave replaces the transmitted data in the buffer.\n      \\param[in,out] buf Buffer of bytes to send. Received bytes will replace the contents\n      \\param[in] len Number of bytes int eh buffer, and the number of bytes to send/received\n      \\sa bcm2835_spi_transfer()\n    */\n    extern void bcm2835_spi_transfern(char* buf, uint32_t len);\n\n    /*! Transfers any number of bytes to the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect)\n      during the transfer.\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to send\n    */\n    extern void bcm2835_spi_writenb(const char* buf, uint32_t len);\n\n    /*! Transfers half-word to the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect)\n      during the transfer.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO.\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] data The 8 bit data byte to write to MOSI\n      \\sa bcm2835_spi_writenb()\n    */\n    extern void bcm2835_spi_write(uint16_t data);\n\n    /*! Start AUX SPI operations.\n      Forces RPi AUX SPI pins P1-38 (MOSI), P1-38 (MISO), P1-40 (CLK) and P1-36 (CE2)\n      to alternate function ALT4, which enables those pins for SPI interface.\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n    */\n    extern int bcm2835_aux_spi_begin(void);\n\n    /*! End AUX SPI operations.\n       SPI1 pins P1-38 (MOSI), P1-38 (MISO), P1-40 (CLK) and P1-36 (CE2)\n       are returned to their default INPUT behaviour.\n     */\n    extern void bcm2835_aux_spi_end(void);\n\n    /*! Sets the AUX SPI clock divider and therefore the AUX SPI clock speed.\n      \\param[in] divider The desired AUX SPI clock divider.\n    */\n    extern void bcm2835_aux_spi_setClockDivider(uint16_t divider);\n\n    /*!\n     * Calculates the input for \\sa bcm2835_aux_spi_setClockDivider\n     * @param speed_hz A value between \\sa BCM2835_AUX_SPI_CLOCK_MIN and \\sa BCM2835_AUX_SPI_CLOCK_MAX\n     * @return Input for \\sa bcm2835_aux_spi_setClockDivider\n     */\n    extern uint16_t bcm2835_aux_spi_CalcClockDivider(uint32_t speed_hz);\n\n    /*! Transfers half-word to the AUX SPI slave.\n      Asserts the currently selected CS pins during the transfer.\n      \\param[in] data The 8 bit data byte to write to MOSI\n      \\return The 16 bit byte simultaneously read from  MISO\n      \\sa bcm2835_spi_transfern()\n    */\n    extern void bcm2835_aux_spi_write(uint16_t data);\n\n    /*! Transfers any number of bytes to the AUX SPI slave.\n      Asserts the CE2 pin during the transfer.\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send\n    */\n    extern void bcm2835_aux_spi_writenb(const char *buf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the AUX SPI slave\n      using bcm2835_aux_spi_transfernb.\n      The returned data from the slave replaces the transmitted data in the buffer.\n      \\param[in,out] buf Buffer of bytes to send. Received bytes will replace the contents\n      \\param[in] len Number of bytes in the buffer, and the number of bytes to send/received\n      \\sa bcm2835_aux_spi_transfer()\n    */\n    extern void bcm2835_aux_spi_transfern(char *buf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the AUX SPI slave.\n      Asserts the CE2 pin during the transfer.\n      Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO.\n      The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long\n      \\param[in] tbuf Buffer of bytes to send.\n      \\param[out] rbuf Received bytes will by put in this buffer\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received\n    */\n    extern void bcm2835_aux_spi_transfernb(const char *tbuf, char *rbuf, uint32_t len);\n\n    /*! Transfers one byte to and from the AUX SPI slave.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. \n      Returns the read data byte from the slave.\n      \\param[in] value The 8 bit data byte to write to MOSI\n      \\return The 8 bit byte simultaneously read from MISO\n      \\sa bcm2835_aux_spi_transfern()\n    */\n    extern uint8_t bcm2835_aux_spi_transfer(uint8_t value);\n    \n    /*! @} */\n\n    /*! \\defgroup i2c I2C access\n      These functions let you use I2C (The Broadcom Serial Control bus with the Philips\n      I2C bus/interface version 2.1 January 2000.) to interface with an external I2C device.\n      @{\n    */\n\n    /*! Start I2C operations.\n      Forces RPi I2C pins P1-03 (SDA) and P1-05 (SCL)\n      to alternate function ALT0, which enables those pins for I2C interface.\n      You should call bcm2835_i2c_end() when all I2C functions are complete to return the pins to\n      their default functions\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n      \\sa  bcm2835_i2c_end()\n    */\n    extern int bcm2835_i2c_begin(void);\n\n    /*! End I2C operations.\n      I2C pins P1-03 (SDA) and P1-05 (SCL)\n      are returned to their default INPUT behaviour.\n    */\n    extern void bcm2835_i2c_end(void);\n\n    /*! Sets the I2C slave address.\n      \\param[in] addr The I2C slave address.\n    */\n    extern void bcm2835_i2c_setSlaveAddress(uint8_t addr);\n\n    /*! Sets the I2C clock divider and therefore the I2C clock speed.\n      \\param[in] divider The desired I2C clock divider, one of BCM2835_I2C_CLOCK_DIVIDER_*,\n      see \\ref bcm2835I2CClockDivider\n    */\n    extern void bcm2835_i2c_setClockDivider(uint16_t divider);\n\n    /*! Sets the I2C clock divider by converting the baudrate parameter to\n      the equivalent I2C clock divider. ( see \\sa bcm2835_i2c_setClockDivider)\n      For the I2C standard 100khz you would set baudrate to 100000\n      The use of baudrate corresponds to its use in the I2C kernel device\n      driver. (Of course, bcm2835 has nothing to do with the kernel driver)\n    */\n    extern void bcm2835_i2c_set_baudrate(uint32_t baudrate);\n\n    /*! Transfers any number of bytes to the currently selected I2C slave.\n      (as previously set by \\sa bcm2835_i2c_setSlaveAddress)\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to send.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_write(const char * buf, uint32_t len);\n\n    /*! Transfers any number of bytes from the currently selected I2C slave.\n      (as previously set by \\sa bcm2835_i2c_setSlaveAddress)\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to received.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_read(char* buf, uint32_t len);\n\n    /*! Allows reading from I2C slaves that require a repeated start (without any prior stop)\n      to read after the required slave register has been set. For example, the popular\n      MPL3115A2 pressure and temperature sensor. Note that your device must support or\n      require this mode. If your device does not require this mode then the standard\n      combined:\n      \\sa bcm2835_i2c_write\n      \\sa bcm2835_i2c_read\n      are a better choice.\n      Will read from the slave previously set by \\sa bcm2835_i2c_setSlaveAddress\n      \\param[in] regaddr Buffer containing the slave register you wish to read from.\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to received.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len);\n\n    /*! Allows sending an arbitrary number of bytes to I2C slaves before issuing a repeated\n      start (with no prior stop) and reading a response.\n      Necessary for devices that require such behavior, such as the MLX90620.\n      Will write to and read from the slave previously set by \\sa bcm2835_i2c_setSlaveAddress\n      \\param[in] cmds Buffer containing the bytes to send before the repeated start condition.\n      \\param[in] cmds_len Number of bytes to send from cmds buffer\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] buf_len Number of bytes to receive in the buf buffer.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* buf, uint32_t buf_len);\n\n    /*! @} */\n\n    /*! \\defgroup st System Timer access\n      Allows access to and delays using the System Timer Counter.\n      @{\n    */\n\n    /*! Read the System Timer Counter register.\n      \\return the value read from the System Timer Counter Lower 32 bits register\n    */\n    extern uint64_t bcm2835_st_read(void);\n\n    /*! Delays for the specified number of microseconds with offset.\n      \\param[in] offset_micros Offset in microseconds\n      \\param[in] micros Delay in microseconds\n    */\n    extern void bcm2835_st_delay(uint64_t offset_micros, uint64_t micros);\n\n    /*! @}  */\n\n    /*! \\defgroup pwm Pulse Width Modulation\n      Allows control of 2 independent PWM channels. A limited subset of GPIO pins\n      can be connected to one of these 2 channels, allowing PWM control of GPIO pins.\n      You have to set the desired pin into a particular Alt Fun to PWM output. See the PWM\n      documentation on the Main Page.\n      @{\n    */\n\n    /*! Sets the PWM clock divisor, \n      to control the basic PWM pulse widths.\n      \\param[in] divisor Divides the basic 19.2MHz PWM clock. You can use one of the common\n      values BCM2835_PWM_CLOCK_DIVIDER_* in \\ref bcm2835PWMClockDivider\n    */\n    extern void bcm2835_pwm_set_clock(uint32_t divisor);\n    \n    /*! Sets the mode of the given PWM channel,\n      allowing you to control the PWM mode and enable/disable that channel\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] markspace Set true if you want Mark-Space mode. 0 for Balanced mode.\n      \\param[in] enabled Set true to enable this channel and produce PWM pulses.\n    */\n    extern void bcm2835_pwm_set_mode(uint8_t channel, uint8_t markspace, uint8_t enabled);\n\n    /*! Sets the maximum range of the PWM output.\n      The data value can vary between 0 and this range to control PWM output\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] range The maximum value permitted for DATA.\n    */\n    extern void bcm2835_pwm_set_range(uint8_t channel, uint32_t range);\n    \n    /*! Sets the PWM pulse ratio to emit to DATA/RANGE, \n      where RANGE is set by bcm2835_pwm_set_range().\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] data Controls the PWM output ratio as a fraction of the range. \n      Can vary from 0 to RANGE.\n    */\n    extern void bcm2835_pwm_set_data(uint8_t channel, uint32_t data);\n\n    /*! @}  */\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BCM2835_H */\n\n/*! @example blink.c\n  Blinks RPi GPIO pin 11 on and off\n*/\n\n/*! @example input.c\n  Reads the state of an RPi input pin\n*/\n\n/*! @example event.c\n  Shows how to use event detection on an input pin\n*/\n\n/*! @example spi.c\n  Shows how to use SPI interface to transfer a byte to and from an SPI device\n*/\n\n/*! @example spin.c\n  Shows how to use SPI interface to transfer a number of bytes to and from an SPI device\n*/\n\n/*! @example pwm.c\n  Shows how to use PWM to control GPIO pins\n*/\n\n/*! @example i2c.c\nCommand line utility for executing i2c commands with the \nBroadcom bcm2835. Contributed by Shahrooz Shahparnia.\n*/\n\n/*! example gpio.c\n  Command line utility for executing gpio commands with the \n  Broadcom bcm2835. Contributed by Shahrooz Shahparnia.\n*/\n\n/*! example spimem_test.c\n  Shows how to use the included little library (spiram.c and spiram.h)\n  to read and write SPI RAM chips such as 23K256-I/P\n*/\n"
  },
  {
    "path": "LinuxCNC/Components/Remora/remora.h",
    "content": "\n#ifndef REMORA_H\n#define REMORA_H\n\n\n#define JOINTS\t\t\t\t8  \t\t\t// Number of joints - set this the same as Remora firmware code!!!. Max 8 joints\n#define VARIABLES          \t6 \t\t\t// Number of command values - set this the same Remora firmware code!!!\n#define DIGITAL_OUTPUTS\t\t16\n#define DIGITAL_INPUTS\t\t32//16\n\n#define SPIBUFSIZE\t\t\t64 \t\t\t//(4+4*JOINTS+4*COMMANDS+1) //(MAX_MSG*4) //20  SPI buffer size ......FIFO buffer size is 64 bytes?\n\n#define PRU_DATA\t\t\t0x64617461 \t// \"data\" SPI payload\n#define PRU_READ          \t0x72656164  // \"read\" SPI payload\n#define PRU_WRITE         \t0x77726974  // \"writ\" SPI payload\n#define PRU_ESTOP           0x65737470  // \"estp\" SPI payload\n\n#define STEPBIT\t\t\t\t22\t\t\t// bit location in DDS accum\n#define STEP_MASK\t\t\t(1L<<STEPBIT)\n#define STEP_OFFSET\t\t\t(1L<<(STEPBIT-1))\n\n#define PRU_BASEFREQ\t\t40000 \t\t// Base freq of the PRU stepgen in Hz\n\n\n\n#endif\n"
  },
  {
    "path": "LinuxCNC/Components/Remora/remora_lpc.c",
    "content": "/********************************************************************\n* Description:  remora_lpc.c\n*               This file, 'remora.c', is a HAL component that\n*               provides and SPI connection to a external LPC1768 running Remora PRU firmware.\n*  \t\t\t\t\n*\t\t\t\tInitially developed for RaspberryPi -> Arduino Due.\n*\t\t\t\tFurther developed for RaspberryPi -> Smoothieboard and clones (LPC1768).\n*\n* Author: Scott Alford\n* License: GPL Version 2\n*\n*\t\tCredit to GP Orcullo and PICnc V2 which originally inspired this\n*\t\tand portions of this code is based on stepgen.c by John Kasunich\n*\t\tand hm2_rpspi.c by Matsche\n*\n* Copyright (c) 2021\tAll rights reserved.\n*\n* Last change:\n********************************************************************/\n\n\n#include \"rtapi.h\"\t\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"hal.h\"\t\t\t/* HAL public API decls */\n\n#include <math.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <string.h>\n\n\n// Using BCM2835 driver library by Mike McCauley, why reinvent the wheel!\n// http://www.airspayce.com/mikem/bcm2835/index.html\n// Include these in the source directory when using \"halcompile --install remora_lpc.c\"\n#include \"bcm2835.h\"\n#include \"bcm2835.c\"\n\n#include \"remora.h\"\n\n\n#define MODNAME \"remora_lpc\"\n#define PREFIX \"remora\"\n\nMODULE_AUTHOR(\"Scott Alford AKA scotta\");\nMODULE_DESCRIPTION(\"Driver for Remora LPC1768 control board\");\nMODULE_LICENSE(\"GPL v2\");\n\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\ntypedef struct {\n\thal_bit_t\t\t*SPIenable;\n\thal_bit_t\t\t*SPIreset;\n\thal_bit_t\t\t*PRUreset;\n\tbool\t\t\tSPIresetOld;\n\thal_bit_t\t\t*SPIstatus;\n\thal_bit_t \t\t*stepperEnable[JOINTS];\n\tint\t\t\t\tpos_mode[JOINTS];\n\thal_float_t \t*pos_cmd[JOINTS];\t\t\t// pin: position command (position units)\n\thal_float_t \t*vel_cmd[JOINTS];\t\t\t// pin: velocity command (position units/sec)\n\thal_float_t \t*pos_fb[JOINTS];\t\t\t// pin: position feedback (position units)\n\thal_s32_t\t\t*count[JOINTS];\t\t\t\t// pin: psition feedback (raw counts)\n\thal_float_t \tpos_scale[JOINTS];\t\t\t// param: steps per position unit\n\tfloat \t\t\tfreq[JOINTS];\t\t\t\t// param: frequency command sent to PRU\n\thal_float_t \t*freq_cmd[JOINTS];\t\t\t// pin: frequency command monitoring, available in LinuxCNC\n\thal_float_t \tmaxvel[JOINTS];\t\t\t\t// param: max velocity, (pos units/sec)\n\thal_float_t \tmaxaccel[JOINTS];\t\t\t// param: max accel (pos units/sec^2)\n\thal_float_t\t\t*pgain[JOINTS];\n\thal_float_t\t\t*ff1gain[JOINTS];\n\thal_float_t\t\t*deadband[JOINTS];\n\tfloat \t\t\told_pos_cmd[JOINTS];\t\t// previous position command (counts)\n\tfloat \t\t\told_pos_cmd_raw[JOINTS];\t\t// previous position command (counts)\n\tfloat \t\t\told_scale[JOINTS];\t\t\t// stored scale value\n\tfloat \t\t\tscale_recip[JOINTS];\t\t// reciprocal value used for scaling\n\tfloat\t\t\tprev_cmd[JOINTS];\n\tfloat\t\t\tcmd_d[JOINTS];\t\t\t\t\t// command derivative\n\thal_float_t \t*setPoint[VARIABLES];\n\thal_float_t \t*processVariable[VARIABLES];\n\thal_bit_t   \t*outputs[DIGITAL_OUTPUTS];\n\thal_bit_t   \t*inputs[DIGITAL_INPUTS];\n} data_t;\n\nstatic data_t *data;\n\n\n#pragma pack(push, 1)\n\ntypedef union\n{\n  // this allow structured access to the outgoing SPI data without having to move it\n  // this is the same structure as the PRU rxData structure\n  struct\n  {\n    uint8_t txBuffer[SPIBUFSIZE];\n  };\n  struct\n  {\n\tint32_t header;\n    int32_t jointFreqCmd[JOINTS];\n    float \tsetPoint[VARIABLES];\n\tuint8_t jointEnable;\n\tuint16_t outputs;\n    uint8_t spare0;\n  };\n} txData_t;\n\n\ntypedef union\n{\n  // this allow structured access to the incoming SPI data without having to move it\n  // this is the same structure as the PRU txData structure\n  struct\n  {\n    uint8_t rxBuffer[SPIBUFSIZE];\n  };\n  struct\n  {\n    int32_t header;\n    int32_t jointFeedback[JOINTS];\n    float \tprocessVariable[VARIABLES];\n    uint16_t inputs;\n  };\n} rxData_t;\n\n#pragma pack(pop)\n\nstatic txData_t txData;\nstatic rxData_t rxData;\n\n\n/* other globals */\nstatic int \t\t\tcomp_id;\t\t\t\t// component ID\nstatic const char \t*modname = MODNAME;\nstatic const char \t*prefix = PREFIX;\nstatic int \t\t\tnum_chan = 0;\t\t\t// number of step generators configured\nstatic long \t\told_dtns;\t\t\t\t// update_freq function period in nsec - (THIS IS RUNNING IN THE PI)\nstatic double\t\tdt;\t\t\t\t\t\t// update_freq period in seconds  - (THIS IS RUNNING IN THE PI)\nstatic double \t\trecip_dt;\t\t\t\t// recprocal of period, avoids divides\n\nstatic int64_t \t\taccum[JOINTS] = { 0 };\nstatic int32_t \t\told_count[JOINTS] = { 0 };\nstatic int32_t\t\taccum_diff = 0;\n\nstatic int \t\t\treset_gpio_pin = 25;\t\t\t\t// RPI GPIO pin number used to force watchdog reset of the PRU \n\ntypedef enum CONTROL { POSITION, VELOCITY, INVALID } CONTROL;\nchar *ctrl_type[JOINTS] = { \"p\" };\nRTAPI_MP_ARRAY_STRING(ctrl_type,JOINTS,\"control type (pos or vel)\");\n\nenum CHIP { LPC, STM } chip;\nchar *chip_type = { \"LPC\" }; //default to LPC\nRTAPI_MP_STRING(chip_type, \"PRU chip type; LPC or STM\");\n\nint SPI_clk_div = -1;\nRTAPI_MP_INT(SPI_clk_div, \"SPI clock divider\");\n\nint PRU_base_freq = -1;\nRTAPI_MP_INT(PRU_base_freq, \"PRU base thread frequency\");\n\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\nstatic int rt_bcm2835_init(void);\n\nstatic void update_freq(void *arg, long period);\nstatic void spi_write();\nstatic void spi_read();\nstatic void spi_transfer();\nstatic CONTROL parse_ctrl_type(const char *ctrl);\n\n\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\nint rtapi_app_main(void)\n{\n    char name[HAL_NAME_LEN + 1];\n\tint n, retval;\n\n\t// parse stepgen control type\n\tfor (n = 0; n < JOINTS; n++) {\n\t\tif(parse_ctrl_type(ctrl_type[n]) == INVALID) {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\t\t\"STEPGEN: ERROR: bad control type '%s' for axis %i (must be 'p' or 'v')\\n\",\n\t\t\t\t\tctrl_type[n], n);\n\t\t\treturn -1;\n\t\t}\n    }\n\t\n\t// check to see PRU chip type has been set at the command line\n\tif (!strcmp(chip_type, \"LPC\") || !strcmp(chip_type, \"lpc\"))\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: Chip type set to LPC\\n\");\n\t\tchip = LPC;\n\t}\n\telse if (!strcmp(chip_type, \"STM\") || !strcmp(chip_type, \"stm\"))\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: Chip type set to STM\\n\");\n\t\tchip = STM;\n\t}\n\telse\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"ERROR: PRU chip type (must be 'LPC' or 'STM')\\n\");\n\t\treturn -1;\n\t}\n\t\n\t// check to see if the PRU base frequency has been set at the command line\n\tif (PRU_base_freq != -1)\n\t{\n\t\tif ((PRU_base_freq < 40000) || (PRU_base_freq > 120000))\n\t\t{\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"ERROR: PRU base frequency incorrect\\n\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tPRU_base_freq = PRU_BASEFREQ;\n\t}\n\t\n\t\n\n    // connect to the HAL, initialise the driver\n    comp_id = hal_init(modname);\n    if (comp_id < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"%s ERROR: hal_init() failed \\n\", modname);\n\t\treturn -1;\n    }\n\n\t// allocate shared memory\n\tdata = hal_malloc(sizeof(data_t));\n\tif (data == 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\"%s: ERROR: hal_malloc() failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\t// Map the RPi BCM2835 peripherals - uses \"rtapi_open_as_root\" in place of \"open\"\n\tif (!rt_bcm2835_init())\n    {\n      rtapi_print_msg(RTAPI_MSG_ERR,\"rt_bcm2835_init failed. Are you running with root privlages??\\n\");\n      return -1;\n    }\n\n\t// Set the SPI0 pins to the Alt 0 function to enable SPI0 access, setup CS register\n\t// and clear TX and RX fifos\n\tif (!bcm2835_spi_begin())\n    {\n      rtapi_print_msg(RTAPI_MSG_ERR,\"bcm2835_spi_begin failed. Are you running with root privlages??\\n\");\n      return -1;\n    }\n\n\t// Configure SPI0\n\tbcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default\n\tbcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default\n\n\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_128);\t\t// 3.125MHz on RPI3\n\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64);\t\t// 6.250MHz on RPI3\n\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_32);\t\t// 12.5MHz on RPI3\n\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16);\t\t// 25MHz on RPI3\n\n\tif (chip == LPC) \n\t{\n\t\tbcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64);\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: SPI default clk divider set to 64\\n\");\n\t}\n\telse if (chip == STM) \n\t{\n\t\tbcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16);\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: SPI default clk divider set to 16\\n\");\n\t}\n\t\n\t// check if the default SPI clock divider has been overriden at the command line\n\tif (SPI_clk_div != -1)\n\t{\n\t\t// check that the setting is a power of 2\n\t\tif ((SPI_clk_div & (SPI_clk_div - 1)) == 0)\n\t\t{\n\t\t\tbcm2835_spi_setClockDivider(SPI_clk_div);\n\t\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: SPI clk divider overridden and set to %d\\n\", SPI_clk_div);\t\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// it's not a power of 2\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\"ERROR: PRU SPI clock divider incorrect\\n\");\n\t\t\treturn -1;\n\t\t}\t\n\t}\n\n    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default\n    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default\n\n\n\t/* RPI_GPIO_P1_19        = 10 \t\tMOSI when SPI0 in use\n     * RPI_GPIO_P1_21        =  9 \t\tMISO when SPI0 in use\n     * RPI_GPIO_P1_23        = 11 \t\tCLK when SPI0 in use\n     * RPI_GPIO_P1_24        =  8 \t\tCE0 when SPI0 in use\n     * RPI_GPIO_P1_26        =  7 \t\tCE1 when SPI0 in use\n\t */\n\n\t// Configure pullups on SPI0 pins - source termination and CS high (does this allows for higher clock frequencies??? wiring is more important here)\n\tbcm2835_gpio_set_pud(RPI_GPIO_P1_19, BCM2835_GPIO_PUD_DOWN);\t// MOSI\n\tbcm2835_gpio_set_pud(RPI_GPIO_P1_21, BCM2835_GPIO_PUD_DOWN);\t// MISO\n\tbcm2835_gpio_set_pud(RPI_GPIO_P1_24, BCM2835_GPIO_PUD_UP);\t\t// CS0\n\n\t// export remoraPRU SPI enable and status bits\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->SPIenable),\n\t\t\tcomp_id, \"%s.SPI-enable\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->SPIreset),\n\t\t\tcomp_id, \"%s.SPI-reset\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->SPIstatus),\n\t\t\tcomp_id, \"%s.SPI-status\", prefix);\n\tif (retval != 0) goto error;\n\n\tbcm2835_gpio_fsel(reset_gpio_pin, BCM2835_GPIO_FSEL_OUTP);\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->PRUreset),\n\t\t\tcomp_id, \"%s.PRU-reset\", prefix);\n\tif (retval != 0) goto error;\n\n\n    // export all the variables for each joint\n    for (n = 0; n < JOINTS; n++) {\n\t\t// export pins\n\n\t\tdata->pos_mode[n] = (parse_ctrl_type(ctrl_type[n]) == POSITION);\n/*\nThis is throwing errors from axis.py for some reason...\n\t\t\n\t\tif (data->pos_mode[n]){\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating pos_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t} else {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating vel_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n*/\n\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->stepperEnable[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.enable\", prefix, n);\n\t\tif (retval != 0) goto error;\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t\n\t\tif (data->pos_mode[n] == 0){\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->freq_cmd[n]),\n\t\t        comp_id, \"%s.joint.%01d.freq-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->freq_cmd[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->pos_fb[n]),\n\t\t        comp_id, \"%s.joint.%01d.pos-fb\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_fb[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->pos_scale[n]),\n\t\t        comp_id, \"%s.joint.%01d.scale\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->pos_scale[n] = 1.0;\n\n\t\tretval = hal_pin_s32_newf(HAL_OUT, &(data->count[n]),\n\t\t        comp_id, \"%s.joint.%01d.counts\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->count[n]) = 0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pgain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pgain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pgain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->ff1gain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.ff1gain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->ff1gain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->deadband[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.deadband\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->deadband[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->maxaccel[n]),\n\t\t        comp_id, \"%s.joint.%01d.maxaccel\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->maxaccel[n] = 1.0;\n\t}\n\n\tfor (n = 0; n < VARIABLES; n++) {\n\t// export pins\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->setPoint[n]),\n\t\t        comp_id, \"%s.SP.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->setPoint[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->processVariable[n]),\n\t\t        comp_id, \"%s.PV.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->processVariable[n]) = 0.0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_OUTPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->outputs[n]),\n\t\t\t\tcomp_id, \"%s.output.%01d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->outputs[n])=0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_INPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->inputs[n]),\n\t\t\t\tcomp_id, \"%s.input.%01d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->inputs[n])=0;\n\t}\n\n\terror:\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: pin export failed with err=%i\\n\",\n\t\t        modname, retval);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\n\n\n\n\t// Export functions\n\trtapi_snprintf(name, sizeof(name), \"%s.update-freq\", prefix);\n\tretval = hal_export_funct(name, update_freq, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: update function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.write\", prefix);\n\t/* no FP operations */\n\tretval = hal_export_funct(name, spi_write, 0, 0, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: write function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.read\", prefix);\n\tretval = hal_export_funct(name, spi_read, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: read function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_print_msg(RTAPI_MSG_INFO, \"%s: installed driver\\n\", modname);\n\thal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n    hal_exit(comp_id);\n}\n\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\n\n// This is the same as the standard bcm2835 library except for the use of\n// \"rtapi_open_as_root\" in place of \"open\"\n\nint rt_bcm2835_init(void)\n{\n    int  memfd;\n    int  ok;\n    FILE *fp;\n\n    if (debug) \n    {\n        bcm2835_peripherals = (uint32_t*)BCM2835_PERI_BASE;\n\n\tbcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n\tbcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n\tbcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n\tbcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n\tbcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n\tbcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4;\n\tbcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4;\n\tbcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n\tbcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n\tbcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n\treturn 1; /* Success */\n    }\n\n    /* Figure out the base and size of the peripheral address block\n    // using the device-tree. Required for RPi2/3/4, optional for RPi 1\n    */\n    if ((fp = fopen(BMC2835_RPI2_DT_FILENAME , \"rb\")))\n    {\n        unsigned char buf[16];\n        uint32_t base_address;\n        uint32_t peri_size;\n        if (fread(buf, 1, sizeof(buf), fp) >= 8)\n        {\n            base_address = (buf[4] << 24) |\n              (buf[5] << 16) |\n              (buf[6] << 8) |\n              (buf[7] << 0);\n            \n            peri_size = (buf[8] << 24) |\n              (buf[9] << 16) |\n              (buf[10] << 8) |\n              (buf[11] << 0);\n            \n            if (!base_address)\n            {\n                /* looks like RPI 4 */\n                base_address = (buf[8] << 24) |\n                      (buf[9] << 16) |\n                      (buf[10] << 8) |\n                      (buf[11] << 0);\n                      \n                peri_size = (buf[12] << 24) |\n                (buf[13] << 16) |\n                (buf[14] << 8) |\n                (buf[15] << 0);\n            }\n            /* check for valid known range formats */\n            if ((buf[0] == 0x7e) &&\n                    (buf[1] == 0x00) &&\n                    (buf[2] == 0x00) &&\n                    (buf[3] == 0x00) &&\n                    ((base_address == BCM2835_PERI_BASE) || (base_address == BCM2835_RPI2_PERI_BASE) || (base_address == BCM2835_RPI4_PERI_BASE)))\n            {\n                bcm2835_peripherals_base = (off_t)base_address;\n                bcm2835_peripherals_size = (size_t)peri_size;\n                if( base_address == BCM2835_RPI4_PERI_BASE )\n                {\n                    pud_type_rpi4 = 1;\n                }\n            }\n        \n        }\n        \n\tfclose(fp);\n    }\n    /* else we are prob on RPi 1 with BCM2835, and use the hardwired defaults */\n\n    /* Now get ready to map the peripherals block \n     * If we are not root, try for the new /dev/gpiomem interface and accept\n     * the fact that we can only access GPIO\n     * else try for the /dev/mem interface and get access to everything\n     */\n    memfd = -1;\n    ok = 0;\n    if (geteuid() == 0)\n    {\n      /* Open the master /dev/mem device */\n      if ((memfd = rtapi_open_as_root(\"/dev/mem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/mem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      \n      /* Now compute the base addresses of various peripherals, \n      // which are at fixed offsets within the mapped peripherals block\n      // Caution: bcm2835_peripherals is uint32_t*, so divide offsets by 4\n      */\n      bcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n      bcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n      bcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n      bcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n      bcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n      bcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4; /* I2C */\n      bcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4; /* I2C */\n      bcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n      bcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n      bcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n      ok = 1;\n    }\n    else\n    {\n      /* Not root, try /dev/gpiomem */\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/gpiomem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/gpiomem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals_base = 0;\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      bcm2835_gpio = bcm2835_peripherals;\n      ok = 1;\n    }\n\nexit:\n    if (memfd >= 0)\n        close(memfd);\n\n    if (!ok)\n\tbcm2835_close();\n\n    return ok;\n}\n\nvoid update_freq(void *arg, long period)\n{\n\tint i;\n\tdata_t *data = (data_t *)arg;\n\tdouble max_ac, vel_cmd, dv, new_vel, max_freq, desired_freq;\n\t\t   \n\tdouble error, command, feedback;\n\tdouble periodfp, periodrecip;\n\tfloat pgain, ff1gain, deadband;\n\n\t// precalculate timing constants\n    periodfp = period * 0.000000001;\n    periodrecip = 1.0 / periodfp;\n\n    // calc constants related to the period of this function (LinuxCNC SERVO_THREAD)\n    // only recalc constants if period changes\n    if (period != old_dtns) \t\t\t// Note!! period = LinuxCNC SERVO_PERIOD\n\t{\n\t\told_dtns = period;\t\t\t\t// get ready to detect future period changes\n\t\tdt = period * 0.000000001; \t\t// dt is the period of this thread, used for the position loop\n\t\trecip_dt = 1.0 / dt;\t\t\t// calc the reciprocal once here, to avoid multiple divides later\n    }\n\n    // loop through generators\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\t// check for scale change\n\t\tif (data->pos_scale[i] != data->old_scale[i])\n\t\t{\n\t\t\tdata->old_scale[i] = data->pos_scale[i];\t\t// get ready to detect future scale changes\n\t\t\t// scale must not be 0\n\t\t\tif ((data->pos_scale[i] < 1e-20) && (data->pos_scale[i] > -1e-20))\t// validate the new scale value\n\t\t\t\tdata->pos_scale[i] = 1.0;\t\t\t\t\t\t\t\t\t\t// value too small, divide by zero is a bad thing\n\t\t\t\t// we will need the reciprocal, and the accum is fixed point with\n\t\t\t\t//fractional bits, so we precalc some stuff\n\t\t\tdata->scale_recip[i] = (1.0 / STEP_MASK) / data->pos_scale[i];\n\t\t}\n\n\t\t// calculate frequency limit\n\t\t//max_freq = PRU_BASEFREQ/(4.0); \t\t\t//limit of DDS running at 80kHz\n\t\t//max_freq = PRU_BASEFREQ/(2.0); \t\n\t\tmax_freq = PRU_base_freq/(2.0);\n\n\t\t// check for user specified frequency limit parameter\n\t\tif (data->maxvel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxvel[i] = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// parameter is non-zero, compare to max_freq\n\t\t\tdesired_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\n\t\t\tif (desired_freq > max_freq)\n\t\t\t{\n\t\t\t\t// parameter is too high, limit it\n\t\t\t\tdata->maxvel[i] = max_freq / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower max_freq to match parameter\n\t\t\t\tmax_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* set internal accel limit to its absolute max, which is\n\t\tzero to full speed in one thread period */\n\t\tmax_ac = max_freq * recip_dt;\n\t\t\n\t\t// check for user specified accel limit parameter\n\t\tif (data->maxaccel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxaccel[i] = 0.0;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t// parameter is non-zero, compare to max_ac\n\t\t\tif ((data->maxaccel[i] * fabs(data->pos_scale[i])) > max_ac)\n\t\t\t{\n\t\t\t\t// parameter is too high, lower it\n\t\t\t\tdata->maxaccel[i] = max_ac / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower limit to match parameter\n\t\t\t\tmax_ac = data->maxaccel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\n\t\t/* at this point, all scaling, limits, and other parameter\n\t\tchanges have been handled - time for the main control */\n\n\t\t\n\n\t\tif (data->pos_mode[i]) {\n\n\t\t\t/* POSITION CONTROL MODE */\n\n\t\t\t// use Proportional control with feed forward (pgain, ff1gain and deadband)\n\t\t\t\n\t\t\tif (*(data->pgain[i]) != 0)\n\t\t\t{\n\t\t\t\tpgain = *(data->pgain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpgain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->ff1gain[i]) != 0)\n\t\t\t{\n\t\t\t\tff1gain = *(data->ff1gain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tff1gain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->deadband[i]) != 0)\n\t\t\t{\n\t\t\t\tdeadband = *(data->deadband[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdeadband = 1 / data->pos_scale[i];\n\t\t\t}\t\n\n\t\t\t// read the command and feedback\n\t\t\tcommand = *(data->pos_cmd[i]);\n\t\t\tfeedback = *(data->pos_fb[i]);\n\t\t\t\n\t\t\t// calcuate the error\n\t\t\terror = command - feedback;\n\t\t\t\n\t\t\t// apply the deadband\n\t\t\tif (error > deadband)\n\t\t\t{\n\t\t\t\terror -= deadband;\n\t\t\t}\n\t\t\telse if (error < -deadband)\n\t\t\t{\n\t\t\t\terror += deadband;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\terror = 0;\n\t\t\t}\n\t\t\t\n\t\t\t// calcuate command and derivatives\n\t\t\tdata->cmd_d[i] = (command - data->prev_cmd[i]) * periodrecip;\n\t\t\t\n\t\t\t// save old values\n\t\t\tdata->prev_cmd[i] = command;\n\t\t\t\t\n\t\t\t// calculate the output value\n\t\t\tvel_cmd = pgain * error + data->cmd_d[i] * ff1gain;\n\t\t\n\t\t} else {\n\n\t\t\t/* VELOCITY CONTROL MODE */\n\t\t\t\n\t\t\t// calculate velocity command in counts/sec\n\t\t\tvel_cmd = *(data->vel_cmd[i]);\n\t\t}\t\n\t\t\t\n\t\tvel_cmd = vel_cmd * data->pos_scale[i];\n\t\t\t\n\t\t// apply frequency limit\n\t\tif (vel_cmd > max_freq) \n\t\t{\n\t\t\tvel_cmd = max_freq;\n\t\t} \n\t\telse if (vel_cmd < -max_freq) \n\t\t{\n\t\t\tvel_cmd = -max_freq;\n\t\t}\n\t\t\n\t\t// calc max change in frequency in one period\n\t\tdv = max_ac * dt;\n\t\t\n\t\t// apply accel limit\n\t\tif ( vel_cmd > (data->freq[i] + dv) )\n\t\t{\n\t\t\tnew_vel = data->freq[i] + dv;\n\t\t} \n\t\telse if ( vel_cmd < (data->freq[i] - dv) ) \n\t\t{\n\t\t\tnew_vel = data->freq[i] - dv;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnew_vel = vel_cmd;\n\t\t}\n\t\t\n\t\t// test for disabled stepgen\n\t\tif (*data->stepperEnable == 0) {\n\t\t\t// set velocity to zero\n\t\t\tnew_vel = 0; \n\t\t}\n\t\t\n\t\tdata->freq[i] = new_vel;\t\t\t\t// to be sent to the PRU\n\t\t*(data->freq_cmd[i]) = data->freq[i];\t// feedback to LinuxCNC\n\t}\n\n}\n\n\nvoid spi_read()\n{\n\tint i;\n\tdouble curr_pos;\n\n\t// Data header\n\ttxData.header = PRU_READ;\n\t\n\t// update the PRUreset output\n\tif (*(data->PRUreset))\n\t{ \n\t\tbcm2835_gpio_set(reset_gpio_pin);\n    }\n\telse\n\t{\n\t\tbcm2835_gpio_clr(reset_gpio_pin);\n    }\n\t\n\tif (*(data->SPIenable))\n\t{\n\t\tif( (*(data->SPIreset) && !(data->SPIresetOld)) || *(data->SPIstatus) )\n\t\t{\n\t\t\t// reset rising edge detected, try SPI transfer and reset OR PRU running\n\t\t\t\n\t\t\t// Transfer to and from the PRU\n\t\t\tspi_transfer();\n\n\t\t\tswitch (rxData.header)\t\t// only process valid SPI payloads. This rejects bad payloads\n\t\t\t{\n\t\t\t\tcase PRU_DATA:\n\t\t\t\t\t// we have received a GOOD payload from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 1;\n\n\t\t\t\t\tfor (i = 0; i < JOINTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// the PRU DDS accumulator uses 32 bit counter, this code converts that counter into 64 bits */\n\t\t\t\t\t\taccum_diff = rxData.jointFeedback[i] - old_count[i];\n\t\t\t\t\t\told_count[i] = rxData.jointFeedback[i];\n\t\t\t\t\t\taccum[i] += accum_diff;\n\n\t\t\t\t\t\t*(data->count[i]) = accum[i] >> STEPBIT;\n\n\t\t\t\t\t\tdata->scale_recip[i] = (1.0 / STEP_MASK) / data->pos_scale[i];\n\t\t\t\t\t\tcurr_pos = (double)(accum[i]-STEP_OFFSET) * (1.0 / STEP_MASK);\n\t\t\t\t\t\t*(data->pos_fb[i]) = (float)((curr_pos+0.5) / data->pos_scale[i]);\n\t\t\t\t\t}\n\n\t\t\t\t\t// Feedback\n\t\t\t\t\tfor (i = 0; i < VARIABLES; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t*(data->processVariable[i]) = rxData.processVariable[i]; \n\t\t\t\t\t}\n\n\t\t\t\t\t// Inputs\n\t\t\t\t\tfor (i = 0; i < DIGITAL_INPUTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((rxData.inputs & (1 << i)) != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 1; \t\t// input is high\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 0;\t\t\t// input is low\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase PRU_ESTOP:\n\t\t\t\t\t// we have an eStop notification from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 0;\n\t\t\t\t\t rtapi_print_msg(RTAPI_MSG_ERR, \"An E-stop is active\");\n\n\t\t\t\tdefault:\n\t\t\t\t\t// we have received a BAD payload from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 0;\n\n\t\t\t\t\trtapi_print(\"Bad SPI payload = %x\\n\", rxData.header);\n\t\t\t\t\t//for (i = 0; i < SPIBUFSIZE; i++) {\n\t\t\t\t\t//\trtapi_print(\"%d\\n\",rxData.rxBuffer[i]);\n\t\t\t\t\t//}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t*(data->SPIstatus) = 0;\n\t}\n\t\n\tdata->SPIresetOld = *(data->SPIreset);\n}\n\n\nvoid spi_write()\n{\n\tint i;\n\n\t// Data header\n\ttxData.header = PRU_WRITE;\n\n\t// Joint frequency commands\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\ttxData.jointFreqCmd[i] = data->freq[i];\n\t}\n\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\tif (*(data->stepperEnable[i]) == 1)\n\t\t{\n\t\t\ttxData.jointEnable |= (1 << i);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.jointEnable &= ~(1 << i);\t\n\t\t}\n\t}\n\n\t// Set points\n\tfor (i = 0; i < VARIABLES; i++)\n\t{\n\t\ttxData.setPoint[i] = *(data->setPoint[i]);\n\t}\n\n\t// Outputs\n\tfor (i = 0; i < DIGITAL_OUTPUTS; i++)\n\t{\n\t\tif (*(data->outputs[i]) == 1)\n\t\t{\n\t\t\ttxData.outputs |= (1 << i);\t\t// output is high\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.outputs &= ~(1 << i);\t// output is low\n\t\t}\n\t}\n\n\tif( *(data->SPIstatus) )\n\t{\n\t\t// Transfer to and from the PRU\n\t\tspi_transfer();\n\t}\n\n}\n\n\nvoid spi_transfer()\n{\n\t// send and receive data to and from the Remora PRU concurrently\n\n\tif (chip == LPC) \n\t{\n\t\tfor (int i = 0; i < SPIBUFSIZE; i++)\n\t\t{\n\t\t\trxData.rxBuffer[i] = bcm2835_spi_transfer(txData.txBuffer[i]);\n\t\t}\n\t}\n\telse if (chip == STM)\n\t{\n\t\tbcm2835_spi_transfernb(txData.txBuffer, rxData.rxBuffer, SPIBUFSIZE);\n\t}\n}\n\n\nstatic CONTROL parse_ctrl_type(const char *ctrl)\n{\n    if(!ctrl || !*ctrl || *ctrl == 'p' || *ctrl == 'P') return POSITION;\n    if(*ctrl == 'v' || *ctrl == 'V') return VELOCITY;\n    return INVALID;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-eth/remora-eth-3.0.c",
    "content": "/********************************************************************\n* Description:  remora-eth.c\n*               This file, 'remora-eth.c', is a HAL component that\n*               provides an ethernet connection to a external Enthernet\n* \t\t\t \tcontroller running Remora PRU firmware.\n*  \t\t\t\t\n*\n* Author: Scott Alford\n* License: GPL Version 2\n*\n*\t\tCredit to GP Orcullo and PICnc V2 which originally inspired this\n*\t\tand portions of this code is based on stepgen.c by John Kasunich\n*\t\tand hm2_rpspi.c by Matsche\n*\n* Copyright (c) 2023 All rights reserved.\n*\n* Last change:\n********************************************************************/\n\n\n#include \"rtapi.h\"\t\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"hal.h\"\t\t\t/* HAL public API decls */\n\n#include <stdlib.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <math.h>\n#include <sys/socket.h>\n#include <arpa/inet.h>\n#include <netinet/in.h>\n\n\n#include \"remora-eth-3.0.h\"\n\n#define MODNAME \"remora-eth-3.0\"\n#define PREFIX \"remora\"\n\nMODULE_AUTHOR(\"Scott Alford AKA scotta\");\nMODULE_DESCRIPTION(\"Driver for Remora Ethernet capable control board\");\nMODULE_LICENSE(\"GPL v2\");\n\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\ntypedef struct {\n\thal_bit_t\t\t*enable;\n\thal_bit_t\t\t*reset;\n\thal_bit_t\t\t*PRUreset;\n\tbool\t\t\tresetOld;\n\thal_bit_t\t\t*status;\n\thal_bit_t \t\t*stepperEnable[JOINTS];\n\tint\t\t\t\tpos_mode[JOINTS];\n\thal_float_t \t*pos_cmd[JOINTS];\t\t\t// pin: position command (position units)\n\thal_float_t \t*vel_cmd[JOINTS];\t\t\t// pin: velocity command (position units/sec)\n\thal_float_t \t*pos_fb[JOINTS];\t\t\t// pin: position feedback (position units)\n\thal_s32_t\t\t*count[JOINTS];\t\t\t\t// pin: psition feedback (raw counts)\n\thal_float_t \tpos_scale[JOINTS];\t\t\t// param: steps per position unit\n\tfloat \t\t\tfreq[JOINTS];\t\t\t\t// param: frequency command sent to PRU\n\thal_float_t \t*freq_cmd[JOINTS];\t\t\t// pin: frequency command monitoring, available in LinuxCNC\n\thal_float_t \tmaxvel[JOINTS];\t\t\t\t// param: max velocity, (pos units/sec)\n\thal_float_t \tmaxaccel[JOINTS];\t\t\t// param: max accel (pos units/sec^2)\n\thal_float_t\t\t*pgain[JOINTS];\n\thal_float_t\t\t*ff1gain[JOINTS];\n\thal_float_t\t\t*deadband[JOINTS];\n\tfloat \t\t\told_pos_cmd[JOINTS];\t\t// previous position command (counts)\n\tfloat \t\t\told_pos_cmd_raw[JOINTS];\t// previous position command (counts)\n\tfloat \t\t\told_scale[JOINTS];\t\t\t// stored scale value\n\tfloat \t\t\tscale_recip[JOINTS];\t\t// reciprocal value used for scaling\n\tfloat\t\t\tprev_cmd[JOINTS];\n\tfloat\t\t\tcmd_d[JOINTS];\t\t\t\t// command derivative\n\thal_float_t \t*setPoint[VARIABLES];\n\thal_float_t \t*processVariable[VARIABLES];\n\thal_bit_t   \t*outputs[DIGITAL_OUTPUTS];\n\thal_bit_t   \t*inputs[DIGITAL_INPUTS*2];\n\thal_bit_t   \t*NVMPGinputs[NVMPG_INPUTS];\n} data_t;\n\nstatic data_t *data;\n\n\n#pragma pack(push, 1)\n\ntypedef union\n{\n  // this allow structured access to the outgoing data without having to move it\n  // this is the same structure as the Remora rxData structure\n  struct\n  {\n    uint8_t txBuffer[BUFFER_SIZE];\n  };\n  struct\n  {\n\tint32_t header;\n    int32_t jointFreqCmd[JOINTS];\n    float \tsetPoint[VARIABLES];\n\tuint8_t jointEnable;\n\tuint32_t outputs;\n    uint8_t spare0;\n  };\n} txData_t;\n\n\ntypedef union\n{\n  // this allow structured access to the incoming data without having to move it\n  // this is the same structure as the Remora txData structure\n  struct\n  {\n    uint8_t rxBuffer[BUFFER_SIZE];\n  };\n  struct\n  {\n    int32_t header;\n    int32_t jointFeedback[JOINTS];\n    float \tprocessVariable[VARIABLES];\n    uint32_t inputs;\n\tuint16_t NVMPGinputs;\n  };\n} rxData_t;\n\n#pragma pack(pop)\n\nstatic txData_t txData;\nstatic rxData_t rxData;\n\n\n/* other globals */\nstatic int \t\t\tcomp_id;\t\t\t\t// component ID\nstatic const char \t*modname = MODNAME;\nstatic const char \t*prefix = PREFIX;\nstatic int \t\t\tnum_chan = 0;\t\t\t// number of step generators configured\nstatic long \t\told_dtns;\t\t\t\t// update_freq function period in nsec - (THIS IS RUNNING IN THE PI)\nstatic double\t\tdt;\t\t\t\t\t\t// update_freq period in seconds  - (THIS IS RUNNING IN THE PI)\nstatic double \t\trecip_dt;\t\t\t\t// recprocal of period, avoids divides\n\nstatic int32_t \t\tcount[JOINTS] = { 0 };\nstatic int32_t \t\told_count[JOINTS] = { 0 };\nstatic int32_t \t\tfilter_count[JOINTS] = { 0 };\nstatic int32_t\t\taccum_diff = 0;\n\nstatic int \t\t\treset_gpio_pin = 25;\t\t\t\t// debug pin\n\ntypedef enum CONTROL { POSITION, VELOCITY, INVALID } CONTROL;\nchar *ctrl_type[JOINTS] = { \"p\" };\nRTAPI_MP_ARRAY_STRING(ctrl_type,JOINTS,\"control type (pos or vel)\");\n\nint PRU_base_freq = -1;\nRTAPI_MP_INT(PRU_base_freq, \"PRU base thread frequency\");\n\n#define DST_PORT 27181\n#define SRC_PORT 27181\n#define SEND_TIMEOUT_US 10\n#define RECV_TIMEOUT_US 10\n#define READ_PCK_DELAY_NS 10000\n\nstatic int udpSocket;\nstatic int errCount;\nstruct sockaddr_in dstAddr, srcAddr;\nstruct hostent *server;\nstatic const char *dstAddress = \"10.10.10.10\";\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\n\nstatic int UDP_init(void);\n\nstatic void update_freq(void *arg, long period);\nstatic void pru_write();\nstatic void pru_read();\nstatic void pru_transfer(int txSize, int rxSize);\nstatic CONTROL parse_ctrl_type(const char *ctrl);\n\n\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\nint rtapi_app_main(void)\n{\n    char name[HAL_NAME_LEN + 1];\n\tint n, retval;\n\n\t// parse stepgen control type\n\tfor (n = 0; n < JOINTS; n++) {\n\t\tif(parse_ctrl_type(ctrl_type[n]) == INVALID) {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\t\t\"STEPGEN: ERROR: bad control type '%s' for axis %i (must be 'p' or 'v')\\n\",\n\t\t\t\t\tctrl_type[n], n);\n\t\t\treturn -1;\n\t\t}\n    }\n\t\n\n\t// check to see if the PRU base frequency has been set at the command line\n\tif (PRU_base_freq != -1)\n\t{\n\t\tif ((PRU_base_freq < 40000) || (PRU_base_freq > 500000))\n\t\t{\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"ERROR: PRU base frequency incorrect\\n\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tPRU_base_freq = PRU_BASEFREQ;\n\t}\n\t\n\n    // connect to the HAL, initialise the driver\n    comp_id = hal_init(modname);\n    if (comp_id < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"%s ERROR: hal_init() failed \\n\", modname);\n\t\treturn -1;\n    }\n\n\t// allocate shared memory\n\tdata = hal_malloc(sizeof(data_t));\n\tif (data == 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\"%s: ERROR: hal_malloc() failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\t\n\t// Initialize the UDP socket\n\tif (UDP_init() < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Error: The board is unreachable\\n\");\n\t\treturn -1;\n\t}\n\n\t// export spiPRU SPI enable and status bits\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->enable),\n\t\t\tcomp_id, \"%s.enable\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->reset),\n\t\t\tcomp_id, \"%s.reset\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->status),\n\t\t\tcomp_id, \"%s.status\", prefix);\n\tif (retval != 0) goto error;\n\n\n\n    // export all the variables for each joint\n    for (n = 0; n < JOINTS; n++) {\n\t\t// export pins\n\n\t\tdata->pos_mode[n] = (parse_ctrl_type(ctrl_type[n]) == POSITION);\n/*\nThis is throwing errors from axis.py for some reason...\n\t\t\n\t\tif (data->pos_mode[n]){\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating pos_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t} else {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating vel_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n*/\n\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->stepperEnable[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.enable\", prefix, n);\n\t\tif (retval != 0) goto error;\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t\n\t\tif (data->pos_mode[n] == 0){\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->freq_cmd[n]),\n\t\t        comp_id, \"%s.joint.%01d.freq-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->freq_cmd[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->pos_fb[n]),\n\t\t        comp_id, \"%s.joint.%01d.pos-fb\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_fb[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->pos_scale[n]),\n\t\t        comp_id, \"%s.joint.%01d.scale\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->pos_scale[n] = 1.0;\n\n\t\tretval = hal_pin_s32_newf(HAL_OUT, &(data->count[n]),\n\t\t        comp_id, \"%s.joint.%01d.counts\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->count[n]) = 0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pgain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pgain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pgain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->ff1gain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.ff1gain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->ff1gain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->deadband[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.deadband\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->deadband[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->maxaccel[n]),\n\t\t        comp_id, \"%s.joint.%01d.maxaccel\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->maxaccel[n] = 1.0;\n\t}\n\n\tfor (n = 0; n < VARIABLES; n++) {\n\t// export pins\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->setPoint[n]),\n\t\t        comp_id, \"%s.SP.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->setPoint[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->processVariable[n]),\n\t\t        comp_id, \"%s.PV.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->processVariable[n]) = 0.0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_OUTPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->outputs[n]),\n\t\t\t\tcomp_id, \"%s.output.%02d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->outputs[n])=0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_INPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->inputs[n]),\n\t\t\t\tcomp_id, \"%s.input.%02d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->inputs[n])=0;\n\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->inputs[n+DIGITAL_INPUTS]),\n\t\t\t\tcomp_id, \"%s.input.%02d.not\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->inputs[n+DIGITAL_INPUTS])=1;\n\n\t}\n\t\n\tfor (n = 0; n < NVMPG_INPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->NVMPGinputs[n]),\n\t\t\t\tcomp_id, \"%s.NVMPGinput.%01d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->NVMPGinputs[n])=0;\n\t}\n\n\terror:\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: pin export failed with err=%i\\n\",\n\t\t        modname, retval);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\n\t// Export functions\n\trtapi_snprintf(name, sizeof(name), \"%s.update-freq\", prefix);\n\tretval = hal_export_funct(name, update_freq, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: update function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.write\", prefix);\n\t/* no FP operations */\n\tretval = hal_export_funct(name, pru_write, 0, 0, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: write function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.read\", prefix);\n\tretval = hal_export_funct(name, pru_read, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: read function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_print_msg(RTAPI_MSG_INFO, \"%s: installed driver\\n\", modname);\n\thal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n\tint ret = shutdown(udpSocket, SHUT_RDWR);\n\tif (ret < 0)\n      rtapi_print(\"ERROR: can't close socket: %s\\n\", strerror(errno));\n\t\n    hal_exit(comp_id);\n}\n\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\nint UDP_init(void)\n{\n\tint ret;\n\n\t// Create a UDP socket\n\tudpSocket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);\n\tif (udpSocket < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't open socket: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\n\tbzero((char*) &dstAddr, sizeof(dstAddr));\n\tdstAddr.sin_family = AF_INET;\n\tdstAddr.sin_addr.s_addr = inet_addr(dstAddress);\n\tdstAddr.sin_port = htons(DST_PORT);\n\n\tbzero((char*) &srcAddr, sizeof(srcAddr));\n\tsrcAddr.sin_family = AF_INET;\n\tsrcAddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tsrcAddr.sin_port = htons(SRC_PORT);\n\t\n\t// bind the local socket to SCR_PORT\n\tret = bind(udpSocket, (struct sockaddr *) &srcAddr, sizeof(srcAddr));\n\tif (ret < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't bind: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\t\n\t// Connect to send and receive only to the server_addr\n\tret = connect(udpSocket, (struct sockaddr*) &dstAddr, sizeof(struct sockaddr_in));\n\tif (ret < 0)\n\t{\n\t\trtapi_print(\"ERROR: can't connect: %s\\n\", strerror(errno));\n\t\treturn -errno;\n\t}\n\n\tstruct timeval timeout;\n\ttimeout.tv_sec = 0;\n\ttimeout.tv_usec = RECV_TIMEOUT_US;\n\n\tret = setsockopt(udpSocket, SOL_SOCKET, SO_RCVTIMEO, (char*) &timeout, sizeof(timeout));\n\tif (ret < 0) {\n\trtapi_print(\"ERROR: can't set receive timeout socket option: %s\\n\",\n\t\tstrerror(errno));\n\treturn -errno;\n\t}\n\n\ttimeout.tv_usec = SEND_TIMEOUT_US;\n\tret = setsockopt(udpSocket, SOL_SOCKET, SO_SNDTIMEO, (char*) &timeout,\n\t  sizeof(timeout));\n\tif (ret < 0) {\n\trtapi_print(\"ERROR: can't set send timeout socket option: %s\\n\",\n\t\tstrerror(errno));\n\treturn -errno;\n\t}\n\n\treturn 0;\n}\n\nvoid update_freq(void *arg, long period)\n{\n\tint i;\n\tdata_t *data = (data_t *)arg;\n\tdouble max_ac, vel_cmd, dv, new_vel, max_freq, desired_freq;\n\t\t   \n\tdouble error, command, feedback;\n\tdouble periodfp, periodrecip;\n\tfloat pgain, ff1gain, deadband;\n\n\t// precalculate timing constants\n    periodfp = period * 0.000000001;\n    periodrecip = 1.0 / periodfp;\n\n    // calc constants related to the period of this function (LinuxCNC SERVO_THREAD)\n    // only recalc constants if period changes\n    if (period != old_dtns) \t\t\t// Note!! period = LinuxCNC SERVO_PERIOD\n\t{\n\t\told_dtns = period;\t\t\t\t// get ready to detect future period changes\n\t\tdt = period * 0.000000001; \t\t// dt is the period of this thread, used for the position loop\n\t\trecip_dt = 1.0 / dt;\t\t\t// calc the reciprocal once here, to avoid multiple divides later\n    }\n\n    // loop through generators\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\t// check for scale change\n\t\tif (data->pos_scale[i] != data->old_scale[i])\n\t\t{\n\t\t\tdata->old_scale[i] = data->pos_scale[i];\t\t// get ready to detect future scale changes\n\t\t\t// scale must not be 0\n\t\t\tif ((data->pos_scale[i] < 1e-20) && (data->pos_scale[i] > -1e-20))\t// validate the new scale value\n\t\t\t\tdata->pos_scale[i] = 1.0;\t\t\t\t\t\t\t\t\t\t// value too small, divide by zero is a bad thing\n\t\t\t\t// we will need the reciprocal, and the accum is fixed point with\n\t\t\t\t//fractional bits, so we precalc some stuff\n\t\t\tdata->scale_recip[i] = (1.0 / STEP_MASK) / data->pos_scale[i];\n\t\t}\n\n\t\t// calculate frequency limit\n\t\tmax_freq = PRU_base_freq;\n\n\t\t// check for user specified frequency limit parameter\n\t\tif (data->maxvel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxvel[i] = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// parameter is non-zero, compare to max_freq\n\t\t\tdesired_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\n\t\t\tif (desired_freq > max_freq)\n\t\t\t{\n\t\t\t\t// parameter is too high, limit it\n\t\t\t\tdata->maxvel[i] = max_freq / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower max_freq to match parameter\n\t\t\t\tmax_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* set internal accel limit to its absolute max, which is\n\t\tzero to full speed in one thread period */\n\t\tmax_ac = max_freq * recip_dt;\n\t\t\n\t\t// check for user specified accel limit parameter\n\t\tif (data->maxaccel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxaccel[i] = 0.0;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t// parameter is non-zero, compare to max_ac\n\t\t\tif ((data->maxaccel[i] * fabs(data->pos_scale[i])) > max_ac)\n\t\t\t{\n\t\t\t\t// parameter is too high, lower it\n\t\t\t\tdata->maxaccel[i] = max_ac / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower limit to match parameter\n\t\t\t\tmax_ac = data->maxaccel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\n\t\t/* at this point, all scaling, limits, and other parameter\n\t\tchanges have been handled - time for the main control */\n\n\t\t\n\n\t\tif (data->pos_mode[i]) {\n\n\t\t\t/* POSITION CONTROL MODE */\n\n\t\t\t// use Proportional control with feed forward (pgain, ff1gain and deadband)\n\t\t\t\n\t\t\tif (*(data->pgain[i]) != 0)\n\t\t\t{\n\t\t\t\tpgain = *(data->pgain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpgain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->ff1gain[i]) != 0)\n\t\t\t{\n\t\t\t\tff1gain = *(data->ff1gain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tff1gain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->deadband[i]) != 0)\n\t\t\t{\n\t\t\t\tdeadband = *(data->deadband[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdeadband = fabs(1/data->pos_scale[i]);\n\t\t\t}\t\n\t\t\t\n\t\t\t// read the command and feedback\n\t\t\tcommand = *(data->pos_cmd[i]);\n\t\t\tfeedback = *(data->pos_fb[i]);\n\t\t\t\n\t\t\t// calcuate the error\n\t\t\terror = command - feedback;\n\t\t\t\n\t\t\t// apply the deadband\n\t\t\tif (error > deadband)\n\t\t\t{\n\t\t\t\terror -= deadband;\n\t\t\t}\n\t\t\telse if (error < -deadband)\n\t\t\t{\n\t\t\t\terror += deadband;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\terror = 0;\n\t\t\t}\n\t\t\t\n\t\t\t// calcuate command and derivatives\n\t\t\tdata->cmd_d[i] = (command - data->prev_cmd[i]) * periodrecip;\n\t\t\t\n\t\t\t// save old values\n\t\t\tdata->prev_cmd[i] = command;\n\t\t\t\t\n\t\t\t// calculate the output value\n\t\t\tvel_cmd = pgain * error + data->cmd_d[i] * ff1gain;\n\t\t\n\t\t} else {\n\n\t\t\t/* VELOCITY CONTROL MODE */\n\t\t\t\n\t\t\t// calculate velocity command in counts/sec\n\t\t\tvel_cmd = *(data->vel_cmd[i]);\n\t\t}\t\n\t\t\t\n\t\tvel_cmd = vel_cmd * data->pos_scale[i];\n\t\t\t\n\t\t// apply frequency limit\n\t\tif (vel_cmd > max_freq) \n\t\t{\n\t\t\tvel_cmd = max_freq;\n\t\t} \n\t\telse if (vel_cmd < -max_freq) \n\t\t{\n\t\t\tvel_cmd = -max_freq;\n\t\t}\n\t\t\n\t\t// calc max change in frequency in one period\n\t\tdv = max_ac * dt;\n\t\t\n\t\t// apply accel limit\n\t\tif ( vel_cmd > (data->freq[i] + dv) )\n\t\t{\n\t\t\tnew_vel = data->freq[i] + dv;\n\t\t} \n\t\telse if ( vel_cmd < (data->freq[i] - dv) ) \n\t\t{\n\t\t\tnew_vel = data->freq[i] - dv;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnew_vel = vel_cmd;\n\t\t}\n\t\t\n\t\t// test for disabled stepgen\n\t\tif (*data->stepperEnable == 0) {\n\t\t\t// set velocity to zero\n\t\t\tnew_vel = 0; \n\t\t}\n\t\t\n\t\tdata->freq[i] = new_vel;\t\t\t\t// to be sent to the PRU\n\t\t*(data->freq_cmd[i]) = data->freq[i];\t// feedback to LinuxCNC\n\t}\n\n}\n\n\nvoid pru_read()\n{\n\tint i, ret;\n\tdouble curr_pos;\n\t\n\t// following error spike filter parameters\n\tint n = 2;\n\tint M = 250;\n\n\t// Data header\n\ttxData.header = PRU_READ;\n\t\n\tif (*(data->enable))\n\t{\n\t\tif( (*(data->reset) && !(data->resetOld)) || *(data->status) )\n\t\t{\n\t\t\t// reset rising edge detected, try transfer and reset OR PRU running\n\t\t\t\n\t\t\t// Transfer to and from the PRU\n\t\t\tpru_transfer(sizeof(txData.header), BUFFER_SIZE);\n\t\t\t\n\t\t\tswitch (rxData.header)\t\t// only process valid SPI payloads. This rejects bad payloads\n\t\t\t{\n\t\t\t\tcase PRU_DATA:\n\t\t\t\t\t// we have received a GOOD payload from the PRU\n\t\t\t\t\t*(data->status) = 1;\n\n\t\t\t\t\tfor (i = 0; i < JOINTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\told_count[i] = count[i];\n\t\t\t\t\t\tcount[i] = rxData.jointFeedback[i];\n\t\t\t\t\t\taccum_diff = count[i] - old_count[i];\n\t\t\t\t\t\t\n\t\t\t\t\t\t// spike filter\n\t\t\t\t\t\tif (abs(count[i] - old_count[i]) > M && filter_count[i] < n)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// recent big change: hold previous value\n\t\t\t\t\t\t\t++filter_count[i];\n\t\t\t\t\t\t\tcount[i] = old_count[i];\n\t\t\t\t\t\t\trtapi_print(\"Spike filter active[%d][%d]: %d\\n\", i, filter_count[i], accum_diff);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// normal operation, or the big change must be real after all\n\t\t\t\t\t\t\tfilter_count[i] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t*(data->count[i]) = count[i];\n\t\t\t\t\t\t*(data->pos_fb[i]) = (float)(count[i]) / data->pos_scale[i];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Feedback\n\t\t\t\t\tfor (i = 0; i < VARIABLES; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t*(data->processVariable[i]) = rxData.processVariable[i]; \n\t\t\t\t\t}\n\n\t\t\t\t\t// Inputs\n\t\t\t\t\tfor (i = 0; i < DIGITAL_INPUTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((rxData.inputs & (1 << i)) != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 1; \t\t// input is high\n\t\t\t\t\t\t\t*(data->inputs[i+DIGITAL_INPUTS]) = 0; \t\t// inverted\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 0;\t\t\t// input is low\n\t\t\t\t\t\t\t*(data->inputs[i+DIGITAL_INPUTS]) = 1; \t\t// inverted\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// NVMPG Inputs\n\t\t\t\t\tfor (i = 0; i < NVMPG_INPUTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((rxData.NVMPGinputs & (1 << i)) != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->NVMPGinputs[i]) = 1; \t\t// input is high\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->NVMPGinputs[i]) = 0;\t\t\t// input is low\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase PRU_ACKNOWLEDGE:\n\t\t\t\t\t// we've dropped a packet somewhere but comms are still up\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase PRU_ERR:\n\t\t\t\t\t// we've dropped a packet somewhere but comms are still up\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase PRU_ESTOP:\n\t\t\t\t\t// we have an eStop notification from the PRU\n\t\t\t\t\t*(data->status) = 0;\n\t\t\t\t\t rtapi_print_msg(RTAPI_MSG_ERR, \"An E-stop is active\");\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// we have received a BAD payload from the PRU\n\t\t\t\t\t*(data->status) = 0;\n\t\t\t\t\trtapi_print(\"Bad payload = %x\\n\", rxData.header);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t*(data->status) = 0;\n\t}\n\t\n\tdata->resetOld = *(data->reset);\n}\n\n\nvoid pru_write()\n{\n\tint i, ret;\n\n\t// Data header\n\ttxData.header = PRU_WRITE;\n\n\t// Joint frequency commands\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\ttxData.jointFreqCmd[i] = data->freq[i];\n\t}\n\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\tif (*(data->stepperEnable[i]) == 1)\n\t\t{\n\t\t\ttxData.jointEnable |= (1 << i);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.jointEnable &= ~(1 << i);\t\n\t\t}\n\t}\n\n\t// Set points\n\tfor (i = 0; i < VARIABLES; i++)\n\t{\n\t\ttxData.setPoint[i] = *(data->setPoint[i]);\n\t}\n\n\t// Outputs\n\tfor (i = 0; i < DIGITAL_OUTPUTS; i++)\n\t{\n\t\tif (*(data->outputs[i]) == 1)\n\t\t{\n\t\t\ttxData.outputs |= (1 << i);\t\t// output is high\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.outputs &= ~(1 << i);\t// output is low\n\t\t}\n\t}\n\n\tif( *(data->status) )\n\t{\n\t\t// Transfer to and from the PRU\n\t\tpru_transfer(BUFFER_SIZE, sizeof(rxData.header));\n\t\t\n\t\tswitch (rxData.header)\n\t\t{\n\t\t\tcase PRU_DATA:\n\t\t\t\t// we've dropped a packet somewhere but comms are still up\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase PRU_ACKNOWLEDGE:\n\t\t\t\t// this is the response we expect\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase PRU_ERR:\n\t\t\t\t// there was a write error\n\t\t\t\trtapi_print(\"Data write error: %x\\n\",rxData.header);\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase PRU_ESTOP:\n\t\t\t\t// we have an eStop notification from the PRU\n\t\t\t\t*(data->status) = 0;\n\t\t\t\t rtapi_print_msg(RTAPI_MSG_ERR, \"An E-stop is active\");\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// we have received a BAD payload from the PRU\n\t\t\t\t*(data->status) = 0;\n\t\t\t\trtapi_print(\"Bad payload = %x\\n\", rxData.header);\n\t\t\t\tbreak;\n\t\t}\t\n\t}\n}\n\n\nvoid pru_transfer(int txSize, int rxSize)\n{\n\tint ret;\n\tlong long t1, t2;\n\n\t// Send datagram\n\tret = send(udpSocket, txData.txBuffer, txSize, 0);\n\n\t// Receive incoming datagram\n    t1 = rtapi_get_time();\n    do {\n        ret = recv(udpSocket, rxData.rxBuffer, rxSize, 0);\n        if(ret < 0) rtapi_delay(READ_PCK_DELAY_NS);\n        t2 = rtapi_get_time();\n    } while ((ret < 0) && ((t2 - t1) < 200*1000*1000));\n\n\tif (ret > 0)\n\t{\n\t\terrCount = 0;\n\t}\n\telse\n\t{\n\t\terrCount++;\n\t}\n\t\n\tif (errCount > 2)\n\t{\n\t\t*(data->status) = 0;\n\t\trtapi_print(\"Ethernet ERROR: %s\\n\", strerror(errno));\n\t}\n}\n\n\nstatic CONTROL parse_ctrl_type(const char *ctrl)\n{\n    if(!ctrl || !*ctrl || *ctrl == 'p' || *ctrl == 'P') return POSITION;\n    if(*ctrl == 'v' || *ctrl == 'V') return VELOCITY;\n    return INVALID;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-eth/remora-eth-3.0.h",
    "content": "\n#ifndef REMORA_H\n#define REMORA_H\n\n\n#define JOINTS\t\t\t\t6  \t\t\t// Number of joints - set this the same as Remora firmware code!!!. Max 8 joints\n#define VARIABLES          \t4 \t\t\t// Number of command values - set this the same Remora firmware code!!!\n#define DIGITAL_OUTPUTS\t\t16\n#define DIGITAL_INPUTS\t\t32\n#define NVMPG_INPUTS\t\t10\n\n#define BUFFER_SIZE\t\t\t64 \t\t\t\n\n#define PRU_DATA\t\t\t0x64617461 \t// \"data\" payload\n#define PRU_READ          \t0x72656164  // \"read\" payload\n#define PRU_WRITE         \t0x77726974  // \"writ\" payload\n#define PRU_ACKNOWLEDGE\t\t0x61636b6e\t// \"ackn\" payload\n#define PRU_ERR\t\t        0x6572726f\t// \"erro\" payload\n#define PRU_ESTOP           0x65737470  // \"estp\" payload\n\n#define STEPBIT\t\t\t\t22\t\t\t// bit location in DDS accum\n#define STEP_MASK\t\t\t(1L<<STEPBIT)\n#define STEP_OFFSET\t\t\t(1L<<(STEPBIT-1))\n\n#define PRU_BASEFREQ\t\t40000 \t\t// Base freq of the PRU stepgen in Hz\n\n\n\n#endif\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/bcm2835.c",
    "content": "/* bcm2835.c\n// C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi\n// http://elinux.org/RPi_Low-level_peripherals\n// http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf\n//\n// Author: Mike McCauley\n// Copyright (C) 2011-2013 Mike McCauley\n// $Id: bcm2835.c,v 1.28 2020/01/11 05:07:13 mikem Exp mikem $\n*/\n#include <stdlib.h>\n#include <stdio.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <string.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/types.h>\n\n#define BCK2835_LIBRARY_BUILD\n#include \"bcm2835.h\"\n\n/* This define enables a little test program (by default a blinking output on pin RPI_GPIO_PIN_11)\n// You can do some safe, non-destructive testing on any platform with:\n// gcc bcm2835.c -D BCM2835_TEST\n// ./a.out\n*/\n/*#define BCM2835_TEST*/\n\n/* Uncommenting this define compiles alternative I2C code for the version 1 RPi\n// The P1 header I2C pins are connected to SDA0 and SCL0 on V1.\n// By default I2C code is generated for the V2 RPi which has SDA1 and SCL1 connected.\n*/\n/* #define I2C_V1*/\n\n/* Physical address and size of the peripherals block\n// May be overridden on RPi2\n*/\noff_t bcm2835_peripherals_base = BCM2835_PERI_BASE;\nsize_t bcm2835_peripherals_size = BCM2835_PERI_SIZE;\n\n/* Virtual memory address of the mapped peripherals block \n */\nuint32_t *bcm2835_peripherals = (uint32_t *)MAP_FAILED;\n\n/* And the register bases within the peripherals block\n */\nvolatile uint32_t *bcm2835_gpio        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_pwm         = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_clk         = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_pads        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_spi0        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_bsc0        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_bsc1        = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_st\t       = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_aux\t       = (uint32_t *)MAP_FAILED;\nvolatile uint32_t *bcm2835_spi1        = (uint32_t *)MAP_FAILED;\n\n\n\n/* This variable allows us to test on hardware other than RPi.\n// It prevents access to the kernel memory, and does not do any peripheral access\n// Instead it prints out what it _would_ do if debug were 0\n */\nstatic uint8_t debug = 0;\n\n/* RPI 4 has different pullup registers - we need to know if we have that type */\n\nstatic uint8_t pud_type_rpi4 = 0;\n\n/* RPI 4 has different pullup operation - make backwards compat */\n\nstatic uint8_t pud_compat_setting = BCM2835_GPIO_PUD_OFF;\n\n/* I2C The time needed to transmit one byte. In microseconds.\n */\nstatic int i2c_byte_wait_us = 0;\n\n/* SPI bit order. BCM2835 SPI0 only supports MSBFIRST, so we instead \n * have a software based bit reversal, based on a contribution by Damiano Benedetti\n */\nstatic uint8_t bcm2835_spi_bit_order = BCM2835_SPI_BIT_ORDER_MSBFIRST;\nstatic uint8_t bcm2835_byte_reverse_table[] = \n{\n    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,\n    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,\n    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,\n    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,\n    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,\n    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,\n    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,\n    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,\n    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,\n    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,\n    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,\n    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,\n    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,\n    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,\n    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,\n    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,\n    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,\n    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,\n    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,\n    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,\n    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,\n    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,\n    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,\n    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,\n    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,\n    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,\n    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,\n    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,\n    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,\n    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,\n    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,\n    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff\n};\n\nstatic uint8_t bcm2835_correct_order(uint8_t b)\n{\n    if (bcm2835_spi_bit_order == BCM2835_SPI_BIT_ORDER_LSBFIRST)\n\treturn bcm2835_byte_reverse_table[b];\n    else\n\treturn b;\n}\n\n#ifdef BCM2835_HAVE_LIBCAP\n#include <sys/capability.h>\nstatic int bcm2835_has_capability(cap_value_t capability)\n{\n    int ok = 0;\n    cap_t cap = cap_get_proc();\n    if (cap)\n    {\n        cap_flag_value_t value;\n        if (cap_get_flag(cap,capability,CAP_EFFECTIVE,&value) == 0 && value == CAP_SET)\n            ok = 1;\n       cap_free(cap);\n    }\n    return ok;\n}\n#endif\n\n/*\n// Low level register access functions\n*/\n\n/* Function to return the pointers to the hardware register bases */\nuint32_t* bcm2835_regbase(uint8_t regbase)\n{\n    switch (regbase)\n    {\n\tcase BCM2835_REGBASE_ST:\n\t    return (uint32_t *)bcm2835_st;\n\tcase BCM2835_REGBASE_GPIO:\n\t    return (uint32_t *)bcm2835_gpio;\n\tcase BCM2835_REGBASE_PWM:\n\t    return (uint32_t *)bcm2835_pwm;\n\tcase BCM2835_REGBASE_CLK:\n\t    return (uint32_t *)bcm2835_clk;\n\tcase BCM2835_REGBASE_PADS:\n\t    return (uint32_t *)bcm2835_pads;\n\tcase BCM2835_REGBASE_SPI0:\n\t    return (uint32_t *)bcm2835_spi0;\n\tcase BCM2835_REGBASE_BSC0:\n\t    return (uint32_t *)bcm2835_bsc0;\n\tcase BCM2835_REGBASE_BSC1:\n\t    return (uint32_t *)bcm2835_st;\n\tcase BCM2835_REGBASE_AUX:\n\t    return (uint32_t *)bcm2835_aux;\n\tcase BCM2835_REGBASE_SPI1:\n\t    return (uint32_t *)bcm2835_spi1;\n\n    }\n    return (uint32_t *)MAP_FAILED;\n}\n\nvoid  bcm2835_set_debug(uint8_t d)\n{\n    debug = d;\n}\n\nunsigned int bcm2835_version(void) \n{\n    return BCM2835_VERSION;\n}\n\n/* Read with memory barriers from peripheral\n *\n */\nuint32_t bcm2835_peri_read(volatile uint32_t* paddr)\n{\n    uint32_t ret;\n    if (debug)\n    {\n\t\tprintf(\"bcm2835_peri_read  paddr %p\\n\", (void *) paddr);\n\t\treturn 0;\n    }\n    else\n    {\n       __sync_synchronize();\n       ret = *paddr;\n       __sync_synchronize();\n       return ret;\n    }\n}\n\n/* read from peripheral without the read barrier\n * This can only be used if more reads to THE SAME peripheral\n * will follow.  The sequence must terminate with memory barrier\n * before any read or write to another peripheral can occur.\n * The MB can be explicit, or one of the barrier read/write calls.\n */\nuint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_read_nb  paddr %p\\n\", paddr);\n\treturn 0;\n    }\n    else\n    {\n\treturn *paddr;\n    }\n}\n\n/* Write with memory barriers to peripheral\n */\n\nvoid bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_write paddr %p, value %08X\\n\", paddr, value);\n    }\n    else\n    {\n        __sync_synchronize();\n        *paddr = value;\n        __sync_synchronize();\n    }\n}\n\n/* write to peripheral without the write barrier */\nvoid bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value)\n{\n    if (debug)\n    {\n\tprintf(\"bcm2835_peri_write_nb paddr %p, value %08X\\n\",\n                paddr, value);\n    }\n    else\n    {\n\t*paddr = value;\n    }\n}\n\n/* Set/clear only the bits in value covered by the mask\n * This is not atomic - can be interrupted.\n */\nvoid bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask)\n{\n    uint32_t v = bcm2835_peri_read(paddr);\n    v = (v & ~mask) | (value & mask);\n    bcm2835_peri_write(paddr, v);\n}\n\n/*\n// Low level convenience functions\n*/\n\n/* Function select\n// pin is a BCM2835 GPIO pin number NOT RPi pin number\n//      There are 6 control registers, each control the functions of a block\n//      of 10 pins.\n//      Each control register has 10 sets of 3 bits per GPIO pin:\n//\n//      000 = GPIO Pin X is an input\n//      001 = GPIO Pin X is an output\n//      100 = GPIO Pin X takes alternate function 0\n//      101 = GPIO Pin X takes alternate function 1\n//      110 = GPIO Pin X takes alternate function 2\n//      111 = GPIO Pin X takes alternate function 3\n//      011 = GPIO Pin X takes alternate function 4\n//      010 = GPIO Pin X takes alternate function 5\n//\n// So the 3 bits for port X are:\n//      X / 10 + ((X % 10) * 3)\n*/\nvoid bcm2835_gpio_fsel(uint8_t pin, uint8_t mode)\n{\n    /* Function selects are 10 pins per 32 bit word, 3 bits per pin */\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFSEL0/4 + (pin/10);\n    uint8_t   shift = (pin % 10) * 3;\n    uint32_t  mask = BCM2835_GPIO_FSEL_MASK << shift;\n    uint32_t  value = mode << shift;\n    bcm2835_peri_set_bits(paddr, value, mask);\n}\n\n/* Set output pin */\nvoid bcm2835_gpio_set(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPSET0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, 1 << shift);\n}\n\n/* Clear output pin */\nvoid bcm2835_gpio_clr(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPCLR0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, 1 << shift);\n}\n\n/* Set all output pins in the mask */\nvoid bcm2835_gpio_set_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPSET0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Clear all output pins in the mask */\nvoid bcm2835_gpio_clr_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPCLR0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Read input pin */\nuint8_t bcm2835_gpio_lev(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEV0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & (1 << shift)) ? HIGH : LOW;\n}\n\n/* See if an event detection bit is set\n// Sigh cant support interrupts yet\n*/\nuint8_t bcm2835_gpio_eds(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & (1 << shift)) ? HIGH : LOW;\n}\n\nuint32_t bcm2835_gpio_eds_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4;\n    uint32_t value = bcm2835_peri_read(paddr);\n    return (value & mask);\n}\n\n/* Write a 1 to clear the bit in EDS */\nvoid bcm2835_gpio_set_eds(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_write(paddr, value);\n}\n\nvoid bcm2835_gpio_set_eds_multi(uint32_t mask)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPEDS0/4;\n    bcm2835_peri_write(paddr, mask);\n}\n\n/* Rising edge detect enable */\nvoid bcm2835_gpio_ren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_ren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Falling edge detect enable */\nvoid bcm2835_gpio_fen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_fen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* High detect enable */\nvoid bcm2835_gpio_hen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPHEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_hen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPHEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Low detect enable */\nvoid bcm2835_gpio_len(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_len(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPLEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Async rising edge detect enable */\nvoid bcm2835_gpio_aren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_aren(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAREN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Async falling edge detect enable */\nvoid bcm2835_gpio_afen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, value, value);\n}\nvoid bcm2835_gpio_clr_afen(uint8_t pin)\n{\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPAFEN0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    uint32_t value = 1 << shift;\n    bcm2835_peri_set_bits(paddr, 0, value);\n}\n\n/* Set pullup/down */\nvoid bcm2835_gpio_pud(uint8_t pud)\n{\n    if( pud_type_rpi4 )\n    {\n        pud_compat_setting = pud;\n    }\n    else {\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUD/4;\n    bcm2835_peri_write(paddr, pud);\n}\n}\n\n/* Pullup/down clock\n// Clocks the value of pud into the GPIO pin\n*/\nvoid bcm2835_gpio_pudclk(uint8_t pin, uint8_t on)\n{\n    if( pud_type_rpi4 )\n    {\n        if( on )\n            bcm2835_gpio_set_pud( pin, pud_compat_setting);\n    }\n    else\n    {\n    volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUDCLK0/4 + pin/32;\n    uint8_t shift = pin % 32;\n    bcm2835_peri_write(paddr, (on ? 1 : 0) << shift);\n}\n}\n\n/* Read GPIO pad behaviour for groups of GPIOs */\nuint32_t bcm2835_gpio_pad(uint8_t group)\n{\n  if (bcm2835_pads == MAP_FAILED)\n    return 0;\n  \n    volatile uint32_t* paddr = bcm2835_pads + BCM2835_PADS_GPIO_0_27/4 + group;\n    return bcm2835_peri_read(paddr);\n}\n\n/* Set GPIO pad behaviour for groups of GPIOs\n// powerup value for all pads is\n// BCM2835_PAD_SLEW_RATE_UNLIMITED | BCM2835_PAD_HYSTERESIS_ENABLED | BCM2835_PAD_DRIVE_8mA\n*/\nvoid bcm2835_gpio_set_pad(uint8_t group, uint32_t control)\n{\n  if (bcm2835_pads == MAP_FAILED)\n    return;\n  \n    volatile uint32_t* paddr = bcm2835_pads + BCM2835_PADS_GPIO_0_27/4 + group;\n    bcm2835_peri_write(paddr, control | BCM2835_PAD_PASSWRD);\n}\n\n/* Some convenient arduino-like functions\n// milliseconds\n*/\nvoid bcm2835_delay(unsigned int millis)\n{\n    struct timespec sleeper;\n    \n    sleeper.tv_sec  = (time_t)(millis / 1000);\n    sleeper.tv_nsec = (long)(millis % 1000) * 1000000;\n    nanosleep(&sleeper, NULL);\n}\n\n/* microseconds */\nvoid bcm2835_delayMicroseconds(uint64_t micros)\n{\n    struct timespec t1;\n    uint64_t        start;\n\t\n    if (debug)\n    {\n\t/* Cant access sytem timers in debug mode */\n\tprintf(\"bcm2835_delayMicroseconds %lld\\n\", (long long int) micros);\n\treturn;\n    }\n\n    /* Calling nanosleep() takes at least 100-200 us, so use it for\n    // long waits and use a busy wait on the System Timer for the rest.\n    */\n    start =  bcm2835_st_read();\n   \n    /* Not allowed to access timer registers (result is not as precise)*/\n    if (start==0)\n    {\n\tt1.tv_sec = 0;\n\tt1.tv_nsec = 1000 * (long)(micros);\n\tnanosleep(&t1, NULL);\n\treturn;\n    }\n\n    if (micros > 450)\n    {\n\tt1.tv_sec = 0;\n\tt1.tv_nsec = 1000 * (long)(micros - 200);\n\tnanosleep(&t1, NULL);\n    }    \n  \n    bcm2835_st_delay(start, micros);\n}\n\n/*\n// Higher level convenience functions\n*/\n\n/* Set the state of an output */\nvoid bcm2835_gpio_write(uint8_t pin, uint8_t on)\n{\n    if (on)\n\tbcm2835_gpio_set(pin);\n    else\n\tbcm2835_gpio_clr(pin);\n}\n\n/* Set the state of a all 32 outputs in the mask to on or off */\nvoid bcm2835_gpio_write_multi(uint32_t mask, uint8_t on)\n{\n    if (on)\n\tbcm2835_gpio_set_multi(mask);\n    else\n\tbcm2835_gpio_clr_multi(mask);\n}\n\n/* Set the state of a all 32 outputs in the mask to the values in value */\nvoid bcm2835_gpio_write_mask(uint32_t value, uint32_t mask)\n{\n    bcm2835_gpio_set_multi(value & mask);\n    bcm2835_gpio_clr_multi((~value) & mask);\n}\n\n/* Set the pullup/down resistor for a pin\n//\n// The GPIO Pull-up/down Clock Registers control the actuation of internal pull-downs on\n// the respective GPIO pins. These registers must be used in conjunction with the GPPUD\n// register to effect GPIO Pull-up/down changes. The following sequence of events is\n// required:\n// 1. Write to GPPUD to set the required control signal (i.e. Pull-up or Pull-Down or neither\n// to remove the current Pull-up/down)\n// 2. Wait 150 cycles ? this provides the required set-up time for the control signal\n// 3. Write to GPPUDCLK0/1 to clock the control signal into the GPIO pads you wish to\n// modify ? NOTE only the pads which receive a clock will be modified, all others will\n// retain their previous state.\n// 4. Wait 150 cycles ? this provides the required hold time for the control signal\n// 5. Write to GPPUD to remove the control signal\n// 6. Write to GPPUDCLK0/1 to remove the clock\n//\n// RPi has P1-03 and P1-05 with 1k8 pullup resistor\n//\n// RPI 4 uses a different PUD method - no clock\n\n*/\nvoid bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud)\n{\n    if( pud_type_rpi4 )\n    {\n        int shiftbits = (pin & 0xf) << 1;\n        uint32_t bits;\n        uint32_t pull;\n        \n        switch (pud)\n        {\n           case BCM2835_GPIO_PUD_OFF:  pull = 0; break;\n           case BCM2835_GPIO_PUD_UP:   pull = 1; break;\n           case BCM2835_GPIO_PUD_DOWN: pull = 2; break;\n           default: return;\n        }\n                \n        volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUPPDN0/4 + (pin >> 4);\n        \n        bits = bcm2835_peri_read_nb( paddr );\n        bits &= ~(3 << shiftbits);\n        bits |= (pull << shiftbits);\n        \n        bcm2835_peri_write_nb( paddr, bits );\n        \n    } else\n    {\n    bcm2835_gpio_pud(pud);\n    delayMicroseconds(10);\n    bcm2835_gpio_pudclk(pin, 1);\n    delayMicroseconds(10);\n    bcm2835_gpio_pud(BCM2835_GPIO_PUD_OFF);\n    bcm2835_gpio_pudclk(pin, 0);\n}\n\n}\n\n\nuint8_t bcm2835_gpio_get_pud(uint8_t pin)\n{\n    uint8_t ret = BCM2835_GPIO_PUD_ERROR;\n    \n    if( pud_type_rpi4 )\n    {\n        uint32_t bits;\n        volatile uint32_t* paddr = bcm2835_gpio + BCM2835_GPPUPPDN0/4 + (pin >> 4);\n        bits = (bcm2835_peri_read_nb( paddr ) >> ((pin & 0xf)<<1)) & 0x3;\n        \n        switch (bits)\n        {\n            case 0: ret = BCM2835_GPIO_PUD_OFF; break;\n            case 1: ret = BCM2835_GPIO_PUD_UP; break;\n            case 2: ret = BCM2835_GPIO_PUD_DOWN; break;\n            default: ret = BCM2835_GPIO_PUD_ERROR;\n        }   \n    }\n    \n    return ret;\n}\n\nstatic void bcm2835_aux_spi_reset(void)\n {\n     volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n     volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n \n     bcm2835_peri_write(cntl1, 0);\n     bcm2835_peri_write(cntl0, BCM2835_AUX_SPI_CNTL0_CLEARFIFO);\n}\n\nint bcm2835_spi_begin(void)\n{\n    volatile uint32_t* paddr;\n\n    if (bcm2835_spi0 == MAP_FAILED)\n      return 0; /* bcm2835_init() failed, or not root */\n    \n    /* Set the SPI0 pins to the Alt 0 function to enable SPI0 access on them */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_26, BCM2835_GPIO_FSEL_ALT0); /* CE1 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_24, BCM2835_GPIO_FSEL_ALT0); /* CE0 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_21, BCM2835_GPIO_FSEL_ALT0); /* MISO */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_19, BCM2835_GPIO_FSEL_ALT0); /* MOSI */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_23, BCM2835_GPIO_FSEL_ALT0); /* CLK */\n    \n    /* Set the SPI CS register to the some sensible defaults */\n    paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    bcm2835_peri_write(paddr, 0); /* All 0s */\n    \n    /* Clear TX and RX fifos */\n    bcm2835_peri_write_nb(paddr, BCM2835_SPI0_CS_CLEAR);\n\n    return 1; // OK\n}\n\nvoid bcm2835_spi_end(void)\n{  \n    /* Set all the SPI0 pins back to input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_26, BCM2835_GPIO_FSEL_INPT); /* CE1 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_24, BCM2835_GPIO_FSEL_INPT); /* CE0 */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_21, BCM2835_GPIO_FSEL_INPT); /* MISO */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_19, BCM2835_GPIO_FSEL_INPT); /* MOSI */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_23, BCM2835_GPIO_FSEL_INPT); /* CLK */\n}\n\nvoid bcm2835_spi_setBitOrder(uint8_t order)\n{\n    bcm2835_spi_bit_order = order;\n}\n\n/* defaults to 0, which means a divider of 65536.\n// The divisor must be a power of 2. Odd numbers\n// rounded down. The maximum SPI clock rate is\n// of the APB clock\n*/\nvoid bcm2835_spi_setClockDivider(uint16_t divider)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CLK/4;\n    bcm2835_peri_write(paddr, divider);\n}\n\nvoid bcm2835_spi_set_speed_hz(uint32_t speed_hz)\n{\n\tuint16_t divider = (uint16_t) ((uint32_t) BCM2835_CORE_CLK_HZ / speed_hz);\n\tdivider &= 0xFFFE;\n\tbcm2835_spi_setClockDivider(divider);\n}\n\nvoid bcm2835_spi_setDataMode(uint8_t mode)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    /* Mask in the CPO and CPHA bits of CS */\n    bcm2835_peri_set_bits(paddr, mode << 2, BCM2835_SPI0_CS_CPOL | BCM2835_SPI0_CS_CPHA);\n}\n\n/* Writes (and reads) a single byte to SPI */\nuint8_t bcm2835_spi_transfer(uint8_t value)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t ret;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral? \n    // Clear TX and RX fifos\n    */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    /* Maybe wait for TXD */\n    while (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t;\n\n    /* Write to FIFO, no barrier */\n    bcm2835_peri_write_nb(fifo, bcm2835_correct_order(value));\n\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Read any byte that was sent back by the slave while we sere sending to it */\n    ret = bcm2835_correct_order(bcm2835_peri_read_nb(fifo));\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n\n    return ret;\n}\n\n/* Writes (and reads) an number of bytes to SPI */\nvoid bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t TXCnt=0;\n    uint32_t RXCnt=0;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral? \n    */\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    /* Use the FIFO's to reduce the interbyte times */\n    while((TXCnt < len)||(RXCnt < len))\n    {\n        /* TX fifo not full, so add some more bytes */\n        while(((bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))&&(TXCnt < len ))\n        {\n\t    bcm2835_peri_write_nb(fifo, bcm2835_correct_order(tbuf[TXCnt]));\n\t    TXCnt++;\n        }\n        /* Rx fifo not empty, so get the next received bytes */\n        while(((bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD))&&( RXCnt < len ))\n        {\n\t    rbuf[RXCnt] = bcm2835_correct_order(bcm2835_peri_read_nb(fifo));\n\t    RXCnt++;\n        }\n    }\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n}\n\n/* Writes an number of bytes to SPI */\nvoid bcm2835_spi_writenb(const char* tbuf, uint32_t len)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n    uint32_t i;\n\n    /* This is Polled transfer as per section 10.6.1\n    // BUG ALERT: what happens if we get interupted in this section, and someone else\n    // accesses a different peripheral?\n    // Answer: an ISR is required to issue the required memory barriers.\n    */\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n    for (i = 0; i < len; i++)\n    {\n\t/* Maybe wait for TXD */\n\twhile (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t    ;\n\t\n\t/* Write to FIFO, no barrier */\n\tbcm2835_peri_write_nb(fifo, bcm2835_correct_order(tbuf[i]));\n\t\n\t/* Read from FIFO to prevent stalling */\n\twhile (bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD)\n\t    (void) bcm2835_peri_read_nb(fifo);\n    }\n    \n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE)) {\n\twhile (bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_RXD)\n\t\t(void) bcm2835_peri_read_nb(fifo);\n    };\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n}\n\n/* Writes (and reads) an number of bytes to SPI\n// Read bytes are copied over onto the transmit buffer\n*/\nvoid bcm2835_spi_transfern(char* buf, uint32_t len)\n{\n    bcm2835_spi_transfernb(buf, buf, len);\n}\n\nvoid bcm2835_spi_chipSelect(uint8_t cs)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    /* Mask in the CS bits of CS */\n    bcm2835_peri_set_bits(paddr, cs, BCM2835_SPI0_CS_CS);\n}\n\nvoid bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active)\n{\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    uint8_t shift = 21 + cs;\n    /* Mask in the appropriate CSPOLn bit */\n    bcm2835_peri_set_bits(paddr, active << shift, 1 << shift);\n}\n\nvoid bcm2835_spi_write(uint16_t data)\n{\n#if 0\n\tchar buf[2];\n\n\tbuf[0] = data >> 8;\n\tbuf[1] = data & 0xFF;\n\n\tbcm2835_spi_transfern(buf, 2);\n#else\n    volatile uint32_t* paddr = bcm2835_spi0 + BCM2835_SPI0_CS/4;\n    volatile uint32_t* fifo = bcm2835_spi0 + BCM2835_SPI0_FIFO/4;\n\n    /* Clear TX and RX fifos */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_CLEAR, BCM2835_SPI0_CS_CLEAR);\n\n    /* Set TA = 1 */\n    bcm2835_peri_set_bits(paddr, BCM2835_SPI0_CS_TA, BCM2835_SPI0_CS_TA);\n\n\t/* Maybe wait for TXD */\n\twhile (!(bcm2835_peri_read(paddr) & BCM2835_SPI0_CS_TXD))\n\t    ;\n\n\t/* Write to FIFO */\n\tbcm2835_peri_write_nb(fifo,  (uint32_t) data >> 8);\n\tbcm2835_peri_write_nb(fifo,  data & 0xFF);\n\n\n    /* Wait for DONE to be set */\n    while (!(bcm2835_peri_read_nb(paddr) & BCM2835_SPI0_CS_DONE))\n\t;\n\n    /* Set TA = 0, and also set the barrier */\n    bcm2835_peri_set_bits(paddr, 0, BCM2835_SPI0_CS_TA);\n#endif\n}\n\nint bcm2835_aux_spi_begin(void)\n{\n    volatile uint32_t* enable = bcm2835_aux + BCM2835_AUX_ENABLE/4;\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n\n    if (bcm2835_spi1 == MAP_FAILED)\n\treturn 0; /* bcm2835_init() failed, or not root */\n\n    /* Set the SPI pins to the Alt 4 function to enable SPI1 access on them */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_36, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_CE2_N */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_35, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_MISO */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_38, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_MOSI */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_40, BCM2835_GPIO_FSEL_ALT4);\t/* SPI1_SCLK */\n\n    bcm2835_aux_spi_setClockDivider(bcm2835_aux_spi_CalcClockDivider(1000000));\t// Default 1MHz SPI\n\n    bcm2835_peri_write(enable, BCM2835_AUX_ENABLE_SPI0);\n    bcm2835_peri_write(cntl1, 0);\n    bcm2835_peri_write(cntl0, BCM2835_AUX_SPI_CNTL0_CLEARFIFO);\n\n    return 1; /* OK */\n}\n\nvoid bcm2835_aux_spi_end(void)\n{\n    /* Set all the SPI1 pins back to input */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_36, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_CE2_N */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_35, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_MISO */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_38, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_MOSI */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_40, BCM2835_GPIO_FSEL_INPT);\t/* SPI1_SCLK */\n}\n\n#define DIV_ROUND_UP(n,d)\t(((n) + (d) - 1) / (d))\n\nuint16_t bcm2835_aux_spi_CalcClockDivider(uint32_t speed_hz)\n{\n    uint16_t divider;\n\n    if (speed_hz < (uint32_t) BCM2835_AUX_SPI_CLOCK_MIN) {\n\tspeed_hz = (uint32_t) BCM2835_AUX_SPI_CLOCK_MIN;\n    } else if (speed_hz > (uint32_t) BCM2835_AUX_SPI_CLOCK_MAX) {\n\tspeed_hz = (uint32_t) BCM2835_AUX_SPI_CLOCK_MAX;\n    }\n\n    divider = (uint16_t) DIV_ROUND_UP(BCM2835_CORE_CLK_HZ, 2 * speed_hz) - 1;\n\n    if (divider > (uint16_t) BCM2835_AUX_SPI_CNTL0_SPEED_MAX) {\n\treturn (uint16_t) BCM2835_AUX_SPI_CNTL0_SPEED_MAX;\n    }\n\n    return divider;\n}\n\nstatic uint32_t spi1_speed;\n\nvoid bcm2835_aux_spi_setClockDivider(uint16_t divider)\n{\n    spi1_speed = (uint32_t) divider;\n}\n\nvoid bcm2835_aux_spi_write(uint16_t data)\n{\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= 16; // Shift length\n\n    bcm2835_peri_write(cntl0, _cntl0);\n    bcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n    while (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL)\n\t;\n\n    bcm2835_peri_write(io, (uint32_t) data << 16);\n}\n\nvoid bcm2835_aux_spi_writenb(const char *tbuf, uint32_t len) {\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* txhold = bcm2835_spi1 + BCM2835_AUX_SPI_TXHOLD/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    char *tx = (char *) tbuf;\n    uint32_t tx_len = len;\n    uint32_t count;\n    uint32_t data;\n    uint32_t i;\n    uint8_t byte;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_VAR_WIDTH;\n\n    bcm2835_peri_write(cntl0, _cntl0);\n    bcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n    while (tx_len > 0) {\n\n\twhile (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL)\n\t    ;\n\n\tcount = MIN(tx_len, 3);\n\tdata = 0;\n\n\tfor (i = 0; i < count; i++) {\n\t    byte = (tx != NULL) ? (uint8_t) *tx++ : (uint8_t) 0;\n\t    data |= byte << (8 * (2 - i));\n\t}\n\n\tdata |= (count * 8) << 24;\n\ttx_len -= count;\n\n\tif (tx_len != 0) {\n\t    bcm2835_peri_write(txhold, data);\n\t} else {\n\t    bcm2835_peri_write(io, data);\n\t}\n\n\twhile (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY)\n\t    ;\n\n\t(void) bcm2835_peri_read(io);\n    }\n}\n\nvoid bcm2835_aux_spi_transfernb(const char *tbuf, char *rbuf, uint32_t len) {\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* txhold = bcm2835_spi1 + BCM2835_AUX_SPI_TXHOLD/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n\tchar *tx = (char *)tbuf;\n\tchar *rx = (char *)rbuf;\n\tuint32_t tx_len = len;\n\tuint32_t rx_len = len;\n\tuint32_t count;\n\tuint32_t data;\n\tuint32_t i;\n\tuint8_t byte;\n\n\tuint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n\t_cntl0 |= BCM2835_AUX_SPI_CNTL0_VAR_WIDTH;\n\n\tbcm2835_peri_write(cntl0, _cntl0);\n\tbcm2835_peri_write(cntl1, BCM2835_AUX_SPI_CNTL1_MSBF_IN);\n\n\twhile ((tx_len > 0) || (rx_len > 0)) {\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_TX_FULL) && (tx_len > 0)) {\n\t\t\tcount = MIN(tx_len, 3);\n\t\t\tdata = 0;\n\n\t\t\tfor (i = 0; i < count; i++) {\n\t\t\t\tbyte = (tx != NULL) ? (uint8_t) *tx++ : (uint8_t) 0;\n\t\t\t\tdata |= byte << (8 * (2 - i));\n\t\t\t}\n\n\t\t\tdata |= (count * 8) << 24;\n\t\t\ttx_len -= count;\n\n\t\t\tif (tx_len != 0) {\n\t\t\t\tbcm2835_peri_write(txhold, data);\n\t\t\t} else {\n\t\t\t\tbcm2835_peri_write(io, data);\n\t\t\t}\n\n\t\t}\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_RX_EMPTY) && (rx_len > 0)) {\n\t\t\tcount = MIN(rx_len, 3);\n\t\t\tdata = bcm2835_peri_read(io);\n\n\t\t\tif (rbuf != NULL) {\n\t\t\t\tswitch (count) {\n\t\t\t\tcase 3:\n\t\t\t\t\t*rx++ = (char)((data >> 16) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 2:\n\t\t\t\t\t*rx++ = (char)((data >> 8) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 1:\n\t\t\t\t\t*rx++ = (char)((data >> 0) & 0xFF);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trx_len -= count;\n\t\t}\n\n\t\twhile (!(bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY) && (rx_len > 0)) {\n\t\t\tcount = MIN(rx_len, 3);\n\t\t\tdata = bcm2835_peri_read(io);\n\n\t\t\tif (rbuf != NULL) {\n\t\t\t\tswitch (count) {\n\t\t\t\tcase 3:\n\t\t\t\t\t*rx++ = (char)((data >> 16) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 2:\n\t\t\t\t\t*rx++ = (char)((data >> 8) & 0xFF);\n\t\t\t\t\t/*@fallthrough@*/\n\t\t\t\t\t/* no break */\n\t\t\t\tcase 1:\n\t\t\t\t\t*rx++ = (char)((data >> 0) & 0xFF);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trx_len -= count;\n\t\t}\n\t}\n}\n\nvoid bcm2835_aux_spi_transfern(char *buf, uint32_t len) {\n\tbcm2835_aux_spi_transfernb(buf, buf, len);\n}\n\n/* Writes (and reads) a single byte to AUX SPI */\nuint8_t bcm2835_aux_spi_transfer(uint8_t value)\n{\n    volatile uint32_t* cntl0 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL0/4;\n    volatile uint32_t* cntl1 = bcm2835_spi1 + BCM2835_AUX_SPI_CNTL1/4;\n    volatile uint32_t* stat = bcm2835_spi1 + BCM2835_AUX_SPI_STAT/4;\n    volatile uint32_t* io = bcm2835_spi1 + BCM2835_AUX_SPI_IO/4;\n\n    uint32_t data;\n\n    uint32_t _cntl0 = (spi1_speed << BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT);\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CS2_N;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_ENABLE;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_MSBF_OUT;\n    _cntl0 |= BCM2835_AUX_SPI_CNTL0_CPHA_IN;\n    _cntl0 |= 8; // Shift length.\n\n    uint32_t _cntl1 = BCM2835_AUX_SPI_CNTL1_MSBF_IN;\n\n    bcm2835_peri_write(cntl1, _cntl1);\n    bcm2835_peri_write(cntl0, _cntl0);\n\n    bcm2835_peri_write(io, (uint32_t) bcm2835_correct_order(value) << 24);\n\n    while (bcm2835_peri_read(stat) & BCM2835_AUX_SPI_STAT_BUSY)\n        ;\n\n    data = bcm2835_correct_order(bcm2835_peri_read(io) & 0xff);\n\n    bcm2835_aux_spi_reset();\n\n    return data;\n}\n\n\nint bcm2835_i2c_begin(void)\n{\n    uint16_t cdiv;\n\n    if (   bcm2835_bsc0 == MAP_FAILED\n\t|| bcm2835_bsc1 == MAP_FAILED)\n      return 0; /* bcm2835_init() failed, or not root */\n\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_DIV/4;\n    /* Set the I2C/BSC0 pins to the Alt 0 function to enable I2C access on them */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_03, BCM2835_GPIO_FSEL_ALT0); /* SDA */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_05, BCM2835_GPIO_FSEL_ALT0); /* SCL */\n#else\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_DIV/4;\n    /* Set the I2C/BSC1 pins to the Alt 0 function to enable I2C access on them */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_03, BCM2835_GPIO_FSEL_ALT0); /* SDA */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_05, BCM2835_GPIO_FSEL_ALT0); /* SCL */\n#endif    \n\n    /* Read the clock divider register */\n    cdiv = bcm2835_peri_read(paddr);\n    /* Calculate time for transmitting one byte\n    // 1000000 = micros seconds in a second\n    // 9 = Clocks per byte : 8 bits + ACK\n    */\n    i2c_byte_wait_us = ((float)cdiv / BCM2835_CORE_CLK_HZ) * 1000000 * 9;\n\n    return 1;\n}\n\nvoid bcm2835_i2c_end(void)\n{\n#ifdef I2C_V1\n    /* Set all the I2C/BSC0 pins back to input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_03, BCM2835_GPIO_FSEL_INPT); /* SDA */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_05, BCM2835_GPIO_FSEL_INPT); /* SCL */\n#else\n    /* Set all the I2C/BSC1 pins back to input */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_03, BCM2835_GPIO_FSEL_INPT); /* SDA */\n    bcm2835_gpio_fsel(RPI_V2_GPIO_P1_05, BCM2835_GPIO_FSEL_INPT); /* SCL */\n#endif\n}\n\nvoid bcm2835_i2c_setSlaveAddress(uint8_t addr)\n{\n    /* Set I2C Device Address */\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_A/4;\n#else\t\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_A/4;\n#endif\n    bcm2835_peri_write(paddr, addr);\n}\n\n/* defaults to 0x5dc, should result in a 166.666 kHz I2C clock frequency.\n// The divisor must be a power of 2. Odd numbers\n// rounded down.\n*/\nvoid bcm2835_i2c_setClockDivider(uint16_t divider)\n{\n#ifdef I2C_V1\n    volatile uint32_t* paddr = bcm2835_bsc0 + BCM2835_BSC_DIV/4;\n#else\n    volatile uint32_t* paddr = bcm2835_bsc1 + BCM2835_BSC_DIV/4;\n#endif    \n    bcm2835_peri_write(paddr, divider);\n    /* Calculate time for transmitting one byte\n    // 1000000 = micros seconds in a second\n    // 9 = Clocks per byte : 8 bits + ACK\n    */\n    i2c_byte_wait_us = ((float)divider / BCM2835_CORE_CLK_HZ) * 1000000 * 9;\n}\n\n/* set I2C clock divider by means of a baudrate number */\nvoid bcm2835_i2c_set_baudrate(uint32_t baudrate)\n{\n\tuint32_t divider;\n\t/* use 0xFFFE mask to limit a max value and round down any odd number */\n\tdivider = (BCM2835_CORE_CLK_HZ / baudrate) & 0xFFFE;\n\tbcm2835_i2c_setClockDivider( (uint16_t)divider );\n}\n\n/* Writes an number of bytes to I2C */\nuint8_t bcm2835_i2c_write(const char * buf, uint32_t len)\n{\n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n\n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, len);\n    /* pre populate FIFO with max buffer */\n    while( remaining && ( i < BCM2835_BSC_FIFO_SIZE ) )\n    {\n        bcm2835_peri_write_nb(fifo, buf[i]);\n        i++;\n        remaining--;\n    }\n    \n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* Transfer is over when BCM2835_BSC_S_DONE */\n    while(!(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE ))\n    {\n        while ( remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_TXD ))\n    \t{\n\t    /* Write to FIFO */\n\t    bcm2835_peri_write(fifo, buf[i]);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n\n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read an number of bytes from I2C */\nuint8_t bcm2835_i2c_read(char* buf, uint32_t len)\n{\n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n\n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write_nb(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write_nb(dlen, len);\n    /* Start read */\n    bcm2835_peri_write_nb(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST | BCM2835_BSC_C_READ);\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read_nb(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO, no barrier */\n\t    buf[i] = bcm2835_peri_read_nb(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read_nb(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO, no barrier */\n        buf[i] = bcm2835_peri_read_nb(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is received */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(status, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read an number of bytes from I2C sending a repeated start after writing\n// the required register. Only works if your device supports this mode\n*/\nuint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len)\n{   \n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\tuint32_t remaining = len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n    \n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, 1);\n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN);\n    bcm2835_peri_write(fifo, regaddr[0]);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* poll for transfer has started */\n    while ( !( bcm2835_peri_read(status) & BCM2835_BSC_S_TA ) )\n    {\n        /* Linux may cause us to miss entire transfer stage */\n        if(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE)\n            break;\n    }\n    \n    /* Send a repeated start with read bit set in address */\n    bcm2835_peri_write(dlen, len);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST  | BCM2835_BSC_C_READ );\n    \n    /* Wait for write to complete and first byte back. */\n    bcm2835_delayMicroseconds(i2c_byte_wait_us * 3);\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO */\n\t    buf[i] = bcm2835_peri_read(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO */\n        buf[i] = bcm2835_peri_read(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\t\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Sending an arbitrary number of bytes before issuing a repeated start \n// (with no prior stop) and reading a response. Some devices require this behavior.\n*/\nuint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* buf, uint32_t buf_len)\n{   \n#ifdef I2C_V1\n    volatile uint32_t* dlen    = bcm2835_bsc0 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc0 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc0 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc0 + BCM2835_BSC_C/4;\n#else\n    volatile uint32_t* dlen    = bcm2835_bsc1 + BCM2835_BSC_DLEN/4;\n    volatile uint32_t* fifo    = bcm2835_bsc1 + BCM2835_BSC_FIFO/4;\n    volatile uint32_t* status  = bcm2835_bsc1 + BCM2835_BSC_S/4;\n    volatile uint32_t* control = bcm2835_bsc1 + BCM2835_BSC_C/4;\n#endif    \n\n    uint32_t remaining = cmds_len;\n    uint32_t i = 0;\n    uint8_t reason = BCM2835_I2C_REASON_OK;\n    \n    /* Clear FIFO */\n    bcm2835_peri_set_bits(control, BCM2835_BSC_C_CLEAR_1 , BCM2835_BSC_C_CLEAR_1 );\n\n    /* Clear Status */\n    bcm2835_peri_write(status, BCM2835_BSC_S_CLKT | BCM2835_BSC_S_ERR | BCM2835_BSC_S_DONE);\n\n    /* Set Data Length */\n    bcm2835_peri_write(dlen, cmds_len);\n \n    /* pre populate FIFO with max buffer */\n    while( remaining && ( i < BCM2835_BSC_FIFO_SIZE ) )\n    {\n        bcm2835_peri_write_nb(fifo, cmds[i]);\n        i++;\n        remaining--;\n    }\n\n    /* Enable device and start transfer */\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST);\n    \n    /* poll for transfer has started (way to do repeated start, from BCM2835 datasheet) */\n    while ( !( bcm2835_peri_read(status) & BCM2835_BSC_S_TA ) )\n    {\n        /* Linux may cause us to miss entire transfer stage */\n        if(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE)\n            break;\n    }\n    \n    remaining = buf_len;\n    i = 0;\n\n    /* Send a repeated start with read bit set in address */\n    bcm2835_peri_write(dlen, buf_len);\n    bcm2835_peri_write(control, BCM2835_BSC_C_I2CEN | BCM2835_BSC_C_ST  | BCM2835_BSC_C_READ );\n    \n    /* Wait for write to complete and first byte back. */\n    bcm2835_delayMicroseconds(i2c_byte_wait_us * (cmds_len + 1));\n    \n    /* wait for transfer to complete */\n    while (!(bcm2835_peri_read_nb(status) & BCM2835_BSC_S_DONE))\n    {\n        /* we must empty the FIFO as it is populated and not use any delay */\n        while (remaining && bcm2835_peri_read(status) & BCM2835_BSC_S_RXD)\n    \t{\n\t    /* Read from FIFO, no barrier */\n\t    buf[i] = bcm2835_peri_read_nb(fifo);\n\t    i++;\n\t    remaining--;\n    \t}\n    }\n    \n    /* transfer has finished - grab any remaining stuff in FIFO */\n    while (remaining && (bcm2835_peri_read(status) & BCM2835_BSC_S_RXD))\n    {\n        /* Read from FIFO */\n        buf[i] = bcm2835_peri_read(fifo);\n        i++;\n        remaining--;\n    }\n    \n    /* Received a NACK */\n    if (bcm2835_peri_read(status) & BCM2835_BSC_S_ERR)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_NACK;\n    }\n\n    /* Received Clock Stretch Timeout */\n    else if (bcm2835_peri_read(status) & BCM2835_BSC_S_CLKT)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_CLKT;\n    }\n\n    /* Not all data is sent */\n    else if (remaining)\n    {\n\treason = BCM2835_I2C_REASON_ERROR_DATA;\n    }\n\n    bcm2835_peri_set_bits(control, BCM2835_BSC_S_DONE , BCM2835_BSC_S_DONE);\n\n    return reason;\n}\n\n/* Read the System Timer Counter (64-bits) */\nuint64_t bcm2835_st_read(void)\n{\n    volatile uint32_t* paddr;\n    uint32_t hi, lo;\n    uint64_t st;\n\n    if (bcm2835_st==MAP_FAILED)\n\treturn 0;\n\n    paddr = bcm2835_st + BCM2835_ST_CHI/4;\n    hi = bcm2835_peri_read(paddr);\n\n    paddr = bcm2835_st + BCM2835_ST_CLO/4;\n    lo = bcm2835_peri_read(paddr);\n    \n    paddr = bcm2835_st + BCM2835_ST_CHI/4;\n    st = bcm2835_peri_read(paddr);\n    \n    /* Test for overflow */\n    if (st == hi)\n    {\n        st <<= 32;\n        st += lo;\n    }\n    else\n    {\n        st <<= 32;\n        paddr = bcm2835_st + BCM2835_ST_CLO/4;\n        st += bcm2835_peri_read(paddr);\n    }\n    return st;\n}\n\n/* Delays for the specified number of microseconds with offset */\nvoid bcm2835_st_delay(uint64_t offset_micros, uint64_t micros)\n{\n    uint64_t compare = offset_micros + micros;\n\n    while(bcm2835_st_read() < compare)\n\t;\n}\n\n/* PWM */\n\nvoid bcm2835_pwm_set_clock(uint32_t divisor)\n{\n    if (   bcm2835_clk == MAP_FAILED\n        || bcm2835_pwm == MAP_FAILED)\n      return; /* bcm2835_init() failed or not root */\n  \n    /* From Gerts code */\n    divisor &= 0xfff;\n    /* Stop PWM clock */\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x01);\n    bcm2835_delay(110); /* Prevents clock going slow */\n    /* Wait for the clock to be not busy */\n    while ((bcm2835_peri_read(bcm2835_clk + BCM2835_PWMCLK_CNTL) & 0x80) != 0)\n\tbcm2835_delay(1); \n    /* set the clock divider and enable PWM clock */\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_DIV, BCM2835_PWM_PASSWRD | (divisor << 12));\n    bcm2835_peri_write(bcm2835_clk + BCM2835_PWMCLK_CNTL, BCM2835_PWM_PASSWRD | 0x11); /* Source=osc and enable */\n}\n\nvoid bcm2835_pwm_set_mode(uint8_t channel, uint8_t markspace, uint8_t enabled)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  uint32_t control = bcm2835_peri_read(bcm2835_pwm + BCM2835_PWM_CONTROL);\n\n  if (channel == 0)\n    {\n      if (markspace)\n\tcontrol |= BCM2835_PWM0_MS_MODE;\n      else\n\tcontrol &= ~BCM2835_PWM0_MS_MODE;\n      if (enabled)\n\tcontrol |= BCM2835_PWM0_ENABLE;\n      else\n\tcontrol &= ~BCM2835_PWM0_ENABLE;\n    }\n  else if (channel == 1)\n    {\n      if (markspace)\n\tcontrol |= BCM2835_PWM1_MS_MODE;\n      else\n\tcontrol &= ~BCM2835_PWM1_MS_MODE;\n      if (enabled)\n\tcontrol |= BCM2835_PWM1_ENABLE;\n      else\n\tcontrol &= ~BCM2835_PWM1_ENABLE;\n    }\n\n  /* If you use the barrier here, wierd things happen, and the commands dont work */\n  bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM_CONTROL, control);\n  /*  bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM_CONTROL, BCM2835_PWM0_ENABLE | BCM2835_PWM1_ENABLE | BCM2835_PWM0_MS_MODE | BCM2835_PWM1_MS_MODE); */\n\n}\n\nvoid bcm2835_pwm_set_range(uint8_t channel, uint32_t range)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  if (channel == 0)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM0_RANGE, range);\n  else if (channel == 1)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM1_RANGE, range);\n}\n\nvoid bcm2835_pwm_set_data(uint8_t channel, uint32_t data)\n{\n  if (   bcm2835_clk == MAP_FAILED\n       || bcm2835_pwm == MAP_FAILED)\n    return; /* bcm2835_init() failed or not root */\n\n  if (channel == 0)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM0_DATA, data);\n  else if (channel == 1)\n      bcm2835_peri_write_nb(bcm2835_pwm + BCM2835_PWM1_DATA, data);\n}\n\n/* Allocate page-aligned memory. */\nvoid *malloc_aligned(size_t size)\n{\n    void *mem;\n    errno = posix_memalign(&mem, BCM2835_PAGE_SIZE, size);\n    return (errno ? NULL : mem);\n}\n\n/* Map 'size' bytes starting at 'off' in file 'fd' to memory.\n// Return mapped address on success, MAP_FAILED otherwise.\n// On error print message.\n*/\nstatic void *mapmem(const char *msg, size_t size, int fd, off_t off)\n{\n    void *map = mmap(NULL, size, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, off);\n    if (map == MAP_FAILED)\n\tfprintf(stderr, \"bcm2835_init: %s mmap failed: %s\\n\", msg, strerror(errno));\n    return map;\n}\n\nstatic void unmapmem(void **pmem, size_t size)\n{\n    if (*pmem == MAP_FAILED) return;\n    munmap(*pmem, size);\n    *pmem = MAP_FAILED;\n}\n\n/* Initialise this library. */\nint bcm2835_init(void)\n{\n    int  memfd;\n    int  ok;\n    FILE *fp;\n\n    if (debug) \n    {\n        bcm2835_peripherals = (uint32_t*)BCM2835_PERI_BASE;\n\n\tbcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n\tbcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n\tbcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n\tbcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n\tbcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n\tbcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4;\n\tbcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4;\n\tbcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n\tbcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n\tbcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n\treturn 1; /* Success */\n    }\n\n    /* Figure out the base and size of the peripheral address block\n    // using the device-tree. Required for RPi2/3/4, optional for RPi 1\n    */\n    if ((fp = fopen(BMC2835_RPI2_DT_FILENAME , \"rb\")))\n    {\n        unsigned char buf[16];\n        uint32_t base_address;\n        uint32_t peri_size;\n        if (fread(buf, 1, sizeof(buf), fp) >= 8)\n        {\n            base_address = (buf[4] << 24) |\n              (buf[5] << 16) |\n              (buf[6] << 8) |\n              (buf[7] << 0);\n            \n            peri_size = (buf[8] << 24) |\n              (buf[9] << 16) |\n              (buf[10] << 8) |\n              (buf[11] << 0);\n            \n            if (!base_address)\n            {\n                /* looks like RPI 4 */\n                base_address = (buf[8] << 24) |\n                      (buf[9] << 16) |\n                      (buf[10] << 8) |\n                      (buf[11] << 0);\n                      \n                peri_size = (buf[12] << 24) |\n                (buf[13] << 16) |\n                (buf[14] << 8) |\n                (buf[15] << 0);\n            }\n            /* check for valid known range formats */\n            if ((buf[0] == 0x7e) &&\n                    (buf[1] == 0x00) &&\n                    (buf[2] == 0x00) &&\n                    (buf[3] == 0x00) &&\n                    ((base_address == BCM2835_PERI_BASE) || (base_address == BCM2835_RPI2_PERI_BASE) || (base_address == BCM2835_RPI4_PERI_BASE)))\n            {\n                bcm2835_peripherals_base = (off_t)base_address;\n                bcm2835_peripherals_size = (size_t)peri_size;\n                if( base_address == BCM2835_RPI4_PERI_BASE )\n                {\n                    pud_type_rpi4 = 1;\n                }\n            }\n        \n        }\n        \n\tfclose(fp);\n    }\n    /* else we are prob on RPi 1 with BCM2835, and use the hardwired defaults */\n\n    /* Now get ready to map the peripherals block \n     * If we are not root, try for the new /dev/gpiomem interface and accept\n     * the fact that we can only access GPIO\n     * else try for the /dev/mem interface and get access to everything\n     */\n    memfd = -1;\n    ok = 0;\n    if (geteuid() == 0\n#ifdef BCM2835_HAVE_LIBCAP\n\t|| bcm2835_has_capability(CAP_SYS_RAWIO)\n#endif\n\t)\n    {\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/mem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/mem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      \n      /* Now compute the base addresses of various peripherals, \n      // which are at fixed offsets within the mapped peripherals block\n      // Caution: bcm2835_peripherals is uint32_t*, so divide offsets by 4\n      */\n      bcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n      bcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n      bcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n      bcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n      bcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n      bcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4; /* I2C */\n      bcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4; /* I2C */\n      bcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n      bcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n      bcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n      ok = 1;\n    }\n    else\n    {\n      /* Not root, try /dev/gpiomem */\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/gpiomem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/gpiomem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals_base = 0;\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      bcm2835_gpio = bcm2835_peripherals;\n      ok = 1;\n    }\n\nexit:\n    if (memfd >= 0)\n        close(memfd);\n\n    if (!ok)\n\tbcm2835_close();\n\n    return ok;\n}\n\n/* Close this library and deallocate everything */\nint bcm2835_close(void)\n{\n    if (debug) return 1; /* Success */\n\n    unmapmem((void**) &bcm2835_peripherals, bcm2835_peripherals_size);\n    bcm2835_peripherals = MAP_FAILED;\n    bcm2835_gpio = MAP_FAILED;\n    bcm2835_pwm  = MAP_FAILED;\n    bcm2835_clk  = MAP_FAILED;\n    bcm2835_pads = MAP_FAILED;\n    bcm2835_spi0 = MAP_FAILED;\n    bcm2835_bsc0 = MAP_FAILED;\n    bcm2835_bsc1 = MAP_FAILED;\n    bcm2835_st   = MAP_FAILED;\n    bcm2835_aux  = MAP_FAILED;\n    bcm2835_spi1 = MAP_FAILED;\n    return 1; /* Success */\n}    \n\n#ifdef BCM2835_TEST\n/* this is a simple test program that prints out what it will do rather than \n// actually doing it\n*/\nint main(int argc, char **argv)\n{\n    /* Be non-destructive */\n    bcm2835_set_debug(1);\n\n    if (!bcm2835_init())\n\treturn 1;\n\n    /* Configure some GPIO pins fo some testing\n    // Set RPI pin P1-11 to be an output\n    */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_11, BCM2835_GPIO_FSEL_OUTP);\n    /* Set RPI pin P1-15 to be an input */\n    bcm2835_gpio_fsel(RPI_GPIO_P1_15, BCM2835_GPIO_FSEL_INPT);\n    /*  with a pullup */\n    bcm2835_gpio_set_pud(RPI_GPIO_P1_15, BCM2835_GPIO_PUD_UP);\n    /* And a low detect enable */\n    bcm2835_gpio_len(RPI_GPIO_P1_15);\n    /* and input hysteresis disabled on GPIOs 0 to 27 */\n    bcm2835_gpio_set_pad(BCM2835_PAD_GROUP_GPIO_0_27, BCM2835_PAD_SLEW_RATE_UNLIMITED|BCM2835_PAD_DRIVE_8mA);\n\n#if 1\n    /* Blink */\n    while (1)\n    {\n\t/* Turn it on */\n\tbcm2835_gpio_write(RPI_GPIO_P1_11, HIGH);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n\t\n\t/* turn it off */\n\tbcm2835_gpio_write(RPI_GPIO_P1_11, LOW);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n#if 0\n    /* Read input */\n    while (1)\n    {\n\t/* Read some data */\n\tuint8_t value = bcm2835_gpio_lev(RPI_GPIO_P1_15);\n\tprintf(\"read from pin 15: %d\\n\", value);\n\t\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n#if 0\n    /* Look for a low event detection\n    // eds will be set whenever pin 15 goes low\n    */\n    while (1)\n    {\n\tif (bcm2835_gpio_eds(RPI_GPIO_P1_15))\n\t{\n\t    /* Now clear the eds flag by setting it to 1 */\n\t    bcm2835_gpio_set_eds(RPI_GPIO_P1_15);\n\t    printf(\"low event detect for pin 15\\n\");\n\t}\n\n\t/* wait a bit */\n\tbcm2835_delay(500);\n    }\n#endif\n\n    if (!bcm2835_close())\n\treturn 1;\n\n    return 0;\n}\n#endif\n\n\n\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/bcm2835.h",
    "content": "/* bcm2835.h\n  \n   C and C++ support for Broadcom BCM 2835 as used in Raspberry Pi\n  \n   Author: Mike McCauley\n   Copyright (C) 2011-2013 Mike McCauley\n   $Id: bcm2835.h,v 1.26 2020/01/11 05:07:13 mikem Exp mikem $\n*/\n\n/*! \\mainpage C library for Broadcom BCM 2835 as used in Raspberry Pi\n  \n  This is a C library for Raspberry Pi (RPi). It provides access to \n  GPIO and other IO functions on the Broadcom BCM 2835 chip, as used in the RaspberryPi,\n  allowing access to the GPIO pins on the\n  26 pin IDE plug on the RPi board so you can control and interface with various external devices.\n  \n  It provides functions for reading digital inputs and setting digital outputs, using SPI and I2C,\n  and for accessing the system timers.\n  Pin event detection is supported by polling (interrupts are not supported).\n\n  Works on all versions upt to and including RPI 4. \n  Works with all versions of Debian up to and including Debian Buster 10.\n  \n  It is C++ compatible, and installs as a header file and non-shared library on \n  any Linux-based distro (but clearly is no use except on Raspberry Pi or another board with \n  BCM 2835).\n  \n  The version of the package that this documentation refers to can be downloaded \n  from http://www.airspayce.com/mikem/bcm2835/bcm2835-1.68.tar.gz\n  You can find the latest version at http://www.airspayce.com/mikem/bcm2835\n  \n  Several example programs are provided.\n  \n  Based on data in http://elinux.org/RPi_Low-level_peripherals and \n  http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf\n  and http://www.scribd.com/doc/101830961/GPIO-Pads-Control2\n  \n  You can also find online help and discussion at http://groups.google.com/group/bcm2835\n  Please use that group for all questions and discussions on this topic. \n  Do not contact the author directly, unless it is to discuss commercial licensing.\n  Before asking a question or reporting a bug, please read \n  - http://en.wikipedia.org/wiki/Wikipedia:Reference_desk/How_to_ask_a_software_question\n  - http://www.catb.org/esr/faqs/smart-questions.html\n  - http://www.chiark.greenend.org.uk/~shgtatham/bugs.html\n  \n  Tested on debian6-19-04-2012, 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian\n  and Occidentalisv01, 2016-02-09 Raspbian Jessie.\n  CAUTION: it has been observed that when detect enables such as bcm2835_gpio_len() \n  are used and the pin is pulled LOW\n  it can cause temporary hangs on 2012-07-15-wheezy-raspbian, 2013-07-26-wheezy-raspbian\n  and Occidentalisv01.\n  Reason for this is not yet determined, but we suspect that an interrupt handler is\n  hitting a hard loop on those OSs.\n  If you must use bcm2835_gpio_len() and friends, make sure you disable the pins with \n  bcm2835_gpio_clr_len() and friends after use. \n  \n  \\par Running as root\n\n  Prior to the release of Raspbian Jessie in Feb 2016, access to any\n  peripheral device via /dev/mem on the RPi required the process to\n  run as root. Raspbian Jessie permits non-root users to access the\n  GPIO peripheral (only) via /dev/gpiomem, and this library supports\n  that limited mode of operation.\n\n  If the library runs with effective UID of 0 (ie root), then\n  bcm2835_init() will attempt to open /dev/mem, and, if successful, it\n  will permit use of all peripherals and library functions.\n\n  If the library runs with any other effective UID (ie not root), then\n  bcm2835_init() will attempt to open /dev/gpiomem, and, if\n  successful, will only permit GPIO operations. In particular,\n  bcm2835_spi_begin() and bcm2835_i2c_begin() will return false and all\n  other non-gpio operations may fail silently or crash.\n\n  If your program needs acccess to /dev/mem but not as root, \n  and if you have the libcap-dev package installed on the target, \n  you can compile this library to use\n  libcap2 so that it tests whether the exceutable has the cap_sys_rawio capability, and therefore\n  permission to access /dev/mem.\n  To enable this ability, uncomment the #define BCM2835_HAVE_LIBCAP in bcm2835.h or \n  -DBCM2835_HAVE_LIBCAP on your compiler command line.\n  After your program has been compiled:\n  \\code\n  sudo setcap cap_sys_rawio+ep *myprogname*\n  \\endcode\n  You also need to do these steps on the host once, to support libcap and not-root read/write access \n  to /dev/mem:\n  1. Install libcap support\n  \\code\n    sudo apt-get install libcap2 libcap-dev\n  2. Add current user to kmem group\n  \\code\n    sudo adduser $USER kmem\n  \\endcode\n  3. Allow write access to /dev/mem by members of kmem group\n  \\code\n    echo 'SUBSYSTEM==\"mem\", KERNEL==\"mem\", GROUP=\"kmem\", MODE=\"0660\"' | sudo tee /etc/udev/rules.d/98-mem.rules\n  \\endcode\n  \\code\n    sudo reboot\n  \\endcode\n\n  \\par Installation\n  \n  This library consists of a single non-shared library and header file, which will be\n  installed in the usual places by make install\n  \n  \\code\n  # download the latest version of the library, say bcm2835-1.xx.tar.gz, then:\n  tar zxvf bcm2835-1.xx.tar.gz\n  cd bcm2835-1.xx\n  ./configure\n  make\n  sudo make check\n  sudo make install\n  \\endcode\n  \n  \\par Physical Addresses\n  \n  The functions bcm2835_peri_read(), bcm2835_peri_write() and bcm2835_peri_set_bits() \n  are low level peripheral register access functions. They are designed to use\n  physical addresses as described in section 1.2.3 ARM physical addresses\n  of the BCM2835 ARM Peripherals manual. \n  Physical addresses range from 0x20000000 to 0x20FFFFFF for peripherals. The bus\n  addresses for peripherals are set up to map onto the peripheral bus address range starting at\n  0x7E000000. Thus a peripheral advertised in the manual at bus address 0x7Ennnnnn is available at\n  physical address 0x20nnnnnn.\n  \n  On RPI 2, the peripheral addresses are different and the bcm2835 library gets them \n  from reading /proc/device-tree/soc/ranges. This is only availble with recent versions of the kernel on RPI 2.\n  \n  After initialisation, the base address of the various peripheral \n  registers are available with the following\n  externals:\n  bcm2835_gpio\n  bcm2835_pwm\n  bcm2835_clk\n  bcm2835_pads\n  bcm2835_spio0\n  bcm2835_st\n  bcm2835_bsc0\n  bcm2835_bsc1\n  bcm2835_aux\n  bcm2835_spi1\n\n  \\par Raspberry Pi 2 (RPI2)\n\n  For this library to work correctly on RPI2, you MUST have the device tree support enabled in the kernel.\n  You should also ensure you are using the latest version of Linux. The library has been tested on RPI2\n  with 2015-02-16-raspbian-wheezy and ArchLinuxARM-rpi-2 as of 2015-03-29.\n\n  When device tree suport is enabled, the file /proc/device-tree/soc/ranges will appear in the file system, \n  and the bcm2835 module relies on its presence to correctly run on RPI2 (it is optional for RPI1). \n  Without device tree support enabled and the presence of this file, it will not work on RPI2.\n\n  To enable device tree support:\n\n  \\code\n  sudo raspi-config\n   under Advanced Options - enable Device Tree\n   Reboot.\n  \\endcode\n  \n  \\par Pin Numbering\n  \n  The GPIO pin numbering as used by RPi is different to and inconsistent with the underlying \n  BCM 2835 chip pin numbering. http://elinux.org/RPi_BCM2835_GPIOs\n   \n  RPi has a 26 pin IDE header that provides access to some of the GPIO pins on the BCM 2835,\n  as well as power and ground pins. Not all GPIO pins on the BCM 2835 are available on the \n  IDE header.\n  \n  RPi Version 2 also has a P5 connector with 4 GPIO pins, 5V, 3.3V and Gnd.\n  \n  The functions in this library are designed to be passed the BCM 2835 GPIO pin number and _not_ \n  the RPi pin number. There are symbolic definitions for each of the available pins\n  that you should use for convenience. See \\ref RPiGPIOPin.\n  \n  \\par SPI Pins\n   \n  The bcm2835_spi_* functions allow you to control the BCM 2835 SPI0 interface, \n  allowing you to send and received data by SPI (Serial Peripheral Interface).\n  For more information about SPI, see http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus\n  \n  When bcm2835_spi_begin() is called it changes the bahaviour of the SPI interface pins from their \n  default GPIO behaviour in order to support SPI. While SPI is in use, you will not be able \n  to control the state of the SPI pins through the usual bcm2835_spi_gpio_write().\n  When bcm2835_spi_end() is called, the SPI pins will all revert to inputs, and can then be\n  configured and controled with the usual bcm2835_gpio_* calls.\n  \n  The Raspberry Pi GPIO pins used for SPI are:\n   \n  - P1-19 (MOSI)\n  - P1-21 (MISO) \n  - P1-23 (CLK) \n  - P1-24 (CE0) \n  - P1-26 (CE1)\n\n  Although it is possible to select high speeds for the SPI interface, up to 125MHz (see bcm2835_spi_setClockDivider())\n  you should not expect to actually achieve those sorts of speeds with the RPi wiring. Our tests on RPi 2 show that the\n  SPI CLK line when unloaded has a resonant frequency of about 40MHz, and when loaded, the MOSI and MISO lines\n  ring at an even lower frequency. Measurements show that SPI waveforms are very poor and unusable at 62 and 125MHz.\n  Dont expect any speed faster than 31MHz to work reliably.\n\n  The bcm2835_aux_spi_* functions allow you to control the BCM 2835 SPI1 interface,\n  allowing you to send and received data by SPI (Serial Peripheral Interface).\n\n  The Raspberry Pi GPIO pins used for AUX SPI (SPI1) are:\n\n  - P1-38 (MOSI)\n  - P1-35 (MISO)\n  - P1-40 (CLK)\n  - P1-36 (CE2)\n\n  \\par I2C Pins\n  \n  The bcm2835_i2c_* functions allow you to control the BCM 2835 BSC interface,\n  allowing you to send and received data by I2C (\"eye-squared cee\"; generically referred to as \"two-wire interface\") .\n  For more information about I?C, see http://en.wikipedia.org/wiki/I%C2%B2C\n  \n  The Raspberry Pi V2 GPIO pins used for I2C are:\n  \n  - P1-03 (SDA)\n  - P1-05 (SLC)\n  \n  \\par PWM\n  \n  The BCM2835 supports hardware PWM on a limited subset of GPIO pins. This bcm2835 library provides \n  functions for configuring and controlling PWM output on these pins.\n  \n  The BCM2835 contains 2 independent PWM channels (0 and 1), each of which be connnected to a limited subset of \n  GPIO pins. The following GPIO pins may be connected to the following PWM channels (from section 9.5):\n  \\code\n  GPIO PIN    RPi pin  PWM Channel    ALT FUN\n  12                    0            0\n  13                    1            0\n  18         1-12       0            5\n  19                    1            5\n  40                    0            0\n  41                    1            0\n  45                    1            0\n  52                    0            1\n  53                    1            1\n  \\endcode\n  In order for a GPIO pin to emit output from its PWM channel, it must be set to the Alt Function given above.\n  Note carefully that current versions of the Raspberry Pi only expose one of these pins (GPIO 18 = RPi Pin 1-12)\n  on the IO headers, and therefore this is the only IO pin on the RPi that can be used for PWM.\n  Further it must be set to ALT FUN 5 to get PWM output.\n  \n  Both PWM channels are driven by the same PWM clock, whose clock dvider can be varied using \n  bcm2835_pwm_set_clock(). Each channel can be separately enabled with bcm2835_pwm_set_mode().\n  The average output of the PWM channel is determined by the ratio of DATA/RANGE for that channel.\n  Use bcm2835_pwm_set_range() to set the range and bcm2835_pwm_set_data() to set the data in that ratio\n  \n  Each PWM channel can run in either Balanced or Mark-Space mode. In Balanced mode, the hardware \n  sends a combination of clock pulses that results in an overall DATA pulses per RANGE pulses.\n  In Mark-Space mode, the hardware sets the output HIGH for DATA clock pulses wide, followed by \n  LOW for RANGE-DATA clock pulses. \n  \n  The PWM clock can be set to control the PWM pulse widths. The PWM clock is derived from \n  a 19.2MHz clock. You can set any divider, but some common ones are provided by the BCM2835_PWM_CLOCK_DIVIDER_*\n  values of \\ref bcm2835PWMClockDivider.\n   \n  For example, say you wanted to drive a DC motor with PWM at about 1kHz, \n  and control the speed in 1/1024 increments from \n  0/1024 (stopped) through to 1024/1024 (full on). In that case you might set the \n  clock divider to be 16, and the RANGE to 1024. The pulse repetition frequency will be\n  1.2MHz/1024 = 1171.875Hz.\n  \n  \\par Interactions with other systems\n \n  In order for bcm2835 library SPI to work, you may need to disable the SPI kernel module using:\n\n  \\code\n  sudo raspi-config\n   under Advanced Options - enable Device Tree\n   under Advanced Options - disable SPI\n   Reboot.\n  \\endcode\n\n  Since bcm2835 accesses the lowest level hardware interfaces (in eh intererests of speed and flexibility)\n  there can be intercations with other low level software trying to do similar things.\n\n  It seems that with \"latest\" 8.0 Jessie 4.9.24-v7+ kernel PWM just won't \n  work unless you disable audio. There's a line\n  \\code\n  dtparam=audio=on\n  \\endcode\n  in the /boot/config.txt. \n  Comment it out like this:\n  \\code\n  #dtparam=audio=on\n  \\endcode\n\n  \\par Real Time performance constraints\n  \n  The bcm2835 is a library for user programs (i.e. they run in 'userland'). \n  Such programs are not part of the kernel and are usually\n  subject to paging and swapping by the kernel while it does other things besides running your program. \n  This means that you should not expect to get real-time performance or \n  real-time timing constraints from such programs. In particular, there is no guarantee that the \n  bcm2835_delay() and bcm2835_delayMicroseconds() will return after exactly the time requested. \n  In fact, depending on other activity on the host, IO etc, you might get significantly longer delay times\n  than the one you asked for. So please dont expect to get exactly the time delay you request.\n  \n  Arjan reports that you can prevent swapping on Linux with the following code fragment:\n  \n  \\code\n  #define <sched.h>\n  #define <sys/mman.h>\n\n  struct sched_param sp;\n  memset(&sp, 0, sizeof(sp));\n  sp.sched_priority = sched_get_priority_max(SCHED_FIFO);\n  sched_setscheduler(0, SCHED_FIFO, &sp);\n  mlockall(MCL_CURRENT | MCL_FUTURE);\n  \\endcode\n  \n  \\par Crashing on some versions of Raspbian\n  Some people have reported that various versions of Rasbian will crash or hang \n  if certain GPIO pins are toggled: https://github.com/raspberrypi/linux/issues/2550\n  when using bcm2835.\n  A workaround is to add this line to your /boot/config.txt:\n  \\code\n    dtoverlay=gpio-no-irq\n  \\endcode\n\n  \\par Bindings to other languages\n  \n  mikem has made Perl bindings available at CPAN:\n  http://search.cpan.org/~mikem/Device-BCM2835-1.9/lib/Device/BCM2835.pm\n  Matthew Baker has kindly made Python bindings available at:\n  https:  github.com/mubeta06/py-libbcm2835\n  Gary Marks has created a Serial Peripheral Interface (SPI) command-line utility \n  for Raspberry Pi, based on the bcm2835 library. The \n  utility, spincl, is licensed under Open Source GNU GPLv3 by iP Solutions (http://ipsolutionscorp.com), as a \n  free download with source included: http://ipsolutionscorp.com/raspberry-pi-spi-utility/\n  \n  \\par Open Source Licensing GPL V3\n  \n  This is the appropriate option if you want to share the source code of your\n  application with everyone you distribute it to, and you also want to give them\n  the right to share who uses it. If you wish to use this software under Open\n  Source Licensing, you must contribute all your source code to the open source\n  community in accordance with the GPL Version 3 when your application is\n  distributed. See https://www.gnu.org/licenses/gpl-3.0.html and COPYING\n  \n  \\par Commercial Licensing\n\n This is the appropriate option if you are creating proprietary applications\n and you are not prepared to distribute and share the source code of your\n application. To purchase a commercial license, contact info@airspayce.com\n\n  \\par Acknowledgements\n  \n  Some of this code has been inspired by Dom and Gert.\n  The I2C code has been inspired by Alan Barr.\n   \n  \\par Revision History\n  \n  \\version 1.0 Initial release\n\n  \\version 1.1 Minor bug fixes\n\n  \\version 1.2 Added support for SPI\n\n  \\version 1.3 Added bcm2835_spi_transfern()\n\n  \\version 1.4 Fixed a problem that prevented SPI CE1 being used. Reported by David Robinson.\n\n  \\version 1.5 Added bcm2835_close() to deinit the library. Suggested by C?sar Ortiz\n\n  \\version 1.6 Document testing on 2012-07-15-wheezy-raspbian and Occidentalisv01\n  Functions bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen()\n  bcm2835_gpio_len(), bcm2835_gpio_aren() and bcm2835_gpio_afen() now \n  changes only the pin specified. Other pins that were already previously\n  enabled stay enabled.\n  Added  bcm2835_gpio_clr_ren(), bcm2835_gpio_clr_fen(), bcm2835_gpio_clr_hen()\n  bcm2835_gpio_clr_len(), bcm2835_gpio_clr_aren(), bcm2835_gpio_clr_afen() \n  to clear the enable for individual pins, suggested by Andreas Sundstrom.\n\n  \\version 1.7 Added bcm2835_spi_transfernb to support different buffers for read and write.\n\n  \\version 1.8 Improvements to read barrier, as suggested by maddin.\n\n  \\version 1.9 Improvements contributed by mikew: \n  I noticed that it was mallocing memory for the mmaps on /dev/mem.\n  It's not necessary to do that, you can just mmap the file directly,\n  so I've removed the mallocs (and frees).\n  I've also modified delayMicroseconds() to use nanosleep() for long waits,\n  and a busy wait on a high resolution timer for the rest. This is because\n  I've found that calling nanosleep() takes at least 100-200 us.\n  You need to link using '-lrt' using this version.\n  I've added some unsigned casts to the debug prints to silence compiler\n  warnings I was getting, fixed some typos, and changed the value of\n  BCM2835_PAD_HYSTERESIS_ENABLED to 0x08 as per Gert van Loo's doc at\n  http://www.scribd.com/doc/101830961/GPIO-Pads-Control2\n  Also added a define for the passwrd value that Gert says is needed to\n  change pad control settings.\n\n  \\version 1.10 Changed the names of the delay functions to bcm2835_delay() \n  and bcm2835_delayMicroseconds() to prevent collisions with wiringPi.\n  Macros to map delay()-> bcm2835_delay() and\n  Macros to map delayMicroseconds()-> bcm2835_delayMicroseconds(), which\n  can be disabled by defining BCM2835_NO_DELAY_COMPATIBILITY\n\n  \\version 1.11 Fixed incorrect link to download file\n\n  \\version 1.12 New GPIO pin definitions for RPi version 2 (which has a different GPIO mapping)             \n\n  \\version 1.13 New GPIO pin definitions for RPi version 2 plug P5\n  Hardware base pointers are now available (after initialisation) externally as bcm2835_gpio\n  bcm2835_pwm bcm2835_clk bcm2835_pads bcm2835_spi0.\n\n  \\version 1.14 Now compiles even if CLOCK_MONOTONIC_RAW is not available, uses CLOCK_MONOTONIC instead.\n  Fixed errors in documentation of SPI divider frequencies based on 250MHz clock. \n  Reported by Ben Simpson.\n\n  \\version 1.15 Added bcm2835_close() to end of examples as suggested by Mark Wolfe.\n\n  \\version 1.16 Added bcm2835_gpio_set_multi, bcm2835_gpio_clr_multi and bcm2835_gpio_write_multi\n  to allow a mask of pins to be set all at once. Requested by Sebastian Loncar.\n\n  \\version 1.17  Added bcm2835_gpio_write_mask. Requested by Sebastian Loncar.\n\n  \\version 1.18 Added bcm2835_i2c_* functions. Changes to bcm2835_delayMicroseconds: \n  now uses the RPi system timer counter, instead of clock_gettime, for improved accuracy. \n  No need to link with -lrt now. Contributed by Arjan van Vught.\n  \\version 1.19 Removed inlines added by previous patch since they don't seem to work everywhere. \n  Reported by olly.\n\n  \\version 1.20 Patch from Mark Dootson to close /dev/mem after access to the peripherals has been granted.\n\n  \\version 1.21 delayMicroseconds is now not susceptible to 32 bit timer overruns. \n  Patch courtesy Jeremy Mortis.\n\n  \\version 1.22 Fixed incorrect definition of BCM2835_GPFEN0 which broke the ability to set \n  falling edge events. Reported by Mark Dootson.\n\n  \\version 1.23 Added bcm2835_i2c_set_baudrate and bcm2835_i2c_read_register_rs. \n  Improvements to bcm2835_i2c_read and bcm2835_i2c_write functions\n  to fix ocasional reads not completing. Patched by Mark Dootson.\n\n  \\version 1.24 Mark Dootson p[atched a problem with his previously submitted code\n  under high load from other processes. \n\n  \\version 1.25 Updated author and distribution location details to airspayce.com\n\n  \\version 1.26 Added missing unmapmem for pads in bcm2835_close to prevent a memory leak. \n  Reported by Hartmut Henkel.\n\n  \\version 1.27 bcm2835_gpio_set_pad() no longer needs BCM2835_PAD_PASSWRD: it is\n  now automatically included.\n  Added support for PWM mode with bcm2835_pwm_* functions.\n\n  \\version 1.28 Fixed a problem where bcm2835_spi_writenb() would have problems with transfers of more than\n  64 bytes dues to read buffer filling. Patched by Peter Würtz.\n\n  \\version 1.29 Further fix to SPI from Peter Würtz.\n\n  \\version 1.30 10 microsecond delays from bcm2835_spi_transfer and bcm2835_spi_transfern for\n  significant performance improvements, Patch by Alan Watson.\n\n  \\version 1.31 Fix a GCC warning about dummy variable, patched by Alan Watson. Thanks.\n\n  \\version 1.32 Added option I2C_V1 definition to compile for version 1 RPi. \n  By default I2C code is generated for the V2 RPi which has SDA1 and SCL1 connected.\n  Contributed by Malcolm Wiles based on work by Arvi Govindaraj.\n\n  \\version 1.33 Added command line utilities i2c and gpio to examples. Contributed by Shahrooz Shahparnia.\n\n  \\version 1.34 Added bcm2835_i2c_write_read_rs() which writes an arbitrary number of bytes, \n  sends a repeat start, and reads from the device. Contributed by Eduardo Steinhorst.\n\n  \\version 1.35 Fix build errors when compiled under Qt. Also performance improvements with SPI transfers. Contributed b Udo Klaas.\n\n  \\version 1.36 Make automake's test runner detect that we're skipping tests when not root, the second\n  one makes us skip the test when using fakeroot (as used when building\n  Debian packages). Contributed by Guido Günther.\n\n  \\version 1.37 Moved confiure.in to configure.ac as receommnded by autoreconf.<br>\n  Improvements to bcm2835_st_read to account for possible timer overflow, contributed by 'Ed'.<br>\n  Added definitions for Raspberry Pi B+ J8 header GPIO pins.<br>\n\n  \\version 1.38 Added bcm2835_regbase for the benefit of C# wrappers, patch by Frank Hommers <br>\n\n  \\version 1.39 Beta version of RPi2 compatibility. Not tested here on RPi2 hardware. \n  Testers please confirm correct operation on RPi2.<br>\n  Unnecessary 'volatile' qualifiers removed from all variables and signatures.<br>\n  Removed unsupportable PWM dividers, based on a report from Christophe Cecillon.<br>\n  Minor improvements to spi.c example.<br>\n\n  \\version 1.40 Correct operation on RPi2 has been confirmed.<br>\n  Fixed a number of compiler errors and warnings that occur when bcm2835.h is included\n  in code compiled with -Wall -Woverflow -Wstrict-overflow -Wshadow -Wextra -pedantic.\n  Reported by tlhackque.<br>\n  Fixed a problem where calling bcm2835_delayMicroseconds loops forever when debug is set. Reported by tlhackque.<br>\n  Reinstated use of volatile in 2 functions where there was a danger of lost reads or writes. Reported by tlhackque.<br>\n  \n  \\version 1.41 Added BCM2835_VERSION macro and new function bcm2835_version(); Requested by tlhackque.<br>\n  Improvements to peripheral memory barriers as suggested by tlhackque.<br>\n  Reinstated some necessary volatile declarations as requested by tlhackque.<br>\n\n  \\version 1.42 Further improvements to memory barriers with the patient assistance and patches of tlhackque.<br>\n\n  \\version 1.43 Fixed problems with compiling barriers on RPI 2 with Arch Linux and gcc 4.9.2. \n  Reported and patched by Lars Christensen.<br>\n  Testing on RPI 2, with ArchLinuxARM-rpi-2-latest and 2015-02-16-raspbian-wheezy.<br>\n\n  \\version 1.44 Added documention about the need for device tree to be enabled on RPI2.<br>\n  Improvements to detection of availability of DMB instruction based on value of __ARM_ARCH macro.<br>\n\n  \\version 1.45 Fixed an error in the pad group offsets that would prevent bcm2835_gpio_set_pad() \n  and bcm2835_gpio_pad() working correctly with non-0 pad groups. Reported by Guido.\n\n  \\version 1.46 2015-09-18\n  Added symbolic definitions for remaining pins on 40 pin GPIO header on RPi 2. <br>\n\n  \\version 1.47 2015-11-18\n  Fixed possibly incorrect reads in bcm2835_i2c_read_register_rs, patch from Eckhardt Ulrich.<br>\n\n  \\version 1.48 2015-12-08\n  Added patch from Eckhardt Ulrich that fixed problems that could cause hanging with bcm2835_i2c_read_register_rs\n  and others.\n\n  \\version 1.49 2016-01-05\n  Added patch from Jonathan Perkin with new functions bcm2835_gpio_eds_multi() and bcm2835_gpio_set_eds_multi().\n\n  \\version 1.50 2016-02-28\n  Added support for running as non-root, permitting access to GPIO only. Functions\n  bcm2835_spi_begin() and bcm2835_i2c_begin() will now return 0 if not running as root \n  (which prevents access to the SPI and I2C peripherals, amongst others). \n  Testing on Raspbian Jessie.\n\n  \\version 1.51 2016-11-03\n  Added documentation about SPI clock divider and resulting SPI speeds on RPi3.\n  Fixed a problem where seg fault could occur in bcm2835_delayMicroseconds() if not running as root. Patch from Pok.\n\n  \\version 1.52 2017-02-03\n  Added link to commercial license purchasing.\n\n  \\version 1.53 2018-01-14\n  Added support for AUX SPI (SPI1)\n  Contributed by Arjan van Vught (http://www.raspberrypi-dmx.org/)\n\n  \\version 1.54 2018-01-17\n  Fixed compile errors in new AUX spi code under some circumstances.\n\n  \\version 1.55 2018-01-20\n  Fixed version numbers.\n  Fixed some warnings.\n\n  \\version 1.56 2018-06-10\n  Supports bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_LSBFIRST), after which SPI bytes are reversed on read or write.\n  Based on a suggestion by Damiano Benedetti.\n  \n  \\version 1.57 2018-08-28\n  Added SPI function bcm2835_spi_set_speed_hz(uint32_t speed_hz);\n  Contributed by Arjan van Vught (http://www.raspberrypi-dmx.org/)\n\n  \\version 1.58 2018-11-29\n  Added examples/spiram, which shows how to use the included little library (spiram.c and spiram.h)\n  to read and write SPI RAM chips such as 23K256-I/P\n\n  \\version 1.59 2019-05-22\n  Fixed a bug in bcm2835_i2c_read reported by Charles Hayward where a noisy I2C line cold cause a seg fault by\n  reading too many characters.\n  \n  \\version 1.60 2019-07-23\n  Applied patch from Mark Dootson for RPi 4 compatibility. Thanks Mark. Not tested here on RPi4, but others report it works.\n  Tested as still working correctly on earlier RPi models. Tested with Debian Buster on earlier models\n\n  \\version 1.61 2020-01-11\n  Fixed errors in the documentation for bcm2835_spi_write.\n  Fixes issue seen on Raspberry Pi 4 boards where 64-bit off_t is used by\n  default via -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64.  The offset was\n  being incorrectly converted, this way is clearer and fixes the problem. Contributed by Jonathan Perkin.\n\n  \\version 1.62 2020-01-12\n  Fixed a problem that could cause compile failures with size_t and off_t\n\n  \\version 1.63 2020-03-07\n  Added bcm2835_aux_spi_transfer, contributed by Michivi\n  Adopted GPL V3 licensing\n\n  \\version 1.64 2020-04-11\n  Fixed error in definitions of BCM2835_AUX_SPI_STAT_TX_LVL and BCM2835_AUX_SPI_STAT_RX_LVL. Patch from \n  Eric Marzec. Thanks.\n\n  \\version 1.65, 1.66 2020-04-16\n  Added support for use of capability  cap_sys_rawio to determine if access to /dev/mem is available for non-root\n  users. Contributed by Doug McFadyen.\n\n  \\version 1.67, 1.66 2020-06-11\n  Fixed an error in bcm2835_i2c_read() where the status byte was not correctly updated with BCM2835_BSC_S_DONE\n  Reported by Zihan. Thanks.\n\n  \\author  Mike McCauley (mikem@airspayce.com) DO NOT CONTACT THE AUTHOR DIRECTLY: USE THE LISTS\n*/\n\n\n/* Defines for BCM2835 */\n#ifndef BCM2835_H\n#define BCM2835_H\n\n#include <stdint.h>\n\n#define BCM2835_VERSION 10066 /* Version 1.66 */\n\n// Define this if you want to use libcap2 to determine if you have the cap_sys_rawio capability\n// and therefore the capability of opening /dev/mem, even if you are not root.\n// See the comments above in the documentation for 'Running As Root'\n//#define BCM2835_HAVE_LIBCAP\n\n/* RPi 2 is ARM v7, and has DMB instruction for memory barriers.\n   Older RPis are ARM v6 and don't, so a coprocessor instruction must be used instead.\n   However, not all versions of gcc in all distros support the dmb assembler instruction even on compatible processors.\n   This test is so any ARMv7 or higher processors with suitable GCC will use DMB.\n*/\n#if __ARM_ARCH >= 7\n#define BCM2835_HAVE_DMB\n#endif\n\n/*! \\defgroup constants Constants for passing to and from library functions\n  The values here are designed to be passed to various functions in the bcm2835 library.\n  @{\n*/\n\n/*! This means pin HIGH, true, 3.3volts on a pin. */\n#define HIGH 0x1\n/*! This means pin LOW, false, 0volts on a pin. */\n#define LOW  0x0\n\n/*! Return the minimum of 2 numbers */\n#ifndef MIN\n#define MIN(a, b) (a < b ? a : b)\n#endif\n\n/*! Speed of the core clock core_clk */\n#define BCM2835_CORE_CLK_HZ\t\t250000000\t/*!< 250 MHz */\n\n/*! On all recent OSs, the base of the peripherals is read from a /proc file */\n#define BMC2835_RPI2_DT_FILENAME \"/proc/device-tree/soc/ranges\"\n\n/*! Physical addresses for various peripheral register sets\n  Base Physical Address of the BCM 2835 peripheral registers\n  Note this is different for the RPi2 BCM2836, where this is derived from /proc/device-tree/soc/ranges\n  If /proc/device-tree/soc/ranges exists on a RPi 1 OS, it would be expected to contain the\n  following numbers:\n*/\n/*! Peripherals block base address on RPi 1 */\n#define BCM2835_PERI_BASE               0x20000000\n/*! Size of the peripherals block on RPi 1 */\n#define BCM2835_PERI_SIZE               0x01000000\n/*! Alternate base address for RPI  2 / 3 */\n#define BCM2835_RPI2_PERI_BASE          0x3F000000\n/*! Alternate base address for RPI  4 */\n#define BCM2835_RPI4_PERI_BASE          0xFE000000\n/*! Alternate size for RPI  4 */\n#define BCM2835_RPI4_PERI_SIZE          0x01800000\n\n/*! Offsets for the bases of various peripherals within the peripherals block\n  /   Base Address of the System Timer registers\n*/\n#define BCM2835_ST_BASE\t\t\t\t\t0x3000\n/*! Base Address of the Pads registers */\n#define BCM2835_GPIO_PADS               0x100000\n/*! Base Address of the Clock/timer registers */\n#define BCM2835_CLOCK_BASE              0x101000\n/*! Base Address of the GPIO registers */\n#define BCM2835_GPIO_BASE               0x200000\n/*! Base Address of the SPI0 registers */\n#define BCM2835_SPI0_BASE               0x204000\n/*! Base Address of the BSC0 registers */\n#define BCM2835_BSC0_BASE \t\t\t\t0x205000\n/*! Base Address of the PWM registers */\n#define BCM2835_GPIO_PWM                0x20C000\n/*! Base Address of the AUX registers */\n#define BCM2835_AUX_BASE\t\t\t\t0x215000\n/*! Base Address of the AUX_SPI1 registers */\n#define BCM2835_SPI1_BASE\t\t\t\t0x215080\n/*! Base Address of the AUX_SPI2 registers */\n#define BCM2835_SPI2_BASE\t\t\t\t0x2150C0\n/*! Base Address of the BSC1 registers */\n#define BCM2835_BSC1_BASE\t\t\t\t0x804000\n\n#include <stdlib.h>\n\n/*! Physical address and size of the peripherals block\n  May be overridden on RPi2\n*/\nextern off_t bcm2835_peripherals_base;\n/*! Size of the peripherals block to be mapped */\nextern size_t bcm2835_peripherals_size;\n\n/*! Virtual memory address of the mapped peripherals block */\nextern uint32_t *bcm2835_peripherals;\n\n/*! Base of the ST (System Timer) registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_st;\n\n/*! Base of the GPIO registers.\n  Available after bcm2835_init has been called\n*/\nextern volatile uint32_t *bcm2835_gpio;\n\n/*! Base of the PWM registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_pwm;\n\n/*! Base of the CLK registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_clk;\n\n/*! Base of the PADS registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_pads;\n\n/*! Base of the SPI0 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_spi0;\n\n/*! Base of the BSC0 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_bsc0;\n\n/*! Base of the BSC1 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_bsc1;\n\n/*! Base of the AUX registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_aux;\n\n/*! Base of the SPI1 registers.\n  Available after bcm2835_init has been called (as root)\n*/\nextern volatile uint32_t *bcm2835_spi1;\n\n\n/*! \\brief bcm2835RegisterBase\n  Register bases for bcm2835_regbase()\n*/\ntypedef enum\n{\n    BCM2835_REGBASE_ST   = 1, /*!< Base of the ST (System Timer) registers. */\n    BCM2835_REGBASE_GPIO = 2, /*!< Base of the GPIO registers. */\n    BCM2835_REGBASE_PWM  = 3, /*!< Base of the PWM registers. */\n    BCM2835_REGBASE_CLK  = 4, /*!< Base of the CLK registers. */\n    BCM2835_REGBASE_PADS = 5, /*!< Base of the PADS registers. */\n    BCM2835_REGBASE_SPI0 = 6, /*!< Base of the SPI0 registers. */\n    BCM2835_REGBASE_BSC0 = 7, /*!< Base of the BSC0 registers. */\n    BCM2835_REGBASE_BSC1 = 8,  /*!< Base of the BSC1 registers. */\n\tBCM2835_REGBASE_AUX  = 9,  /*!< Base of the AUX registers. */\n\tBCM2835_REGBASE_SPI1 = 10  /*!< Base of the SPI1 registers. */\n} bcm2835RegisterBase;\n\n/*! Size of memory page on RPi */\n#define BCM2835_PAGE_SIZE               (4*1024)\n/*! Size of memory block on RPi */\n#define BCM2835_BLOCK_SIZE              (4*1024)\n\n\n/* Defines for GPIO\n   The BCM2835 has 54 GPIO pins.\n   BCM2835 data sheet, Page 90 onwards.\n*/\n/*! GPIO register offsets from BCM2835_GPIO_BASE. \n  Offsets into the GPIO Peripheral block in bytes per 6.1 Register View \n*/\n#define BCM2835_GPFSEL0                      0x0000 /*!< GPIO Function Select 0 */\n#define BCM2835_GPFSEL1                      0x0004 /*!< GPIO Function Select 1 */\n#define BCM2835_GPFSEL2                      0x0008 /*!< GPIO Function Select 2 */\n#define BCM2835_GPFSEL3                      0x000c /*!< GPIO Function Select 3 */\n#define BCM2835_GPFSEL4                      0x0010 /*!< GPIO Function Select 4 */\n#define BCM2835_GPFSEL5                      0x0014 /*!< GPIO Function Select 5 */\n#define BCM2835_GPSET0                       0x001c /*!< GPIO Pin Output Set 0 */\n#define BCM2835_GPSET1                       0x0020 /*!< GPIO Pin Output Set 1 */\n#define BCM2835_GPCLR0                       0x0028 /*!< GPIO Pin Output Clear 0 */\n#define BCM2835_GPCLR1                       0x002c /*!< GPIO Pin Output Clear 1 */\n#define BCM2835_GPLEV0                       0x0034 /*!< GPIO Pin Level 0 */\n#define BCM2835_GPLEV1                       0x0038 /*!< GPIO Pin Level 1 */\n#define BCM2835_GPEDS0                       0x0040 /*!< GPIO Pin Event Detect Status 0 */\n#define BCM2835_GPEDS1                       0x0044 /*!< GPIO Pin Event Detect Status 1 */\n#define BCM2835_GPREN0                       0x004c /*!< GPIO Pin Rising Edge Detect Enable 0 */\n#define BCM2835_GPREN1                       0x0050 /*!< GPIO Pin Rising Edge Detect Enable 1 */\n#define BCM2835_GPFEN0                       0x0058 /*!< GPIO Pin Falling Edge Detect Enable 0 */\n#define BCM2835_GPFEN1                       0x005c /*!< GPIO Pin Falling Edge Detect Enable 1 */\n#define BCM2835_GPHEN0                       0x0064 /*!< GPIO Pin High Detect Enable 0 */\n#define BCM2835_GPHEN1                       0x0068 /*!< GPIO Pin High Detect Enable 1 */\n#define BCM2835_GPLEN0                       0x0070 /*!< GPIO Pin Low Detect Enable 0 */\n#define BCM2835_GPLEN1                       0x0074 /*!< GPIO Pin Low Detect Enable 1 */\n#define BCM2835_GPAREN0                      0x007c /*!< GPIO Pin Async. Rising Edge Detect 0 */\n#define BCM2835_GPAREN1                      0x0080 /*!< GPIO Pin Async. Rising Edge Detect 1 */\n#define BCM2835_GPAFEN0                      0x0088 /*!< GPIO Pin Async. Falling Edge Detect 0 */\n#define BCM2835_GPAFEN1                      0x008c /*!< GPIO Pin Async. Falling Edge Detect 1 */\n#define BCM2835_GPPUD                        0x0094 /*!< GPIO Pin Pull-up/down Enable */\n#define BCM2835_GPPUDCLK0                    0x0098 /*!< GPIO Pin Pull-up/down Enable Clock 0 */\n#define BCM2835_GPPUDCLK1                    0x009c /*!< GPIO Pin Pull-up/down Enable Clock 1 */\n\n/* 2711 has a different method for pin pull-up/down/enable  */\n#define BCM2835_GPPUPPDN0                    0x00e4 /* Pin pull-up/down for pins 15:0  */\n#define BCM2835_GPPUPPDN1                    0x00e8 /* Pin pull-up/down for pins 31:16 */\n#define BCM2835_GPPUPPDN2                    0x00ec /* Pin pull-up/down for pins 47:32 */\n#define BCM2835_GPPUPPDN3                    0x00f0 /* Pin pull-up/down for pins 57:48 */\n\n/*!   \\brief bcm2835PortFunction\n  Port function select modes for bcm2835_gpio_fsel()\n*/\ntypedef enum\n{\n    BCM2835_GPIO_FSEL_INPT  = 0x00,   /*!< Input 0b000 */\n    BCM2835_GPIO_FSEL_OUTP  = 0x01,   /*!< Output 0b001 */\n    BCM2835_GPIO_FSEL_ALT0  = 0x04,   /*!< Alternate function 0 0b100 */\n    BCM2835_GPIO_FSEL_ALT1  = 0x05,   /*!< Alternate function 1 0b101 */\n    BCM2835_GPIO_FSEL_ALT2  = 0x06,   /*!< Alternate function 2 0b110, */\n    BCM2835_GPIO_FSEL_ALT3  = 0x07,   /*!< Alternate function 3 0b111 */\n    BCM2835_GPIO_FSEL_ALT4  = 0x03,   /*!< Alternate function 4 0b011 */\n    BCM2835_GPIO_FSEL_ALT5  = 0x02,   /*!< Alternate function 5 0b010 */\n    BCM2835_GPIO_FSEL_MASK  = 0x07    /*!< Function select bits mask 0b111 */\n} bcm2835FunctionSelect;\n\n/*! \\brief bcm2835PUDControl\n  Pullup/Pulldown defines for bcm2835_gpio_pud()\n*/\ntypedef enum\n{\n    BCM2835_GPIO_PUD_OFF     = 0x00,   /*!< Off ? disable pull-up/down 0b00 */\n    BCM2835_GPIO_PUD_DOWN    = 0x01,   /*!< Enable Pull Down control 0b01 */\n    BCM2835_GPIO_PUD_UP      = 0x02    /*!< Enable Pull Up control 0b10  */\n} bcm2835PUDControl;\n\n/* need a value for pud functions that can't work unless RPI 4 */\n#define BCM2835_GPIO_PUD_ERROR  0x08 \n\n/*! Pad control register offsets from BCM2835_GPIO_PADS */\n#define BCM2835_PADS_GPIO_0_27               0x002c /*!< Pad control register for pads 0 to 27 */\n#define BCM2835_PADS_GPIO_28_45              0x0030 /*!< Pad control register for pads 28 to 45 */\n#define BCM2835_PADS_GPIO_46_53              0x0034 /*!< Pad control register for pads 46 to 53 */\n\n/*! Pad Control masks */\n#define BCM2835_PAD_PASSWRD                  (0x5A << 24)  /*!< Password to enable setting pad mask */\n#define BCM2835_PAD_SLEW_RATE_UNLIMITED      0x10 /*!< Slew rate unlimited */\n#define BCM2835_PAD_HYSTERESIS_ENABLED       0x08 /*!< Hysteresis enabled */\n#define BCM2835_PAD_DRIVE_2mA                0x00 /*!< 2mA drive current */\n#define BCM2835_PAD_DRIVE_4mA                0x01 /*!< 4mA drive current */\n#define BCM2835_PAD_DRIVE_6mA                0x02 /*!< 6mA drive current */\n#define BCM2835_PAD_DRIVE_8mA                0x03 /*!< 8mA drive current */\n#define BCM2835_PAD_DRIVE_10mA               0x04 /*!< 10mA drive current */\n#define BCM2835_PAD_DRIVE_12mA               0x05 /*!< 12mA drive current */\n#define BCM2835_PAD_DRIVE_14mA               0x06 /*!< 14mA drive current */\n#define BCM2835_PAD_DRIVE_16mA               0x07 /*!< 16mA drive current */\n\n/*! \\brief bcm2835PadGroup\n  Pad group specification for bcm2835_gpio_pad()\n*/\ntypedef enum\n{\n    BCM2835_PAD_GROUP_GPIO_0_27         = 0, /*!< Pad group for GPIO pads 0 to 27 */\n    BCM2835_PAD_GROUP_GPIO_28_45        = 1, /*!< Pad group for GPIO pads 28 to 45 */\n    BCM2835_PAD_GROUP_GPIO_46_53        = 2  /*!< Pad group for GPIO pads 46 to 53 */\n} bcm2835PadGroup;\n\n/*! \\brief GPIO Pin Numbers\n  \n  Here we define Raspberry Pin GPIO pins on P1 in terms of the underlying BCM GPIO pin numbers.\n  These can be passed as a pin number to any function requiring a pin.\n  Not all pins on the RPi 26 bin IDE plug are connected to GPIO pins\n  and some can adopt an alternate function.\n  RPi version 2 has some slightly different pinouts, and these are values RPI_V2_*.\n  RPi B+ has yet differnet pinouts and these are defined in RPI_BPLUS_*.\n  At bootup, pins 8 and 10 are set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively\n  When SPI0 is in use (ie after bcm2835_spi_begin()), SPI0 pins are dedicated to SPI\n  and cant be controlled independently.\n  If you are using the RPi Compute Module, just use the GPIO number: there is no need to use one of these\n  symbolic names\n*/\ntypedef enum\n{\n    RPI_GPIO_P1_03        =  0,  /*!< Version 1, Pin P1-03 */\n    RPI_GPIO_P1_05        =  1,  /*!< Version 1, Pin P1-05 */\n    RPI_GPIO_P1_07        =  4,  /*!< Version 1, Pin P1-07 */\n    RPI_GPIO_P1_08        = 14,  /*!< Version 1, Pin P1-08, defaults to alt function 0 UART0_TXD */\n    RPI_GPIO_P1_10        = 15,  /*!< Version 1, Pin P1-10, defaults to alt function 0 UART0_RXD */\n    RPI_GPIO_P1_11        = 17,  /*!< Version 1, Pin P1-11 */\n    RPI_GPIO_P1_12        = 18,  /*!< Version 1, Pin P1-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_GPIO_P1_13        = 21,  /*!< Version 1, Pin P1-13 */\n    RPI_GPIO_P1_15        = 22,  /*!< Version 1, Pin P1-15 */\n    RPI_GPIO_P1_16        = 23,  /*!< Version 1, Pin P1-16 */\n    RPI_GPIO_P1_18        = 24,  /*!< Version 1, Pin P1-18 */\n    RPI_GPIO_P1_19        = 10,  /*!< Version 1, Pin P1-19, MOSI when SPI0 in use */\n    RPI_GPIO_P1_21        =  9,  /*!< Version 1, Pin P1-21, MISO when SPI0 in use */\n    RPI_GPIO_P1_22        = 25,  /*!< Version 1, Pin P1-22 */\n    RPI_GPIO_P1_23        = 11,  /*!< Version 1, Pin P1-23, CLK when SPI0 in use */\n    RPI_GPIO_P1_24        =  8,  /*!< Version 1, Pin P1-24, CE0 when SPI0 in use */\n    RPI_GPIO_P1_26        =  7,  /*!< Version 1, Pin P1-26, CE1 when SPI0 in use */\n\n    /* RPi Version 2 */\n    RPI_V2_GPIO_P1_03     =  2,  /*!< Version 2, Pin P1-03 */\n    RPI_V2_GPIO_P1_05     =  3,  /*!< Version 2, Pin P1-05 */\n    RPI_V2_GPIO_P1_07     =  4,  /*!< Version 2, Pin P1-07 */\n    RPI_V2_GPIO_P1_08     = 14,  /*!< Version 2, Pin P1-08, defaults to alt function 0 UART0_TXD */\n    RPI_V2_GPIO_P1_10     = 15,  /*!< Version 2, Pin P1-10, defaults to alt function 0 UART0_RXD */\n    RPI_V2_GPIO_P1_11     = 17,  /*!< Version 2, Pin P1-11 */\n    RPI_V2_GPIO_P1_12     = 18,  /*!< Version 2, Pin P1-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_V2_GPIO_P1_13     = 27,  /*!< Version 2, Pin P1-13 */\n    RPI_V2_GPIO_P1_15     = 22,  /*!< Version 2, Pin P1-15 */\n    RPI_V2_GPIO_P1_16     = 23,  /*!< Version 2, Pin P1-16 */\n    RPI_V2_GPIO_P1_18     = 24,  /*!< Version 2, Pin P1-18 */\n    RPI_V2_GPIO_P1_19     = 10,  /*!< Version 2, Pin P1-19, MOSI when SPI0 in use */\n    RPI_V2_GPIO_P1_21     =  9,  /*!< Version 2, Pin P1-21, MISO when SPI0 in use */\n    RPI_V2_GPIO_P1_22     = 25,  /*!< Version 2, Pin P1-22 */\n    RPI_V2_GPIO_P1_23     = 11,  /*!< Version 2, Pin P1-23, CLK when SPI0 in use */\n    RPI_V2_GPIO_P1_24     =  8,  /*!< Version 2, Pin P1-24, CE0 when SPI0 in use */\n    RPI_V2_GPIO_P1_26     =  7,  /*!< Version 2, Pin P1-26, CE1 when SPI0 in use */\n    RPI_V2_GPIO_P1_29     =  5,  /*!< Version 2, Pin P1-29 */\n    RPI_V2_GPIO_P1_31     =  6,  /*!< Version 2, Pin P1-31 */\n    RPI_V2_GPIO_P1_32     = 12,  /*!< Version 2, Pin P1-32 */\n    RPI_V2_GPIO_P1_33     = 13,  /*!< Version 2, Pin P1-33 */\n    RPI_V2_GPIO_P1_35     = 19,  /*!< Version 2, Pin P1-35, can be PWM channel 1 in ALT FUN 5  */\n    RPI_V2_GPIO_P1_36     = 16,  /*!< Version 2, Pin P1-36 */\n    RPI_V2_GPIO_P1_37     = 26,  /*!< Version 2, Pin P1-37 */\n    RPI_V2_GPIO_P1_38     = 20,  /*!< Version 2, Pin P1-38 */\n    RPI_V2_GPIO_P1_40     = 21,  /*!< Version 2, Pin P1-40 */\n\n    /* RPi Version 2, new plug P5 */\n    RPI_V2_GPIO_P5_03     = 28,  /*!< Version 2, Pin P5-03 */\n    RPI_V2_GPIO_P5_04     = 29,  /*!< Version 2, Pin P5-04 */\n    RPI_V2_GPIO_P5_05     = 30,  /*!< Version 2, Pin P5-05 */\n    RPI_V2_GPIO_P5_06     = 31,  /*!< Version 2, Pin P5-06 */\n\n    /* RPi B+ J8 header, also RPi 2 40 pin GPIO header */\n    RPI_BPLUS_GPIO_J8_03     =  2,  /*!< B+, Pin J8-03 */\n    RPI_BPLUS_GPIO_J8_05     =  3,  /*!< B+, Pin J8-05 */\n    RPI_BPLUS_GPIO_J8_07     =  4,  /*!< B+, Pin J8-07 */\n    RPI_BPLUS_GPIO_J8_08     = 14,  /*!< B+, Pin J8-08, defaults to alt function 0 UART0_TXD */\n    RPI_BPLUS_GPIO_J8_10     = 15,  /*!< B+, Pin J8-10, defaults to alt function 0 UART0_RXD */\n    RPI_BPLUS_GPIO_J8_11     = 17,  /*!< B+, Pin J8-11 */\n    RPI_BPLUS_GPIO_J8_12     = 18,  /*!< B+, Pin J8-12, can be PWM channel 0 in ALT FUN 5 */\n    RPI_BPLUS_GPIO_J8_13     = 27,  /*!< B+, Pin J8-13 */\n    RPI_BPLUS_GPIO_J8_15     = 22,  /*!< B+, Pin J8-15 */\n    RPI_BPLUS_GPIO_J8_16     = 23,  /*!< B+, Pin J8-16 */\n    RPI_BPLUS_GPIO_J8_18     = 24,  /*!< B+, Pin J8-18 */\n    RPI_BPLUS_GPIO_J8_19     = 10,  /*!< B+, Pin J8-19, MOSI when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_21     =  9,  /*!< B+, Pin J8-21, MISO when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_22     = 25,  /*!< B+, Pin J8-22 */\n    RPI_BPLUS_GPIO_J8_23     = 11,  /*!< B+, Pin J8-23, CLK when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_24     =  8,  /*!< B+, Pin J8-24, CE0 when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_26     =  7,  /*!< B+, Pin J8-26, CE1 when SPI0 in use */\n    RPI_BPLUS_GPIO_J8_29     =  5,  /*!< B+, Pin J8-29,  */\n    RPI_BPLUS_GPIO_J8_31     =  6,  /*!< B+, Pin J8-31,  */\n    RPI_BPLUS_GPIO_J8_32     = 12,  /*!< B+, Pin J8-32,  */\n    RPI_BPLUS_GPIO_J8_33     = 13,  /*!< B+, Pin J8-33,  */\n    RPI_BPLUS_GPIO_J8_35     = 19,  /*!< B+, Pin J8-35, can be PWM channel 1 in ALT FUN 5 */\n    RPI_BPLUS_GPIO_J8_36     = 16,  /*!< B+, Pin J8-36,  */\n    RPI_BPLUS_GPIO_J8_37     = 26,  /*!< B+, Pin J8-37,  */\n    RPI_BPLUS_GPIO_J8_38     = 20,  /*!< B+, Pin J8-38,  */\n    RPI_BPLUS_GPIO_J8_40     = 21   /*!< B+, Pin J8-40,  */\n} RPiGPIOPin;\n\n/* Defines for AUX\n  GPIO register offsets from BCM2835_AUX_BASE.\n*/\n#define BCM2835_AUX_IRQ\t\t\t0x0000  /*!< xxx */\n#define BCM2835_AUX_ENABLE\t\t0x0004  /*!< */\n\n#define BCM2835_AUX_ENABLE_UART1\t0x01    /*!<  */\n#define BCM2835_AUX_ENABLE_SPI0\t\t0x02\t/*!< SPI0 (SPI1 in the device) */\n#define BCM2835_AUX_ENABLE_SPI1\t\t0x04\t/*!< SPI1 (SPI2 in the device) */\n\n\n#define BCM2835_AUX_SPI_CNTL0\t\t0x0000  /*!< */\n#define BCM2835_AUX_SPI_CNTL1 \t\t0x0004  /*!< */\n#define BCM2835_AUX_SPI_STAT \t\t0x0008  /*!< */\n#define BCM2835_AUX_SPI_PEEK\t\t0x000C  /*!< Read but do not take from FF */\n#define BCM2835_AUX_SPI_IO\t\t0x0020  /*!< Write = TX, read=RX */\n#define BCM2835_AUX_SPI_TXHOLD\t\t0x0030  /*!< Write = TX keep CS, read=RX */\n\n#define BCM2835_AUX_SPI_CLOCK_MIN\t30500\t\t/*!< 30,5kHz */\n#define BCM2835_AUX_SPI_CLOCK_MAX\t125000000 \t/*!< 125Mhz */\n\n#define BCM2835_AUX_SPI_CNTL0_SPEED\t0xFFF00000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SPEED_MAX\t0xFFF      /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SPEED_SHIFT 20        /*!< */\n\n#define BCM2835_AUX_SPI_CNTL0_CS0_N     0x000C0000 /*!< CS 0 low */\n#define BCM2835_AUX_SPI_CNTL0_CS1_N     0x000A0000 /*!< CS 1 low */\n#define BCM2835_AUX_SPI_CNTL0_CS2_N \t0x00060000 /*!< CS 2 low */\n\n#define BCM2835_AUX_SPI_CNTL0_POSTINPUT\t0x00010000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_VAR_CS\t0x00008000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_VAR_WIDTH\t0x00004000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_DOUTHOLD\t0x00003000  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_ENABLE\t0x00000800  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPHA_IN\t0x00000400  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CLEARFIFO\t0x00000200  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPHA_OUT\t0x00000100  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_CPOL\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_MSBF_OUT\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_CNTL0_SHIFTLEN\t0x0000003F  /*!< */\n\n#define BCM2835_AUX_SPI_CNTL1_CSHIGH\t0x00000700  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_IDLE\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_TXEMPTY\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_MSBF_IN\t0x00000002  /*!< */\n#define BCM2835_AUX_SPI_CNTL1_KEEP_IN\t0x00000001  /*!< */\n\n#define BCM2835_AUX_SPI_STAT_TX_LVL\t0xF0000000  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_LVL\t0x00F00000  /*!< */\n#define BCM2835_AUX_SPI_STAT_TX_FULL\t0x00000400  /*!< */\n#define BCM2835_AUX_SPI_STAT_TX_EMPTY\t0x00000200  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_FULL\t0x00000100  /*!< */\n#define BCM2835_AUX_SPI_STAT_RX_EMPTY\t0x00000080  /*!< */\n#define BCM2835_AUX_SPI_STAT_BUSY\t0x00000040  /*!< */\n#define BCM2835_AUX_SPI_STAT_BITCOUNT\t0x0000003F  /*!< */\n\n/* Defines for SPI\n   GPIO register offsets from BCM2835_SPI0_BASE. \n   Offsets into the SPI Peripheral block in bytes per 10.5 SPI Register Map\n*/\n#define BCM2835_SPI0_CS                      0x0000 /*!< SPI Master Control and Status */\n#define BCM2835_SPI0_FIFO                    0x0004 /*!< SPI Master TX and RX FIFOs */\n#define BCM2835_SPI0_CLK                     0x0008 /*!< SPI Master Clock Divider */\n#define BCM2835_SPI0_DLEN                    0x000c /*!< SPI Master Data Length */\n#define BCM2835_SPI0_LTOH                    0x0010 /*!< SPI LOSSI mode TOH */\n#define BCM2835_SPI0_DC                      0x0014 /*!< SPI DMA DREQ Controls */\n\n/* Register masks for SPI0_CS */\n#define BCM2835_SPI0_CS_LEN_LONG             0x02000000 /*!< Enable Long data word in Lossi mode if DMA_LEN is set */\n#define BCM2835_SPI0_CS_DMA_LEN              0x01000000 /*!< Enable DMA mode in Lossi mode */\n#define BCM2835_SPI0_CS_CSPOL2               0x00800000 /*!< Chip Select 2 Polarity */\n#define BCM2835_SPI0_CS_CSPOL1               0x00400000 /*!< Chip Select 1 Polarity */\n#define BCM2835_SPI0_CS_CSPOL0               0x00200000 /*!< Chip Select 0 Polarity */\n#define BCM2835_SPI0_CS_RXF                  0x00100000 /*!< RXF - RX FIFO Full */\n#define BCM2835_SPI0_CS_RXR                  0x00080000 /*!< RXR RX FIFO needs Reading (full) */\n#define BCM2835_SPI0_CS_TXD                  0x00040000 /*!< TXD TX FIFO can accept Data */\n#define BCM2835_SPI0_CS_RXD                  0x00020000 /*!< RXD RX FIFO contains Data */\n#define BCM2835_SPI0_CS_DONE                 0x00010000 /*!< Done transfer Done */\n#define BCM2835_SPI0_CS_TE_EN                0x00008000 /*!< Unused */\n#define BCM2835_SPI0_CS_LMONO                0x00004000 /*!< Unused */\n#define BCM2835_SPI0_CS_LEN                  0x00002000 /*!< LEN LoSSI enable */\n#define BCM2835_SPI0_CS_REN                  0x00001000 /*!< REN Read Enable */\n#define BCM2835_SPI0_CS_ADCS                 0x00000800 /*!< ADCS Automatically Deassert Chip Select */\n#define BCM2835_SPI0_CS_INTR                 0x00000400 /*!< INTR Interrupt on RXR */\n#define BCM2835_SPI0_CS_INTD                 0x00000200 /*!< INTD Interrupt on Done */\n#define BCM2835_SPI0_CS_DMAEN                0x00000100 /*!< DMAEN DMA Enable */\n#define BCM2835_SPI0_CS_TA                   0x00000080 /*!< Transfer Active */\n#define BCM2835_SPI0_CS_CSPOL                0x00000040 /*!< Chip Select Polarity */\n#define BCM2835_SPI0_CS_CLEAR                0x00000030 /*!< Clear FIFO Clear RX and TX */\n#define BCM2835_SPI0_CS_CLEAR_RX             0x00000020 /*!< Clear FIFO Clear RX  */\n#define BCM2835_SPI0_CS_CLEAR_TX             0x00000010 /*!< Clear FIFO Clear TX  */\n#define BCM2835_SPI0_CS_CPOL                 0x00000008 /*!< Clock Polarity */\n#define BCM2835_SPI0_CS_CPHA                 0x00000004 /*!< Clock Phase */\n#define BCM2835_SPI0_CS_CS                   0x00000003 /*!< Chip Select */\n\n/*! \\brief bcm2835SPIBitOrder SPI Bit order\n  Specifies the SPI data bit ordering for bcm2835_spi_setBitOrder()\n*/\ntypedef enum\n{\n    BCM2835_SPI_BIT_ORDER_LSBFIRST = 0,  /*!< LSB First */\n    BCM2835_SPI_BIT_ORDER_MSBFIRST = 1   /*!< MSB First */\n}bcm2835SPIBitOrder;\n\n/*! \\brief SPI Data mode\n  Specify the SPI data mode to be passed to bcm2835_spi_setDataMode()\n*/\ntypedef enum\n{\n    BCM2835_SPI_MODE0 = 0,  /*!< CPOL = 0, CPHA = 0 */\n    BCM2835_SPI_MODE1 = 1,  /*!< CPOL = 0, CPHA = 1 */\n    BCM2835_SPI_MODE2 = 2,  /*!< CPOL = 1, CPHA = 0 */\n    BCM2835_SPI_MODE3 = 3   /*!< CPOL = 1, CPHA = 1 */\n}bcm2835SPIMode;\n\n/*! \\brief bcm2835SPIChipSelect\n  Specify the SPI chip select pin(s)\n*/\ntypedef enum\n{\n    BCM2835_SPI_CS0 = 0,     /*!< Chip Select 0 */\n    BCM2835_SPI_CS1 = 1,     /*!< Chip Select 1 */\n    BCM2835_SPI_CS2 = 2,     /*!< Chip Select 2 (ie pins CS1 and CS2 are asserted) */\n    BCM2835_SPI_CS_NONE = 3  /*!< No CS, control it yourself */\n} bcm2835SPIChipSelect;\n\n/*! \\brief bcm2835SPIClockDivider\n  Specifies the divider used to generate the SPI clock from the system clock.\n  Figures below give the divider, clock period and clock frequency.\n  Clock divided is based on nominal core clock rate of 250MHz on RPi1 and RPi2, and 400MHz on RPi3.\n  It is reported that (contrary to the documentation) any even divider may used.\n  The frequencies shown for each divider have been confirmed by measurement on RPi1 and RPi2.\n  The system clock frequency on RPi3 is different, so the frequency you get from a given divider will be different.\n  See comments in 'SPI Pins' for information about reliable SPI speeds.\n  Note: it is possible to change the core clock rate of the RPi 3 back to 250MHz, by putting \n  \\code\n  core_freq=250\n  \\endcode\n  in the config.txt\n*/\ntypedef enum\n{\n    BCM2835_SPI_CLOCK_DIVIDER_65536 = 0,       /*!< 65536 = 3.814697260kHz on Rpi2, 6.1035156kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_32768 = 32768,   /*!< 32768 = 7.629394531kHz on Rpi2, 12.20703125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_16384 = 16384,   /*!< 16384 = 15.25878906kHz on Rpi2, 24.4140625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_8192  = 8192,    /*!< 8192 = 30.51757813kHz on Rpi2, 48.828125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_4096  = 4096,    /*!< 4096 = 61.03515625kHz on Rpi2, 97.65625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_2048  = 2048,    /*!< 2048 = 122.0703125kHz on Rpi2, 195.3125kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_1024  = 1024,    /*!< 1024 = 244.140625kHz on Rpi2, 390.625kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_512   = 512,     /*!< 512 = 488.28125kHz on Rpi2, 781.25kHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_256   = 256,     /*!< 256 = 976.5625kHz on Rpi2, 1.5625MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_128   = 128,     /*!< 128 = 1.953125MHz on Rpi2, 3.125MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_64    = 64,      /*!< 64 = 3.90625MHz on Rpi2, 6.250MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_32    = 32,      /*!< 32 = 7.8125MHz on Rpi2, 12.5MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_16    = 16,      /*!< 16 = 15.625MHz on Rpi2, 25MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_8     = 8,       /*!< 8 = 31.25MHz on Rpi2, 50MHz on RPI3 */\n    BCM2835_SPI_CLOCK_DIVIDER_4     = 4,       /*!< 4 = 62.5MHz on Rpi2, 100MHz on RPI3. Dont expect this speed to work reliably. */\n    BCM2835_SPI_CLOCK_DIVIDER_2     = 2,       /*!< 2 = 125MHz on Rpi2, 200MHz on RPI3, fastest you can get. Dont expect this speed to work reliably.*/\n    BCM2835_SPI_CLOCK_DIVIDER_1     = 1        /*!< 1 = 3.814697260kHz on Rpi2, 6.1035156kHz on RPI3, same as 0/65536 */\n} bcm2835SPIClockDivider;\n\n/* Defines for I2C\n   GPIO register offsets from BCM2835_BSC*_BASE.\n   Offsets into the BSC Peripheral block in bytes per 3.1 BSC Register Map\n*/\n#define BCM2835_BSC_C \t\t\t0x0000 /*!< BSC Master Control */\n#define BCM2835_BSC_S \t\t\t0x0004 /*!< BSC Master Status */\n#define BCM2835_BSC_DLEN\t\t0x0008 /*!< BSC Master Data Length */\n#define BCM2835_BSC_A \t\t\t0x000c /*!< BSC Master Slave Address */\n#define BCM2835_BSC_FIFO\t\t0x0010 /*!< BSC Master Data FIFO */\n#define BCM2835_BSC_DIV\t\t\t0x0014 /*!< BSC Master Clock Divider */\n#define BCM2835_BSC_DEL\t\t\t0x0018 /*!< BSC Master Data Delay */\n#define BCM2835_BSC_CLKT\t\t0x001c /*!< BSC Master Clock Stretch Timeout */\n\n/* Register masks for BSC_C */\n#define BCM2835_BSC_C_I2CEN \t\t0x00008000 /*!< I2C Enable, 0 = disabled, 1 = enabled */\n#define BCM2835_BSC_C_INTR \t\t0x00000400 /*!< Interrupt on RX */\n#define BCM2835_BSC_C_INTT \t\t0x00000200 /*!< Interrupt on TX */\n#define BCM2835_BSC_C_INTD \t\t0x00000100 /*!< Interrupt on DONE */\n#define BCM2835_BSC_C_ST \t\t0x00000080 /*!< Start transfer, 1 = Start a new transfer */\n#define BCM2835_BSC_C_CLEAR_1 \t\t0x00000020 /*!< Clear FIFO Clear */\n#define BCM2835_BSC_C_CLEAR_2 \t\t0x00000010 /*!< Clear FIFO Clear */\n#define BCM2835_BSC_C_READ \t\t0x00000001 /*!<\tRead transfer */\n\n/* Register masks for BSC_S */\n#define BCM2835_BSC_S_CLKT \t\t0x00000200 /*!< Clock stretch timeout */\n#define BCM2835_BSC_S_ERR \t\t0x00000100 /*!< ACK error */\n#define BCM2835_BSC_S_RXF \t\t0x00000080 /*!< RXF FIFO full, 0 = FIFO is not full, 1 = FIFO is full */\n#define BCM2835_BSC_S_TXE \t\t0x00000040 /*!< TXE FIFO full, 0 = FIFO is not full, 1 = FIFO is full */\n#define BCM2835_BSC_S_RXD \t\t0x00000020 /*!< RXD FIFO contains data */\n#define BCM2835_BSC_S_TXD \t\t0x00000010 /*!< TXD FIFO can accept data */\n#define BCM2835_BSC_S_RXR \t\t0x00000008 /*!< RXR FIFO needs reading (full) */\n#define BCM2835_BSC_S_TXW \t\t0x00000004 /*!< TXW FIFO needs writing (full) */\n#define BCM2835_BSC_S_DONE \t\t0x00000002 /*!< Transfer DONE */\n#define BCM2835_BSC_S_TA \t\t0x00000001 /*!< Transfer Active */\n\n#define BCM2835_BSC_FIFO_SIZE   \t16 /*!< BSC FIFO size */\n\n/*! \\brief bcm2835I2CClockDivider\n  Specifies the divider used to generate the I2C clock from the system clock.\n  Clock divided is based on nominal base clock rate of 250MHz\n*/\ntypedef enum\n{\n    BCM2835_I2C_CLOCK_DIVIDER_2500   = 2500,      /*!< 2500 = 10us = 100 kHz */\n    BCM2835_I2C_CLOCK_DIVIDER_626    = 626,       /*!< 622 = 2.504us = 399.3610 kHz */\n    BCM2835_I2C_CLOCK_DIVIDER_150    = 150,       /*!< 150 = 60ns = 1.666 MHz (default at reset) */\n    BCM2835_I2C_CLOCK_DIVIDER_148    = 148        /*!< 148 = 59ns = 1.689 MHz */\n} bcm2835I2CClockDivider;\n\n/*! \\brief bcm2835I2CReasonCodes\n  Specifies the reason codes for the bcm2835_i2c_write and bcm2835_i2c_read functions.\n*/\ntypedef enum\n{\n    BCM2835_I2C_REASON_OK   \t     = 0x00,      /*!< Success */\n    BCM2835_I2C_REASON_ERROR_NACK    = 0x01,      /*!< Received a NACK */\n    BCM2835_I2C_REASON_ERROR_CLKT    = 0x02,      /*!< Received Clock Stretch Timeout */\n    BCM2835_I2C_REASON_ERROR_DATA    = 0x04       /*!< Not all data is sent / received */\n} bcm2835I2CReasonCodes;\n\n/* Defines for ST\n   GPIO register offsets from BCM2835_ST_BASE.\n   Offsets into the ST Peripheral block in bytes per 12.1 System Timer Registers\n   The System Timer peripheral provides four 32-bit timer channels and a single 64-bit free running counter.\n   BCM2835_ST_CLO is the System Timer Counter Lower bits register.\n   The system timer free-running counter lower register is a read-only register that returns the current value\n   of the lower 32-bits of the free running counter.\n   BCM2835_ST_CHI is the System Timer Counter Upper bits register.\n   The system timer free-running counter upper register is a read-only register that returns the current value\n   of the upper 32-bits of the free running counter.\n*/\n#define BCM2835_ST_CS \t\t\t0x0000 /*!< System Timer Control/Status */\n#define BCM2835_ST_CLO \t\t\t0x0004 /*!< System Timer Counter Lower 32 bits */\n#define BCM2835_ST_CHI \t\t\t0x0008 /*!< System Timer Counter Upper 32 bits */\n\n/*! @} */\n\n\n/* Defines for PWM, word offsets (ie 4 byte multiples) */\n#define BCM2835_PWM_CONTROL 0\n#define BCM2835_PWM_STATUS  1\n#define BCM2835_PWM_DMAC    2\n#define BCM2835_PWM0_RANGE  4\n#define BCM2835_PWM0_DATA   5\n#define BCM2835_PWM_FIF1    6\n#define BCM2835_PWM1_RANGE  8\n#define BCM2835_PWM1_DATA   9\n\n/* Defines for PWM Clock, word offsets (ie 4 byte multiples) */\n#define BCM2835_PWMCLK_CNTL     40\n#define BCM2835_PWMCLK_DIV      41\n#define BCM2835_PWM_PASSWRD     (0x5A << 24)  /*!< Password to enable setting PWM clock */\n\n#define BCM2835_PWM1_MS_MODE    0x8000  /*!< Run in Mark/Space mode */\n#define BCM2835_PWM1_USEFIFO    0x2000  /*!< Data from FIFO */\n#define BCM2835_PWM1_REVPOLAR   0x1000  /*!< Reverse polarity */\n#define BCM2835_PWM1_OFFSTATE   0x0800  /*!< Ouput Off state */\n#define BCM2835_PWM1_REPEATFF   0x0400  /*!< Repeat last value if FIFO empty */\n#define BCM2835_PWM1_SERIAL     0x0200  /*!< Run in serial mode */\n#define BCM2835_PWM1_ENABLE     0x0100  /*!< Channel Enable */\n\n#define BCM2835_PWM0_MS_MODE    0x0080  /*!< Run in Mark/Space mode */\n#define BCM2835_PWM_CLEAR_FIFO  0x0040  /*!< Clear FIFO */\n#define BCM2835_PWM0_USEFIFO    0x0020  /*!< Data from FIFO */\n#define BCM2835_PWM0_REVPOLAR   0x0010  /*!< Reverse polarity */\n#define BCM2835_PWM0_OFFSTATE   0x0008  /*!< Ouput Off state */\n#define BCM2835_PWM0_REPEATFF   0x0004  /*!< Repeat last value if FIFO empty */\n#define BCM2835_PWM0_SERIAL     0x0002  /*!< Run in serial mode */\n#define BCM2835_PWM0_ENABLE     0x0001  /*!< Channel Enable */\n\n/*! \\brief bcm2835PWMClockDivider\n  Specifies the divider used to generate the PWM clock from the system clock.\n  Figures below give the divider, clock period and clock frequency.\n  Clock divided is based on nominal PWM base clock rate of 19.2MHz\n  The frequencies shown for each divider have been confirmed by measurement\n*/\ntypedef enum\n{\n    BCM2835_PWM_CLOCK_DIVIDER_2048  = 2048,    /*!< 2048 = 9.375kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_1024  = 1024,    /*!< 1024 = 18.75kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_512   = 512,     /*!< 512 = 37.5kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_256   = 256,     /*!< 256 = 75kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_128   = 128,     /*!< 128 = 150kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_64    = 64,      /*!< 64 = 300kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_32    = 32,      /*!< 32 = 600.0kHz */\n    BCM2835_PWM_CLOCK_DIVIDER_16    = 16,      /*!< 16 = 1.2MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_8     = 8,       /*!< 8 = 2.4MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_4     = 4,       /*!< 4 = 4.8MHz */\n    BCM2835_PWM_CLOCK_DIVIDER_2     = 2,       /*!< 2 = 9.6MHz, fastest you can get */\n    BCM2835_PWM_CLOCK_DIVIDER_1     = 1        /*!< 1 = 4.6875kHz, same as divider 4096 */\n} bcm2835PWMClockDivider;\n\n/* Historical name compatibility */\n#ifndef BCM2835_NO_DELAY_COMPATIBILITY\n#define delay(x) bcm2835_delay(x)\n#define delayMicroseconds(x) bcm2835_delayMicroseconds(x)\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    /*! \\defgroup init Library initialisation and management\n      These functions allow you to intialise and control the bcm2835 library\n      @{\n    */\n\n    /*! Initialise the library by opening /dev/mem (if you are root) \n      or /dev/gpiomem (if you are not)\n      and getting pointers to the \n      internal memory for BCM 2835 device registers. You must call this (successfully)\n      before calling any other \n      functions in this library (except bcm2835_set_debug). \n      If bcm2835_init() fails by returning 0, \n      calling any other function may result in crashes or other failures.\n      If bcm2835_init() succeeds but you are not running as root, then only gpio operations\n      are permitted, and calling any other functions may result in crashes or other failures. .\n      Prints messages to stderr in case of errors.\n      \\return 1 if successful else 0\n    */\n    extern int bcm2835_init(void);\n\n    /*! Close the library, deallocating any allocated memory and closing /dev/mem\n      \\return 1 if successful else 0\n    */\n    extern int bcm2835_close(void);\n\n    /*! Sets the debug level of the library.\n      A value of 1 prevents mapping to /dev/mem, and makes the library print out\n      what it would do, rather than accessing the GPIO registers.\n      A value of 0, the default, causes normal operation.\n      Call this before calling bcm2835_init();\n      \\param[in] debug The new debug level. 1 means debug\n    */\n    extern void  bcm2835_set_debug(uint8_t debug);\n\n    /*! Returns the version number of the library, same as BCM2835_VERSION\n       \\return the current library version number\n    */\n    extern unsigned int bcm2835_version(void);\n\n    /*! @} */\n\n    /*! \\defgroup lowlevel Low level register access\n      These functions provide low level register access, and should not generally\n      need to be used \n       \n      @{\n    */\n\n    /*! Gets the base of a register\n      \\param[in] regbase You can use one of the common values BCM2835_REGBASE_*\n      in \\ref bcm2835RegisterBase\n      \\return the register base\n      \\sa Physical Addresses\n    */\n    extern uint32_t* bcm2835_regbase(uint8_t regbase);\n\n    /*! Reads 32 bit value from a peripheral address WITH a memory barrier before and after each read.\n      This is safe, but slow.  The MB before protects this read from any in-flight reads that didn't\n      use a MB.  The MB after protects subsequent reads from another peripheral.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\return the value read from the 32 bit register\n      \\sa Physical Addresses\n    */\n    extern uint32_t bcm2835_peri_read(volatile uint32_t* paddr);\n\n    /*! Reads 32 bit value from a peripheral address WITHOUT the read barriers\n      You should only use this when:\n      o your code has previously called bcm2835_peri_read() for a register\n      within the same peripheral, and no read or write to another peripheral has occurred since.\n      o your code has called bcm2835_memory_barrier() since the last access to ANOTHER peripheral.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\return the value read from the 32 bit register\n      \\sa Physical Addresses\n    */\n    extern uint32_t bcm2835_peri_read_nb(volatile uint32_t* paddr);\n\n\n    /*! Writes 32 bit value from a peripheral address WITH a memory barrier before and after each write\n      This is safe, but slow.  The MB before ensures that any in-flight write to another peripheral\n      completes before this write is issued.  The MB after ensures that subsequent reads and writes\n      to another peripheral will see the effect of this write.\n\n      This is a tricky optimization; if you aren't sure, use the barrier version.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_write(volatile uint32_t* paddr, uint32_t value);\n\n    /*! Writes 32 bit value from a peripheral address without the write barrier\n      You should only use this when:\n      o your code has previously called bcm2835_peri_write() for a register\n      within the same peripheral, and no other peripheral access has occurred since.\n      o your code has called bcm2835_memory_barrier() since the last access to ANOTHER peripheral.\n\n      This is a tricky optimization; if you aren't sure, use the barrier version.\n\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_write_nb(volatile uint32_t* paddr, uint32_t value);\n\n    /*! Alters a number of bits in a 32 peripheral regsiter.\n      It reads the current valu and then alters the bits defines as 1 in mask, \n      according to the bit value in value. \n      All other bits that are 0 in the mask are unaffected.\n      Use this to alter a subset of the bits in a register.\n      Memory barriers are used.  Note that this is not atomic; an interrupt\n      routine can cause unexpected results.\n      \\param[in] paddr Physical address to read from. See BCM2835_GPIO_BASE etc.\n      \\param[in] value The 32 bit value to write, masked in by mask.\n      \\param[in] mask Bitmask that defines the bits that will be altered in the register.\n      \\sa Physical Addresses\n    */\n    extern void bcm2835_peri_set_bits(volatile uint32_t* paddr, uint32_t value, uint32_t mask);\n    /*! @}    end of lowlevel */\n\n    /*! \\defgroup gpio GPIO register access\n      These functions allow you to control the GPIO interface. You can set the \n      function of each GPIO pin, read the input state and set the output state.\n      @{\n    */\n\n    /*! Sets the Function Select register for the given pin, which configures\n      the pin as Input, Output or one of the 6 alternate functions.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] mode Mode to set the pin to, one of BCM2835_GPIO_FSEL_* from \\ref bcm2835FunctionSelect\n    */\n    extern void bcm2835_gpio_fsel(uint8_t pin, uint8_t mode);\n\n    /*! Sets the specified pin output to \n      HIGH.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\sa bcm2835_gpio_write()\n    */\n    extern void bcm2835_gpio_set(uint8_t pin);\n\n    /*! Sets the specified pin output to \n      LOW.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\sa bcm2835_gpio_write()\n    */\n    extern void bcm2835_gpio_clr(uint8_t pin);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to \n      HIGH.\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\sa bcm2835_gpio_write_multi()\n    */\n    extern void bcm2835_gpio_set_multi(uint32_t mask);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to \n      LOW.\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\sa bcm2835_gpio_write_multi()\n    */\n    extern void bcm2835_gpio_clr_multi(uint32_t mask);\n\n    /*! Reads the current level on the specified \n      pin and returns either HIGH or LOW. Works whether or not the pin\n      is an input or an output.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\return the current level  either HIGH or LOW\n    */\n    extern uint8_t bcm2835_gpio_lev(uint8_t pin);\n\n    /*! Event Detect Status.\n      Tests whether the specified pin has detected a level or edge\n      as requested by bcm2835_gpio_ren(), bcm2835_gpio_fen(), bcm2835_gpio_hen(), \n      bcm2835_gpio_len(), bcm2835_gpio_aren(), bcm2835_gpio_afen().\n      Clear the flag for a given pin by calling bcm2835_gpio_set_eds(pin);\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\return HIGH if the event detect status for the given pin is true.\n    */\n    extern uint8_t bcm2835_gpio_eds(uint8_t pin);\n\n    /*! Same as bcm2835_gpio_eds() but checks if any of the pins specified in\n      the mask have detected a level or edge.\n      \\param[in] mask Mask of pins to check. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\return Mask of pins HIGH if the event detect status for the given pin is true.\n    */\n    extern uint32_t bcm2835_gpio_eds_multi(uint32_t mask);\n\n    /*! Sets the Event Detect Status register for a given pin to 1, \n      which has the effect of clearing the flag. Use this afer seeing\n      an Event Detect Status on the pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_set_eds(uint8_t pin);\n\n    /*! Same as bcm2835_gpio_set_eds() but clears the flag for any pin which\n      is set in the mask.\n      \\param[in] mask Mask of pins to clear. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n    */\n    extern void bcm2835_gpio_set_eds_multi(uint32_t mask);\n    \n    /*! Enable Rising Edge Detect Enable for the specified pin.\n      When a rising edge is detected, sets the appropriate pin in Event Detect Status.\n      The GPRENn registers use\n      synchronous edge detection. This means the input signal is sampled using the\n      system clock and then it is looking for a ?011? pattern on the sampled signal. This\n      has the effect of suppressing glitches.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_ren(uint8_t pin);\n\n    /*! Disable Rising Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_ren(uint8_t pin);\n\n    /*! Enable Falling Edge Detect Enable for the specified pin.\n      When a falling edge is detected, sets the appropriate pin in Event Detect Status.\n      The GPRENn registers use\n      synchronous edge detection. This means the input signal is sampled using the\n      system clock and then it is looking for a ?100? pattern on the sampled signal. This\n      has the effect of suppressing glitches.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_fen(uint8_t pin);\n\n    /*! Disable Falling Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_fen(uint8_t pin);\n\n    /*! Enable High Detect Enable for the specified pin.\n      When a HIGH level is detected on the pin, sets the appropriate pin in Event Detect Status.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_hen(uint8_t pin);\n\n    /*! Disable High Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_hen(uint8_t pin);\n\n    /*! Enable Low Detect Enable for the specified pin.\n      When a LOW level is detected on the pin, sets the appropriate pin in Event Detect Status.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_len(uint8_t pin);\n\n    /*! Disable Low Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_len(uint8_t pin);\n\n    /*! Enable Asynchronous Rising Edge Detect Enable for the specified pin.\n      When a rising edge is detected, sets the appropriate pin in Event Detect Status.\n      Asynchronous means the incoming signal is not sampled by the system clock. As such\n      rising edges of very short duration can be detected.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_aren(uint8_t pin);\n\n    /*! Disable Asynchronous Rising Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_aren(uint8_t pin);\n\n    /*! Enable Asynchronous Falling Edge Detect Enable for the specified pin.\n      When a falling edge is detected, sets the appropriate pin in Event Detect Status.\n      Asynchronous means the incoming signal is not sampled by the system clock. As such\n      falling edges of very short duration can be detected.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_afen(uint8_t pin);\n\n    /*! Disable Asynchronous Falling Edge Detect Enable for the specified pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    extern void bcm2835_gpio_clr_afen(uint8_t pin);\n\n    /*! Sets the Pull-up/down register for the given pin. This is\n      used with bcm2835_gpio_pudclk() to set the  Pull-up/down resistor for the given pin.\n      However, it is usually more convenient to use bcm2835_gpio_set_pud().\n      \\param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl\n      On the RPI 4, although this function and bcm2835_gpio_pudclk() are supported for backward\n      compatibility, new code should always use bcm2835_gpio_set_pud().\n      \\sa bcm2835_gpio_set_pud()\n    */\n    extern void bcm2835_gpio_pud(uint8_t pud);\n\n    /*! Clocks the Pull-up/down value set earlier by bcm2835_gpio_pud() into the pin.\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] on HIGH to clock the value from bcm2835_gpio_pud() into the pin. \n      LOW to remove the clock. \n      \n      On the RPI 4, although this function and bcm2835_gpio_pud() are supported for backward\n      compatibility, new code should always use bcm2835_gpio_set_pud().\n      \n      \\sa bcm2835_gpio_set_pud()\n    */\n    extern void bcm2835_gpio_pudclk(uint8_t pin, uint8_t on);\n\n    /*! Reads and returns the Pad Control for the given GPIO group.\n      Caution: requires root access.\n      \\param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_*\n      \\return Mask of bits from BCM2835_PAD_* from \\ref bcm2835PadGroup\n    */\n    extern uint32_t bcm2835_gpio_pad(uint8_t group);\n\n    /*! Sets the Pad Control for the given GPIO group.\n      Caution: requires root access.\n      \\param[in] group The GPIO pad group number, one of BCM2835_PAD_GROUP_GPIO_*\n      \\param[in] control Mask of bits from BCM2835_PAD_* from \\ref bcm2835PadGroup. Note \n      that it is not necessary to include BCM2835_PAD_PASSWRD in the mask as this\n      is automatically included.\n    */\n    extern void bcm2835_gpio_set_pad(uint8_t group, uint32_t control);\n\n    /*! Delays for the specified number of milliseconds.\n      Uses nanosleep(), and therefore does not use CPU until the time is up.\n      However, you are at the mercy of nanosleep(). From the manual for nanosleep():\n      If the interval specified in req is not an exact multiple of the granularity  \n      underlying  clock  (see  time(7)),  then the interval will be\n      rounded up to the next multiple. Furthermore, after the sleep completes, \n      there may still be a delay before the CPU becomes free to once\n      again execute the calling thread.\n      \\param[in] millis Delay in milliseconds\n    */\n    extern void bcm2835_delay (unsigned int millis);\n\n    /*! Delays for the specified number of microseconds.\n      Uses a combination of nanosleep() and a busy wait loop on the BCM2835 system timers,\n      However, you are at the mercy of nanosleep(). From the manual for nanosleep():\n      If the interval specified in req is not an exact multiple of the granularity  \n      underlying  clock  (see  time(7)),  then the interval will be\n      rounded up to the next multiple. Furthermore, after the sleep completes, \n      there may still be a delay before the CPU becomes free to once\n      again execute the calling thread.\n      For times less than about 450 microseconds, uses a busy wait on the System Timer.\n      It is reported that a delay of 0 microseconds on RaspberryPi will in fact\n      result in a delay of about 80 microseconds. Your mileage may vary.\n      \\param[in] micros Delay in microseconds\n    */\n    extern void bcm2835_delayMicroseconds (uint64_t micros);\n\n    /*! Sets the output state of the specified pin\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] on HIGH sets the output to HIGH and LOW to LOW.\n    */\n    extern void bcm2835_gpio_write(uint8_t pin, uint8_t on);\n\n    /*! Sets any of the first 32 GPIO output pins specified in the mask to the state given by on\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\param[in] on HIGH sets the output to HIGH and LOW to LOW.\n    */\n    extern void bcm2835_gpio_write_multi(uint32_t mask, uint8_t on);\n\n    /*! Sets the first 32 GPIO output pins specified in the mask to the value given by value\n      \\param[in] value values required for each bit masked in by mask, eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n      \\param[in] mask Mask of pins to affect. Use eg: (1 << RPI_GPIO_P1_03) | (1 << RPI_GPIO_P1_05)\n    */\n    extern void bcm2835_gpio_write_mask(uint32_t value, uint32_t mask);\n\n    /*! Sets the Pull-up/down mode for the specified pin. This is more convenient than\n      clocking the mode in with bcm2835_gpio_pud() and bcm2835_gpio_pudclk().\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n      \\param[in] pud The desired Pull-up/down mode. One of BCM2835_GPIO_PUD_* from bcm2835PUDControl\n    */\n    extern void bcm2835_gpio_set_pud(uint8_t pin, uint8_t pud);\n\n    /*! On the BCM2711 based RPI 4, gets the current Pull-up/down mode for the specified pin.\n      Returns one of BCM2835_GPIO_PUD_* from bcm2835PUDControl.\n      On earlier RPI versions not based on the BCM2711, returns BCM2835_GPIO_PUD_ERROR\n      \\param[in] pin GPIO number, or one of RPI_GPIO_P1_* from \\ref RPiGPIOPin.\n    */\n    \n    extern uint8_t bcm2835_gpio_get_pud(uint8_t pin);\n\n    /*! @}  */\n\n    /*! \\defgroup spi SPI access\n      These functions let you use SPI0 (Serial Peripheral Interface) to \n      interface with an external SPI device.\n      @{\n    */\n\n    /*! Start SPI operations.\n      Forces RPi SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1)\n      to alternate function ALT0, which enables those pins for SPI interface.\n      You should call bcm2835_spi_end() when all SPI funcitons are complete to return the pins to \n      their default functions.\n      \\sa  bcm2835_spi_end()\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n    */\n    extern int bcm2835_spi_begin(void);\n\n    /*! End SPI operations.\n      SPI0 pins P1-19 (MOSI), P1-21 (MISO), P1-23 (CLK), P1-24 (CE0) and P1-26 (CE1)\n      are returned to their default INPUT behaviour.\n    */\n    extern void bcm2835_spi_end(void);\n\n    /*! Sets the SPI bit order\n      Set the bit order to be used for transmit and receive. The bcm2835 SPI0 only supports BCM2835_SPI_BIT_ORDER_MSB,\n      so if you select BCM2835_SPI_BIT_ORDER_LSB, the bytes will be reversed in software.\n      The library defaults to BCM2835_SPI_BIT_ORDER_MSB.\n      \\param[in] order The desired bit order, one of BCM2835_SPI_BIT_ORDER_*, \n      see \\ref bcm2835SPIBitOrder\n    */\n    extern void bcm2835_spi_setBitOrder(uint8_t order);\n\n    /*! Sets the SPI clock divider and therefore the \n      SPI clock speed. \n      \\param[in] divider The desired SPI clock divider, one of BCM2835_SPI_CLOCK_DIVIDER_*, \n      see \\ref bcm2835SPIClockDivider\n    */\n    extern void bcm2835_spi_setClockDivider(uint16_t divider);\n\n    /*! Sets the SPI clock divider by converting the speed parameter to\n      the equivalent SPI clock divider. ( see \\sa bcm2835_spi_setClockDivider)\n      \\param[in] speed_hz The desired SPI clock speed in Hz\n    */\n   extern void bcm2835_spi_set_speed_hz(uint32_t speed_hz);\n\n    /*! Sets the SPI data mode\n      Sets the clock polariy and phase\n      \\param[in] mode The desired data mode, one of BCM2835_SPI_MODE*, \n      see \\ref bcm2835SPIMode\n    */\n    extern void bcm2835_spi_setDataMode(uint8_t mode);\n\n    /*! Sets the chip select pin(s)\n      When an bcm2835_spi_transfer() is made, the selected pin(s) will be asserted during the\n      transfer.\n      \\param[in] cs Specifies the CS pins(s) that are used to activate the desired slave. \n      One of BCM2835_SPI_CS*, see \\ref bcm2835SPIChipSelect\n    */\n    extern void bcm2835_spi_chipSelect(uint8_t cs);\n\n    /*! Sets the chip select pin polarity for a given pin\n      When an bcm2835_spi_transfer() occurs, the currently selected chip select pin(s) \n      will be asserted to the \n      value given by active. When transfers are not happening, the chip select pin(s) \n      return to the complement (inactive) value.\n      \\param[in] cs The chip select pin to affect\n      \\param[in] active Whether the chip select pin is to be active HIGH\n    */\n    extern void bcm2835_spi_setChipSelectPolarity(uint8_t cs, uint8_t active);\n\n    /*! Transfers one byte to and from the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) \n      during the transfer.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. \n      Returns the read data byte from the slave.\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] value The 8 bit data byte to write to MOSI\n      \\return The 8 bit byte simultaneously read from  MISO\n      \\sa bcm2835_spi_transfern()\n    */\n    extern uint8_t bcm2835_spi_transfer(uint8_t value);\n    \n    /*! Transfers any number of bytes to and from the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect) \n      during the transfer.\n      Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO. \n      The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] tbuf Buffer of bytes to send. \n      \\param[out] rbuf Received bytes will by put in this buffer\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received\n      \\sa bcm2835_spi_transfer()\n    */\n    extern void bcm2835_spi_transfernb(char* tbuf, char* rbuf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the currently selected SPI slave\n      using bcm2835_spi_transfernb.\n      The returned data from the slave replaces the transmitted data in the buffer.\n      \\param[in,out] buf Buffer of bytes to send. Received bytes will replace the contents\n      \\param[in] len Number of bytes int eh buffer, and the number of bytes to send/received\n      \\sa bcm2835_spi_transfer()\n    */\n    extern void bcm2835_spi_transfern(char* buf, uint32_t len);\n\n    /*! Transfers any number of bytes to the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect)\n      during the transfer.\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to send\n    */\n    extern void bcm2835_spi_writenb(const char* buf, uint32_t len);\n\n    /*! Transfers half-word to the currently selected SPI slave.\n      Asserts the currently selected CS pins (as previously set by bcm2835_spi_chipSelect)\n      during the transfer.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO.\n      Uses polled transfer as per section 10.6.1 of the BCM 2835 ARM Peripherls manual\n      \\param[in] data The 8 bit data byte to write to MOSI\n      \\sa bcm2835_spi_writenb()\n    */\n    extern void bcm2835_spi_write(uint16_t data);\n\n    /*! Start AUX SPI operations.\n      Forces RPi AUX SPI pins P1-38 (MOSI), P1-38 (MISO), P1-40 (CLK) and P1-36 (CE2)\n      to alternate function ALT4, which enables those pins for SPI interface.\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n    */\n    extern int bcm2835_aux_spi_begin(void);\n\n    /*! End AUX SPI operations.\n       SPI1 pins P1-38 (MOSI), P1-38 (MISO), P1-40 (CLK) and P1-36 (CE2)\n       are returned to their default INPUT behaviour.\n     */\n    extern void bcm2835_aux_spi_end(void);\n\n    /*! Sets the AUX SPI clock divider and therefore the AUX SPI clock speed.\n      \\param[in] divider The desired AUX SPI clock divider.\n    */\n    extern void bcm2835_aux_spi_setClockDivider(uint16_t divider);\n\n    /*!\n     * Calculates the input for \\sa bcm2835_aux_spi_setClockDivider\n     * @param speed_hz A value between \\sa BCM2835_AUX_SPI_CLOCK_MIN and \\sa BCM2835_AUX_SPI_CLOCK_MAX\n     * @return Input for \\sa bcm2835_aux_spi_setClockDivider\n     */\n    extern uint16_t bcm2835_aux_spi_CalcClockDivider(uint32_t speed_hz);\n\n    /*! Transfers half-word to the AUX SPI slave.\n      Asserts the currently selected CS pins during the transfer.\n      \\param[in] data The 8 bit data byte to write to MOSI\n      \\return The 16 bit byte simultaneously read from  MISO\n      \\sa bcm2835_spi_transfern()\n    */\n    extern void bcm2835_aux_spi_write(uint16_t data);\n\n    /*! Transfers any number of bytes to the AUX SPI slave.\n      Asserts the CE2 pin during the transfer.\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send\n    */\n    extern void bcm2835_aux_spi_writenb(const char *buf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the AUX SPI slave\n      using bcm2835_aux_spi_transfernb.\n      The returned data from the slave replaces the transmitted data in the buffer.\n      \\param[in,out] buf Buffer of bytes to send. Received bytes will replace the contents\n      \\param[in] len Number of bytes in the buffer, and the number of bytes to send/received\n      \\sa bcm2835_aux_spi_transfer()\n    */\n    extern void bcm2835_aux_spi_transfern(char *buf, uint32_t len);\n\n    /*! Transfers any number of bytes to and from the AUX SPI slave.\n      Asserts the CE2 pin during the transfer.\n      Clocks the len 8 bit bytes out on MOSI, and simultaneously clocks in data from MISO.\n      The data read read from the slave is placed into rbuf. rbuf must be at least len bytes long\n      \\param[in] tbuf Buffer of bytes to send.\n      \\param[out] rbuf Received bytes will by put in this buffer\n      \\param[in] len Number of bytes in the tbuf buffer, and the number of bytes to send/received\n    */\n    extern void bcm2835_aux_spi_transfernb(const char *tbuf, char *rbuf, uint32_t len);\n\n    /*! Transfers one byte to and from the AUX SPI slave.\n      Clocks the 8 bit value out on MOSI, and simultaneously clocks in data from MISO. \n      Returns the read data byte from the slave.\n      \\param[in] value The 8 bit data byte to write to MOSI\n      \\return The 8 bit byte simultaneously read from MISO\n      \\sa bcm2835_aux_spi_transfern()\n    */\n    extern uint8_t bcm2835_aux_spi_transfer(uint8_t value);\n    \n    /*! @} */\n\n    /*! \\defgroup i2c I2C access\n      These functions let you use I2C (The Broadcom Serial Control bus with the Philips\n      I2C bus/interface version 2.1 January 2000.) to interface with an external I2C device.\n      @{\n    */\n\n    /*! Start I2C operations.\n      Forces RPi I2C pins P1-03 (SDA) and P1-05 (SCL)\n      to alternate function ALT0, which enables those pins for I2C interface.\n      You should call bcm2835_i2c_end() when all I2C functions are complete to return the pins to\n      their default functions\n      \\return 1 if successful, 0 otherwise (perhaps because you are not running as root)\n      \\sa  bcm2835_i2c_end()\n    */\n    extern int bcm2835_i2c_begin(void);\n\n    /*! End I2C operations.\n      I2C pins P1-03 (SDA) and P1-05 (SCL)\n      are returned to their default INPUT behaviour.\n    */\n    extern void bcm2835_i2c_end(void);\n\n    /*! Sets the I2C slave address.\n      \\param[in] addr The I2C slave address.\n    */\n    extern void bcm2835_i2c_setSlaveAddress(uint8_t addr);\n\n    /*! Sets the I2C clock divider and therefore the I2C clock speed.\n      \\param[in] divider The desired I2C clock divider, one of BCM2835_I2C_CLOCK_DIVIDER_*,\n      see \\ref bcm2835I2CClockDivider\n    */\n    extern void bcm2835_i2c_setClockDivider(uint16_t divider);\n\n    /*! Sets the I2C clock divider by converting the baudrate parameter to\n      the equivalent I2C clock divider. ( see \\sa bcm2835_i2c_setClockDivider)\n      For the I2C standard 100khz you would set baudrate to 100000\n      The use of baudrate corresponds to its use in the I2C kernel device\n      driver. (Of course, bcm2835 has nothing to do with the kernel driver)\n    */\n    extern void bcm2835_i2c_set_baudrate(uint32_t baudrate);\n\n    /*! Transfers any number of bytes to the currently selected I2C slave.\n      (as previously set by \\sa bcm2835_i2c_setSlaveAddress)\n      \\param[in] buf Buffer of bytes to send.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to send.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_write(const char * buf, uint32_t len);\n\n    /*! Transfers any number of bytes from the currently selected I2C slave.\n      (as previously set by \\sa bcm2835_i2c_setSlaveAddress)\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to received.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_read(char* buf, uint32_t len);\n\n    /*! Allows reading from I2C slaves that require a repeated start (without any prior stop)\n      to read after the required slave register has been set. For example, the popular\n      MPL3115A2 pressure and temperature sensor. Note that your device must support or\n      require this mode. If your device does not require this mode then the standard\n      combined:\n      \\sa bcm2835_i2c_write\n      \\sa bcm2835_i2c_read\n      are a better choice.\n      Will read from the slave previously set by \\sa bcm2835_i2c_setSlaveAddress\n      \\param[in] regaddr Buffer containing the slave register you wish to read from.\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] len Number of bytes in the buf buffer, and the number of bytes to received.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_read_register_rs(char* regaddr, char* buf, uint32_t len);\n\n    /*! Allows sending an arbitrary number of bytes to I2C slaves before issuing a repeated\n      start (with no prior stop) and reading a response.\n      Necessary for devices that require such behavior, such as the MLX90620.\n      Will write to and read from the slave previously set by \\sa bcm2835_i2c_setSlaveAddress\n      \\param[in] cmds Buffer containing the bytes to send before the repeated start condition.\n      \\param[in] cmds_len Number of bytes to send from cmds buffer\n      \\param[in] buf Buffer of bytes to receive.\n      \\param[in] buf_len Number of bytes to receive in the buf buffer.\n      \\return reason see \\ref bcm2835I2CReasonCodes\n    */\n    extern uint8_t bcm2835_i2c_write_read_rs(char* cmds, uint32_t cmds_len, char* buf, uint32_t buf_len);\n\n    /*! @} */\n\n    /*! \\defgroup st System Timer access\n      Allows access to and delays using the System Timer Counter.\n      @{\n    */\n\n    /*! Read the System Timer Counter register.\n      \\return the value read from the System Timer Counter Lower 32 bits register\n    */\n    extern uint64_t bcm2835_st_read(void);\n\n    /*! Delays for the specified number of microseconds with offset.\n      \\param[in] offset_micros Offset in microseconds\n      \\param[in] micros Delay in microseconds\n    */\n    extern void bcm2835_st_delay(uint64_t offset_micros, uint64_t micros);\n\n    /*! @}  */\n\n    /*! \\defgroup pwm Pulse Width Modulation\n      Allows control of 2 independent PWM channels. A limited subset of GPIO pins\n      can be connected to one of these 2 channels, allowing PWM control of GPIO pins.\n      You have to set the desired pin into a particular Alt Fun to PWM output. See the PWM\n      documentation on the Main Page.\n      @{\n    */\n\n    /*! Sets the PWM clock divisor, \n      to control the basic PWM pulse widths.\n      \\param[in] divisor Divides the basic 19.2MHz PWM clock. You can use one of the common\n      values BCM2835_PWM_CLOCK_DIVIDER_* in \\ref bcm2835PWMClockDivider\n    */\n    extern void bcm2835_pwm_set_clock(uint32_t divisor);\n    \n    /*! Sets the mode of the given PWM channel,\n      allowing you to control the PWM mode and enable/disable that channel\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] markspace Set true if you want Mark-Space mode. 0 for Balanced mode.\n      \\param[in] enabled Set true to enable this channel and produce PWM pulses.\n    */\n    extern void bcm2835_pwm_set_mode(uint8_t channel, uint8_t markspace, uint8_t enabled);\n\n    /*! Sets the maximum range of the PWM output.\n      The data value can vary between 0 and this range to control PWM output\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] range The maximum value permitted for DATA.\n    */\n    extern void bcm2835_pwm_set_range(uint8_t channel, uint32_t range);\n    \n    /*! Sets the PWM pulse ratio to emit to DATA/RANGE, \n      where RANGE is set by bcm2835_pwm_set_range().\n      \\param[in] channel The PWM channel. 0 or 1.\n      \\param[in] data Controls the PWM output ratio as a fraction of the range. \n      Can vary from 0 to RANGE.\n    */\n    extern void bcm2835_pwm_set_data(uint8_t channel, uint32_t data);\n\n    /*! @}  */\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BCM2835_H */\n\n/*! @example blink.c\n  Blinks RPi GPIO pin 11 on and off\n*/\n\n/*! @example input.c\n  Reads the state of an RPi input pin\n*/\n\n/*! @example event.c\n  Shows how to use event detection on an input pin\n*/\n\n/*! @example spi.c\n  Shows how to use SPI interface to transfer a byte to and from an SPI device\n*/\n\n/*! @example spin.c\n  Shows how to use SPI interface to transfer a number of bytes to and from an SPI device\n*/\n\n/*! @example pwm.c\n  Shows how to use PWM to control GPIO pins\n*/\n\n/*! @example i2c.c\nCommand line utility for executing i2c commands with the \nBroadcom bcm2835. Contributed by Shahrooz Shahparnia.\n*/\n\n/*! example gpio.c\n  Command line utility for executing gpio commands with the \n  Broadcom bcm2835. Contributed by Shahrooz Shahparnia.\n*/\n\n/*! example spimem_test.c\n  Shows how to use the included little library (spiram.c and spiram.h)\n  to read and write SPI RAM chips such as 23K256-I/P\n*/\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/dtcboards.h",
    "content": "/*\n * This is a component for RaspberryPi and other boards for linuxcnc.\n * Copyright (c) 2024 B.Stultiens <lcnc@vagrearg.org>\n *\n * This program is free software; you can redistribute it and/or modify it\n * under the terms of the GNU General Public License as published by the Free\n * Software Foundation; either version 2 of the License, or (at your option)\n * any later version.\n *\n * This program is distributed in the hope that it will be useful, but WITHOUT\n * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\n * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\n * more details.\n *\n * You should have received a copy of the GNU General Public License along with\n * this program; if not, see <https://www.gnu.org/licenses/>.\n */\n#ifndef HAL_HM2_DTCBOARDS_H\n#define HAL_HM2_DTCBOARDS_H\n\n/*\n * Info about the hardware platform, see:\n *  https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#best-practices-for-revision-code-usage\n *  https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#check-raspberry-pi-model-and-cpu-across-distributions\n *\n * Reading /proc/device-tree/compatible should contain the relevant\n * information. We should get a buffer containing a string-list like:\n *   \"raspberrypi,5-model-b\\0brcm,bcm2712\\0\"\n * And yes, it has embedded NULs.\n *\n * The idea is to match one of the strings to assign the correct driver for the\n * specific board.\n */\n#define DTC_BOARD_MAKE_RPI\t\t\"raspberrypi\"\n\n#define DTC_BOARD_RPI_5CM\t\t\"5-compute-module\"\n#define DTC_BOARD_RPI_5B\t\t\"5-model-b\"\n#define DTC_BOARD_RPI_4CM\t\t\"4-compute-module\"\n#define DTC_BOARD_RPI_4B\t\t\"4-model-b\"\n#define DTC_BOARD_RPI_400\t\t\"400\"\n#define DTC_BOARD_RPI_3CM\t\t\"3-compute-module\"\n#define DTC_BOARD_RPI_3BP\t\t\"3-model-b-plus\"\n#define DTC_BOARD_RPI_3AP\t\t\"3-model-a-plus\"\n#define DTC_BOARD_RPI_3B\t\t\"3-model-b\"\n#define DTC_BOARD_RPI_2B\t\t\"2-model-b\"\n#define DTC_BOARD_RPI_CM\t\t\"compute-module\"\n#define DTC_BOARD_RPI_BP\t\t\"model-b-plus\"\n#define DTC_BOARD_RPI_AP\t\t\"model-a-plus\"\n#define DTC_BOARD_RPI_BR2\t\t\"model-b-rev2\"\n#define DTC_BOARD_RPI_B\t\t\t\"model-b\"\n#define DTC_BOARD_RPI_A\t\t\t\"model-a\"\n#define DTC_BOARD_RPI_ZERO_2W\t\"model-zero-2-w\"\n#define DTC_BOARD_RPI_ZERO_W\t\"model-zero-w\"\n#define DTC_BOARD_RPI_ZERO\t\t\"model-zero\"\n\n#define DTC_SOC_MAKE_BRCM\t\t\"brcm\"\n\n#define DTC_SOC_MODEL_BCM2712\t\"bcm2712\"\n#define DTC_SOC_MODEL_BCM2711\t\"bcm2711\"\n#define DTC_SOC_MODEL_BCM2837\t\"bcm2837\"\n#define DTC_SOC_MODEL_BCM2836\t\"bcm2836\"\n#define DTC_SOC_MODEL_BCM2835\t\"bcm2835\"\n\n/* The device-tree compatible strings for the boards */\n#define DTC_RPI_SOC_BCM2712\t\tDTC_SOC_MAKE_RPI \",\" DTC_SOC_MODEL_BCM2712\n#define DTC_RPI_MODEL_5CM\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_5CM\n#define DTC_RPI_MODEL_5B\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_5B\n\n#define DTC_RPI_SOC_BCM2711\t\tDTC_SOC_MAKE_RPI \",\" DTC_SOC_MODEL_BCM2711\n#define DTC_RPI_MODEL_4CM\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_4CM\n#define DTC_RPI_MODEL_4B\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_4B\n#define DTC_RPI_MODEL_400\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_400\n\n#define DTC_RPI_SOC_BCM2837\t\tDTC_SOC_MAKE_BRCM \",\" DTC_SOC_MODEL_BCM2837\n#define DTC_RPI_MODEL_3CM\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_3CM\n#define DTC_RPI_MODEL_3BP\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_3BP\n#define DTC_RPI_MODEL_3AP\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_3AP\n#define DTC_RPI_MODEL_3B\t\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_3B\n#define DTC_RPI_MODEL_ZERO_2W\tDTC_BOARD_MAKE_RPI \",\" DTC_BOARD_RPI_ZERO_2W\n\n/* Older than a RPi3 (bcm2836 and bcm2835) is probably not a good idea to use. */\n\n#endif\n// vim: ts=4"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/gpiochip_rp1.c",
    "content": "#include <assert.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"gpiochip_rp1.h\"\n\n// RP1 bar base address is at    0x1f00000000\n// device tree reports gpiochip  0x1f000d0000\n// therefore need to add  0x0d0000 to the following offsets when using bar base address\n\n#define RP1_IO_BANK0_OFFSET      0x000d0000     // 0x00000000\n#define RP1_IO_BANK1_OFFSET      0x000d4000     // 0x00004000\n#define RP1_IO_BANK2_OFFSET      0x000d8000     // 0x00008000\n#define RP1_SYS_RIO_BANK0_OFFSET 0x000e0000     // 0x00010000\n#define RP1_SYS_RIO_BANK1_OFFSET 0x000e4000     // 0x00014000\n#define RP1_SYS_RIO_BANK2_OFFSET 0x000e8000     // 0x00018000\n#define RP1_PADS_BANK0_OFFSET    0x000f0000     // 0x00020000\n#define RP1_PADS_BANK1_OFFSET    0x000f4000     // 0x00024000\n#define RP1_PADS_BANK2_OFFSET    0x000f8000     // 0x00028000\n\n#define RP1_RW_OFFSET  0x0000\n#define RP1_XOR_OFFSET 0x1000\n#define RP1_SET_OFFSET 0x2000\n#define RP1_CLR_OFFSET 0x3000\n\n#define RP1_GPIO_CTRL_FSEL_LSB     0\n#define RP1_GPIO_CTRL_FSEL_MASK    (0x1f << RP1_GPIO_CTRL_FSEL_LSB)\n#define RP1_GPIO_CTRL_OUTOVER_LSB  12\n#define RP1_GPIO_CTRL_OUTOVER_MASK (0x03 << RP1_GPIO_CTRL_OUTOVER_LSB)\n#define RP1_GPIO_CTRL_OEOVER_LSB   14\n#define RP1_GPIO_CTRL_OEOVER_MASK  (0x03 << RP1_GPIO_CTRL_OEOVER_LSB)\n\n#define RP1_PADS_OD_SET       (1 << 7)\n#define RP1_PADS_IE_SET       (1 << 6)\n#define RP1_PADS_PUE_SET      (1 << 3)\n#define RP1_PADS_PDE_SET      (1 << 2)\n\n#define RP1_GPIO_IO_REG_STATUS_OFFSET(offset) (((offset * 2) + 0) * sizeof(uint32_t))\n#define RP1_GPIO_IO_REG_CTRL_OFFSET(offset)   (((offset * 2) + 1) * sizeof(uint32_t))\n#define RP1_GPIO_PADS_REG_OFFSET(offset)      (sizeof(uint32_t) + (offset * sizeof(uint32_t)))\n\n#define RP1_GPIO_SYS_RIO_REG_OUT_OFFSET        0x0\n#define RP1_GPIO_SYS_RIO_REG_OE_OFFSET         0x4\n#define RP1_GPIO_SYS_RIO_REG_SYNC_IN_OFFSET    0x8\n\n#define rp1_gpio_write32(base, peri_offset, reg_offset, value) \\\n    base[(peri_offset + reg_offset)/4] = value\n\n#define rp1_gpio_read32(base, peri_offset, reg_offset) \\\n    base[(peri_offset + reg_offset)/4]\n\ntypedef struct\n{\n   uint32_t io[3];\n   uint32_t pads[3];\n   uint32_t sys_rio[3];\n} GPIO_STATE_T;\n\ntypedef enum\n{\n    RP1_FSEL_ALT0       = 0x0,\n    RP1_FSEL_ALT1       = 0x1,\n    RP1_FSEL_ALT2       = 0x2,\n    RP1_FSEL_ALT3       = 0x3,\n    RP1_FSEL_ALT4       = 0x4,\n    RP1_FSEL_ALT5       = 0x5,\n    RP1_FSEL_ALT6       = 0x6,\n    RP1_FSEL_ALT7       = 0x7,\n    RP1_FSEL_ALT8       = 0x8,\n    RP1_FSEL_COUNT,\n    RP1_FSEL_SYS_RIO    = RP1_FSEL_ALT5,\n    RP1_FSEL_NULL       = 0x1f\n} RP1_FSEL_T;\n\nstatic const GPIO_STATE_T gpio_state = {\n    .io = {RP1_IO_BANK0_OFFSET, RP1_IO_BANK1_OFFSET, RP1_IO_BANK2_OFFSET},\n    .pads = {RP1_PADS_BANK0_OFFSET, RP1_PADS_BANK1_OFFSET, RP1_PADS_BANK2_OFFSET},\n    .sys_rio = {RP1_SYS_RIO_BANK0_OFFSET, RP1_SYS_RIO_BANK1_OFFSET, RP1_SYS_RIO_BANK2_OFFSET},\n};\n\nstatic const int rp1_bank_base[] = {0, 28, 34};\n\n\nstatic void rp1_gpio_get_bank(int num, int *bank, int *offset)\n{\n    *bank = *offset = 0;\n    if (num >= RP1_NUM_GPIOS)\n    {\n        assert(0);\n        return;\n    }\n\n    if (num < rp1_bank_base[1])\n        *bank = 0;\n    else if (num < rp1_bank_base[2])\n        *bank = 1;\n    else\n        *bank = 2;\n\n   *offset = num - rp1_bank_base[*bank];\n}\n\nstatic uint32_t rp1_gpio_ctrl_read(volatile uint32_t *base, int bank, int offset)\n{\n    return rp1_gpio_read32(base, gpio_state.io[bank], RP1_GPIO_IO_REG_CTRL_OFFSET(offset));\n}\n\nstatic void rp1_gpio_ctrl_write(volatile uint32_t *base, int bank, int offset,\n                                uint32_t value)\n{\n    rp1_gpio_write32(base, gpio_state.io[bank], RP1_GPIO_IO_REG_CTRL_OFFSET(offset), value);\n}\n\nstatic uint32_t rp1_gpio_pads_read(volatile uint32_t *base, int bank, int offset)\n{\n    return rp1_gpio_read32(base, gpio_state.pads[bank], RP1_GPIO_PADS_REG_OFFSET(offset));\n}\n\nstatic void rp1_gpio_pads_write(volatile uint32_t *base, int bank, int offset,\n                                uint32_t value)\n{\n    rp1_gpio_write32(base, gpio_state.pads[bank], RP1_GPIO_PADS_REG_OFFSET(offset), value);\n}\n\nstatic uint32_t rp1_gpio_sys_rio_out_read(volatile uint32_t *base, int bank,\n                                          int offset)\n{\n    UNUSED(offset);\n    return rp1_gpio_read32(base, gpio_state.sys_rio[bank], RP1_GPIO_SYS_RIO_REG_OUT_OFFSET);\n}\n\nstatic uint32_t rp1_gpio_sys_rio_sync_in_read(volatile uint32_t *base, int bank,\n                                              int offset)\n{\n    UNUSED(offset);\n    return rp1_gpio_read32(base, gpio_state.sys_rio[bank],\n                           RP1_GPIO_SYS_RIO_REG_SYNC_IN_OFFSET);\n}\n\nstatic void rp1_gpio_sys_rio_out_set(volatile uint32_t *base, int bank, int offset)\n{\n    rp1_gpio_write32(base, gpio_state.sys_rio[bank],\n                     RP1_GPIO_SYS_RIO_REG_OUT_OFFSET + RP1_SET_OFFSET, 1U << offset);\n}\n\nstatic void rp1_gpio_sys_rio_out_clr(volatile uint32_t *base, int bank, int offset)\n{\n    rp1_gpio_write32(base, gpio_state.sys_rio[bank],\n                     RP1_GPIO_SYS_RIO_REG_OUT_OFFSET + RP1_CLR_OFFSET, 1U << offset);\n}\n\nstatic uint32_t rp1_gpio_sys_rio_oe_read(volatile uint32_t *base, int bank)\n{\n    return rp1_gpio_read32(base, gpio_state.sys_rio[bank],\n                           RP1_GPIO_SYS_RIO_REG_OE_OFFSET);\n}\n\nstatic void rp1_gpio_sys_rio_oe_clr(volatile uint32_t *base, int bank, int offset)\n{\n    rp1_gpio_write32(base, gpio_state.sys_rio[bank],\n                     RP1_GPIO_SYS_RIO_REG_OE_OFFSET + RP1_CLR_OFFSET,\n                     1U << offset);\n}\n\nstatic void rp1_gpio_sys_rio_oe_set(volatile uint32_t *base, int bank, int offset)\n{\n    rp1_gpio_write32(base, gpio_state.sys_rio[bank],\n                     RP1_GPIO_SYS_RIO_REG_OE_OFFSET + RP1_SET_OFFSET,\n                     1U << offset);\n}\n\nstatic void rp1_gpio_set_dir(void *priv, uint32_t gpio, GPIO_DIR_T dir)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n\n    if (dir == DIR_INPUT)\n        rp1_gpio_sys_rio_oe_clr(base, bank, offset);\n    else if (dir == DIR_OUTPUT)\n        rp1_gpio_sys_rio_oe_set(base, bank, offset);\n    else\n        assert(0);\n}\n\nstatic GPIO_DIR_T rp1_gpio_get_dir(void *priv, unsigned gpio)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n    GPIO_DIR_T dir;\n    uint32_t reg;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    reg = rp1_gpio_sys_rio_oe_read(base, bank);\n\n    dir = (reg & (1U << offset)) ? DIR_OUTPUT : DIR_INPUT;\n\n    return dir;\n}\n\nstatic GPIO_FSEL_T rp1_gpio_get_fsel(void *priv, unsigned gpio)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n    uint32_t reg;\n    GPIO_FSEL_T fsel;\n    RP1_FSEL_T rsel;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    reg = rp1_gpio_ctrl_read(base, bank, offset);\n\n    rsel = ((reg & RP1_GPIO_CTRL_FSEL_MASK) >> RP1_GPIO_CTRL_FSEL_LSB);\n    if (rsel == RP1_FSEL_SYS_RIO)\n        fsel = GPIO_FSEL_GPIO;\n    else if (rsel == RP1_FSEL_NULL)\n        fsel = GPIO_FSEL_NONE;\n    else if (rsel < RP1_FSEL_COUNT)\n        fsel = (GPIO_FSEL_T)rsel;\n    else\n        fsel = GPIO_FSEL_MAX;\n\n    return fsel;\n}\n\nstatic void rp1_gpio_set_fsel(void *priv, unsigned gpio, const GPIO_FSEL_T func)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n    uint32_t ctrl_reg;\n    uint32_t pad_reg;\n    uint32_t old_pad_reg;\n    RP1_FSEL_T rsel;\n\n    if (func < (GPIO_FSEL_T)RP1_FSEL_COUNT)\n        rsel = (RP1_FSEL_T)func;\n    else if (func == GPIO_FSEL_INPUT ||\n             func == GPIO_FSEL_OUTPUT ||\n             func == GPIO_FSEL_GPIO)\n        rsel = RP1_FSEL_SYS_RIO;\n    else if (func == GPIO_FSEL_NONE)\n        rsel = RP1_FSEL_NULL;\n    else\n        return;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    if (func == GPIO_FSEL_INPUT)\n        rp1_gpio_set_dir(priv, gpio, DIR_INPUT);\n    else if (func == GPIO_FSEL_OUTPUT)\n        rp1_gpio_set_dir(priv, gpio, DIR_OUTPUT);\n\n    ctrl_reg = rp1_gpio_ctrl_read(base, bank, offset) & ~RP1_GPIO_CTRL_FSEL_MASK;\n    ctrl_reg |= rsel << RP1_GPIO_CTRL_FSEL_LSB;\n    rp1_gpio_ctrl_write(base, bank, offset, ctrl_reg);\n\n    pad_reg = rp1_gpio_pads_read(base, bank, offset);\n    old_pad_reg = pad_reg;\n    if (rsel == RP1_FSEL_NULL)\n    {\n        // Disable input\n        pad_reg &= ~RP1_PADS_IE_SET;\n    }\n    else\n    {\n        // Enable input\n        pad_reg |= RP1_PADS_IE_SET;\n    }\n\n    if (rsel != RP1_FSEL_NULL)\n    {\n        // Enable peripheral func output\n        pad_reg &= ~RP1_PADS_OD_SET;\n    }\n    else\n    {\n        // Disable peripheral func output\n        pad_reg |= RP1_PADS_OD_SET;\n    }\n\n    if (pad_reg != old_pad_reg)\n        rp1_gpio_pads_write(base, bank, offset, pad_reg);\n}\n\nstatic int rp1_gpio_get_level(void *priv, unsigned gpio)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n    uint32_t pad_reg;\n    uint32_t reg;\n    int level;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    pad_reg = rp1_gpio_pads_read(base, bank, offset);\n    if (!(pad_reg & RP1_PADS_IE_SET))\n\treturn -1;\n    reg = rp1_gpio_sys_rio_sync_in_read(base, bank, offset);\n    level = (reg & (1U << offset)) ? 1 : 0;\n\n    return level;\n}\n\nstatic void rp1_gpio_set_drive(void *priv, unsigned gpio, GPIO_DRIVE_T drv)\n{\n    volatile uint32_t *base = priv;\n    int bank, offset;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    if (drv == DRIVE_HIGH)\n        rp1_gpio_sys_rio_out_set(base, bank, offset);\n    else if (drv == DRIVE_LOW)\n        rp1_gpio_sys_rio_out_clr(base, bank, offset);\n}\n\nstatic void rp1_gpio_set_pull(void *priv, unsigned gpio, GPIO_PULL_T pull)\n{\n    volatile uint32_t *base = priv;\n    uint32_t reg;\n    int bank, offset;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    reg = rp1_gpio_pads_read(base, bank, offset);\n    reg &= ~(RP1_PADS_PDE_SET | RP1_PADS_PUE_SET);\n    if (pull == PULL_UP)\n        reg |= RP1_PADS_PUE_SET;\n    else if (pull == PULL_DOWN)\n        reg |= RP1_PADS_PDE_SET;\n    rp1_gpio_pads_write(base, bank, offset, reg);\n}\n\nstatic GPIO_PULL_T rp1_gpio_get_pull(void *priv, unsigned gpio)\n{\n    volatile uint32_t *base = priv;\n    uint32_t reg;\n    GPIO_PULL_T pull = PULL_NONE;\n    int bank, offset;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    reg = rp1_gpio_pads_read(base, bank, offset);\n    if (reg & RP1_PADS_PUE_SET)\n        pull = PULL_UP;\n    else if (reg & RP1_PADS_PDE_SET)\n        pull = PULL_DOWN;\n\n    return pull;\n}\n\nstatic GPIO_DRIVE_T rp1_gpio_get_drive(void *priv, unsigned gpio)\n{\n    volatile uint32_t *base = priv;\n    uint32_t reg;\n    int bank, offset;\n\n    rp1_gpio_get_bank(gpio, &bank, &offset);\n    reg = rp1_gpio_sys_rio_out_read(base, bank, offset);\n    return (reg & (1U << offset)) ? DRIVE_HIGH : DRIVE_LOW;\n}\n\nstatic const char *rp1_gpio_get_name(void *priv, unsigned gpio)\n{\n    static char name_buf[16];\n    UNUSED(priv);\n\n    if (gpio >= RP1_NUM_GPIOS)\n        return NULL;\n\n    sprintf(name_buf, \"GPIO%d\", gpio);\n    return name_buf;\n}\n\nstatic const char *rp1_gpio_get_fsel_name(void *priv, unsigned gpio, GPIO_FSEL_T fsel)\n{\n    const char *name = NULL;\n    UNUSED(priv);\n    switch (fsel)\n    {\n    case GPIO_FSEL_GPIO:\n        name = \"gpio\";\n        break;\n    case GPIO_FSEL_INPUT:\n        name = \"input\";\n        break;\n    case GPIO_FSEL_OUTPUT:\n        name = \"output\";\n        break;\n    case GPIO_FSEL_NONE:\n        name = \"none\";\n        break;\n    case GPIO_FSEL_FUNC0:\n    case GPIO_FSEL_FUNC1:\n    case GPIO_FSEL_FUNC2:\n    case GPIO_FSEL_FUNC3:\n    case GPIO_FSEL_FUNC4:\n    case GPIO_FSEL_FUNC5:\n    case GPIO_FSEL_FUNC6:\n    case GPIO_FSEL_FUNC7:\n    case GPIO_FSEL_FUNC8:\n        if (gpio < RP1_NUM_GPIOS)\n        {\n            name = rp1_gpio_fsel_names[gpio][fsel - GPIO_FSEL_FUNC0];\n            if (!name)\n                name = \"-\";\n        }\n        break;\n    default:\n        return NULL;\n    }\n    return name;\n}\n\nstatic void *rp1_gpio_create_instance(const GPIO_CHIP_T *chip,\n                                      const char *dtnode)\n{\n    UNUSED(dtnode);\n    return (void *)chip;\n}\n\nstatic int rp1_gpio_count(void *priv)\n{\n    UNUSED(priv);\n    return RP1_NUM_GPIOS;\n}\n\nstatic void *rp1_gpio_probe_instance(void *priv, volatile uint32_t *base)\n{\n    UNUSED(priv);\n    return (void *)base;\n}\n\nstatic const GPIO_CHIP_INTERFACE_T rp1_gpio_interface =\n{\n    .gpio_create_instance = rp1_gpio_create_instance,\n    .gpio_count = rp1_gpio_count,\n    .gpio_probe_instance = rp1_gpio_probe_instance,\n    .gpio_get_fsel = rp1_gpio_get_fsel,\n    .gpio_set_fsel = rp1_gpio_set_fsel,\n    .gpio_set_drive = rp1_gpio_set_drive,\n    .gpio_set_dir = rp1_gpio_set_dir,\n    .gpio_get_dir = rp1_gpio_get_dir,\n    .gpio_get_level = rp1_gpio_get_level,\n    .gpio_get_drive = rp1_gpio_get_drive,\n    .gpio_get_pull = rp1_gpio_get_pull,\n    .gpio_set_pull = rp1_gpio_set_pull,\n    .gpio_get_name = rp1_gpio_get_name,\n    .gpio_get_fsel_name = rp1_gpio_get_fsel_name,\n};\n\nGPIO_CHIP_T rp1_chip = {\"rp1\", \"raspberrypi,rp1-gpio\", &rp1_gpio_interface, 0x30000, 0};\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/gpiochip_rp1.h",
    "content": "#ifndef GPIOCHIP_RP1_H\n#define GPIOCHIP_RP1_H\n\n#define UNUSED(x) (void)(x)\n\n#include <stdint.h>\n\n#define RP1_NUM_GPIOS   54\n#define RP1_FSEL_NUM  9\n\n\nstatic const char *rp1_gpio_fsel_names[RP1_NUM_GPIOS][RP1_FSEL_NUM] =\n{\n    { \"SPI0_SIO3\" , \"DPI_PCLK\"     , \"TXD1\"         , \"SDA0\"         , 0              , \"SYS_RIO00\" , \"PROC_RIO00\" , \"PIO0\"       , \"SPI2_CS0\" , },\n    { \"SPI0_SIO2\" , \"DPI_DE\"       , \"RXD1\"         , \"SCL0\"         , 0              , \"SYS_RIO01\" , \"PROC_RIO01\" , \"PIO1\"       , \"SPI2_SIO1\", },\n    { \"SPI0_CS3\"  , \"DPI_VSYNC\"    , \"CTS1\"         , \"SDA1\"         , \"IR_RX0\"       , \"SYS_RIO02\" , \"PROC_RIO02\" , \"PIO2\"       , \"SPI2_SIO0\", },\n    { \"SPI0_CS2\"  , \"DPI_HSYNC\"    , \"RTS1\"         , \"SCL1\"         , \"IR_TX0\"       , \"SYS_RIO03\" , \"PROC_RIO03\" , \"PIO3\"       , \"SPI2_SCLK\", },\n    { \"GPCLK0\"    , \"DPI_D0\"       , \"TXD2\"         , \"SDA2\"         , \"RI0\"          , \"SYS_RIO04\" , \"PROC_RIO04\" , \"PIO4\"       , \"SPI3_CS0\" , },\n    { \"GPCLK1\"    , \"DPI_D1\"       , \"RXD2\"         , \"SCL2\"         , \"DTR0\"         , \"SYS_RIO05\" , \"PROC_RIO05\" , \"PIO5\"       , \"SPI3_SIO1\", },\n    { \"GPCLK2\"    , \"DPI_D2\"       , \"CTS2\"         , \"SDA3\"         , \"DCD0\"         , \"SYS_RIO06\" , \"PROC_RIO06\" , \"PIO6\"       , \"SPI3_SIO0\", },\n    { \"SPI0_CS1\"  , \"DPI_D3\"       , \"RTS2\"         , \"SCL3\"         , \"DSR0\"         , \"SYS_RIO07\" , \"PROC_RIO07\" , \"PIO7\"       , \"SPI3_SCLK\", },\n    { \"SPI0_CS0\"  , \"DPI_D4\"       , \"TXD3\"         , \"SDA0\"         , 0              , \"SYS_RIO08\" , \"PROC_RIO08\" , \"PIO8\"       , \"SPI4_CS0\" , },\n    { \"SPI0_SIO1\" , \"DPI_D5\"       , \"RXD3\"         , \"SCL0\"         , 0              , \"SYS_RIO09\" , \"PROC_RIO09\" , \"PIO9\"       , \"SPI4_SIO0\", },\n    { \"SPI0_SIO0\" , \"DPI_D6\"       , \"CTS3\"         , \"SDA1\"         , 0              , \"SYS_RIO010\", \"PROC_RIO010\", \"PIO10\"      , \"SPI4_SIO1\", },\n    { \"SPI0_SCLK\" , \"DPI_D7\"       , \"RTS3\"         , \"SCL1\"         , 0              , \"SYS_RIO011\", \"PROC_RIO011\", \"PIO11\"      , \"SPI4_SCLK\", },\n    { \"PWM0_CHAN0\", \"DPI_D8\"       , \"TXD4\"         , \"SDA2\"         , \"AAUD_LEFT\"    , \"SYS_RIO012\", \"PROC_RIO012\", \"PIO12\"      , \"SPI5_CS0\" , },\n    { \"PWM0_CHAN1\", \"DPI_D9\"       , \"RXD4\"         , \"SCL2\"         , \"AAUD_RIGHT\"   , \"SYS_RIO013\", \"PROC_RIO013\", \"PIO13\"      , \"SPI5_SIO1\", },\n    { \"PWM0_CHAN2\", \"DPI_D10\"      , \"CTS4\"         , \"SDA3\"         , \"TXD0\"         , \"SYS_RIO014\", \"PROC_RIO014\", \"PIO14\"      , \"SPI5_SIO0\", },\n    { \"PWM0_CHAN3\", \"DPI_D11\"      , \"RTS4\"         , \"SCL3\"         , \"RXD0\"         , \"SYS_RIO015\", \"PROC_RIO015\", \"PIO15\"      , \"SPI5_SCLK\", },\n    { \"SPI1_CS2\"  , \"DPI_D12\"      , \"DSI0_TE_EXT\"  , 0              , \"CTS0\"         , \"SYS_RIO016\", \"PROC_RIO016\", \"PIO16\"      , },\n    { \"SPI1_CS1\"  , \"DPI_D13\"      , \"DSI1_TE_EXT\"  , 0              , \"RTS0\"         , \"SYS_RIO017\", \"PROC_RIO017\", \"PIO17\"      , },\n    { \"SPI1_CS0\"  , \"DPI_D14\"      , \"I2S0_SCLK\"    , \"PWM0_CHAN2\"   , \"I2S1_SCLK\"    , \"SYS_RIO018\", \"PROC_RIO018\", \"PIO18\"      , \"GPCLK1\",   },\n    { \"SPI1_SIO1\" , \"DPI_D15\"      , \"I2S0_WS\"      , \"PWM0_CHAN3\"   , \"I2S1_WS\"      , \"SYS_RIO019\", \"PROC_RIO019\", \"PIO19\"      , },\n    { \"SPI1_SIO0\" , \"DPI_D16\"      , \"I2S0_SDI0\"    , \"GPCLK0\"       , \"I2S1_SDI0\"    , \"SYS_RIO020\", \"PROC_RIO020\", \"PIO20\"      , },\n    { \"SPI1_SCLK\" , \"DPI_D17\"      , \"I2S0_SDO0\"    , \"GPCLK1\"       , \"I2S1_SDO0\"    , \"SYS_RIO021\", \"PROC_RIO021\", \"PIO21\"      , },\n    { \"SD0_CLK\"   , \"DPI_D18\"      , \"I2S0_SDI1\"    , \"SDA3\"         , \"I2S1_SDI1\"    , \"SYS_RIO022\", \"PROC_RIO022\", \"PIO22\"      , },\n    { \"SD0_CMD\"   , \"DPI_D19\"      , \"I2S0_SDO1\"    , \"SCL3\"         , \"I2S1_SDO1\"    , \"SYS_RIO023\", \"PROC_RIO023\", \"PIO23\"      , },\n    { \"SD0_DAT0\"  , \"DPI_D20\"      , \"I2S0_SDI2\"    , 0              , \"I2S1_SDI2\"    , \"SYS_RIO024\", \"PROC_RIO024\", \"PIO24\"      , \"SPI2_CS1\" , },\n    { \"SD0_DAT1\"  , \"DPI_D21\"      , \"I2S0_SDO2\"    , \"MIC_CLK\"      , \"I2S1_SDO2\"    , \"SYS_RIO025\", \"PROC_RIO025\", \"PIO25\"      , \"SPI3_CS1\" , },\n    { \"SD0_DAT2\"  , \"DPI_D22\"      , \"I2S0_SDI3\"    , \"MIC_DAT0\"     , \"I2S1_SDI3\"    , \"SYS_RIO026\", \"PROC_RIO026\", \"PIO26\"      , \"SPI5_CS1\" , },\n    { \"SD0_DAT3\"  , \"DPI_D23\"      , \"I2S0_SDO3\"    , \"MIC_DAT1\"     , \"I2S1_SDO3\"    , \"SYS_RIO027\", \"PROC_RIO027\", \"PIO27\"      , \"SPI1_CS1\" , },\n    { \"SD1_CLK\"   , \"SDA4\"         , \"I2S2_SCLK\"    , \"SPI6_MISO\"    , \"VBUS_EN0\"     , \"SYS_RIO10\" , \"PROC_RIO10\" , },\n    { \"SD1_CMD\"   , \"SCL4\"         , \"I2S2_WS\"      , \"SPI6_SIO0\"    , \"VBUS_OC0\"     , \"SYS_RIO11\" , \"PROC_RIO11\" , },\n    { \"SD1_DAT0\"  , \"SDA5\"         , \"I2S2_SDI0\"    , \"SPI6_SCLK\"    , \"TXD5\"         , \"SYS_RIO12\" , \"PROC_RIO12\" , },\n    { \"SD1_DAT1\"  , \"SCL5\"         , \"I2S2_SDO0\"    , \"SPI6_CS0\"     , \"RXD5\"         , \"SYS_RIO13\" , \"PROC_RIO13\" , },\n    { \"SD1_DAT2\"  , \"GPCLK3\"       , \"I2S2_SDI1\"    , \"SPI6_CS1\"     , \"CTS5\"         , \"SYS_RIO14\" , \"PROC_RIO14\" , },\n    { \"SD1_DAT3\"  , \"GPCLK4\"       , \"I2S2_SDO1\"    , \"SPI6_CS2\"     , \"RTS5\"         , \"SYS_RIO15\" , \"PROC_RIO15\" , },\n    { \"PWM1_CHAN2\", \"GPCLK3\"       , \"VBUS_EN0\"     , \"SDA4\"         , \"MIC_CLK\"      , \"SYS_RIO20\" , \"PROC_RIO20\" , },\n    { \"SPI8_CS1\"  , \"PWM1_CHAN0\"   , \"VBUS_OC0\"     , \"SCL4\"         , \"MIC_DAT0\"     , \"SYS_RIO21\" , \"PROC_RIO21\" , },\n    { \"SPI8_CS0\"  , \"TXD5\"         , \"PCIE_CLKREQ_N\", \"SDA5\"         , \"MIC_DAT1\"     , \"SYS_RIO22\" , \"PROC_RIO22\" , },\n    { \"SPI8_SIO1\" , \"RXD5\"         , \"MIC_CLK\"      , \"SCL5\"         , \"PCIE_CLKREQ_N\", \"SYS_RIO23\" , \"PROC_RIO23\" , },\n    { \"SPI8_SIO0\" , \"RTS5\"         , \"MIC_DAT0\"     , \"SDA6\"         , \"AAUD_LEFT\"    , \"SYS_RIO24\" , \"PROC_RIO24\" , \"DSI0_TE_EXT\", },\n    { \"SPI8_SCLK\" , \"CTS5\"         , \"MIC_DAT1\"     , \"SCL6\"         , \"AAUD_RIGHT\"   , \"SYS_RIO25\" , \"PROC_RIO25\" , \"DSI1_TE_EXT\", },\n    { \"PWM1_CHAN1\", \"TXD5\"         , \"SDA4\"         , \"SPI6_SIO1\"    , \"AAUD_LEFT\"    , \"SYS_RIO26\" , \"PROC_RIO26\" , },\n    { \"PWM1_CHAN2\", \"RXD5\"         , \"SCL4\"         , \"SPI6_SIO0\"    , \"AAUD_RIGHT\"   , \"SYS_RIO27\" , \"PROC_RIO27\" , },\n    { \"GPCLK5\"    , \"RTS5\"         , \"VBUS_EN1\"     , \"SPI6_SCLK\"    , \"I2S2_SCLK\"    , \"SYS_RIO28\" , \"PROC_RIO28\" , },\n    { \"GPCLK4\"    , \"CTS5\"         , \"VBUS_OC1\"     , \"SPI6_CS0\"     , \"I2S2_WS\"      , \"SYS_RIO29\" , \"PROC_RIO29\" , },\n    { \"GPCLK5\"    , \"SDA5\"         , \"PWM1_CHAN0\"   , \"SPI6_CS1\"     , \"I2S2_SDI0\"    , \"SYS_RIO210\", \"PROC_RIO210\", },\n    { \"PWM1_CHAN3\", \"SCL5\"         , \"SPI7_CS0\"     , \"SPI6_CS2\"     , \"I2S2_SDO0\"    , \"SYS_RIO211\", \"PROC_RIO211\", },\n    { \"GPCLK3\"    , \"SDA4\"         , \"SPI7_SIO0\"    , \"MIC_CLK\"      , \"I2S2_SDI1\"    , \"SYS_RIO212\", \"PROC_RIO212\", \"DSI0_TE_EXT\", },\n    { \"GPCLK5\"    , \"SCL4\"         , \"SPI7_SIO1\"    , \"MIC_DAT0\"     , \"I2S2_SDO1\"    , \"SYS_RIO213\", \"PROC_RIO213\", \"DSI1_TE_EXT\", },\n    { \"PWM1_CHAN0\", \"PCIE_CLKREQ_N\", \"SPI7_SCLK\"    , \"MIC_DAT1\"     , \"TXD5\"         , \"SYS_RIO214\", \"PROC_RIO214\", },\n    { \"SPI8_SCLK\" , \"SPI7_SCLK\"    , \"SDA5\"         , \"AAUD_LEFT\"    , \"RXD5\"         , \"SYS_RIO215\", \"PROC_RIO215\", },\n    { \"SPI8_SIO1\" , \"SPI7_SIO0\"    , \"SCL5\"         , \"AAUD_RIGHT\"   , \"VBUS_EN2\"     , \"SYS_RIO216\", \"PROC_RIO216\", },\n    { \"SPI8_SIO0\" , \"SPI7_SIO1\"    , \"SDA6\"         , \"AAUD_LEFT\"    , \"VBUS_OC2\"     , \"SYS_RIO217\", \"PROC_RIO217\", },\n    { \"SPI8_CS0\"  , 0              , \"SCL6\"         , \"AAUD_RIGHT\"   , \"VBUS_EN3\"     , \"SYS_RIO218\", \"PROC_RIO218\", },\n    { \"SPI8_CS1\"  , \"SPI7_CS0\"     , 0              , \"PCIE_CLKREQ_N\", \"VBUS_OC3\"     , \"SYS_RIO219\", \"PROC_RIO219\", },\n};\n\n\ntypedef enum\n{\n    GPIO_FSEL_FUNC0,\n    GPIO_FSEL_FUNC1,\n    GPIO_FSEL_FUNC2,\n    GPIO_FSEL_FUNC3,\n    GPIO_FSEL_FUNC4,\n    GPIO_FSEL_FUNC5,\n    GPIO_FSEL_FUNC6,\n    GPIO_FSEL_FUNC7,\n    GPIO_FSEL_FUNC8,\n    /* ... */\n    GPIO_FSEL_INPUT = 0x10,\n    GPIO_FSEL_OUTPUT,\n    GPIO_FSEL_GPIO, /* Preserves direction if possible, else input */\n    GPIO_FSEL_NONE, /* If possible, else input */\n    GPIO_FSEL_MAX\n} GPIO_FSEL_T;\n\ntypedef enum\n{\n    PULL_NONE,\n    PULL_DOWN,\n    PULL_UP,\n    PULL_MAX\n} GPIO_PULL_T;\n\ntypedef enum\n{\n    DIR_INPUT,\n    DIR_OUTPUT,\n    DIR_MAX,\n} GPIO_DIR_T;\n\ntypedef enum\n{\n    DRIVE_LOW,\n    DRIVE_HIGH,\n    DRIVE_MAX\n} GPIO_DRIVE_T;\n\ntypedef struct\n{\n    int gpio_num;\n    int fsel_num;\n} rp1_gpio_fsel_result;\n\ntypedef struct GPIO_CHIP_INTERFACE_ GPIO_CHIP_INTERFACE_T;\n\ntypedef struct GPIO_CHIP_\n{\n    const char *name;\n    const char *compatible;\n    const GPIO_CHIP_INTERFACE_T *interface;\n    int size;\n    uintptr_t data;\n} GPIO_CHIP_T;\n\nstruct GPIO_CHIP_INTERFACE_\n{\n    void * (*gpio_create_instance)(const GPIO_CHIP_T *chip, const char *dtnode);\n    int (*gpio_count)(void *priv);\n    void * (*gpio_probe_instance)(void *priv, volatile uint32_t *base);\n    GPIO_FSEL_T (*gpio_get_fsel)(void *priv, uint32_t gpio);\n    void (*gpio_set_fsel)(void *priv, uint32_t gpio, const GPIO_FSEL_T func);\n    void (*gpio_set_drive)(void *priv, uint32_t gpio, GPIO_DRIVE_T drv);\n    void (*gpio_set_dir)(void *priv, uint32_t gpio, GPIO_DIR_T dir);\n    GPIO_DIR_T (*gpio_get_dir)(void *priv, uint32_t gpio);\n    int (*gpio_get_level)(void *priv, uint32_t gpio);  /* The actual level observed */\n    GPIO_DRIVE_T (*gpio_get_drive)(void *priv, uint32_t gpio);  /* What it is being driven as */\n    GPIO_PULL_T (*gpio_get_pull)(void *priv, uint32_t gpio);\n    void (*gpio_set_pull)(void *priv, uint32_t gpio, GPIO_PULL_T pull);\n    const char * (*gpio_get_name)(void *priv, uint32_t gpio);\n    const char * (*gpio_get_fsel_name)(void *priv, uint32_t gpio, GPIO_FSEL_T fsel);\n};\n\n// Declare rp1_chip as an external variable\nextern GPIO_CHIP_T rp1_chip;\n\n#endif // GPIOCHIP_RP1_H\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/remora-spi.c",
    "content": "/********************************************************************\n* Description:  remora-spi.c\n*               This file, 'remora-rpispi.c', is a HAL component that\n*               provides and SPI connection to a external STM32 running Remora PRU firmware.\n*  \t\t\t\t\n*\t\tInitially developed for RaspberryPi -> Arduino Due.\n*\t\tFurther developed for RaspberryPi -> Smoothieboard and clones (LPC1768).\n                Even further developed for RaspberryPi -> STM32 boards\n*\n* Author: Scott Alford\n* License: GPL Version 3\n*\n*\t\tCredit to GP Orcullo and PICnc V2 which originally inspired this\n*\t\tand portions of this code is based on stepgen.c by John Kasunich\n*\t\tand hm2_rpspi.c by Matsche\n*\n* Copyright (c) 2024\tAll rights reserved.\n*\n* Last change: updated for RPi5 with RP1 southbridge\n********************************************************************/\n\n\n#include \"rtapi.h\"\t\t/* RTAPI realtime OS API */\n#include \"rtapi_app.h\"\t\t/* RTAPI realtime module decls */\n#include \"hal.h\"\t\t/* HAL public API decls */\n\n#include <math.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <string.h>\n\n\n// Include these in the source directory when using \"halcompile --install remora-spi.c\"\n\n// Using BCM2835 driver library by Mike McCauley, why reinvent the wheel!\n// http://www.airspayce.com/mikem/bcm2835/index.html\n#include \"bcm2835.h\"\n#include \"bcm2835.c\"\n\n// Raspberry Pi 5 uses the RP1\n#include \"rp1lib.h\"\n#include \"rp1lib.c\"\n#include \"gpiochip_rp1.h\"\n#include \"gpiochip_rp1.c\"\n#include \"spi-dw.h\"\n#include \"spi-dw.c\"\n\n#include \"dtcboards.h\"\n\n#include \"remora.h\"\n\n#define MODNAME \"remora-spi\"\n#define PREFIX \"remora\"\n\nMODULE_AUTHOR(\"Scott Alford AKA scotta\");\nMODULE_DESCRIPTION(\"Driver for Remora STM32 control boards\")\nMODULE_LICENSE(\"GPL v3\");\n\n#define RPI5_RP1_PERI_BASE 0x7c000000\n\n/***********************************************************************\n*                STRUCTURES AND GLOBAL VARIABLES                       *\n************************************************************************/\n\ntypedef struct {\n\thal_bit_t\t\t*SPIenable;\n\thal_bit_t\t\t*SPIreset;\n\thal_bit_t\t\t*PRUreset;\n\tbool\t\t\tSPIresetOld;\n\thal_bit_t\t\t*SPIstatus;\n\thal_bit_t \t\t*stepperEnable[JOINTS];\n\tint\t\t\t\tpos_mode[JOINTS];\n\thal_float_t \t*pos_cmd[JOINTS];\t\t\t// pin: position command (position units)\n\thal_float_t \t*vel_cmd[JOINTS];\t\t\t// pin: velocity command (position units/sec)\n\thal_float_t \t*pos_fb[JOINTS];\t\t\t// pin: position feedback (position units)\n\thal_s32_t\t\t*count[JOINTS];\t\t\t\t// pin: psition feedback (raw counts)\n\thal_float_t \tpos_scale[JOINTS];\t\t\t// param: steps per position unit\n\tfloat \t\t\tfreq[JOINTS];\t\t\t\t// param: frequency command sent to PRU\n\thal_float_t \t*freq_cmd[JOINTS];\t\t\t// pin: frequency command monitoring, available in LinuxCNC\n\thal_float_t \tmaxvel[JOINTS];\t\t\t\t// param: max velocity, (pos units/sec)\n\thal_float_t \tmaxaccel[JOINTS];\t\t\t// param: max accel (pos units/sec^2)\n\thal_float_t\t\t*pgain[JOINTS];\n\thal_float_t\t\t*ff1gain[JOINTS];\n\thal_float_t\t\t*deadband[JOINTS];\n\t//float \t\t\told_pos_cmd[JOINTS];\t\t// previous position command (counts)\n\t//float \t\t\told_pos_cmd_raw[JOINTS];\t\t// previous position command (counts)\n\tfloat \t\t\told_scale[JOINTS];\t\t\t// stored scale value\n\tfloat \t\t\tscale_recip[JOINTS];\t\t// reciprocal value used for scaling\n\tfloat\t\t\tprev_cmd[JOINTS];\n\tfloat\t\t\tcmd_d[JOINTS];\t\t\t\t\t// command derivative\n\thal_float_t \t*setPoint[VARIABLES];\n\thal_float_t \t*processVariable[VARIABLES];\n\thal_bit_t   \t*outputs[DIGITAL_OUTPUTS];\n\thal_bit_t   \t*inputs[DIGITAL_INPUTS*2];\n} data_t;\n\nstatic data_t *data;\n\n#pragma pack(push, 1)\n\ntypedef union\n{\n  // this allow structured access to the outgoing SPI data without having to move it\n  // this is the same structure as the PRU rxData structure\n  struct\n  {\n    uint8_t txBuffer[SPIBUFSIZE];\n  };\n  struct\n  {\n\tint32_t header;\n    int32_t jointFreqCmd[JOINTS];\n    float \tsetPoint[VARIABLES];\n\tuint8_t jointEnable;\n\tuint16_t outputs;\n    uint8_t spare0;\n  };\n} txData_t;\n\nstatic txData_t txData;\n\n\ntypedef union\n{\n  // this allow structured access to the incoming SPI data without having to move it\n  // this is the same structure as the PRU txData structure\n  struct\n  {\n    uint8_t rxBuffer[SPIBUFSIZE];\n  };\n  struct\n  {\n    int32_t header;\n    int32_t jointFeedback[JOINTS];\n    float \tprocessVariable[VARIABLES];\n    uint16_t inputs;\n  };\n} rxData_t;\n\n#pragma pack(pop)\nstatic rxData_t rxData;\n\n\n\n/* other globals */\nstatic int \t\t\tcomp_id;\t\t\t\t// component ID\nstatic const char \t*modname = MODNAME;\nstatic const char \t*prefix = PREFIX;\n\nstatic bool\t\t\tbcm;\t\t\t\t\t// use BCM2835 driver\nstatic bool\t\t\trp1;\t\t\t\t\t// use RP1 driver\n\nstatic int \t\t\tnum_chan = 0;\t\t\t// number of step generators configured\nstatic long \t\told_dtns;\t\t\t\t// update_freq function period in nsec - (THIS IS RUNNING IN THE PI)\nstatic double\t\tdt;\t\t\t\t\t\t// update_freq period in seconds  - (THIS IS RUNNING IN THE PI)\nstatic double \t\trecip_dt;\t\t\t\t// recprocal of period, avoids divides\n\nstatic int64_t \t\taccum[JOINTS] = { 0 };\nstatic int32_t \t\tcount[JOINTS] = { 0 };\nstatic int32_t \t\told_count[JOINTS] = { 0 };\nstatic int8_t\t\tfilter_count[JOINTS] = { 0 };\nstatic int32_t\t\taccum_diff = 0;\n\ntypedef enum CONTROL { POSITION, VELOCITY, INVALID } CONTROL;\n\nchar *ctrl_type[JOINTS] = { \"p\" };\nRTAPI_MP_ARRAY_STRING(ctrl_type,JOINTS,\"control type (pos or vel)\");\n\nint PRU_base_freq = -1;\nRTAPI_MP_INT(PRU_base_freq, \"PRU base thread frequency\");\n\n// for BCM based SPI (Raspberry Pi 5)\nint SPI_clk_div = -1;\nRTAPI_MP_INT(SPI_clk_div, \"SPI clock divider\");\n\n// for RP1 based SPI (Raspberry Pi 5)\nint SPI_num = -1;\nRTAPI_MP_INT(SPI_num, \"SPI number\");\n\nint CS_num = -1;\nRTAPI_MP_INT(CS_num, \"CS number\");\n\nint32_t SPI_freq = -1;\nRTAPI_MP_INT(SPI_freq, \"SPI frequency\");\n\nstatic int reset_gpio_pin = 25;\t\t\t\t// RPI GPIO pin number used to force watchdog reset of the PRU \n\n\n\n\n/***********************************************************************\n*                  LOCAL FUNCTION DECLARATIONS                         *\n************************************************************************/\nstatic int rt_peripheral_init(void);\nstatic int rt_bcm2835_init(void);\nstatic int rt_rp1lib_init(void);\n\nstatic void update_freq(void *arg, long period);\nstatic void spi_write();\nstatic void spi_read();\nstatic void spi_transfer();\nstatic CONTROL parse_ctrl_type(const char *ctrl);\n\n/***********************************************************************\n*                       INIT AND EXIT CODE                             *\n************************************************************************/\n\nint rtapi_app_main(void)\n{\n    char name[HAL_NAME_LEN + 1];\n\tint n, retval;\n\n\tfor (n = 0; n < JOINTS; n++) {\n\t\tif(parse_ctrl_type(ctrl_type[n]) == INVALID) {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\t\t\"STEPGEN: ERROR: bad control type '%s' for axis %i (must be 'p' or 'v')\\n\",\n\t\t\t\t\tctrl_type[n], n);\n\t\t\treturn -1;\n\t\t}\n    }\n\n\t\n\t// check to see PRU chip type has been set at the command line\n\t/*\n\tif (!strcmp(chip_type, \"LPC\") || !strcmp(chip_type, \"lpc\"))\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: Chip type set to LPC\\n\");\n\t\tchip = LPC;\n\t}\n\telse if (!strcmp(chip_type, \"STM\") || !strcmp(chip_type, \"stm\"))\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: Chip type set to STM\\n\");\n\t\tchip = STM;\n\t}\n\telse\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"ERROR: PRU chip type (must be 'LPC' or 'STM')\\n\");\n\t\treturn -1;\n\t}\n\t*/\n\t\n\t// check to see if the PRU base frequency has been set at the command line\n\tif (PRU_base_freq != -1)\n\t{\n\t\tif ((PRU_base_freq < 40000) || (PRU_base_freq > 240000))\n\t\t{\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"ERROR: PRU base frequency incorrect\\n\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tPRU_base_freq = PRU_BASEFREQ;\n\t}\n\t\n\n    // connect to the HAL, initialise the driver\n    comp_id = hal_init(modname);\n    if (comp_id < 0)\n\t{\n\t\trtapi_print_msg(RTAPI_MSG_ERR, \"%s ERROR: hal_init() failed \\n\", modname);\n\t\treturn -1;\n    }\n\n\t// allocate shared memory\n\tdata = hal_malloc(sizeof(data_t));\n\tif (data == 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t\t\"%s: ERROR: hal_malloc() failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\t\n\tbcm = false;\n\trp1 = false;\n\t\n\t// initialise the gpio and spi peripherals\n\tif(!rt_peripheral_init())\n\t{\n\t  rtapi_print_msg(RTAPI_MSG_ERR,\"rt_peripheral_init failed.\\n\");\n      return -1;\n\t\t\n\t}\n\n\t// export remoraPRU SPI enable and status bits\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->SPIenable),\n\t\t\tcomp_id, \"%s.SPI-enable\", prefix);\n\tif (retval != 0) goto error;\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->SPIreset),\n\t\t\tcomp_id, \"%s.SPI-reset\", prefix);\n\tif (retval != 0) goto error;\n\n\tretval = hal_pin_bit_newf(HAL_OUT, &(data->SPIstatus),\n\t\t\tcomp_id, \"%s.SPI-status\", prefix);\n\tif (retval != 0) goto error;\n\n\tif (bcm == true)\n\t{\n\t\tbcm2835_gpio_fsel(reset_gpio_pin, BCM2835_GPIO_FSEL_OUTP);\n\n\t}\n\telse if (rp1 == true)\n\t{\n\t\tgpio_set_fsel(reset_gpio_pin, GPIO_FSEL_OUTPUT);\n\t}\n\t\n\tretval = hal_pin_bit_newf(HAL_IN, &(data->PRUreset),\n\t\t\tcomp_id, \"%s.PRU-reset\", prefix);\n\tif (retval != 0) goto error;\n\n    // export all the variables for each joint\n    for (n = 0; n < JOINTS; n++) {\n\t\t// export pins\n\n\t\tdata->pos_mode[n] = (parse_ctrl_type(ctrl_type[n]) == POSITION);\n/*\nThis is throwing errors from axis.py for some reason...\n\t\t\n\t\tif (data->pos_mode[n]){\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating pos_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t} else {\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR, \"Creating vel_mode[%d] = %d\\n\", n, data->pos_mode[n]);\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n*/\n\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->stepperEnable[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.enable\", prefix, n);\n\t\tif (retval != 0) goto error;\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pos_cmd[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pos-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_cmd[n]) = 0.0;\n\t\t\n\t\tif (data->pos_mode[n] == 0){\n\t\t\tretval = hal_pin_float_newf(HAL_IN, &(data->vel_cmd[n]),\n\t\t\t\t\tcomp_id, \"%s.joint.%01d.vel-cmd\", prefix, n);\n\t\t\tif (retval < 0) goto error;\n\t\t\t*(data->vel_cmd[n]) = 0.0;\t\t\t\n\t\t}\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->freq_cmd[n]),\n\t\t        comp_id, \"%s.joint.%01d.freq-cmd\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->freq_cmd[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->pos_fb[n]),\n\t\t        comp_id, \"%s.joint.%01d.pos-fb\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pos_fb[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->pos_scale[n]),\n\t\t        comp_id, \"%s.joint.%01d.scale\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->pos_scale[n] = 1.0;\n\n\t\tretval = hal_pin_s32_newf(HAL_OUT, &(data->count[n]),\n\t\t        comp_id, \"%s.joint.%01d.counts\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->count[n]) = 0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->pgain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.pgain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->pgain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->ff1gain[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.ff1gain\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->ff1gain[n]) = 0.0;\n\t\t\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->deadband[n]),\n\t\t\t\tcomp_id, \"%s.joint.%01d.deadband\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->deadband[n]) = 0.0;\n\t\t\n\t\tretval = hal_param_float_newf(HAL_RW, &(data->maxaccel[n]),\n\t\t        comp_id, \"%s.joint.%01d.maxaccel\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\tdata->maxaccel[n] = 1.0;\n\t}\n\n\tfor (n = 0; n < VARIABLES; n++) {\n\t// export pins\n\n\t\tretval = hal_pin_float_newf(HAL_IN, &(data->setPoint[n]),\n\t\t        comp_id, \"%s.SP.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->setPoint[n]) = 0.0;\n\n\t\tretval = hal_pin_float_newf(HAL_OUT, &(data->processVariable[n]),\n\t\t        comp_id, \"%s.PV.%01d\", prefix, n);\n\t\tif (retval < 0) goto error;\n\t\t*(data->processVariable[n]) = 0.0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_OUTPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_IN, &(data->outputs[n]),\n\t\t\t\tcomp_id, \"%s.output.%02d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->outputs[n])=0;\n\t}\n\n\tfor (n = 0; n < DIGITAL_INPUTS; n++) {\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->inputs[n]),\n\t\t\t\tcomp_id, \"%s.input.%02d\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->inputs[n])=0;\n\t\t\t\n\t\tretval = hal_pin_bit_newf(HAL_OUT, &(data->inputs[n+DIGITAL_INPUTS]),\n\t\t\t\tcomp_id, \"%s.input.%02d.not\", prefix, n);\n\t\tif (retval != 0) goto error;\n\t\t*(data->inputs[n+DIGITAL_INPUTS])=1;   \n\t}\n\n\terror:\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: pin export failed with err=%i\\n\",\n\t\t        modname, retval);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\n\t// Export functions\n\trtapi_snprintf(name, sizeof(name), \"%s.update-freq\", prefix);\n\tretval = hal_export_funct(name, update_freq, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: update function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.write\", prefix);\n\t/* no FP operations */\n\tretval = hal_export_funct(name, spi_write, 0, 0, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: write function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_snprintf(name, sizeof(name), \"%s.read\", prefix);\n\tretval = hal_export_funct(name, spi_read, data, 1, 0, comp_id);\n\tif (retval < 0) {\n\t\trtapi_print_msg(RTAPI_MSG_ERR,\n\t\t        \"%s: ERROR: read function export failed\\n\", modname);\n\t\thal_exit(comp_id);\n\t\treturn -1;\n\t}\n\n\trtapi_print_msg(RTAPI_MSG_INFO, \"%s: installed driver\\n\", modname);\n\thal_ready(comp_id);\n    return 0;\n}\n\nvoid rtapi_app_exit(void)\n{\n    hal_exit(comp_id);\n}\n\n\n/***********************************************************************\n*                   LOCAL FUNCTION DEFINITIONS                         *\n************************************************************************/\n\nint rt_peripheral_init(void)\n{\n\tFILE *fp;\n    int i, j;\n    char buf[256];\n    ssize_t buflen;\n    char *cptr;\n    const int DTC_MAX = 8;\n    const char *dtcs[DTC_MAX + 1];\n    \n    // assume were only running on >RPi3\n    \n    if ((fp = fopen(\"/proc/device-tree/compatible\" , \"rb\"))){\n\n        // Read the 'compatible' string-list from the device-tree\n        buflen = fread(buf, 1, sizeof(buf), fp);\n        if(buflen < 0) {\n            rtapi_print_msg(RTAPI_MSG_ERR,\"Failed to read platform identity.\\n\");\n            return -1;\n        }\n\n        // Decompose the device-tree buffer into a string-list with the pointers to\n        // each string in dtcs. Don't go beyond the buffer's size.\n        memset(dtcs, 0, sizeof(dtcs));\n        for(i = 0, cptr = buf; i < DTC_MAX && cptr; i++) {\n            dtcs[i] = cptr;\n            j = strlen(cptr);\n            if((cptr - buf) + j + 1 < buflen)\n                cptr += j + 1;\n            else\n                cptr = NULL;\n        }\n\n        for(i = 0; dtcs[i] != NULL; i++) {\n            if(        !strcmp(dtcs[i], DTC_RPI_MODEL_4B)\n                ||    !strcmp(dtcs[i], DTC_RPI_MODEL_4CM)\n                ||    !strcmp(dtcs[i], DTC_RPI_MODEL_400)\n                ||    !strcmp(dtcs[i], DTC_RPI_MODEL_3BP)\n                ||    !strcmp(dtcs[i], DTC_RPI_MODEL_3AP)\n                ||    !strcmp(dtcs[i], DTC_RPI_MODEL_3B)) {\n                rtapi_print_msg(RTAPI_MSG_ERR, \"Raspberry Pi 3 or 4, using BCM2835 driver\\n\");\n                bcm = true;\n                break;    // Found our supported board\n            } else if(!strcmp(dtcs[i], DTC_RPI_MODEL_5B) || !strcmp(dtcs[i], DTC_RPI_MODEL_5CM)) {\n                rtapi_print_msg(RTAPI_MSG_ERR, \"Raspberry Pi 5, using rp1 driver\\n\");\n                rp1 = true;\n                break;    // Found our supported board\n            } else {\n                rtapi_print_msg(RTAPI_MSG_ERR, \"Error, RPi not detected\\n\");\n                return -1;\n            }\n        }\n        fclose(fp);\n    } else {\n        rtapi_print_msg(RTAPI_MSG_ERR,\"Cannot open '/proc/device-tree/compatible' for read.\\n\");\n    }    \t  \t\n        \n\tif (bcm == true)\n\t{\n\t\t// Map the RPi BCM2835 peripherals - uses \"rtapi_open_as_root\" in place of \"open\"\n\t\tif (!rt_bcm2835_init())\n\t\t{\n\t\t  rtapi_print_msg(RTAPI_MSG_ERR,\"rt_bcm2835_init failed. Are you running with root privlages??\\n\");\n\t\t  return -1;\n\t\t}\n\n\t\t// Set the SPI0 pins to the Alt 0 function to enable SPI0 access, setup CS register\n\t\t// and clear TX and RX fifos\n\t\tif (!bcm2835_spi_begin())\n\t\t{\n\t\t  rtapi_print_msg(RTAPI_MSG_ERR,\"bcm2835_spi_begin failed. Are you running with root privlages??\\n\");\n\t\t  return -1;\n\t\t}\n\n\t\t// Configure SPI0\n\t\tbcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default\n\t\tbcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default\n\n\t\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_128);\t\t// 3.125MHz on RPI3\n\t\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_64);\t\t// 6.250MHz on RPI3\n\t\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_32);\t\t// 12.5MHz on RPI3\n\t\t//bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16);\t\t// 25MHz on RPI3\n\t\t\n\t\t// check if the default SPI clock divider has been overriden at the command line\n\t\tif (SPI_clk_div != -1)\n\t\t{\n\t\t\t// check that the setting is a power of 2\n\t\t\tif ((SPI_clk_div & (SPI_clk_div - 1)) == 0)\n\t\t\t{\n\t\t\t\tbcm2835_spi_setClockDivider(SPI_clk_div);\n\t\t\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: SPI clk divider overridden and set to %d\\n\", SPI_clk_div);\t\t\t\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// it's not a power of 2\n\t\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\"ERROR: PRU SPI clock divider incorrect\\n\");\n\t\t\t\treturn -1;\n\t\t\t}\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\tbcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_16);\n\t\t\trtapi_print_msg(RTAPI_MSG_INFO,\"PRU: SPI default clk divider set to 16\\n\");\n\t\t}\n\n\t\tbcm2835_spi_chipSelect(BCM2835_SPI_CS0);                      // The default\n\t\tbcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default\n\n\n\t\t/* RPI_GPIO_P1_19        = 10 \t\tMOSI when SPI0 in use\n\t\t * RPI_GPIO_P1_21        =  9 \t\tMISO when SPI0 in use\n\t\t * RPI_GPIO_P1_23        = 11 \t\tCLK when SPI0 in use\n\t\t * RPI_GPIO_P1_24        =  8 \t\tCE0 when SPI0 in use\n\t\t * RPI_GPIO_P1_26        =  7 \t\tCE1 when SPI0 in use\n\t\t */\n\n\t\t// Configure pullups on SPI0 pins - source termination and CS high (does this allows for higher clock frequencies??? wiring is more important here)\n\t\tbcm2835_gpio_set_pud(RPI_GPIO_P1_19, BCM2835_GPIO_PUD_DOWN);\t// MOSI\n\t\tbcm2835_gpio_set_pud(RPI_GPIO_P1_21, BCM2835_GPIO_PUD_DOWN);\t// MISO\n\t\tbcm2835_gpio_set_pud(RPI_GPIO_P1_24, BCM2835_GPIO_PUD_UP);\t\t// CS0\t\t\t\n\t}\n\telse if (rp1 == true)\n\t{\n\t\tif (!rt_rp1lib_init())\n\t\t{\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\"rt_rp1_init failed.\\n\");\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (SPI_num == -1) SPI_num = 0; // default to SPI0\n\t\tif (CS_num == -1) CS_num = 0; // default to CS0\n\t\tif (SPI_freq == -1) SPI_freq = 20000000; // default to 20MHz\n\t\t\n\t\tif (!rp1spi_init(SPI_num, CS_num, SPI_MODE_0, SPI_freq))  // SPIx, CSx, mode, freq\n\t\t{\n\t\t\trtapi_print_msg(RTAPI_MSG_ERR,\"rp1spi_init failed.\\n\");\n\t\t\treturn -1;\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn -1;\n\t}\n\n}\n\n// This is the same as the standard bcm2835 library except for the use of\n// \"rtapi_open_as_root\" in place of \"open\"\n\nint rt_bcm2835_init(void)\n{\n    int  memfd;\n    int  ok;\n    FILE *fp;\n\n    if (debug) \n    {\n        bcm2835_peripherals = (uint32_t*)BCM2835_PERI_BASE;\n\n\tbcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n\tbcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n\tbcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n\tbcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n\tbcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n\tbcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4;\n\tbcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4;\n\tbcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n\tbcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n\tbcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n\treturn 1; /* Success */\n    }\n\n    /* Figure out the base and size of the peripheral address block\n    // using the device-tree. Required for RPi2/3/4, optional for RPi 1\n    */\n    if ((fp = fopen(BMC2835_RPI2_DT_FILENAME , \"rb\")))\n    {\n        unsigned char buf[16];\n        uint32_t base_address;\n        uint32_t peri_size;\n        if (fread(buf, 1, sizeof(buf), fp) >= 8)\n        {\n            base_address = (buf[4] << 24) |\n              (buf[5] << 16) |\n              (buf[6] << 8) |\n              (buf[7] << 0);\n            \n            peri_size = (buf[8] << 24) |\n              (buf[9] << 16) |\n              (buf[10] << 8) |\n              (buf[11] << 0);\n            \n            if (!base_address)\n            {\n                /* looks like RPI 4 */\n                base_address = (buf[8] << 24) |\n                      (buf[9] << 16) |\n                      (buf[10] << 8) |\n                      (buf[11] << 0);\n                      \n                peri_size = (buf[12] << 24) |\n                (buf[13] << 16) |\n                (buf[14] << 8) |\n                (buf[15] << 0);\n            }\n            /* check for valid known range formats */\n            if ((buf[0] == 0x7e) &&\n                    (buf[1] == 0x00) &&\n                    (buf[2] == 0x00) &&\n                    (buf[3] == 0x00) &&\n                    ((base_address == BCM2835_PERI_BASE) || (base_address == BCM2835_RPI2_PERI_BASE) || (base_address == BCM2835_RPI4_PERI_BASE)))\n            {\n                bcm2835_peripherals_base = (off_t)base_address;\n                bcm2835_peripherals_size = (size_t)peri_size;\n                if( base_address == BCM2835_RPI4_PERI_BASE )\n                {\n                    pud_type_rpi4 = 1;\n                }\n            }\n        \n        }\n        \n\tfclose(fp);\n    }\n    /* else we are prob on RPi 1 with BCM2835, and use the hardwired defaults */\n\n    /* Now get ready to map the peripherals block \n     * If we are not root, try for the new /dev/gpiomem interface and accept\n     * the fact that we can only access GPIO\n     * else try for the /dev/mem interface and get access to everything\n     */\n    memfd = -1;\n    ok = 0;\n    if (geteuid() == 0)\n    {\n      /* Open the master /dev/mem device */\n      if ((memfd = rtapi_open_as_root(\"/dev/mem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/mem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      \n      /* Now compute the base addresses of various peripherals, \n      // which are at fixed offsets within the mapped peripherals block\n      // Caution: bcm2835_peripherals is uint32_t*, so divide offsets by 4\n      */\n      bcm2835_gpio = bcm2835_peripherals + BCM2835_GPIO_BASE/4;\n      bcm2835_pwm  = bcm2835_peripherals + BCM2835_GPIO_PWM/4;\n      bcm2835_clk  = bcm2835_peripherals + BCM2835_CLOCK_BASE/4;\n      bcm2835_pads = bcm2835_peripherals + BCM2835_GPIO_PADS/4;\n      bcm2835_spi0 = bcm2835_peripherals + BCM2835_SPI0_BASE/4;\n      bcm2835_bsc0 = bcm2835_peripherals + BCM2835_BSC0_BASE/4; /* I2C */\n      bcm2835_bsc1 = bcm2835_peripherals + BCM2835_BSC1_BASE/4; /* I2C */\n      bcm2835_st   = bcm2835_peripherals + BCM2835_ST_BASE/4;\n      bcm2835_aux  = bcm2835_peripherals + BCM2835_AUX_BASE/4;\n      bcm2835_spi1 = bcm2835_peripherals + BCM2835_SPI1_BASE/4;\n\n      ok = 1;\n    }\n    else\n    {\n      /* Not root, try /dev/gpiomem */\n      /* Open the master /dev/mem device */\n      if ((memfd = open(\"/dev/gpiomem\", O_RDWR | O_SYNC) ) < 0) \n\t{\n\t  fprintf(stderr, \"bcm2835_init: Unable to open /dev/gpiomem: %s\\n\",\n\t\t  strerror(errno)) ;\n\t  goto exit;\n\t}\n      \n      /* Base of the peripherals block is mapped to VM */\n      bcm2835_peripherals_base = 0;\n      bcm2835_peripherals = mapmem(\"gpio\", bcm2835_peripherals_size, memfd, bcm2835_peripherals_base);\n      if (bcm2835_peripherals == MAP_FAILED) goto exit;\n      bcm2835_gpio = bcm2835_peripherals;\n      ok = 1;\n    }\n\nexit:\n    if (memfd >= 0)\n        close(memfd);\n\n    if (!ok)\n\tbcm2835_close();\n\n    return ok;\n}\n\nint rt_rp1lib_init(void)\n{\n    uint64_t phys_addr = RP1_BAR1;\n\n    DEBUG_PRINT(\"Initialising RP1 library: %s\\n\", __func__);\n\n    // rp1_chip is declared in gpiochip_rp1.c\n    chip = &rp1_chip;\n\n    inst = rp1_create_instance(chip, phys_addr, NULL);\n    if (!inst)\n        return -1;\n\n    inst->phys_addr = phys_addr;\n\n    // map memory\n    inst->mem_fd = rtapi_open_as_root(\"/dev/mem\", O_RDWR | O_SYNC);\n    if (inst->mem_fd < 0)\n        return errno;\n\n    inst->priv = mmap(\n        NULL,\n        RP1_BAR1_LEN,\n        PROT_READ | PROT_WRITE,\n        MAP_SHARED,\n        inst->mem_fd,\n        inst->phys_addr\n        );\n\n    DEBUG_PRINT(\"Base address: %11lx, size: %lx, mapped at address: %p\\n\", inst->phys_addr, RP1_BAR1_LEN, inst->priv);\n\n    if (inst->priv == MAP_FAILED)\n        return errno;\n\n    return 1;\n}\n\n\nvoid update_freq(void *arg, long period)\n{\n\tint i;\n\tdata_t *data = (data_t *)arg;\n\tdouble max_ac, vel_cmd, dv, new_vel, max_freq, desired_freq;\n\t\t   \n\tdouble error, command, feedback;\n\tdouble periodfp, periodrecip;\n\tfloat pgain, ff1gain, deadband;\n\n\t// precalculate timing constants\n    periodfp = period * 0.000000001;\n    periodrecip = 1.0 / periodfp;\n\n    // calc constants related to the period of this function (LinuxCNC SERVO_THREAD)\n    // only recalc constants if period changes\n    if (period != old_dtns) \t\t\t// Note!! period = LinuxCNC SERVO_PERIOD\n\t{\n\t\told_dtns = period;\t\t\t\t// get ready to detect future period changes\n\t\tdt = period * 0.000000001; \t\t// dt is the period of this thread, used for the position loop\n\t\trecip_dt = 1.0 / dt;\t\t\t// calc the reciprocal once here, to avoid multiple divides later\n    }\n\n    // loop through generators\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\t// check for scale change\n\t\tif (data->pos_scale[i] != data->old_scale[i])\n\t\t{\n\t\t\tdata->old_scale[i] = data->pos_scale[i];\t\t// get ready to detect future scale changes\n\t\t\t// scale must not be 0\n\t\t\tif ((data->pos_scale[i] < 1e-20) && (data->pos_scale[i] > -1e-20))\t// validate the new scale value\n\t\t\t\tdata->pos_scale[i] = 1.0;\t\t\t\t\t\t\t\t\t\t// value too small, divide by zero is a bad thing\n\t\t\t\t// we will need the reciprocal, and the accum is fixed point with\n\t\t\t\t//fractional bits, so we precalc some stuff\n\t\t\tdata->scale_recip[i] = (1.0 / STEP_MASK) / data->pos_scale[i];\n\t\t}\n\n\t\t// calculate frequency limit\n\t\t//max_freq = PRU_BASEFREQ/(2.0); \t\n\t\tmax_freq = PRU_base_freq; // step pulses now happen in a single base thread interval\n\n\n\t\t// check for user specified frequency limit parameter\n\t\tif (data->maxvel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxvel[i] = 0.0;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t// parameter is non-zero, compare to max_freq\n\t\t\tdesired_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\n\t\t\tif (desired_freq > max_freq)\n\t\t\t{\n\t\t\t\t// parameter is too high, limit it\n\t\t\t\tdata->maxvel[i] = max_freq / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower max_freq to match parameter\n\t\t\t\tmax_freq = data->maxvel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* set internal accel limit to its absolute max, which is\n\t\tzero to full speed in one thread period */\n\t\tmax_ac = max_freq * recip_dt;\n\t\t\n\t\t// check for user specified accel limit parameter\n\t\tif (data->maxaccel[i] <= 0.0)\n\t\t{\n\t\t\t// set to zero if negative\n\t\t\tdata->maxaccel[i] = 0.0;\n\t\t}\n\t\telse \n\t\t{\n\t\t\t// parameter is non-zero, compare to max_ac\n\t\t\tif ((data->maxaccel[i] * fabs(data->pos_scale[i])) > max_ac)\n\t\t\t{\n\t\t\t\t// parameter is too high, lower it\n\t\t\t\tdata->maxaccel[i] = max_ac / fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// lower limit to match parameter\n\t\t\t\tmax_ac = data->maxaccel[i] * fabs(data->pos_scale[i]);\n\t\t\t}\n\t\t}\n\n\t\t/* at this point, all scaling, limits, and other parameter\n\t\tchanges have been handled - time for the main control */\n\n\t\t\n\n\t\tif (data->pos_mode[i]) {\n\n\t\t\t/* POSITION CONTROL MODE */\n\n\t\t\t// use Proportional control with feed forward (pgain, ff1gain and deadband)\n\t\t\t\n\t\t\tif (*(data->pgain[i]) != 0)\n\t\t\t{\n\t\t\t\tpgain = *(data->pgain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpgain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->ff1gain[i]) != 0)\n\t\t\t{\n\t\t\t\tff1gain = *(data->ff1gain[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tff1gain = 1.0;\n\t\t\t}\n\t\t\t\n\t\t\tif (*(data->deadband[i]) != 0)\n\t\t\t{\n\t\t\t\tdeadband = *(data->deadband[i]);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tdeadband = 1 / data->pos_scale[i];\n\t\t\t}\t\n\n\t\t\t// read the command and feedback\n\t\t\tcommand = *(data->pos_cmd[i]);\n\t\t\tfeedback = *(data->pos_fb[i]);\n\t\t\t\n\t\t\t// calcuate the error\n\t\t\terror = command - feedback;\n\t\t\t\n\t\t\t// apply the deadband\n\t\t\tif (error > deadband)\n\t\t\t{\n\t\t\t\terror -= deadband;\n\t\t\t}\n\t\t\telse if (error < -deadband)\n\t\t\t{\n\t\t\t\terror += deadband;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\terror = 0;\n\t\t\t}\n\t\t\t\n\t\t\t// calcuate command and derivatives\n\t\t\tdata->cmd_d[i] = (command - data->prev_cmd[i]) * periodrecip;\n\t\t\t\n\t\t\t// save old values\n\t\t\tdata->prev_cmd[i] = command;\n\t\t\t\t\n\t\t\t// calculate the output value\n\t\t\tvel_cmd = pgain * error + data->cmd_d[i] * ff1gain;\n\t\t\n\t\t} else {\n\n\t\t\t/* VELOCITY CONTROL MODE */\n\t\t\t\n\t\t\t// calculate velocity command in counts/sec\n\t\t\tvel_cmd = *(data->vel_cmd[i]);\n\t\t}\t\n\t\t\t\n\t\tvel_cmd = vel_cmd * data->pos_scale[i];\n\t\t\t\n\t\t// apply frequency limit\n\t\tif (vel_cmd > max_freq) \n\t\t{\n\t\t\tvel_cmd = max_freq;\n\t\t} \n\t\telse if (vel_cmd < -max_freq) \n\t\t{\n\t\t\tvel_cmd = -max_freq;\n\t\t}\n\t\t\n\t\t// calc max change in frequency in one period\n\t\tdv = max_ac * dt;\n\t\t\n\t\t// apply accel limit\n\t\tif ( vel_cmd > (data->freq[i] + dv) )\n\t\t{\n\t\t\tnew_vel = data->freq[i] + dv;\n\t\t} \n\t\telse if ( vel_cmd < (data->freq[i] - dv) ) \n\t\t{\n\t\t\tnew_vel = data->freq[i] - dv;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tnew_vel = vel_cmd;\n\t\t}\n\t\t\n\t\t// test for disabled stepgen\n\t\tif (*data->stepperEnable == 0) {\n\t\t\t// set velocity to zero\n\t\t\tnew_vel = 0; \n\t\t}\n\t\t\n\t\tdata->freq[i] = new_vel;\t\t// to be sent to the PRU\n\t\t*(data->freq_cmd[i]) = data->freq[i];\t// feedback to LinuxCNC\n\t}\n\n}\n\n\nvoid spi_read()\n{\n\tint i;\n\tdouble curr_pos;\n\t\n\t// following error spike filter pramaters\n\tint n = 2;\n\tint M = 250;\n\n\t// Data header\n\ttxData.header = PRU_READ;\n\t\n\t// update the PRUreset output\n\t// TODO: fix this up to include RP1\n\t\n\tif (*(data->PRUreset))\n\t{ \n\t\tif (bcm == true)\n\t\t{\n\t\t\tbcm2835_gpio_set(reset_gpio_pin);\n\t\t}\n\t\telse if (rp1 == true)\n\t\t{\n\t\t\tgpio_set(reset_gpio_pin);\n\t\t}\n    }\n\telse\n\t{\n\t\tif (bcm == true)\n\t\t{\n\t\t\tbcm2835_gpio_clr(reset_gpio_pin);\n\t\t}\n\t\telse if (rp1 == true)\n\t\t{\n\t\t\tgpio_clear(reset_gpio_pin);\n\t\t}\n    }\n\t\n\t\n\tif (*(data->SPIenable))\n\t{\n\t\tif( (*(data->SPIreset) && !(data->SPIresetOld)) || *(data->SPIstatus) )\n\t\t{\n\t\t\t// reset rising edge detected, try SPI transfer and reset OR PRU running\n\t\t\t\n\t\t\t// Transfer to and from the PRU\n\t\t\tspi_transfer();\n\n\t\t\tswitch (rxData.header)\t\t// only process valid SPI payloads. This rejects bad payloads\n\t\t\t{\n\t\t\t\tcase PRU_DATA:\n\t\t\t\t\t// we have received a GOOD payload from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 1;\n\n\t\t\t\t\tfor (i = 0; i < JOINTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t// the PRU DDS accumulator uses 32 bit counter, this code converts that counter into 64 bits */\n\t\t\t\t\t\told_count[i] = count[i];\n\t\t\t\t\t\tcount[i] = rxData.jointFeedback[i];\n\t\t\t\t\t\taccum_diff = count[i] - old_count[i];\n\t\t\t\t\t\t\n\t\t\t\t\t\t// spike filter\n\t\t\t\t\t\tif (abs(count[i] - old_count[i]) > M && filter_count[i] < n)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// recent big change: hold previous value\n\t\t\t\t\t\t\t++filter_count[i];\n\t\t\t\t\t\t\tcount[i] = old_count[i];\n\t\t\t\t\t\t\trtapi_print(\"Spike filter active[%d][%d]: %d\\n\", i, filter_count[i], accum_diff);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// normal operation, or else the big change must be real after all\n\t\t\t\t\t\t\tfilter_count[i] = 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\n\t\t\t\t\t\t*(data->count[i]) = count[i];\n\t\t\t\t\t\t*(data->pos_fb[i]) = (float)(count[i]) / data->pos_scale[i];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Feedback\n\t\t\t\t\tfor (i = 0; i < VARIABLES; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\t*(data->processVariable[i]) = rxData.processVariable[i]; \n\t\t\t\t\t}\n\n\t\t\t\t\t// Inputs\n\t\t\t\t\tfor (i = 0; i < DIGITAL_INPUTS; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif ((rxData.inputs & (1 << i)) != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 1; \t\t// input is high\n\t\t\t\t\t\t\t*(data->inputs[i+DIGITAL_INPUTS]) = 0;  // inverted\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t*(data->inputs[i]) = 0;\t\t\t// input is low\n\t\t\t\t\t\t\t*(data->inputs[i+DIGITAL_INPUTS]) = 1;  // inverted\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\tcase PRU_ESTOP:\n\t\t\t\t\t// we have an eStop notification from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 0;\n\t\t\t\t\t rtapi_print_msg(RTAPI_MSG_ERR, \"An E-stop is active\");\n\n\t\t\t\tdefault:\n\t\t\t\t\t// we have received a BAD payload from the PRU\n\t\t\t\t\t*(data->SPIstatus) = 0;\n\n\t\t\t\t\trtapi_print(\"Bad SPI payload = %x\\n\", rxData.header);\n\t\t\t\t\t//for (i = 0; i < SPIBUFSIZE; i++) {\n\t\t\t\t\t//\trtapi_print(\"%d\\n\",rxData.rxBuffer[i]);\n\t\t\t\t\t//}\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\t*(data->SPIstatus) = 0;\n\t}\n\t\n\tdata->SPIresetOld = *(data->SPIreset);\n}\n\n\nvoid spi_write()\n{\n\tint i;\n\n\t// Data header\n\ttxData.header = PRU_WRITE;\n\n\t// Joint frequency commands\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\ttxData.jointFreqCmd[i] = data->freq[i];\n\t}\n\n\tfor (i = 0; i < JOINTS; i++)\n\t{\n\t\tif (*(data->stepperEnable[i]) == 1)\n\t\t{\n\t\t\ttxData.jointEnable |= (1 << i);\t\t\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.jointEnable &= ~(1 << i);\t\n\t\t}\n\t}\n\n\t// Set points\n\tfor (i = 0; i < VARIABLES; i++)\n\t{\n\t\ttxData.setPoint[i] = *(data->setPoint[i]);\n\t}\n\n\t// Outputs\n\tfor (i = 0; i < DIGITAL_OUTPUTS; i++)\n\t{\n\t\tif (*(data->outputs[i]) == 1)\n\t\t{\n\t\t\ttxData.outputs |= (1 << i);\t\t// output is high\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttxData.outputs &= ~(1 << i);\t// output is low\n\t\t}\n\t}\n\n\tif( *(data->SPIstatus) )\n\t{\n\t\t// Transfer to and from the PRU\n\t\tspi_transfer();\n\t}\n\n}\n\n\nvoid spi_transfer()\n{\n\t// send and receive data to and from the Remora PRU concurrently\n\n\tif (bcm == true)\n\t{\n\t\tbcm2835_spi_transfernb(txData.txBuffer, rxData.rxBuffer, SPIBUFSIZE);\n\t}\n\telse if (rp1 == true)\n\t{\n\t\trp1spi_transfer(0, txData.txBuffer, rxData.rxBuffer, SPIBUFSIZE);\n\t}\n}\n\nstatic CONTROL parse_ctrl_type(const char *ctrl)\n{\n    if(!ctrl || !*ctrl || *ctrl == 'p' || *ctrl == 'P') return POSITION;\n    if(*ctrl == 'v' || *ctrl == 'V') return VELOCITY;\n    return INVALID;\n}\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/remora.h",
    "content": "\n#ifndef REMORA_H\n#define REMORA_H\n\n\n#define JOINTS\t\t\t\t8  \t\t\t// Number of joints - set this the same as Remora firmware code!!!. Max 8 joints\n#define VARIABLES          \t6 \t\t\t// Number of command values - set this the same Remora firmware code!!!\n#define DIGITAL_OUTPUTS\t\t16\n#define DIGITAL_INPUTS\t\t32\n\n#define SPIBUFSIZE\t\t\t64 \t\t\t//(4+4*JOINTS+4*COMMANDS+1) //(MAX_MSG*4) //20  SPI buffer size ......FIFO buffer size is 64 bytes?\n\n#define PRU_DATA\t\t\t0x64617461 \t// \"data\" SPI payload\n#define PRU_READ          \t0x72656164  // \"read\" SPI payload\n#define PRU_WRITE         \t0x77726974  // \"writ\" SPI payload\n#define PRU_ESTOP           0x65737470  // \"estp\" SPI payload\n\n#define STEPBIT\t\t\t\t22\t\t\t// bit location in DDS accum\n#define STEP_MASK\t\t\t(1L<<STEPBIT)\n#define STEP_OFFSET\t\t\t(1L<<(STEPBIT-1))\n\n#define PRU_BASEFREQ\t\t40000 \t\t// Base freq of the PRU stepgen in Hz\n\n\n\n#endif\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/rp1lib.c",
    "content": "\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <fcntl.h>\n#include <sys/mman.h>\n#include <unistd.h>\n#include <errno.h>\n\n\n#include \"rp1lib.h\"\n#include \"gpiochip_rp1.h\"\n#include \"spi-dw.h\"\n\n\nconst uint32_t spi_bases[] = {\n    RP1_SPI0_BASE,\n    RP1_SPI1_BASE,\n    RP1_SPI2_BASE,\n    RP1_SPI3_BASE,\n    RP1_SPI4_BASE,\n    RP1_SPI5_BASE,\n    RP1_SPI6_BASE,\n    RP1_SPI7_BASE,\n    RP1_SPI8_BASE\n};\n\n\nGPIO_CHIP_T     *chip;\nRP1_DEVICE_T    *inst;\nstatic unsigned num_gpios;\nchar mosi_pin[15], miso_pin[15], sclk_pin[15], cs_pin[15];\n\n\nrp1_gpio_fsel_result rp1_get_gpio_fsel_from_name(const char *pin_name)\n{\n    rp1_gpio_fsel_result result = { -1, -1 }; // Initialise with invalid values\n\n    // Search across all rows and columns in rp1_gpio_fsel_names in gpiochip_rp1.h\n        for (int i = 0; i < RP1_NUM_GPIOS; i++) {\n        for (int j = 0; j < RP1_FSEL_NUM; j++) {\n            if (rp1_gpio_fsel_names[i][j] == NULL) continue;\n\n            if (strcmp(rp1_gpio_fsel_names[i][j], pin_name) == 0) {\n                result.gpio_num = i;\n                result.fsel_num = j;\n                return result;\n            }\n        }\n    }\n\n    return result; // Return with -1 values if not found\n}\n\n\nvoid rp1spi_transfer(uint8_t spi_num, const void *txbuf, void *rxbuf, uint8_t len)\n{\n    struct dw_spi *dws;\n    struct spi_device *spi;\n\n    const uint8_t *tx = txbuf;\n    uint8_t *rx = rxbuf;\n\n    dws = &inst->spi[spi_num];\n    spi = &inst->spi_dev[spi_num];\n\n    dws->tx = (void *)tx;\n    dws->tx_len = len;\n    dws->rx = rx;\n    dws->rx_len = len;\n\n    // manage the chip select\n    dw_writel(dws, DW_SPI_SER, 1 << spi->chip_select);\n\n    // transfer\n    dw_spi_poll_transfer(dws);\n\n    // manage the chip select\n    dw_writel(dws, DW_SPI_SER, 0);\n}\n\n\nint rp1spi_init(uint8_t spi_num, uint8_t cs_num, uint8_t mode, uint32_t freq)\n{\n    DEBUG_PRINT(\"rp1spi_init(), SPI%d\\n\", spi_num);\n\n    struct dw_spi       *dws;\n    struct dw_spi_cfg   *cfg;\n    struct spi_device   *dev;\n    rp1_gpio_fsel_result res;\n\n    dws = &inst->spi[spi_num];\n    cfg = &inst->spi_cfg[spi_num];\n    dev = &inst->spi_dev[spi_num];\n\n    dws->max_freq = RP1_SPI_SPEED;\n\n    dev->max_speed_hz = dws->max_freq;\n    dev->chip_select = cs_num;\n    dev->mode = mode;\n    dev->bits_per_word = 8; // hard coded to 8 bits per word\n\n    cfg->tmode = DW_SPI_CTRLR0_TMOD_TR;  // transmit and receive\n    cfg->dfs = dev->bits_per_word;\n    cfg->freq = freq;\n\n    // SPI bases address\n    dws->regs = (volatile uint32_t *)((uintptr_t)inst->priv + spi_bases[spi_num]);\n\n    DEBUG_PRINT(\"SPI%d Base address: %11lx, mapped at address: %p\\n\", spi_num, spi_bases[spi_num], dws->regs);\n\n    // Basic HW init\n    dw_spi_hw_init(dws);\n\n    // Configure the gpio pins\n    // SPI pin names\n    snprintf(mosi_pin, sizeof(mosi_pin), \"SPI%d_SIO0\", spi_num);\n    snprintf(miso_pin, sizeof(miso_pin), \"SPI%d_SIO1\", spi_num);\n    snprintf(sclk_pin, sizeof(sclk_pin), \"SPI%d_SCLK\", spi_num);\n    snprintf(cs_pin, sizeof(cs_pin), \"SPI%d_CS%d\", spi_num, cs_num);\n\n    // Search for MOSI pin by name\n    res = rp1_get_gpio_fsel_from_name(mosi_pin);\n    if (res.gpio_num != -1) {\n        DEBUG_PRINT(\"Pin: MOSI -> GPIO Number: %d, FSEL Number: %d\\n\", res.gpio_num, res.fsel_num);\n    } else {\n\t\treturn -1;\n        printf(\"Failed to get GPIO and FSEL for pin: %s\\n\", mosi_pin);\n    }\n    gpio_set_fsel(res.gpio_num, res.fsel_num);\n    gpio_set_pull(res.gpio_num, PULL_NONE);\n\n    // Search for MISO pin by name\n    res = rp1_get_gpio_fsel_from_name(miso_pin);\n    if (res.gpio_num != -1) {\n        DEBUG_PRINT(\"Pin: MISO -> GPIO Number: %d, FSEL Number: %d\\n\", res.gpio_num, res.fsel_num);\n    } else {\n\t\treturn -1;\n        printf(\"Failed to get GPIO and FSEL for pin: %s\\n\", miso_pin);\n    }\n    gpio_set_fsel(res.gpio_num, res.fsel_num);\n    gpio_set_pull(res.gpio_num, PULL_NONE);\n\n    // Search for SCLK pin by name\n    res = rp1_get_gpio_fsel_from_name(sclk_pin);\n    if (res.gpio_num != -1) {\n        DEBUG_PRINT(\"Pin: SCLK -> GPIO Number: %d, FSEL Number: %d\\n\", res.gpio_num, res.fsel_num);\n    } else {\n\t\treturn -1;\n        printf(\"Failed to get GPIO and FSEL for pin: %s\\n\", sclk_pin);\n    }\n    gpio_set_fsel(res.gpio_num, res.fsel_num);\n    gpio_set_pull(res.gpio_num, PULL_NONE);\n\n    // Search for CS pin by name\n    res = rp1_get_gpio_fsel_from_name(cs_pin);\n    if (res.gpio_num != -1) {\n        DEBUG_PRINT(\"Pin: CS   -> GPIO Number: %d, FSEL Number: %d\\n\", res.gpio_num, res.fsel_num);\n    } else {\n\t\treturn -1;\n        printf(\"Failed to get GPIO and FSEL for pin: %s\\n\", cs_pin);\n    }\n    gpio_set_fsel(res.gpio_num, res.fsel_num);\n    gpio_set_pull(res.gpio_num, PULL_NONE);\n\n     // Disable controller before writing control registers\n    dw_spi_enable_chip(dws, 0);\n\n    // Configre SPI\n    dws->n_bytes = 1;\n    dev->cr0 = dw_spi_prepare_cr0(dws, dev);\n    dw_spi_update_config(dws, dev, cfg);\n\n    uint32_t baudr = dw_readl(dws, DW_SPI_BAUDR);\n    DEBUG_PRINT(\"clk_div = %d\\n\", baudr);\n\n    baudr = dws->max_freq / dw_readl(dws, DW_SPI_BAUDR);\n    DEBUG_PRINT(\"BAUDR = %d hz\\n\", baudr);\n\n    // Enable controller after writing control registers\n    dw_spi_enable_chip(dws, 1);\n\n    return 1;\n}\n\n\nGPIO_DIR_T gpio_get_dir(unsigned gpio)\n{\n    return inst->chip->interface->gpio_get_dir(inst->priv, gpio);\n}\n\n\nvoid gpio_set_dir(unsigned gpio, GPIO_DIR_T dir)\n{\n   inst->chip->interface->gpio_set_dir(inst->priv, gpio, dir);\n}\n\n\nGPIO_FSEL_T gpio_get_fsel(unsigned gpio)\n{\n    GPIO_FSEL_T fsel = GPIO_FSEL_MAX;\n\n    fsel = inst->chip->interface->gpio_get_fsel(inst->priv, gpio);\n\n    if (fsel == GPIO_FSEL_GPIO)\n    {\n        if (gpio_get_dir(gpio) == DIR_OUTPUT)\n            fsel = GPIO_FSEL_OUTPUT;\n        else\n            fsel = GPIO_FSEL_INPUT;\n    }\n\n    return fsel;\n}\n\n\nvoid gpio_set_fsel(unsigned gpio, const GPIO_FSEL_T func)\n{\n    inst->chip->interface->gpio_set_fsel(inst->priv, gpio, func);\n}\n\n\nvoid gpio_set_drive(unsigned gpio, GPIO_DRIVE_T drv)\n{\n    inst->chip->interface->gpio_set_drive(inst->priv, gpio, drv);\n}\n\n\nvoid gpio_set(unsigned gpio)\n{\n    inst->chip->interface->gpio_set_drive(inst->priv, gpio, 1);\n    inst->chip->interface->gpio_set_dir(inst->priv, gpio, DIR_OUTPUT);\n}\n\n\nvoid gpio_clear(unsigned gpio)\n{\n    inst->chip->interface->gpio_set_drive(inst->priv, gpio, 0);\n    inst->chip->interface->gpio_set_dir(inst->priv, gpio, DIR_OUTPUT);\n}\n\n\nint gpio_get_level(unsigned gpio)\n{\n    return inst->chip->interface->gpio_get_level(inst->priv, gpio);\n}\n\n\nGPIO_DRIVE_T gpio_get_drive(unsigned gpio)\n{\n    return inst->chip->interface->gpio_get_drive(inst->priv, gpio);\n}\n\n\nGPIO_PULL_T gpio_get_pull(unsigned gpio)\n{\n    return inst->chip->interface->gpio_get_pull(inst->priv, gpio);\n}\n\n\nvoid gpio_set_pull(unsigned gpio, GPIO_PULL_T pull)\n{\n    inst->chip->interface->gpio_set_pull(inst->priv, gpio, pull);\n}\n\n\nstatic RP1_DEVICE_T *rp1_create_instance(const GPIO_CHIP_T *chip, uint64_t phys_addr, const char *name)\n{\n    RP1_DEVICE_T *inst = (RP1_DEVICE_T *)calloc(1, sizeof(RP1_DEVICE_T));\n\n    inst->chip = chip;\n    inst->name = name ? name: chip->name;\n    inst->phys_addr = phys_addr;\n    inst->priv = NULL;\n    inst->base = 0;\n\n    inst->priv = chip->interface->gpio_create_instance(chip, NULL);\n    if (!inst->priv)\n        return NULL;\n\n    return inst;\n}\n\n\nint rp1lib_init(void)\n{\n    uint64_t phys_addr = RP1_BAR1;\n\n    DEBUG_PRINT(\"Initialising RP1 library: %s\\n\", __func__);\n\n    // rp1_chip is declared in gpiochip_rp1.c\n    chip = &rp1_chip;\n\n    inst = rp1_create_instance(chip, phys_addr, NULL);\n    if (!inst)\n        return -1;\n\n    inst->phys_addr = phys_addr;\n\n    // map memory\n    inst->mem_fd = open(\"/dev/mem\", O_RDWR | O_SYNC);\n    if (inst->mem_fd < 0)\n        return errno;\n\n    inst->priv = mmap(\n        NULL,\n        RP1_BAR1_LEN,\n        PROT_READ | PROT_WRITE,\n        MAP_SHARED,\n        inst->mem_fd,\n        inst->phys_addr\n        );\n\n    DEBUG_PRINT(\"Base address: %11lx, size: %lx, mapped at address: %p\\n\", inst->phys_addr, RP1_BAR1_LEN, inst->priv);\n\n    if (inst->priv == MAP_FAILED)\n        return errno;\n\n    return (int)num_gpios;\n}\n\n\nint rp1lib_deinit(void)\n{\n    if (inst)\n    {\n        //Clean up SPI instances etc\n\n        munmap(inst->priv, RP1_BAR1_LEN);\n        free(inst);\n        return 0;\n    }\n    else return -1;\n}\n\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/rp1lib.h",
    "content": "#ifndef RP1_H\n#define RP1_H\n\n#include <stdint.h>\n#include <stddef.h>\n\n#define DEBUG 1 // Set to 1 to enable debug prints\n\n#include \"gpiochip_rp1.h\"\n#include \"spi-dw.h\"\n\n#define RP1_BAR1 0x1F00000000  // Base address for RP1\n#define RP1_BAR1_LEN 0x400000  // Length of the memory-mapped region\n\n#define SPI_DEV 6\n#define RP1_SPI_SPEED 200000000\n\n// Offsets for SPI peripherals\n#define RP1_SPI0_BASE 0x050000\n#define RP1_SPI1_BASE 0x054000\n#define RP1_SPI2_BASE 0x058000\n#define RP1_SPI3_BASE 0x05C000\n#define RP1_SPI4_BASE 0x060000  // Slave only\n#define RP1_SPI5_BASE 0x064000\n#define RP1_SPI6_BASE 0x068000  // Not available on GPIO\n#define RP1_SPI7_BASE 0x06C000  // Not available on GPIO\n#define RP1_SPI8_BASE 0x04C000  // Not available on GPIO\n\n#define NUM_HDR_PINS 40\n#define MAX_GPIO_PINS 300\n\n#define GPIO_INVALID (~0U)\n#define GPIO_GND (~1U)\n#define GPIO_5V (~2U)\n#define GPIO_3V3 (~3U)\n#define GPIO_1V8 (~4U)\n#define GPIO_OTHER (~5U)\n\n\ntypedef struct {\n    //volatile uint32_t *regs;    // Base address for the SPI instance\n    //uint8_t *txdata;            // Pointer to transmit data array\n    //uint8_t *rxdata;            // Pointer to receive data array\n} SPI_DEVICE_T;\n\n\ntypedef struct {\n    const GPIO_CHIP_T *chip;\n    const char *name;\n    int mem_fd;\n    void *priv;                 // Base address for the RP1 device\n    uint64_t phys_addr;\n    unsigned num_gpios;\n    uint64_t base;\n    //SPI_DEVICE_T *spi[SPI_MAX]; // Array of pointers to SPI devices\n    struct dw_spi spi[SPI_DEV];            // Array of Designware SPI structures\n    struct dw_spi_cfg spi_cfg[SPI_DEV];    // Array of SPI slave device structures\n    struct spi_device spi_dev[SPI_DEV];    // Array of SPI device structures\n} RP1_DEVICE_T;\n\n\n// Function declarations\nint rp1lib_init(void);\nint rp1lib_deinit(void);\n\nint rp1spi_init(uint8_t spi_num, uint8_t chip_select, uint8_t mode, uint32_t freq);\nrp1_gpio_fsel_result rp1_get_gpio_fsel_from_name(const char *pin_name);\nvoid rp1spi_transfer(uint8_t spi_num, const void *txbuf, void *rxbuf, uint8_t len);\n\nint gpio_num_is_valid(unsigned gpio);\nGPIO_DIR_T gpio_get_dir(unsigned gpio);\nvoid gpio_set_dir(unsigned gpio, GPIO_DIR_T dir);\nGPIO_FSEL_T gpio_get_fsel(unsigned gpio);\nvoid gpio_set_fsel(unsigned gpio, const GPIO_FSEL_T func);\nvoid gpio_set_drive(unsigned gpio, GPIO_DRIVE_T drv);\nvoid gpio_set(unsigned gpio);\nvoid gpio_clear(unsigned gpio);\nint gpio_get_level(unsigned gpio);  /* The actual level observed */\nGPIO_DRIVE_T gpio_get_drive(unsigned gpio);  /* What it is being driven as */\nGPIO_PULL_T gpio_get_pull(unsigned gpio);\nvoid gpio_set_pull(unsigned gpio, GPIO_PULL_T pull);\n\nvoid gpio_get_pin_range(unsigned *first, unsigned *last);\nunsigned gpio_for_pin(int pin);\nint gpio_to_pin(unsigned gpio);\nunsigned gpio_get_gpio_by_name(const char *name, int namelen);\nconst char *gpio_get_name(unsigned gpio);\nconst char *gpio_get_gpio_fsel_name(unsigned gpio, GPIO_FSEL_T fsel);\nconst char *gpio_get_fsel_name(GPIO_FSEL_T fsel);\nconst char *gpio_get_pull_name(GPIO_PULL_T pull);\nconst char *gpio_get_drive_name(GPIO_DRIVE_T drive);\n\n\n#endif // RP1_H\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/spi-dw.c",
    "content": "#include <stdint.h>\n\n#include \"spi-dw.h\"\n\n/* Return the max entries we can fill into tx fifo */\nstatic inline uint32_t dw_spi_tx_max(struct dw_spi *dws)\n{\n  uint32_t tx_room, rxtx_gap;\n\n  tx_room = dws->fifo_len - dw_readl(dws, DW_SPI_TXFLR);\n\n  /*\n   * Another concern is about the tx/rx mismatch, we\n   * though to use (dws->fifo_len - rxflr - txflr) as\n   * one maximum value for tx, but it doesn't cover the\n   * data which is out of tx/rx fifo and inside the\n   * shift registers. So a control from sw point of\n   * view is taken.\n   */\n  rxtx_gap = dws->fifo_len - (dws->rx_len - dws->tx_len);\n\n  return MIN3((uint32_t)dws->tx_len, tx_room, rxtx_gap);\n}\n\n/* Return the max entries we should read out of rx fifo */\nstatic inline uint32_t dw_spi_rx_max(struct dw_spi *dws)\n{\n  return MIN(dws->rx_len, dw_readl(dws, DW_SPI_RXFLR));\n}\n\nstatic void dw_writer(struct dw_spi *dws)\n{\n  uint32_t max = dw_spi_tx_max(dws);\n  uint32_t txw = 0;\n\n  while (max--) {\n    if (dws->tx) {\n      if (dws->n_bytes == 1)\n        txw = *(uint8_t *)(dws->tx);\n      else if (dws->n_bytes == 2)\n        txw = *(uint16_t *)(dws->tx);\n      else\n        txw = *(uint32_t *)(dws->tx);\n\n      dws->tx += dws->n_bytes;\n    }\n    dw_writel(dws, DW_SPI_DR, txw);\n    --dws->tx_len;\n  }\n}\n\nstatic void dw_reader(struct dw_spi *dws)\n{\n  uint32_t max = dw_spi_rx_max(dws);\n  uint32_t rxw;\n\n  while (max--) {\n    rxw = dw_readl(dws, DW_SPI_DR);\n    if (dws->rx) {\n      if (dws->n_bytes == 1)\n        *(uint8_t *)(dws->rx) = rxw;\n      else if (dws->n_bytes == 2)\n        *(uint16_t *)(dws->rx) = rxw;\n      else\n        *(uint32_t *)(dws->rx) = rxw;\n\n      dws->rx += dws->n_bytes;\n    }\n    --dws->rx_len;\n  }\n}\n\n\nuint32_t dw_spi_prepare_cr0(struct dw_spi *dws, struct spi_device *spi)\n{\n\tuint32_t cr0 = 0;\n\n\tif (dw_spi_ip_is(dws, PSSI)) {\n\t\t/* CTRLR0[ 5: 4] Frame Format */\n\t\tcr0 |= FIELD_PREP(DW_PSSI_CTRLR0_FRF_MASK, DW_SPI_CTRLR0_FRF_MOTO_SPI);\n\n\t\t/*\n\t\t * SPI mode (SCPOL|SCPH)\n\t\t * CTRLR0[ 6] Serial Clock Phase\n\t\t * CTRLR0[ 7] Serial Clock Polarity\n\t\t */\n\t\tif (spi->mode & SPI_CPOL)\n\t\t\tcr0 |= DW_PSSI_CTRLR0_SCPOL;\n\t\tif (spi->mode & SPI_CPHA)\n\t\t\tcr0 |= DW_PSSI_CTRLR0_SCPHA;\n\n\t\t/* CTRLR0[11] Shift Register Loop */\n\t\tif (spi->mode & SPI_LOOP)\n\t\t\tcr0 |= DW_PSSI_CTRLR0_SRL;\n\t} else {\n\t\t/* CTRLR0[ 7: 6] Frame Format */\n\t\tcr0 |= FIELD_PREP(DW_HSSI_CTRLR0_FRF_MASK, DW_SPI_CTRLR0_FRF_MOTO_SPI);\n\n\t\t/*\n\t\t * SPI mode (SCPOL|SCPH)\n\t\t * CTRLR0[ 8] Serial Clock Phase\n\t\t * CTRLR0[ 9] Serial Clock Polarity\n\t\t */\n\t\tif (spi->mode & SPI_CPOL)\n\t\t\tcr0 |= DW_HSSI_CTRLR0_SCPOL;\n\t\tif (spi->mode & SPI_CPHA)\n\t\t\tcr0 |= DW_HSSI_CTRLR0_SCPHA;\n\n\t\t/* CTRLR0[13] Shift Register Loop */\n\t\tif (spi->mode & SPI_LOOP)\n\t\t\tcr0 |= DW_HSSI_CTRLR0_SRL;\n\n\t\t/* CTRLR0[31] MST */\n\t\tif (dw_spi_ver_is_ge(dws, HSSI, 102A))\n\t\t\tcr0 |= DW_HSSI_CTRLR0_MST;\n\t}\n\n\treturn cr0;\n}\n\n\nvoid dw_spi_update_config(struct dw_spi *dws, struct spi_device *spi, struct dw_spi_cfg *cfg)\n{\n\tuint32_t cr0 = spi->cr0;\n\tuint32_t speed_hz;\n\tuint16_t clk_div;\n\n\t/* CTRLR0[ 4/3: 0] or CTRLR0[ 20: 16] Data Frame Size */\n\tcr0 |= (cfg->dfs - 1) << dws->dfs_offset;\n\n\tif (dw_spi_ip_is(dws, PSSI))\n\t\t/* CTRLR0[ 9:8] Transfer Mode */\n\t\tcr0 |= FIELD_PREP(DW_PSSI_CTRLR0_TMOD_MASK, cfg->tmode);\n\telse\n\t\t/* CTRLR0[11:10] Transfer Mode */\n\t\tcr0 |= FIELD_PREP(DW_HSSI_CTRLR0_TMOD_MASK, cfg->tmode);\n\n\tdw_writel(dws, DW_SPI_CTRLR0, cr0);\n\n\tif (cfg->tmode == DW_SPI_CTRLR0_TMOD_EPROMREAD ||\n\t    cfg->tmode == DW_SPI_CTRLR0_TMOD_RO)\n\t\tdw_writel(dws, DW_SPI_CTRLR1, cfg->ndf ? cfg->ndf - 1 : 0);\n\n\t/* Note DW APB SSI clock divider doesn't support odd numbers */\n\tclk_div = (DIV_ROUND_UP(dws->max_freq, cfg->freq) + 1) & 0xfffe;\n\tspeed_hz = dws->max_freq / clk_div;\n\n\tif (dws->current_freq != speed_hz) {\n\t\tdw_spi_set_clk(dws, clk_div);\n\t\tdws->current_freq = speed_hz;\n\t}\n}\n\n/*\n * The iterative procedure of the poll-based transfer is simple: write as much\n * as possible to the Tx FIFO, wait until the pending to receive data is ready\n * to be read, read it from the Rx FIFO and check whether the performed\n * procedure has been successful.\n *\n * Note this method the same way as the IRQ-based transfer won't work well for\n * the SPI devices connected to the controller with native CS due to the\n * automatic CS assertion/de-assertion.\n */\nint dw_spi_poll_transfer(struct dw_spi *dws)\n{\n\tdo {\n\t\tdw_writer(dws);\n\t\tdw_reader(dws);\n\t} while (dws->rx_len);\n\n\treturn 0;\n}\n\n\nvoid dw_spi_hw_init(struct dw_spi *dws)\n{\n    dw_spi_reset_chip(dws);\n\n    /*\n    * Retrieve the Synopsys component version if it hasn't been specified\n    * by the platform. CoreKit version ID is encoded as a 3-chars ASCII\n    * code enclosed with '*' (typical for the most of Synopsys IP-cores).\n    */\n\tif (!dws->ver) {\n\t\tdws->ver = dw_readl(dws, DW_SPI_VERSION);\n\t\tDEBUG_PRINT(\"dws->ver = %x\\n\", dws->ver);\n\n        DEBUG_PRINT(\"Synopsys DWC%sSSI v%c.%c%c\\n\",\n\t\t\tdw_spi_ip_is(dws, PSSI) ? \" APB \" : \" \",\n\t\t\tDW_SPI_GET_BYTE(dws->ver, 3), DW_SPI_GET_BYTE(dws->ver, 2),\n\t\t\tDW_SPI_GET_BYTE(dws->ver, 1));\n\t}\n\n\t/*\n\t* Try to detect the FIFO depth if not set by interface driver,\n\t* the depth could be from 2 to 256 from HW spec\n\t*/\n\tif (!dws->fifo_len) {\n\t\tuint32_t fifo;\n\n\t\tfor (fifo = 1; fifo < 256; fifo++) {\n\t\t\tdw_writel(dws, DW_SPI_TXFTLR, fifo);\n\t\t\tif (fifo != dw_readl(dws, DW_SPI_TXFTLR))\n\t\t\t\tbreak;\n\t\t}\n\t\tdw_writel(dws, DW_SPI_TXFTLR, 0);\n\n\t\tdws->fifo_len = (fifo == 1) ? 0 : fifo;\n\t\tDEBUG_PRINT(\"Detected FIFO size: %u bytes\\n\", dws->fifo_len);\n\t}\n\n\t/*\n\t* Detect CTRLR0.DFS field size and offset by testing the lowest bits\n\t* writability. Note DWC SSI controller also has the extended DFS, but\n\t* with zero offset.\n\t*/\n\tif (dw_spi_ip_is(dws, PSSI)) {\n\t\tuint32_t cr0, tmp = dw_readl(dws, DW_SPI_CTRLR0);\n\n\t\tdw_spi_enable_chip(dws, 0);\n\t\tdw_writel(dws, DW_SPI_CTRLR0, 0xffffffff);\n\t\tcr0 = dw_readl(dws, DW_SPI_CTRLR0);\n\t\tdw_writel(dws, DW_SPI_CTRLR0, tmp);\n\t\tdw_spi_enable_chip(dws, 1);\n\n\t\tif (!(cr0 & DW_PSSI_CTRLR0_DFS_MASK)) {\n\t\t\tdws->caps |= DW_SPI_CAP_DFS32;\n\t\t\tdws->dfs_offset = __bf_shf(DW_PSSI_CTRLR0_DFS32_MASK);\n\t\t\tDEBUG_PRINT(\"Detected 32-bits max data frame size\\n\");\n\t\t}\n\t} else {\n\t\tdws->caps |= DW_SPI_CAP_DFS32;\n\t}\n\n    /* enable HW fixup for explicit CS deselect for Amazon's alpine chip */\n\tif (dws->caps & DW_SPI_CAP_CS_OVERRIDE)\n\t\tdw_writel(dws, DW_SPI_CS_OVERRIDE, 0xF);\n}\n\n"
  },
  {
    "path": "LinuxCNC/Components/Remora-spi/spi-dw.h",
    "content": "#ifndef SPI_DW_H\n#define SPI_DW_H\n\n#include <stdio.h>\n#include <stdint.h>\n\n#define DEBUG 1 // Define DEBUG to enable debugging output\n\n#if DEBUG\n    #define DEBUG_PRINT(fmt, ...) \\\n        do { fprintf(stderr, \"DEBUG: \" fmt, ##__VA_ARGS__); } while (0)\n#else\n    #define DEBUG_PRINT(fmt, ...) \\\n        do { } while (0)\n#endif\n\n#define MIN(a,b) (a < b ? a:b)\n#define MIN3(a,b,c) (MIN(MIN(a,b),c))\n#define __bf_shf(x) (__builtin_ffsll(x)-1)\n#define BIT(a)           (0x1U << (a))\n#define GENMASK(a, b)    (((unsigned) -1 >> (31 - (b))) & ~((1U << (a)) - 1))\n#define FIELD_PREP(_mask, _val)\t\t\t\t\t\t\\\n\t({\t\t\t\t\t\t\t\t\\\n\t\t((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask);\t\\\n\t})\n#define DIV_ROUND_UP(n,d) (((n) + (d) -1) / (d))\n\n#define\tSPI_CPHA\t0x01\t\t\t/* clock phase */\n#define\tSPI_CPOL\t0x02\t\t\t/* clock polarity */\n#define\tSPI_MODE_0\t(0|0)\t\t\t/* (original MicroWire) */\n#define\tSPI_MODE_1\t(0|SPI_CPHA)\n#define\tSPI_MODE_2\t(SPI_CPOL|0)\n#define\tSPI_MODE_3\t(SPI_CPOL|SPI_CPHA)\n#define\tSPI_CS_HIGH\t0x04\t\t\t/* chipselect active high? */\n#define\tSPI_LSB_FIRST\t0x08\t\t/* per-word bits-on-wire */\n#define\tSPI_3WIRE\t0x10\t\t\t/* SI/SO signals shared */\n#define\tSPI_LOOP\t0x20\t\t\t/* loopback mode */\n#define\tSPI_NO_CS\t0x40\t\t\t/* 1 dev/bus, no chipselect */\n#define\tSPI_READY\t0x80\t\t\t/* slave pulls low to pause */\n\n/* Synopsys DW SSI IP-core virtual IDs */\n#define DW_PSSI_ID 0\n#define DW_HSSI_ID 1\n\n/* Synopsys DW SSI component versions (FourCC sequence) */\n#define DW_HSSI_102A\t\t\t0x3130322a\n\n/* DW SSI IP-core ID and version check helpers */\n#define dw_spi_ip_is(_dws, _ip) ((_dws)->ip == DW_##_ip##_ID)\n\n#define __dw_spi_ver_cmp(_dws, _ip, _ver, _op)                                 \\\n  (dw_spi_ip_is(_dws, _ip) && (_dws)->ver _op DW_##_ip##_##_ver)\n\n#define dw_spi_ver_is(_dws, _ip, _ver) __dw_spi_ver_cmp(_dws, _ip, _ver, ==)\n\n#define dw_spi_ver_is_ge(_dws, _ip, _ver) __dw_spi_ver_cmp(_dws, _ip, _ver, >=)\n\n/* DW SPI controller capabilities */\n#define DW_SPI_CAP_CS_OVERRIDE  BIT(0)\n#define DW_SPI_CAP_DFS32        BIT(1)\n\n/* Register offsets (Generic for both DWC APB SSI and DWC SSI IP-cores) */\n#define DW_SPI_CTRLR0 0x00\n#define DW_SPI_CTRLR1 0x04\n#define DW_SPI_SSIENR 0x08\n#define DW_SPI_MWCR 0x0c\n\n#define DW_SPI_SER 0x10\n#define DW_SPI_SER_CS0 BIT(0)\n#define DW_SPI_SER_CS1 BIT(1)\n#define DW_SPI_SER_CS2 BIT(2)\n#define DW_SPI_SER_CS3 BIT(3)\n\n#define DW_SPI_BAUDR 0x14\n#define DW_SPI_TXFTLR 0x18\n#define DW_SPI_RXFTLR 0x1c\n#define DW_SPI_TXFLR 0x20\n#define DW_SPI_RXFLR 0x24\n#define DW_SPI_SR 0x28\n#define DW_SPI_IMR 0x2c\n#define DW_SPI_ISR 0x30\n#define DW_SPI_RISR 0x34\n#define DW_SPI_TXOICR 0x38\n#define DW_SPI_RXOICR 0x3c\n#define DW_SPI_RXUICR 0x40\n#define DW_SPI_MSTICR 0x44\n#define DW_SPI_ICR 0x48\n#define DW_SPI_DMACR 0x4c\n#define DW_SPI_DMATDLR 0x50\n#define DW_SPI_DMARDLR 0x54\n#define DW_SPI_IDR 0x58\n#define DW_SPI_VERSION 0x5c\n#define DW_SPI_DR 0x60\n#define DW_SPI_RX_SAMPLE_DLY 0xf0\n#define DW_SPI_CS_OVERRIDE 0xf4\n\n/* Bit fields in CTRLR0 (DWC APB SSI) */\n#define DW_PSSI_CTRLR0_DFS_MASK\t\t\t    GENMASK(3, 0)\n#define DW_PSSI_CTRLR0_DFS32_MASK\t\t    GENMASK(20, 16)\n\n#define DW_PSSI_CTRLR0_FRF_MASK\t\t\t    GENMASK(5, 4)\n#define DW_SPI_CTRLR0_FRF_MOTO_SPI\t\t  0x0\n#define DW_SPI_CTRLR0_FRF_TI_SSP\t\t    0x1\n#define DW_SPI_CTRLR0_FRF_NS_MICROWIRE\t0x2\n#define DW_SPI_CTRLR0_FRF_RESV\t\t\t    0x3\n\n#define DW_PSSI_CTRLR0_MODE_MASK\t\t    GENMASK(7, 6)\n#define DW_PSSI_CTRLR0_SCPHA\t\t\t      BIT(6)\n#define DW_PSSI_CTRLR0_SCPOL\t\t\t      BIT(7)\n\n#define DW_PSSI_CTRLR0_TMOD_MASK\t\t    GENMASK(9, 8)\n#define DW_SPI_CTRLR0_TMOD_TR\t\t\t      0x0\t/* xmit & recv */\n#define DW_SPI_CTRLR0_TMOD_TO\t\t\t      0x1\t/* xmit only */\n#define DW_SPI_CTRLR0_TMOD_RO\t\t\t      0x2\t/* recv only */\n#define DW_SPI_CTRLR0_TMOD_EPROMREAD\t\t0x3\t/* eeprom read mode */\n\n#define DW_PSSI_CTRLR0_SLV_OE\t\t\t      BIT(10)\n#define DW_PSSI_CTRLR0_SRL\t\t\t        BIT(11)\n#define DW_PSSI_CTRLR0_CFS\t\t\t        BIT(12)\n\n/* Bit fields in CTRLR0 (DWC SSI with AHB interface) */\n#define DW_HSSI_CTRLR0_DFS_MASK\t\t\tGENMASK(4, 0)\n#define DW_HSSI_CTRLR0_FRF_MASK\t\t\tGENMASK(7, 6)\n#define DW_HSSI_CTRLR0_SCPHA\t\t\tBIT(8)\n#define DW_HSSI_CTRLR0_SCPOL\t\t\tBIT(9)\n#define DW_HSSI_CTRLR0_TMOD_MASK\t\tGENMASK(11, 10)\n#define DW_HSSI_CTRLR0_SRL\t\t\tBIT(13)\n#define DW_HSSI_CTRLR0_MST\t\t\tBIT(31)\n\n#define BITS_PER_BYTE 8\n#define DW_SPI_GET_BYTE(_val, _idx) \\\n\t((_val) >> (BITS_PER_BYTE * (_idx)) & 0xff)\n\nstruct spi_device {\n  uint32_t  cr0;\n  uint32_t  max_speed_hz;\n  uint8_t\tchip_select;\n  uint8_t\tmode;\n  uint8_t\tbits_per_word;\n};\n\n\n/* Slave spi_transfer/spi_mem_op related */\nstruct dw_spi_cfg {\n\tuint8_t tmode;\n\tuint8_t dfs;\n\tuint32_t ndf;\n\tuint32_t freq;\n};\n\nstruct dw_spi {\n  uint32_t       ip;   /* Synopsys DW SSI IP-core ID */\n  uint32_t       ver;  /* Synopsys component version */\n  uint32_t       caps; /* DW SPI capabilities */\n\n  void           *regs;\n  unsigned long  paddr;\n\n  uint32_t       fifo_len;       /* depth of the FIFO buffer */\n  unsigned int   dfs_offset;    /* CTRLR0 DFS field offset */\n  uint32_t       max_freq;      /* max bus freq supported */\n\n  void           *tx;\n  unsigned int   tx_len;\n  void           *rx;\n  unsigned int   rx_len;\n\n  uint8_t        n_bytes; /* current is a 1/2 bytes op */\n  uint32_t       current_freq; /* frequency in hz */\n};\n\n\n// Forward declarations\nvoid dw_spi_hw_init(struct dw_spi *dws);\nuint32_t dw_spi_prepare_cr0(struct dw_spi *dws, struct spi_device *spi);\nvoid dw_spi_update_config(struct dw_spi *dws, struct spi_device *spi, struct dw_spi_cfg *cfg);\nint dw_spi_poll_transfer(struct dw_spi *dws);\n\n\n// Read a 32-bit value from the SPI device's registers\nstatic inline uint32_t dw_readl(struct dw_spi *dws, uint32_t offset) {\n  return *(volatile uint32_t *)(dws->regs + offset);\n}\n\n// Write a 32-bit value to the SPI device's registers\nstatic inline void dw_writel(struct dw_spi *dws, uint32_t offset, uint32_t val) {\n  *(volatile uint32_t *)(dws->regs + offset) = val;\n}\n\n// enable spi\nstatic inline void dw_spi_enable_chip(struct dw_spi *dws, int enable) {\n    dw_writel(dws, DW_SPI_SSIENR, (enable ? 1 : 0));\n}\n\n// Set the SPI clock divisor\nstatic inline void dw_spi_set_clk(struct dw_spi *dws, uint16_t div) {\n  dw_writel(dws, DW_SPI_BAUDR, div);\n}\n\n// Disable interrupts\nstatic inline void dw_spi_mask_intr(struct dw_spi *dws, uint32_t mask) {\n  uint32_t new_mask;\n\n  new_mask = dw_readl(dws, DW_SPI_IMR) & ~mask;\n  dw_writel(dws, DW_SPI_IMR, new_mask);\n}\n\n// Enable interrupts\nstatic inline void dw_spi_umask_intr(struct dw_spi *dws, uint32_t mask) {\n  uint32_t new_mask;\n\n  new_mask = dw_readl(dws, DW_SPI_IMR) | mask;\n  dw_writel(dws, DW_SPI_IMR, new_mask);\n}\n\n\n/*\n * This disables the SPI controller, interrupts, clears the interrupts status\n * and CS, then re-enables the controller back. Transmit and receive FIFO\n * buffers are cleared when the device is disabled.\n */\n\n\nstatic inline void dw_spi_reset_chip(struct dw_spi *dws) {\n    dw_spi_enable_chip(dws, 0);\n    dw_spi_mask_intr(dws, 0xff);\n    dw_readl(dws, DW_SPI_ICR);\n    dw_writel(dws, DW_SPI_SER, 0);\n    dw_spi_enable_chip(dws, 1);\n}\n\n// Shutdown the SPI chip\nstatic inline void dw_spi_shutdown_chip(struct dw_spi *dws) {\n  dw_spi_enable_chip(dws, 0);\n  dw_spi_set_clk(dws, 0);\n}\n\n\n\n\n\n#endif // SPI_DW_H\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/3D_printer_panel.xml",
    "content": "<pyvcp>\n<labelframe text=\"3D Printer\">\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Heated Bed\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Extruder 0\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Cooling Fan\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Fan speed: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-fan-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n<label>\n<text>\" Probe\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Position: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"BLtouch-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n       <button>\n         <halpin>\"PRUreset\"</halpin>\n         <bd>3</bd>\n         <text>\"PRU Reset\"</text>\n       </button>\n</labelframe>\n</pyvcp>"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/3Dprinter.hal",
    "content": "# Include your custom HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# tool changing\n\n\tnet tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared\n\tnet tool-change-loopback iocontrol.0.tool-change => iocontrol.0.tool-changed\n\n# PID controllers for heaters\n\n\tloadrt PIDcontroller names=PID-bed,PID-ext0\n\taddf PID-bed.compute servo-thread\n\taddf PID-ext0.compute servo-thread\n\n\n# end-stops\n\n\t# FOR SKR V1.4\n\tnet X-stop \tremora.input.00 \t=> joint.0.home-sw-in joint.0.neg-lim-sw-in\n\tnet Y-stop \tremora.input.01 \t=> joint.1.home-sw-in joint.1.neg-lim-sw-in\n\tnet Z-stop \tremora.input.02 \t=> joint.2.home-sw-in joint.2.neg-lim-sw-in\n\t#net E0DET \tremora.input.03 \t=> joint.0.pos-lim-sw-in\n\t#net E1DET \tremora.input.04 \t=> joint.1.pos-lim-sw-in\n\t#net PWRDET \tremora.input.05 \t=> joint.2.home-lim-sw-in\n\t# FOR MSK SBASAE V1.3\n\t#net X-min \tremora.input.00 \t=> joint.0.home-sw-in joint.0.neg-lim-sw-in\n\t##net X-max \tremora.input.01 \t=> joint.0.pos-lim-sw-in\n\t#net Y-min \tremora.input.02 \t=> joint.1.home-sw-in joint.1.neg-lim-sw-in\n\t##net Y-max \tremora.input.03 \t=> joint.1.pos-lim-sw-in\n\t#net Z-min \tremora.input.04 \t=> joint.2.home-sw-in joint.2.neg-lim-sw-in\n\t##net Z-max \tremora.input.05 \t=> joint.2.home-lim-sw-in\n\n\n# remora command outputs\n\n\tnet bed-heater-SP \t=> remora.SP.0\n\tnet ext0-heater-SP  \t=> remora.SP.1\n\tnet ext0-cooling-SP \t=> remora.SP.2\n\tnet BLtouch-SP \t\t=> remora.SP.3\n\n\n# remora command feedbacks\n\n\tnet bed-PV \t\t=> remora.PV.0\n\tnet ext0-PV \t\t=> remora.PV.1\n\tnet ext1-PV \t\t=> remora.PV.2\n\n\n## Bed PID configuration\n\n\tnet remora-status \t=> PID-bed.auto\n\tnet bed-SP \t\t=> PID-bed.SP\n\tnet bed-PV \t\t=> PID-bed.PV\n\tnet bed-heater-SP \t=> PID-bed.CV\n\n\tsetp PID-bed.pOnM \t[BED]PID_PONM\n\tsetp PID-bed.direction\t[BED]PID_DIR\n\tsetp PID-bed.KP\t\t[BED]PID_KP\n\tsetp PID-bed.KI\t\t[BED]PID_KI\n\tsetp PID-bed.KD\t\t[BED]PID_KD\n\tsetp PID-bed.SPmin\t[BED]PID_SPMIN\n\tsetp PID-bed.SPmax\t[BED]PID_SPMAX\n\tsetp PID-bed.CVmin\t[BED]PID_CVMIN\n\tsetp PID-bed.CVmax\t[BED]PID_CVMAX\n\n\n# Extruder 0 PID configuration\n\n\tnet remora-status \t=> PID-ext0.auto\n\tnet ext0-SP \t\t=> PID-ext0.SP\n\tnet ext0-PV \t\t=> PID-ext0.PV\n\tnet ext0-heater-SP \t=> PID-ext0.CV\n\n\tsetp PID-ext0.pOnM \t[EXT0]PID_PONM\n\tsetp PID-ext0.direction\t[EXT0]PID_DIR\n\tsetp PID-ext0.KP\t[EXT0]PID_KP\n\tsetp PID-ext0.KI\t[EXT0]PID_KI\n\tsetp PID-ext0.KD\t[EXT0]PID_KD\n\tsetp PID-ext0.SPmin\t[EXT0]PID_SPMIN\n\tsetp PID-ext0.SPmax\t[EXT0]PID_SPMAX\n\tsetp PID-ext0.CVmin\t[EXT0]PID_CVMIN\n\tsetp PID-ext0.CVmax\t[EXT0]PID_CVMAX\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# remora command outputs\n\nnet bed-SP  \t=> pyvcp.bed-SP\nnet ext0-SP  \t=> pyvcp.ext0-SP\nnet ext0-fan-SP => pyvcp.ext0-fan-SP\nnet BLtouch-SP \t=> pyvcp.BLtouch-SP\n\n\n# remora command feedbacks\n\nnet bed-PV \t=> pyvcp.bed-PV\nnet ext0-PV \t=> pyvcp.ext0-PV\n\nnet PRUreset \t\t<= pyvcp.PRUreset \t\t=> remora.PRU-reset\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/ender3.hal",
    "content": "\nloadrt [KINS]KINEMATICS\nloadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n# load the Remora real-time component\n\n\t# for STM32 chips\n\tloadrt remora-spi\n\n\t# for LPC17XX chips \n\t#loadrt remora_lpc\n\n\n\n# estop and SPI comms enable and feedback\n\n\tnet user-enable-out\t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remora-status \t<= remora.SPI-status \t\t=> iocontrol.0.emc-enable-in\n\n\n# add the remora and motion functions to threads\n\n\taddf remora.read \t\tservo-thread\n\taddf motion-command-handler\tservo-thread\n\taddf motion-controller \t\tservo-thread\n\taddf remora.update-freq \tservo-thread\n\taddf remora.write \t\tservo-thread\n\n\n# joint 0 setup\n\n\tsetp remora.joint.0.scale \t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\n\tnet j0pos-cmd \t\tjoint.0.motor-pos-cmd \t=> remora.joint.0.pos-cmd\n\tnet j0pos-fb \t\tremora.joint.0.pos-fb \t=> joint.0.motor-pos-fb\n\tnet j0enable \t\tjoint.0.amp-enable-out \t=> remora.joint.0.enable\n\n\n# joint 1 setup\n\n\tsetp remora.joint.1.scale \t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1pos-cmd \t\tjoint.1.motor-pos-cmd \t=> remora.joint.1.pos-cmd\n\tnet j1pos-fb \t\tremora.joint.1.pos-fb \t=> joint.1.motor-pos-fb\n\tnet j1enable \t\tjoint.1.amp-enable-out \t=> remora.joint.1.enable\n\n# joint 2 setup\n\n\tsetp remora.joint.2.deadband 0.005\n\tsetp remora.joint.2.scale\t[JOINT_2]SCALE\n\tsetp remora.joint.2.maxaccel\t[JOINT_2]STEPGEN_MAXACCEL\n\n\tnet j2pos-cmd \t\tjoint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\n\tnet j2pos-fb \t\tremora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\n\tnet j2enable \t\tjoint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n# joint 3 setup\n\n\tsetp remora.joint.3.scale\t[JOINT_3]SCALE\n\tsetp remora.joint.3.maxaccel\t[JOINT_3]STEPGEN_MAXACCEL\n\tsetp remora.joint.3.pgain\t[JOINT_3]PGAIN\n\n\tnet j3pos-cmd \t\tjoint.3.motor-pos-cmd \t=> remora.joint.3.pos-cmd\n\tnet j3pos-fb \t\tremora.joint.3.pos-fb \t=> joint.3.motor-pos-fb\n\tnet j3enable \t\tjoint.3.amp-enable-out \t=> remora.joint.3.enable\n\n# joint 4 setup\n#\n#\tsetp remora.joint.4.scale\t[JOINT_4]SCALE\n#\tsetp remora.joint.4.maxaccel\t[JOINT_4]STEPGEN_MAXACCEL\n#\tsetp remora.joint.4.pgain\t[JOINT_4]PGAIN\n#\n#\tnet j4pos-cmd \t\tjoint.4.motor-pos-cmd \t=> remora.joint.4.pos-cmd\n#\tnet j4pos-fb \t\tremora.joint.4.pos-fb \t=> joint.4.motor-pos-fb\n#\tnet j4enable \t\tjoint.4.amp-enable-out \t=> remora.joint.4.enable\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/ender3.ini",
    "content": "\n[EMC]\nMACHINE = Ender 3\nDEBUG = 0\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\n# Cycle time, in seconds, that display will sleep between polls\nCYCLE_TIME = 0.100\n# Initial display setting for position, RELATIVE or MACHINE\nPOSITION_OFFSET = RELATIVE\n# Initial display setting for position, COMMANDED or ACTUAL\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\n# Highest value that will be allowed for feed override, 1.0 = 100%\nMAX_FEED_OVERRIDE = 1.2\nMAX_SPINDLE_OVERRIDE = 1.0\nDEFAULT_LINEAR_VELOCITY = 50.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 550.00\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\nPYVCP = 3D_printer_panel.xml\n\n[KINS]\nJOINTS = 4\nKINEMATICS =trivkins coordinates=XYZA\n\n[FILTER]\nPROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image\nPROGRAM_EXTENSION = .py Python Script\npng = image-to-gcode\ngif = image-to-gcode\njpg = image-to-gcode\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\nSUBROUTINE_PATH = ~/linuxcnc/subroutines\nUSER_M_PATH = ~/linuxcnc/m_codes\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\nSERVO_PERIOD = 1000000\n\n[HAL]\nHALFILE = ender3.hal\nHALFILE = 3Dprinter.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n# To enable powering down machine( M84 )\n# enable HALUI. cmd=halcmd setp halui.machine.off true\nHALUI = halui \n\n[TRAJ]\nCOORDINATES =  X Y Z A\nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nARC_BLEND_ENABLE=1\nDEFAULT_LINEAR_VELOCITY = 100.00\nMAX_LINEAR_VELOCITY = 550.00\nMAX_LINEAR_ACCELERATION = 4500.00\nNO_FORCE_HOMING = 1 \n#MAX_ANGULAR_VELOCITY = 45.00\n#DEFAULT_ANGULAR_VELOCITY = 4.50\n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n\n[AXIS_X]\nMAX_VELOCITY = 150\nMAX_ACCELERATION = 4500.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 230.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 230.0\nMAX_VELOCITY = 160.0\nMAX_ACCELERATION = 4500.0\n# Set Stepgen max 20% higher than the axis\nSTEPGEN_MAXACCEL = 4000.0\nSCALE = -80\nFERROR = 2.0\nMIN_FERROR = 0.75\nHOME_SEARCH_VEL = -30.0\nHOME_LATCH_VEL = -3.0\nHOME_FINAL_VEL = 20\nHOME_IGNORE_LIMITS = YES\nHOME_USE_INDEX = NO\nHOME_OFFSET = -1.0\nHOME = 0.0\nHOME_SEQUENCE = 0 \n\n\n[AXIS_Y]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 4500.0\nMIN_LIMIT = -1.0\nMAX_LIMIT = 230.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -1.0\nMAX_LIMIT = 230.0\nMAX_VELOCITY = 160.0\nMAX_ACCELERATION = 4500.0\nSTEPGEN_MAXACCEL = 4000.0\nSCALE = -80\nFERROR = 2.0\nMIN_FERROR = 0.75\nHOME_SEARCH_VEL = -30.0\nHOME_LATCH_VEL = -3.0\nHOME_FINAL_VEL = 20\nHOME_IGNORE_LIMITS = YES\nHOME_USE_INDEX = NO\nHOME_OFFSET = -1.0\nHOME = -1.0\nHOME_SEQUENCE = 2\n\n\n[AXIS_Z]\nMAX_VELOCITY = 20.0\nMAX_ACCELERATION = 500.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 230\nOFFSET_AV_RATIO = 0.2\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 230\nMAX_VELOCITY = 25.0\nMAX_ACCELERATION = 500.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400\nFERROR = 2.0\nMIN_FERROR = 0.75\nHOME_SEARCH_VEL = -10.0\nHOME_LATCH_VEL = -3.0\nHOME_FINAL_VEL = 20\nHOME_IGNORE_LIMITS = YES\nHOME_USE_INDEX = NO\nHOME_OFFSET = -1.0\nHOME = 0.0\nHOME_SEQUENCE = 1 \n\n# Extruder 0\n[AXIS_A]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 2500.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\n\n[JOINT_3]\nTYPE = LINEAR\nPGAIN = 50\n#TYPE = ANGULAR\nHOME = 0.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\nMAX_VELOCITY = 160.0\nMAX_ACCELERATION = 2500.0\nSTEPGEN_MAXACCEL = 3000.0\n# 1/16:\n#SCALE = -97.7276\n# 1/8:\nSCALE = -48.8638\nFERROR = 2.00\nMIN_FERROR = 0.75\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# ------------------------------\n#    3D Printer configuration\n# ------------------------------\n\n# Heated bed\n[BED]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 21.5\nPID_KI\t\t= 1.0\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 80.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n\n# Extruder 0\n[EXT0]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 2.9\nPID_KI\t\t= 0.11\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 270.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/gcode2ngc.py",
    "content": "#!/usr/bin/env python\n# gcode2ngc.py\n\nimport sys\n\n\n# First line\nprint \"%\"\n\nf = file(sys.argv[1])\nfor line in f:\n\n    # Change extruder axis name\n    line = line.replace(\" E\", \" A\")\n\n    # S -> P\n    line = line.replace(\" S\", \" P\")\n\n    # Comment M82 code\n    line = line.replace(\"M82\", \";M82\")\n\n    # Comment M84 code\n    line = line.replace(\"M84\", \";M84\")\n\n    print line.strip()\n\n# Last line\nprint \"%\""
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/linuxcnc.var",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t0.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/linuxcnc.var.bak",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t0.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/probe-results.txt",
    "content": "-0.000080 0.000059 0.025933 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.993950 0.006350 -0.049080 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.000207 0.000043 -0.129105 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987766 0.000021 -0.254069 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.993887 -0.006165 -0.321577 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.993900 0.006269 -0.406607 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.987774 -0.000048 -0.451620 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.006344 39.993887 -0.379061 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.006094 39.993801 -0.289056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.012489 40.000132 -0.206618 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.012541 40.000004 -0.199187 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.012466 39.999933 -0.109063 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.000053 40.000032 -0.051626 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.012569 40.000044 -0.079106 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000023 79.987680 -0.171585 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.993933 80.006310 -0.174064 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.993874 79.993769 -0.219068 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.994055 79.993801 -0.256602 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.987771 79.999978 -0.294064 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987707 80.000057 -0.369142 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000210 80.000128 -0.444086 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000138 119.987611 -0.521568 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.006297 119.993796 -0.449133 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.006062 119.993864 -0.404179 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.006168 119.993788 -0.326555 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.999828 120.000044 -0.291653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.012568 120.000042 -0.276660 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n-0.000050 120.000013 -0.294077 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000061 159.987627 -0.296611 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.987740 160.000071 -0.324194 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.987747 160.000063 -0.364057 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987694 159.999949 -0.431689 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.993992 160.006315 -0.486555 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987604 160.000038 -0.521580 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.987625 160.000002 -0.604056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.993784 199.993904 -0.671595 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.012463 200.000067 -0.571580 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.006317 200.006319 -0.524123 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.012535 200.000040 -0.489056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.012535 200.000086 -0.404080 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.012470 199.999975 -0.359058 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.012459 200.000025 -0.334096 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000225 240.000212 -0.356623 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.994026 240.006403 -0.376677 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.000282 239.999964 -0.411589 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987617 240.000055 -0.526609 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.000267 239.999933 -0.611560 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987686 240.000093 -0.646621 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.994007 240.006407 -0.756566 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/pyvcp_options.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\nsets spindle-at-speed true\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/ender3/tool.tbl",
    "content": "T1 P1 Z-0.804203 ;extruder 0 \nT2 P2 ;\nT3 P3 ;\nT99 P99 X-22.000000 ;probe \n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/3D_printer_panel.xml",
    "content": "<pyvcp>\n<labelframe text=\"3D Printer\">\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Heated Bed\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Extruder 0\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Cooling Fan\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Fan speed: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-fan-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n<label>\n<text>\" Probe\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Position: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"BLtouch-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n<hbox>\n\t<label>\t\n\t\t<text>\" Compensation\"</text>\n\t\t<fg>\"blue\"</fg>\n\t\t<anchor>\"w\"</anchor>\n\t</label>\n\t<checkbutton>\n\t\t<anchor>\"w\"</anchor>\n\t\t<halpin>\"z-enable\"</halpin>\n\t\t<text>\"Enable\"</text>\n\t\t<padx>1</padx>\n\t\t<initval>0</initval>\n\t</checkbutton>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Z offset: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"z-offset-f\"</halpin>\n    \t<format>\"+10.4f\"</format>\n    </number>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Z offset req: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"z-offset-request-f\"</halpin>\n    \t<format>\"+10.4f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n       <button>\n         <halpin>\"PRU-reset\"</halpin>\n         <bd>3</bd>\n         <text>\"PRU Reset\"</text>\n       </button>\n</labelframe>\n</pyvcp>"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/3Dprinter.hal",
    "content": "# Include your custom HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# tool changing\n\n\tnet tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared\n\tnet tool-change-loopback iocontrol.0.tool-change => iocontrol.0.tool-changed\n\n# PID controllers for heaters\n\n\tloadrt pid names=PID-bed,PID-ext0\n\taddf PID-ext0.do-pid-calcs servo-thread\n\taddf PID-bed.do-pid-calcs servo-thread\n\n\n# configure z-compensation\n\n\tloadusr -Wn compensation python compensation.py probe-results.txt cubic\n\n\tnet xpos-cmd \t\t<= axis.x.pos-cmd\t\t=> compensation.x-pos\n\tnet ypos-cmd \t\t<= axis.y.pos-cmd\t\t=> compensation.y-pos\n\tnet zpos-cmd \t\t<= halui.axis.z.pos-relative\t=> compensation.z-pos\n\tnet eoffset-enable\t<= compensation.enable-out\t=> axis.z.eoffset-enable\n\tnet eoffset-scale\t<= compensation.scale\t\t=> axis.z.eoffset-scale\n\tnet eoffset-counts\t<= compensation.counts \t\t=> axis.z.eoffset-counts\n\tnet eoffset-clear\t<= compensation.clear \t\t=> axis.z.eoffset-clear\n\tnet compensation-on\t<= compensation.enable-in\n\n# end-stops\n\n\tnet X-min \tremora.input.00 \t=> joint.0.home-sw-in joint.0.neg-lim-sw-in\n\tnet Y-min \tremora.input.01 \t=> joint.1.home-sw-in joint.1.neg-lim-sw-in\t\n\tnet X-max \tremora.input.03 \t=> joint.0.pos-lim-sw-in\n\t#net Y-max \tremora.input.04 \t=> joint.1.pos-lim-sw-in\n\n# bed compensation\n\n\tloadrt or2 count=1\n\taddf or2.0 servo-thread\n\t\n\tnet M120-on\t\t=> or2.0.in0\n\tnet gui-bedcomp-on\t=> or2.0.in1\n\tnet compensation-on\t<= or2.0.out\n\n# touch probe and nozzle height setter\n\n\tloadrt mux_generic config=\"bb2\"\n\taddf mux-gen.00 servo-thread\n\n\t#net mux00\t\t<= remora.input.06\t\t=> mux-gen.00.in-bit-00\n\tnet mux00\t\t<= remora.input.05\t\t=> mux-gen.00.in-bit-00\n\tnet mux01\t\t<= remora.input.02\t\t=> mux-gen.00.in-bit-01\n\tnet mux-sel\t\t<= motion.digital-out-00 \t=> mux-gen.00.sel-bit-00\n\n\tnet probe\t\t<= mux-gen.00.out-bit\t=> motion.probe-input\n\n# remora command outputs\n\n\tnet bed-heater-SP \t=> remora.SP.0\n\tnet ext0-heater-SP  \t=> remora.SP.1\n\tnet ext0-cooling-SP \t=> remora.SP.2\n\tnet BLtouch-SP \t\t=> remora.SP.3\n\n\n# remora command feedbacks\n\n\tnet bed-PV \t\t=> remora.PV.0\n\tnet ext0-PV \t\t=> remora.PV.1\n\n# extruder configuration\n\n\tsetp remora.joint.4.pgain [JOINT_4]PGAIN\n\n# Bed PID configuration\n\n\tnet remora-status \t\t=> PID-bed.enable\n\tnet bed-SP \t\t\t=> PID-bed.command\n\tnet bed-PV \t\t\t=> PID-bed.feedback\n\tnet bed-heater-SP \t\t=> PID-bed.output\n\n\tsetp PID-bed.Pgain\t\t[BED]PID_KP\n\tsetp PID-bed.Igain\t\t[BED]PID_KI\n\tsetp PID-bed.Dgain\t\t[BED]PID_KD\n\tsetp PID-bed.maxoutput\t\t[BED]PID_MAX\n\n\n# Extruder 0 PID configuration\n\n\tnet remora-status \t\t=> PID-ext0.enable\n\tnet ext0-SP \t\t\t=> PID-ext0.command\n\tnet ext0-PV \t\t\t=> PID-ext0.feedback\n\tnet ext0-heater-SP \t\t=> PID-ext0.output\n\n\tsetp PID-ext0.Pgain\t\t[EXT0]PID_KP\n\tsetp PID-ext0.Igain\t\t[EXT0]PID_KI\n\tsetp PID-ext0.Dgain\t\t[EXT0]PID_KD\n\tsetp PID-ext0.maxoutput \t[EXT0]PID_MAX\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/autosave.halscope",
    "content": "THREAD servo-thread\nMAXCHAN 4\nHMULT 2\nHZOOM 1\nHPOS 3.825858e-01\nCHAN 4\nPIN motion.current-vel\nVSCALE 0\nVPOS 0.482185\nVOFF 0.000000e+00\nCHOFF\nCHAN 5\nPIN joint.1.f-error\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nCHOFF\nCHAN 2\nPIN joint.4.pos-cmd\nVSCALE 0\nVPOS 0.501319\nVOFF 0.000000e+00\nCHAN 3\nPIN joint.3.pos-fb\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nCHAN 1\nPIN corexy.xpos-fb\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nTSOURCE 2\nTLEVEL 0.486784\nTPOS 0.500000\nTPOLAR 1\nTMODE 1\nRMODE 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/compensation.py",
    "content": "#!/usr/bin/env python2\r\n\"\"\"Copyright (C) 2020 Scott Alford, scottalford75@gmail.com\r\n\r\nThis program is free software; you can redistribute it and/or modify\r\nit under the terms of the GNU 2 General Public License as published by\r\nthe Free Software Foundation; either version 2 of the License, or\r\n(at your option) any later version.\r\n\r\nThis program is distributed in the hope that it will be useful,\r\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\r\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r\nGNU General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License\r\nalong with this program; if not, write to the Free Software\r\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r\n\"\"\"\r\n\r\nupdate = 0.05\t# this is how often the z external offset value is updated based on current x & y position \r\n\r\nimport sys\r\nimport os.path, time\r\nimport numpy as np\r\nfrom scipy.interpolate import griddata\r\nfrom enum import Enum, unique\r\n\r\nimport linuxcnc\r\n\r\n@unique\r\nclass States(Enum):\r\n    START = 1\r\n    IDLE = 2\r\n    LOADMAP = 3\r\n    RUNNING = 4\r\n    RESET = 5\r\n    STOP = 6\r\n\r\n\r\nclass Compensation :\r\n\tdef __init__(self) :\r\n\t\tself.comp = {}\r\n\t\tif len(sys.argv)<2:\r\n\t\t\tprint \"ERROR! No input file name specified!\"\r\n\t\t\tsys.exit()\r\n\r\n\t\tself.filename = sys.argv[1]\r\n\t\tself.method = sys.argv[2]\r\n\t\t\r\n\t\t# default to cubic if not specified\r\n\t\tif self.method == \"\" : self.methond = \"cubic\"\r\n\r\n\r\n\tdef loadMap(self) :\r\n\t\t# data coordinates and values\r\n\t\tself.data = np.loadtxt(self.filename, dtype=float, delimiter=\" \", usecols=(0, 1, 2))\r\n\t\tself.x_data = np.around(self.data[:,0],1)\r\n\t\tself.y_data = np.around(self.data[:,1],1)\r\n\t\tself.z_data = self.data[:,2]\r\n\r\n\t\t# get the x and y, min and max values from the data\r\n\t\tself.xMin = int(np.min(self.x_data))\r\n\t\tself.xMax = int(np.max(self.x_data))\r\n\t\tself.yMin = int(np.min(self.y_data))\r\n\t\tself.yMax = int(np.max(self.y_data))\r\n\r\n\t\tprint \"\txMin = \", self.xMin\r\n\t\tprint \"\txMax = \", self.xMax\r\n\t\tprint \"\tyMin = \", self.yMin\r\n\t\tprint \"\tyMax = \", self.yMax\r\n\r\n\t\t# target grid to interpolate to, 1 grid per mm\r\n\t\tself.xSteps = (self.xMax-self.yMin)+1\r\n\t\tself.ySteps = (self.yMax-self.yMin)+1\r\n\t\tself.x = np.linspace(self.xMin, self.xMax, self.xSteps)\r\n\t\tself.y = np.linspace(self.yMin, self.yMax, self.ySteps)\r\n\t\tself.xi,self.yi = np.meshgrid(self.x,self.y)\r\n\t\t\r\n\t\t# interpolate, zi has all the offset values but need to be transposed\r\n\t\tself.zi = griddata((self.x_data,self.y_data),self.z_data,(self.xi,self.yi),method=self.method)\r\n\t\tself.zi = np.transpose(self.zi)\r\n\r\n\t\t\r\n\tdef compensate(self) :\r\n\t\t# get our nearest integer position\r\n\t\tself.xpos = int(round(self.h['x-pos']))\r\n\t\tself.ypos = int(round(self.h['y-pos']))\r\n\t\t\r\n\t\t# clamp the range\r\n\t\tself.xpos = self.xMin if self.xpos < self.xMin else self.xMax if self.xpos > self.xMax else self.xpos\r\n\t\tself.ypos = self.yMin if self.ypos < self.yMin else self.yMax if self.ypos > self.yMax else self.ypos\r\n\t\t\r\n\t\t# location in the offset map array\r\n\t\tself.Xn = self.xpos - self.xMin\r\n\t\tself.Yn = self.ypos - self.yMin\r\n\t\t\r\n\t\t# get the nearest compensation offset and convert to counts (s32) with a scale (float) \r\n\t\t# Requested offset == counts * scale\r\n\t\tself.scale = 0.001\r\n\t\tzo = self.zi[self.Xn,self.Yn]\r\n\t\tcompensation = int(zo / self.scale)\r\n\t\t\r\n\t\treturn compensation\r\n\r\n\r\n\tdef run(self) :\r\n\t\timport hal, time\r\n\t\t\r\n\t\tself.h = hal.component(\"compensation\")\r\n\t\tself.h.newpin(\"enable-in\", hal.HAL_BIT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"enable-out\", hal.HAL_BIT, hal.HAL_OUT)\r\n\t\tself.h.newpin(\"scale\", hal.HAL_FLOAT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"counts\", hal.HAL_S32, hal.HAL_OUT)\r\n\t\tself.h.newpin(\"clear\", hal.HAL_BIT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"x-pos\", hal.HAL_FLOAT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"y-pos\", hal.HAL_FLOAT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"z-pos\", hal.HAL_FLOAT, hal.HAL_IN)\r\n\t\tself.h.newpin(\"fade-height\", hal.HAL_FLOAT, hal.HAL_IN)\r\n\t\tself.h.ready()\r\n\t\t\r\n\t\ts = linuxcnc.stat()\r\n\t\t\r\n\t\tcurrentState = States.START\r\n\t\tprevState = States.STOP\r\n\r\n\t\ttry:\r\n\t\t\twhile True:\r\n\t\t\t\ttime.sleep(update)\r\n\t\t\t\t\r\n\t\t\t\t# get linuxcnc task_state status for machine on / off transitions\r\n\t\t\t\ts.poll()\r\n\t\t\t\t\r\n\t\t\t\tif currentState == States.START :\r\n\t\t\t\t\tif currentState != prevState :\r\n\t\t\t\t\t\tprint(\"\\nCompensation entering START state\")\r\n\t\t\t\t\t\tprevState = currentState\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t# do start-up tasks\r\n\t\t\t\t\tprint(\" %s last modified: %s\" % (self.filename, time.ctime(os.path.getmtime(self.filename))))\r\n\t\t\t\t\t\r\n\t\t\t\t\tprevMapTime = 0\r\n\t\t\t\t\t\r\n\t\t\t\t\tself.h[\"counts\"] = 0\r\n\t\t\t\t\t\r\n\t\t\t\t\t# transition to IDLE state\r\n\t\t\t\t\tcurrentState = States.IDLE\r\n\t\t\t\t\r\n\t\t\t\telif currentState == States.IDLE :\r\n\t\t\t\t\tif currentState != prevState :\r\n\t\t\t\t\t\tprint(\"\\nCompensation entering IDLE state\")\r\n\t\t\t\t\t\tprevState = currentState\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t# stay in IDLE state until compensation is enabled\r\n\t\t\t\t\tif self.h[\"enable-in\"] :\r\n\t\t\t\t\t\tcurrentState = States.LOADMAP\r\n\t\t\t\r\n\t\t\t\telif currentState == States.LOADMAP :\r\n\t\t\t\t\tif currentState != prevState :\r\n\t\t\t\t\t\tprint(\"\\nCompensation entering LOADMAP state\")\r\n\t\t\t\t\t\tprevState = currentState\r\n\t\t\t\r\n\t\t\t\t\tmapTime = os.path.getmtime(self.filename)\r\n\t\t\t\r\n\t\t\t\t\tif mapTime != prevMapTime:\r\n\t\t\t\t\t\tself.loadMap()\r\n\t\t\t\t\t\tprint(\"\tCompensation map loaded\")\r\n\t\t\t\t\t\tprevMapTime = mapTime\r\n\t\t\t\t\t\r\n\t\t\t\t\t# transition to RUNNING state\r\n\t\t\t\t\tcurrentState = States.RUNNING\r\n\t\t\t\t\r\n\t\t\t\telif currentState == States.RUNNING :\r\n\t\t\t\t\tif currentState != prevState :\r\n\t\t\t\t\t\tprint(\"\\nCompensation entering RUNNING state\")\r\n\t\t\t\t\t\tprevState = currentState\r\n\t\t\t\r\n\t\t\t\t\tif self.h[\"enable-in\"] :\r\n\t\t\t\t\t\t# enable external offsets\r\n\t\t\t\t\t\tself.h[\"enable-out\"] = 1\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tfadeHeight = self.h[\"fade-height\"]\r\n\t\t\t\t\t\tzPos = self.h[\"z-pos\"]\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif fadeHeight == 0 :\r\n\t\t\t\t\t\t\tcompScale = 1\r\n\t\t\t\t\t\telif zPos < fadeHeight :\r\n\t\t\t\t\t\t\tcompScale = (fadeHeight - zPos)/fadeHeight\r\n\t\t\t\t\t\t\tif compScale > 1 :\r\n\t\t\t\t\t\t\t\tcompScale = 1\r\n\t\t\t\t\t\telse :\r\n\t\t\t\t\t\t\tcompScale = 0\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\tif s.task_state == linuxcnc.STATE_ON :\r\n\t\t\t\t\t\t\t# get the compensation if machine power is on, else set to 0\r\n\t\t\t\t\t\t\t# otherwise we loose compensation eoffset if machine power is cycled \r\n\t\t\t\t\t\t\t# when copensation is enable\r\n\t\t\t\t\t\t\tcompensation = self.compensate()\r\n\t\t\t\t\t\t\tself.h[\"counts\"] = compensation * compScale\r\n\t\t\t\t\t\t\tself.h[\"scale\"] = self.scale\r\n\t\t\t\t\t\telse :\r\n\t\t\t\t\t\t\tself.h[\"counts\"] = 0\r\n\t\t\t\t\t\t\r\n\t\t\t\t\telse :\r\n\t\t\t\t\t\t# transition to RESET state\r\n\t\t\t\t\t\tcurrentState = States.RESET\r\n\t\t\t\t\t\t\r\n\t\t\t\telif currentState == States.RESET :\r\n\t\t\t\t\tif currentState != prevState :\r\n\t\t\t\t\t\tprint(\"\\nCompensation entering RESET state\")\r\n\t\t\t\t\t\tprevState = currentState\r\n\r\n\t\t\t\t\t# reset the eoffsets counts register so we don't accumulate\r\n\t\t\t\t\tself.h[\"counts\"] = 0\r\n\r\n\t\t\t\t\t# toggle the clear output\r\n\t\t\t\t\tself.h[\"clear\"] = 1;\r\n\t\t\t\t\ttime.sleep(0.1)\r\n\t\t\t\t\tself.h[\"clear\"] = 0;\r\n\r\n\t\t\t\t\t# disable external offsets\r\n\t\t\t\t\tself.h[\"enable-out\"] = 0\r\n\t\t\t\t\t\r\n\t\t\t\t\t# transition to IDLE state\r\n\t\t\t\t\tcurrentState = States.IDLE\r\n\r\n\t\texcept KeyboardInterrupt:\r\n\t  \t  raise SystemExit\r\n\r\ncomp = Compensation()\r\ncomp.run()\r\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# remora command outputs\n\nnet bed-SP  \t=> pyvcp.bed-SP\nnet ext0-SP  \t=> pyvcp.ext0-SP\nnet ext0-fan-SP => pyvcp.ext0-fan-SP\nnet BLtouch-SP \t=> pyvcp.BLtouch-SP\n\n\n# remora command feedbacks\n\nnet bed-PV \t=> pyvcp.bed-PV\nnet ext0-PV \t=> pyvcp.ext0-PV\n\n# bed compensation\n\nnet eoffset-active \t<= axis.z.eoffset \t\t=> pyvcp.z-offset-f\nnet z-offset-request <= axis.z.eoffset-request  \t=> pyvcp.z-offset-request-f\nnet z-enable \t\t<= pyvcp.z-enable \t\t=> compensation.enable-in\nnet PRUreset \t\t<= pyvcp.PRU-reset \t\t=> remora.PRU-reset\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/gcode2ngc.py",
    "content": "#!/usr/bin/env python\n# gcode2ngc.py\n\nimport sys\n\n\n# First line\nprint \"%\"\n\nf = file(sys.argv[1])\nfor line in f:\n\n    # Change extruder axis name\n    line = line.replace(\" E\", \" A\")\n\n    # S -> P\n    line = line.replace(\" S\", \" P\")\n\n    # Comment M82 code\n    line = line.replace(\"M82\", \";M82\")\n\n    # Comment M84 code\n    line = line.replace(\"M84\", \";M84\")\n\n    print line.strip()\n\n# Last line\nprint \"%\""
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/hypercube.hal",
    "content": "\nloadrt [KINS]KINEMATICS\nloadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n# test machine is a corexy, load translation module\n#loadrt corexy\n\t\n\tloadrt corexy_by_hal names=corexy\n\n\n# load the Remora real-time component\n\n\tloadrt remora-spi\n\n\n# estop and SPI comms enable and feedback\n\n\tnet user-enable-out\t\t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remorastatus \t\t<= remora.SPI-status \t\t\t\t=> iocontrol.0.emc-enable-in\n\n\n# add the remora and motion functions to threads\n\taddf remora.read \t\t\tservo-thread\n\taddf corexy \t\t\t\tservo-thread\n\taddf motion-command-handler servo-thread\n\taddf motion-controller \t\tservo-thread\n\taddf remora.update-freq \tservo-thread\n\taddf remora.write \t\t\tservo-thread\n\n\n# joint 0 setup\n\n\tsetp remora.joint.0.scale \t\t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\n\tnet j0motor-cmd\t\t<= joint.0.motor-pos-cmd \t\t=> corexy.j0-motor-pos-cmd\n\tnet alpha-cmd \t\t<= corexy.alpha-cmd \t\t\t=> remora.joint.0.pos-cmd \n\tnet alpha-fb \t\t<= remora.joint.0.pos-fb \t\t=> corexy.alpha-fb\n\tnet j0motor-fb \t\t<= corexy.j0-motor-pos-fb \t\t=> joint.0.motor-pos-fb\n\tnet j0enable \t\t<= joint.0.amp-enable-out \t\t=> remora.joint.0.enable\n\n\n# joint 1 setup\n\n\tsetp remora.joint.1.scale \t\t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1motor-cmd\t\t<= joint.1.motor-pos-cmd \t\t=> corexy.j1-motor-pos-cmd\n\tnet beta-cmd \t\t<= corexy.beta-cmd \t\t\t\t=> remora.joint.1.pos-cmd \n\tnet beta-fb \t\t<= remora.joint.1.pos-fb \t\t=> corexy.beta-fb\n\tnet j1motor-fb \t\t<= corexy.j1-motor-pos-fb \t\t=> joint.1.motor-pos-fb\n\tnet j1enable \t\t<= joint.1.amp-enable-out \t\t=> remora.joint.1.enable\n\n\n# joint 2 setup\nsetp remora.joint.2.scale [JOINT_2]SCALE\nsetp remora.joint.2.maxaccel [JOINT_2]STEPGEN_MAXACCEL\n\nnet j2pos-cmd \t\tjoint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\nnet j2pos-fb \t\tremora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\nnet j2enable \t\tjoint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n# joint 3 setup\nsetp remora.joint.3.scale [JOINT_3]SCALE\nsetp remora.joint.3.maxaccel [JOINT_3]STEPGEN_MAXACCEL\n\nnet j3pos-cmd \t\tjoint.3.motor-pos-cmd \t=> remora.joint.3.pos-cmd\nnet j3pos-fb \t\tremora.joint.3.pos-fb \t=> joint.3.motor-pos-fb\nnet j3enable \t\tjoint.3.amp-enable-out \t=> remora.joint.3.enable\n\n\n# joint 4 setup\nsetp remora.joint.4.scale [JOINT_4]SCALE\nsetp remora.joint.4.maxaccel [JOINT_4]STEPGEN_MAXACCEL\n\nnet j4pos-cmd \t\tjoint.4.motor-pos-cmd \t=> remora.joint.4.pos-cmd\nnet j4pos-fb \t\tremora.joint.4.pos-fb \t=> joint.4.motor-pos-fb\nnet j4enable \t\tjoint.4.amp-enable-out \t=> remora.joint.4.enable\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/hypercube.ini",
    "content": "# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\n[EMC]\nMACHINE = Hypercube\nDEBUG = 0\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\nCYCLE_TIME = 0.100\nPOSITION_OFFSET = RELATIVE\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\nMAX_FEED_OVERRIDE = 1.2\nMAX_SPINDLE_OVERRIDE = 1.0\nDEFAULT_LINEAR_VELOCITY = 50.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 150.00\nDEFAULT_ANGULAR_VELOCITY = 36.00\nMIN_ANGULAR_VELOCITY = 0\nMAX_ANGULAR_VELOCITY = 45.00\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\nPYVCP = 3D_printer_panel.xml\n\n[KINS]\nJOINTS = 5\n#KINEMATICS =trivkins coordinates=XYZZA kinstype=BOTH\n# kinstype=BOTH means that the machine can move in joint mode and world mode\n# not good for gantrys or double z axes.\nKINEMATICS =trivkins coordinates=XYZZA\n\n[FILTER]\nPROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image\nPROGRAM_EXTENSION = .py Python Script\npng = image-to-gcode\ngif = image-to-gcode\njpg = image-to-gcode\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\nSUBROUTINE_PATH = ~/linuxcnc/subroutines\nUSER_M_PATH = ~/linuxcnc/m_codes\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\nSERVO_PERIOD = 1000000\n\n[HAL]\nHALFILE = hypercube.hal\nHALFILE = 3Dprinter.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n\n[TRAJ]\nCOORDINATES =  X Y Z Z A\nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nDEFAULT_LINEAR_VELOCITY = 50.00\nMAX_LINEAR_VELOCITY = 150.00\nNO_FORCE_HOMING = 1 \n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n[AXIS_X]\nMAX_VELOCITY = 150\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -25.0\nMAX_LIMIT = 300.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -25.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 160.0\nFERROR = 9.0\nMIN_FERROR = 5.0\nHOME_SEARCH_VEL = -10.0\nHOME_LATCH_VEL = -3.0\nHOME_FINAL_VEL = 20\nHOME_IGNORE_LIMITS = YES\nHOME_USE_INDEX = NO\nHOME_OFFSET = -25.0\nHOME = 0.0\nHOME_SEQUENCE = 1 \n\n[AXIS_Y]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 300.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 160.0\nFERROR = 9.0\nMIN_FERROR = 5.0\nHOME_SEARCH_VEL = -10.0\nHOME_LATCH_VEL = -3.0\nHOME_FINAL_VEL = 20\nHOME_IGNORE_LIMITS = YES\nHOME_USE_INDEX = NO\nHOME_OFFSET = -20.0\nHOME = -10.0\nHOME_SEQUENCE = 2\n\n[AXIS_Z]\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nOFFSET_AV_RATIO = 0.2\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n\n[JOINT_3]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# Extruder 0\n[AXIS_A]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 1000.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\n\n[JOINT_4]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\nMAX_VELOCITY = 150\nMAX_ACCELERATION = 1000.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = -436.9375\nFERROR = 2\n#MIN_FERROR = .25\nMIN_FERROR = 0.75\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# ------------------------------\n#    3D Printer configuration\n# ------------------------------\n\n# Heated bed\n[BED]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 21.5\nPID_KI\t\t= 1.0\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 80.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n\n# Extruder 0\n[EXT0]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 2.9\nPID_KI\t\t= 0.11\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 270.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/hypercube.pref",
    "content": "[DEFAULT]\nspindle_start_rpm = 300.0\nscale_jog_vel = 300.0\nscale_spindle_override = 1\nscale_feed_override = 1\nscale_rapid_override = 1\nhide_turtle_jog_button = False\nturtle_jog_factor = 20\ndro_size = 28\nopen_file = \nscreen1 = window\nx_pos = 40\ny_pos = 30\nwidth = 979\nheight = 750\ngtk_theme = Follow System Theme\naudio_alert = /usr/share/sounds/freedesktop/stereo/dialog-warning.oga\naudio_error = /usr/share/sounds/freedesktop/stereo/dialog-error.oga\ngrid_size = 1.0\nview = p\nmouse_btn_mode = 4\nhide_cursor = False\nsystem_name_tool = Tool\nsystem_name_g5x = G5x\nsystem_name_rot = Rot\nsystem_name_g92 = G92\nsystem_name_g54 = G54\nsystem_name_g55 = G55\nsystem_name_g56 = G56\nsystem_name_g57 = G57\nsystem_name_g58 = G58\nsystem_name_g59 = G59\nsystem_name_g59.1 = G59.1\nsystem_name_g59.2 = G59.2\nsystem_name_g59.3 = G59.3\njump_to_dir = /home/pi\nshow_keyboard_on_offset = False\nshow_keyboard_on_tooledit = False\nshow_keyboard_on_edit = False\nshow_keyboard_on_mdi = False\nspindle_bar_min = 0.0\nspindle_bar_max = 6000.0\nx_pos_popup = 45.0\ny_pos_popup = 55\nwidth_popup = 250.0\nmax_messages = 10\nmessage_font = sans 10\nuse_frames = True\nshow_dro_btn = False\nuse_auto_units = True\nblockdel = False\nopstop = False\nenable_dro = False\nshow_offsets = False\nshow_dtg = False\nview_tool_path = True\nview_dimension = True\ngremlin_view = rbt_view_p\nrun_from_line = no_run\nunlock_way = use\nunlock_code = 123\nshow_preview_on_offset = False\nuse_keyboard_shortcuts = False\nabs_color = #0000FF\nrel_color = #000000\ndtg_color = #FFFF00\nhomed_color = #00FF00\nunhomed_color = #FF0000\ndro_digits = 3\ntoggle_readout = True\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/linuxcnc.var",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t0.000000\n5212\t0.000000\n5213\t-21.451667\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/linuxcnc.var.bak",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t0.000000\n5212\t0.000000\n5213\t-21.451667\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/probe-results.txt",
    "content": "0.012383 0.000118 0.034973 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.993984 0.006355 -0.002522 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.987659 0.000061 -0.085092 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987628 0.000062 -0.202544 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.987640 0.000050 -0.262599 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.993839 -0.006203 -0.312520 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.993958 -0.006275 -0.365063 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.006366 39.993934 -0.332510 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.012524 40.000004 -0.240059 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.012459 40.000027 -0.200058 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.006107 39.993851 -0.175066 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.006264 40.006298 -0.105043 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.006226 39.993748 -0.065066 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.006157 40.006374 -0.047571 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000084 79.987606 -0.102590 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.987709 80.000042 -0.090081 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.000118 80.000008 -0.125028 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.993961 79.993706 -0.162552 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.987577 80.000013 -0.175070 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.993861 79.993753 -0.240026 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000235 80.000010 -0.325035 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000042 119.987602 -0.277530 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.994015 240.006302 -0.075081 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n179.994026 239.993816 -0.147522 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.987644 240.000046 -0.257559 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/pyvcp_options.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\nsets spindle-at-speed true\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/tool.tbl",
    "content": "T1 P1 Z-0.726003 ;extruder 0 \nT2 P2 ;\nT3 P3 ;\nT99 P99 X-22.000000 ;probe \n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/hypercube/tool.tbl.bak",
    "content": "T1 P1 Z-0.261854 ;extruder 0 \nT2 P2 \nT3 P3 \nT99 P99 X-22 ;probe \n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/.qtpyvcp-messages.json",
    "content": "[\n    {\n        \"file\": \"/home/alarm/qtpyvcp/sim/example_gcode/qtpyvcp.ngc\", \n        \"interp_mode\": \"Idle\", \n        \"message\": \"all joints must be homed before going into coordinated mode\", \n        \"task_mode\": \"Manual\", \n        \"task_state\": \"E-Stop\", \n        \"timestamp\": 1553397804.279701, \n        \"type\": \"error\"\n    }, \n    {\n        \"file\": \"/home/alarm/qtpyvcp/sim/example_gcode/qtpyvcp.ngc\", \n        \"interp_mode\": \"Idle\", \n        \"message\": \"all joints must be homed before going into coordinated mode\", \n        \"task_mode\": \"Manual\", \n        \"task_state\": \"On\", \n        \"timestamp\": 1553397836.775514, \n        \"type\": \"error\"\n    }, \n    {\n        \"file\": \"/home/alarm/linuxcnc/nc_files/3dtest.ngc\", \n        \"interp_mode\": \"Waiting\", \n        \"message\": \"joint 0 following error\", \n        \"task_mode\": \"Auto\", \n        \"task_state\": \"On\", \n        \"timestamp\": 1553397882.520169, \n        \"type\": \"error\"\n    }, \n    {\n        \"file\": \"/home/alarm/linuxcnc/nc_files/3dtest.ngc\", \n        \"interp_mode\": \"Waiting\", \n        \"message\": \"joint 0 following error\", \n        \"task_mode\": \"Auto\", \n        \"task_state\": \"On\", \n        \"timestamp\": 1553397900.177957, \n        \"type\": \"error\"\n    }\n]"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/3D_printer_panel.xml",
    "content": "<pyvcp>\n<labelframe text=\"Printer\">\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\"Heated Bed\"</text>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"bed-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"bed-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" At temperature \"</text>\n    </label>\n    <led>\n\t<halpin>\"bed-at-temp\"</halpin>\n        <size>15</size> \n        <on_color>\"green\"</on_color>\n        <off_color>\"red\"</off_color>\n    </led>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\"Extruder 0\"</text>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature:\"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" At temperature \"</text>\n    </label>\n    <led>\n\t<halpin>\"ext0-at-temp\"</halpin>\n        <size>15</size> \n        <on_color>\"green\"</on_color>\n        <off_color>\"red\"</off_color>\n    </led>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\"Cooling Fan\"</text>\n</label>\n<hbox>\n    <label>\n        <text>\" Fan speed: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-fan-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n<label>\n<text>\"BL Touch\"</text>\n</label>\n<hbox>\n    <label>\n        <text>\" Position: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"BLtouch-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n</labelframe>\n   <vbox>\n     <label>\n       <text>\"Motor-pos-cmd\"</text>\n       <font>\"bold\"</font>\n     </label>\n   </vbox>\n\n   <vbox>\n     <relief>\"sunken\"</relief>\n     <bd>3</bd>\n     <hbox>\n       <label>\n         <text>\"J2:\"</text>\n         <font>\"monospace\"</font>\n         <anchor>\"w\"</anchor>\n       </label>\n       <number>\n         <halpin>\"motor-pos-cmd.2-f\"</halpin>\n         <format>\"+10.4f\"</format>\n         <width>\"10\"</width>\n         <bg>\"black\"</bg>\n         <fg>\"cyan\"</fg>\n         <font>\"bold\"</font>\n       </number>\n     </hbox>\n   </vbox>\n\n   <vbox>\n     <label>\n       <text>\"Axis-pos-cmd\"</text>\n       <font>\"bold\"</font>\n     </label>\n   </vbox>\n\n   <vbox>\n     <relief>\"sunken\"</relief>\n     <bd>3</bd>\n    <hbox>\n     <label>\n       <text>\" X:\"</text>\n       <font>\"monospace\"</font>\n       <anchor>\"w\"</anchor>\n     </label>\n     <number>\n       <halpin>\"x-pos-cmd-f\"</halpin>\n       <format>\"+10.4f\"</format>\n       <width>\"10\"</width>\n       <bg>\"black\"</bg>\n       <fg>\"greenyellow\"</fg>\n       <font>\"bold\"</font>\n     </number>\n   </hbox>\n    <hbox>\n     <label>\n       <text>\" Y:\"</text>\n       <font>\"monospace\"</font>\n       <anchor>\"w\"</anchor>\n     </label>\n     <number>\n       <halpin>\"y-pos-cmd-f\"</halpin>\n       <format>\"+10.4f\"</format>\n       <width>\"10\"</width>\n       <bg>\"black\"</bg>\n       <fg>\"greenyellow\"</fg>\n       <font>\"bold\"</font>\n     </number>\n   </hbox>\n   <hbox>\n     <label>\n       <text>\" Z:\"</text>\n       <font>\"monospace\"</font>\n       <anchor>\"w\"</anchor>\n     </label>\n     <number>\n       <halpin>\"z-pos-cmd-f\"</halpin>\n       <format>\"+10.4f\"</format>\n       <width>\"10\"</width>\n       <bg>\"black\"</bg>\n       <fg>\"greenyellow\"</fg>\n       <font>\"bold\"</font>\n     </number>\n   </hbox>\n   </vbox>\n   \n   <vbox>\n     <label>\n       <text>\"Eoffsets(act/req)\"</text>\n       <font>\"bold\"</font>\n     </label>\n     <vbox>\n       <relief>\"sunken\"</relief>\n       <bd>3</bd>\n       <hbox>\n         <label>\n           <text>\"Za:\"</text>\n           <font>\"monospace\"</font>\n           <anchor>\"w\"</anchor>\n         </label>\n         <number>\n           <halpin>\"z-offset-f\"</halpin>\n           <format>\"+10.4f\"</format>\n           <width>\"10\"</width>\n           <bg>\"black\"</bg>\n           <fg>\"gold\"</fg>\n           <font>\"bold\"</font>\n         </number>\n       </hbox>\n       <hbox>\n         <label>\n           <text>\"Zr:\"</text>\n           <font>\"monospace\"</font>\n           <anchor>\"w\"</anchor>\n         </label>\n         <number>\n           <halpin>\"z-offset-request-f\"</halpin>\n           <format>\"+10.4f\"</format>\n           <width>\"10\"</width>\n           <bg>\"black\"</bg>\n           <fg>\"orange\"</fg>\n           <font>\"bold\"</font>\n         </number>\n       </hbox>\n       <hbox>\n         <label>\n           <anchor>\"w\"</anchor>\n           <text>\"Zenable\"</text>\n         </label>\n         <checkbutton>\n           <anchor>\"w\"</anchor>\n           <halpin>\"z-enable\"</halpin>\n           <text>\"\"</text>\n           <padx>0</padx>\n           <initval>0</initval>\n         </checkbutton>\n       </hbox>\n     </vbox>\n       <button>\n         <halpin>\"reset\"</halpin>\n         <bd>3</bd>\n         <width>1</width>\n         <text>\"PRU Reset\"</text>\n         <font>\"bold\",10</font>\n       </button>\n   </vbox>\n</pyvcp>"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/3Dprinter.hal",
    "content": "# Include your custom HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# tool changing\n\n\tnet tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared\n\tnet tool-change-loopback iocontrol.0.tool-change => iocontrol.0.tool-changed\n\n# PID controllers for heaters\n\n\t#loadrt PIDcontroller names=PID-bed\t#,PID-ext0\n\t#addf PID-bed.compute servo-thread\n\t#addf PID-ext0.compute servo-thread\n\n\tloadrt pid names=PID-bed,PID-ext0\n\taddf PID-ext0.do-pid-calcs servo-thread\n\taddf PID-bed.do-pid-calcs servo-thread\n\n\n# configure z-compensation\n\n\tloadusr -Wn compensation python compensation.py probe-results.txt cubic\n\n\tnet xpos-cmd \t\t<= axis.x.pos-cmd\t\t=> compensation.x-pos\n\tnet ypos-cmd \t\t<= axis.y.pos-cmd\t\t=> compensation.y-pos\n\tnet zpos-cmd \t\t<= halui.axis.z.pos-relative\t=> compensation.z-pos\n\tnet eoffset-enable\t<= compensation.enable-out\t=> axis.z.eoffset-enable\n\tnet eoffset-scale\t<= compensation.scale\t\t=> axis.z.eoffset-scale\n\tnet eoffset-counts\t<= compensation.counts \t\t=> axis.z.eoffset-counts\n\tnet eoffset-clear\t<= compensation.clear \t\t=> axis.z.eoffset-clear\n\tnet compensation-on\t<= compensation.enable-in\n\n# end-stops\n\n\tnet X-min \tremora.input.00 \t=> joint.0.home-sw-in joint.0.neg-lim-sw-in\n\tnet Y-min \tremora.input.01 \t=> joint.1.home-sw-in joint.1.neg-lim-sw-in\t\n\tnet X-max \tremora.input.03 \t=> joint.0.pos-lim-sw-in\n\t#net Y-max \tremora.input.04 \t=> joint.1.pos-lim-sw-in\n\n# bed compensation\n\n\tloadrt or2 count=1\n\taddf or2.0 servo-thread\n\t\n\tnet M120-on\t\t=> or2.0.in0\n\tnet gui-bedcomp-on\t=> or2.0.in1\n\tnet compensation-on\t<= or2.0.out\n\n# touch probe and nozzle height setter\n\n\tloadrt mux_generic config=\"bb2\"\n\taddf mux-gen.00 servo-thread\n\n\t#net mux00\t\t<= remora.input.06\t\t=> mux-gen.00.in-bit-00\n\tnet mux00\t\t<= remora.input.05\t\t=> mux-gen.00.in-bit-00\n\tnet mux01\t\t<= remora.input.02\t\t=> mux-gen.00.in-bit-01\n\tnet mux-sel\t\t<= motion.digital-out-00 \t=> mux-gen.00.sel-bit-00\n\n\tnet probe\t\t<= mux-gen.00.out-bit\t=> motion.probe-input\n\n# remora command outputs\n\n\tnet bed-heater-SP \t=> remora.SP.0\n\tnet ext0-heater-SP  \t=> remora.SP.1\n\tnet ext0-cooling-SP \t=> remora.SP.2\n\tnet BLtouch-SP \t\t=> remora.SP.3\n\n\n# remora command feedbacks\n\n\tnet bed-PV \t\t=> remora.PV.0\n\tnet ext0-PV \t\t=> remora.PV.1\n\n# extruder configuration\n\n\tsetp remora.joint.4.pgain [JOINT_4]PGAIN\n\n# Bed PID configuration\n\n\tnet remora-status \t\t=> PID-bed.enable\n\tnet bed-SP \t\t\t=> PID-bed.command\n\tnet bed-PV \t\t\t=> PID-bed.feedback\n\tnet bed-heater-SP \t\t=> PID-bed.output\n\n\tsetp PID-bed.Pgain\t\t[BED]PID_KP\n\tsetp PID-bed.Igain\t\t[BED]PID_KI\n\tsetp PID-bed.Dgain\t\t[BED]PID_KD\n\tsetp PID-bed.maxoutput\t\t[BED]PID_MAX\n\n\n# Extruder 0 PID configuration\n\n\tnet remora-status \t\t=> PID-ext0.enable\n\tnet ext0-SP \t\t\t=> PID-ext0.command\n\tnet ext0-PV \t\t\t=> PID-ext0.feedback\n\tnet ext0-heater-SP \t\t=> PID-ext0.output\n\n\tsetp PID-ext0.Pgain\t\t[EXT0]PID_KP\n\tsetp PID-ext0.Igain\t\t[EXT0]PID_KI\n\tsetp PID-ext0.Dgain\t\t[EXT0]PID_KD\n\tsetp PID-ext0.maxoutput \t[EXT0]PID_MAX\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/autosave.halscope",
    "content": "THREAD servo-thread\nMAXCHAN 4\nHMULT 2\nHZOOM 1\nHPOS 3.100358e-01\nCHAN 5\nPIN joint.1.f-error\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nCHOFF\nCHAN 1\nPIN joint.1.f-error\nVSCALE 0\nVPOS 0.377143\nVOFF 0.000000e+00\nCHAN 2\nPIN remora.joint.1.freq-cmd\nVSCALE 0\nVPOS 0.766667\nVOFF 0.000000e+00\nCHAN 4\nPIN remora.PV.2\nVSCALE 10\nVPOS 0.647696\nVOFF 0.000000e+00\nCHAN 3\nPIN remora.joint.1.pos-fb\nVSCALE 8\nVPOS 0.400000\nVOFF 0.000000e+00\nTSOURCE 1\nTLEVEL 0.500000\nTPOS 0.482927\nTPOLAR 1\nTMODE 0\nRMODE 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/compensation.py",
    "content": "#!/usr/bin/env python2\n\"\"\"Copyright (C) 2020 Scott Alford, scottalford75@gmail.com\n\nThis program is free software; you can redistribute it and/or modify\nit under the terms of the GNU 2 General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program; if not, write to the Free Software\nFoundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n\"\"\"\n\nupdate = 0.05\t# this is how often the z external offset value is updated based on current x & y position \n\nimport sys\nimport os.path, time\nimport numpy as np\nfrom scipy.interpolate import griddata\nfrom enum import Enum, unique\n\nimport linuxcnc\n\n@unique\nclass States(Enum):\n    START = 1\n    IDLE = 2\n    LOADMAP = 3\n    RUNNING = 4\n    RESET = 5\n    STOP = 6\n\n\nclass Compensation :\n\tdef __init__(self) :\n\t\tself.comp = {}\n\t\tif len(sys.argv)<2:\n\t\t\tprint \"ERROR! No input file name specified!\"\n\t\t\tsys.exit()\n\n\t\tself.filename = sys.argv[1]\n\t\tself.method = sys.argv[2]\n\t\t\n\t\t# default to cubic if not specified\n\t\tif self.method == \"\" : self.methond = \"cubic\"\n\n\n\tdef loadMap(self) :\n\t\t# data coordinates and values\n\t\tself.data = np.loadtxt(self.filename, dtype=float, delimiter=\" \", usecols=(0, 1, 2))\n\t\tself.x_data = np.around(self.data[:,0],1)\n\t\tself.y_data = np.around(self.data[:,1],1)\n\t\tself.z_data = self.data[:,2]\n\n\t\t# get the x and y, min and max values from the data\n\t\tself.xMin = int(np.min(self.x_data))\n\t\tself.xMax = int(np.max(self.x_data))\n\t\tself.yMin = int(np.min(self.y_data))\n\t\tself.yMax = int(np.max(self.y_data))\n\n\t\tprint \"\txMin = \", self.xMin\n\t\tprint \"\txMax = \", self.xMax\n\t\tprint \"\tyMin = \", self.yMin\n\t\tprint \"\tyMax = \", self.yMax\n\n\t\t# target grid to interpolate to, 1 grid per mm\n\t\tself.xSteps = (self.xMax-self.yMin)+1\n\t\tself.ySteps = (self.yMax-self.yMin)+1\n\t\tself.x = np.linspace(self.xMin, self.xMax, self.xSteps)\n\t\tself.y = np.linspace(self.yMin, self.yMax, self.ySteps)\n\t\tself.xi,self.yi = np.meshgrid(self.x,self.y)\n\t\t\n\t\t# interpolate, zi has all the offset values but need to be transposed\n\t\tself.zi = griddata((self.x_data,self.y_data),self.z_data,(self.xi,self.yi),method=self.method)\n\t\tself.zi = np.transpose(self.zi)\n\n\t\t\n\tdef compensate(self) :\n\t\t# get our nearest integer position\n\t\tself.xpos = int(round(self.h['x-pos']))\n\t\tself.ypos = int(round(self.h['y-pos']))\n\t\t\n\t\t# clamp the range\n\t\tself.xpos = self.xMin if self.xpos < self.xMin else self.xMax if self.xpos > self.xMax else self.xpos\n\t\tself.ypos = self.yMin if self.ypos < self.yMin else self.yMax if self.ypos > self.yMax else self.ypos\n\t\t\n\t\t# location in the offset map array\n\t\tself.Xn = self.xpos - self.xMin\n\t\tself.Yn = self.ypos - self.yMin\n\t\t\n\t\t# get the nearest compensation offset and convert to counts (s32) with a scale (float) \n\t\t# Requested offset == counts * scale\n\t\tself.scale = 0.001\n\t\tzo = self.zi[self.Xn,self.Yn]\n\t\tcompensation = int(zo / self.scale)\n\t\t\n\t\treturn compensation\n\n\n\tdef run(self) :\n\t\timport hal, time\n\t\t\n\t\tself.h = hal.component(\"compensation\")\n\t\tself.h.newpin(\"enable-in\", hal.HAL_BIT, hal.HAL_IN)\n\t\tself.h.newpin(\"enable-out\", hal.HAL_BIT, hal.HAL_OUT)\n\t\tself.h.newpin(\"scale\", hal.HAL_FLOAT, hal.HAL_IN)\n\t\tself.h.newpin(\"counts\", hal.HAL_S32, hal.HAL_OUT)\n\t\tself.h.newpin(\"clear\", hal.HAL_BIT, hal.HAL_IN)\n\t\tself.h.newpin(\"x-pos\", hal.HAL_FLOAT, hal.HAL_IN)\n\t\tself.h.newpin(\"y-pos\", hal.HAL_FLOAT, hal.HAL_IN)\n\t\tself.h.newpin(\"z-pos\", hal.HAL_FLOAT, hal.HAL_IN)\n\t\tself.h.newpin(\"fade-height\", hal.HAL_FLOAT, hal.HAL_IN)\n\t\tself.h.ready()\n\t\t\n\t\ts = linuxcnc.stat()\n\t\t\n\t\tcurrentState = States.START\n\t\tprevState = States.STOP\n\n\t\ttry:\n\t\t\twhile True:\n\t\t\t\ttime.sleep(update)\n\t\t\t\t\n\t\t\t\t# get linuxcnc task_state status for machine on / off transitions\n\t\t\t\ts.poll()\n\t\t\t\t\n\t\t\t\tif currentState == States.START :\n\t\t\t\t\tif currentState != prevState :\n\t\t\t\t\t\tprint(\"\\nCompensation entering START state\")\n\t\t\t\t\t\tprevState = currentState\n\t\t\t\t\t\t\n\t\t\t\t\t# do start-up tasks\n\t\t\t\t\tprint(\" %s last modified: %s\" % (self.filename, time.ctime(os.path.getmtime(self.filename))))\n\t\t\t\t\t\n\t\t\t\t\tprevMapTime = 0\n\t\t\t\t\t\n\t\t\t\t\tself.h[\"counts\"] = 0\n\t\t\t\t\t\n\t\t\t\t\t# transition to IDLE state\n\t\t\t\t\tcurrentState = States.IDLE\n\t\t\t\t\n\t\t\t\telif currentState == States.IDLE :\n\t\t\t\t\tif currentState != prevState :\n\t\t\t\t\t\tprint(\"\\nCompensation entering IDLE state\")\n\t\t\t\t\t\tprevState = currentState\n\t\t\t\t\t\t\n\t\t\t\t\t# stay in IDLE state until compensation is enabled\n\t\t\t\t\tif self.h[\"enable-in\"] :\n\t\t\t\t\t\tcurrentState = States.LOADMAP\n\t\t\t\n\t\t\t\telif currentState == States.LOADMAP :\n\t\t\t\t\tif currentState != prevState :\n\t\t\t\t\t\tprint(\"\\nCompensation entering LOADMAP state\")\n\t\t\t\t\t\tprevState = currentState\n\t\t\t\n\t\t\t\t\tmapTime = os.path.getmtime(self.filename)\n\t\t\t\n\t\t\t\t\tif mapTime != prevMapTime:\n\t\t\t\t\t\tself.loadMap()\n\t\t\t\t\t\tprint(\"\tCompensation map loaded\")\n\t\t\t\t\t\tprevMapTime = mapTime\n\t\t\t\t\t\n\t\t\t\t\t# transition to RUNNING state\n\t\t\t\t\tcurrentState = States.RUNNING\n\t\t\t\t\n\t\t\t\telif currentState == States.RUNNING :\n\t\t\t\t\tif currentState != prevState :\n\t\t\t\t\t\tprint(\"\\nCompensation entering RUNNING state\")\n\t\t\t\t\t\tprevState = currentState\n\t\t\t\n\t\t\t\t\tif self.h[\"enable-in\"] :\n\t\t\t\t\t\t# enable external offsets\n\t\t\t\t\t\tself.h[\"enable-out\"] = 1\n\t\t\t\t\t\t\n\t\t\t\t\t\tfadeHeight = self.h[\"fade-height\"]\n\t\t\t\t\t\tzPos = self.h[\"z-pos\"]\n\t\t\t\t\t\t\n\t\t\t\t\t\tif fadeHeight == 0 :\n\t\t\t\t\t\t\tcompScale = 1\n\t\t\t\t\t\telif zPos < fadeHeight:\n\t\t\t\t\t\t\tcompScale = (fadeHeight - zPos)/fadeHeight\n\t\t\t\t\t\t\tif compScale > 1 :\n\t\t\t\t\t\t\t\tcompScale = 1\n\t\t\t\t\t\telse :\n\t\t\t\t\t\t\tcompScale = 0\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tif s.task_state == linuxcnc.STATE_ON :\n\t\t\t\t\t\t\t# get the compensation if machine power is on, else set to 0\n\t\t\t\t\t\t\t# otherwise we loose compensation eoffset if machine power is cycled \n\t\t\t\t\t\t\t# when copensation is enable\n\t\t\t\t\t\t\tcompensation = self.compensate()\n\t\t\t\t\t\t\tself.h[\"counts\"] = compensation * compScale\n\t\t\t\t\t\t\tself.h[\"scale\"] = self.scale\n\t\t\t\t\t\telse :\n\t\t\t\t\t\t\tself.h[\"counts\"] = 0\n\t\t\t\t\t\t\n\t\t\t\t\telse :\n\t\t\t\t\t\t# transition to RESET state\n\t\t\t\t\t\tcurrentState = States.RESET\n\t\t\t\t\t\t\n\t\t\t\telif currentState == States.RESET :\n\t\t\t\t\tif currentState != prevState :\n\t\t\t\t\t\tprint(\"\\nCompensation entering RESET state\")\n\t\t\t\t\t\tprevState = currentState\n\n\t\t\t\t\t# reset the eoffsets counts register so we don't accumulate\n\t\t\t\t\tself.h[\"counts\"] = 0\n\n\t\t\t\t\t# toggle the clear output\n\t\t\t\t\tself.h[\"clear\"] = 1;\n\t\t\t\t\ttime.sleep(0.1)\n\t\t\t\t\tself.h[\"clear\"] = 0;\n\n\t\t\t\t\t# disable external offsets\n\t\t\t\t\tself.h[\"enable-out\"] = 0\n\t\t\t\t\t\n\t\t\t\t\t# transition to IDLE state\n\t\t\t\t\tcurrentState = States.IDLE\n\n\t\texcept KeyboardInterrupt:\n\t  \t  raise SystemExit\n\ncomp = Compensation()\ncomp.run()\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n\n# connect GUI to HAL pins\n\nnet bed-SP  \t\t=> pyvcp.bed-SP\nnet ext0-SP  \t\t=> pyvcp.ext0-SP\nnet ext0-fan-SP \t=> pyvcp.ext0-fan-SP\nnet BLtouch-SP \t\t=> pyvcp.BLtouch-SP\n\nnet bed-PV \t\t=> pyvcp.bed-PV\nnet ext0-PV \t\t=> pyvcp.ext0-PV\n\n\n# bed compensation\n\nnet j2pos-cmd \t\t=> pyvcp.motor-pos-cmd.2-f\nnet xpos-cmd  \t\t=> pyvcp.x-pos-cmd-f\nnet ypos-cmd \t\t=> pyvcp.y-pos-cmd-f\nnet zpos-cmd \t\t=> pyvcp.z-pos-cmd-f\nnet eoffset-active \t<= axis.z.eoffset \t\t=> pyvcp.z-offset-f\nnet E:z-offset-request \t<= axis.z.eoffset-request  \t=> pyvcp.z-offset-request-f\nnet E:z-enable \t\t<= pyvcp.z-enable \t\t=> compensation.enable-in\nnet E:reset \t\t<= pyvcp.reset \t\t\t=> remora.PRU-reset"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/encoder-fb.halscope",
    "content": "THREAD servo-thread\nMAXCHAN 4\nHMULT 2\nHZOOM 5\nHPOS 4.784946e-01\nCHAN 5\nPIN joint.1.f-error\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nCHOFF\nCHAN 1\nPIN joint.0.f-error\nVSCALE -2\nVPOS 0.377143\nVOFF 0.000000e+00\nCHAN 2\nPIN remora.joint.0.freq-cmd\nVSCALE 11\nVPOS 0.766667\nVOFF 0.000000e+00\nCHAN 4\nPIN remora.PV.2\nVSCALE 10\nVPOS 0.647696\nVOFF 0.000000e+00\nCHAN 3\nPIN remora.joint.0.encoder-cnt\nVSCALE 10\nVPOS 0.400000\nVOFF 0.000000e+00\nTSOURCE 1\nTLEVEL 0.500000\nTPOS 0.482927\nTPOLAR 1\nTMODE 0\nRMODE 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/linuxcnc.var",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t103.981262\n5212\t98.562439\n5213\t86.226154\n5214\t292.542232\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t-103.981262\n5222\t-98.562439\n5223\t-50.968645\n5224\t-225.107400\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/linuxcnc.var.bak",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t103.981262\n5212\t98.562439\n5213\t86.226154\n5214\t292.542232\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t-103.981262\n5222\t-98.562439\n5223\t-50.968645\n5224\t-225.107400\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/my.halshow",
    "content": "# halshow watchlist created Mon Mar 29 02:05:01 UTC 2021\n\npin+remora.PV.2\npin+remora.joint.0.encoder-cnt\npin+encoderJ0.position\npin+j0pid.feedback\npin+j0pid.command\npin+j0pid.output\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/probe-results.txt",
    "content": "-0.006271 -0.000023 0.036420 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n29.993927 -0.000038 0.263945 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n59.993912 0.000008 0.501489 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n89.993942 0.000069 0.588957 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n119.993904 0.000000 0.493966 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n120.000069 29.993805 -0.438575 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n90.006279 30.000046 -0.143585 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n60.006271 29.999962 -0.038574 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n30.006279 29.999985 -0.083578 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n0.006279 30.000031 -0.181052 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000122 59.993935 -0.303561 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n29.993889 60.000046 -0.378517 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n59.993881 60.000023 -0.463549 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n89.993847 60.000095 -0.668592 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n120.006279 59.999985 -0.973647 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n120.000063 89.993830 -1.248565 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n90.006241 90.000099 -0.981047 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n60.006329 90.000034 -0.741035 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n30.006264 90.000031 -0.548528 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000034 90.006245 -0.408526 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000057 119.993816 -0.498610 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n29.993855 120.000019 -0.693518 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n59.993912 119.999992 -0.871025 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n89.993879 120.000036 -1.136068 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000\n119.993944 120.000010 -1.381064 -3043.130131 0.000000 0.000000 0.000000 0.000000 0.000000"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/pyvcp_options.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\nsets spindle-at-speed true\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/remora.hal",
    "content": "\n# load the real-time components\n\n\tloadrt [KINS]KINEMATICS\n\tloadrt [EMCMOT]EMCMOT servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n\tloadrt remora-spi ctrl_type=v,p,p,p,p\n\tloadrt PRUencoder names=encoderJ0,encoderJ1\n\tloadrt pid names=j0pid\n\n\n# estop loopback, SPI comms enable and feedback\n\tnet user-enable-out \t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remora-status \t\t<= remora.SPI-status \t\t\t\t=> iocontrol.0.emc-enable-in\n\t\n\n# add the remora and motion functions to threads\n\n\taddf remora.read servo-thread\n\taddf PRUencoder.capture-position servo-thread\n\taddf motion-command-handler servo-thread\n\taddf motion-controller servo-thread\n\taddf j0pid.do-pid-calcs servo-thread\n\taddf remora.update-freq servo-thread\n\taddf remora.write servo-thread\n\n\n# Joint 0 setup\n\n\tsetp remora.joint.0.scale \t\t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\tsetp encoderJ0.position-scale\t[JOINT_0_ENCODER]SCALE\n\n\tnet j0enable \t\t<= joint.0.amp-enable-out \t=> remora.joint.0.enable\n\tnet j0enable \t\t\t\t\t\t\t\t\t=> j0pid.enable\n\tnet encoderJ0-count \t\t\t\t\t\t\t=> encoderJ0.raw_count\n\tnet j0pos-fb \t\t<= encoderJ0.position \t\t=> j0pid.feedback\n\tnet j0pos-fb \t\t\t\t\t\t\t\t\t=> joint.0.motor-pos-fb\n\tnet j0pos-cmd \t\t<= joint.0.motor-pos-cmd \t=> j0pid.command\n\tnet j0pid-output \t<= j0pid.output \t\t\t=> remora.joint.0.vel-cmd\n\n\tsetp j0pid.Pgain \t\t[JOINT_0]P\n\tsetp j0pid.Igain \t\t[JOINT_0]I\n\tsetp j0pid.Dgain \t\t[JOINT_0]D\n\tsetp j0pid.bias \t\t[JOINT_0]BIAS\n\tsetp j0pid.FF0 \t\t\t[JOINT_0]FF0\n\tsetp j0pid.FF1 \t\t\t[JOINT_0]FF1\n\tsetp j0pid.FF2 \t\t\t[JOINT_0]FF2\n\tsetp j0pid.deadband \t[JOINT_0]DEADBAND\n\tsetp j0pid.maxoutput \t[JOINT_0]MAX_VELOCITY\n\n\n# Joint 1 setup\n\n\tsetp remora.joint.1.scale \t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1pos-cmd \t\t<= joint.1.motor-pos-cmd \t=> remora.joint.1.pos-cmd\n\tnet j1pos-fb \t\t<= remora.joint.1.pos-fb \t=> joint.1.motor-pos-fb \n\tnet j1enable \t\t<= joint.1.amp-enable-out \t=> remora.joint.1.enable\n\n\n# Joint 2 setup\n\n\tsetp remora.joint.2.scale \t[JOINT_2]SCALE\n\tsetp remora.joint.2.maxaccel \t[JOINT_2]STEPGEN_MAXACCEL\n\n\tnet j2pos-cmd \t\t<= joint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\n\tnet j2pos-fb \t\t<= remora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\n\tnet j2enable \t\t<= joint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n# Joint 3 setup\n\n\tsetp remora.joint.3.scale \t[JOINT_3]SCALE\n\tsetp remora.joint.3.maxaccel \t[JOINT_3]STEPGEN_MAXACCEL\n\n\tnet j3pos-cmd \t\t<= joint.3.motor-pos-cmd \t=> remora.joint.3.pos-cmd\n\tnet j3pos-fb \t\t<= remora.joint.3.pos-fb \t=> joint.3.motor-pos-fb\n\tnet j3enable \t\t<= joint.3.amp-enable-out \t=> remora.joint.3.enable\n\n\n# Joint 4 setup\n\n\tsetp remora.joint.4.scale \t[JOINT_4]SCALE\n\tsetp remora.joint.4.maxaccel \t[JOINT_4]STEPGEN_MAXACCEL\n\n\tnet j4pos-cmd \t\t<= joint.4.motor-pos-cmd \t=> remora.joint.4.pos-cmd\n\tnet j4pos-fb \t\t<= remora.joint.4.pos-fb \t=> joint.4.motor-pos-fb\n\tnet j4enable \t\t<= joint.4.amp-enable-out \t=> remora.joint.4.enable\n\t\n\n\n\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/remora.ini",
    "content": "\n[EMC]\nMACHINE = Remora closed loop demo\nDEBUG = 0\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\n#DISPLAY = qtpyvcp\nEDITOR = gedit\nPOSITION_OFFSET = RELATIVE\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\nGRIDS = 10mm 20mm 50mm 100mm\nMAX_FEED_OVERRIDE = 1.2\nMIN_SPINDLE_OVERRIDE = 0.5\nMAX_SPINDLE_OVERRIDE = 1.2\nDEFAULT_LINEAR_VELOCITY = 50.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 200.00\nDEFAULT_ANGULAR_VELOCITY = 36.00\nMIN_ANGULAR_VELOCITY = 0\nMAX_ANGULAR_VELOCITY = 45.00\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\nPYVCP = 3D_printer_panel.xml\n\n[KINS]\nJOINTS = 5\n#KINEMATICS =trivkins coordinates=XYZZA kinstype=BOTH\n# kinstype=BOTH means that the machine can move in joint mode and world mode\n# not good for gantrys or double z axes.\nKINEMATICS =trivkins coordinates=XYZZA\n\n[FILTER]\nPROGRAM_EXTENSION = .py Python Script\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\nSERVO_PERIOD = 1000000\n\n[HAL]\nHALFILE = remora.hal\nHALFILE = 3Dprinter.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n\n[TRAJ]\nCOORDINATES =  X Y Z A\nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nDEFAULT_LINEAR_VELOCITY = 50.00\nMAX_LINEAR_VELOCITY = 200.00\nNO_FORCE_HOMING = 1 \n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n[AXIS_X]\nMAX_VELOCITY = 250\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 3000.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 3000.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = -80.0\nFERROR = 2\nMIN_FERROR = 2.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\nDEADBAND = 0.01\nP = 30\nI = 0\nD = 0\nFF0 = 0\nFF1 = 1.035\nFF2 = 0\nBIAS = 0\n\n[JOINT_0_ENCODER]\nSCALE = 100\n\n[AXIS_Y]\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 3000.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 3000.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 80.0\nFERROR = 9.0\nMIN_FERROR = 5.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n[AXIS_Z]\nOFFSET_AV_RATIO = 0.2\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n\n[JOINT_3]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# Extruder 0\n[AXIS_A]\nMAX_VELOCITY = 200.0\nMAX_ACCELERATION = 1000.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\n\n[JOINT_4]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\nMAX_VELOCITY = 200\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 436.9375\nFERROR = 2\n#MIN_FERROR = .25\nMIN_FERROR = 0.75\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n\n# ------------------------------\n#    3D Printer configuration\n# ------------------------------\n\n# Heated bed\n[BED]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 21.5\nPID_KI\t\t= 1.0\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 80.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n\n# Extruder 0\n[EXT0]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 2.9\nPID_KI\t\t= 0.11\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 270.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/remora.pref",
    "content": "[DEFAULT]\nspindle_start_rpm = 300.0\nscale_jog_vel = 300.0\nscale_spindle_override = 1\nscale_feed_override = 1\nscale_rapid_override = 1\nhide_turtle_jog_button = False\nturtle_jog_factor = 20\ndro_size = 28\nopen_file = \nscreen1 = window\nx_pos = 40\ny_pos = 30\nwidth = 979\nheight = 750\ngtk_theme = Follow System Theme\naudio_alert = /usr/share/sounds/freedesktop/stereo/dialog-warning.oga\naudio_error = /usr/share/sounds/freedesktop/stereo/dialog-error.oga\ngrid_size = 1.0\nview = p\nmouse_btn_mode = 4\nhide_cursor = False\nsystem_name_tool = Tool\nsystem_name_g5x = G5x\nsystem_name_rot = Rot\nsystem_name_g92 = G92\nsystem_name_g54 = G54\nsystem_name_g55 = G55\nsystem_name_g56 = G56\nsystem_name_g57 = G57\nsystem_name_g58 = G58\nsystem_name_g59 = G59\nsystem_name_g59.1 = G59.1\nsystem_name_g59.2 = G59.2\nsystem_name_g59.3 = G59.3\njump_to_dir = /home/pi\nshow_keyboard_on_offset = False\nshow_keyboard_on_tooledit = False\nshow_keyboard_on_edit = False\nshow_keyboard_on_mdi = False\nspindle_bar_min = 0.0\nspindle_bar_max = 6000.0\nx_pos_popup = 45.0\ny_pos_popup = 55\nwidth_popup = 250.0\nmax_messages = 10\nmessage_font = sans 10\nuse_frames = True\nshow_dro_btn = False\nuse_auto_units = True\nblockdel = False\nopstop = False\nenable_dro = False\nshow_offsets = False\nshow_dtg = False\nview_tool_path = True\nview_dimension = True\ngremlin_view = rbt_view_p\nrun_from_line = no_run\nunlock_way = use\nunlock_code = 123\nshow_preview_on_offset = False\nuse_keyboard_shortcuts = False\nabs_color = #0000FF\nrel_color = #000000\ndtg_color = #FFFF00\nhomed_color = #00FF00\nunhomed_color = #FF0000\ndro_digits = 3\ntoggle_readout = True\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-closed-loop/tool.tbl",
    "content": "T1 P1 D0.125000 Z+0.511000 ;1/8 end mill\nT2 P2 D0.062500 Z+0.100000 ;1/16 end mill\nT3 P3 D0.201000 Z+1.273000 ;#7 tap drill\nT99999 P99999 Z+0.100000 ;big tool number\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/3D_printer_panel.xml",
    "content": "<pyvcp>\n<labelframe text=\"3D Printer\">\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Heated Bed\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n\t<anchor>\"w\"</anchor>\n    </label>\n    <number> \n    \t<halpin>\"bed-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Extruder 0\"</text>\n<fg>\"red\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Set temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-SP\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<hbox>\n    <label>\n        <text>\" Act temperature: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-PV\"</halpin>\n    \t<format>\"3.1f\"</format>\n\t<width>\"5\"</width>\n    </number>\n    <label>\n        <text>\"&#0176;C \"</text>\n    </label>\n</hbox>\n<label>\n<text>\"                                                 \"</text>\n</label>\n<label>\n<text>\" Cooling Fan\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Fan speed: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"ext0-fan-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n<label>\n<text>\" Probe\"</text>\n<fg>\"blue\"</fg>\n<anchor>\"w\"</anchor>\n</label>\n<hbox>\n    <label>\n        <text>\" Position: \"</text>\n    </label>\n    <number> \n    \t<halpin>\"BLtouch-SP\"</halpin>\n    \t<format>\"3.0f\"</format>\n    </number>\n</hbox>\n<label>\n<text>\"   \"</text>\n</label>\n       <button>\n         <halpin>\"PRUreset\"</halpin>\n         <bd>3</bd>\n         <text>\"PRU Reset\"</text>\n       </button>\n</labelframe>\n</pyvcp>"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/3Dprinter.hal",
    "content": "# Include your custom HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# tool changing\n\n\tnet tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared\n\tnet tool-change-loopback iocontrol.0.tool-change => iocontrol.0.tool-changed\n\n# PID controllers for heaters\n\n\tloadrt PIDcontroller names=PID-bed,PID-ext0\n\taddf PID-bed.compute servo-thread\n\taddf PID-ext0.compute servo-thread\n\n\n# end-stops\n\n\t#net X-min \tremora.input.00 \t=> joint.0.home-sw-in joint.0.neg-lim-sw-in\n\t#net X-max \tremora.input.01 \t=> joint.0.pos-lim-sw-in\n\t#net Y-min \tremora.input.02 \t=> joint.1.home-sw-in joint.1.neg-lim-sw-in\n\t#net Y-max \tremora.input.03 \t=> joint.1.pos-lim-sw-in\n\n\n# remora command outputs\n\n\tnet bed-heater-SP \t\t=> remora.SP.0\n\tnet ext0-heater-SP  \t=> remora.SP.1\n\tnet ext0-cooling-SP \t=> remora.SP.2\n\tnet BLtouch-SP \t\t\t=> remora.SP.3\n\n\n# remora command feedbacks\n\n\tnet bed-PV \t\t\t=> remora.PV.0\n\tnet ext0-PV \t\t=> remora.PV.1\n\n\n## Bed PID configuration\n\n\tnet remora-status \t=> PID-bed.auto\n\tnet bed-SP \t\t\t=> PID-bed.SP\n\tnet bed-PV \t\t\t=> PID-bed.PV\n\tnet bed-heater-SP \t=> PID-bed.CV\n\n\tsetp PID-bed.pOnM \t[BED]PID_PONM\n\tsetp PID-bed.direction\t[BED]PID_DIR\n\tsetp PID-bed.KP\t\t[BED]PID_KP\n\tsetp PID-bed.KI\t\t[BED]PID_KI\n\tsetp PID-bed.KD\t\t[BED]PID_KD\n\tsetp PID-bed.SPmin\t[BED]PID_SPMIN\n\tsetp PID-bed.SPmax\t[BED]PID_SPMAX\n\tsetp PID-bed.CVmin\t[BED]PID_CVMIN\n\tsetp PID-bed.CVmax\t[BED]PID_CVMAX\n\n\n# Extruder 0 PID configuration\n\n\tnet remora-status \t=> PID-ext0.auto\n\tnet ext0-SP \t\t=> PID-ext0.SP\n\tnet ext0-PV \t\t=> PID-ext0.PV\n\tnet ext0-heater-SP \t=> PID-ext0.CV\n\n\tsetp PID-ext0.pOnM \t[EXT0]PID_PONM\n\tsetp PID-ext0.direction\t[EXT0]PID_DIR\n\tsetp PID-ext0.KP\t[EXT0]PID_KP\n\tsetp PID-ext0.KI\t[EXT0]PID_KI\n\tsetp PID-ext0.KD\t[EXT0]PID_KD\n\tsetp PID-ext0.SPmin\t[EXT0]PID_SPMIN\n\tsetp PID-ext0.SPmax\t[EXT0]PID_SPMAX\n\tsetp PID-ext0.CVmin\t[EXT0]PID_CVMIN\n\tsetp PID-ext0.CVmax\t[EXT0]PID_CVMAX\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/autosave.halscope",
    "content": "THREAD servo-thread\nMAXCHAN 4\nHMULT 1\nHZOOM 1\nHPOS 0.000000e+00\nCHAN 1\nPIN remora.input.06\nVSCALE 0\nVPOS 0.500000\nVOFF 0.000000e+00\nTMODE 0\nRMODE 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n# This file will not be overwritten when you run stepconf again\n\n# spiPRU command outputs\n\nnet bed-SP  \t=> pyvcp.bed-SP\nnet ext0-SP  \t=> pyvcp.ext0-SP\nnet ext0-fan-SP => pyvcp.ext0-fan-SP\nnet BLtouch-SP \t=> pyvcp.BLtouch-SP\n\n\n# spiPRU command feedbacks\n\nnet bed-PV \t=> pyvcp.bed-PV\nnet ext0-PV \t=> pyvcp.ext0-PV\n\n#net PRUreset \t\t<= pyvcp.PRUreset \t\t=> remora.PRU-reset\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/gcode2ngc.py",
    "content": "#!/usr/bin/env python\n# gcode2ngc.py\n\nimport sys\n\n\n# First line\nprint \"%\"\n\nf = file(sys.argv[1])\nfor line in f:\n\n    # Change extruder axis name\n    line = line.replace(\" E\", \" A\")\n\n    # S -> P\n    line = line.replace(\" S\", \" P\")\n\n    # Comment M82 code\n    line = line.replace(\"M82\", \";M82\")\n\n    # Comment M84 code\n    line = line.replace(\"M84\", \";M84\")\n\n    print line.strip()\n\n# Last line\nprint \"%\""
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/linuxcnc.var",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t-314.116882\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/linuxcnc.var.bak",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t1.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t-314.116882\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t0.000000\n5222\t0.000000\n5223\t0.000000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/probe-results.txt",
    "content": "-0.000080 0.000059 0.025933 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.993950 0.006350 -0.049080 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.000207 0.000043 -0.129105 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987766 0.000021 -0.254069 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.993887 -0.006165 -0.321577 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.993900 0.006269 -0.406607 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.987774 -0.000048 -0.451620 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.006344 39.993887 -0.379061 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.006094 39.993801 -0.289056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.012489 40.000132 -0.206618 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.012541 40.000004 -0.199187 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.012466 39.999933 -0.109063 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.000053 40.000032 -0.051626 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.012569 40.000044 -0.079106 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000023 79.987680 -0.171585 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.993933 80.006310 -0.174064 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.993874 79.993769 -0.219068 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.994055 79.993801 -0.256602 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.987771 79.999978 -0.294064 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987707 80.000057 -0.369142 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000210 80.000128 -0.444086 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n240.000138 119.987611 -0.521568 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.006297 119.993796 -0.449133 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.006062 119.993864 -0.404179 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.006168 119.993788 -0.326555 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.999828 120.000044 -0.291653 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.012568 120.000042 -0.276660 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n-0.000050 120.000013 -0.294077 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000061 159.987627 -0.296611 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.987740 160.000071 -0.324194 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n79.987747 160.000063 -0.364057 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987694 159.999949 -0.431689 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n159.993992 160.006315 -0.486555 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987604 160.000038 -0.521580 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.987625 160.000002 -0.604056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.993784 199.993904 -0.671595 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n200.012463 200.000067 -0.571580 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.006317 200.006319 -0.524123 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n120.012535 200.000040 -0.489056 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.012535 200.000086 -0.404080 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n40.012470 199.999975 -0.359058 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.012459 200.000025 -0.334096 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n0.000225 240.000212 -0.356623 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n39.994026 240.006403 -0.376677 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n80.000282 239.999964 -0.411589 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n119.987617 240.000055 -0.526609 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n160.000267 239.999933 -0.611560 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n199.987686 240.000093 -0.646621 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n239.994007 240.006407 -0.756566 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/pyvcp_options.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\nsets spindle-at-speed true\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/remora-eth.hal",
    "content": "\nloadrt [KINS]KINEMATICS\nloadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n# load the Remora real-time component\n\n\tloadrt remora-eth-3.0\n\n\n# estop and SPI comms enable and feedback\n\n\tnet user-enable-out\t\t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remora-status \t\t<= remora.SPI-status \t\t\t\t=> iocontrol.0.emc-enable-in\n\n\n# add the remora and motion functions to threads\n\n\taddf remora.read \t\t\tservo-thread\n\taddf motion-command-handler servo-thread\n\taddf motion-controller \t\tservo-thread\n\taddf remora.update-freq \tservo-thread\n\taddf remora.write \t\t\tservo-thread\n\n\n# joint 0 setup\n\n\tsetp remora.joint.0.scale \t\t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\n\tnet j0pos-cmd \t\tjoint.0.motor-pos-cmd \t=> remora.joint.0.pos-cmd\n\tnet j0pos-fb \t\tremora.joint.0.pos-fb \t=> joint.0.motor-pos-fb\n\tnet j0enable \t\tjoint.0.amp-enable-out \t=> remora.joint.0.enable\n\n\n# joint 1 setup\n\n\tsetp remora.joint.1.scale \t\t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1pos-cmd \t\tjoint.1.motor-pos-cmd \t=> remora.joint.1.pos-cmd\n\tnet j1pos-fb \t\tremora.joint.1.pos-fb \t=> joint.1.motor-pos-fb\n\tnet j1enable \t\tjoint.1.amp-enable-out \t=> remora.joint.1.enable\n\n# joint 2 setup\n\n\tsetp remora.joint.2.scale [JOINT_2]SCALE\n\tsetp remora.joint.2.maxaccel [JOINT_2]STEPGEN_MAXACCEL\n\n\tnet j2pos-cmd \t\tjoint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\n\tnet j2pos-fb \t\tremora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\n\tnet j2enable \t\tjoint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n# joint 3 setup\n\n\tsetp remora.joint.3.scale [JOINT_3]SCALE\n\tsetp remora.joint.3.maxaccel [JOINT_3]STEPGEN_MAXACCEL\n\tsetp remora.joint.3.pgain 5\n\n\tnet j3pos-cmd \t\tjoint.3.motor-pos-cmd \t=> remora.joint.3.pos-cmd\n\tnet j3pos-fb \t\tremora.joint.3.pos-fb \t=> joint.3.motor-pos-fb\n\tnet j3enable \t\tjoint.3.amp-enable-out \t=> remora.joint.3.enable\n\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/remora-eth.ini",
    "content": "\n[EMC]\nMACHINE = Ender 3\nDEBUG = 0\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\nCYCLE_TIME = 0.100\nPOSITION_OFFSET = RELATIVE\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\nMAX_FEED_OVERRIDE = 1.2\nMAX_SPINDLE_OVERRIDE = 1.0\nDEFAULT_LINEAR_VELOCITY = 50.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 150.00\nDEFAULT_ANGULAR_VELOCITY = 36.00\nMIN_ANGULAR_VELOCITY = 0\nMAX_ANGULAR_VELOCITY = 45.00\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\nPYVCP = 3D_printer_panel.xml\n\n[KINS]\nJOINTS = 4\n#KINEMATICS =trivkins coordinates=XYZZA kinstype=BOTH\n# kinstype=BOTH means that the machine can move in joint mode and world mode\n# not good for gantrys or double z axes.\nKINEMATICS =trivkins coordinates=XYZA\n\n[FILTER]\nPROGRAM_EXTENSION = .png,.gif,.jpg Greyscale Depth Image\nPROGRAM_EXTENSION = .py Python Script\npng = image-to-gcode\ngif = image-to-gcode\njpg = image-to-gcode\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\nSUBROUTINE_PATH = ~/linuxcnc/subroutines\nUSER_M_PATH = ~/linuxcnc/m_codes\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\n#SERVO_PERIOD = 1000000\nSERVO_PERIOD =10000000\n\n[HAL]\nHALFILE = remora-eth.hal\nHALFILE = 3Dprinter.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n\n[TRAJ]\nCOORDINATES =  X Y Z A\nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nDEFAULT_LINEAR_VELOCITY = 50.00\nMAX_LINEAR_VELOCITY = 1000.00\nNO_FORCE_HOMING = 1 \n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n[AXIS_X]\nMAX_VELOCITY = 150\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -25.0\nMAX_LIMIT = 300.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -25.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 160.0\nFERROR = 9.0\nMIN_FERROR = 5.0\n#HOME_SEARCH_VEL = -10.0\n#HOME_LATCH_VEL = -3.0\n#HOME_FINAL_VEL = 20\n#HOME_IGNORE_LIMITS = YES\n#HOME_USE_INDEX = NO\n#HOME_OFFSET = -25.0\n#HOME = 0.0\n#HOME_SEQUENCE = 1 \nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n[AXIS_Y]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 300.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 160.0\nFERROR = 9.0\nMIN_FERROR = 5.0\n#HOME_SEARCH_VEL = -10.0\n#HOME_LATCH_VEL = -3.0\n#HOME_FINAL_VEL = 20\n#HOME_IGNORE_LIMITS = YES\n#HOME_USE_INDEX = NO\n#HOME_OFFSET = -20.0\n#HOME = -10.0\n#OME_SEQUENCE = 2\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n[AXIS_Z]\nMAX_VELOCITY = 50.0\nMAX_ACCELERATION = 200.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nOFFSET_AV_RATIO = 0.2\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# Extruder 0\n[AXIS_A]\nMAX_VELOCITY = 150.0\nMAX_ACCELERATION = 1000.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\n\n[JOINT_3]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -9999.0\nMAX_LIMIT = 999999999.0\nMAX_VELOCITY = 150\nMAX_ACCELERATION = 1000.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = -436.9375\nFERROR = 5\n#MIN_FERROR = .25\nMIN_FERROR = 0.75\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n# ------------------------------\n#    3D Printer configuration\n# ------------------------------\n\n# Heated bed\n[BED]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 21.5\nPID_KI\t\t= 1.0\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 80.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n\n# Extruder 0\n[EXT0]\nPID_PONM\t= 1\nPID_DIR\t\t= 0\nPID_KP\t\t= 2.9\nPID_KI\t\t= 0.11\nPID_KD\t\t= 0.0\nPID_SPMIN\t= 0.0\nPID_SPMAX\t= 270.0\nPID_CVMIN\t= 0.0\nPID_CVMAX\t= 100.0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-eth/tool.tbl",
    "content": "T1 P1 Z-0.804203 ;extruder 0 \nT2 P2 ;\nT3 P3 ;\nT99 P99 X-22.000000 ;probe \n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/Remora-XY.prefs",
    "content": "[GUI_OPTIONS]\nFont size = 10\nForeground color = #000000\nBackground color = #d9d9d9\nDisabled color = #a3a3a3\nActive color = #00cc00\nWarning color = #dd0000\nVoltage color = #0000ff\nExit warning = True\nWindow size = small\nWindow screen = maximized\nHide Max Jog. Slider = False\nHide Max Rapid. Slider = True\nHide Max Velocity Slider = True\nShow Button Label = False\nLoad last file = False\nHide Button Frame = True\nWindow last = 800x386+0+94\n\n[STATISTICS]\nProgram run time = 0\n\n[BUTTONS]\n1 Name = \n1 Code = \n2 Name = \n2 Code = \n3 Name = \n3 Code = \n4 Name = \n4 Code = \n5 Name = \n5 Code = \n6 Name = \n6 Code = \n7 Name = \n7 Code = \n8 Name = \n8 Code = \n9 Name = \n9 Code = \n10 Name = \n10 Code = \n11 Name = \n11 Code = \n12 Name = \n12 Code = \n13 Name = \n13 Code = \n14 Name = \n14 Code = \n15 Name = \n15 Code = \n16 Name = \n16 Code = \n17 Name = \n17 Code = \n18 Name = \n18 Code = \n19 Name = \n19 Code = \n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/axis.ngc",
    "content": "( AXIS \"splash g-code\" Not intended for actual milling )\n( To run this code anyway you might have to Touch Off the Z axis)\n( depending on your setup. As if you had some material in your mill... )\n( Hint jog the Z axis down a bit then touch off )\n( Also press the Toggle Skip Lines with \"/\" to see that part )\n( If the program is too big or small for your machine, change the scale below )\n( LinuxCNC 19/1/2012 2:13:51 PM )\n#<depth>=2.0\n#<scale>=0.25\nG21 G90 G64 G40\nG0 Z3.0\n( engraving )\nG17\nM3 S10000\nG0 X[1.75781*#<scale>] Y[0.5*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[5.95508*#<scale>] Y[20.54297*#<scale>]\nG1 X[10.07031*#<scale>]\nG1 X[6.58398*#<scale>] Y[3.84961*#<scale>]\nG1 X[16.7832*#<scale>]\nG1 X[16.08594*#<scale>] Y[0.5*#<scale>]\nG1 X[1.75781*#<scale>]\nG0 Z3.0\nG0 X[18.72461*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[21.75977*#<scale>] Y[15.01953*#<scale>]\nG1 X[25.68359*#<scale>]\nG1 X[22.64844*#<scale>] Y[0.5*#<scale>]\nG1 X[18.72461*#<scale>]\nG0 Z3.0\nG0 X[26.55859*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[29.59375*#<scale>] Y[15.01953*#<scale>]\nG1 X[33.3125*#<scale>]\nG1 X[32.92969*#<scale>] Y[13.13281*#<scale>]\nG2 X[34.16342*#<scale>] Y[14.08624*#<scale>] I[8.82141*#<scale>] J[-10.13994*#<scale>]\nG2 X[35.52734*#<scale>] Y[14.8418*#<scale>] I[4.53823*#<scale>] J[-6.58354*#<scale>]\nG2 X[38.08398*#<scale>] Y[15.36133*#<scale>] I[2.53506*#<scale>] J[-5.9247*#<scale>]\nG2 X[39.5966*#<scale>] Y[15.13543*#<scale>] I[0.06403*#<scale>] J[-4.74845*#<scale>]\nG2 X[40.90039*#<scale>] Y[14.33594*#<scale>] I[-1.02874*#<scale>] J[-3.14049*#<scale>]\nG2 X[41.7019*#<scale>] Y[13.08328*#<scale>] I[-2.33045*#<scale>] J[-2.37388*#<scale>]\nG2 X[41.93945*#<scale>] Y[11.61523*#<scale>] I[-4.07102*#<scale>] J[-1.41199*#<scale>]\nG2 X[41.76899*#<scale>] Y[10.15744*#<scale>] I[-10.17473*#<scale>] J[0.45091*#<scale>]\nG2 X[41.48828*#<scale>] Y[8.7168*#<scale>] I[-39.45138*#<scale>] J[6.93932*#<scale>]\nG1 X[39.7793*#<scale>] Y[0.5*#<scale>]\nG1 X[35.85547*#<scale>]\nG1 X[37.57813*#<scale>] Y[8.74414*#<scale>]\nG3 X[37.79665*#<scale>] Y[9.84001*#<scale>] I[-62.81729*#<scale>] J[13.09579*#<scale>]\nG3 X[37.96094*#<scale>] Y[10.94531*#<scale>] I[-9.6524*#<scale>] J[1.99958*#<scale>]\nG3 X[37.50977*#<scale>] Y[12.12109*#<scale>] I[-1.54162*#<scale>] J[0.0829*#<scale>]\nG3 X[36.2793*#<scale>] Y[12.55859*#<scale>] I[-1.13356*#<scale>] J[-1.23903*#<scale>]\nG3 X[35.26888*#<scale>] Y[12.33731*#<scale>] I[0.05277*#<scale>] J[-2.65845*#<scale>]\nG3 X[34.36523*#<scale>] Y[11.83398*#<scale>] I[1.956*#<scale>] J[-4.57455*#<scale>]\nG3 X[32.71094*#<scale>] Y[9.91992*#<scale>] I[2.86418*#<scale>] J[-4.1474*#<scale>]\nG3 X[32.13267*#<scale>] Y[8.21493*#<scale>] I[8.76492*#<scale>] J[-3.92328*#<scale>]\nG3 X[31.72656*#<scale>] Y[6.46094*#<scale>] I[36.34493*#<scale>] J[-9.33906*#<scale>]\nG1 X[30.48242*#<scale>] Y[0.5*#<scale>]\nG1 X[26.55859*#<scale>]\nG0 Z3.0\nG0 X[26.09375*#<scale>] Y[16.98828*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[22.16992*#<scale>]\nG1 X[22.9082*#<scale>] Y[20.54297*#<scale>]\nG1 X[26.83203*#<scale>]\nG1 X[26.09375*#<scale>] Y[16.98828*#<scale>]\nG0 Z3.0\nG0 X[46.14777*#<scale>] Y[12.78778*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[46.61523*#<scale>] Y[15.01953*#<scale>]\nG1 X[50.53906*#<scale>]\nG1 X[48.74805*#<scale>] Y[6.41992*#<scale>]\nG3 X[48.55485*#<scale>] Y[5.46101*#<scale>] I[39.83359*#<scale>] J[-8.52447*#<scale>]\nG3 X[48.41992*#<scale>] Y[4.49219*#<scale>] I[7.34343*#<scale>] J[-1.51652*#<scale>]\nG3 X[48.88477*#<scale>] Y[3.41211*#<scale>] I[1.45252*#<scale>] J[-0.01493*#<scale>]\nG3 X[50.07422*#<scale>] Y[2.96094*#<scale>] I[1.13093*#<scale>] J[1.18803*#<scale>]\nG3 X[51.09961*#<scale>] Y[3.15234*#<scale>] I[-0.00663*#<scale>] J[2.87782*#<scale>]\nG3 X[52.13867*#<scale>] Y[3.75391*#<scale>] I[-1.85377*#<scale>] J[4.40013*#<scale>]\nG3 X[53.0957*#<scale>] Y[4.68359*#<scale>] I[-3.51724*#<scale>] J[4.57812*#<scale>]\nG3 X[53.88867*#<scale>] Y[6.05078*#<scale>] I[-4.71119*#<scale>] J[3.64605*#<scale>]\nG3 X[54.44922*#<scale>] Y[8.10156*#<scale>] I[-12.97687*#<scale>] J[4.64901*#<scale>]\nG1 X[55.89844*#<scale>] Y[15.01953*#<scale>]\nG1 X[59.82227*#<scale>]\nG1 X[56.78711*#<scale>] Y[0.5*#<scale>]\nG1 X[53.12305*#<scale>]\nG1 X[53.5332*#<scale>] Y[2.46875*#<scale>]\nG2 X[51.14513*#<scale>] Y[0.79202*#<scale>] I[-6.21919*#<scale>] J[6.3187*#<scale>]\nG2 X[48.29688*#<scale>] Y[0.1582*#<scale>] I[-2.84268*#<scale>] J[6.05776*#<scale>]\nG2 X[46.78426*#<scale>] Y[0.3841*#<scale>] I[-0.06403*#<scale>] J[4.74845*#<scale>]\nG2 X[45.48047*#<scale>] Y[1.18359*#<scale>] I[1.02874*#<scale>] J[3.14049*#<scale>]\nG2 X[44.68637*#<scale>] Y[2.45262*#<scale>] I[2.34744*#<scale>] J[2.35189*#<scale>]\nG2 X[44.45508*#<scale>] Y[3.93164*#<scale>] I[4.23866*#<scale>] J[1.42044*#<scale>]\nG2 X[44.63379*#<scale>] Y[5.43705*#<scale>] I[10.83187*#<scale>] J[-0.52256*#<scale>]\nG2 X[44.91992*#<scale>] Y[6.92578*#<scale>] I[45.15644*#<scale>] J[-7.90718*#<scale>]\nG1 X[46.14777*#<scale>] Y[12.78778*#<scale>]\nG0 Z3.0\nG0 X[61.99609*#<scale>] Y[15.01953*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[66.16602*#<scale>]\nG1 X[68.28516*#<scale>] Y[10.87695*#<scale>]\nG1 X[71.96289*#<scale>] Y[15.01953*#<scale>]\nG1 X[76.73438*#<scale>]\nG1 X[69.99414*#<scale>] Y[7.48633*#<scale>]\nG1 X[73.6582*#<scale>] Y[0.5*#<scale>]\nG1 X[69.48828*#<scale>]\nG1 X[67.39648*#<scale>] Y[4.57422*#<scale>]\nG1 X[63.78711*#<scale>] Y[0.5*#<scale>]\nG1 X[58.97461*#<scale>]\nG1 X[65.6875*#<scale>] Y[7.9375*#<scale>]\nG1 X[61.99609*#<scale>] Y[15.01953*#<scale>]\nG0 Z3.0\nG0 X[78.12067*#<scale>] Y[11.80439*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG2 F400.0 X[78.15861*#<scale>] Y[11.98873*#<scale>] I[14.86609*#<scale>] J[-2.96421*#<scale>]\nG2 X[79.20898*#<scale>] Y[15.0332*#<scale>] I[13.03118*#<scale>] J[-2.79244*#<scale>]\nG2 X[80.8214*#<scale>] Y[17.48665*#<scale>] I[10.09107*#<scale>] J[-4.87534*#<scale>]\nG2 X[83.06445*#<scale>] Y[19.38086*#<scale>] I[7.26534*#<scale>] J[-6.32817*#<scale>]\nG2 X[88.42383*#<scale>] Y[20.88477*#<scale>] I[5.2993*#<scale>] J[-8.5834*#<scale>]\nG2 X[91.21708*#<scale>] Y[20.49528*#<scale>] I[0.10667*#<scale>] J[-9.44597*#<scale>]\nG2 X[93.6875*#<scale>] Y[19.13477*#<scale>] I[-1.95281*#<scale>] J[-6.46904*#<scale>]\nG2 X[95.32764*#<scale>] Y[16.9908*#<scale>] I[-4.27639*#<scale>] J[-4.97078*#<scale>]\nG2 X[96.05273*#<scale>] Y[14.39063*#<scale>] I[-7.426*#<scale>] J[-3.47204*#<scale>]\nG1 X[92.10156*#<scale>] Y[14.00781*#<scale>]\nG3 X[91.68364*#<scale>] Y[15.38196*#<scale>] I[-5.83945*#<scale>] J[-1.02535*#<scale>]\nG3 X[90.83008*#<scale>] Y[16.53711*#<scale>] I[-2.94269*#<scale>] J[-1.28147*#<scale>]\nG3 X[89.65745*#<scale>] Y[17.15799*#<scale>] I[-2.02111*#<scale>] J[-2.39937*#<scale>]\nG3 X[88.3418*#<scale>] Y[17.33008*#<scale>] I[-1.26203*#<scale>] J[-4.53327*#<scale>]\nG3 X[85.14258*#<scale>] Y[16.29102*#<scale>] I[0.01526*#<scale>] J[-5.49164*#<scale>]\nG3 X[83.72532*#<scale>] Y[14.83462*#<scale>] I[3.39082*#<scale>] J[-4.71749*#<scale>]\nG3 X[82.77734*#<scale>] Y[13.03711*#<scale>] I[7.50088*#<scale>] J[-5.10456*#<scale>]\nG3 X[81.88867*#<scale>] Y[8.63477*#<scale>] I[10.80218*#<scale>] J[-4.47143*#<scale>]\nG3 X[82.12643*#<scale>] Y[6.67148*#<scale>] I[7.47758*#<scale>] J[-0.09047*#<scale>]\nG3 X[83.03711*#<scale>] Y[4.91602*#<scale>] I[4.24649*#<scale>] J[1.08898*#<scale>]\nG3 X[85.92188*#<scale>] Y[3.60352*#<scale>] I[2.82627*#<scale>] J[2.38541*#<scale>]\nG3 X[88.84766*#<scale>] Y[4.64258*#<scale>] I[0.00074*#<scale>] J[4.63663*#<scale>]\nG3 X[90.07896*#<scale>] Y[6.0293*#<scale>] I[-3.23186*#<scale>] J[4.10967*#<scale>]\nG3 X[90.84375*#<scale>] Y[7.71875*#<scale>] I[-6.5029*#<scale>] J[3.96159*#<scale>]\nG1 X[95.0*#<scale>] Y[7.08984*#<scale>]\nG2 X[93.56373*#<scale>] Y[4.23114*#<scale>] I[-11.87256*#<scale>] J[4.17484*#<scale>]\nG2 X[91.34961*#<scale>] Y[1.92188*#<scale>] I[-7.88363*#<scale>] J[5.34275*#<scale>]\nG2 X[88.64367*#<scale>] Y[0.56922*#<scale>] I[-5.3138*#<scale>] J[7.24715*#<scale>]\nG2 X[85.64844*#<scale>] Y[0.14453*#<scale>] I[-2.92298*#<scale>] J[9.84046*#<scale>]\nG2 X[82.5341*#<scale>] Y[0.63758*#<scale>] I[-0.13266*#<scale>] J[9.24446*#<scale>]\nG2 X[79.89258*#<scale>] Y[2.35938*#<scale>] I[2.19287*#<scale>] J[6.25138*#<scale>]\nG2 X[78.25253*#<scale>] Y[5.37699*#<scale>] I[5.36449*#<scale>] J[4.87005*#<scale>]\nG2 X[77.82813*#<scale>] Y[8.78516*#<scale>] I[12.16539*#<scale>] J[3.2454*#<scale>]\nG2 X[78.12067*#<scale>] Y[11.80439*#<scale>] I[15.15864*#<scale>] J[0.05503*#<scale>]\nG0 Z3.0\nG0 X[98.14159*#<scale>] Y[7.6254*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG1 F400.0 X[100.83789*#<scale>] Y[20.54297*#<scale>]\nG1 X[104.69336*#<scale>]\nG1 X[110.12109*#<scale>] Y[7.13086*#<scale>]\nG1 X[112.92383*#<scale>] Y[20.54297*#<scale>]\nG1 X[116.75195*#<scale>]\nG1 X[112.56836*#<scale>] Y[0.5*#<scale>]\nG1 X[108.72656*#<scale>]\nG1 X[103.3125*#<scale>] Y[13.9668*#<scale>]\nG1 X[100.49609*#<scale>] Y[0.5*#<scale>]\nG1 X[96.6543*#<scale>]\nG1 X[98.14159*#<scale>] Y[7.6254*#<scale>]\nG0 Z3.0\nG0 X[118.27432*#<scale>] Y[8.23889*#<scale>]\nG1 F100.0 Z[-#<depth>]\nG2 F400.0 X[118.26953*#<scale>] Y[8.78516*#<scale>] I[12.585*#<scale>] J[0.3835*#<scale>]\nG2 X[118.60002*#<scale>] Y[11.98873*#<scale>] I[15.15864*#<scale>] J[0.05503*#<scale>]\nG2 X[119.65039*#<scale>] Y[15.0332*#<scale>] I[13.03118*#<scale>] J[-2.79244*#<scale>]\nG2 X[121.26281*#<scale>] Y[17.48665*#<scale>] I[10.09107*#<scale>] J[-4.87534*#<scale>]\nG2 X[123.50586*#<scale>] Y[19.38086*#<scale>] I[7.26534*#<scale>] J[-6.32817*#<scale>]\nG2 X[128.86523*#<scale>] Y[20.88477*#<scale>] I[5.2993*#<scale>] J[-8.5834*#<scale>]\nG2 X[131.65849*#<scale>] Y[20.49528*#<scale>] I[0.10667*#<scale>] J[-9.44597*#<scale>]\nG2 X[134.12891*#<scale>] Y[19.13477*#<scale>] I[-1.95281*#<scale>] J[-6.46904*#<scale>]\nG2 X[135.76904*#<scale>] Y[16.9908*#<scale>] I[-4.27639*#<scale>] J[-4.97078*#<scale>]\nG2 X[136.49414*#<scale>] Y[14.39063*#<scale>] I[-7.426*#<scale>] J[-3.47204*#<scale>]\nG1 X[132.54297*#<scale>] Y[14.00781*#<scale>]\nG3 X[132.12504*#<scale>] Y[15.38196*#<scale>] I[-5.83945*#<scale>] J[-1.02535*#<scale>]\nG3 X[131.27148*#<scale>] Y[16.53711*#<scale>] I[-2.94269*#<scale>] J[-1.28147*#<scale>]\nG3 X[130.09886*#<scale>] Y[17.15799*#<scale>] I[-2.02111*#<scale>] J[-2.39937*#<scale>]\nG3 X[128.7832*#<scale>] Y[17.33008*#<scale>] I[-1.26203*#<scale>] J[-4.53327*#<scale>]\nG3 X[125.58398*#<scale>] Y[16.29102*#<scale>] I[0.01526*#<scale>] J[-5.49164*#<scale>]\nG3 X[124.16673*#<scale>] Y[14.83462*#<scale>] I[3.39082*#<scale>] J[-4.71749*#<scale>]\nG3 X[123.21875*#<scale>] Y[13.03711*#<scale>] I[7.50088*#<scale>] J[-5.10456*#<scale>]\nG3 X[122.33008*#<scale>] Y[8.63477*#<scale>] I[10.80218*#<scale>] J[-4.47143*#<scale>]\nG3 X[122.56784*#<scale>] Y[6.67148*#<scale>] I[7.47758*#<scale>] J[-0.09047*#<scale>]\nG3 X[123.47852*#<scale>] Y[4.91602*#<scale>] I[4.24649*#<scale>] J[1.08898*#<scale>]\nG3 X[126.36328*#<scale>] Y[3.60352*#<scale>] I[2.82627*#<scale>] J[2.38541*#<scale>]\nG3 X[129.28906*#<scale>] Y[4.64258*#<scale>] I[0.00074*#<scale>] J[4.63663*#<scale>]\nG3 X[130.52037*#<scale>] Y[6.0293*#<scale>] I[-3.23186*#<scale>] J[4.10967*#<scale>]\nG3 X[131.28516*#<scale>] Y[7.71875*#<scale>] I[-6.5029*#<scale>] J[3.96159*#<scale>]\nG1 X[135.44141*#<scale>] Y[7.08984*#<scale>]\nG2 X[134.00514*#<scale>] Y[4.23114*#<scale>] I[-11.87256*#<scale>] J[4.17484*#<scale>]\nG2 X[131.79102*#<scale>] Y[1.92188*#<scale>] I[-7.88363*#<scale>] J[5.34275*#<scale>]\nG2 X[129.08508*#<scale>] Y[0.56922*#<scale>] I[-5.3138*#<scale>] J[7.24715*#<scale>]\nG2 X[126.08984*#<scale>] Y[0.14453*#<scale>] I[-2.92298*#<scale>] J[9.84046*#<scale>]\nG2 X[122.9755*#<scale>] Y[0.63758*#<scale>] I[-0.13266*#<scale>] J[9.24446*#<scale>]\nG2 X[120.33398*#<scale>] Y[2.35938*#<scale>] I[2.19287*#<scale>] J[6.25138*#<scale>]\nG2 X[118.69393*#<scale>] Y[5.37699*#<scale>] I[5.36449*#<scale>] J[4.87005*#<scale>]\nG2 X[118.27432*#<scale>] Y[8.23889*#<scale>] I[12.16539*#<scale>] J[3.2454*#<scale>]\nG0 Z3.0\nM5\nM2\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/halshow.preferences",
    "content": "# Halshow settings\n# This file is generated automatically.\nwm geometry . 527x383+471+28\nplaceFrames 0\nset ::ratio 0\nset ::old_w_leftf 206\nset ::watchlist {\n    pin+remora.input.01\n    pin+remora.input.00\n    pin+remora.input.02\n    pin+remora.input.03\n    pin+remora.input.04\n    pin+remora.input.06\n    pin+joint.0.homed\n    pin+joint.0.home-sw-in\n    pin+joint.1.home-sw-in\n    pin+remora.joint.0.deadband\n    pin+remora.joint.0.enable\n    pin+remora.joint.0.pgain\n    pin+remora.joint.0.pos-cmd\n    pin+remora.joint.0.pos-fb\n    pin+remora.joint.1.deadband\n    pin+remora.joint.1.counts\n    pin+remora.joint.0.counts\n    pin+remora.joint.1.pos-cmd\n    pin+remora.joint.1.pos-fb\n}\nset ::workmode watchhal\nset ::watchInterval 100\nset ::col1_width 100\nset ::ffmts \nset ::ifmts \nset ::alwaysOnTop 0\nset ::autoSaveWatchlist 1\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/linuxcnc.var",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t0.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t9.775132\n5222\t8.727670\n5223\t10.152000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/linuxcnc.var.bak",
    "content": "5161\t0.000000\n5162\t0.000000\n5163\t0.000000\n5164\t0.000000\n5165\t0.000000\n5166\t0.000000\n5167\t0.000000\n5168\t0.000000\n5169\t0.000000\n5181\t0.000000\n5182\t0.000000\n5183\t0.000000\n5184\t0.000000\n5185\t0.000000\n5186\t0.000000\n5187\t0.000000\n5188\t0.000000\n5189\t0.000000\n5210\t0.000000\n5211\t0.000000\n5212\t0.000000\n5213\t0.000000\n5214\t0.000000\n5215\t0.000000\n5216\t0.000000\n5217\t0.000000\n5218\t0.000000\n5219\t0.000000\n5220\t1.000000\n5221\t9.775132\n5222\t8.727670\n5223\t10.152000\n5224\t0.000000\n5225\t0.000000\n5226\t0.000000\n5227\t0.000000\n5228\t0.000000\n5229\t0.000000\n5230\t0.000000\n5241\t0.000000\n5242\t0.000000\n5243\t0.000000\n5244\t0.000000\n5245\t0.000000\n5246\t0.000000\n5247\t0.000000\n5248\t0.000000\n5249\t0.000000\n5250\t0.000000\n5261\t0.000000\n5262\t0.000000\n5263\t0.000000\n5264\t0.000000\n5265\t0.000000\n5266\t0.000000\n5267\t0.000000\n5268\t0.000000\n5269\t0.000000\n5270\t0.000000\n5281\t0.000000\n5282\t0.000000\n5283\t0.000000\n5284\t0.000000\n5285\t0.000000\n5286\t0.000000\n5287\t0.000000\n5288\t0.000000\n5289\t0.000000\n5290\t0.000000\n5301\t0.000000\n5302\t0.000000\n5303\t0.000000\n5304\t0.000000\n5305\t0.000000\n5306\t0.000000\n5307\t0.000000\n5308\t0.000000\n5309\t0.000000\n5310\t0.000000\n5321\t0.000000\n5322\t0.000000\n5323\t0.000000\n5324\t0.000000\n5325\t0.000000\n5326\t0.000000\n5327\t0.000000\n5328\t0.000000\n5329\t0.000000\n5330\t0.000000\n5341\t0.000000\n5342\t0.000000\n5343\t0.000000\n5344\t0.000000\n5345\t0.000000\n5346\t0.000000\n5347\t0.000000\n5348\t0.000000\n5349\t0.000000\n5350\t0.000000\n5361\t0.000000\n5362\t0.000000\n5363\t0.000000\n5364\t0.000000\n5365\t0.000000\n5366\t0.000000\n5367\t0.000000\n5368\t0.000000\n5369\t0.000000\n5370\t0.000000\n5381\t0.000000\n5382\t0.000000\n5383\t0.000000\n5384\t0.000000\n5385\t0.000000\n5386\t0.000000\n5387\t0.000000\n5388\t0.000000\n5389\t0.000000\n5390\t0.000000\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/remora-xyz.hal",
    "content": "\n# load the realtime components\n\n\tloadrt [KINS]KINEMATICS\n\tloadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n\tloadrt remora-spi\n\n\n# estop loopback, SPI comms enable and feedback\n\tnet user-enable-out \t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remora-status \t<= remora.SPI-status \t\t\t=> iocontrol.0.emc-enable-in\n\t\n\n# add the remora and motion functions to threads\n\n\taddf remora.read servo-thread\n\taddf motion-command-handler servo-thread\n\taddf motion-controller servo-thread\n\taddf remora.update-freq servo-thread\n\taddf remora.write servo-thread\n\n\n# Joint 0 setup\n\n\tsetp remora.joint.0.scale \t\t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\n\tnet xpos-cmd \t\t<= joint.0.motor-pos-cmd \t=> remora.joint.0.pos-cmd  \n\tnet j0pos-fb \t\t<= remora.joint.0.pos-fb \t=> joint.0.motor-pos-fb\n\tnet j0enable \t\t<= joint.0.amp-enable-out \t=> remora.joint.0.enable\n\n\n# Joint 1 setup\n\n\tsetp remora.joint.1.scale \t\t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1pos-cmd \t\t<= joint.1.motor-pos-cmd \t=> remora.joint.1.pos-cmd\n\tnet j1pos-fb \t\t<= remora.joint.1.pos-fb \t=> joint.1.motor-pos-fb \n\tnet j1enable \t\t<= joint.1.amp-enable-out \t=> remora.joint.1.enable\n\n# Joint 2 setup\n\n\tsetp remora.joint.2.scale \t\t[JOINT_2]SCALE\n\tsetp remora.joint.2.maxaccel \t[JOINT_2]STEPGEN_MAXACCEL\n\n\tnet j2pos-cmd \t\t<= joint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\n\tnet j2pos-fb \t\t<= remora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\n\tnet j2enable \t\t<= joint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n\n# end-stops\n\n\tnet X-home \tremora.input.00 \t=> joint.0.home-sw-in \n\n\tnet Y-home \tremora.input.01 \t=> joint.1.home-sw-in \n\n\n\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/remora-xyz.ini",
    "content": "# Basic LinuxCNC config for testing of Remora firmware\n\n[EMC]\nMACHINE = Remora-XY\nDEBUG = 5\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\n\nUSER_COMMAND_FILE = usercommand_regularmac_800.py\n\n\nEDITOR = gedit\nPOSITION_OFFSET = RELATIVE\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\nGRIDS = 10mm 20mm 50mm 100mm\nMAX_FEED_OVERRIDE = 1.2\n#MIN_SPINDLE_OVERRIDE = 0.5\n#MAX_SPINDLE_OVERRIDE = 1.2\nDEFAULT_LINEAR_VELOCITY = 5.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 10.00\nDEFAULT_ANGULAR_VELOCITY = 36.00\nMIN_ANGULAR_VELOCITY = 0\nMAX_ANGULAR_VELOCITY = 45.00\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\n\n[KINS]\nJOINTS = 3\n#KINEMATICS =trivkins coordinates=XYZ kinstype=BOTH\nKINEMATICS =trivkins coordinates=XYZ\n\n[FILTER]\nPROGRAM_EXTENSION = .py Python Script\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\nSERVO_PERIOD = 1000000\n\n[HAL]\nHALFILE = remora-xyz.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n\n[TRAJ]\nCOORDINATES =  X Y Z\nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nDEFAULT_LINEAR_VELOCITY = 50.00\nMAX_LINEAR_VELOCITY = 200.00\nNO_FORCE_HOMING = 1 \n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n[AXIS_X]\nMAX_VELOCITY = 250\nMAX_ACCELERATION = 20.0\nMIN_LIMIT = 0.0\nMAX_LIMIT = 25.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 27.5\nMIN_LIMIT = 0.0\nMAX_LIMIT = 28.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 20.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 800\nFERROR = 2\nMIN_FERROR = 2.0\nHOME_OFFSET = 27.5\nHOME_SEARCH_VEL = 2.0\nHOME_LATCH_VEL = 2.0\nHOME_SEQUENCE = 0\n\n[AXIS_Y]\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 20.0\nMIN_LIMIT = 0.0\nMAX_LIMIT = 26.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 25.5\nMIN_LIMIT = 0.0\nMAX_LIMIT = 26.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 20.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 800.0\nFERROR = 9.0\nMIN_FERROR = 5.0\nHOME_OFFSET = 25.5\nHOME_SEARCH_VEL = 2.0\nHOME_LATCH_VEL = 2.0\nHOME_SEQUENCE = 1\n\n\n\n\n[AXIS_Z]\nOFFSET_AV_RATIO = 0.2\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 20.0\nMIN_LIMIT = 0\nMAX_LIMIT = 28\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = 0\nMAX_LIMIT = 28\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 20.0\nSTEPGEN_MAXACCEL = 300.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/tool.tbl",
    "content": "T1 P1 D0.125000 Z+0.511000 ;1/8 end mill\nT2 P2 D0.062500 Z+0.100000 ;1/16 end mill\nT3 P3 D0.201000 Z+1.273000 ;#7 tap drill\nT99999 P99999 Z+0.100000 ;big tool number\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-octopus/usercommand_regularmac_800.py",
    "content": "import linuxcnc\ns = linuxcnc.stat()\ns.poll()\nrC = root_window.tk.call\nrE = root_window.tk.eval\n\n############################################\n########     COPY LOTS FROM # PLASMAC2     #########\n##############################################\n\nspinBoxes = []\ntoolButtons  = ['machine_estop','machine_power','file_open','reload','program_run',\n                'program_step','program_pause','program_stop','program_blockdelete',\n                'program_optpause','view_zoomin','view_zoomout','view_z','view_z2',\n                'view_x','view_y','view_y2','view_p','rotate','clear_plot']\n\nconfigPath = os.getcwd()\n#configPath = \" \" \n##############################################################################\n# NEW CLASSES                                                                #\n##############################################################################\n# class for preferences file\nprefP = configparser.ConfigParser\nclass plasmacPreferences(prefP):   # PLASMAC2\n    optionxform = str\n    types = {bool: prefP.getboolean,\n             float: prefP.getfloat,\n             int: prefP.getint,\n             str: prefP.get,\n             repr: lambda self, section, option: eval(prefP.get(self, section, option)),\n            }\n\n    def __init__(self):\n        prefP.__init__(self, strict=False, interpolation=None)\n        self.fn = os.path.join(configPath, '{}.prefs'.format(vars.machine.get()))\n        self.read(self.fn)\n  \n##############################################################################\n# PREFERENCE FUNCTIONS                                                       #\n##############################################################################\ndef getPrefs(prefs, section, option, default=False, type=bool):                 # PLASMAC2\n    m = prefs.types.get(type)\n    if prefs.has_section(section):\n        if prefs.has_option(section, option):\n            return m(prefs, section, option)\n        else:\n            prefs.set(section, option, str(default))\n            prefs.write(open(prefs.fn, 'w'))\n            return default\n    else:\n        prefs.add_section(section)\n        prefs.set(section, option, str(default))\n        prefs.write(open(prefs.fn, 'w'))\n        return default\n\ndef putPrefs(prefs, section, option, value, type=bool):                 # PLASMAC2\n    if prefs.has_section(section):\n        prefs.set(section, option, str(type(value)))\n        prefs.write(open(prefs.fn, 'w'))\n    else:\n        prefs.add_section(section)\n        prefs.set(section.upper(), option, str(type(value)))\n        prefs.write(open(prefs.fn, 'w'))\n\ndef removePrefsSect(prefs, section):            # PLASMAC2\n    prefs.remove_section(section)\n    prefs.write(open(prefs.fn, 'w'))\n\ndef sortPrefs(prefs):           # PLASMAC2\n    prefs._sections = OrderedDict(sorted(prefs._sections.items(), key=lambda t: int(t[0].rsplit('_',1)[1]) ))\n    prefs.write(open(prefs.fn, 'w'))\nPREF = plasmacPreferences()\n\n\n# class for popup dialogs           # PLASMAC2\nclass plasmacDialog:                \n    def __init__(self, func, title, msg, system=None):\n        dlg = self.dlg = Tkinter.Toplevel(root_window, bg=colorBack)\n        dlg.attributes('-type', 'dock')\n        rE('tk::PlaceWindow {} center'.format(dlg))\n        dlg.wait_visibility()\n        dlg.grab_set()\n        dlg.protocol(\"WM_DELETE_WINDOW\", lambda:self.dlg_complete(False, False))\n        dlg.title(title)\n        frm = Tkinter.Frame(dlg, bg=colorBack, bd=2, relief='flat')\n        ttl = Tkinter.Label(frm, text=title, fg=colorBack, bg=colorFore)\n        ttl.pack(fill='x')\n        if func == 'rfl':\n            self.leadIn = Tkinter.BooleanVar()\n            self.leadLength = Tkinter.StringVar()\n            self.leadAngle = Tkinter.StringVar()\n            f1 = Tkinter.Frame(frm, bg=colorBack)\n            lbl1 = Tkinter.Label(f1, text=_('Use Leadin:'), fg=colorFore, bg=colorBack, width=12, anchor='e')\n            lbl1.pack(side='left')\n            leadinDo = Tkinter.Checkbutton(f1, fg=colorFore, bg=colorBack, variable=self.leadIn, indicatoron=False, width=2, bd=1)\n            leadinDo.configure(highlightthickness=0, activebackground=colorBack, selectcolor=colorActive, relief='raised', overrelief='raised')\n            leadinDo.pack(side='left')\n            f1.pack(padx=4, pady=4, anchor='w')\n            f2 = Tkinter.Frame(frm, bg=colorBack)\n            lbl2 = Tkinter.Label(f2, text=_('Leadin Length:'), fg=colorFore, bg=colorBack, width=12, anchor='e')\n            lbl2.pack(side='left')\n            leadinLength = Tkinter.Spinbox(f2, fg=colorFore, bg=colorBack, textvariable=self.leadLength, width=10)\n            leadinLength.configure(font=(fontName, fontSize), highlightthickness=0)\n            leadinLength.pack(side='left')\n            f2.pack(padx=4, pady=4, anchor='w')\n            f3 = Tkinter.Frame(frm, bg=colorBack)\n            lbl3 = Tkinter.Label(f3, text=_('Leadin Angle:'), fg=colorFore, bg=colorBack, width=12, anchor='e')\n            lbl3.pack(side='left')\n            leadinAngle = Tkinter.Spinbox(f3, fg=colorFore, bg=colorBack, textvariable=self.leadAngle, width=10)\n            leadinAngle.configure(font=(fontName, fontSize), highlightthickness=0)\n            leadinAngle.pack(side='left')\n            f3.pack(padx=4, pady=4, anchor='w')\n            self.leadIn.set(False)\n            if s.linear_units == 1:\n                leadinLength.config(width=10, from_=1, to=25, increment=1, format='%0.0f', wrap=1)\n                self.leadLength.set(5)\n            else:\n                leadinLength.config(width=10, from_=0.05, to=1, increment=0.05, format='%0.2f', wrap=1)\n                self.leadLength.set(0.2)\n            leadinAngle.config(width=10, from_=-359, to=359, increment=1, format='%0.0f', wrap=1)\n            self.leadAngle.set(0)\n        else:\n            label = Tkinter.Label(frm, text=msg, fg=colorFore, bg=colorBack)\n            label.pack(padx=4, pady=4)\n        if func in ['entry', 'touch']:\n            self.entry = Tkinter.Entry(frm, justify='right', fg=colorFore, bg=colorBack)\n            self.entry.configure(highlightthickness=0, selectforeground=colorBack, selectbackground=colorFore)\n            self.entry.pack(padx=4, pady=4)\n            self.entry.focus_set()\n        if func == 'touch':\n            self.entry.insert('end', '0.0')\n            opl = Tkinter.Label(frm, text=_('Coordinate System'), fg=colorFore, bg=colorBack)\n            opl.pack(padx=4, pady=4)\n            self.c = c = StringVar(t)\n            c.set(system)\n            self.opt = Tkinter.OptionMenu(frm, c, *all_systems[:])\n            self.opt.configure(fg=colorFore, bg=colorBack, activebackground=colorBack, highlightthickness=0)\n            self.opt.children['menu'].configure(fg=colorFore, bg=colorBack, activeforeground=colorBack, activebackground=colorFore)\n            self.opt.pack(padx=4, pady=4)\n        bbox = Tkinter.Frame(frm, bg=colorBack)\n        if func == 'rfl':\n            b1Text = _('Load')\n            b2Text = _('Cancel')\n        if func in ['info', 'error', 'warn']:\n            b1Text = _('OK')\n            b2Text = None\n        elif func in ['yesno']:\n            b1Text = _('Yes')\n            b2Text = _('No')\n        elif func in ['entry', 'touch']:\n            b1Text = _('OK')\n            b2Text = _('Cancel')\n        b1 = Tkinter.Button(bbox, text=b1Text, command=lambda:self.dlg_complete(True, func), width=8)\n        b1.configure(fg=colorFore, bg=colorBack, activebackground=colorBack, highlightthickness=0)\n        b1.pack(side='left')\n        if b2Text:\n            b2 = Tkinter.Button(bbox, text=b2Text, command=lambda:self.dlg_complete(False, func), width=8)\n            b2.configure(fg=colorFore, bg=colorBack, activebackground=colorBack, highlightthickness=0)\n            b2.pack(side='left', padx=(8,0))\n        bbox.pack(padx=4, pady=4)\n        frm.pack()\n\n    def dlg_complete(self, value, func):\n        if func == 'rfl':\n            self.reply = value, self.leadIn.get(), float(self.leadLength.get()), float(self.leadAngle.get())\n        elif func in ['entry']:\n#            text = None if not self.entry.get() else self.entry.get()\n            self.reply = value, self.entry.get()\n        elif func in ['touch']:\n#            text = None if not self.entry.get() else self.entry.get()\n            self.reply = value, self.entry.get(), self.c.get()\n        else:\n            self.reply = value\n        self.dlg.destroy()\n\n\n##################################\n#######   GCODE PRE     ###################\n########################################\n\ndef auto_tab_raise():\n    #pVars.editmode.set(True)\n    #print(pVars.editmode.get())\n    keybind_edit()\n    #edit_full()\n    #load_editfile()\n    #rC(\".toolbar.program_run\",\"configure\",\"-state\",\"normal\")\n    #rC(\".toolbar.program_step\",\"configure\",\"-state\",\"normal\")\n    #rC('.menu','entryconfig','Setup','-state','disabled')\n    root_window.unbind('<Down>')\n    root_window.unbind('<Up>')\n    root_window.unbind('<KP_Down>')\n    root_window.unbind('<KP_Up>')\n    root_window.bind('<Down>', select_next_line)\n    root_window.bind('<Up>', select_prev_line)\n\n\ndef auto_tab_lower():\n    #save_editfile()\n    root_window.unbind('<Down>')\n    root_window.unbind('<Up>')\n    keybind_edit_restore()\n    bind_axis('Down', 'Up', 1)\n    bind_axis(\"KP_Down\", \"KP_Up\", 1)\n    #pVars.editsize.set(False)\n    #edit_lower()\n    #pVars.editmode.set(False)\n    #print(pVars.editmode.get())\n    #rC(\".toolbar.program_run\",\"configure\",\"-state\",\"disabled\")\n    #rC(\".toolbar.program_step\",\"configure\",\"-state\",\"disabled\")\n    #rC('.menu','entryconfig','Setup','-state','normal')\n\ndef tab_auto():\n    if s.task_mode == 2:\n      #rC('.pane.top.tabs','itemconfigure','manual','-state','disabled')\n      #rC('.pane.top.tabs','itemconfigure','mdi','-state','disabled')\n      rC('.pane.top.tabs','itemconfigure','edit','-state','disabled')\n      #rC('.pane.top.tabs','itemconfigure','edit')\n      #rC('.menu','entryconfig','Setup','-state','disabled')\n      rC('.pane.top.tabs','raise','auto')\n    else:\n      #rC('.pane.top.tabs','itemconfigure','manual','-state','normal')\n      #rC('.pane.top.tabs','itemconfigure','mdi','-state','normal')\n      rC('.pane.top.tabs','itemconfigure','edit','-state','normal')\n      #rC('.menu','entryconfig','Setup','-state','normal')\n\n############################################\n#######      MOVE THE GCODE   ##############\n############################################\n\n# remove bottom pane\nrC('.pane','forget','.pane.bottom')\n# new auto tab with gcode text\nrC('.pane.top.tabs','insert','end','auto','-text',' Auto ','-raisecmd','auto_tab_raise','-leavecmd','auto_tab_lower')\nrC('.pane.top.tabs.fauto','configure','-borderwidth',2)\nrC('frame','.pane.top.tabs.fauto.t','-borderwidth',2,'-relief','sunken','-highlightthickness','1')\nrC('text','.pane.top.tabs.fauto.t.text','-borderwidth','0','-exportselection','0','-highlightthickness','0','-relief','flat','-takefocus','0','-undo','0','-height','30','-wrap','word')\nrC('bind','.pane.top.tabs.fauto.t.text','<Configure>','goto_sensible_line')\nrC('scrollbar','.pane.top.tabs.fauto.t.sb','-width',25,'-borderwidth','0','-highlightthickness','0')\nrC('.pane.top.tabs.fauto.t.text','configure','-state','normal','-yscrollcommand',['.pane.top.tabs.fauto.t.sb','set'])\nrC('.pane.top.tabs.fauto.t.sb','configure','-command',['.pane.top.tabs.fauto.t.text','yview'])\nrC('pack','.pane.top.tabs.fauto.t.sb','-fill','y','-side','left')\nrC('pack','.pane.top.tabs.fauto.t.text','-expand','1','-fill','both','-side','top')\nrC('pack','.pane.top.tabs.fauto.t','-fill','both')\n\n# create a new widget list so we can \"move\" the gcode text\nwidget_list_new = []\nfor widget in widget_list:\n    if '.t.text' in widget[2]:\n        widget = ('text', Text, '.pane.top.tabs.fauto.t.text')\n    widget_list_new.append(widget)\n    widget_list_new.append(('edit', Text, '.pane.top.tabs.fedit.t.text'))\n    widget_list_new.append(('buttonFrame', Frame, '.fbuttons'))\nwidgets = nf.Widgets(root_window,*widget_list_new)\n\n# copied from axis.py (line 3857) to assign the \"new\" widgets.text to t\nt = widgets.text\nt.bind('<Button-3>', rClicker)\nt.tag_configure(\"ignored\", background=\"#ffffff\", foreground=\"#808080\")\nt.tag_configure(\"lineno\", foreground=\"#808080\")\nt.tag_configure(\"executing\", background=\"#804040\", foreground=\"#ffffff\")\nt.bind(\"<Button-1>\", select_line)\nt.bind(\"<Double-Button-1>\", release_select_line)\nt.bind(\"<B1-Motion>\", lambda e: \"break\")\nt.bind(\"<B1-Leave>\", lambda e: \"break\")\nt.bind(\"<Button-4>\", scroll_up)\nt.bind(\"<Button-5>\", scroll_down)\nt.configure(state=\"disabled\")\n######################################\n##########   Addition to GCODE #######\n######################################\nrC('labelframe','.pane.top.tabs.fauto.program')\nrC('pack','.pane.top.tabs.fauto.program','-before','.pane.top.tabs.fauto.t','-fill','x')\nrC('label','.pane.top.tabs.fauto.program.name','-text','file','-justify','left','-padx',16,'-anchor','ne')\nrC('label','.pane.top.tabs.fauto.program.time','-textvariable','runJ','-justify','right','-padx',16)\nrC('checkbutton','.pane.top.tabs.fauto.program.size','-text',' AUTO ','-command','edit_size','-variable','editsize')\nrC('pack','.pane.top.tabs.fauto.program.size','-side','left')\nrC('pack','.pane.top.tabs.fauto.program.name','-side','left')\nrC('pack','.pane.top.tabs.fauto.program.time','-side','right')\n\n######################################\n#######  end Addition to GCODE #######\n######################################\n\n############################################\n#######  MOVE THE GCODE/new key binds ######\n############################################\ndef select_next_line(self):\n    if o.highlight_line is None:\n        i = 1\n    else:\n        i = max(o.last_line, o.highlight_line + 1)\n    o.set_highlight_line(i)\n    o.tkRedraw()\n##############################################\n#####   and do select_prev also #############\n########################################\ndef select_prev_line(self):\n    if o.highlight_line is None:\n        i = o.last_line\n    else:\n        i = max(1, o.highlight_line - 1)\n    o.set_highlight_line(i)\n    o.tkRedraw()\n\n############################################\n############################################\n#######  end MOVE THE GCODE   ##############\n############################################\n\n#########\n#########################################################################\n#######   EDIT TAB   ######\n#########\n##################################\n\nedittext = ('.pane.top.tabs.fedit.t.text')\n\ndef edit_size():\n    rC('grid','propagate','.pane.top.tabs',0)\n\n    if pVars.editsize.get()==True:\n        rC('grid','remove','.pane.top.right')\n        if pVars.winSize.get() == 'medium':\n            rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',2,'-rowspan',1)\n        else:\n            rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',2)\n            #rC('grid','columnconfigure',ftop,0,'-weight',0,'-minsize',tabSizeW)\n    else:\n        if pVars.winSize.get() == 'medium':\n            rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',1,'-rowspan',15)\n        else:\n            rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',1)\n        rC('grid','.pane.top.right','-sticky','nesw','-columnspan',1)\n\ndef edit_full():\n    rC('grid','remove','.pane.top.right')\n    rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',2)\n\ndef edit_lower():\n    rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',1)\n    rC('grid','.pane.top.right','-sticky','nesw','-columnspan',1)\n\ndef keybind_edit():\n    ### UNBIND\n    root_window.unbind(\"l\")#, commands.toggle_override_limits)\n    root_window.unbind(\"o\")#, commands.open_file)\n    root_window.unbind(\"s\")#, commands.task_resume)\n    root_window.unbind(\"t\")#, commands.task_step)\n    root_window.unbind(\"p\")#, commands.task_pause)\n    root_window.unbind(\"R\")#, commands.task_reverse)\n    root_window.unbind(\"F\")#, commands.task_forward)\n    root_window.unbind(\"v\")#, commands.cycle_view)\n    root_window.unbind(\"r\")#, commands.task_run)\n    root_window.unbind(\"B\")#, commands.brake_on)\n    root_window.unbind(\"b\")#, commands.brake_off)\n    root_window.unbind(\"x\")#, lambda event: activate_ja_widget(\"x\"))\n    root_window.unbind(\"y\")#, lambda event: activate_ja_widget(\"y\"))\n    root_window.unbind(\"z\")#, lambda event: activate_ja_widget(\"z\"))\n    root_window.unbind(\"a\")#, lambda event: activate_ja_widget(\"a\"))\n    root_window.unbind(\"c\")#, lambda event: jogspeed_continuous())\n    root_window.unbind(\"d\")#, lambda event: widgets.rotate.invoke())\n    root_window.unbind(\"i\")#, lambda event: jogspeed_incremental())\n    root_window.unbind(\"I\")#, lambda event: jogspeed_incremental(-1))\n    root_window.unbind(\"`\")#, lambda event: activate_ja_widget_or_set_feedrate(0))\n    root_window.unbind(\"1\")#, lambda event: activate_ja_widget_or_set_feedrate(1))\n    root_window.unbind(\"2\")#, lambda event: activate_ja_widget_or_set_feedrate(2))\n    root_window.unbind(\"3\")#, lambda event: activate_ja_widget_or_set_feedrate(3))\n    root_window.unbind(\"4\")#, lambda event: activate_ja_widget_or_set_feedrate(4))\n    root_window.unbind(\"5\")#, lambda event: activate_ja_widget_or_set_feedrate(5))\n    root_window.unbind(\"6\")#, lambda event: activate_ja_widget_or_set_feedrate(6))\n    root_window.unbind(\"7\")#, lambda event: activate_ja_widget_or_set_feedrate(7))\n    root_window.unbind(\"8\")#, lambda event: activate_ja_widget_or_set_feedrate(8))\n    root_window.unbind(\"9\")#, lambda event: activate_ja_widget_or_set_feedrate(9))\n    root_window.unbind(\"0\")#, lambda event: activate_ja_widget_or_set_feedrate(10))\n    root_window.unbind(\"!\")#, \"set metric [expr {!$metric}]; redraw\")\n    root_window.unbind(\"@\")#, commands.toggle_display_type)\n    root_window.unbind(\"#\")#, commands.toggle_coord_type)\n    root_window.unbind(\"$\")#, commands.toggle_teleop_mode)\n    root_window.unbind(\"<Home>\")#, commands.home_joint)\n    root_window.unbind(\"<End>\")#, commands.touch_off_system)\n    root_window.unbind(\".\")#, commands.toggle_coord_type)\n    root_window.unbind(\",\")#, commands.toggle_teleop_mode)\n    root_window.unbind(\";\")#, commands.toggle_coord_type)\n    root_window.unbind(\"'\")#, commands.toggle_teleop_mode)\n        \ndef keybind_edit_restore():\n    ########bind\n    root_window.bind(\"l\", commands.toggle_override_limits)\n    root_window.bind(\"o\", commands.open_file)\n    root_window.bind(\"s\", commands.task_resume)\n    root_window.bind(\"t\", commands.task_step)\n    root_window.bind(\"p\", commands.task_pause)\n    root_window.bind(\"R\", commands.task_reverse)\n    root_window.bind(\"F\", commands.task_forward)\n    root_window.bind(\"v\", commands.cycle_view)\n    root_window.bind(\"r\", commands.task_run)\n    root_window.bind(\"B\", commands.brake_on)\n    root_window.bind(\"b\", commands.brake_off)\n    root_window.bind(\"x\", lambda event: activate_ja_widget(\"x\"))\n    root_window.bind(\"y\", lambda event: activate_ja_widget(\"y\"))\n    root_window.bind(\"z\", lambda event: activate_ja_widget(\"z\"))\n    root_window.bind(\"a\", lambda event: activate_ja_widget(\"a\"))\n    root_window.bind(\"c\", lambda event: jogspeed_continuous())\n    root_window.bind(\"d\", lambda event: widgets.rotate.invoke())\n    root_window.bind(\"i\", lambda event: jogspeed_incremental())\n    root_window.bind(\"I\", lambda event: jogspeed_incremental(-1))\n    root_window.bind(\"`\", lambda event: activate_ja_widget_or_set_feedrate(0))\n    root_window.bind(\"1\", lambda event: activate_ja_widget_or_set_feedrate(1))\n    root_window.bind(\"2\", lambda event: activate_ja_widget_or_set_feedrate(2))\n    root_window.bind(\"3\", lambda event: activate_ja_widget_or_set_feedrate(3))\n    root_window.bind(\"4\", lambda event: activate_ja_widget_or_set_feedrate(4))\n    root_window.bind(\"5\", lambda event: activate_ja_widget_or_set_feedrate(5))\n    root_window.bind(\"6\", lambda event: activate_ja_widget_or_set_feedrate(6))\n    root_window.bind(\"7\", lambda event: activate_ja_widget_or_set_feedrate(7))\n    root_window.bind(\"8\", lambda event: activate_ja_widget_or_set_feedrate(8))\n    root_window.bind(\"9\", lambda event: activate_ja_widget_or_set_feedrate(9))\n    root_window.bind(\"0\", lambda event: activate_ja_widget_or_set_feedrate(10))\n    root_window.bind(\"!\", \"set metric [expr {!$metric}]; redraw\")\n    root_window.bind(\"@\", commands.toggle_display_type)\n    root_window.bind(\"#\", commands.toggle_coord_type)\n    root_window.bind(\"$\", commands.toggle_teleop_mode)\n    root_window.bind(\"<Home>\", commands.home_joint)\n    root_window.bind(\"<End>\", commands.touch_off_system)\n    #root_window.bind('<1>', select_next_line)\n    #root_window.bind('<2>', select_prev_line)\n\ndef load_editfile():\n    print (s.file)\n    open_filea = open(s.file,'r')\n    rC('.pane.top.tabs.fedit.t.text','delete','1.0','end')\n    rC('.pane.top.tabs.fedit.t.text','insert','end',open_filea.read())\n    pVars.editfile.set(s.file)\n    #print(pVars.editfile.get())\n    rC('.pane.top.tabs.fedit.t.text','edit','reset')\n\ndef save_editfile():\n    print (s.file)\n    open_filea = open(s.file,'w')\n    edit_gcode = rC('.pane.top.tabs.fedit.t.text','get','1.0','end-1c')\n    open_filea.write(edit_gcode)\n    reload_file()  \n    \n    return 1\n\ndef edit_tab_raise():\n    pVars.editmode.set(True)\n    #print(pVars.editmode.get())\n    keybind_edit()\n    #edit_full()\n    load_editfile()\n    rC(\".toolbar.program_run\",\"configure\",\"-state\",\"disabled\")\n    rC(\".toolbar.program_step\",\"configure\",\"-state\",\"disabled\")\n    \ndef edit_tab_lower():\n    save_editfile()\n    keybind_edit_restore()\n    pVars.editsize.set(False)\n    edit_lower()\n    pVars.editmode.set(False)\n    #print(pVars.editmode.get())\n    rC(\".toolbar.program_run\",\"configure\",\"-state\",\"normal\")\n    rC(\".toolbar.program_step\",\"configure\",\"-state\",\"normal\")\n\ndef print_file():\n    print ('breakin')\n    rC('.pane.top.tabs.fedit.t.text','insert','insert', '%K')\n    return \"break\"\n\n# new edit tab with gcode text\nrC('.pane.top.tabs','insert','end','edit','-text',' edit ','-raisecmd','edit_tab_raise','-leavecmd','edit_tab_lower')\nrC('.pane.top.tabs.fedit','configure','-borderwidth',2)\nrC('frame','.pane.top.tabs.fedit.t','-borderwidth',2,'-relief','sunken','-highlightthickness','1')\nrC('text','.pane.top.tabs.fedit.t.text','-borderwidth','0','-relief','flat','-takefocus','1','-undo','1','-height','30','-wrap','word')\n\n#rC('bind','.pane.top.tabs.fedit.t.text','<Configure>','goto_sensible_line')\nrC('scrollbar','.pane.top.tabs.fedit.t.sb','-width',25,'-borderwidth','0','-highlightthickness','0')\nrC('.pane.top.tabs.fedit.t.text','configure','-yscrollcommand',['.pane.top.tabs.fedit.t.sb','set'])\nrC('.pane.top.tabs.fedit.t.sb','configure','-command',['.pane.top.tabs.fedit.t.text','yview'])\nrC('pack','.pane.top.tabs.fedit.t.sb','-fill','y','-side','left')\nrC('pack','.pane.top.tabs.fedit.t.text','-expand','1','-fill','both','-side','right')\nrC('pack','.pane.top.tabs.fedit.t','-fill','both')\n\nrC('button','.pane.top.tabs.fedit.edit','-text','edit','-command','load_editfile')\nrC('button','.pane.top.tabs.fedit.save','-text','save','-command','save_editfile')\n#rC('pack','.pane.top.tabs.fedit.edit','-side','left')\n#rC('pack','.pane.top.tabs.fedit.save','-side','left')\n######################################\n##########   Addition to EDIT #######\n######################################\nrC('labelframe','.pane.top.tabs.fedit.program')\nrC('pack','.pane.top.tabs.fedit.program','-before','.pane.top.tabs.fedit.t','-fill','x')\nrC('label','.pane.top.tabs.fedit.program.name','-text','file','-justify','left','-padx',16)\nrC('checkbutton','.pane.top.tabs.fedit.program.size','-text',' EDIT ','-command','edit_size','-variable','editsize')\nrC('pack','.pane.top.tabs.fedit.program.size','-side','left')\nrC('pack','.pane.top.tabs.fedit.program.name','-side','left')\n######################################\n#######  end Addition to EDIT #######\n######################################\n\n#########\n##################################\n#######   end EDIT TAB   ######\n#########\n##################################\n\n\n##### probe   #@######\n\n\n\n# new probe tab in top.tabs\nrC('.pane.top.tabs','insert','end','probe','-text',' PROBE ')\nrC('.pane.top.tabs.fprobe','configure','-borderwidth',2)\n\n# pagesmanager for probe pages\nrC('PagesManager','.pane.top.tabs.fprobe.pages')\nfor probepage in ['bore','boss','web','slot','edge','z','setting']:\n    rC('.pane.top.tabs.fprobe.pages','add',probepage)\n\n\n\n# buttons to control pages\nrC('frame','.pane.top.tabs.fprobe.buttons')\n# ~ for n in range(0,6):\n    # ~ rC('button','.pane.top.tabs.fprobe.buttons.' + str(n) , '-text','ass' + str(n))\n    # ~ rC('pack','.pane.top.tabs.fprobe.buttons.' + str(n),'-fill','both','-side','left','-expand',1)\n    \nfor probebutt in ['bore','boss','web','slot','edge','z','setting']:\n    #rC('button','.pane.top.tabs.fprobe.buttons.' + probebutt , '-text','ass' + probebutt)\n    rC('button','.pane.top.tabs.fprobe.buttons.' + probebutt , '-text',probebutt)\n    rC('pack','.pane.top.tabs.fprobe.buttons.' + probebutt,'-fill','both','-side','left','-expand',1)\n\n#  setting page\nrC('frame','.pane.top.tabs.fprobe.pages.fsetting.axis','-borderwidth',2,'-relief','sunken','-highlightthickness','1')\n\n\n\nv = StringVar()\nv.set(\"x\")\nrC('radiobutton','.pane.top.tabs.fprobe.pages.fsetting.axis.edgex','-text','+X','-variable',v,'-value','x','-indicatoron','false')\nrC('radiobutton','.pane.top.tabs.fprobe.pages.fsetting.axis.edgenx','-text','-X','-variable',v,'-value','-x','-indicatoron','false')\nrC('radiobutton','.pane.top.tabs.fprobe.pages.fsetting.axis.edgey','-text','+Y','-variable',v,'-value','y','-indicatoron','false')\nrC('radiobutton','.pane.top.tabs.fprobe.pages.fsetting.axis.edgeny','-text','-Y','-variable',v,'-value','-y','-indicatoron','false')\nrC('label','.pane.top.tabs.fprobe.pages.fsetting.axis.edgel','-text','EDGE')\n\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis.edgel','-side','left')\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis.edgeny','-side','right')\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis.edgey','-side','right')\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis.edgenx','-side','right')\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis.edgex','-side','right')\nrC('pack','.pane.top.tabs.fprobe.pages.fsetting.axis','-fill','both')\nrC('pack','.pane.top.tabs.fprobe.buttons','-fill','x','-expand',1,'-side','bottom')\nrC('pack','.pane.top.tabs.fprobe.pages','-fill','both','-side','top')\n\nrC('.pane.top.tabs.fprobe.pages','raise','setting')\n\n###### end probe   #####\n\n\n\n\n\n\n\n\n\n##############################################################################\n# MONKEYPATCHED FUNCTIONS                         # PLASMAC2                #\n##############################################################################\n\n\ndef get_coordinate_font(large):         # PLASMAC2\n    global coordinate_font\n    global coordinate_linespace\n    global coordinate_charwidth\n    global fontbase\n    #coordinate_font = 'monospace {}'.format(fontSize)\n    coordinate_font = ngcFont\n    if coordinate_font not in font_cache:\n        font_cache[coordinate_font] = \\\n            glnav.use_pango_font(coordinate_font, 0, 128)\n    fontbase, coordinate_charwidth, coordinate_linespace = \\\n            font_cache[coordinate_font]\n\n\n\n##############################################################################\n# USER BUTTON                                                                #\n##############################################################################\n\ndef set_toggle_pins(pin):           # PLASMAC2\n    pin['state'] = hal.get_value(pin['pin'])\n    if pin['state']:\n        rC('.fbuttons.button' + pin['button'],'configure','-bg',colorActive)\n    else:\n         rC('.fbuttons.button' + pin['button'],'configure','-bg',colorBack)\n        #if pin['runcritical']:\n        #    rC('.fbuttons.button' + pin['button'],'configure','-bg',colorWarn)\n        #else:\n        #    rC('.fbuttons.button' + pin['button'],'configure','-bg',colorBack)\n##############################################################################\n# USER BUTTON FUNCTIONS                                                      #\n##############################################################################\ndef validate_hal_pin(halpin, button, usage):            # PLASMAC2\n    title = _('HAL PIN ERROR')\n    valid = pBit = False\n    for pin in halPinList:\n        if halpin in pin['NAME']:\n            pBit = isinstance(pin['VALUE'], bool)\n            valid = True\n            break\n    if not valid:\n        msg0 = _('does not exist for user button')\n        notifications.add('error', '{}:\\n{} {} #{}'.format(title, halpin, msg0, button))\n    if not pBit:\n        msg0 = _('must be a bit pin for user button')\n        notifications.add('error', '{}:\\n{} {} #{}'.format(title, usage, msg0, button))\n        valid = False\n    return valid\n\ndef validate_ini_param(code, button):           # plasmac\n    title = _('PARAMETER ERROR')\n    valid = [False, None]\n    try:\n        parm = code[code.index('{') + len('') + 1: code.index('}')]\n        value = inifile.find(parm.split()[0], parm.split()[1]) or None\n        if value:\n            valid = [True, code.replace('{{{}}}'.format(parm), value)]\n    except:\n        pass\n    if not valid[0]:\n        msg0 = _('invalid parameter')\n        msg1 = _('for user button')\n        notifications.add('error', '{}:\\n{} {} {} #{}'.format(title, msg0, code, msg1, button))\n    return valid\n\ndef button_action(button, pressed):         # plasmac\n    if int(pressed):\n        user_button_pressed(button, buttonCodes[int(button)])\n    else:\n        user_button_released(button, buttonCodes[int(button)])\n\ndef user_button_setup():        # plasmac\n    global buttonNames, buttonCodes, togglePins, criticalButtons#, fontSize#, pulsePins, machineBounds, criticalButtons\n#    global probeButton, probeText, torchButton, torchText, cChangeButton\n    singleCodes = []#'ohmic-test','cut-type','single-cut','manual-cut','probe-test', \\\n#                   'torch-pulse','change-consumables','framing','latest-file']\n    buttonNames = {0:{'name':None}}\n    buttonCodes = {0:{'code':None}}\n    criticalButtons = []\n    row = 1\n    for n in range(1,20):\n        bLabel = None\n        bName = getPrefs(PREF,'BUTTONS', str(n) + ' Name', '', str)\n        bCode = getPrefs(PREF,'BUTTONS', str(n) + ' Code', '', str)\n        outCode = {'code':None}\n        # if bCode.strip() == 'ohmic-test' and not 'ohmic-test' in [(v['code']) for k, v in buttonCodes.items()]:\n            # outCode['code'] = 'ohmic-test'\n        # elif bCode.strip() == 'cut-type' and not 'cut-type' in buttonCodes:\n            # bName = bName.split(',')\n            # if len(bName) == 1:\n                # text = _('Pierce\\Only') if '\\\\' in bName[0] else _('Pierce Only')\n                # bName.append(text)\n            # outCode = {'code':'cut-type', 'text':bName}\n        # elif bCode.strip() == 'single-cut' and not 'single-cut' in buttonCodes:\n            # outCode['code'] = 'single-cut'\n        # elif bCode.strip() == 'manual-cut' and not 'manual-cut' in buttonCodes:\n            # outCode['code'] = 'manual-cut'\n        # elif bCode.startswith('probe-test') and not 'probe-test' in [(v['code']) for k, v in buttonCodes.items()]:\n            # if bCode.split()[0].strip() == 'probe-test' and len(bCode.split()) < 3:\n                # codes = bCode.strip().split()\n                # outCode = {'code':'probe-test', 'time':10}\n                # probeButton = str(n)\n                # probeText = bName.replace('\\\\', '\\n')\n                # if len(codes) == 2:\n                    # try:\n                        # value = int(float(codes[1]))\n                        # outCode['time'] = value\n                    # except:\n                        # outCode['code'] = None\n        # elif bCode.startswith('torch-pulse') and not 'torch-pulse' in [(v['code']) for k, v in buttonCodes.items()]:\n            # if bCode.split()[0].strip() == 'torch-pulse' and len(bCode.split()) < 3:\n                # codes = bCode.strip().split()\n                # outCode = {'code':'torch-pulse', 'time':1.0}\n                # torchButton = str(n)\n                # torchText = bName.replace('\\\\', '\\n')\n                # if len(codes) == 2:\n                    # try:\n                        # value = round(float(codes[1]), 1)\n                        # outCode['time'] = value\n                    # except:\n                        # outCode['code'] = None\n        # elif bCode.startswith('change-consumables ') and not 'change-consumables' in [(v['code']) for k, v in buttonCodes.items()]:\n            # codes = re.sub(r'([xyf]|[XYF])\\s+', r'\\1', bCode) # remove any spaces after x, y, and f\n            # codes = codes.lower().strip().split()\n            # if len(codes) > 1 and len(codes) < 5:\n                # outCode = {'code':'change-consumables', 'X':None, 'Y':None, 'F':None}\n                # for l in 'xyf':\n                    # for c in range(1, len(codes)):\n                        # if codes[c].startswith(l):\n                            # try:\n                                # value = round(float(codes[c].replace(l,'')), 3)\n                                # outCode['XYF'['xyf'.index(l)]] = value\n                            # except:\n                                # outCode['code'] = None\n                # if (not outCode['X'] and not outCode['Y']) or not outCode['F']:\n                    # outCode['code'] = None\n                # else:\n                    # buff = 10 * hal.get_value('halui.machine.units-per-mm') # keep 10mm away from machine limits\n                    # for axis in 'XY':\n                        # if outCode[axis]:\n                            # if outCode['{}'.format(axis)] < machineBounds['{}-'.format(axis)] + buff:\n                                # outCode['{}'.format(axis)] = machineBounds['{}-'.format(axis)] + buff\n                            # elif outCode['{}'.format(axis)] > machineBounds['{}+'.format(axis)] - buff:\n                                # outCode['{}'.format(axis)] = machineBounds['{}+'.format(axis)] - buff\n            # if outCode['code']:\n                # cChangeButton = str(n)\n        # elif bCode.startswith('framing') and not 'framing' in [(v['code']) for k, v in buttonCodes.items()]:\n            # codes = re.sub(r'([f]|[F])\\s+', r'\\1', bCode) # remove any spaces after f\n            # codes = codes.lower().strip().split()\n            # if codes[0] == 'framing' and len(codes) < 4:\n                # outCode = {'code':'framing', 'F':False, 'Z':False}\n                # for c in range(1, len(codes)):\n                    # if codes[c].startswith('f'):\n                        # try:\n                            # value = round(float(codes[c].replace('f','')), 3)\n                            # outCode['F'] = value\n                        # except:\n                            # outCode['code'] = None\n                    # elif codes[c] == 'usecurrentzheight':\n                        # outCode['Z'] = True\n                    # else:\n                        # outCode['code'] = None\n        # elif bCode.startswith('load '):\n            # if len(bCode.split()) > 1 and len(bCode.split()) < 3:\n                # codes = bCode.strip().split()\n                # if os.path.isfile(os.path.join(open_directory, codes[1])):\n                    # outCode = {'code':'load', 'file':os.path.join(open_directory, codes[1])}\n        # elif bCode.startswith('latest-file') and not 'latest-file' in [(v['code']) for k, v in buttonCodes.items()]:\n            # if len(bCode.split()) < 3:\n                # codes = bCode.strip().split()\n                # outCode = {'code':'latest-file', 'dir':None}\n                # if len(codes) == 1:\n                    # outCode['dir'] = open_directory\n                # elif len(codes) == 2 and os.path.isdir(codes[1]):\n                    # outCode['dir'] = codes[1]\n                # else:\n                    # outCode['code'] = None\n        # elif bCode.startswith('pulse-halpin '):\n            # if len(bCode.split()) > 1 and len(bCode.split()) < 4:\n                # codes = bCode.strip().split()\n                # if validate_hal_pin(codes[1], n, 'pulse-halpin'):\n                    # outCode = {'code':'pulse-halpin', 'pin':codes[1], 'time':1.0}\n                    # outCode['pin'] = codes[1]\n                    # try:\n                        # value = round(float(codes[2]), 1)\n                        # outCode['time'] = value\n                        # pulsePins[str(n)] = {'button':str(n), 'pin':outCode['pin'], 'text':None, 'timer':0, 'counter':0, 'state':False}\n                    # except:\n                        # outCode = {'code':None}\n        if bCode.startswith('toggle-halpin '):\n            if len(bCode.split()) > 1 and len(bCode.split()) < 4:\n                codes = bCode.strip().split()\n                if validate_hal_pin(codes[1], n, 'toggle-halpin'):\n                    outCode = {'code':'toggle-halpin', 'pin':codes[1], 'critical':False}\n                    outCode['pin'] = codes[1]\n                    if len(codes) == 3 and codes[2] == 'runcritical':\n                        outCode['critical'] = True\n                        criticalButtons.append(n)\n                    togglePins[str(n)] = {'button':str(n), 'pin':outCode['pin'], 'state':hal.get_value(outCode['pin']), 'runcritical':outCode['critical']}\n        elif bCode and bCode not in singleCodes:\n            codes = bCode.strip().split('\\\\')\n            codes = [x.strip() for x in codes]\n            outCode['code'] = []\n            for cn in range(len(codes)):\n                if codes[cn][0] == '%':\n                    if WHICH(codes[cn].split()[0][1:]) is not None:\n                        outCode['code'].append(['shell', codes[cn][1:]])\n                    else:\n                        outCode = {'code': None}\n                elif codes[cn][:2].lower() == 'o<':\n                    outCode['code'].append(['ocode', codes[cn]])\n                elif codes[cn][0].lower() in 'gm':\n                    if not '{' in codes[cn]:\n                        outCode['code'].append(['gcode', codes[cn]])\n                    else:\n                        reply = validate_ini_param(codes[cn], n)\n                        if reply[0]:\n                            outCode['code'].append(['gcode', reply[1]])\n                        else:\n                            outCode = {'code': None}\n                            break\n                else:\n                    outCode = {'code': None}\n                    break\n        else:\n            outCode = {'code':None}\n        if not rC('winfo','exists','.fbuttons.button' + str(n)):\n            ubuttSize = int( int(fontSize) - 2)\n            #print(ubuttSize)\n            rC('button','.fbuttons.button' + str(n),'-takefocus',0,'-width',ubuttSize)\n        if bName and outCode['code']:\n            bHeight = 2\n            if type(bName) == list:\n                bHeight = max(len(bName[0].split('\\\\')), len(bName[1].split('\\\\')))\n                bName = bName[0]\n            else:\n                bHeight = len(bName.split('\\\\')) \n            bLabel = bName.replace('\\\\', '\\n')\n            ubuttSize = int( int(fontSize) - 2)\n            rC('.fbuttons.button' + str(n),'configure','-text',bLabel,'-height',bHeight,'-bg',colorBack,'-wraplength',60,'-width',ubuttSize)\n            #print(ubuttSize)\n             # change to pack \n            #rC('grid','.fbuttons.button{}'.format(n),'-column',row,'-row',0,'-sticky','nsew','-padx',(2,0),'-pady',(2,0))\n            rC('pack','.fbuttons.button{}'.format(n),'-side','left','-fill','both','-expand',1)\n            rC('bind','.fbuttons.button{}'.format(n),'<ButtonPress-1>','button_action {} 1'.format(n))\n            rC('bind','.fbuttons.button{}'.format(n),'<ButtonRelease-1>','button_action {} 0'.format(n))\n            row += 1\n        elif bName or bCode:\n            title = _('USER BUTTON ERROR')\n            msg0 = _('is invalid code for user button')\n            notifications.add('error', '{}:\\n\"{}\" {} #{}'.format(title, bCode, msg0, n))\n            bName = None\n            outCode = {'code':None}\n        #print (bHeight)\n        buttonNames[n] = {'name':bName}\n        buttonCodes[n] = outCode\n    user_button_load()\n\ndef user_button_pressed(button, code):      # plasmac\n    global colorBack, activeFunction\n#    global probePressed, probeStart, probeTimer, probeButton\n#    global torchPressed, torchStart, torchTimer, torchButton\n\n    if rC('.fbuttons.button' + button,'cget','-state') == 'disabled' or not code:\n        return\n    from subprocess import Popen,PIPE\n    # ~ if code['code'] == 'ohmic-test':\n        # ~ hal.set_p('plasmac.ohmic-test','1')\n# ~ #FIXME: TEMPORARY PRINT FOR REPORTING WINDOW SIZES\n        # ~ print('Width={}   Height={}'.format(rC('winfo','width',root_window), rC('winfo','height',root_window)))\n    # ~ elif code['code'] == 'cut-type':\n        # ~ pass # actioned from button_release\n    # ~ elif code['code'] == 'single-cut':\n        # ~ pass # actioned from button_release\n    # ~ elif code['code'] == 'manual-cut':\n        # ~ manual_cut(None)\n    # ~ elif code['code'] == 'probe-test' and not hal.get_value('halui.program.is-running'):\n        # ~ if probeTimer:\n            # ~ probeTimer = 0\n        # ~ elif not hal.get_value('plasmac.z-offset-counts'):\n            # ~ activeFunction = True\n            # ~ probePressed = True\n            # ~ probeStart = time.time()\n            # ~ probeTimer = code['time']\n            # ~ hal.set_p('plasmac.probe-test','1')\n            # ~ rC('.fbuttons.button' + probeButton,'configure','-text',str(int(probeTimer)))\n            # ~ rC('.fbuttons.button' + probeButton,'configure','-bg',colorActive)\n    # ~ elif code['code'] == 'torch-pulse':\n        # ~ if torchTimer:\n            # ~ torchTimer = 0\n        # ~ elif not hal.get_value('plasmac.z-offset-counts'):\n            # ~ torchPressed = True\n            # ~ torchStart = time.time()\n            # ~ torchTimer = code['time']\n            # ~ hal.set_p('plasmac.torch-pulse-time','{}'.format(torchTimer))\n            # ~ hal.set_p('plasmac.torch-pulse-start','1')\n            # ~ rC('.fbuttons.button' + torchButton,'configure','-text',str(int(torchTimer)))\n            # ~ rC('.fbuttons.button' + torchButton,'configure','-bg',colorActive)\n    # ~ elif code['code'] == 'change-consumables' and not hal.get_value('plasmac.breakaway'):\n        # ~ if hal.get_value('axis.x.eoffset-counts') or hal.get_value('axis.y.eoffset-counts'):\n            # ~ hal.set_p('plasmac.consumable-change', '0')\n            # ~ hal.set_p('plasmac.x-offset', '0')\n            # ~ hal.set_p('plasmac.y-offset', '0')\n            # ~ rC('.fbuttons.button' + button,'configure','-bg',colorBack)\n            # ~ activeFunction = False\n        # ~ else:\n            # ~ activeFunction = True\n            # ~ xPos = s.position[0] if code['X'] is None else code['X']\n            # ~ yPos = s.position[1] if code['Y'] is None else code['Y']\n            # ~ hal.set_p('plasmac.xy-feed-rate', str(code['F']))\n            # ~ hal.set_p('plasmac.x-offset', '{:.0f}'.format((xPos - s.position[0]) / hal.get_value('plasmac.offset-scale')))\n            # ~ hal.set_p('plasmac.y-offset', '{:.0f}'.format((yPos - s.position[1]) / hal.get_value('plasmac.offset-scale')))\n            # ~ hal.set_p('plasmac.consumable-change', '1')\n            # ~ rC('.fbuttons.button' + button,'configure','-bg',colorOrange)\n    # ~ elif code['code'] == 'framing':\n        # ~ pass # actioned from button_release\n    # ~ elif code['code'] == 'load':\n        # ~ pass # actioned from button_release\n    # ~ elif code['code'] == 'latest-file':\n        # ~ pass # actioned from button_release\n    # ~ elif code['code'] == 'pulse-halpin' and hal.get_value('halui.program.is-idle'):\n        # ~ hal.set_p(code['pin'], str(not hal.get_value(code['pin'])))\n        # ~ if not pulsePins[button]['timer']:\n            # ~ pulsePins[button]['text'] = rC('.fbuttons.button' + button,'cget','-text')\n            # ~ pulsePins[button]['timer'] = code['time']\n            # ~ pulsePins[button]['counter'] = time.time()\n        # ~ else:\n            # ~ pulsePins[button]['timer'] = 0\n            # ~ rC('.fbuttons.button' + button,'configure','-text',pulsePins[button]['text'])\n    if code['code'] == 'toggle-halpin' and hal.get_value('halui.program.is-idle'):\n        hal.set_p(code['pin'], str(not hal.get_value(code['pin'])))\n    else:\n        for n in range(len(code['code'])):\n            if code['code'][n][0] == 'shell':\n                Popen(code['code'][n][1], stdout=PIPE, stderr=PIPE, shell=True)\n            elif code['code'][n][0] in ['gcode', 'ocode']:\n                if manual_ok():\n                    ensure_mode(linuxcnc.MODE_MDI)\n                    commands.send_mdi_command(code['code'][n][1])\n\ndef user_button_released(button, code):         # plasmac\n#    global cutType, probePressed, torchPressed\n    if rC('.fbuttons.button' + button,'cget','-state') == 'disabled' or not code: return\n#    if code['code'] == 'ohmic-test':\n#        hal.set_p('plasmac.ohmic-test','0')\n#    elif code['code'] == 'cut-type':\n#        if not hal.get_value('halui.program.is-running'):\n#            cutType ^= 1\n#            if cutType:\n#                comp['cut-type'] = 1\n#                text = code['text'][1].replace('\\\\', '\\n')\n#                color = colorOrange\n#            else:\n#                comp['cut-type'] = 0\n#                text = code['text'][0].replace('\\\\', '\\n')\n#                color = colorBack\n#            rC('.fbuttons.button' + button,'configure','-bg',color,'-text',text)\n#            reload_file()\n#    elif code['code'] == 'single-cut':\n#        single_cut()\n#    elif code['code'] == 'manual-cut':\n#        pass\n#    elif code['code'] == 'probe-test':\n#        probePressed = False\n#    elif code['code'] == 'torch-pulse':\n#        torchPressed = False\n#    elif code['code'] == 'change-consumables':\n#        pass\n#    elif code['code'] == 'framing':\n#        if not code['F']:\n#            code['F'] = int(rC('.runs.material.cut-feed-rate', 'get'))\n#        frame_job(code['F'], code['Z'])\n#    elif code['code'] == 'load':\n#        commands.open_file_name(code['file'])\n#    elif code['code'] == 'latest-file':\n#        files = GLOB('{}/*.ngc'.format(code['dir']))\n#        latest = max(files, key=os.path.getctime)\n#        commands.open_file_name(latest)\n#    elif code['code'] == 'pulse-halpin':\n#        pass\n#    elif code['code'] == 'toggle-halpin':\n #       pass\n    else:\n        pass\n\ndef user_button_add():          # plasmac\n    for n in range(1, 20):\n        if not rC('winfo','ismapped',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n)):\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n),'-column',0,'-row',n,'-sticky','ne','-padx',(4,0),'-pady',(0,4))\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'-column',1,'-row',n,'-sticky','nw','-padx',(4,0),'-pady',(0,4))\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'-column',2,'-row',n,'-sticky','new','-padx',(4,4),'-pady',(0,4))\n            \n\n            break\n        ##cbbox = rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','bbox',\"all\")\n        ##rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','configure','-scrollregion',(cbbox))\n    #cbbox = rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','bbox',(\"ALL\"))\n    #rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','configure','-scrollregion',(0,0,50,500))\n    ###rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','yview','moveto',1.0)\n    #print(rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','bbox',(\"all\")))\n    #print(rC('winfo','children', fsetup + '.tabs.fbutt.r.ubuttons.frame'))\n\ndef user_button_load():         # plasmac\n    hide_buttonframe()\n    #rC(fsetup + '.tabs.fbutt.r.torch.enabled','delete',0,'end')\n    #rC(fsetup + '.tabs.fbutt.r.torch.disabled','delete',0,'end')\n    #rC(fsetup + '.tabs.fbutt.r.torch.enabled','insert','end',getPrefs(PREF,'BUTTONS', 'Torch enabled', 'Torch\\Enabled', str))\n    #rC(fsetup + '.tabs.fbutt.r.torch.disabled','insert','end',getPrefs(PREF,'BUTTONS','Torch disabled', 'Torch\\Disabled', str))\n    for n in range(1, 20):\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n))\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n))\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n))\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'delete',0,'end')\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'delete',0,'end')\n        if getPrefs(PREF,'BUTTONS', str(n) + ' Name', '', str) or getPrefs(PREF,'BUTTONS', str(n) + ' Code', '', str):\n            rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'insert','end',getPrefs(PREF,'BUTTONS', str(n) + ' Name', '', str))\n            rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'insert','end',getPrefs(PREF,'BUTTONS', str(n) + ' Code', '', str))\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n),'-column',0,'-row',n,'-sticky','ne','-padx',(4,0),'-pady',(0,4))\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'-column',1,'-row',n,'-sticky','nw','-padx',(4,0),'-pady',(0,4))\n            rC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'-column',2,'-row',n,'-sticky','new','-padx',(4,4),'-pady',(0,4))\n            color_user_buttons()\n        #rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','create','window',0,0,'-anchor','nw','-window',fsetup + '.tabs.fbutt.r.ubuttons.frame')\n    ##cbbox = rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','bbox',\"all\")\n    ##rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','configure','-scrollregion',(cbbox))\n    hide_buttonframe()\n    #print(rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','bbox',(\"all\")))\n    #print(rC('winfo','children', fsetup + '.tabs.fbutt.r.ubuttons.frame'))\ndef user_button_save():\n#    global torchEnable\n#    putPrefs(PREF,'BUTTONS', 'Torch enabled', rC(fsetup + '.tabs.fbutt.r.torch.enabled','get'), str)\n#    putPrefs(PREF,'BUTTONS', 'Torch disabled', rC(fsetup + '.tabs.fbutt.r.torch.disabled','get'), str)\n#    torchEnable['enabled'] = getPrefs(PREF,'BUTTONS', 'Torch enabled', 'Torch\\Enabled', str)\n#    torchEnable['disabled'] = getPrefs(PREF,'BUTTONS','Torch disabled', 'Torch\\Disabled', str)\n#    if '\\\\' in torchEnable['enabled'] or '\\\\' in torchEnable['disabled']:\n#        rC('.fbuttons.torch-enable','configure','-height',2)\n#    else:\n#        rC('.fbuttons.torch-enable','configure','-height',1)\n#    color_torch()\n    for n in range(1, 20):\n        putPrefs(PREF,'BUTTONS', '{} Name'.format(n), rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'get'), str)\n        putPrefs(PREF,'BUTTONS', '{} Code'.format(n), rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'get'), str)\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n))\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n))\n        rC('grid','forget',fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n))\n        #rC('grid','forget','.fbuttons.button' + str(n))\n        #### change to pack\n        rC('pack','forget','.fbuttons.button' + str(n))\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'delete',0,'end')\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'delete',0,'end')\n    user_button_setup()\n\n\n######################################################################\n#########3      screen layout stuff     Z###############################\n##################################################################\n\ndef set_screensmall():\n  #print(\"butt\")\n  #rC('grid','forget','.info')\n  ##rC(\".pane\",\"configure\",\"-height\",\"300\",'-width','700')\n  rC(\".pane\",\"configure\",\"-height\",\"300\")\n  ##rC('.pane.top.tabs','configure','-width','325')\n  rC('.pane.top.right','configure','-width','300')\n  ##rC('.pane.top.right','configure','-width','350')\n  #rC(\"wm\",\"geometry\",\".\",\"+0+36\")\n  rC(fjogf + '.zerohome.tooltouch','configure','-text','Tool Touch')\n  rC('grid',fjogf + '.zerohome.home','-rowspan',3,'-padx',3)\n  rC(fjogf + '.zerohome.home','configure','-height',3,'-padx',3)\n  rC('grid','forget','.pane.top.gcodel')\n  rC('grid','forget','.pane.top.right')\n  rC('grid','forget','.pane.top.tabs')\n  rC('grid','forget','.pane.top.gcodes')\n  rC('grid','forget','.pane.top.feedoverride')\n  rC('grid','forget','.pane.top.rapidoverride')\n  rC('grid','forget','.pane.top.spinoverride')\n  rC('grid','forget','.pane.top.jogspeed')\n  rC('grid','forget','.pane.top.ajogspeed')\n  rC('grid','forget','.pane.top.maxvel') \n  rC('grid','.pane.top.tabs','-sticky','nesw','-column','0','-row','1','-rowspan',1)\n  rC('grid','.pane.top.spinoverride','-sticky','new')\n  rC('grid','.pane.top.feedoverride','-sticky','new')\n  rC('grid','.pane.top.right','-sticky','nesw','-column','1','-row','1','-rowspan',1)\n  #rC('grid','rowconfigure','.pane.top.right',1,'-weight',3)\n\n  rC('.pane.top.gcodes','configure','-height',3,'-width',20)\n  rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1','-row','2','-rowspan',3)\n  #rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1')\n  rC(ftabs,'configure','-homogeneous',False)\n  rC(fright,'configure','-homogeneous',False)\n  #rC('wm','minsize','.','750','200')\n\ndef screen_medium():\n  #rC(\".pane\",\"configure\",\"-height\",\"500\",'-width','950');\n  #rC('.pane.top.tabs','configure','-width','500')\n  rC('grid','forget','.pane.top.tabs')\n  rC('grid','forget','.pane.top.feedoverride')\n  rC('grid','forget','.pane.top.rapidoverride')\n  rC('grid','forget','.pane.top.spinoverride')\n  rC('grid','forget','.pane.top.jogspeed')\n  rC('grid','forget','.pane.top.ajogspeed')\n  rC('grid','forget','.pane.top.maxvel')\n  rC('grid','remove','.pane.top.gcodel')\n  rC('grid','forget','.pane.top.gcodes') \n  rC('grid','.pane.top.right','-column','1','-sticky','nesw')\n  #rC('grid','.pane.top.gcodes','-column','1','-sticky','new')\n  rC('grid','.pane.top.right','-sticky','nesw','-column','1','-row','1','-rowspan',1)\n  rC('grid','.pane.top.feedoverride','-sticky','nesw','-column','1')\n  rC('grid','.pane.top.spinoverride','-sticky','nesw','-column','1')\n  rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1','-rowspan',1)\n  rC('.pane.top.gcodes','configure','-height',3)\n  rC('grid','.pane.top.tabs','-sticky','nesw','-column','0','-row','1','-rowspan',10)\n  rC(ftabs,'configure','-homogeneous',True)\n  rC(fright,'configure','-homogeneous',True)\n\ndef toolbar_config():\n  rC('pack','forget','.toolbar.rule0')\n  rC('pack','forget','.toolbar.rule4')\n  rC('pack','forget','.toolbar.rule8')\n  rC('pack','forget','.toolbar.rule9')\n  rC('pack','forget','.toolbar.rule12')\n  for w in toolButtons:\n                rC('pack','forget','.toolbar.{}'.format(w))\n  bSize = int(int(fontSize) / 10 * 24) if int(fontSize) > 10 else 24\n  buttFont = '{} {}'.format(fontName, str(int(fontSize) - 2))\n  #print(bSize)\n  if pVars.buttlab.get() == True:       \n          for w in toolButtons:\n                rC('.toolbar.{}'.format(w),'configure' ,\"-bd\",1,\"-font\",buttFont\n                ,\"-compound\",\"top\",'-width',(bSize - 4),'-height',(bSize + 8))\n          rC(\".toolbar.machine_estop\",\"configure\",\"-text\",\"ESTOP\",\"-activebackground\",\"tomato2\")\n          rC(\".toolbar.machine_power\",\"configure\",\"-text\",\"POWER\",\"-activebackground\",\"palegreen3\")\n          rC(\".toolbar.file_open\",\"configure\",\"-text\",\"OPEN\",\"-activebackground\",\"grey90\")\n          rC(\".toolbar.reload\",\"configure\",\"-text\",\"RELOAD\",\"-activebackground\",\"palegreen1\")\n          rC(\".toolbar.program_run\",\"configure\",\"-text\",\"RUN\")\n          rC(\".toolbar.program_step\",\"configure\",\"-text\",\"STEP\")\n          rC(\".toolbar.program_pause\",\"configure\",\"-text\",\"PAUSE\")\n          rC(\".toolbar.program_stop\",\"configure\",\"-text\",\"STOP\")\n          rC(\".toolbar.program_blockdelete\",\"configure\",\"-text\",\"SKIP\")\n          rC(\".toolbar.program_optpause\",\"configure\",\"-text\",\"M1\")\n          rC(\".toolbar.view_zoomin\",\"configure\",\"-text\",\"ZOOM\")\n          rC(\".toolbar.view_zoomout\",\"configure\",\"-text\",\"ZOOM\")\n          rC(\".toolbar.view_z\",\"configure\",\"-text\",\"VIEW\")\n          rC('pack','forget','.toolbar.view_z2')\n          rC('pack','forget','.toolbar.view_y2')\n          rC(\".toolbar.view_x\",\"configure\",\"-text\",\"VIEW\")\n          rC(\".toolbar.view_y\",\"configure\",\"-text\",\"VIEW\")\n          rC(\".toolbar.view_p\",\"configure\",\"-text\",\"VIEW\")\n          rC(\".toolbar.rotate\",\"configure\",\"-text\",\"ROTATE\")\n          rC(\".toolbar.clear_plot\",\"configure\",\"-text\",\"CLEAR\")\n          for w in toolButtons:\n             rC('pack','.toolbar.{}'.format(w),'-fill','x','-side','left','-expand',1)\n          rC('pack','forget','.toolbar.view_z2')\n          rC('pack','forget','.toolbar.view_y2')\n          rC('pack','.toolbar.rule0','-after','.toolbar.machine_power','-fill','x','-side','left','-expand',1)\n          rC('pack','.toolbar.rule4','-after','.toolbar.reload','-fill','x','-side','left','-expand',1)\n          rC('pack','.toolbar.rule8','-after','.toolbar.program_stop','-fill','x','-side','left','-expand',1)\n          rC('pack','.toolbar.rule9','-after','.toolbar.program_optpause','-fill','x','-side','left','-expand',1)\n          rC('pack','.toolbar.rule12','-after','.toolbar.rotate','-fill','x','-side','left','-expand',1)\n  else:\n       # no button labels\n       for w in toolButtons:\n                rC('.toolbar.{}'.format(w),'configure',\"-compound\",\"none\",\"-text\",\"\"\n                ,\"-activebackground\",colorFore,'-width',bSize,'-height',bSize,'-bd',1)\n       for w in toolButtons:\n             rC('pack','.toolbar.{}'.format(w),'-fill','x','-side','left','-expand',1)\n       rC('pack','.toolbar.rule0','-after','.toolbar.machine_power','-fill','x','-side','left','-expand',1)\n       rC('pack','.toolbar.rule4','-after','.toolbar.reload','-fill','x','-side','left','-expand',1)\n       rC('pack','.toolbar.rule8','-after','.toolbar.program_stop','-fill','x','-side','left','-expand',1)\n       rC('pack','.toolbar.rule9','-after','.toolbar.program_optpause','-fill','x','-side','left','-expand',1)\n       rC('pack','.toolbar.rule12','-after','.toolbar.rotate','-fill','x','-side','left','-expand',1)\n  rC('pack','forget','.toolbar.view_z2')\n  rC('pack','forget','.toolbar.view_y2')\n  \ndef hide_buttonframe():\n    if pVars.hidebuttf.get() == True:\n        rC('grid','forget','.fbuttons')\n    else:\n        rC('grid','.fbuttons','-column',0,'-row',3,'-rowspan',2,'-sticky','nsew','-padx',0,'-pady',0)\n\n##########################################################################\n####     SLIDER STUFF      ######################################################\n##########################################################################\n\ndef hide_jog():\n    if pVars.hidejog.get() == True:\n        rC('grid','forget',ftop + '.jogspeed')\n        rC('grid','forget',ftop + '.ajogspeed')\n    else:\n      if pVars.winSize.get() == 'medium':\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.tabs')\n        rC('grid','.pane.top.jogspeed','-column',1,'-sticky','new')        \n        # test if we need the angular jog slider, 56==0x38==000111000==ABC\n        #if s.axis_mask & 56 == 0 and 'ANGULAR' in joint_type:\n        if has_angular_joint_or_axis:\n            rC('grid','.pane.top.ajogspeed','-column',1,'-sticky','new')\n            print(\"angular slider\")\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1','-rowspan',1)\n        rC('grid','.pane.top.tabs','-sticky','nesw','-column','0','-row','1','-rowspan',15)\n      elif  pVars.winSize.get() == 'small':\n        rC('grid','.pane.top.jogspeed','-column',0,'-sticky','new')\n        # test if we need the angular jog slider, 56==0x38==000111000==ABC\n        #if s.axis_mask & 56 == 0 and 'ANGULAR' in joint_type:\n        if has_angular_joint_or_axis:\n            rC('grid','.pane.top.ajogspeed','-column',0,'-sticky','new')\n      else:\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.gcodel') \n        rC('grid','forget','.pane.top.right')\n        rC('grid','.pane.top.jogspeed','-column',0,'-sticky','new')\n        # test if we need the angular jog slider, 56==0x38==000111000==ABC\n        #if s.axis_mask & 56 == 0 and 'ANGULAR' in joint_type:\n        if has_angular_joint_or_axis:\n            rC('grid','.pane.top.ajogspeed','-column',0,'-sticky','new')\n            print(\"angular slider\")\n        rC('grid','.pane.top.gcodel','-sticky','nw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.right','-sticky','nesw','-column','1','-row','1','-rowspan',15)\n  \ndef hide_rapid():\n    if pVars.hiderapid.get() == True:\n        rC('grid','forget',ftop + '.rapidoverride')\n    else:\n      if pVars.winSize.get() == 'medium':\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.tabs')\n        rC('grid','.pane.top.rapidoverride','-column',1,'-sticky','new')\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1','-rowspan',1)\n        rC('grid','.pane.top.tabs','-sticky','nesw','-column','0','-row','1','-rowspan',15)\n      elif  pVars.winSize.get() == 'small':\n        rC('grid','.pane.top.rapidoverride','-column',0,'-sticky','new')\n      else:\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.gcodel') \n        rC('grid','forget','.pane.top.right')\n        rC('grid','.pane.top.rapidoverride','-column',0,'-sticky','new')\n        rC('grid','.pane.top.gcodel','-sticky','nw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.right','-sticky','nesw','-column','1','-row','1','-rowspan',15)\n         \ndef hide_velocity():\n    \n    if pVars.hidevel.get() == True:\n        rC('grid','forget',ftop + '.maxvel',)\n    else:\n      if pVars.winSize.get() == 'medium':\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.tabs')\n        rC('grid','.pane.top.maxvel','-column',1,'-sticky','new')\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column','1','-rowspan',1)\n        rC('grid','.pane.top.tabs','-sticky','nesw','-column','0','-row','1','-rowspan',15)\n      elif  pVars.winSize.get() == 'small':\n            rC('grid','.pane.top.maxvel','-column',0,'-sticky','new')\n      else:\n        rC('grid','forget','.pane.top.gcodes') \n        rC('grid','forget','.pane.top.gcodel') \n        rC('grid','forget','.pane.top.right')\n        rC('grid','.pane.top.maxvel','-column',0,'-sticky','new')\n        rC('grid','.pane.top.gcodel','-sticky','nw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.gcodes','-sticky','nesw','-column',0,'-rowspan',1)\n        rC('grid','.pane.top.right','-sticky','nesw','-column','1','-row','1','-rowspan',15)\n\n\n##########################################################################\n####   end  SLIDER STUFF      ######################################################\n##########################################################################\n\n###   pop up dialog things\n\ndef show_dialog(func, title, msg):      # plasmac\n    dlg = plasmacDialog(func, title, msg)\n    root_window.wait_window(dlg.dlg)\n    return(dlg.reply)\n\ndef prompt_touchoff(title, text, default, tool_only, system=None):          # plasmac\n    title = _('TOUCH OFF')\n    text = text.replace(':', '') % _('workpiece')\n    dlg = plasmacDialog('touch', title, text, system)\n    root_window.wait_window(dlg.dlg)\n    valid, value, system = dlg.reply\n    try:\n        v = float(value)\n    except:\n        msg0 = _('Touch off entry {} is invalid'.format(value))\n        show_dialog('error', title, msg0)\n        value = 0.0\n    if valid:\n        return(value, system)\n    else:\n        return(None, None)\n        \ndef prompt_areyousure(title, text):                     #plasmac\n    #title = _('TOUCH OFF')\n    #text = text.replace(':', '') % _('workpiece')\n    dlg = plasmacDialog('yesno', title, text)\n    root_window.wait_window(dlg.dlg)\n    #valid, value, system = dlg.reply\n    #return t.run()\n    value = dlg.reply\n    return value\n\ndef font_size_changed():                            # plasmac modified\n    global fontName, fontSize, startFontSize, ngcFont\n    #fontName = 'sans'\n    fontName = 'mono'\n    fontSize = pVars.fontSize.get()\n    font = '{} {}'.format(fontName, fontSize)\n    arcFont = '{} {}'.format(fontName, str(int(fontSize) * 3))\n    ngcFont = '{} {}'.format(fontName, str(int(fontSize) - 1))\n    rC('font','configure','TkDefaultFont','-family', fontName, '-size', fontSize)\n#    rC(fplasma + '.arc-voltage','configure','-font',arcFont)\n#   rC('.pane.bottom.t.text','configure','-height',8,'-font',font)\n    rC('.pane.top.tabs.fauto.t.text','configure','-font',ngcFont)\n    rC('.pane.top.tabs.fedit.t.text','configure','-font',ngcFont)\n    #print(arcFont)\n    #print(ngcFont)    \n    rC('.pane.top.gcodes','configure','-font',ngcFont)\n    #rC(ftabs,'delete','manual',0)\n    #rC(ftabs,'delete','mdi',0)\n    #rC(ftabs,'insert','end','manual')\n    #rC(ftabs,'insert','end','mdi')\n    #rC(ftabs,'raise','manual')\n    #rC(ftabs,'itemconfigure','manual','-text','MANUAL')\n    #rC(ftabs,'itemconfigure','mdi','-text','MDI')\n    #rC(fright,'delete','preview',0)\n    #rC(fright,'delete','numbers',0)\n    #rC(fright,'delete','stats',0)\n    #rC(fright,'insert','end','preview')\n    #rC(fright,'insert','end','numbers')\n    #rC(fright,'insert','end','stats')\n    #rC(fright,'raise','preview')\n    #rC(fright,'itemconfigure','preview','-text',_('PREVIEW'))\n    #rC(fright,'itemconfigure','numbers','-text',_('DRO'))\n    #rC(fright,'itemconfigure','stats','-text',_('Statistics'))\n    rC('.pane.top.tabs','itemconfigure','manual','-text',' MANUAL')\n    rC('.pane.top.tabs','itemconfigure','mdi','-text',' MDI')\n    rC('.pane.top.tabs','itemconfigure','auto','-text',' AUTO')\n    rC('.pane.top.tabs','itemconfigure','edit','-text',' EDIT ')\n    rC('.pane.top.right','itemconfigure','preview','-text',' PREVIEW ')\n    rC('.pane.top.right','itemconfigure','numbers','-text',' DRO ')\n    \n    rC(fsetup + '.tabs','itemconfigure','gui','-text','  GUI  ')\n    rC(fsetup + '.tabs','itemconfigure','butt','-text','  BUTTONS  ')\n    pagest = (rC(fsetup + '.tabs','pages'))\n    for page in pagest:\n        rC(fsetup + '.tabs','itemconfigure',page,'-foreground',colorFore,'-background',colorBack,'-activeforeground',colorBack,'-activebackground',colorFore)\n \n    for nbook in [ftabs, fright]:\n        pages = (rC(nbook,'pages'))\n        for page in pages:\n            rC(nbook,'itemconfigure',page,'-foreground',colorFore,'-background',colorBack)\n    rC(fright + '.fpreview','configure','-bd',0)\n    rC(fright + '.fnumbers','configure','-bd',0)\n    #rC(fright + '.fstats','configure','-bd',2)\n    for box in spinBoxes:\n        rC(box,'configure','-font',fontName + ' ' + fontSize)\n    #ledFrame = int(fontSize) * 2\n    #ledSize = ledFrame - 2\n    #ledScale = int(fontSize) / int(startFontSize)\n    startFontSize = fontSize\n    #for led in wLeds:\n     #   rC(led,'configure','-width',ledFrame,'-height',ledFrame)\n      #  rC(led,'scale',1,1,1,ledScale,ledScale)\n    bSize = int(int(fontSize) / 10 * 24) if int(fontSize) > 10 else 24\n    #print(bSize)\n    for w in toolButtons:\n        rC('.toolbar.{}'.format(w),'configure','-width',bSize,'-height',bSize)\n    #for w in matButtons:\n     #   rC('.toolmat.{}'.format(w),'configure','-width',bSize,'-height',bSize)\n    toolbar_config()\n    user_button_setup()\n    rC('grid','forget','.fbuttons')\n    get_coordinate_font(None)\n    rC('update','idletasks')\n    \n\ndef set_window_size():       # plasmac modified\n    global tabSizeW\n    size = pVars.winSize.get()\n    if size not in ['default', 'last', 'fullscreen', 'maximized','small','medium']:\n        title = _('WINDOW ERROR')\n        msg0 = _('Invalid parameters in [GUI_OPTIONS]Window size in preferences file')\n        notifications.add('error', '{}:\\n{}\\n'.format(title, msg0))\n        return False\n    else:\n        if size == 'maximized':\n            rC('wm','attributes','.','-fullscreen', 0)\n            rC('wm','attributes','.','-zoomed',1)\n        elif size == 'small':\n            set_screensmall()\n            width = 750\n            height = 400\n            tabSizeW = int((width / 2)-20)\n            rC('wm','geometry','.','{}x{}'.format(width, height))\n            rC('.pane.top.right','configure','-width',280)\n            rC('.pane.top.tabs','configure','-width',460)\n            rC(\".pane\",\"configure\",\"-height\",\"300\")\n            #rC('grid','columnconfigure',ftop,0,'-weight',0,'-minsize',tabSizeW)\n            #rC('tk::PlaceWindow','.')\n            \n        elif size == 'medium':\n            screen_medium()\n            #rC('wm','attributes','.','-zoomed', 0)\n            #rC('wm','attributes','.','-fullscreen', 0)\n            width = 1000\n            height = 570\n            tabSizeW = int((width / 1.6)-20)\n            rC('wm','geometry','.','{}x{}'.format(width, height))\n            \n            rC('.pane.top.tabs','configure','-width',tabSizeW)\n            rC('grid','columnconfigure',ftop,0,'-weight',0,'-minsize',tabSizeW)\n            #rC('tk::PlaceWindow','.')           \n            \n        elif size == 'fullscreen':\n            rC('wm','attributes','.','-zoomed', 0)\n            rC('wm','attributes','.','-fullscreen',1)\n        elif size == 'last':\n            size = getPrefs(PREF,'GUI_OPTIONS', 'Window last', 'none', str)\n            if size == 'none':\n                size = 'default'\n            else:\n                rC('wm','attributes','.','-zoomed', 0)\n                rC('wm','attributes','.','-fullscreen', 0)\n                rC('wm','geometry','.',size)\n        if size == 'default':\n            rC('grid','.pane.top.feedoverride','-sticky','nesw','-column','0')\n            rC('grid','.pane.top.spinoverride','-sticky','nesw','-column','0')\n            rC('wm','attributes','.','-zoomed', 0)\n            rC('wm','attributes','.','-fullscreen', 0)\n            width = 900\n            height = 600\n            tabSizeW = int((width / 2)-20)\n            rC('wm','geometry','.','{}x{}'.format(width, height))\n            #rC('.pane.top.tabs','configure','-width',tabSizeW)\n            rC('.pane.top.tabs','configure','-width',600)\n            #rC('.pane.top.right','configure','-width',300)\n            rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',1,'-rowspan',1)\n\n            #rC('grid','columnconfigure',ftop,0,'-minsize',tabSizeW)\n            #print (tabSizeW)\n            #rC('tk::PlaceWindow','.')\n    #hide_buttonframe()\n    rC(ftabs,'configure','-homogeneous',True,'-tabpady','1''1')\n    rC(fright,'configure','-homogeneous',True,'-tabpady','1''1')\n    #rC('.pane.top.tabs','configure','-width',500)\n    #rC('.pane.top.right','configure','-width',300)\n    #rC(\".pane\",\"configure\",\"-height\",\"300\")\n    #rC('grid','columnconfigure',ftop,0,'-weight',0,'-minsize',tabSizeW)\n    #rC('grid','.pane.top.tabs','-sticky','nesw','-columnspan',1,'-rowspan',1)\n    hide_rapid()\n    hide_jog()\n    hide_velocity()\n    set_window_screen()\n    \ndef set_window_screen():\n    size = pVars.winScreen.get()\n    if size not in ['default', 'last', 'fullscreen', 'maximized']:\n        title = _('WINDOW ERROR')\n        msg0 = _('Invalid parameters in [GUI_OPTIONS]Window size in preferences file')\n        notifications.add('error', '{}:\\n{}\\n'.format(title, msg0))\n        return False\n    else:\n        if size == 'maximized':\n            rC('wm','attributes','.','-fullscreen', 0)\n            rC('wm','attributes','.','-zoomed',1)\n\n        elif size == 'fullscreen':\n            rC('wm','attributes','.','-zoomed', 0)\n            rC('wm','attributes','.','-fullscreen',1)\n        elif size == 'last':\n            size = getPrefs(PREF,'GUI_OPTIONS', 'Window last', 'none', str)\n            if size == 'none':\n                size = 'default'\n            else:\n                rC('wm','attributes','.','-zoomed', 0)\n                rC('wm','attributes','.','-fullscreen', 0)\n                rC('wm','geometry','.',size)\n        if size == 'default':\n            rC('wm','attributes','.','-zoomed', 0)\n            rC('wm','attributes','.','-fullscreen', 0)\n            #width = 750\n            #height = 400\n            #rC('wm','geometry','.','{}x{}'.format(width, height))\n\n            rC('tk::PlaceWindow','.')\n\ndef load_setup_clicked():                    # plasmac\n    #rC(fsetup + '.tabs.fgui.l.jog.speed','set',restoreSetup['jogSpeed'])\n    #jog_default_changed(restoreSetup['jogSpeed'])\n    if pVars.winSize.get() != restoreSetup['winSize']:\n        pVars.winSize.set(restoreSetup['winSize'])\n        set_window_size()\n    if pVars.winScreen.get() != restoreSetup['winScreen']:\n        pVars.winScreen.set(restoreSetup['winScreen'])\n        set_window_screen()        \n    if pVars.fontSize.get() != restoreSetup['fontSize']:\n        pVars.fontSize.set(restoreSetup['fontSize'])\n        font_size_changed()\n    if pVars.fontSize.get() != restoreSetup['fontSize']:\n        pVars.fontSize.set(restoreSetup['fontSize'])\n        font_size_changed()\n    #if pVars.kbShortcuts.get() != restoreSetup['kbShortcuts']:\n    #    pVars.kbShortcuts.set(restoreSetup['kbShortcuts'])\n    #    keyboard_bindings(restoreSetup['kbShortcuts'])\n    pVars.closeDialog.set(restoreSetup['closeDialog'])\n    #rC(fsetup + '.tabs.fgui.l.gui.zoom','set',restoreSetup['tableZoom'])\n    if pVars.hidejog.get() != restoreSetup['hidejog']:\n        pVars.hidejog.set(restoreSetup['hidejog'])\n        hide_jog()\n    if pVars.hiderapid.get() != restoreSetup['hiderapid']:\n        pVars.hiderapid.set(restoreSetup['hiderapid'])\n        hide_rapid()\n    if pVars.hidevel.get() != restoreSetup['hidevel']:\n        pVars.hidevel.set(restoreSetup['hidevel'])\n        hide_velocity()\n    if pVars.buttlab.get() != restoreSetup['buttlab']:\n        pVars.buttlab.set(restoreSetup['buttlab'])\n        toolbar_config()\n    if pVars.load_last.get() != restoreSetup['load_last']:\n        pVars.loadlast.set(restoreSetup['load_last'])\n    if pVars.hidebuttf.get() != restoreSetup['hidebuttf']:\n        pVars.hidebuttf.set(restoreSetup['hidebuttf'])\n        hide_buttonframe()        \n    user_button_load()\n    read_colors()\n    color_change()\n    hide_jog()\n    hide_rapid()\n    hide_velocity()    \n    hide_buttonframe()\n    rC('grid','forget','.fbuttons')    \n    toolbar_config()\n\ndef save_setup_clicked():                    # plasmac \n    #if int(rC(fsetup + '.tabs.fgui.l.jog.speed','get')) < minJogSpeed:\n     #   rC(fsetup + '.tabs.fgui.l.jog.speed','set',minJogSpeed)\n    #restoreSetup['jogSpeed'] = rC(fsetup + '.tabs.fgui.l.jog.speed','get')\n    #putPrefs(PREF,'GUI_OPTIONS', 'Jog speed', restoreSetup['jogSpeed'], int)\n    restoreSetup['closeDialog'] = pVars.closeDialog.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Exit warning', restoreSetup['closeDialog'], bool)\n    restoreSetup['winSize'] = pVars.winSize.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Window size', restoreSetup['winSize'], str)\n    restoreSetup['winScreen'] = pVars.winScreen.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Window screen', restoreSetup['winScreen'], str)\n    restoreSetup['fontSize'] = pVars.fontSize.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Font size', restoreSetup['fontSize'], str)\n    #restoreSetup['kbShortcuts'] = pVars.kbShortcuts.get()\n    #putPrefs(PREF,'GUI_OPTIONS', 'Use keyboard shortcuts', restoreSetup['kbShortcuts'], bool)\n    restoreSetup['hidejog'] = pVars.hidejog.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Hide Max Jog. Slider', restoreSetup['hidejog'], bool)\n    restoreSetup['hiderapid'] = pVars.hiderapid.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Hide Max Rapid. Slider', restoreSetup['hiderapid'], bool)\n    restoreSetup['hidevel'] = pVars.hidevel.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Hide Max Velocity Slider', restoreSetup['hidevel'], bool)\n    restoreSetup['buttlab'] = pVars.buttlab.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Show Button Label', restoreSetup['buttlab'], bool)\n    restoreSetup['load_last'] = pVars.load_last.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Load last file', restoreSetup['load_last'], bool)\n    user_button_save()\n    restoreSetup['hidebuttf'] = pVars.hidebuttf.get()\n    putPrefs(PREF,'GUI_OPTIONS', 'Hide Button Frame', restoreSetup['hidebuttf'], bool)\n    hide_buttonframe()\n    rC('grid','forget','.fbuttons')\n    putPrefs(PREF,'GUI_OPTIONS', 'Foreground color', colorFore, str)\n    putPrefs(PREF,'GUI_OPTIONS', 'Background color', colorBack, str)\n    putPrefs(PREF,'GUI_OPTIONS', 'Disabled color', colorDisable, str)\n    putPrefs(PREF,'GUI_OPTIONS', 'Active color', colorActive, str)\n    putPrefs(PREF,'GUI_OPTIONS', 'Warning color', colorWarn, str)\n    putPrefs(PREF,'GUI_OPTIONS', 'Voltage color', colorVolt, str)\n    for key in togglePins:\n        set_toggle_pins(togglePins[key]) \n\n\n\n##############################################################################\n# EXTERNAL HAL PINS                                                          #\n##############################################################################\n\n# called during setup\ndef ext_hal_create():           # PLASMAC2\n    global extHalPins\n    extHalPins = {}\n    for pin in ['abort', 'power', 'run', 'pause', 'run-pause', 'touchoff', 'probe-test',\n                'torch-pulse', 'frame-job']:\n        comp.newpin('ext.{}'.format(pin), hal.HAL_BIT, hal.HAL_IN)\n        extHalPins[pin] = {'state': False, 'last': False}\n\n# called every cycle by user_live_update\ndef ext_hal_watch():            # PLASMAC2\n    global extHalPins, isIdle, isIdleHomed, isPaused, isRunning, probePressed, torchPressed\n    for pin in extHalPins:\n        state = comp['ext.{}'.format(pin)]\n        if state != extHalPins[pin]['last']:\n            extHalPins[pin]['last'] = state\n            # pressed commands\n            if state:\n                if pin == 'abort':\n                    commands.task_stop()\n                elif pin == 'power':\n                    commands.onoff_clicked()\n                elif pin == 'run' and isIdleHomed:\n                    commands.task_run()\n                elif pin == 'pause':\n                    if isRunning:\n                        commands.task_pause()\n                    elif isPaused:\n                        commands.task_resume()\n                elif pin == 'run-pause':\n                    if isIdleHomed:\n                        commands.task_run()\n                    elif isRunning:\n                        commands.task_pause()\n                    elif isPaused:\n                        commands.task_resume()\n                elif pin == 'touchoff':\n                    touch_off_xy('1', '0', '0')\n                elif pin == 'probe-test' and probeButton:\n                    user_button_pressed(probeButton, buttonCodes[int(probeButton)])\n                elif pin == 'torch-pulse' and torchButton:\n                    user_button_pressed(torchButton, buttonCodes[int(torchButton)])\n            # released commands\n            else:\n                if pin == 'touchoff':\n                    touch_off_xy('0', '0', '0')\n                elif pin == 'probe-test' and probeButton:\n                    user_button_released(probeButton, buttonCodes[int(probeButton)])\n                elif pin == 'torch-pulse' and torchButton:\n                    user_button_released(torchButton, buttonCodes[int(torchButton)])\n                elif pin == 'frame-job':\n                    num = get_button_num('framing')\n                    if num:\n                        user_button_released(str(num), buttonCodes[num])\n\ndef get_button_num(name):           # PLASMAC2\n    num = None\n    for num in buttonCodes:\n        if buttonCodes[num]['code'] == name:\n            break\n    return num\n\n\n##############################################################################\n# END USER BUTTON                                                                #\n##############################################################################\n\n##############################################################################\n# COLOR CHANGE                                                               #\n##############################################################################\ndef read_colors():              # PLASMAC2\n    global colorFore, colorBack, colorDisable, colorActive\n    global colorWarn, colorVolt, colorOrange, colorYellow\n    colorFore = getPrefs(PREF,'GUI_OPTIONS','Foreground color', '#000000', str)\n    colorBack = getPrefs(PREF,'GUI_OPTIONS','Background color', '#d9d9d9', str)\n    colorDisable = getPrefs(PREF,'GUI_OPTIONS','Disabled color', '#a3a3a3', str)\n    colorActive = getPrefs(PREF,'GUI_OPTIONS','Active color', '#00cc00', str)\n    colorWarn = getPrefs(PREF,'GUI_OPTIONS','Warning color', '#dd0000', str)\n    colorVolt = getPrefs(PREF,'GUI_OPTIONS','Voltage color', '#0000ff', str)\n    colorOrange = '#FFAA00'\n    colorYellow = '#FFFF00'\n\ndef color_user_buttons(fgc='#000000',bgc='#d9d9d9'):            # PLASMAC2\n#    for b in criticalButtons:\n#        rC('.fbuttons.button' + str(b),'configure','-bg',colorWarn)\n    # user button entries in setup frame\n    for n in range(1, 20):\n        # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-fg',colorBack)\n        # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-bg',colorFore)\n        # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-fg',colorBack)\n        # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-bg',colorFore)\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-fg',colorFore)\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-bg',colorBack)\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-fg',colorFore)\n        rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-bg',colorBack)\n    \n\n        # ~ if buttonNames[n]['name']:\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-fg',colorFore)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-bg',colorBack)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-fg',colorFore)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-bg',colorBack)\n        # ~ else:\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-fg',colorBack)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'configure','-bg',colorFore)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-fg',colorBack)\n            # ~ rC(fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'configure','-bg',colorFore)\n\ndef get_all_children(parent):           # PLASMAC2\n    _list = []\n    _tup = rC('winfo','children',parent)\n    for item in _tup:\n        _list.append(item)\n    for item in _list:\n        if rC('winfo','children',item):\n            _tup = (rC('winfo','children',item))\n            for item in _tup:\n                _list.append(item)\n    return _list\n\ndef color_change():             # PLASMAC2\n    widgetTypes = []\n    for child in get_all_children('.'):\n        w = rC('winfo','class',child)\n        #print(w)\n        # root window\n        rC('.','configure','-bg',colorBack)\n        t.tag_configure(\"ignored\", background=\"#ffffff\", foreground=\"#808080\")\n        t.tag_configure(\"lineno\", foreground=colorActive)\n        t.tag_configure(\"executing\", background=colorFore, foreground=colorBack)\n        # all widgets\n        try:\n            rC(child,'configure','-fg',colorFore)\n        except:\n            pass\n        try:\n#FIXME: I am sitting on the fence with this\n#            if w in ['Spinbox'] or (w == 'Entry' and child[:-2] in comboEntries):\n#                rC(child,'configure','-bg',ourWhite)\n#            else:\n#                rC(child,'configure','-bg',bgc)\n            rC(child,'configure','-bg',colorBack)\n        except:\n            pass\n        try:\n            rC(child,'configure','-disabledforeground',colorDisable)\n        except:\n            pass\n        try:\n            rC(child,'configure','-activebackground',colorFore)\n        except:\n            pass\n        try:\n            rC(child,'configure','-insertbackground',colorFore)\n        except:\n            pass\n        try:\n            rC(child,'configure','-readonlybackground',colorBack)\n        except:\n            pass\n        try:\n            rC(child,'configure','-buttonbackground',colorBack)\n        except:\n            pass\n       # try:\n       #     rC(child,'configure','-highlightthickness',1)\n       # except:\n       #     pass\n        try:\n            rC(child,'configure','-highlightcolor',colorFore)\n        except:\n            pass\n        try:\n            rC(child,'configure','-highlightbackground',colorFore)\n        except:\n            pass\n        try:\n            rC(child,'configure','-activeforeground',colorBack)\n        except:\n            pass\n        try:\n            rC(child,'configure','-selectbackground',colorFore,'-selectforeground',colorBack)\n        except:\n            pass\n        try:\n            rC(child,'configure','-relief','flat')\n        except:\n            pass\n        try:\n            if w == 'Menu':\n                rC(child,'configure','-selectcolor',colorFore)\n            else:\n                rC(child,'configure','-selectcolor',colorActive)\n        except:\n            pass\n        try:\n            # color the trough of override scales and user button scrollbars\n            rC(child,'configure','-troughcolor',colorFore,'-activebackground',colorBack)\n            # color the trough of combobox lists\n            rC('option','add','*Scrollbar.troughColor',colorFore)\n            rC('option','add','*Scrollbar.background',colorBack)\n            rC('option','add','*Scrollbar.activeBackground',colorBack)\n        except:\n            pass\n        # all comboboxes except for the jog increment Combobox\n        \n        if w == 'ComboBox':\n            rC(child,'configure','-background',colorBack)\n            rC(child,'configure','-selectbackground',colorFore)\n            rC(child,'configure','-selectforeground',colorBack)\n            rC(child,'configure','-relief','flat')\n            # lose the arrow\n            rC('pack','forget','{}.a'.format(child))\n        # the entry of the jog increment combobox\n        elif '.jogincr' in child and w == 'Entry': \n            rC(child,'configure','-disabledforeground',colorFore)\n        # the listbox of the jog increment combobox\n        elif '.jogincr' in child and w == 'Listbox': \n            rC(child,'configure','-selectforeground',colorBack)\n            rC(child,'configure','-selectbackground',colorFore)\n            rC(child,'configure','-relief','flat')\n        # all checkbuttons\n        elif w in ['Checkbutton']:\n            rC(child,'configure','-relief','flat','-overrelief','raised','-bd',1,'-indicatoron',0)\n            #rC(child,'-indicatoron',0)\n    # notebook tabs - cutrecs is also done each time it is raised\n    for nbook in [ftabs, fright]:\n        pages = (rC(nbook,'pages'))\n        for page in pages:\n            rC(nbook,'itemconfigure',page,'-foreground',colorFore,'-background',colorBack,'-activeforeground',colorBack,'-activebackground',colorFore)\n    pagest = (rC(fsetup + '.tabs','pages'))\n    for page in pagest:\n        rC(fsetup + '.tabs','itemconfigure',page,'-foreground',colorFore,'-background',colorBack,'-activeforeground',colorBack,'-activebackground',colorFore)\n    rC(fsetup + '.tabs.fbutt.r.ubuttons','configure','-background',colorBack)\n    #rC(fsetup + '.tabs.fbutt.r.ubuttons','_themechanged')\n    rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','configure','-bg',colorBack)\n    #print(rC(fsetup + '.tabs.fbutt.r.ubuttons.frame','configure'))\n    color_user_buttons()\n    #color_torch()\n#FIXME: I am sitting on the fence with this\n    # gcode view\n#    rC('.pane.bottom.t.text','configure','-foreground',colorBlue)\n#FIXME: I am sitting on the fence with this\n    # dro\n#    rC('.pane.top.right.fnumbers.text','configure','-foreground',colorActive,'-background',ourBlack)\n    # the color setup buttons\n    rC(fsetup + '.tabs.fgui.m.colors.fore','configure','-bg',colorFore,'-activebackground',colorFore)\n    rC(fsetup + '.tabs.fgui.m.colors.back','configure','-bg',colorBack,'-activebackground',colorBack)\n    rC(fsetup + '.tabs.fgui.m.colors.disable','configure','-bg',colorDisable,'-activebackground',colorDisable)\n    rC(fsetup + '.tabs.fgui.m.colors.active','configure','-bg',colorActive,'-activebackground',colorActive)\n    rC(fsetup + '.tabs.fgui.m.colors.warn','configure','-bg',colorWarn,'-activebackground',colorWarn)\n    rC(fsetup + '.tabs.fgui.m.colors.volt','configure','-bg',colorVolt,'-activebackground',colorVolt)\n    # notifications\n   \n    rC('option','add','*!notification2.Frame.Background',colorBack)\n    rC('option','add','*!notification2.Frame.Label.Foreground',colorFore)\n    rC('option','add','*!notification2.Frame.Label.Background',colorBack)\n    rC('option','add','*!notification2.Frame.Button.Background',colorBack)\n    rC('option','add','*!notification2.Frame.Button.activeBackground',colorBack)\n    rC('option','add','*!notification2.Frame.Button.highlightThickness', 0)\n\ndef color_set(option):          # PLASMAC2\n    global colorFore, colorBack, colorDisable, colorActive, colorWarn, colorVolt\n    if option == 'fore':\n        color = colorFore\n    elif option == 'back':\n        color = colorBack\n    elif option == 'disable':\n        color = colorDisable\n    elif option == 'active':\n        color = colorActive\n    elif option == 'warn':\n       color = colorWarn\n    elif option == 'volt':\n       color = colorVolt\n    else:\n        color = '#000000'\n    colors = askcolor(color, title=_('plasmac2 Color Selector'))\n    if colors[1]:\n        if option == 'fore':\n            colorFore = colors[1]\n        elif option == 'back':\n            colorBack = colors[1]\n        elif option == 'disable':\n            colorDisable = colors[1]\n        elif option == 'active':\n            colorActive = colors[1]\n        elif option == 'warn':\n            colorWarn = colors[1]\n        elif option == 'volt':\n            colorVolt = colors[1]\n        color_change()\n\n############################################################\n##############   setup  #########'##############################\n################### start  #########'\n############################################################\ndef enable_menus(state):            # PLASMAC2\n    state = 'normal' if state else 'disabled'\n    menus = ['File', 'Machine', 'View','Setup', 'Help']\n    for menu in menus:\n        rC('.menu','entryconfig',menu,'-state',state)\n\n\ndef setup_toggle(state):            # PLASMAC2\n    if int( state):\n        hide_default()\n        enable_menus(False)\n        rC('grid','.toolsetup','-column',0,'-row',0,'-columnspan',3,'-sticky','nesw')\n        rC('grid',fsetup,'-column',0,'-row',1,'-rowspan',3,'-sticky','nsew')\n        #keyboard_bindings(False)\n    else:\n        rC('grid','forget','.toolsetup')\n        rC('grid','forget',fsetup)\n        show_default()\n\n\ndef hide_default():                 # PLASMAC2\n    rC('grid','forget','.pane')\n    rC('grid','forget','.fbuttons')\n    #rC('grid','forget','.fconv')\n    rC('grid','forget','.toolbar')\n    #rC('grid','forget','.toolmat')\n    #rC('grid','forget','.runs')\n\ndef show_default():                 # PLASMAC2\n    rC('grid','.toolbar','-column',0,'-row',0,'-columnspan',3,'-sticky','nesw')\n    rC('grid','.pane','-column',0,'-row',1,'-rowspan',2,'-sticky','nsew')\n    #rC('grid','.fbuttons','-column',0,'-row',3,'-rowspan',2,'-sticky','nsew','-padx',0,'-pady',0)\n    hide_buttonframe()\n    enable_menus(True)\n    #keyboard_bindings(pVars.kbShortcuts.get())\n    rC('focus','.')\n\ndef close_window():             # PLASMAC2\n    if pVars.closeDialog.get():\n        msgs = ''\n        text2 = _('Do you really want to close LinuxCNC ?')\n        msgs  += text2\n        if not show_dialog('yesno', _('CONFIRM CLOSE'), msgs):\n            return\n    putPrefs(PREF,'GUI_OPTIONS', 'Window last', rC('winfo','geometry',root_window), str)\n    root_window.destroy()\n        \n\n###################################\n###   timer  ###############\n##################################\ndef secs_to_hms(s):\n    m, s = divmod(int(s), 60)\n    h, m = divmod(m, 60)\n    return '{:02.0f}:{:02.0f}:{:02.0f}'.format(h, m, s)\n\ndef hms_to_secs(hms):\n    h, m, s = hms.split(':')\n    return int(h)*3600 + int(m)*60 + int(s)\n\ndef save_total_stats():\n    val = hms_to_secs(pVars.runT.get())\n    pVars.runS.set(val)\n    putPrefs(PREF,'STATISTICS', 'Program run time', val, int)\n\ndef clear_job_stats():\n    pVars.runJ.set('00:00:00')\n\ndef reset_all_stats(stat):\n    if stat == 'run':\n        pVars.runS.set(0)\n        pVars.runJ.set('00:00:00')\n        pVars.runT.set('00:00:00')\n        putPrefs(PREF,'STATISTICS', 'Program run time', 0, int)\n\n\n\n#########################################\n#### setup start   ###################\n#########################################\n\nfrom tkinter import messagebox\nfrom tkinter import simpledialog\nfrom tkinter.colorchooser import askcolor\nfrom math import radians, atan, degrees\nfrom collections import OrderedDict\nfrom glob import glob as GLOB\nfrom shutil import copy as COPY\nfrom shutil import which as WHICH\nfrom importlib import reload\n\n# set the default font\n#fontName = 'sans'\nfontName = 'mono'\nfontSize = startFontSize = '10'\n# make some widget names to save typing\nftop = '.pane.top'\nftabs = ftop + '.tabs'\nfright = ftop + '.right'\nfmanual = ftabs + '.fmanual'\nfaxes = fmanual + '.axes'\nfjoints = fmanual + '.joints'\nfjogf = fmanual + '.jogf'\nfoverride = fmanual + '.override'\n#flimitovr = fmanual + '.jogf.limitovr'\n#fjogiovr = fmanual + '.jogf.inhibitovr'\nfmdi = ftabs + '.fmdi'\nfsetup = '.setup'\npVars = nf.Variables(root_window,\n             \n             ('closeDialog', BooleanVar),\n             ('kbShortcuts', BooleanVar),\n             ('winSize', StringVar),\n             ('winScreen', StringVar),\n             ('startLine', IntVar),\n             ('rflActive', BooleanVar),\n             ('preRflFile', StringVar),\n             ('jogSpeed', DoubleVar),\n             ('fontSize', StringVar),\n             ('fontSize', StringVar),\n             ('screensmall', StringVar),\n             ('hidejog', BooleanVar),\n             ('hiderapid', BooleanVar),\n             ('hidevel', BooleanVar),\n             ('buttlab', BooleanVar),\n             ('hidebuttf', BooleanVar),\n             ('editmode', BooleanVar),\n             ('editsize', BooleanVar),\n             ('editfile', StringVar),\n             ('load_last', BooleanVar),\n             ('runJ', StringVar),\n             ('runT', StringVar),\n             ('runS', IntVar),\n\n             )\nrestoreSetup = {}\npVars.fontSize.set(getPrefs(PREF,'GUI_OPTIONS','Font size', '10', str))\n#fontSize = pVars.fontSize.get()\nrestoreSetup['fontSize'] = pVars.fontSize.get()\nread_colors()\ntogglePins = {}\nprompt_areyousure = prompt_areyousure\nlastMotionMode = None\n\nrC('.menu','insert',4,'command','-command','setup_toggle 1')\n#rC('.menu','add','command','-command','setup_toggle 1')\nrC('setup_menu_accel','.menu',4,_('_Setup'))\n\n##############################################################################\n# GUI ALTERATIONS AND ADDITIONS                                              #\n##############################################################################\n\n#######   DOIN THE MANUAL TAB\n\n\ndef ja_button_setup(widget, button, text):\n    rC('radiobutton', widget,'-value',button,'-text',text,'-anchor','center', \\\n       '-variable','ja_rbutton','-command','ja_button_activated','-padx',10,'-pady',10, \\\n       '-indicatoron',0,'-bd',2,'-highlightthickness',0,'-selectcolor',colorActive)\n       \ndef ja_button_activated():\n    if vars.ja_rbutton.get() in 'xyzabcuvw':\n        widget = getattr(widgets, 'axis_%s' % vars.ja_rbutton.get())\n        widget.focus()\n        rC(fjogf + '.zerohome.zero','configure','-text',vars.ja_rbutton.get().upper() + '0')\n        #if not homing_order_defined:\n         #   widgets.homebutton.configure(text = _('Home') + ' ' + vars.ja_rbutton.get().upper() )\n    else:\n        widget = getattr(widgets, 'joint_%s' % vars.ja_rbutton.get())\n        widget.focus()\n    commands.axis_activated()\n\n\ndef joint_mode_switch(a, b, c):\n    global lastMotionMode\n    if vars.motion_mode.get() == linuxcnc.TRAJ_MODE_FREE and s.kinematics_type != linuxcnc.KINEMATICS_IDENTITY:\n        rC('grid','forget',fmanual + '.axes')\n        rC('grid',fmanual + '.joints','-column','0','-row','0','-padx','2','-sticky','w')\n        widget = getattr(widgets, 'joint_%d' % 0)\n        widget.focus()\n        vars.ja_rbutton.set(0)\n    elif lastMotionMode == linuxcnc.TRAJ_MODE_FREE or not lastMotionMode:\n        rC('grid','forget',fmanual + '.joints')\n        rC('grid',fmanual + '.axes','-column','0','-row','0','-padx','2','-sticky','w','-columnspan',2)\n        widget = getattr(widgets, 'axis_%s' % first_axis)\n        widget.focus()\n        vars.ja_rbutton.set(first_axis)\n    lastMotionMode = vars.motion_mode.get()\n\n\nrC('grid','forget',fmanual + '.axis')\nrC('grid','forget',fmanual + '.jogf')\nrC('grid','forget',fmanual + '.space1')\n#rC('grid','forget',fmanual + '.spindlel')\n#rC('grid','forget',fmanual + '.spindlef')\nrC('grid','forget',fmanual + '.space2')\nrC('grid','forget',fmanual + '.coolant')\nrC('grid','forget',fmanual + '.mist')\nrC('grid','forget',fmanual + '.flood')\n\n# destroy existing axes and joints\nrC('destroy',faxes)\nrC('destroy',fjoints)\n# create widgets\nrC('labelframe',faxes,'-text',_('Axis:'),'-relief','flat','-bd',0)\nrC('labelframe',fjoints,'-text',_('Joint:'),'-relief','flat','-bd',0)\n# make joints radiobuttons\nfor number in range(0,linuxcnc.MAX_JOINTS):\n    ja_button_setup(fjoints + '.joint' + str(number), number, number)\n# populate joints frame\ncount = 0\nfor row in range(0,2):\n    for column in range(0,5):\n        if count == jointcount: break\n        pad = (0,0) if column == 0 else (8,0)\n        rC('grid',fjoints + '.joint' + str(count),'-row',row,'-column',column,'-padx',pad)\n        count += 1\n# make axis radiobuttons\nfor letter in 'xyzabcuvw':\n    ja_button_setup(faxes + '.axis' + letter, letter, letter.upper())\n# populate the axes frame\ncount = 0\nletters = 'xyzabcuvw'\nfirst_axis = ''\nfor row in range(0,2):\n    for column in range(0,5):\n        if letters[count] in trajcoordinates:\n            if first_axis == '':\n                first_axis = letters[count]\n            pad = (0,0) if column == 0 else (8,0)\n            rC('grid',faxes + '.axis' + letters[count],'-row',row,'-column',column,'-padx',pad)\n        count += 1\n        if count == 9: break\n\n# rework the jogf frame\nrC('destroy',fjogf)\n# create the widgets\nrC('frame',fjogf)\nrC('labelframe',fjogf + '.jog','-text',_('Jog:'),'-relief','flat','-bd',0)\nrC('button',fjogf + '.jog.jogminus','-command','if ![is_continuous] {jog_minus 1}','-height',1,'-width',1,'-text','-')\nrC('button',fjogf + '.jog.jogplus','-command','if ![is_continuous] {jog_plus 1}','-height',1,'-width',1,'-text','+')\nrC('combobox',fjogf + '.jog.jogincr','-editable',0,'-textvariable','jogincrement','-value',_('Continuous'),'-width',10)\nrC(fjogf + '.jog.jogincr','list','insert','end',_('Continuous'))\nif increments:\n    rC(fjogf + '.jog.jogincr','list','insert','end',*increments)\nrC('labelframe',fjogf + '.zerohome','-text',_('Zero:'),'-relief','flat','-bd',0)\nrC('button',fjogf + '.zerohome.home','-command','home_joint','-height',1,'-width',8,'-padx',0)\nrC('setup_widget_accel',fjogf + '.zerohome.home',_('Home Axis'))\nrC('button',fjogf + '.zerohome.zero','-command','touch_off_system','-height',1,'-width',5,'-padx',0)\nrC('setup_widget_accel',fjogf + '.zerohome.zero','X0')\nrC('button',fjogf + '.zerohome.zeroxy','-height',1,'-width',5,'-text',_('X0Y0'),'-padx',0)\nrC('button',fjogf + '.zerohome.laser','-height',1,'-width',5,'-textvariable','laserText','-padx',0)\nrC('button',fjogf + '.zerohome.tooltouch','-height',1,'-text','Tool Touch','-command','touch_off_tool','-padx',0) # unused... kept for tk hierarchy\n# widget bindings\nrC('bind',fjogf + '.jog.jogminus','<Button-1>','if [is_continuous] {jog_minus}')\nrC('bind',fjogf + '.jog.jogminus','<ButtonRelease-1>','if [is_continuous] {jog_stop}')\nrC('bind',fjogf + '.jog.jogplus','<Button-1>','if [is_continuous] {jog_plus}')\nrC('bind',fjogf + '.jog.jogplus','<ButtonRelease-1>','if [is_continuous] {jog_stop}')\nrC('bind',fjogf + '.zerohome.zeroxy','<Button-1>','touch_off_xy 1 0 0')\nrC('bind',fjogf + '.zerohome.zeroxy','<ButtonRelease-1>','touch_off_xy 0 0 0')\nrC('bind',fjogf + '.zerohome.laser','<Button-1>','laser_button_toggled 1 1')\nrC('bind',fjogf + '.zerohome.laser','<ButtonRelease-1>','laser_button_toggled 0 1')\n# populate the frame\nrC('grid',fjogf + '.jog.jogminus','-row',0,'-column',0,'-sticky','nsew')\nrC('grid',fjogf + '.jog.jogincr','-row',0,'-column',1,'-sticky','nsew','-padx',8)\nrC('grid',fjogf + '.jog.jogplus','-row',0,'-column',2,'-sticky','nsew')\nrC('grid',fjogf + '.jog','-row',0,'-column',0,'-sticky','ew')\nrC('grid',fjogf + '.zerohome.home','-row',0,'-column',0,'-padx',(0,4))\nrC('grid',fjogf + '.zerohome.zero','-row',0,'-column',1,'-padx',(0,4))\nrC('grid',fjogf + '.zerohome.zeroxy','-row',0,'-column',2,'-padx',(0,4))\nrC('grid',fjogf + '.zerohome.tooltouch','-row',0,'-column',3,'-padx',(0,4))\nrC('grid',fjogf + '.zerohome','-row',1,'-column',0,'-pady',(2,0),'-sticky','w')\nrC('grid',fjogf,'-column',0,'-row',1,'-padx',2,'-pady',(0,0),'-sticky','w','-columnspan',2)\n\n\n# make home button a home all button if required\nif homing_order_defined:\n    if ja_name.startswith('A'):\n        hbName = 'axes'\n    else:\n        hbName ='joints'\n    widgets.homebutton.configure(text = _('Home All'), command = 'home_all_joints')\nelse:\n    widgets.homebutton.configure(text = _('Home') + ' X' )\n\nrC('button',fjogf + '.override') # dummy button to placate original axis code\n\n\n\n################    end manual tab\n\n\n\n\n# keep tab label sizes the same\n#rC(ftabs,'configure','-homogeneous',True)\n#rC(fright,'configure','-homogeneous',True)\n\n# reduce margins on manual/mdi tabs\nrC(ftabs,'configure','-internalborderwidth',5)\n#rC('grid','columnconfigure',fmanual,0,'-weight',1)\n#rC('grid','columnconfigure',fmanual,99,'-weight',0)\n\n# reduce margins on preview tabs\nrC(fright,'configure','-internalborderwidth',0)\n\n# new setup toolbar\n# create widgets\nrC('frame','.toolsetup','-borderwidth',1,'-relief','raised')\nrC('Button','.toolsetup.save','-command','save_setup_clicked','-width',8,'-takefocus',0,'-text',_('Save All'),'-padx',0)\nrC('Button','.toolsetup.reload','-command','load_setup_clicked','-width',8,'-takefocus',0,'-text',_('Reload'),'-padx',0)\nrC('Button','.toolsetup.add','-command','user_button_add','-width',8,'-takefocus',0,'-text',_('Add'),'-padx',0)\nrC('Button','.toolsetup.bkp','-command','backup_clicked','-width',8,'-takefocus',0,'-text',_('Backup'),'-padx',0)\nrC('Button','.toolsetup.close','-command','setup_toggle 0','-width',8,'-takefocus',0,'-text',_('Close'),'-padx',0)\n# populate the tool bar\nrC('pack','.toolsetup.save','-side','left')\nrC('pack','.toolsetup.reload','-side','left','-padx',(8,0))\nrC('pack','.toolsetup.add','-side','left','-padx',(8,0))\nrC('pack','.toolsetup.bkp','-side','left','-padx',(8,0))\nrC('pack','.toolsetup.close','-side','left','-padx',(16,0))\nrC('grid','forget','.toolsetup')\n\n# new settings frame\nrC('frame',fsetup)\n#####################################################################################\n####  SETUP TABS\n###########################################################################################\n\nrC('NoteBook',fsetup + '.tabs')\nrC(fsetup + '.tabs','insert','end','gui','-text',' GUI ')\nrC(fsetup + '.tabs','insert','end','butt','-text',' BUTT ')\nrC('pack',fsetup + '.tabs','-fill','both','-expand',1)\nrC(fsetup + '.tabs','configure','-arcradius','8','-homogeneous',True,'-tabpady','1''1')\n\nrC(fsetup + '.tabs','raise','gui')\n\n\n############################################################################################\n# left panel\nrC('frame',fsetup + '.tabs.fgui.l')\n# gui frame\nrC('labelframe',fsetup + '.tabs.fgui.l.gui','-text','GUI','-relief','groove')\nrC('label',fsetup + '.tabs.fgui.l.gui.closedialogL','-text','Close Dialog','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.closedialog','-variable','closeDialog','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.wsizeL','-text','Window Size','-width', 13,'-anchor','e')\nrC('ComboBox',fsetup + '.tabs.fgui.l.gui.wsize','-modifycmd','set_window_size','-textvariable','winSize','-bd',1,'-width',10,'-justify','right','-editable',0)\n#rC(fsetup + '.tabs.fgui.l.gui.wsize','configure','-values',['default','last','fullscreen','maximized','small','medium'])\nrC(fsetup + '.tabs.fgui.l.gui.wsize','configure','-values',['default','small','medium'])\n\nrC('label',fsetup + '.tabs.fgui.l.gui.wscreenL','-text','Window Screen','-width', 13,'-anchor','e')\nrC('ComboBox',fsetup + '.tabs.fgui.l.gui.wscreen','-modifycmd','set_window_screen','-textvariable','winScreen','-bd',1,'-width',10,'-justify','right','-editable',0)\nrC(fsetup + '.tabs.fgui.l.gui.wscreen','configure','-values',['default','last','fullscreen','maximized'])\n\n\nrC('label',fsetup + '.tabs.fgui.l.gui.fsizeL','-text','Font Size','-anchor','e')\nrC('ComboBox',fsetup + '.tabs.fgui.l.gui.fsize','-modifycmd','font_size_changed','-textvariable','fontSize','-bd',1,'-width',10,'-justify','right','-editable',0)\nrC(fsetup + '.tabs.fgui.l.gui.fsize','configure','-values',[9,10,11,12,13,14,15,16])\n#rC('label',fsetup + '.tabs.fgui.l.gui.coneL','-text','Cone Size','-anchor','e')\n#rC('ComboBox',fsetup + '.tabs.fgui.l.gui.cone','-modifycmd','cone_size_changed','-textvariable','coneSize','-bd',1,'-width',10,'-justify','right','-editable',0)\n#rC(fsetup + '.tabs.fgui.l.gui.cone','configure','-values',[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0])\n#rC('label',fsetup + '.tabs.fgui.l.gui.zoomL','-text','Table Zoom','-anchor','e')\n#rC('spinbox',fsetup + '.tabs.fgui.l.gui.zoom','-width', 10,'-justify','right','-wrap','true','-from',0.1,'-to',10.0,'-increment',0.1,'-format','%0.1f')\n#rC(fsetup + '.tabs.fgui.l.gui.zoom','configure','-validate','key','-vcmd','{} %W {} {} %P %s'.format(valspin,'flt',1))\n#spinBoxes.append(fsetup + '.tabs.fgui.l.gui.zoom')\n#rC('label',fsetup + '.tabs.fgui.l.gui.kbShortcutsL','-text','Use KB Shortcuts','-anchor','e')\n#rC('checkbutton',fsetup + '.tabs.fgui.l.gui.kbShortcuts','-variable','kbShortcuts','-command','kb_shortcuts_changed','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.loadlastL','-text','Load Last File','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.loadlast','-variable','load_last','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.screensmallL','-text','Show Something','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.screensmall','-variable','set_screensmall','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.hidejogL','-text','Hide Jog','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.hidejog','-variable','hidejog','-command','hide_jog','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.hiderapidL','-text','Hide Rapid','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.hiderapid','-variable','hiderapid','-command','hide_rapid','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.hidevelL','-text','Hide Max Vel.','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.hidevel','-variable','hidevel','-command','hide_velocity','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.buttlabL','-text','Show Button Label','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.buttlab','-variable','buttlab','-command','toolbar_config','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l.gui.buttflabL','-text','Hide Button Frame','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l.gui.buttflab','-variable','hidebuttf','-width',2,'-anchor','w','-indicatoron',0)\n#rC('checkbutton',fsetup + '.tabs.fgui.l.gui.buttflab','-variable','hidebuttf','-command','hide_buttonframe','-width',2,'-anchor','w','-indicatoron',0)\n\n\n# populate gui frame\nrC('grid',fsetup + '.tabs.fgui.l.gui.closedialogL','-column',0,'-row',0,'-sticky','e','-padx',(4,0),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.closedialog','-column',1,'-row',0,'-sticky','e','-padx',(0,4),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.wsizeL','-column',0,'-row',1,'-sticky','e','-padx',(4,0),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.wsize','-column',1,'-row',1,'-sticky','e','-padx',(0,4),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.wscreenL','-column',0,'-row',2,'-sticky','e','-padx',(4,0),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.wscreen','-column',1,'-row',2,'-sticky','e','-padx',(0,4),'-pady',(4,0))\nrC('grid',fsetup + '.tabs.fgui.l.gui.fsizeL','-column',0,'-row',3,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l.gui.fsize','-column',1,'-row',3,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.coneL','-column',0,'-row',3,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.cone','-column',1,'-row',3,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.zoomL','-column',0,'-row',4,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.zoom','-column',1,'-row',4,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.loadlastL','-column',0,'-row',5,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.loadlast','-column',1,'-row',5,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.kbShortcutsL','-column',0,'-row',5,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ #rC('grid',fsetup + '.tabs.fgui.l.gui.kbShortcuts','-column',1,'-row',5,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hidejogL','-column',0,'-row',7,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hidejog','-column',1,'-row',7,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hiderapidL','-column',0,'-row',8,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hiderapid','-column',1,'-row',8,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hidevelL','-column',0,'-row',9,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.hidevel','-column',1,'-row',9,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l.gui.buttlabL','-column',0,'-row',10,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l.gui.buttlab','-column',1,'-row',10,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.buttflabL','-column',0,'-row',11,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n# ~ rC('grid',fsetup + '.tabs.fgui.l.gui.buttflab','-column',1,'-row',11,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid','columnconfigure',fsetup + '.tabs.fgui.l.gui',0,'-weight',1)\n#populate left panel\nrC('grid',fsetup + '.tabs.fgui.l.gui','-column',0,'-row',0,'-sticky','new')\n\n#######################################################################################\n#######################################################################################\n# left2 panel\nrC('frame',fsetup + '.tabs.fgui.l2')\n# gui frame\nrC('labelframe',fsetup + '.tabs.fgui.l2.gui','-text','CNC GUI','-relief','groove')\nrC('label',fsetup + '.tabs.fgui.l2.gui.loadlastL','-text','Load Last File','-anchor','e')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.loadlast','-variable','load_last','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l2.gui.hidejogL','-text','Hide Jog','-anchor','w')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.hidejog','-variable','hidejog','-command','hide_jog','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l2.gui.hiderapidL','-text','Hide Rapid','-anchor','w')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.hiderapid','-variable','hiderapid','-command','hide_rapid','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l2.gui.hidevelL','-text','Hide Max Vel.','-anchor','w')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.hidevel','-variable','hidevel','-command','hide_velocity','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l2.gui.buttlabL','-text','Show Button Label','-anchor','w')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.buttlab','-variable','buttlab','-command','toolbar_config','-width',2,'-anchor','w','-indicatoron',0)\nrC('label',fsetup + '.tabs.fgui.l2.gui.buttflabL','-text','Hide Button Frame','-anchor','w')\nrC('checkbutton',fsetup + '.tabs.fgui.l2.gui.buttflab','-variable','hidebuttf','-width',2,'-anchor','w','-indicatoron',0)\n#rC('checkbutton',fsetup + '.tabs.fgui.l2.gui.buttflab','-variable','hidebuttf','-command','hide_buttonframe','-width',2,'-anchor','w','-indicatoron',0)\n\n\n# populate cncgui frame\nrC('grid',fsetup + '.tabs.fgui.l2.gui.loadlastL','-column',0,'-row',5,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.loadlast','-column',1,'-row',5,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hidejogL','-column',0,'-row',7,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hidejog','-column',1,'-row',7,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hiderapidL','-column',0,'-row',8,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hiderapid','-column',1,'-row',8,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hidevelL','-column',0,'-row',9,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.hidevel','-column',1,'-row',9,'-sticky','e','-padx',(0,4),'-pady',(4,4))\n#rC('grid',fsetup + '.tabs.fgui.l2.gui.buttlabL','-column',0,'-row',10,'-sticky','e','-padx',(4,0),'-pady',(4,4))\n#rC('grid',fsetup + '.tabs.fgui.l2.gui.buttlab','-column',1,'-row',10,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.buttflabL','-column',0,'-row',11,'-sticky','e','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2.gui.buttflab','-column',1,'-row',11,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid','columnconfigure',fsetup + '.tabs.fgui.l2.gui',0,'-weight',1)\n#populate left panel\nrC('grid',fsetup + '.tabs.fgui.l2.gui','-column',0,'-row',0,'-sticky','new')\n\n\n#########################################################################################\n# middle panel for utilities\nrC('frame',fsetup + '.tabs.fgui.m')\n# utilities frame\n#rC('labelframe',fsetup + '.tabs.fgui.m.utilities','-text','Utilities','-relief','groove')\n#rC('button',fsetup + '.tabs.fgui.m.utilities.offsets','-command','set_peripheral_offsets','-text','Set Offsets')\n# populate utilities frame\n#rC('grid',fsetup + '.tabs.fgui.m.utilities.offsets','-column',0,'-row',0,'-sticky','new','-padx',4,'-pady',(0,4))\n#rC('grid','columnconfigure',fsetup + '.tabs.fgui.m.utilities',0,'-weight',1)\n# color frame\nrC('labelframe',fsetup + '.tabs.fgui.m.colors','-text','Colors','-relief','groove')\nrC('label',fsetup + '.tabs.fgui.m.colors.foreL','-width', 13,'-text','Foreground','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.fore','-command','color_set fore')\nrC('label',fsetup + '.tabs.fgui.m.colors.backL','-width', 13,'-text','Background','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.back','-command','color_set back')\nrC('label',fsetup + '.tabs.fgui.m.colors.disableL','-width', 13,'-text','Disabled','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.disable','-command','color_set disable')\nrC('label',fsetup + '.tabs.fgui.m.colors.activeL','-width', 13,'-text','Active','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.active','-command','color_set active')\nrC('label',fsetup + '.tabs.fgui.m.colors.warnL','-width', 13,'-text','Warning','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.warn','-command','color_set warn')\nrC('label',fsetup + '.tabs.fgui.m.colors.voltL','-width', 13,'-text','Label Value','-anchor','e')\nrC('button',fsetup + '.tabs.fgui.m.colors.volt','-command','color_set volt')\n# populate color frame\nrC('grid',fsetup + '.tabs.fgui.m.colors.foreL','-column',0,'-row',0,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.fore','-column',1,'-row',0,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.backL','-column',0,'-row',1,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.back','-column',1,'-row',1,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.disableL','-column',0,'-row',2,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.disable','-column',1,'-row',2,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.activeL','-column',0,'-row',3,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.active','-column',1,'-row',3,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.warnL','-column',0,'-row',4,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.warn','-column',1,'-row',4,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.voltL','-column',0,'-row',5,'-sticky','e','-padx',4,'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m.colors.volt','-column',1,'-row',5,'-sticky','e','-padx',(0,4),'-pady',(4,4))\nrC('grid','columnconfigure',fsetup + '.tabs.fgui.m.colors',0,'-weight',1)\n# populate middle panel\n#rC('grid',fsetup + '.tabs.fgui.m.utilities','-column',0,'-row',0,'-sticky','new')\nrC('grid',fsetup + '.tabs.fgui.m.colors','-column',0,'-row',1,'-sticky','new')\n\n# right panel for text entries\nrC('labelframe',fsetup + '.tabs.fbutt.r','-text','User Buttons','-relief','groove')\n# frame for torch enable\n\n# frame for user buttons\nrC('ScrollableFrame',fsetup + '.tabs.fbutt.r.ubuttons','-bg',colorBack)\nrC('scrollbar',fsetup + '.tabs.fbutt.r.yscroll','-orient','vertical','-command',fsetup + '.tabs.fbutt.r.ubuttons yview')\nrC(fsetup + '.tabs.fbutt.r.ubuttons','configure','-yscrollcommand',fsetup + '.tabs.fbutt.r.yscroll set')\nrC('pack',fsetup + '.tabs.fbutt.r.yscroll','-side','left','-fill','y')\n\n# user button widgets\nrC('label',fsetup + '.tabs.fbutt.r.ubuttons.frame.numL','-text',' #','-width',2,'-anchor','e')\nrC('label',fsetup + '.tabs.fbutt.r.ubuttons.frame.nameL','-text','Name','-width',14,'-anchor','w')\nrC('label',fsetup + '.tabs.fbutt.r.ubuttons.frame.codeL','-text','Code','-width',40,'-anchor','w')\nfor n in range(1, 20):\n    rC('label',fsetup + '.tabs.fbutt.r.ubuttons.frame.num' + str(n),'-text',str(n),'-anchor','e')\n    rC('entry',fsetup + '.tabs.fbutt.r.ubuttons.frame.name' + str(n),'-bd',1,'-width',14)\n    rC('entry',fsetup + '.tabs.fbutt.r.ubuttons.frame.code' + str(n),'-bd',1,'-width',40)\nrC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.numL','-column',0,'-row',0,'-sticky','ne','-padx',(4,0))\nrC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.nameL','-column',1,'-row',0,'-sticky','nw','-padx',(4,0))\nrC('grid',fsetup + '.tabs.fbutt.r.ubuttons.frame.codeL','-column',2,'-row',0,'-sticky','nw','-padx',(4,4))\n# populate right panel\n#rC('grid',fsetup + '.tabs.fbutt.r.torch','-column',0,'-row',0,'-sticky','new')\n#rC('grid',fsetup + '.tabs.fbutt.r.ubuttons','-column',0,'-row',1,'-sticky','nsew')\n#rC('grid',fsetup + '.tabs.fbutt.r.shutdown','-column',0,'-row',2,'-sticky','new')\n#rC('grid','rowconfigure',fsetup + '.tabs.fbutt.r',1,'-weight',1)\n\n# populate settings frame\nrC('grid',fsetup + '.tabs.fgui.l','-column',0,'-row',0,'-sticky','nw','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.l2','-column',1,'-row',0,'-sticky','nw','-padx',(4,0),'-pady',(4,4))\nrC('grid',fsetup + '.tabs.fgui.m','-column',2,'-row',0,'-sticky','nw','-padx',(4,0),'-pady',(4,4))\n#rC('grid',fsetup + '.tabs.fbutt.r','-column',0,'-row',0,'-sticky','ne','-padx',(0,4),'-pady',(4,4))\nrC('pack',fsetup + '.tabs.fbutt.r.ubuttons','-fill','both','-side','left','-expand',1)\nrC('pack',fsetup + '.tabs.fbutt.r','-fill','both','-side','left','-expand',1)\nrC('grid','columnconfigure',fsetup,0,'-weight',0)\nrC('grid','columnconfigure',fsetup,1,'-weight',0)\nrC('grid','columnconfigure',fsetup,2,'-weight',0)\n#rC('grid','columnconfigure',fsetup,3,'-weight',1)\n#rC('grid','columnconfigure',fsetup,4,'-weight',0)\n\n\n# new button panel\n# create widgets\nrC('frame','.fbuttons','-relief','flat')\n\n# populate frame\nrC('grid','.fbuttons','-column',0,'-row',3,'-rowspan',2,'-sticky','nsew','-padx',0,'-pady',0)\nrC('grid','configure','.fbuttons','-sticky','nesw')\n\n\n############################################################\n##############   setup   #########'##############################\n################### end  #########'\n############################################################\n\n##############################################################################\n# INITIALIZATION                                                             #\n##############################################################################\n\n# reinitialize notifications to keep them on top of new widgets\nnotifications.__init__(root_window)\n#_prompt_areyousure.__init__(root_window)\n#_prompt_touchoff.__init__(root_window)\n#_prompt_float__init__(root_window)\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Exit warning', True, bool)\npVars.closeDialog.set(value)\nrestoreSetup['closeDialog'] = value\nroot_window.protocol('WM_DELETE_WINDOW', close_window)\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Window size', 'default', str).lower().replace(' ','')\nputPrefs(PREF,'GUI_OPTIONS', 'Window size', value, str)\npVars.winSize.set(value)\nrestoreSetup['winSize'] = value\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Window screen', 'default', str).lower().replace(' ','')\nputPrefs(PREF,'GUI_OPTIONS', 'Window screen', value, str)\npVars.winScreen.set(value)\nrestoreSetup['winScreen'] = value\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Hide Max Jog. Slider', False, bool)\npVars.hidejog.set(value)\nrestoreSetup['hidejog'] = value\nhide_jog()\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Hide Max Rapid. Slider', False, bool)\npVars.hiderapid.set(value)\nrestoreSetup['hiderapid'] = value\nhide_rapid()\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Hide Max Velocity Slider', False, bool)\npVars.hidevel.set(value)\nrestoreSetup['hidevel'] = value\nhide_velocity()\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Show Button Label', False, bool)\npVars.buttlab.set(value)\nrestoreSetup['buttlab'] = value\ntoolbar_config()\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Load last file', False, bool)\npVars.load_last.set(value)\nrestoreSetup['load_last'] = value\n\npVars.runS.set(int(getPrefs(PREF,'STATISTICS', 'Program run time', 0, float)))\npVars.runJ.set('00:00:00')\npVars.runT.set(secs_to_hms(pVars.runS.get()))\n\nvalue = getPrefs(PREF,'GUI_OPTIONS', 'Hide Button Frame', False, bool)\npVars.hidebuttf.set(value)\nrestoreSetup['hidebuttf'] = value\n#hide_buttonframe()\n#print(hal.get_info_pins())\nget_coordinate_font = get_coordinate_font\nhalPinList = hal.get_info_pins()\nuser_button_load()\nfont_size_changed()\n#color_change()\nset_window_size()\nhide_jog()\nhide_rapid()\nhide_velocity()\nhide_buttonframe()\n\n\n\n    \n##########################################################\n########       LOAS_LAST FILE   PY3  LCNC 2.9  #############\n########   In ini file under [DISPLAY]  ##################\n########     LOAD_LASTFILE = \tYES       ##################\n##########################################################\n\n#loadlast = inifile.find('DISPLAY', 'LOAD_LASTFILE')\n\nif pVars.load_last.get() == True :\n    load_lastfile = True\nelse:\n    load_lastfile = False\n\nlastfile = \"\"\nrecent = ap.getpref('recentfiles', [], repr)\nif len(recent):\n    lastfile = recent.pop(0)\n\ncode = []\naddrecent = True\nif args:\n    initialfile = args[0]\nelif \"AXIS_OPEN_FILE\" in os.environ:\n    initialfile = os.environ[\"AXIS_OPEN_FILE\"]\nelif inifile.find(\"DISPLAY\", \"OPEN_FILE\"):\n    initialfile = inifile.find(\"DISPLAY\", \"OPEN_FILE\")\nelif os.path.exists(lastfile) and load_lastfile:\n    initialfile = lastfile\n    print (\"Loading \") \n    print (initialfile)\nelif lathe:\n    initialfile = os.path.join(BASE, \"share\", \"axis\", \"images\",\"axis-lathe.ngc\")\n    addrecent = False\nelse:\n    initialfile = os.path.join(BASE, \"share\", \"axis\", \"images\", \"axis.ngc\")\n    addrecent = False\n\nif os.path.exists(initialfile):\n    open_file_guts(initialfile, False, addrecent)\n\n###############################\n######    end load last    ###############\n#########################################\n\n##############################################################################\n# HAL SETUP - CALLED DIRECTLY FROM AXIS ONCE AT STARTUP                      #\n##############################################################################\ndef user_hal_pins():\n    # do user button setup after hal pin creation\n    user_button_setup()\n    color_change()\n    \n    \n\ndef get_button_num(name):\n    num = None\n    for num in buttonCodes:\n        if buttonCodes[num]['code'] == name:\n            break\n    return num\n\n\n#################################################\n##### USER LIVE UPDATE ############################\n#####  this is where pins get updated in ui  ###########\n##################################################\n\nrC('.pane.top.tabs','itemconfigure','edit','-state','disabled')\n\ndef user_live_update():\n   \n   ## loaded file\n    rC('.pane.top.tabs.fedit.program.name','configure','-text', os.path.basename(loaded_file))\n    rC('.pane.top.tabs.fauto.program.name','configure','-text', os.path.basename(loaded_file))\n    ## for edit tab  ##\n    s.poll()\n    if s.paused == True:\n        rC(\".toolbar.program_pause\",\"configure\",\"-state\",'active')\n    if s.task_mode == 2:\n      #rC('.pane.top.tabs','itemconfigure','manual','-state','disabled')\n      #rC('.pane.top.tabs','itemconfigure','mdi','-state','disabled')\n      #rC('.pane.top.tabs','itemconfigure','edit','-state','disabled')\n      #rC('.pane.top.tabs','itemconfigure','edit')\n      #rC('.menu','entryconfig','Setup','-state','disabled')\n      rC('.pane.top.tabs','raise','auto')\n      tab_auto()\n    else:\n      tab_auto() \n      #rC('.pane.top.tabs','itemconfigure','manual','-state','normal')\n      #rC('.pane.top.tabs','itemconfigure','mdi','-state','normal')\n      #rC('.pane.top.tabs','itemconfigure','edit','-state','normal')\n      #rC('.menu','entryconfig','Setup','-state','normal')\n    if pVars.editmode.get() ==True:\n        if pVars.editfile.get() != s.file:\n            load_editfile()\n            \n    for key in togglePins:\n        if hal.get_value(togglePins[key]['pin']) != togglePins[key]['state']:\n            set_toggle_pins(togglePins[key])\n        \n    ####   stats\n    #sNow = int(hal.get_value('plasmac.run-time') + 0.5)\n    #if statValues['run'] != sNow:\n    #    if sNow:\n    #        pVars.runJ.set(secs_to_hms(sNow))\n    #    statValues['run'] = sNow\n      \n\n#################################################\n##### USER LIVE UPDATE ############################\n#####         end             ######################\n##################################################\n\nTclCommands.ja_button_setup = ja_button_setup\nTclCommands.ja_button_activated = ja_button_activated\nTclCommands.joint_mode_switch = joint_mode_switch\n\nTclCommands.keybind_edit = keybind_edit\nTclCommands.keybind_edit_restore = keybind_edit_restore\nTclCommands.edit_full = edit_full\nTclCommands.edit_lower = edit_lower\nTclCommands.edit_size = edit_size\nTclCommands.edit_tab_lower = edit_tab_lower\nTclCommands.edit_tab_raise = edit_tab_raise\nTclCommands.auto_tab_lower = auto_tab_lower\nTclCommands.auto_tab_raise = auto_tab_raise\nTclCommands.tab_auto = tab_auto\n\nTclCommands.button_action = button_action\nTclCommands.user_button_add = user_button_add\nTclCommands.set_toggle_pins = set_toggle_pins\n\nTclCommands.reset_all_stats = reset_all_stats\nTclCommands.close_window = close_window\nTclCommands.load_setup_clicked = load_setup_clicked\nTclCommands.save_setup_clicked = save_setup_clicked\nTclCommands.font_size_changed = font_size_changed\nTclCommands.hide_buttonframe = hide_buttonframe\nTclCommands.hide_jog = hide_jog\nTclCommands.hide_rapid = hide_rapid\nTclCommands.hide_velocity = hide_velocity\nTclCommands.toolbar_config = toolbar_config\nTclCommands.set_screensmall = set_screensmall\nTclCommands.screen_medium = screen_medium\nTclCommands.set_window_size = set_window_size\nTclCommands.set_window_screen = set_window_screen\nTclCommands.read_colors = read_colors\nTclCommands.color_user_buttons = color_user_buttons\nTclCommands.color_change = color_change\nTclCommands.color_set = color_set\nTclCommands.set_screensmall = set_screensmall\nTclCommands.setup_toggle = setup_toggle\nTclCommands.show_default = show_default\nTclCommands.hide_default = hide_default\nTclCommands.enable_menus = enable_menus\nTclCommands.save_editfile = save_editfile\nTclCommands.load_editfile = load_editfile\nTclCommands.printfile = print_file\ncommands = TclCommands(root_window)\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-xyz/custom_postgui.hal",
    "content": "# Include your custom_postgui HAL commands here\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-xyz/postgui_call_list.hal",
    "content": "# These files are loaded post GUI, in the order they appear\n# Generated by stepconf 1.1 at Tue Mar  7 17:21:18 2017\n# If you make changes to this file, they will be\n# overwritten when you run stepconf again\n\nsource custom_postgui.hal\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-xyz/remora-xyz.hal",
    "content": "\n# load the realtime components\n\n\tloadrt [KINS]KINEMATICS\n\tloadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[KINS]JOINTS\n\n\tloadrt remora-spi\n\t#loadrt remora_lpc chip_type=LPC SPI_clk_div=64\n\n\n# estop loopback, SPI comms enable and feedback\n\tnet user-enable-out \t<= iocontrol.0.user-enable-out\t\t=> remora.SPI-enable\n\tnet user-request-enable <= iocontrol.0.user-request-enable\t=> remora.SPI-reset\n\tnet remora-status \t<= remora.SPI-status \t\t\t=> iocontrol.0.emc-enable-in\n\t\n\n# add the remora and motion functions to threads\n\n\taddf remora.read servo-thread\n\taddf motion-command-handler servo-thread\n\taddf motion-controller servo-thread\n\taddf remora.update-freq servo-thread\n\taddf remora.write servo-thread\n\n\n# Joint 0 setup\n\n\tsetp remora.joint.0.scale \t\t[JOINT_0]SCALE\n\tsetp remora.joint.0.maxaccel \t[JOINT_0]STEPGEN_MAXACCEL\n\n\tnet xpos-cmd \t\t<= joint.0.motor-pos-cmd \t=> remora.joint.0.pos-cmd  \n\tnet j0pos-fb \t\t<= remora.joint.0.pos-fb \t=> joint.0.motor-pos-fb\n\tnet j0enable \t\t<= joint.0.amp-enable-out \t=> remora.joint.0.enable\n\n\n# Joint 1 setup\n\n\tsetp remora.joint.1.scale \t\t[JOINT_1]SCALE\n\tsetp remora.joint.1.maxaccel \t[JOINT_1]STEPGEN_MAXACCEL\n\n\tnet j1pos-cmd \t\t<= joint.1.motor-pos-cmd \t=> remora.joint.1.pos-cmd\n\tnet j1pos-fb \t\t<= remora.joint.1.pos-fb \t=> joint.1.motor-pos-fb \n\tnet j1enable \t\t<= joint.1.amp-enable-out \t=> remora.joint.1.enable\n\n\n# Joint 2 setup\n\n\tsetp remora.joint.2.scale \t\t[JOINT_2]SCALE\n\tsetp remora.joint.2.maxaccel \t[JOINT_2]STEPGEN_MAXACCEL\n\n\tnet j2pos-cmd \t\t<= joint.2.motor-pos-cmd \t=> remora.joint.2.pos-cmd\n\tnet j2pos-fb \t\t<= remora.joint.2.pos-fb \t=> joint.2.motor-pos-fb\n\tnet j2enable \t\t<= joint.2.amp-enable-out \t=> remora.joint.2.enable\n\n\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-xyz/remora-xyz.ini",
    "content": "# Basic LinuxCNC config for testing of Remora firmware\n\n[EMC]\nMACHINE = Remora-XYZ\nDEBUG = 0\nVERSION = 1.1\n\n[DISPLAY]\nDISPLAY = axis\nEDITOR = gedit\nPOSITION_OFFSET = RELATIVE\nPOSITION_FEEDBACK = ACTUAL\nARCDIVISION = 64\nGRIDS = 10mm 20mm 50mm 100mm\nMAX_FEED_OVERRIDE = 1.2\nMIN_SPINDLE_OVERRIDE = 0.5\nMAX_SPINDLE_OVERRIDE = 1.2\nDEFAULT_LINEAR_VELOCITY = 50.00\nMIN_LINEAR_VELOCITY = 0\nMAX_LINEAR_VELOCITY = 200.00\nDEFAULT_ANGULAR_VELOCITY = 36.00\nMIN_ANGULAR_VELOCITY = 0\nMAX_ANGULAR_VELOCITY = 45.00\nINTRO_GRAPHIC = linuxcnc.gif\nINTRO_TIME = 5\nPROGRAM_PREFIX = ~/linuxcnc/nc_files\nINCREMENTS = 50mm 10mm 5mm 1mm .5mm .1mm .05mm .01mm\n\n[KINS]\nJOINTS = 3\n#KINEMATICS =trivkins coordinates=XYZ kinstype=BOTH\nKINEMATICS =trivkins coordinates=XYZ\n\n[FILTER]\nPROGRAM_EXTENSION = .py Python Script\npy = python\n\n[TASK]\nTASK = milltask\nCYCLE_TIME = 0.010\n\n[RS274NGC]\nPARAMETER_FILE = linuxcnc.var\n\n[EMCMOT]\nEMCMOT = motmod\nCOMM_TIMEOUT = 1.0\nCOMM_WAIT = 0.010\nBASE_PERIOD = 0\nSERVO_PERIOD = 1000000\n\n[HAL]\nHALFILE = remora-xyz.hal\nPOSTGUI_HALFILE = postgui_call_list.hal\n\n[TRAJ]\nCOORDINATES =  X Y Z \nLINEAR_UNITS = mm\nANGULAR_UNITS = degree\nCYCLE_TIME = 0.010\nDEFAULT_LINEAR_VELOCITY = 50.00\nMAX_LINEAR_VELOCITY = 200.00\nNO_FORCE_HOMING = 1 \n\n[EMCIO]\nEMCIO = io\nCYCLE_TIME = 0.100\nTOOL_TABLE = tool.tbl\n\n[AXIS_X]\nMAX_VELOCITY = 250\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 300.0\n\n[JOINT_0]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 80.0\nFERROR = 2\nMIN_FERROR = 2.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n[AXIS_Y]\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nMIN_LIMIT = -0.01\nMAX_LIMIT = 300.0\n\n[JOINT_1]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -5.0\nMAX_LIMIT = 300.0\nMAX_VELOCITY = 250.0\nMAX_ACCELERATION = 750.0\nSTEPGEN_MAXACCEL = 2000.0\nSCALE = 80.0\nFERROR = 9.0\nMIN_FERROR = 5.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n\n[AXIS_Z]\nOFFSET_AV_RATIO = 0.2\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\n\n[JOINT_2]\nTYPE = LINEAR\nHOME = 0.0\nMIN_LIMIT = -280\nMAX_LIMIT = 280\nMAX_VELOCITY = 5.0\nMAX_ACCELERATION = 200.0\nSTEPGEN_MAXACCEL = 3000.0\nSCALE = 400.0\nFERROR = 5\nMIN_FERROR = 1.0\nHOME_OFFSET = 0.0\nHOME_SEARCH_VEL = 0\nHOME_LATCH_VEL = 0\nHOME_SEQUENCE = 0\n"
  },
  {
    "path": "LinuxCNC/ConfigSamples/remora-xyz/tool.tbl",
    "content": "T1 P1 D0.125000 Z+0.511000 ;1/8 end mill\nT2 P2 D0.062500 Z+0.100000 ;1/16 end mill\nT3 P3 D0.201000 Z+1.273000 ;#7 tap drill\nT99999 P99999 Z+0.100000 ;big tool number\n"
  },
  {
    "path": "LinuxCNC/README.md",
    "content": "LinuxCNC applicable files\n"
  },
  {
    "path": "README.md",
    "content": "\n\n# Remora\n\nThe full documentation is at <https://remora-docs.readthedocs.io/en/latest/>\nNote: Docs have not been updated for 1.0.0_rc\n\nRemora is a free, opensource LinuxCNC component and Programmable Realtime Unit (PRU) firmware to allow LPC176x and STM32F4 based controller boards to be used in conjuction with a Raspberry Pi to implement a LinuxCNC based CNC controller.\n\nHaving a low cost and accessable hardware platform for LinuxCNC is important if we want to use LinuxCNC for 3D printing for example. Having a controller box the size of the printer itself makes no sense in this applicatoin. A SoC based single board computer is ideal in this application. Although developed for 3D Printing, Remora (and LinuxCNC) is highly flexible and configurable for other CNC applications.\n\nRemora has been in use amd development since 2017. Starting on Raspberry Pi 3B and 3B+ eventhough at the time it was percieved that the Raspberry Pi was not a viable hardware for LinuxCNC.\n\nWith the release of the RPi 4 the LinuxCNC community now supports the hardware, with LinuxCNC and Preempt-RT Kernel packages now available from the LinuxCNC repository. This now greatly simplifies the build of a Raspberry Pi based CNC controller.\n"
  }
]