207 Commits

Author SHA1 Message Date
László Monda
7c1431f0ab Bump firmware version to 8.2.2, update changelog, package.json, versions.h 2018-05-09 00:24:24 +02:00
László Monda
772078f8f6 Don't use the link-time optimizer because it screws up the firmware. 2018-05-09 00:19:02 +02:00
László Monda
46244b8f5f Get rid of the -B parameter of make because it's been made redundant by make clean. 2018-05-09 00:11:33 +02:00
László Monda
5fc59f40bc Make clean the left and right firmwares before building them. 2018-05-08 13:00:10 +02:00
László Monda
460cd3c602 Merge pull request #115 from Lauszus/lto
Enable the link-time optimizer for the left side, as this was also us…
2018-05-08 01:39:12 +02:00
Kristian Sloth Lauszus
e391d6dac8 Enable the link-time optimizer for the left side, as this was also used before the Makefile were added 2018-05-08 01:22:52 +02:00
László Monda
41afff5ea4 Update README.md 2018-05-08 00:28:43 +02:00
László Monda
187ae2821b Update README.md 2018-05-08 00:23:11 +02:00
László Monda
cb52c273b4 Merge pull request #114 from Lauszus/dev
Removed unneeded sources
2018-05-08 00:02:47 +02:00
László Monda
5a523e64d8 Always unconditionally rebuild every object file when creating a release. 2018-05-08 00:00:08 +02:00
László Monda
970f622bff Set DEBUG=0 by default. 2018-05-07 23:56:28 +02:00
Kristian Sloth Lauszus
293438fa61 Removed unneeded sources 2018-05-07 22:23:21 +02:00
László Monda
455c1a30cb Make make-release.js work again now that the build system has changed. 2018-05-07 13:16:46 +02:00
László Monda
58e4919c0e Revert {left,right}/build/.cprojects 2018-05-07 09:06:44 +02:00
László Monda
dd7b0a6e3b Make builds parallel by adding -j8 to make commands in build configurations and external tool configurations. 2018-05-07 00:58:13 +02:00
László Monda
59396baf76 Don't make external configurations overwrite PATH. 2018-05-06 23:23:23 +02:00
László Monda
8d9340c05b Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-05-06 23:20:17 +02:00
László Monda
0930a000fa Merge pull request #113 from Lauszus/make
Make
2018-05-06 23:00:27 +02:00
Kristian Sloth Lauszus
332560d2d2 Merge branch 'master' into make 2018-05-06 21:25:46 +02:00
Kristian Sloth Lauszus
0344a79f65 Updated the KSDK_2.0_MKL03Z8xxx4 submodule 2018-05-06 20:28:14 +02:00
Kristian Sloth Lauszus
4577b118bc Revert "Set the MCU type for both projects"
This reverts commit 8bb9711793.
2018-05-06 20:26:44 +02:00
László Monda
ad8aca5793 Merge branch 'make' of https://github.com/Lauszus/firmware 2018-05-06 20:19:07 +02:00
Kristian Sloth Lauszus
8bb9711793 Set the MCU type for both projects
This is needed if we want to use MCUXpresso's config tools
2018-05-06 20:16:51 +02:00
Kristian Sloth Lauszus
3cb0490e5e Modified launch configurations to use the Makefile to flash the firmware 2018-05-06 20:16:51 +02:00
Kristian Sloth Lauszus
58fa1ed6a4 Use the bundled Makefiles instead of having the IDE generate them automatically 2018-05-06 20:16:51 +02:00
László Monda
9aa78ef5bf Merge pull request #112 from Lauszus/descriptor
Fix vender specific usage page entry
2018-05-06 20:14:51 +02:00
Kristian Sloth Lauszus
7c4c354828 Updated LED status comment 2018-05-06 15:23:07 +02:00
Kristian Sloth Lauszus
c3407e1410 Added Makefiles as linked resources, so they show up in the IDE 2018-05-06 15:22:24 +02:00
Kristian Sloth Lauszus
492243f801 Added _pvHeapStart entry
This is needed for Semihosting
2018-05-06 15:19:38 +02:00
Kristian Sloth Lauszus
6f0b1adc14 Fix vender specific usage page entry
See: https://github.com/node-hid/node-hid/issues/258
2018-05-06 15:11:22 +02:00
László Monda
b917a97e93 Parse long media macro actions. 2018-05-03 00:42:20 +02:00
László Monda
bf69f28ed1 Merge pull request #110 from Lauszus/make
Added Makefiles for compiling the two projects
2018-05-03 00:22:05 +02:00
László Monda
6854fa68dc Bump firmware version to 8.2.1 and update the changelog. 2018-05-02 14:57:24 +02:00
László Monda
14b6e49692 Don't suppress modifiers upon releasing a layer. Fixes #82. 2018-05-02 14:49:56 +02:00
Kristian Sloth Lauszus
10802f3f73 Build both the debug and release builds 2018-05-02 10:47:25 +02:00
Kristian Sloth Lauszus
66252eabf0 Added JLink flash scripts 2018-05-02 10:47:25 +02:00
Kristian Sloth Lauszus
0c4c736552 Use automatic variables for getting the file name and use the MAKEFILE_LIST variable to rebuild the project when any of the Makefiles change 2018-05-02 09:34:19 +02:00
Kristian Sloth Lauszus
aa4105bdc3 Updated license to "GPLv2 or later", so it is compatible with GPLv3 2018-05-02 03:00:30 +02:00
Kristian Sloth Lauszus
101abffec4 Moved the linker script into the source directory 2018-05-02 02:56:03 +02:00
Kristian Sloth Lauszus
b8268f55a3 Moved the BL_APP_VECTOR_TABLE_ADDRESS define into Makedefs.mk 2018-05-02 02:56:03 +02:00
Kristian Sloth Lauszus
2214f00667 Added command for flashing the images via the bootloader 2018-05-02 02:31:39 +02:00
Kristian Sloth Lauszus
a2fae5bbef Readded Eclipse build 2018-05-02 01:08:20 +02:00
Kristian Sloth Lauszus
47e026006e Forgot to fix linker errors for both linker scripts in: e0528e1714 2018-05-02 01:05:40 +02:00
Kristian Sloth Lauszus
379d827982 Only compile the project using Make 2018-05-02 00:45:47 +02:00
Kristian Sloth Lauszus
d9d26814e8 Fix warnings 2018-05-02 00:35:28 +02:00
Kristian Sloth Lauszus
611c36fe00 Added Makefiles for compiling the two projects 2018-05-02 00:13:52 +02:00
László Monda
e9cd3a96c2 Don't reinitialize LED driver ICs upon suspend and resume. 2018-04-28 17:08:25 +02:00
László Monda
8856c484b6 Add LedDisplay_UpdateAll() 2018-04-28 16:21:54 +02:00
László Monda
b97841fdae Delete I2C_WATCHDOG and always enable the watchdog. 2018-04-28 15:04:56 +02:00
László Monda
69143bed9c Replace "computer" with "host". 2018-04-28 15:00:32 +02:00
László Monda
ebd0e3b762 Make ParseConfig() restore indicator icons. Fixes #107 2018-04-28 14:43:13 +02:00
László Monda
ec8301ae62 Expose IsHostSleeping instead of IsHostSleeping() 2018-04-28 13:11:25 +02:00
László Monda
3d4d78387e Remove LED_DRIVER_STRESS_TEST. 2018-04-28 12:36:12 +02:00
László Monda
c2582729f2 Remove LED_DRIVERS_ENABLED. 2018-04-28 11:43:01 +02:00
László Monda
9d66f5ff76 Rename identifiers. 2018-04-28 11:38:38 +02:00
László Monda
06ebed5537 Rename some variables and clean up coding style. 2018-04-28 11:19:01 +02:00
László Monda
02d6fb4628 Rename version from 8.1.6 to 8.2.0 because the minor device protocol version has changed. 2018-04-20 09:55:44 +02:00
László Monda
1b9ec89e20 Bump firmware version to 8.1.6 - Update package.json, changelog, versions.h 2018-04-10 22:32:11 +02:00
László Monda
7002e7de52 Fix SwitchKeymapByAbbreviation() and use it in place of a for block of equivalent functionality within UsbCommand_ApplyConfig() 2018-04-10 21:27:56 +02:00
László Monda
1e61a39210 Merge pull request #104 from UltimateHackingKeyboard/dev
Merge dev into master
2018-04-10 14:13:58 +02:00
László Monda
5509cbb5f8 Reference the latest KSDK_2.0_MK22FN512xxx12 submodule that uses the performance-optimized loop implementation. 2018-04-10 12:15:13 +02:00
László Monda
f650032fef Set the optimization levels of both left and right firmwares to -O3 (most optimized). 2018-04-10 12:06:23 +02:00
László Monda
fd787f74e9 Merge branch 'usb-switch-keymap' into dev 2018-04-09 21:12:07 +02:00
László Monda
75fe7904b6 Fix scroll events after the slow mouse fix. 2018-04-09 13:09:41 +02:00
László Monda
b4ac82d2c0 Merge pull request #103 from Lauszus/dev
Cast mouseElapsedTime to float when calculating the speed and distance
2018-04-08 22:24:31 +02:00
Kristian Sloth Lauszus
9670523310 Cast mouseElapsedTime to float when calculating the speed and distance 2018-04-08 22:19:50 +02:00
László Monda
7763d8a32b Merge pull request #102 from Lauszus/dev
Moved timer used for mouse speed into processMouseActions and renamed…
2018-04-08 22:13:38 +02:00
Kristian Sloth Lauszus
3d9170402b Moved timer used for mouse speed into processMouseActions and renamed the variables 2018-04-08 22:11:35 +02:00
László Monda
b0192085bb Merge pull request #101 from Lauszus/dev
More mouse fixes
2018-04-08 22:09:56 +02:00
Kristian Sloth Lauszus
c90261d549 Set the update rate according to the mouse endpoint polling interval 2018-04-08 21:59:57 +02:00
Kristian Sloth Lauszus
5a756edf8b Remove historic code that tried to solve the mouse speed issue 2018-04-08 21:39:43 +02:00
László Monda
46ce16b8d4 Merge pull request #100 from Lauszus/dev
Mouse issue and other fixes
2018-04-08 21:27:51 +02:00
Kristian Sloth Lauszus
d2acfba659 Process the key inputs at a constant rate when moving the mouse, so the mouse speed is consistent
Fixes #99
2018-04-08 21:18:56 +02:00
Kristian Sloth Lauszus
ac75d0ca8b Merge commit 'b68c6bed184f5da12f00c173e23b07c4428be661' into dev 2018-04-08 20:28:02 +02:00
Kristian Sloth Lauszus
10beb751ac Fixed compiler warning in KSDK
See: https://github.com/UltimateHackingKeyboard/KSDK_2.0_MK22FN512xxx12/pull/2
2018-04-08 20:04:25 +02:00
Kristian Sloth Lauszus
e0528e1714 Fix linker error on newer compilers by just declaring the two usb sections after the .bss section
See: https://community.nxp.com/thread/449264
2018-04-08 19:52:03 +02:00
László Monda
0afb3ab687 Pull the Agent repo and make sure it's on master, so that the relevant binary configuration will be used. 2018-04-06 15:48:31 +02:00
László Monda
58fd3a78cf Reference the latest Agent repo. 2018-04-04 15:48:36 +02:00
László Monda
f1ed699fa2 Bump version to 8.1.5, update changelog, package.json, versions.h 2018-04-04 15:44:35 +02:00
László Monda
43646beca8 Set key debounce timeout from 30ms to 60ms. This should eliminate key chattering. 2018-04-04 00:56:16 +02:00
László Monda
308a71e4a3 Rename SwitchKeymap() to SwitchKeymapById() 2018-03-30 12:46:30 +02:00
László Monda
ecf1f1ac32 Actually switch the keymap. 2018-03-30 12:44:43 +02:00
László Monda
b34fb9daa3 Add switch keymap USB command. 2018-03-30 11:18:31 +02:00
László Monda
195f40949f Fix build warning. 2018-03-25 22:38:45 +02:00
László Monda
b68c6bed18 Merge pull request #98 from Lauszus/sleep
Wake up the keyboard if there is any activity on the bus
2018-03-11 20:07:59 +01:00
Kristian Sloth Lauszus
ab24e78a5b Wake up the keyboard if there is any activity on the bus
This fixes: https://github.com/UltimateHackingKeyboard/firmware/pull/97#issuecomment-372091423
2018-03-11 20:05:10 +01:00
László Monda
4892d64795 Merge pull request #97 from Lauszus/sleep
Turn LEDs, backlight and display off when sleeping
2018-03-11 19:34:56 +01:00
Kristian Sloth Lauszus
c10d6440ce Merge branch 'dev' into sleep
# Conflicts:
#	right/src/timer.c
#	right/src/timer.h
#	right/src/usb_report_updater.c
2018-03-11 19:34:21 +01:00
Kristian Sloth Lauszus
c109a9e202 The layer keys can now also wake up the computer 2018-03-11 19:29:24 +01:00
Kristian Sloth Lauszus
5d59540c51 Updated submodule after https://github.com/UltimateHackingKeyboard/KSDK_2.0_MK22FN512xxx12/pull/1 was merged 2018-03-11 19:26:04 +01:00
Kristian Sloth Lauszus
e12e219b4e Various fixes and improvements (#96)
* Global variables shared between an interrupt and the main code should be volatile

See: https://www.embedded.com/electronics-blogs/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

* There is no reason to change the active report if it has not changed

* Declare local functions and variables static

This both helps the compiler and the programmer
2018-03-11 19:19:15 +01:00
Kristian Sloth Lauszus
3ab2ac18fc The keyboard can now wake up the computer from sleep 2018-03-11 19:00:46 +01:00
Kristian Sloth Lauszus
6e2eca7829 Changed CurrentTime to a static variable and added function for getting the current time instead
Global variables are really bad practice and should be avoided
2018-03-11 17:59:23 +01:00
Kristian Sloth Lauszus
8f4fc1da8e Merge branch 'fixes' into sleep 2018-03-11 17:56:07 +01:00
Kristian Sloth Lauszus
5de0e5ac60 Turn LEDs, backlight and display off when sleeping
Fixes #83
2018-03-11 05:26:51 +01:00
Kristian Sloth Lauszus
13a718f871 Declare local functions and variables static
This both helps the compiler and the programmer
2018-03-11 02:38:23 +01:00
Kristian Sloth Lauszus
15d09552a4 There is no reason to change the active report if it has not changed 2018-03-11 02:37:59 +01:00
Kristian Sloth Lauszus
0b100feb32 Global variables shared between an interrupt and the main code should be volatile
See: https://www.embedded.com/electronics-blogs/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
2018-03-11 02:37:59 +01:00
Kristian Sloth Lauszus
1742437f8b Replace HID_KEYBOARD_SC_MENU scancode with HID_KEYBOARD_SC_APPLICATION (#95)
Fixes https://github.com/UltimateHackingKeyboard/agent/issues/563
2018-03-11 02:31:40 +01:00
László Monda
5093a0c0a6 Bump version to 8.1.4. Update changelog, package.json, and versions.h 2018-03-05 15:57:14 +01:00
László Monda
7e524d97b1 Don't read (the default 250ms) DoubleTapSwitchLayerTimeout from the user configuration but rather set it to 150ms which feels quite optimal. 2018-03-05 10:16:58 +01:00
László Monda
2e53331a0f Set KEY_DEBOUNCER_TIMEOUT_MSEC to 30. This looks like a safe bet to eliminate key chattering for every switch. 2018-02-27 23:01:39 +01:00
László Monda
c6d60780f4 Bump version to 8.1.3 and update package.json, versions.h and the changelog accordingly. 2018-02-18 00:46:17 +01:00
László Monda
8666a495d8 Set KEY_DEBOUNCER_TIMEOUT_MSEC from 15 to 20 ms. 2018-02-17 21:37:02 +01:00
Kristian Sloth Lauszus
33bbf44199 Fix system keyboard descriptor, so it is byte-aligned (#93)
I have verified that the descriptor shows up correctly on Windows 7 and macOS

The descriptor is based on the two following pages: https://github.com/Microsoft/Windows-driver-samples/tree/master/hid/hidusbfx2 and https://docs.microsoft.com/en-us/windows-hardware/drivers/gpiobtn/hid-button-report-descriptors

Fixes #76
2018-02-14 00:27:53 +01:00
László Monda
cc49118868 Bump version to 8.1.2. Update changelog, package.json, versions.h and reference the latest Agent repo. 2018-02-13 03:31:35 +01:00
László Monda
f8fd99f588 Set KEY_DEBOUNCER_TIMEOUT_MSEC from 10 to 15 msec. 2018-02-12 18:08:53 +01:00
Kristian Sloth Lauszus
fa8c9dc907 Logical maximum is wrongly assumed to be an unsigned integer, thus 0xFF is interpreted as -1 and not 255 (#92)
Simply setting the number of bits to 16 solves this
2018-02-12 04:51:59 +01:00
László Monda
0911e67bf6 Fix the coding style of usb_interface_basic_keyboard.c 2018-02-11 22:28:12 +01:00
László Monda
57a7cee62a Remove debug statements from updateActiveUsbReports() 2018-02-11 22:25:29 +01:00
Kristian Sloth Lauszus
1af28a79db Detect Caps Lock state and set the LED accordingly (#91)
Fixes #65
2018-02-11 12:45:46 +01:00
László Monda
6881f8e340 Update versions.h to 8.1.1 2018-02-11 04:23:31 +01:00
László Monda
00cd1f65e8 Bump version to 8.1.1. Update package.json and the changelog. 2018-02-11 04:21:49 +01:00
László Monda
2c9a6c0bd2 Add doubleTapSwitchLayerReleaseTimeout and set it to 100ms. Resolves #79. 2018-02-11 04:09:15 +01:00
László Monda
0c94cbb256 Make doubleTapSwitchLayerKey and doubleTapSwitchLayerStartTime static. 2018-02-11 03:29:15 +01:00
László Monda
275bfee860 Merge branch 'master' of github.com:UltimateHackingKeyboard/firmware 2018-02-10 23:55:48 +01:00
László Monda
8a655e3cfd Lock layers every time when double-tapping their layer switcher keys. Fixes #81. 2018-02-10 23:53:35 +01:00
László Monda
8521619783 Update README.md 2018-02-05 02:24:10 +01:00
László Monda
62184240df Update README.md 2018-02-05 02:03:56 +01:00
László Monda
0b210ac68e Update README.md 2018-02-01 18:39:20 +01:00
László Monda
56f7753afc Bump firmware version to 8.1.0 and update changelog, package.json, and versions.h 2018-01-15 10:35:22 +01:00
László Monda
a0803875c4 Make UsbCommand_GetModuleProperty() branch based on modulePropertyId 2018-01-15 00:04:22 +01:00
László Monda
f5716bdadc Rename some private functions in init_peripherals.c from upper to lower camel case. 2018-01-14 20:30:46 +01:00
László Monda
b76b3c0e4f Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust. 2018-01-14 20:27:17 +01:00
László Monda
2661c3d909 Implement DevicePropertyId_Uptime 2018-01-14 18:32:18 +01:00
László Monda
c854e98d84 Implement DevicePropertyId_I2cMainBusBaudRate 2018-01-14 18:10:04 +01:00
László Monda
72d8e49717 Make UsbProtocolHandler() invoke UsbCommand_SetI2cBaudRate() when requested. 2018-01-13 19:54:48 +01:00
László Monda
0fd95b71b2 Add usb_command_set_i2c_baud_rate.[ch] 2018-01-13 03:54:06 +01:00
László Monda
4d83bc2e75 Add I2cMainBusBaudRateBps 2018-01-13 03:29:01 +01:00
László Monda
cf7b05ab72 Make InitI2cMainBus() private. 2018-01-13 03:21:12 +01:00
László Monda
055f1945d0 Include slave_scheduler.h from init_peripherals.c instead of i2c_watchdog.c which I forgot to do in the previous commit. 2018-01-13 03:19:24 +01:00
László Monda
fa4a3abf84 Extract ReinitI2cMainBus() 2018-01-13 03:14:42 +01:00
László Monda
96c7ccd758 Remove some dead code from PIT_I2C_WATCHDOG_HANDLER 2018-01-13 03:03:42 +01:00
László Monda
76d319ec19 Remove comment that says that 100 kHz works with a 20 meter long bridge cable. It was true for UART, not so much for I2C. 2018-01-11 23:44:59 +01:00
László Monda
aab0e8473f Enable left half I2C watchdog in reinit mode because it seems to improve things. 2018-01-11 23:43:34 +01:00
László Monda
4a4c471b9e Implement DevicePropertyId_CurrentKbootCommand 2018-01-10 02:58:31 +01:00
László Monda
fcd75b2af2 Use identifiers instead of the magic numbers of kboot_driver.[ch] 2018-01-06 21:21:36 +01:00
László Monda
f318c6872e Move the definition of previousSlave within the if (isFirstCycle) block. 2018-01-06 17:25:07 +01:00
László Monda
ae1240c103 Rename isFirstIteration to isFirstCycle and kStatus_Uhk_NoTransfer to kStatus_Uhk_IdleCycle. 2018-01-06 17:05:37 +01:00
László Monda
e75d366245 Update and log previous I2C status within the if (isFirstIteration) block. 2018-01-06 17:00:59 +01:00
László Monda
da20cdacc4 Only check currentSlaveId overrun after incrementing it. 2018-01-06 16:36:57 +01:00
László Monda
5a986d367e Only call LogI2cError() if the passed status is an actual I2C error, otherwise it slows the mouse pointer down. 2018-01-06 02:04:47 +01:00
László Monda
f6b66283a7 Only count I2C errors. 2018-01-06 01:37:58 +01:00
László Monda
6ad425cbf9 Log I2C error counts on a per slave and per error type basis and expose them via USB. 2018-01-05 03:23:48 +01:00
László Monda
33e501cd83 Add SLAVE_COUNT 2018-01-04 23:16:48 +01:00
László Monda
fa558abef3 Add LED_DRIVERS_ENABLED 2017-12-28 00:08:29 +01:00
László Monda
25a2b3af93 Convert tabs to spaces. 2017-12-27 17:21:28 +01:00
László Monda
43587c2e1f Define I2C_WATCHDOG_VALUE_REINIT and I2C_WATCHDOG_VALUE_REBOOT and make them work when assigned to I2C_WATCHDOG. 2017-12-27 17:07:04 +01:00
László Monda
c51542795f Bump version to 8.0.1 2017-12-25 23:16:27 +01:00
Erich Styger
7eb83173ed changed I2C watchdog timer implementation, as LPTMR was already used by key scanner 2017-12-25 17:15:41 +01:00
Erich Styger
5581dd26b5 fixed and enabled software watchdog timer 2017-12-24 12:06:46 +01:00
László Monda
1ac637af0f Rename the GetProperty command to GetDeviceProperty. 2017-12-23 16:11:47 +01:00
László Monda
36951d1a34 Minor cleanups regarding the previous rename. 2017-12-23 16:08:45 +01:00
László Monda
5190265a2c Rename get_module_properties.[ch] to get_module_property.[ch]. It seems that the header wasn't included in usb_protocol_handler.c possibly causing issues when using these commands. 2017-12-23 16:06:24 +01:00
László Monda
40bf252852 Bump version to 8.0.0. Update version numbers. Update changelog. 2017-12-15 04:03:51 +01:00
László Monda
85e92d21b4 Add new UsbCommand_GetModuleProperties() device protocol command. 2017-12-15 02:46:30 +01:00
László Monda
fd43e81e46 Query module key count and pointer count in separate messages instead of a combined message for better clarity. 2017-12-15 02:13:58 +01:00
László Monda
c994a97d03 Make the modules transfer their firmware version to the device. Fix the message length of the module protocol version. 2017-12-15 01:42:58 +01:00
László Monda
d59ba83d99 Make the modules transfer a module protocol version composed of a major, a minor and a patch number. 2017-12-15 01:28:13 +01:00
László Monda
c1b887cea8 Rename UhkModulePhase_*ProtocolVersion to UhkModulePhase_*ModuleProtocolVersion. 2017-12-15 01:16:27 +01:00
László Monda
bd53b73685 Rename usb_command_get_keyboard_state.[ch] to usb_command_get_device_state.[ch] 2017-12-14 23:10:13 +01:00
László Monda
beb7c3d4ee Forgot to update versions.h for the previous release. Updating now. 2017-12-14 23:08:34 +01:00
László Monda
17571a5feb Bump version to 7.0.0. Update changelog and package.json 2017-12-14 21:51:07 +01:00
László Monda
83e782d74a Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize 2017-12-14 21:49:15 +01:00
László Monda
312f56048b Add DevicePropertyId_ConfigSizes. 2017-12-14 16:40:44 +01:00
László Monda
494621a841 Expose version numbers via the get property interface. 2017-12-14 16:16:11 +01:00
László Monda
94af52892c Add generate-versions-h.js and versions.h. Execute generate-versions-h.js from make-release.js 2017-12-14 15:41:20 +01:00
László Monda
5862a34f18 Use const instead of let wherever possible in make-release.js 2017-12-14 04:01:13 +01:00
László Monda
9b9e5ed1b5 Rename the version property to firmwareVersion in package.json 2017-12-14 03:52:56 +01:00
László Monda
4393377365 Rename version properties in package.json 2017-12-14 03:48:59 +01:00
László Monda
1570364741 Add hardware config versions to releases. 2017-12-14 03:38:24 +01:00
László Monda
738a240860 Rename slave protocol to module protocol. 2017-12-14 03:36:29 +01:00
László Monda
43b48aa643 Rename USB protocol to device protocol. 2017-12-14 03:25:47 +01:00
László Monda
61a0540007 Rename data model to user config. 2017-12-14 03:24:29 +01:00
László Monda
f2e313dd0a Put the data model version as the last element of the version list. 2017-12-14 03:22:04 +01:00
László Monda
b239d0da50 Mark bumped version numbers by making them bold. 2017-12-14 03:14:41 +01:00
László Monda
23459e3791 Don't make horizontal scrolling and vertical scrolling affect each other. 2017-12-14 01:30:06 +01:00
László Monda
6a54944cb1 Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver. 2017-12-13 01:27:04 +01:00
László Monda
a52df9da7e Bump version to 6.0.0, update changelog and package.json 2017-12-12 18:44:12 +01:00
László Monda
28f98f179a Change the value of UsbCommandId_{GetDeviceState,SetTestLed,GetDebugBuffer,GetAdcValue,SetLedPwmBrightness}. 2017-12-12 18:38:01 +01:00
László Monda
5798f9e4fb Refactor UsbCommandId_LaunchEepromTransfer, change its arguments, and change its ID to 0x08. 2017-12-12 03:24:34 +01:00
László Monda
4fe5ce45ac Change UsbCommandId_ApplyConfig to 0x07. 2017-12-12 02:15:20 +01:00
László Monda
a212c254a9 Change UsbCommandId_WriteHardwareConfig and UsbCommandId_WriteUserConfig to 0x05 and 0x06. 2017-12-12 01:59:53 +01:00
László Monda
235e18d706 Fix UsbCommandId_WriteHardwareConfig that I previously screwed up. 2017-12-12 01:29:49 +01:00
László Monda
7c91f8f6d1 Replace UsbCommandId_ReadHardwareConfig and UsbCommandId_ReadUserConfig with UsbCommandId_ReadConfig. 2017-12-12 01:22:26 +01:00
László Monda
c8cfe53136 Change UsbCommandId_SendKbootCommandToModule from 0x13 to 0x03. 2017-12-11 22:15:46 +01:00
László Monda
f1f47ece14 Change UsbCommandId_JumpToModuleBootloader from 0x12 to 0x02. 2017-12-11 21:44:35 +01:00
László Monda
a0dba2fa66 Change UsbCommandId_SetTestLed from 0x02 to 0x14. 2017-12-11 21:21:41 +01:00
László Monda
0f34b01189 Update LED brightness levels upon applying the configuration. 2017-12-10 20:48:26 +01:00
László Monda
5a449ad5c5 Disable LED display icons by default. 2017-12-10 15:35:03 +01:00
László Monda
0d6a5ae902 Bump firmware version number to 5.0.1 and update changelog. 2017-12-09 16:44:11 +01:00
László Monda
2f7f7b1cd2 Make scrolling immediately react to keypresses regardless of the previous internal scroll state. 2017-12-07 04:44:45 +01:00
László Monda
2eb25ce05c Make UpdateUsbReports() not exit prematurely even if a previously active USB interface is not polled anymore by the host. Tweak the Timer API to not set the current time automatically. 2017-12-07 03:24:53 +01:00
László Monda
6e47707037 Rename the misleadingly named error variable of usbDeviceCallback() to status. Clean up InitUsb() a bit. 2017-12-05 00:56:52 +01:00
László Monda
0932c14a2c Lowercamelcase UsbDeviceCallback because it's local. 2017-12-04 22:51:04 +01:00
László Monda
e57c2c21ca Don't define the NULL members of UsbDeviceCompositeConfigList. 2017-12-04 20:43:57 +01:00
László Monda
a5ce90779c Merge all the substructures of UsbDeviceCompositeConfigList across different files to a single structure. 2017-12-04 20:41:22 +01:00
László Monda
e9bf3dc355 Expand UsbDeviceCompositeClassConfig and UsbDeviceCompositeConfigList using structure member names. 2017-12-04 20:05:28 +01:00
László Monda
8cb8654459 Merge the substructures of UsbMouseClass into a single structure. 2017-12-04 19:57:43 +01:00
László Monda
745e8e1cf0 Merge the substructures of UsbSystemKeyboardClass into a single structure. 2017-12-04 19:50:39 +01:00
László Monda
5341109845 Merge the substructures of UsbMediaKeyboardClass into a single structure. 2017-12-04 19:41:51 +01:00
László Monda
ff0e5b0aa3 Merge the structs of UsbBasicKeyboardClass into a single structure. 2017-12-04 19:33:53 +01:00
László Monda
c4e79d8ed2 Merge the all the structures of UsbGenericHidClass into a single structure. 2017-12-04 19:16:04 +01:00
László Monda
6780c8177c Expose per-interface count values for debugging purposes via USB. 2017-12-04 17:38:31 +01:00
László Monda
71d6db0f35 Update CHANGELOG.md and package.json for version 5.0.0 2017-12-04 00:40:07 +01:00
László Monda
9b9bdbc03d Rename baseLayerPointerFunction to modLayerPointerFunction and modLayerPointerFunction to fnLayerPointerFunction. Suppress unused variable compilation warnings. 2017-12-03 23:53:32 +01:00
László Monda
bb5c118e97 Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, baseLayerPointerFunction, modLayerPointerFunction, and mouseLayerPointerFunction to module configurations. 2017-12-03 23:25:55 +01:00
126 changed files with 2364 additions and 1094 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
package-lock.json package-lock.json
node_modules node_modules
build_make

View File

@@ -1,25 +1,36 @@
language: generic language: c
cache: cache:
directories: directories:
- $HOME/Library/Caches/Homebrew/Cask - $HOME/Library/Caches/Homebrew/Cask
install: eclipse -noSplash
-application org.eclipse.equinox.p2.director install: eclipse -noSplash
-repository http://gnuarmeclipse.sourceforge.net/updates -application org.eclipse.equinox.p2.director
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group -repository http://gnuarmeclipse.sourceforge.net/updates
-installIUs ilg.gnuarmeclipse.managedbuild.cross.feature.group
-profileProperties org.eclipse.update.install.features=true -profileProperties org.eclipse.update.install.features=true
script: eclipse -noSplash
-application org.eclipse.cdt.managedbuilder.core.headlessbuild before_script:
-import $TRAVIS_BUILD_DIR/left/build - tar -xf gcc-arm-none-eabi-7-2017-q4-major-*.tar.bz2
-import $TRAVIS_BUILD_DIR/right/build - export PATH=$PATH:$PWD/gcc-arm-none-eabi-7-2017-q4-major/bin
-build all
script:
- eclipse -noSplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild -import $TRAVIS_BUILD_DIR/left/build -import $TRAVIS_BUILD_DIR/right/build -build all
- make -C left clean && make -j2 -C left DEBUG=1
- make -C left clean && make -j2 -C left DEBUG=0
- make -C right clean && make -j2 -C right DEBUG=1
- make -C right clean && make -j2 -C right DEBUG=0
matrix: matrix:
include: include:
- os: linux - os: linux
sudo: required sudo: required
before_install: before_install:
- curl https://nixos.org/nix/install | sh && . ~/.nix-profile/etc/profile.d/nix.sh - curl https://nixos.org/nix/install | sh && . ~/.nix-profile/etc/profile.d/nix.sh
- nix-env -i gcc-arm-embedded-4.8-2014q1-20140314
- nix-env -i eclipse-cpp - nix-env -i eclipse-cpp
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-linux.tar.bz2"
- os: osx - os: osx
env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS" env: PATH="$PATH:/Applications/Eclipse CPP.app/Contents/MacOS"
before_install: brew update && brew bundle -v before_install:
- brew cask install eclipse-cpp
- wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/7-2017q4/gcc-arm-none-eabi-7-2017-q4-major-mac.tar.bz2"

View File

@@ -1,2 +0,0 @@
cask "eclipse-cpp"
cask "./gcc-arm-embedded.rb"

View File

@@ -5,17 +5,133 @@ All notable changes to this project will be documented in this file.
The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) The format is loosely based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
and this project adheres to the [UHK Versioning](VERSIONING.md) conventions. and this project adheres to the [UHK Versioning](VERSIONING.md) conventions.
## [8.2.2] - 2018-05-09
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.**1** | Hardware Config: 1.0.0
- Parse long media macro actions. `USERCONFIG:PATCH`
- Fix vendor-specific USB usage page entry. This makes the HIDAPI Linux/hidraw driver able to access interface 0.
## [8.2.1] - 2018-05-02
Device Protocol: 4.3.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Don't suppress modifier keys upon releasing a layer.
- Restore Caps Lock indicator when saving the configuration.
## [8.2.0] - 2018-04-20
Device Protocol: 4.**3.0** | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Change the scheduling of USB reports which changes mouse pointer speeds.
- Disable LEDs while the host sleeps.
- Make any key wake up the host while it sleeps.
- Add UsbCommand_SwitchKeymap(). `DEVICEPROTOCOL:MINOR`
- Make GCC optimize the release builds for execution speed (-O3).
## [8.1.5] - 2018-04-04
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Set key debounce timeout from 30ms to 60ms. This should eliminate key chattering.
- Use the correct scancode for the menu key of the factory keymap.
## [8.1.4] - 2018-03-05
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Set key debounce timeout from 20ms to 30ms. This should eliminate key chattering.
- Set double tap lock layer timeout from 250ms to 150ms. This should minimize the chance of locking layers accidentally by double tapping their keys.
## [8.1.3] - 2018-02-18
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Fix system keyboard descriptor, so it is byte-aligned.
- Set key debounce timeout from 15ms to 20ms. This should at least reduce and hopefully eliminate key chattering.
## [8.1.2] - 2018-02-13
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Detect Caps Lock USB state and light up the Caps Lock icon of the LED display accordingly.
- Set key debounce timeout from 10ms to 15ms. This should at least reduce and hopefully eliminate key chattering.
## [8.1.1] - 2018-02-11
Device Protocol: 4.2.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Lock layers every time when double-tapping their layer switcher keys, regardless of how many times the layer switcher key was tapped before.
- Only lock layers via double-tapping if the second tap gets released within 100ms.
## [8.1.0] - 2018-01-15
Device Protocol: 4.**2**.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Enable left-half watchdog in reinit mode which seems to prevent freezes.
- Slow down main bus I2C baud rate to 30kHz when BusPal is on to make firmware transfer more robust.
- Implement UsbCommandId_GetSlaveI2cErrors. `DEVICEPROTOCOL:MINOR`
- Implement UsbCommandId_SetI2cBaudRate. `DEVICEPROTOCOL:MINOR`
- Implement DevicePropertyId_CurrentKbootCommand. `DEVICEPROTOCOL:MINOR`
- Implement DevicePropertyId_I2cMainBusBaudRate. `DEVICEPROTOCOL:MINOR`
- Implement DevicePropertyId_Uptime. `DEVICEPROTOCOL:MINOR`
## [8.0.1] - 2017-12-25
Device Protocol: 4.1.0 | Module Protocol: 4.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Implement I2C watchdog for the left keyboard half which should resolve the occasional hangs of the left keyboard half.
## [8.0.0] - 2017-12-15
Device Protocol: 4.**1.0** | Module Protocol: **4.0.0** | User Config: 4.0.0 | Hardware Config: 1.0.0
- Make the modules transfer the module protocol version and firmware version composed of a major, a minor and a patch number. `MODULEPROTOCOL:MAJOR`
- Query module key count and pointer count in separate messages instead of a combined message for improved clarity. `MODULEPROTOCOL:MAJOR`
- Add new UsbCommand_GetModuleProperties() device protocol command. `DEVICEPROTOCOL:MINOR`
## [7.0.0] - 2017-12-14
Device Protocol: **4.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Make UsbCommand_JumpToModuleBootloader() more robust by not making it dependent on the state of the module driver.
- Don't make horizontal scrolling and vertical scrolling affect each other.
- Expose version numbers via the get property interface. `DEVICEPROTOCOL:MINOR`
- Add DevicePropertyId_ConfigSizes. `DEVICEPROTOCOL:MINOR`
- Remove DevicePropertyId_HardwareConfigSize and DevicePropertyId_UserConfigSize. `DEVICEPROTOCOL:MAJOR`
## [6.0.0] - 2017-12-12
Device Protocol: **3.0.0** | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Change the value of almost every Device Protocol commands because there were unused intervals between them. `DEVICEPROTOCOL:MAJOR`
- Disable LED display icons by default.
- Update LED brightness levels upon applying the configuration.
## [5.0.1] - 2017-12-09
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: 4.0.0 | Hardware Config: 1.0.0
- Make key presses continue to emit scancodes even if a USB interface (typically the mouse interface) is not polled by the host anymore.
- Make scrolling always immediately react to keypresses regardless of the previous internal scroll state.
## [5.0.0] - 2017-12-04
Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **4.0.0** | Hardware Config: 1.0.0
- Move pointerRole from keymaps to module configurations as pointerMode. Add angularShift, modLayerPointerFunction, fnLayerPointerFunction, and mouseLayerPointerFunction to module configurations. `USERCONFIG:MAJOR`
## [4.0.0] - 2017-11-30 ## [4.0.0] - 2017-11-30
Data Model: 3.0.0 (major bump) | USB Protocol: 2.0.0 (unchanged) | Slave Protocol: 3.0.0 (unchanged) Device Protocol: 2.0.0 | Module Protocol: 3.0.0 | User Config: **3.0.0** | Hardware Config: 1.0.0
- Implement mouse movement and scrolling deceleration and acceleration. - Implement mouse movement and scrolling deceleration and acceleration.
- Toggle layers upon double tapping their keys. Make the double tap timeout configurable. - Toggle layers upon double tapping their keys. Make the double tap timeout configurable.
- Make the parser read additional user configuration properties: dataModelMajorVersion, dataModelMinorVersion, dataModelPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `DATAMODEL:MAJOR` - Make the parser read additional user configuration properties: userConfigMajorVersion, userConfigMinorVersion, userConfigPatchVersion, doubleTapSwitchLayerTimeout, iconsAndLayerTextsBrightness, alphanumericSegmentsBrightness, keyBacklightBrightness, mouseMoveInitialSpeed, mouseMoveAcceleration, mouseMoveDeceleratedSpeed, mouseMoveBaseSpeed, mouseMoveAcceleratedSpeed, mouseScrollInitialSpeed, mouseScrollAcceleration, mouseScrollDeceleratedSpeed, mouseScrollBaseSpeed, mouseScrollAcceleratedSpeed. `USERCONFIG:MAJOR`
## [3.0.0] - 2017-11-15 ## [3.0.0] - 2017-11-15
Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protocol: 3.0.0 (major bump) Device Protocol: **2.0.0** | Module Protocol: **3.0.0** | User Config: **2.0.0** | Hardware Config: 1.0.0
- Detect the use of USB interfaces and only wait for the ones that are actually used by the host. - Detect the use of USB interfaces and only wait for the ones that are actually used by the host.
- Implement key debouncer. - Implement key debouncer.
@@ -23,49 +139,49 @@ Data Model: 2.0.0 (major bump) | USB Protocol: 2.0.0 (major bump) | Slave Protoc
- Make pressing the reset button revert to the factory preset. - Make pressing the reset button revert to the factory preset.
- Revert to the factory default state when the reset button is pressed upon firmware startup. Display FTY on the display in this case. - Revert to the factory default state when the reset button is pressed upon firmware startup. Display FTY on the display in this case.
- Make the LED display show the abbreviation of the current keymap even when it gets reinitialized by the I2C watchdog. - Make the LED display show the abbreviation of the current keymap even when it gets reinitialized by the I2C watchdog.
- Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `SLAVEPROTOCOL:MAJOR` - Swap SlaveCommand_RequestKeyStates and SlaveCommand_JumpToBootloader, thereby making SlaveCommand_JumpToBootloader the lower number because it's more essential and shouldn't change in the future. `MODULEPROTOCOL:MAJOR`
- Suppress pressed keys upon layer switcher key release. - Suppress pressed keys upon layer switcher key release.
- Handle secondary role modifiers and layer switchers. - Handle secondary role modifiers and layer switchers.
- Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `USBPROTOCOL:MAJOR` - Make UsbCommand_JumpToSlaveBootloader expect a slave slot id instead of a uhkModuleDriverId. `DEVICEPROTOCOL:MAJOR`
- Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `USBPROTOCOL:MINOR` - Set UsbResponse_InvalidCommand upon encountering with an invalid USB command. `DEVICEPROTOCOL:MINOR`
- Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `USBPROTOCOL:MAJOR` - Remove UsbCommandId_ReadMergeSensor now that it can be queried via UsbCommandId_GetKeyboardState. `DEVICEPROTOCOL:MAJOR`
- Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `USBPROTOCOL:MAJOR` - Make the getAdcValue and getDebugInfo USB commands utilize the first byte of the response to provide status as dictated by the UHK protocol. `DEVICEPROTOCOL:MAJOR`
- Switch keymap only upon keypress. - Switch keymap only upon keypress.
- Handle layer toggle actions. - Handle layer toggle actions.
- Keep the active layer active even if another layer switcher key gets pressed while holding it. - Keep the active layer active even if another layer switcher key gets pressed while holding it.
- Read the new UserConfig.userConfigLength user config field. `DATAMODEL:MAJOR` - Read the new UserConfig.userConfigLength user config field. `USERCONFIG:MAJOR`
- Change Ctrl and Alt back according to the official UHK factory keymap. - Change Ctrl and Alt back according to the official UHK factory keymap.
- Update system keyboard HID descriptor which doesn't make the pointer go to the top left corner on OSX anymore. - Update system keyboard HID descriptor which doesn't make the pointer go to the top left corner on OSX anymore.
- Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop. - Scan keyboard matrices in a more efficient manner from timer interrupts instead of the main loop.
- Add UsbCommand_SendKbootCommand. `USBPROTOCOL:MINOR` - Add UsbCommand_SendKbootCommand. `DEVICEPROTOCOL:MINOR`
- Make the reenumerate USB command accept a timeout value. `USBPROTOCOL:MINOR` - Make the reenumerate USB command accept a timeout value. `DEVICEPROTOCOL:MINOR`
- Make the config parser read the device name. `DATAMODEL:MAJOR` - Make the config parser read the device name. `USERCONFIG:MAJOR`
- Update release file format containing device and module directories and hex files instead of srec. - Update release file format containing device and module directories and hex files instead of srec.
- Remove obsolete ARM GCC build files. - Remove obsolete ARM GCC build files.
## [2.1.0] - 2017-10-13 ## [2.1.0] - 2017-10-13
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.2.0 (minor bump) | Slave Protocol: 2.1.0 (minor bump) Device Protocol: 1.**2.0** | Module Protocol: 2.**1.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
- Add jumpToSlaveBootloader USB and slave protocol command. `USBPROTOCOL:MINOR` `SLAVEPROTOCOL:MINOR` - Add jumpToSlaveBootloader USB and Module Protocol command. `DEVICEPROTOCOL:MINOR` `MODULEPROTOCOL:MINOR`
- Fix generic HID descriptor enumeration error. - Fix generic HID descriptor enumeration error.
## [2.0.0] - 2017-10-10 ## [2.0.0] - 2017-10-10
Data Model: 1.0.0 (unchanged) | USB Protocol: 1.1.0 (minor bump) | Slave Protocol: 2.0.0 (major bump) Device Protocol: 1.**1.0** | Module Protocol: **2.0.0** | User Config: 1.0.0 | Hardware Config: 1.0.0
- Read the hardware and user configuration area of the EEPROM upon startup and set the default keymap. - Read the hardware and user configuration area of the EEPROM upon startup and set the default keymap.
- Greatly improve the I2C watchdog and drivers. Communication between the halves or the add-ons should never fail again. - Greatly improve the I2C watchdog and drivers. Communication between the halves or the add-ons should never fail again.
- Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `SLAVEPROTOCOL:MAJOR` - Implement generic enumeration sequence and per-slave state for UHK modules, allowing add-ons to be added. `MODULEPROTOCOL:MAJOR`
- Make the master cache the output fields of slave modules, allowing for more frequent input updates. - Make the master cache the output fields of slave modules, allowing for more frequent input updates.
- Optimize I2C protocol scheduler resulting in increased roustness and more efficient use of I2C bandwidth. - Optimize I2C protocol scheduler resulting in increased roustness and more efficient use of I2C bandwidth.
- Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `SLAVEPROTOCOL:MAJOR` - Add I2C message headers containing a length header, allowing for variable-length messages and a CRC16-CCITT checksum, allowing for robust communication. `MODULEPROTOCOL:MAJOR`
- Add mechanism to dump the internal state of the KL03 via SPI for debugging purposes. - Add mechanism to dump the internal state of the KL03 via SPI for debugging purposes.
- Add merge sensor state and attached module IDs to GetDebugInfo(). `USBPROTOCOL:PATCH` - Add merge sensor state and attached module IDs to GetDebugInfo(). `DEVICEPROTOCOL:PATCH`
- Throw ParserError_InvalidKeymapCount if keymapCount == 0. `DATAMODEL:PATCH` - Throw ParserError_InvalidKeymapCount if keymapCount == 0. `USERCONFIG:PATCH`
## [1.0.0] - 2017-08-30 ## [1.0.0] - 2017-08-30
Data Model: 1.0.0 | USB Protocol: 1.0.0 | Slave Protocol: 1.0.0 Device Protocol: 1.0.0 | Module Protocol: 1.0.0 | User Config: 1.0.0 | Hardware Config: 1.0.0
- First Release - First Release

View File

@@ -4,23 +4,27 @@
This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/). This repository hosts the firmware of the [Ultimate Hacking Keyboard](https://ultimatehackingkeyboard.com/).
## Cloning the repository If you want to use the latest firmware version for your UHK, then instead of going through the pain of building the firmware, simply download the [latest release of Agent](https://github.com/UltimateHackingKeyboard/agent/releases/latest) and update to the latest firmware version within Agent with a click of a button.
Please make sure to clone this repo with: If you're one of the brave few who wants to hack the firmware then read on.
1. Make sure to clone this repo with:
`git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git` `git clone --recursive git@github.com:UltimateHackingKeyboard/firmware.git`
This will download the dependent submodules, which are required to build the firmware. 2. Download and install MCUXpresso IDE for [Linux](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/mcuxpressoide-10.1.1_606.x86_64.deb.bin), [Mac](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.pkg), or [Windows](https://storage.googleapis.com/ugl-static/mcuxpresso-ide/MCUXpressoIDE_10.1.1_606.exe).
## Importing the firmware 3. In the IDE, import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
Install [Kinetis Design Studio](http://www.nxp.com/products/software-and-tools/run-time-software/kinetis-software-and-tools/ides-for-kinetis-mcus/kinetis-design-studio-integrated-development-environment-ide:KDS_IDE) (KDS), import the project by invoking *File -> Import -> General -> Existing Projects into Workspace*, select the *left* or *right* directory depending on the desired firmware, then click on the *Finish* button.
## Building and flashing the firmware ## Building and flashing the firmware
For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk-left release jlink*, and click on the *Debug* button. For the left keyboard half, make sure to power it via the right keyboard half (which must be powered via USB). Also connect the left keyboard half to your SEGGER J-Link USB debug probe (which must also be connected via USB). Then in KDS, click on *Run -> Run Configurations*, select *GDB SEGGER J-Link Debugging -> uhk60-left_release_jlink*, and click on the *Debug* button.
For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk-right release blhost*, and click on the *Debug* button. Please note that this update method only works on Linux out of the box. On other operating systems, you have to execute the relevant commands of the [blhost-unix.sh](right/build/kds/blhost-unix.sh) script. For the right keyboard half, flash [the bootloader](https://github.com/UltimateHackingKeyboard/bootloader) first.
At this point, you can flash the right firmware via USB from KDS. To achieve this, you must build [Agent](https://github.com/UltimateHackingKeyboard/agent) that is Git submodule of the this repo and located in the `lib/agent` directory. Then in KDS, click on *Run -> Run Configurations*, select *C/C++ Application -> uhk60-right_release_kboot*, and click on the *Run* button.
From this point on, you can upgrade the firmwares of both halves via USB by using the uhk60-left_release_kboot and uhk60-right_release_kboot run configurations. Alternatively, you can use your SEGGER J-Link probe.
## Contributing ## Contributing

View File

@@ -1,35 +0,0 @@
cask 'gcc-arm-embedded' do
version '4_8-2014q3'
sha256 '6b30901738b09a8d22fdfff99e991217444b80ac492a6163af5c06a3baaa3487'
# launchpad.net/gcc-arm-embedded/ was verified as official when first introduced to the cask
url "https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q3-update/+download/gcc-arm-none-eabi-#{version}-20140805-mac.tar.bz2"
name 'GCC ARM Embedded'
homepage 'https://developer.arm.com/open-source/gnu-toolchain/gnu-rm'
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-addr2line"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ar"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-as"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-c++"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-c++filt"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-cpp"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-elfedit"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-g++"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-ar"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-nm"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcc-ranlib"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gcov"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gdb"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-gprof"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ld"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ld.bfd"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-nm"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-objcopy"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-objdump"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-ranlib"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-readelf"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-size"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-strings"
binary "gcc-arm-none-eabi-#{version}/bin/arm-none-eabi-strip"
end

57
left/Makefile Normal file
View File

@@ -0,0 +1,57 @@
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Contact information
# -------------------
# Kristian Lauszus
# Web : http://www.lauszus.com
# e-mail : lauszus@gmail.com
# Set project name.
PROJECT_NAME = uhk_left
# Defines the part type that this project uses.
PART = MKL03Z32VFK4
# Defines the linker script to use for the application.
LDSCRIPT = ../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/MKL03Z32xxx4_flash.ld
# Size of the heap and stack.
HEAP_SIZE = 0
STACK_SIZE = 0x0050
# Set the compiler CPU and FPU options.
CPU = -mcpu=cortex-m0plus
FPU = -mfloat-abi=soft
# Command for flashing the left half of the keyboard.
FLASH_CMD = node ../lib/agent/packages/usb/update-module-firmware.js leftHalf $(PROJECT_OBJ:.axf=.bin)
# Path to the JLink script used for the left half.
JLINK_SCRIPT = ../scripts/flash-left.jlink
# Source files.
SOURCE = $(wildcard src/*.c) \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/system_MKL03Z4.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/gcc/startup_MKL03Z4.S \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_clock.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_gpio.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_i2c.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_lptmr.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_spi.c \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers/fsl_tpm.c \
$(wildcard ../shared/*.c)
# Header files.
IPATH = src \
../lib/KSDK_2.0_MKL03Z8xxx4/CMSIS/Include \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4 \
../lib/KSDK_2.0_MKL03Z8xxx4/devices/MKL03Z4/drivers \
../shared
# Include main Makefile.
include ../scripts/Makedefs.mk

View File

@@ -5,19 +5,19 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_debug">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861" name="uhk60-left_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.439601044" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.780228407" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.1547417078" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.765602671" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.910567930" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
@@ -61,7 +61,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.2943267007" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.9995899345" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1777290613" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/debug" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1406291427" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2007968129" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1246588554" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.2122094274" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -165,16 +165,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" moduleId="org.eclipse.cdt.core.settings" name="uhk60-left_release">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078" name="uhk60-left_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.1802192936" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.918206081" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/>
@@ -220,7 +220,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast.6545741443.1540890614" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.badfunctioncast" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1382191896" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.2107171855" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-left}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1689719605" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1477971290" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.334227408" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1702866230" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>

View File

@@ -1,3 +1,4 @@
/.settings/ /.settings/
/uhk60-left_debug/ /uhk60-left_debug/
/uhk60-left_release/ /uhk60-left_release/
/uhk60-left_release/

View File

@@ -31,6 +31,16 @@
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures> </natures>
<linkedResources> <linkedResources>
<link>
<name>Makedefs.mk</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
</link>
<link>
<name>Makefile</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
</link>
<link> <link>
<name>drivers</name> <name>drivers</name>
<type>2</type> <type>2</type>

View File

@@ -50,7 +50,7 @@
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/> <intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="2331"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="false"/> <booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/> <stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/>
@@ -77,6 +77,6 @@
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/> <listEntry value="4"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/> <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#13;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -1,34 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_debug/uhk-left.bin"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1792027861"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-left"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -77,6 +77,6 @@
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/> <listEntry value="4"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/> <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#13;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -1,48 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-left}/../"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="leftHalf uhk60-left_release/uhk-left.bin"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-module-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-left"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1792647078"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-left"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -3,6 +3,11 @@
// Macros: // Macros:
#define I2C_WATCHDOG_VALUE_REINIT 1
#define I2C_WATCHDOG_VALUE_REBOOT 2
// #define DEBUG_OVER_SPI // #define DEBUG_OVER_SPI
#define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REINIT
// #define I2C_WATCHDOG I2C_WATCHDOG_VALUE_REBOOT
#endif #endif

View File

@@ -3,36 +3,40 @@
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "test_led.h" #include "test_led.h"
#include "init_peripherals.h" #include "init_peripherals.h"
#include "config.h"
//static uint32_t prevWatchdogCounter = 0; /* NOTE: Because of a bug in the ROM bootloader of the KL03Z, the watchdog timer is disabled and cannot be re-enabled.
uint32_t I2cWatchdog_RecoveryCounter; * See https://community.nxp.com/thread/457893
volatile uint32_t I2cWatchdog_WatchCounter; * Therefore the hardware watchdog timer cannot be used without an extra way to enter bootloader or application mode.
*/
#ifdef I2C_WATCHDOG
static uint32_t prevWatchdogCounter = 0;
static uint32_t I2cWatchdog_RecoveryCounter; /* counter for how many times we had to recover and restart */
void InitI2cWatchdog(void) void RunWatchdog(void)
{ {
lptmr_config_t lptmrConfig; static volatile uint32_t I2cWatchdog_WatchCounter = 0; /* counter for timer */
LPTMR_GetDefaultConfig(&lptmrConfig); static int cntr = 0;
LPTMR_Init(LPTMR0, &lptmrConfig);
LPTMR_SetTimerPeriod(LPTMR0, USEC_TO_COUNT(LPTMR_USEC_COUNT, LPTMR_SOURCE_CLOCK));
LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
EnableIRQ(LPTMR0_IRQn);
LPTMR_StartTimer(LPTMR0);
}
/*
void I2C_WATCHDOG_LPTMR_HANDLER(void)
{
TEST_LED_TOGGLE();
I2cWatchdog_WatchCounter++;
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms cntr++;
// NVIC_SystemReset(); if (cntr==100) { /* we get called from KEY_SCANNER_HANDLER() which runs at 1ms, thus scaling down by 100 here to get 100 ms period */
I2cWatchdog_RecoveryCounter++; cntr=0;
I2C_SlaveDeinit(I2C_BUS_BASEADDR); TEST_LED_TOGGLE();
InitI2c(); I2cWatchdog_WatchCounter++;
if (I2cWatchdog_WatchCounter>10) { /* do not check within the first 1000 ms, as I2C might not be running yet */
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there hasn't been any interrupt during 100 ms. I2C_Watchdog gets incremented for every I2C transaction
I2cWatchdog_RecoveryCounter++;
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REBOOT
NVIC_SystemReset();
#endif
#if I2C_WATCHDOG == I2C_WATCHDOG_VALUE_REINIT
I2C_SlaveDeinit(I2C_BUS_BASEADDR);
initI2c();
#endif
}
}
prevWatchdogCounter = I2C_Watchdog; /* remember previous counter */
} }
prevWatchdogCounter = I2C_Watchdog;
LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);
} }
*/ #endif

View File

@@ -13,7 +13,6 @@
// Functions: // Functions:
void InitI2cWatchdog(void);
void RunWatchdog(void); void RunWatchdog(void);
#endif #endif

View File

@@ -10,6 +10,7 @@
#include "slave_protocol_handler.h" #include "slave_protocol_handler.h"
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "debug_over_spi.h" #include "debug_over_spi.h"
#include "main.h"
i2c_slave_config_t slaveConfig; i2c_slave_config_t slaveConfig;
i2c_slave_handle_t slaveHandle; i2c_slave_handle_t slaveHandle;
@@ -44,14 +45,14 @@ static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *u
} }
} }
void InitInterruptPriorities(void) void initInterruptPriorities(void)
{ {
NVIC_SetPriority(I2C0_IRQn, 1); NVIC_SetPriority(I2C0_IRQn, 1);
NVIC_SetPriority(TPM1_IRQn, 1); NVIC_SetPriority(TPM1_IRQn, 1);
NVIC_SetPriority(SPI0_IRQn, 1); NVIC_SetPriority(SPI0_IRQn, 1);
} }
void InitI2c(void) void initI2c(void)
{ {
port_pin_config_t pinConfig = { port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp, .pullSelect = kPORT_PullUp,
@@ -81,11 +82,10 @@ void InitLedDriver(void)
void InitPeripherals(void) void InitPeripherals(void)
{ {
InitInterruptPriorities(); initInterruptPriorities();
InitLedDriver(); InitLedDriver();
InitTestLed(); InitTestLed();
LedPwm_Init(); LedPwm_Init();
// InitI2cWatchdog();
DebugOverSpi_Init(); DebugOverSpi_Init();
InitI2c(); initI2c();
} }

View File

@@ -11,6 +11,6 @@
// Functions: // Functions:
void InitPeripherals(void); void InitPeripherals(void);
void InitI2c(void); void initI2c(void);
#endif #endif

View File

@@ -1,10 +1,14 @@
#include "fsl_lptmr.h" #include "fsl_lptmr.h"
#include "key_scanner.h" #include "key_scanner.h"
#include "main.h" #include "config.h"
#include "i2c_watchdog.h"
void KEY_SCANNER_HANDLER(void) void KEY_SCANNER_HANDLER(void)
{ {
KeyMatrix_ScanRow(&keyMatrix); KeyMatrix_ScanRow(&keyMatrix);
#ifdef I2C_WATCHDOG
RunWatchdog();
#endif
LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag); LPTMR_ClearStatusFlags(KEY_SCANNER_LPTMR_BASEADDR, kLPTMR_TimerCompareFlag);
} }

View File

@@ -6,6 +6,6 @@
#define MODULE_PROTOCOL_VERSION 1 #define MODULE_PROTOCOL_VERSION 1
#define MODULE_ID ModuleId_LeftKeyboardHalf #define MODULE_ID ModuleId_LeftKeyboardHalf
#define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM) #define MODULE_KEY_COUNT (KEYBOARD_MATRIX_ROWS_NUM * KEYBOARD_MATRIX_COLS_NUM)
#define MODULE_HAS_POINTER false #define MODULE_POINTER_COUNT 0
#endif #endif

View File

@@ -10,10 +10,23 @@
#include "bool_array_converter.h" #include "bool_array_converter.h"
#include "bootloader.h" #include "bootloader.h"
#include "module.h" #include "module.h"
#include "versions.h"
i2c_message_t RxMessage; i2c_message_t RxMessage;
i2c_message_t TxMessage; i2c_message_t TxMessage;
static version_t moduleProtocolVersion = {
MODULE_PROTOCOL_MAJOR_VERSION,
MODULE_PROTOCOL_MINOR_VERSION,
MODULE_PROTOCOL_PATCH_VERSION,
};
static version_t firmwareVersion = {
FIRMWARE_MAJOR_VERSION,
FIRMWARE_MINOR_VERSION,
FIRMWARE_PATCH_VERSION,
};
void SlaveRxHandler(void) void SlaveRxHandler(void)
{ {
if (!CRC16_IsMessageValid(&RxMessage)) { if (!CRC16_IsMessageValid(&RxMessage)) {
@@ -51,21 +64,29 @@ void SlaveTxHandler(void)
TxMessage.length = SLAVE_SYNC_STRING_LENGTH; TxMessage.length = SLAVE_SYNC_STRING_LENGTH;
break; break;
} }
case SlaveProperty_ModuleProtocolVersion: {
memcpy(TxMessage.data, &moduleProtocolVersion, sizeof(version_t));
TxMessage.length = sizeof(version_t);
break;
}
case SlaveProperty_FirmwareVersion: {
memcpy(TxMessage.data, &firmwareVersion, sizeof(version_t));
TxMessage.length = sizeof(version_t);
break;
}
case SlaveProperty_ModuleId: { case SlaveProperty_ModuleId: {
TxMessage.data[0] = MODULE_ID; TxMessage.data[0] = MODULE_ID;
TxMessage.length = 1; TxMessage.length = 1;
break; break;
} }
case SlaveProperty_ProtocolVersion: { case SlaveProperty_KeyCount: {
TxMessage.data[0] = MODULE_PROTOCOL_VERSION; TxMessage.data[0] = MODULE_KEY_COUNT;
TxMessage.length = 1; TxMessage.length = 1;
break; break;
} }
case SlaveProperty_Features: { case SlaveProperty_PointerCount: {
uhk_module_features_t *moduleFeatures = (uhk_module_features_t*)&TxMessage.data; TxMessage.data[0] = MODULE_POINTER_COUNT;
moduleFeatures->keyCount = MODULE_KEY_COUNT; TxMessage.length = 1;
moduleFeatures->hasPointer = MODULE_HAS_POINTER;
TxMessage.length = sizeof(uhk_module_features_t);
break; break;
} }
} }

76
right/Makefile Normal file
View File

@@ -0,0 +1,76 @@
# Copyright (C) 2018 Kristian Lauszus. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# Contact information
# -------------------
# Kristian Lauszus
# Web : http://www.lauszus.com
# e-mail : lauszus@gmail.com
# Set project name.
PROJECT_NAME = uhk_right
# Defines the part type that this project uses.
PART = MK22FN512VLH12
# Defines the linker script to use for the application.
LDSCRIPT = src/link/MK22FN512xxx12_flash.ld
# Size of the heap and stack.
HEAP_SIZE = 0x2000
STACK_SIZE = 0x0400
# Set the compiler CPU and FPU options.
CPU = -mcpu=cortex-m4
FPU = -mfpu=fpv4-sp-d16 -mfloat-abi=hard
# Command for flashing the right half of the keyboard.
FLASH_CMD = node ../lib/agent/packages/usb/update-device-firmware.js $(PROJECT_OBJ:.axf=.hex)
# Path to the JLink script used for the right half.
JLINK_SCRIPT = ../scripts/flash-right.jlink
# Preprocessor directives.
BUILD_FLAGS = -DCPU_$(PART)_cm4 -DUSB_STACK_BM -DBL_HAS_BOOTLOADER_CONFIG=1
# Address of the app vector table. The bootloader will take up the flash before this address.
BL_APP_VECTOR_TABLE_ADDRESS = 0xc000
# Source files.
SOURCE = $(wildcard src/*.c) \
$(wildcard src/*/*.c) \
$(wildcard src/*/*/*.c) \
../lib/bootloader/src/bootloader/src/wormhole.c \
$(wildcard ../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/device/*.c) \
$(wildcard ../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/osa/*.c) \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/system_MK22F51212.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/gcc/startup_MK22F51212.S \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_adc16.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_clock.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_ftm.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_gpio.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_i2c.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_pit.c \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers/fsl_smc.c \
$(wildcard ../shared/*.c)
# Header files.
IPATH = src \
src/ksdk_usb \
src/buspal \
src/buspal/bm_usb \
../lib/bootloader/src \
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/device \
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/include \
../lib/KSDK_2.0_MK22FN512xxx12/middleware/usb_1.0.0/osa \
../lib/KSDK_2.0_MK22FN512xxx12/CMSIS/Include \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212 \
../lib/KSDK_2.0_MK22FN512xxx12/devices/MK22F51212/drivers \
../shared
# Include main Makefile.
include ../scripts/Makedefs.mk

View File

@@ -5,19 +5,19 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_release">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331" name="uhk60-right_release" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.453692058" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.size" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.8609064" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.most" valueType="enumerated"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.704315278" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.108613118" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.916504304" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/>
@@ -57,7 +57,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.1518272175" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.104956045" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1135747399" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.789002772" incrementalBuildTarget="all DEBUG=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.2026990925" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.494477502" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1465555477" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -136,9 +136,6 @@
</tool> </tool>
</toolChain> </toolChain>
</folderInfo> </folderInfo>
<fileInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.621318926" name="wormhole.c" rcbsApplicability="disable" resourcePath="bootloader-shared/wormhole.c" toolsToInvoke="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614">
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335.948885614" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.813655335"/>
</fileInfo>
</configuration> </configuration>
</storageModule> </storageModule>
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
@@ -148,16 +145,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062" name="uhk60-right_debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.622643167" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.274883814" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
@@ -200,7 +197,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2098763517" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.836473542" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1768350063" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1931309296" incrementalBuildTarget="all DEBUG=1" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.894450" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.555709175" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1619685061" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -291,16 +288,16 @@
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone"> <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" moduleId="org.eclipse.cdt.core.settings" name="uhk60-right_debug_standalone">
<externalSettings/> <externalSettings/>
<extensions> <extensions>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
</extensions> </extensions>
</storageModule> </storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0"> <storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release"> <configuration artifactExtension="elf" artifactName="${ProjName}" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release" cleanCommand="${cross_rm} -rf" description="Debug version of uhk60-right without the bootloader" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142" name="uhk60-right_debug_standalone" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release">
<folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath=""> <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142." name="/" resourcePath="">
<toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release"> <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release.788475280" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.release">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.402546001" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/>
@@ -343,7 +340,7 @@
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors.2124713168" name="Generate errors instead of warnings (-Werror)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.warnings.toerrors" value="false" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting.1228214828" name="Create extended listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createlisting" value="false" valueType="boolean"/>
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.1911575583" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/>
<builder buildPath="${workspace_loc:/k64f}/release" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> <builder buildPath="${workspace_loc:/uhk-right}/../" id="ilg.gnuarmeclipse.managedbuild.cross.builder.1942759303" incrementalBuildTarget="all DEBUG=1 BL_APP_VECTOR_TABLE_ADDRESS=0" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" parallelBuildOn="true" parallelizationNumber="optimal" stopOnErr="false" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/>
<tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1355758441" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler">
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.511724221" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/>
<option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/> <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths.1130167410" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.include.paths"/>
@@ -450,13 +447,13 @@
</scannerConfigBuildInfo> </scannerConfigBuildInfo>
</storageModule> </storageModule>
<storageModule moduleId="refreshScope" versionNumber="2"> <storageModule moduleId="refreshScope" versionNumber="2">
<configuration configurationName="uhk60-right_debug_standalone"> <configuration configurationName="uhk60-right_debug">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
<configuration configurationName="uhk60-right_release"> <configuration configurationName="uhk60-right_release">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
<configuration configurationName="uhk60-right_debug"> <configuration configurationName="uhk60-right_debug_standalone">
<resource resourceType="PROJECT" workspacePath="/uhk-right"/> <resource resourceType="PROJECT" workspacePath="/uhk-right"/>
</configuration> </configuration>
</storageModule> </storageModule>

View File

@@ -30,6 +30,16 @@
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
</natures> </natures>
<linkedResources> <linkedResources>
<link>
<name>Makedefs.mk</name>
<type>1</type>
<locationURI>PARENT-2-PROJECT_LOC/scripts/Makedefs.mk</locationURI>
</link>
<link>
<name>Makefile</name>
<type>1</type>
<locationURI>PARENT-1-PROJECT_LOC/Makefile</locationURI>
</link>
<link> <link>
<name>bootloader-shared</name> <name>bootloader-shared</name>
<type>2</type> <type>2</type>

View File

@@ -196,21 +196,27 @@ SECTIONS
text_end = ORIGIN(m_text) + LENGTH(m_text); text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
/* Uninitialized data section */ /* Uninitialized data section */
.bss : .bss : ALIGN(4)
{ {
/* This is used by the startup in order to initialize the .bss section */ /* This is used by the startup in order to initialize the .bss section */
. = ALIGN(4);
__START_BSS = .; __START_BSS = .;
__bss_start__ = .; __bss_start__ = .;
*(.bss) *(.bss)
*(.bss*) *(.bss*)
. = ALIGN(512);
USB_RAM_START = .;
. += USB_RAM_GAP;
*(COMMON) *(COMMON)
. = ALIGN(4); . = ALIGN(4);
} > m_data
.m_usb_bdt (NOLOAD) :
{
. = ALIGN(512);
*(m_usb_bdt)
} > m_data
.m_usb_global (NOLOAD) :
{
*(m_usb_global)
__bss_end__ = .; __bss_end__ = .;
__END_BSS = .; __END_BSS = .;
} > m_data } > m_data
@@ -239,17 +245,6 @@ SECTIONS
. += STACK_SIZE; . += STACK_SIZE;
} > m_data_2 } > m_data_2
m_usb_bdt USB_RAM_START (NOLOAD) :
{
*(m_usb_bdt)
USB_RAM_BDT_END = .;
}
m_usb_global USB_RAM_BDT_END (NOLOAD) :
{
*(m_usb_global)
}
/* Initializes stack on the end of block */ /* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE; __StackLimit = __StackTop - STACK_SIZE;

View File

@@ -204,21 +204,27 @@ SECTIONS
text_end = ORIGIN(m_text) + LENGTH(m_text); text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data") ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
USB_RAM_GAP = DEFINED(__usb_ram_size__) ? __usb_ram_size__ : 0x800;
/* Uninitialized data section */ /* Uninitialized data section */
.bss : .bss : ALIGN(4)
{ {
/* This is used by the startup in order to initialize the .bss section */ /* This is used by the startup in order to initialize the .bss section */
. = ALIGN(4);
__START_BSS = .; __START_BSS = .;
__bss_start__ = .; __bss_start__ = .;
*(.bss) *(.bss)
*(.bss*) *(.bss*)
. = ALIGN(512);
USB_RAM_START = .;
. += USB_RAM_GAP;
*(COMMON) *(COMMON)
. = ALIGN(4); . = ALIGN(4);
} > m_data
.m_usb_bdt (NOLOAD) :
{
. = ALIGN(512);
*(m_usb_bdt)
} > m_data
.m_usb_global (NOLOAD) :
{
*(m_usb_global)
__bss_end__ = .; __bss_end__ = .;
__END_BSS = .; __END_BSS = .;
} > m_data } > m_data
@@ -247,17 +253,6 @@ SECTIONS
. += STACK_SIZE; . += STACK_SIZE;
} > m_data_2 } > m_data_2
m_usb_bdt USB_RAM_START (NOLOAD) :
{
*(m_usb_bdt)
USB_RAM_BDT_END = .;
}
m_usb_global USB_RAM_BDT_END (NOLOAD) :
{
*(m_usb_global)
}
/* Initializes stack on the end of block */ /* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2); __StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE; __StackLimit = __StackTop - STACK_SIZE;

View File

@@ -1,49 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="bad_container_name" value="/uhk-l"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=1 flash"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_debug/uhk-right.hex"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-right"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;&#10;"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -64,10 +64,10 @@
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> <intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> <stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> <stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug/uhk-right.elf"/> <stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="uhk60-right_debug_standalone/uhk-right.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/> <booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331.1297236062.2081695142"/> <stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value=""/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> <listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-right"/> <listEntry value="/uhk-right"/>
</listAttribute> </listAttribute>
@@ -77,6 +77,6 @@
<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> <listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
</listAttribute> </listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#10;"/> <stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;memoryBlockExpressionList context=&quot;Context string&quot;/&gt;&#13;&#10;"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> <stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -1,49 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.cdt.launch.applicationLaunchType"> <launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB" value="true"/> <stringAttribute key="bad_container_name" value="/uhk-l"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.AUTO_SOLIB_LIST"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LAUNCH_CONFIGURATION_BUILD_SCOPE" value="${none}"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="gdb"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK" value="false"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-j8 DEBUG=0 flash"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.GDB_INIT" value=".gdbinit"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/uhk-right}/../"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.REVERSE" value="false"/>
<listAttribute key="org.eclipse.cdt.dsf.gdb.SOLIB_PATH"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE" value="TP_NORMAL_ONLY"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.internal.ui.launching.LocalApplicationCDebuggerTab.DEFAULTS_SET" value="true"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_ID" value="gdb"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="run"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_ARGUMENTS" value="uhk60-right_release/uhk-right.hex"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="../../lib/agent/packages/usb/update-device-firmware.js"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="uhk-right"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="false"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.release.1939339834.1692217331"/>
<booleanAttribute key="org.eclipse.cdt.launch.use_terminal" value="true"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/uhk-right"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#10;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;&#10;"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.DefaultEvent" value="true"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.HideUnresolvedSymbols" value="true"/>
<stringAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.Location" value=""/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Kernel.SourceLineNumbers" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ModuleSymbols" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.MultipleEvents" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Multiplex" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime" value="false"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Realtime.Priority" value="1"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.Record.Verbose" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowSourceDisassembly" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.ShowStat" value="false"/>
<booleanAttribute key="org.eclipse.linuxtools.internal.perf.attr.SourceLineNumbers" value="true"/>
<intAttribute key="org.eclipse.linuxtools.internal.perf.attr.StatRunCount" value="1"/>
<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/>
</launchConfiguration> </launchConfiguration>

View File

@@ -593,9 +593,6 @@ static status_t handle_command_internal(uint8_t *packet, uint32_t packetLength)
else else
{ {
#if FIXED_BUSPAL_BOOTLOADER #if FIXED_BUSPAL_BOOTLOADER
size_t offset;
int res;
status = kStatus_Success; /* set default */ status = kStatus_Success; /* set default */
res = WaitForStartByte(rxBuf, &offset); res = WaitForStartByte(rxBuf, &offset);
if (res==1 && offset==1) if (res==1 && offset==1)

View File

@@ -110,7 +110,7 @@ status_t serial_packet_read(const peripheral_descriptor_t *self,
// Receive the framing data packet. // Receive the framing data packet.
isPacketOk = true; isPacketOk = true;
status_t status = read_data_packet(&framingPacket, g_serialContext.data, packetType); status = read_data_packet(&framingPacket, g_serialContext.data, packetType);
if (status != kStatus_Success) if (status != kStatus_Success)
{ {
// No packet available. // No packet available.

View File

@@ -3,7 +3,4 @@
// Macros: // Macros:
#define I2C_WATCHDOG
// #define LED_DRIVER_STRESS_TEST
#endif #endif

View File

@@ -12,6 +12,11 @@ config_buffer_t ValidatedUserConfigBuffer = { validatedUserConfig };
bool ParserRunDry; bool ParserRunDry;
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId)
{
return ConfigBufferId_HardwareConfig <= configBufferId && configBufferId <= ConfigBufferId_ValidatedUserConfig;
}
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId) config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
{ {
switch (configBufferId) { switch (configBufferId) {
@@ -25,3 +30,16 @@ config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId)
return NULL; return NULL;
} }
} }
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId)
{
switch (configBufferId) {
case ConfigBufferId_HardwareConfig:
return HARDWARE_CONFIG_SIZE;
case ConfigBufferId_StagingUserConfig:
case ConfigBufferId_ValidatedUserConfig:
return USER_CONFIG_SIZE;
default:
return 0;
}
}

View File

@@ -23,6 +23,8 @@
// Functions: // Functions:
bool IsConfigBufferIdValid(config_buffer_id_t configBufferId);
config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId); config_buffer_t* ConfigBufferIdToConfigBuffer(config_buffer_id_t configBufferId);
uint16_t ConfigBufferIdToBufferSize(config_buffer_id_t configBufferId);
#endif #endif

View File

@@ -5,18 +5,33 @@
#include "config_globals.h" #include "config_globals.h"
#include "macros.h" #include "macros.h"
#include "usb_report_updater.h" #include "usb_report_updater.h"
#include "led_display.h"
#include "slave_scheduler.h"
#include "slave_drivers/is31fl3731_driver.h"
#include "config.h"
static parser_error_t parseModuleConfiguration(config_buffer_t *buffer) static parser_error_t parseModuleConfiguration(config_buffer_t *buffer)
{ {
uint8_t id = ReadUInt8(buffer); uint8_t id = ReadUInt8(buffer);
uint8_t pointerMode = ReadUInt8(buffer); // move vs scroll
uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer); uint8_t deceleratedPointerSpeedMultiplier = ReadUInt8(buffer);
uint8_t basePointerSpeedMultiplier = ReadUInt8(buffer); uint8_t basePointerSpeedMultiplier = ReadUInt8(buffer);
uint8_t acceleratedPointerSpeed = ReadUInt8(buffer); uint8_t acceleratedPointerSpeed = ReadUInt8(buffer);
uint16_t angularShift = ReadUInt16(buffer);
uint8_t modLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
uint8_t fnLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
uint8_t mouseLayerPointerFunction = ReadUInt8(buffer); // none vs invertMode vs decelerate vs accelerate
(void)id; (void)id;
(void)pointerMode;
(void)deceleratedPointerSpeedMultiplier; (void)deceleratedPointerSpeedMultiplier;
(void)basePointerSpeedMultiplier; (void)basePointerSpeedMultiplier;
(void)acceleratedPointerSpeed; (void)acceleratedPointerSpeed;
(void)angularShift;
(void)modLayerPointerFunction;
(void)fnLayerPointerFunction;
(void)mouseLayerPointerFunction;
return ParserError_Success; return ParserError_Success;
} }
@@ -41,6 +56,7 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
(void)dataModelMinorVersion; (void)dataModelMinorVersion;
(void)dataModelPatchVersion; (void)dataModelPatchVersion;
(void)deviceName; (void)deviceName;
(void)doubleTapSwitchLayerTimeout;
// LED brightness // LED brightness
@@ -48,10 +64,6 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer); uint8_t alphanumericSegmentsBrightness = ReadUInt8(buffer);
uint8_t keyBacklightBrightness = ReadUInt8(buffer); uint8_t keyBacklightBrightness = ReadUInt8(buffer);
(void)iconsAndLayerTextsBrightness;
(void)alphanumericSegmentsBrightness;
(void)keyBacklightBrightness;
// Mouse kinetic properties // Mouse kinetic properties
uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer); uint8_t mouseMoveInitialSpeed = ReadUInt8(buffer);
@@ -125,7 +137,17 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
// If parsing succeeded then apply the parsed values. // If parsing succeeded then apply the parsed values.
if (!ParserRunDry) { if (!ParserRunDry) {
DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout; // DoubleTapSwitchLayerTimeout = doubleTapSwitchLayerTimeout;
// Update LED brightnesses and reinitialize LED drivers
IconsAndLayerTextsBrightness = iconsAndLayerTextsBrightness;
AlphanumericSegmentsBrightness = alphanumericSegmentsBrightness;
KeyBacklightBrightness = keyBacklightBrightness;
LedSlaveDriver_UpdateLeds();
// Update mouse key speeds
MouseMoveState.initialSpeed = mouseMoveInitialSpeed; MouseMoveState.initialSpeed = mouseMoveInitialSpeed;
MouseMoveState.acceleration = mouseMoveAcceleration; MouseMoveState.acceleration = mouseMoveAcceleration;
@@ -139,6 +161,8 @@ parser_error_t ParseConfig(config_buffer_t *buffer)
MouseScrollState.baseSpeed = mouseScrollBaseSpeed; MouseScrollState.baseSpeed = mouseScrollBaseSpeed;
MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed; MouseScrollState.acceleratedSpeed = mouseScrollAcceleratedSpeed;
// Update counts
AllKeymapsCount = keymapCount; AllKeymapsCount = keymapCount;
AllMacrosCount = macroCount; AllMacrosCount = macroCount;
} }

View File

@@ -116,7 +116,7 @@ static parser_error_t parseKeyAction(key_action_t *keyAction, config_buffer_t *b
return ParserError_InvalidSerializedKeyActionType; return ParserError_InvalidSerializedKeyActionType;
} }
static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId, uint8_t pointerRole) static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buffer, uint8_t moduleId)
{ {
parser_error_t errorCode; parser_error_t errorCode;
uint16_t actionCount = ReadCompactLength(buffer); uint16_t actionCount = ReadCompactLength(buffer);
@@ -137,9 +137,7 @@ static parser_error_t parseKeyActions(uint8_t targetLayer, config_buffer_t *buff
static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer) static parser_error_t parseModule(config_buffer_t *buffer, uint8_t layer)
{ {
uint8_t moduleId = ReadUInt8(buffer); uint8_t moduleId = ReadUInt8(buffer);
uint8_t pointerRole = ReadUInt8(buffer); return parseKeyActions(layer, buffer, moduleId);
return parseKeyActions(layer, buffer, moduleId, pointerRole);
} }
static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer) static parser_error_t parseLayer(config_buffer_t *buffer, uint8_t layer)

View File

@@ -7,13 +7,15 @@ parser_error_t parseKeyMacroAction(config_buffer_t *buffer, macro_action_t *macr
uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction; uint8_t keyMacroType = macroActionType - SerializedMacroActionType_KeyMacroAction;
uint8_t action = keyMacroType & 0b11; uint8_t action = keyMacroType & 0b11;
uint8_t type; uint8_t type;
uint8_t scancode; uint16_t scancode = 0;
uint8_t modifierMask; uint8_t modifierMask;
keyMacroType >>= 2; keyMacroType >>= 2;
type = keyMacroType & 0b11; type = keyMacroType & 0b11;
keyMacroType >>= 2; keyMacroType >>= 2;
scancode = keyMacroType & 0b10 ? ReadUInt8(buffer) : 0; if (keyMacroType & 0b10) {
scancode = type == SerializedKeystrokeType_LongMedia ? ReadUInt16(buffer) : ReadUInt8(buffer);
}
modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0; modifierMask = keyMacroType & 0b01 ? ReadUInt8(buffer) : 0;
macroAction->type = MacroActionType_Key; macroAction->type = MacroActionType_Key;
macroAction->key.action = action; macroAction->key.action = action;

View File

@@ -6,10 +6,10 @@
#include "config_parser/config_globals.h" #include "config_parser/config_globals.h"
#include "buffer.h" #include "buffer.h"
bool IsEepromBusy; volatile bool IsEepromBusy;
static eeprom_operation_t CurrentEepromOperation; static eeprom_operation_t CurrentEepromOperation;
static config_buffer_id_t CurrentConfigBufferId; static config_buffer_id_t CurrentConfigBufferId;
status_t LastEepromTransferStatus; static status_t LastEepromTransferStatus;
void (*SuccessCallback)(void); void (*SuccessCallback)(void);
static i2c_master_handle_t i2cHandle; static i2c_master_handle_t i2cHandle;
@@ -125,3 +125,8 @@ status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t
IsEepromBusy = LastEepromTransferStatus == kStatus_Success; IsEepromBusy = LastEepromTransferStatus == kStatus_Success;
return LastEepromTransferStatus; return LastEepromTransferStatus;
} }
bool IsEepromOperationValid(eeprom_operation_t operation)
{
return operation == EepromOperation_Read || operation == EepromOperation_Write;
}

View File

@@ -24,12 +24,12 @@
// Variables: // Variables:
extern bool IsEepromBusy; extern volatile bool IsEepromBusy;
extern status_t EepromTransferStatus;
// Functions: // Functions:
void EEPROM_Init(void); void EEPROM_Init(void);
status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback)); status_t EEPROM_LaunchTransfer(eeprom_operation_t operation, config_buffer_id_t config_buffer_id, void (*successCallback));
bool IsEepromOperationValid(eeprom_operation_t operation);
#endif #endif

View File

@@ -10,11 +10,12 @@
// Main bus // Main bus
#define I2C_MAIN_BUS_BASEADDR I2C0 #define I2C_MAIN_BUS_BASEADDR I2C0
#define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn #define I2C_MAIN_BUS_IRQ_ID I2C0_IRQn
#define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC #define I2C_MAIN_BUS_CLK_SRC I2C0_CLK_SRC
#define I2C_MAIN_BUS_BAUD_RATE 100000 // 100 kHz works even with a 20 meter long bridge cable. #define I2C_MAIN_BUS_NORMAL_BAUD_RATE 100000
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7 #define I2C_MAIN_BUS_BUSPAL_BAUD_RATE 30000
#define I2C_MAIN_BUS_MUX kPORT_MuxAlt7
#define I2C_MAIN_BUS_SDA_GPIO GPIOD #define I2C_MAIN_BUS_SDA_GPIO GPIOD
#define I2C_MAIN_BUS_SDA_PORT PORTD #define I2C_MAIN_BUS_SDA_PORT PORTD

View File

@@ -0,0 +1,25 @@
#include "fsl_i2c.h"
#include "i2c_error_logger.h"
i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
void LogI2cError(uint8_t slaveId, status_t status)
{
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
uint8_t errorIdx;
for (errorIdx=0; errorIdx<i2cSlaveErrorCounter->errorTypeCount; errorIdx++) {
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
if (currentI2cError->status == status) {
currentI2cError->count++;
break;
}
}
if (errorIdx == i2cSlaveErrorCounter->errorTypeCount && errorIdx < MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE) {
i2cSlaveErrorCounter->errorTypeCount++;
i2c_error_count_t *currentI2cError = i2cSlaveErrorCounter->errors + errorIdx;
currentI2cError->status = status;
currentI2cError->count = 1;
}
}

View File

@@ -0,0 +1,33 @@
#ifndef __I2C_ERROR_LOGGER_H__
#define __I2C_ERROR_LOGGER_H__
// Includes:
#include "fsl_common.h"
#include "slave_scheduler.h"
// Macros:
#define MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE 7
// Typedefs:
typedef struct {
status_t status;
uint32_t count;
} i2c_error_count_t;
typedef struct {
uint8_t errorTypeCount;
i2c_error_count_t errors[MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE];
} i2c_slave_error_counter_t;
// Variables:
extern i2c_slave_error_counter_t I2cSlaveErrorCounters[MAX_SLAVE_COUNT];
// Functions:
void LogI2cError(uint8_t slaveId, status_t status);
#endif

View File

@@ -5,7 +5,6 @@
#include "fsl_gpio.h" #include "fsl_gpio.h"
#include "i2c.h" #include "i2c.h"
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "slave_scheduler.h"
#include "init_peripherals.h" #include "init_peripherals.h"
uint32_t I2cWatchdog_WatchCounter; uint32_t I2cWatchdog_WatchCounter;
@@ -19,17 +18,13 @@ static uint32_t prevWatchdogCounter;
void PIT_I2C_WATCHDOG_HANDLER(void) void PIT_I2C_WATCHDOG_HANDLER(void)
{ {
I2cWatchdog_WatchCounter++; I2cWatchdog_WatchCounter++;
if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there haven't been any interrupts recently if (I2C_Watchdog == prevWatchdogCounter) { // Restart I2C if there haven't been any interrupts recently
I2cWatchdog_RecoveryCounter++; I2cWatchdog_RecoveryCounter++;
i2c_master_config_t masterConfig; ReinitI2cMainBus();
I2C_MasterGetDefaultConfig(&masterConfig);
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
InitI2cMainBus();
InitSlaveScheduler();
} }
prevWatchdogCounter = I2C_Watchdog; prevWatchdogCounter = I2C_Watchdog;
PIT_ClearStatusFlags(PIT, PIT_I2C_WATCHDOG_CHANNEL, PIT_TFLG_TIF_MASK); PIT_ClearStatusFlags(PIT, PIT_I2C_WATCHDOG_CHANNEL, PIT_TFLG_TIF_MASK);
} }

View File

@@ -14,8 +14,22 @@
#include "timer.h" #include "timer.h"
#include "key_debouncer.h" #include "key_debouncer.h"
#include "usb_api.h" #include "usb_api.h"
#include "slave_scheduler.h"
#include "bootloader/wormhole.h"
void InitInterruptPriorities(void) bool IsBusPalOn;
volatile uint32_t I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_NORMAL_BAUD_RATE;
volatile uint32_t I2cMainBusActualBaudRateBps;
static void initBusPalState(void) {
IsBusPalOn = Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal;
if (IsBusPalOn) {
Wormhole.magicNumber = 0;
I2cMainBusRequestedBaudRateBps = I2C_MAIN_BUS_BUSPAL_BAUD_RATE;
}
}
static void initInterruptPriorities(void)
{ {
NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1); NVIC_SetPriority(PIT_I2C_WATCHDOG_IRQ_ID, 1);
NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2); NVIC_SetPriority(PIT_TIMER_IRQ_ID, 2);
@@ -26,12 +40,12 @@ void InitInterruptPriorities(void)
NVIC_SetPriority(USB_IRQ_ID, 3); NVIC_SetPriority(USB_IRQ_ID, 3);
} }
void delay(void) static void delay(void)
{ {
for (volatile uint32_t i=0; i<62; i++); for (volatile uint32_t i=0; i<62; i++);
} }
void recoverI2c(void) static void recoverI2c(void)
{ {
PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(I2C_MAIN_BUS_SDA_PORT, I2C_MAIN_BUS_SDA_PIN, kPORT_MuxAsGpio);
PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio); PORT_SetPinMux(I2C_MAIN_BUS_SCL_PORT, I2C_MAIN_BUS_SCL_PIN, kPORT_MuxAsGpio);
@@ -60,7 +74,7 @@ void recoverI2c(void)
delay(); delay();
} }
void InitI2cMainBus(void) static void initI2cMainBus(void)
{ {
CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK); CLOCK_EnableClock(I2C_MAIN_BUS_SDA_CLOCK);
CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK); CLOCK_EnableClock(I2C_MAIN_BUS_SCL_CLOCK);
@@ -78,12 +92,20 @@ void InitI2cMainBus(void)
i2c_master_config_t masterConfig; i2c_master_config_t masterConfig;
I2C_MasterGetDefaultConfig(&masterConfig); I2C_MasterGetDefaultConfig(&masterConfig);
masterConfig.baudRate_Bps = I2C_MAIN_BUS_BAUD_RATE; masterConfig.baudRate_Bps = I2cMainBusRequestedBaudRateBps;
uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC); uint32_t sourceClock = CLOCK_GetFreq(I2C_MAIN_BUS_CLK_SRC);
I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock); I2C_MasterInit(I2C_MAIN_BUS_BASEADDR, &masterConfig, sourceClock);
I2cMainBusActualBaudRateBps = I2C_ActualBaudRate;
} }
void initI2cEepromBus(void) void ReinitI2cMainBus(void)
{
I2C_MasterDeinit(I2C_MAIN_BUS_BASEADDR);
initI2cMainBus();
InitSlaveScheduler();
}
static void initI2cEepromBus(void)
{ {
port_pin_config_t pinConfig = { port_pin_config_t pinConfig = {
.pullSelect = kPORT_PullUp, .pullSelect = kPORT_PullUp,
@@ -91,7 +113,6 @@ void initI2cEepromBus(void)
.mux = I2C_EEPROM_BUS_MUX, .mux = I2C_EEPROM_BUS_MUX,
}; };
CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK); CLOCK_EnableClock(I2C_EEPROM_BUS_SDA_CLOCK);
CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK); CLOCK_EnableClock(I2C_EEPROM_BUS_SCL_CLOCK);
@@ -105,26 +126,25 @@ void initI2cEepromBus(void)
I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock); I2C_MasterInit(I2C_EEPROM_BUS_BASEADDR, &masterConfig, sourceClock);
} }
void InitI2c(void) static void initI2c(void)
{ {
InitI2cMainBus(); initI2cMainBus();
initI2cEepromBus(); initI2cEepromBus();
} }
void InitPeripherals(void) void InitPeripherals(void)
{ {
InitInterruptPriorities(); initBusPalState();
initInterruptPriorities();
Timer_Init(); Timer_Init();
InitLedDriver(); InitLedDriver();
InitResetButton(); InitResetButton();
InitMergeSensor(); InitMergeSensor();
ADC_Init(); ADC_Init();
InitI2c(); initI2c();
InitTestLed(); InitTestLed();
LedPwm_Init(); LedPwm_Init();
#ifdef I2C_WATCHDOG
InitI2cWatchdog(); InitI2cWatchdog();
#endif
InitKeyDebouncer(); InitKeyDebouncer();
EEPROM_Init(); EEPROM_Init();
} }

View File

@@ -5,9 +5,15 @@
#include "fsl_common.h" #include "fsl_common.h"
// Variables:
extern bool IsBusPalOn;
extern volatile uint32_t I2cMainBusRequestedBaudRateBps;
extern volatile uint32_t I2cMainBusActualBaudRateBps;
// Functions: // Functions:
void InitPeripherals(void); void InitPeripherals(void);
void InitI2cMainBus(void); void ReinitI2cMainBus(void);
#endif #endif

View File

@@ -9,7 +9,7 @@
// Macros: // Macros:
#define KEY_DEBOUNCER_INTERVAL_MSEC 1 #define KEY_DEBOUNCER_INTERVAL_MSEC 1
#define KEY_DEBOUNCER_TIMEOUT_MSEC 10 #define KEY_DEBOUNCER_TIMEOUT_MSEC 60
// Functions: // Functions:

View File

@@ -1,9 +1,12 @@
#include "fsl_pit.h" #include "fsl_pit.h"
#include "key_scanner.h" #include "key_scanner.h"
uint32_t KeyScannerCounter;
void PIT_KEY_SCANNER_HANDLER(void) void PIT_KEY_SCANNER_HANDLER(void)
{ {
KeyMatrix_ScanRow(&RightKeyMatrix); KeyMatrix_ScanRow(&RightKeyMatrix);
KeyScannerCounter++;
PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK); PIT_ClearStatusFlags(PIT, PIT_KEY_SCANNER_CHANNEL, PIT_TFLG_TIF_MASK);
} }

View File

@@ -10,6 +10,10 @@
#define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM) #define KEY_SCANNER_INTERVAL_USEC (1000 / RIGHT_KEY_MATRIX_ROWS_NUM)
// Variables:
extern uint32_t KeyScannerCounter;
// Functions: // Functions:
void InitKeyScanner(void); void InitKeyScanner(void);

View File

@@ -6,17 +6,36 @@
#include "config_parser/config_globals.h" #include "config_parser/config_globals.h"
#include "macros.h" #include "macros.h"
keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = { { "FTY", 0, 3 } }; keymap_reference_t AllKeymaps[MAX_KEYMAP_NUM] = {
{
.abbreviation = "FTY",
.offset = 0,
.abbreviationLen = 3
}
};
uint8_t AllKeymapsCount; uint8_t AllKeymapsCount;
uint8_t DefaultKeymapIndex; uint8_t DefaultKeymapIndex;
uint8_t CurrentKeymapIndex = 0; uint8_t CurrentKeymapIndex = 0;
void SwitchKeymap(uint8_t index) void SwitchKeymapById(uint8_t index)
{ {
CurrentKeymapIndex = index; CurrentKeymapIndex = index;
ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset; ValidatedUserConfigBuffer.offset = AllKeymaps[index].offset;
ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount); ParseKeymap(&ValidatedUserConfigBuffer, index, AllKeymapsCount, AllMacrosCount);
LedDisplay_SetCurrentKeymapText(); LedDisplay_UpdateText();
}
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev)
{
for (uint8_t i=0; i<AllKeymapsCount; i++) {
keymap_reference_t *keymap = AllKeymaps + i;
if (keymap->abbreviationLen == length && memcmp(keymap->abbreviation, abbrev, length) == 0) {
SwitchKeymapById(i);
return true;
}
}
return false;
} }
// The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM. // The factory keymap is initialized before it gets overwritten by the default keymap of the EEPROM.
@@ -157,7 +176,7 @@ key_action_t CurrentKeymap[LAYER_COUNT][SLOT_COUNT][MAX_KEY_COUNT_PER_MODULE] =
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = KeyActionType_None }, { .type = KeyActionType_None },
{ .type = HID_KEYBOARD_SC_MENU }, { .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_APPLICATION }},
{ .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT }}, { .type = KeyActionType_Keystroke, .keystroke = { .scancode = HID_KEYBOARD_SC_RIGHT_SHIFT }},
{ .type = KeyActionType_None }, { .type = KeyActionType_None },

View File

@@ -29,6 +29,7 @@
// Functions: // Functions:
void SwitchKeymap(uint8_t index); void SwitchKeymapById(uint8_t index);
bool SwitchKeymapByAbbreviation(uint8_t length, char *abbrev);
#endif #endif

View File

@@ -3,7 +3,11 @@
#include "layer.h" #include "layer.h"
#include "keymap.h" #include "keymap.h"
static const uint16_t capitalLetterToSegmentSet[] = { uint8_t IconsAndLayerTextsBrightness = 0xff;
uint8_t AlphanumericSegmentsBrightness = 0xff;
bool ledIconStates[LedDisplayIcon_Last];
static const uint16_t capitalLetterToSegmentMap[] = {
0b0000000011110111, 0b0000000011110111,
0b0001001010001111, 0b0001001010001111,
0b0000000000111001, 0b0000000000111001,
@@ -32,7 +36,7 @@ static const uint16_t capitalLetterToSegmentSet[] = {
0b0000110000001001, 0b0000110000001001,
}; };
static const uint16_t digitToSegmentSet[] = { static const uint16_t digitToSegmentMap[] = {
0b0000110000111111, 0b0000110000111111,
0b0000010000000110, 0b0000010000000110,
0b0000100010001011, 0b0000100010001011,
@@ -45,13 +49,13 @@ static const uint16_t digitToSegmentSet[] = {
0b0000000011101111, 0b0000000011101111,
}; };
static uint16_t characterToSegmentSet(char character) static uint16_t characterToSegmentMap(char character)
{ {
switch (character) { switch (character) {
case 'A' ... 'Z': case 'A' ... 'Z':
return capitalLetterToSegmentSet[character - 'A']; return capitalLetterToSegmentMap[character - 'A'];
case '0' ... '9': case '0' ... '9':
return digitToSegmentSet[character - '0']; return digitToSegmentMap[character - '0'];
} }
return 0; return 0;
} }
@@ -62,43 +66,62 @@ void LedDisplay_SetText(uint8_t length, const char* text)
switch (length) { switch (length) {
case 3: case 3:
allSegmentSets = (uint64_t)characterToSegmentSet(text[2]) << 28; allSegmentSets = (uint64_t)characterToSegmentMap(text[2]) << 28;
case 2: case 2:
allSegmentSets |= characterToSegmentSet(text[1]) << 14; allSegmentSets |= characterToSegmentMap(text[1]) << 14;
case 1: case 1:
allSegmentSets |= characterToSegmentSet(text[0]); allSegmentSets |= characterToSegmentMap(text[0]);
} }
LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? LED_BRIGHTNESS_LEVEL : 0; LedDriverValues[LedDriverId_Left][11] = allSegmentSets & 0b00000001 ? AlphanumericSegmentsBrightness : 0;
LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? LED_BRIGHTNESS_LEVEL : 0; LedDriverValues[LedDriverId_Left][12] = allSegmentSets & 0b00000010 ? AlphanumericSegmentsBrightness : 0;
allSegmentSets >>= 2; allSegmentSets >>= 2;
for (uint8_t i = 24; i <= 136; i += 16) { for (uint8_t i = 24; i <= 136; i += 16) {
for (uint8_t j = 0; j < 5; j++) { for (uint8_t j = 0; j < 5; j++) {
LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? LED_BRIGHTNESS_LEVEL : 0; LedDriverValues[LedDriverId_Left][i + j] = allSegmentSets & 1 << j ? AlphanumericSegmentsBrightness : 0;
} }
allSegmentSets >>= 5; allSegmentSets >>= 5;
} }
} }
void LedDisplay_SetCurrentKeymapText(void) void LedDisplay_SetLayer(layer_id_t layerId)
{
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
}
void LedDisplay_SetLayer(uint8_t layerId)
{ {
for (uint8_t i = 13; i <= 45; i += 16) { for (uint8_t i = 13; i <= 45; i += 16) {
LedDriverValues[LedDriverId_Left][i] = 0; LedDriverValues[LedDriverId_Left][i] = 0;
} }
if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) { if (layerId >= LayerId_Mod && layerId <= LayerId_Mouse) {
LedDriverValues[LedDriverId_Left][16 * layerId - 3] = LED_BRIGHTNESS_LEVEL; LedDriverValues[LedDriverId_Left][16 * layerId - 3] = IconsAndLayerTextsBrightness;
} }
} }
bool LedDisplay_GetIcon(led_display_icon_t icon)
{
return LedDriverValues[LedDriverId_Left][8 + icon];
}
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled) void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled)
{ {
LedDriverValues[LedDriverId_Left][8 + icon] = isEnabled ? LED_BRIGHTNESS_LEVEL : 0; ledIconStates[icon] = isEnabled;
LedDriverValues[LedDriverId_Left][icon + 8] = isEnabled ? IconsAndLayerTextsBrightness : 0;
}
void LedDisplay_UpdateIcons(void)
{
for (led_display_icon_t i=0; i<=LedDisplayIcon_Last; i++) {
LedDisplay_SetIcon(i, ledIconStates[i]);
}
}
void LedDisplay_UpdateText(void)
{
keymap_reference_t *currentKeymap = AllKeymaps + CurrentKeymapIndex;
LedDisplay_SetText(currentKeymap->abbreviationLen, currentKeymap->abbreviation);
}
void LedDisplay_UpdateAll(void)
{
LedDisplay_UpdateIcons();
LedDisplay_UpdateText();
} }

View File

@@ -5,6 +5,7 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include "layer.h"
// Typedefs: // Typedefs:
@@ -12,13 +13,22 @@
LedDisplayIcon_CapsLock, LedDisplayIcon_CapsLock,
LedDisplayIcon_Agent, LedDisplayIcon_Agent,
LedDisplayIcon_Adaptive, LedDisplayIcon_Adaptive,
LedDisplayIcon_Last = LedDisplayIcon_Adaptive,
} led_display_icon_t; } led_display_icon_t;
// Variables:
extern uint8_t IconsAndLayerTextsBrightness;
extern uint8_t AlphanumericSegmentsBrightness;
// Functions: // Functions:
void LedDisplay_SetText(uint8_t length, const char* text); void LedDisplay_SetText(uint8_t length, const char* text);
void LedDisplay_SetCurrentKeymapText(void); void LedDisplay_SetLayer(layer_id_t layerId);
void LedDisplay_SetLayer(uint8_t layerId); bool LedDisplay_GetIcon(led_display_icon_t icon);
void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled); void LedDisplay_SetIcon(led_display_icon_t icon, bool isEnabled);
void LedDisplay_UpdateIcons(void);
void LedDisplay_UpdateText(void);
void LedDisplay_UpdateAll(void);
#endif #endif

View File

@@ -0,0 +1,277 @@
/*
** ###################################################################
** Processors: MK22FN512CAP12
** MK22FN512VDC12
** MK22FN512VLH12
** MK22FN512VLL12
** MK22FN512VMP12
**
** Compiler: GNU C Compiler
** Reference manual: K22P121M120SF7RM, Rev. 1, March 24, 2014
** Version: rev. 2.8, 2015-02-19
** Build: b151217
**
** Abstract:
** Linker file for the GNU C Compiler
**
** Copyright (c) 2015 Freescale Semiconductor, Inc.
** All rights reserved.
**
** Redistribution and use in source and binary forms, with or without modification,
** are permitted provided that the following conditions are met:
**
** o Redistributions of source code must retain the above copyright notice, this list
** of conditions and the following disclaimer.
**
** o Redistributions in binary form must reproduce the above copyright notice, this
** list of conditions and the following disclaimer in the documentation and/or
** other materials provided with the distribution.
**
** o Neither the name of Freescale Semiconductor, Inc. nor the names of its
** contributors may be used to endorse or promote products derived from this
** software without specific prior written permission.
**
** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
** ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
** WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
** ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
** (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
** LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
** ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
**
** http: www.freescale.com
** mail: support@freescale.com
**
** ###################################################################
*/
/* Entry Point */
ENTRY(Reset_Handler)
HEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x2000;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;
M_VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x0400 : 0x0;
/* This should match the value in bootloader_config.h if KBOOT is used */
BL_APP_VECTOR_TABLE_ADDRESS = DEFINED(__bl_app_vector_table_address__) ? __bl_app_vector_table_address__ : 0;
/* Specify the memory areas */
MEMORY
{
m_interrupts (RX) : ORIGIN = 0x0 + BL_APP_VECTOR_TABLE_ADDRESS, LENGTH = 0x00000400
m_text (RX) : ORIGIN = 0x00000400 + BL_APP_VECTOR_TABLE_ADDRESS, LENGTH = 512K - 0x400 - BL_APP_VECTOR_TABLE_ADDRESS
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000FF00
m_noinit (RW) : ORIGIN = 0x2000FF00, LENGTH = 0x000000FF
}
/* Define output sections */
SECTIONS
{
/* The startup code goes first into internal flash */
.interrupts :
{
__VECTOR_TABLE = .;
. = ALIGN(4);
KEEP(*(.isr_vector)) /* Startup code */
. = ALIGN(4);
} > m_interrupts
/* The program code and other data goes into internal flash */
.text :
{
. = ALIGN(4);
*(.text) /* .text sections (code) */
*(.text*) /* .text* sections (code) */
*(.rodata) /* .rodata sections (constants, strings, etc.) */
*(.rodata*) /* .rodata* sections (constants, strings, etc.) */
*(.glue_7) /* glue arm to thumb code */
*(.glue_7t) /* glue thumb to arm code */
*(.eh_frame)
KEEP (*(.init))
KEEP (*(.fini))
. = ALIGN(4);
} > m_text
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > m_text
.ARM :
{
__exidx_start = .;
*(.ARM.exidx*)
__exidx_end = .;
} > m_text
.ctors :
{
__CTOR_LIST__ = .;
/* gcc uses crtbegin.o to find the start of
the constructors, so we make sure it is
first. Because this is a wildcard, it
doesn't matter if the user does not
actually link against crtbegin.o; the
linker won't look for a file to match a
wildcard. The wildcard also means that it
doesn't matter which directory crtbegin.o
is in. */
KEEP (*crtbegin.o(.ctors))
KEEP (*crtbegin?.o(.ctors))
/* We don't want to include the .ctor section from
from the crtend.o file until after the sorted ctors.
The .ctor section from the crtend file contains the
end of ctors marker and it must be last */
KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*(.ctors))
__CTOR_END__ = .;
} > m_text
.dtors :
{
__DTOR_LIST__ = .;
KEEP (*crtbegin.o(.dtors))
KEEP (*crtbegin?.o(.dtors))
KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*(.dtors))
__DTOR_END__ = .;
} > m_text
.preinit_array :
{
PROVIDE_HIDDEN (__preinit_array_start = .);
KEEP (*(.preinit_array*))
PROVIDE_HIDDEN (__preinit_array_end = .);
} > m_text
.init_array :
{
PROVIDE_HIDDEN (__init_array_start = .);
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array*))
PROVIDE_HIDDEN (__init_array_end = .);
} > m_text
.fini_array :
{
PROVIDE_HIDDEN (__fini_array_start = .);
KEEP (*(SORT(.fini_array.*)))
KEEP (*(.fini_array*))
PROVIDE_HIDDEN (__fini_array_end = .);
} > m_text
__etext = .; /* define a global symbol at end of code */
__DATA_ROM = .; /* Symbol is used by startup for data initialization */
.interrupts_ram :
{
. = ALIGN(4);
__VECTOR_RAM__ = .;
__interrupts_ram_start__ = .; /* Create a global symbol at data start */
*(.m_interrupts_ram) /* This is a user defined section */
. += M_VECTOR_RAM_SIZE;
. = ALIGN(4);
__interrupts_ram_end__ = .; /* Define a global symbol at data end */
} > m_data
__VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);
__RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;
.data : AT(__DATA_ROM)
{
. = ALIGN(4);
__DATA_RAM = .;
__data_start__ = .; /* create a global symbol at data start */
*(.data) /* .data sections */
*(.data*) /* .data* sections */
KEEP(*(.jcr*))
. = ALIGN(4);
__data_end__ = .; /* define a global symbol at data end */
} > m_data
__DATA_END = __DATA_ROM + (__data_end__ - __data_start__);
text_end = ORIGIN(m_text) + LENGTH(m_text);
ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")
/* Uninitialized data section */
.bss : ALIGN(4)
{
/* This is used by the startup in order to initialize the .bss section */
__START_BSS = .;
__bss_start__ = .;
*(.bss)
*(.bss*)
*(COMMON)
. = ALIGN(4);
} > m_data
.m_usb_bdt (NOLOAD) :
{
. = ALIGN(512);
*(m_usb_bdt)
} > m_data
.m_usb_global (NOLOAD) :
{
*(m_usb_global)
__bss_end__ = .;
__END_BSS = .;
} > m_data
.m_data_2 :
{
. = ALIGN(4);
*(.m_data_2) /* This is an User defined section */
. = ALIGN(4);
} > m_data_2
.heap :
{
. = ALIGN(8);
__end__ = .;
PROVIDE(end = .);
_pvHeapStart = .; /* Add for _sbrk */
__HeapBase = .;
. += HEAP_SIZE;
__HeapLimit = .;
__heap_limit = .; /* Add for _sbrk */
} > m_data_2
.stack :
{
. = ALIGN(8);
. += STACK_SIZE;
} > m_data_2
/* Initializes stack on the end of block */
__StackTop = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);
.ARM.attributes 0 : { *(.ARM.attributes) }
ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap")
.noinit (NOLOAD):
{
. = ALIGN(4);
_noinit = .;
*(.noinit .noinit.*)
. = ALIGN(4) ;
_end_noinit = .;
} > m_noinit
/* Mandatory to be word aligned, _sbrk assumes this */
PROVIDE ( end = _end_noinit ); /* was _ebss */
PROVIDE ( _end = _end_noinit );
PROVIDE ( __end = _end_noinit );
PROVIDE ( __end__ = _end_noinit );
}

View File

@@ -39,7 +39,7 @@
struct { struct {
macro_sub_action_t action; macro_sub_action_t action;
keystroke_type_t type; keystroke_type_t type;
uint8_t scancode; uint16_t scancode;
uint8_t modifierMask; uint8_t modifierMask;
} ATTR_PACKED key; } ATTR_PACKED key;
struct { struct {

View File

@@ -5,27 +5,26 @@
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "bus_pal_hardware.h" #include "bus_pal_hardware.h"
#include "command.h" #include "command.h"
#include "bootloader/wormhole.h"
#include "eeprom.h" #include "eeprom.h"
#include "key_scanner.h" #include "key_scanner.h"
#include "usb_commands/usb_command_apply_config.h" #include "usb_commands/usb_command_apply_config.h"
#include "peripherals/reset_button.h" #include "peripherals/reset_button.h"
#include "usb_report_updater.h" #include "usb_report_updater.h"
bool IsEepromInitialized = false; static bool IsEepromInitialized = false;
bool IsConfigInitialized = false; static bool IsConfigInitialized = false;
void userConfigurationReadFinished(void) static void userConfigurationReadFinished(void)
{ {
IsEepromInitialized = true; IsEepromInitialized = true;
} }
void hardwareConfigurationReadFinished(void) static void hardwareConfigurationReadFinished(void)
{ {
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished); EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_StagingUserConfig, userConfigurationReadFinished);
} }
void main(void) int main(void)
{ {
InitClock(); InitClock();
InitPeripherals(); InitPeripherals();
@@ -34,8 +33,7 @@ void main(void)
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished); EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, hardwareConfigurationReadFinished);
} }
if (Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal) { if (IsBusPalOn) {
Wormhole.magicNumber = 0;
init_hardware(); init_hardware();
handleUsbBusPalCommand(); handleUsbBusPalCommand();
} else { } else {

View File

@@ -2,7 +2,7 @@
#include "fsl_port.h" #include "fsl_port.h"
#include "peripherals/adc.h" #include "peripherals/adc.h"
adc16_channel_config_t adc16ChannelConfigStruct; static adc16_channel_config_t adc16ChannelConfigStruct;
void ADC_Init(void) void ADC_Init(void)
{ {

View File

@@ -3,6 +3,7 @@
#include "slave_scheduler.h" #include "slave_scheduler.h"
#include "led_display.h" #include "led_display.h"
uint8_t KeyBacklightBrightness = 0xff;
uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT]; uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_COUNT] = { static led_driver_state_t ledDriverStates[LED_DRIVER_MAX_COUNT] = {
@@ -61,6 +62,22 @@ static uint8_t setShutdownModeNormalBuffer[] = {LED_DRIVER_REGISTER_SHUTDOWN, SH
static uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1}; static uint8_t setFrame1Buffer[] = {LED_DRIVER_REGISTER_FRAME, LED_DRIVER_FRAME_1};
static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH]; static uint8_t updatePwmRegistersBuffer[PWM_REGISTER_BUFFER_LENGTH];
void LedSlaveDriver_DisableLeds(void)
{
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
memset(LedDriverValues[ledDriverId], 0, LED_DRIVER_LED_COUNT);
}
}
void LedSlaveDriver_UpdateLeds(void)
{
for (uint8_t ledDriverId=0; ledDriverId<=LedDriverId_Last; ledDriverId++) {
memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
}
LedDisplay_UpdateAll();
}
void LedSlaveDriver_Init(uint8_t ledDriverId) void LedSlaveDriver_Init(uint8_t ledDriverId)
{ {
if (ledDriverId == ISO_KEY_LED_DRIVER_ID && IS_ISO) { if (ledDriverId == ISO_KEY_LED_DRIVER_ID && IS_ISO) {
@@ -70,8 +87,11 @@ void LedSlaveDriver_Init(uint8_t ledDriverId)
led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId; led_driver_state_t *currentLedDriverState = ledDriverStates + ledDriverId;
currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame; currentLedDriverState->phase = LedDriverPhase_SetFunctionFrame;
currentLedDriverState->ledIndex = 0; currentLedDriverState->ledIndex = 0;
memset(LedDriverValues[ledDriverId], LED_BRIGHTNESS_LEVEL, LED_DRIVER_LED_COUNT); memset(LedDriverValues[ledDriverId], KeyBacklightBrightness, LED_DRIVER_LED_COUNT);
LedDisplay_SetCurrentKeymapText();
if (ledDriverId == LedDriverId_Left) {
LedDisplay_UpdateAll();
}
} }
status_t LedSlaveDriver_Update(uint8_t ledDriverId) status_t LedSlaveDriver_Update(uint8_t ledDriverId)
@@ -111,10 +131,8 @@ status_t LedSlaveDriver_Update(uint8_t ledDriverId)
*ledIndex += chunkSize; *ledIndex += chunkSize;
if (*ledIndex >= LED_DRIVER_LED_COUNT) { if (*ledIndex >= LED_DRIVER_LED_COUNT) {
*ledIndex = 0; *ledIndex = 0;
#ifndef LED_DRIVER_STRESS_TEST
memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT); memcpy(currentLedDriverState->targetLedValues, ledValues, LED_DRIVER_LED_COUNT);
*ledDriverPhase = LedDriverPhase_UpdateChangedLedValues; *ledDriverPhase = LedDriverPhase_UpdateChangedLedValues;
#endif
} }
break; break;
case LedDriverPhase_UpdateChangedLedValues: { case LedDriverPhase_UpdateChangedLedValues: {

View File

@@ -12,7 +12,6 @@
#define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19 #define LED_CONTROL_REGISTERS_COMMAND_LENGTH 19
#define PMW_REGISTER_UPDATE_CHUNK_SIZE 8 #define PMW_REGISTER_UPDATE_CHUNK_SIZE 8
#define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE) #define PWM_REGISTER_BUFFER_LENGTH (1 + PMW_REGISTER_UPDATE_CHUNK_SIZE)
#define LED_BRIGHTNESS_LEVEL 0xff
#define IS_ISO true #define IS_ISO true
#define ISO_KEY_LED_DRIVER_ID LedDriverId_Left #define ISO_KEY_LED_DRIVER_ID LedDriverId_Left
@@ -24,6 +23,7 @@
typedef enum { typedef enum {
LedDriverId_Right, LedDriverId_Right,
LedDriverId_Left, LedDriverId_Left,
LedDriverId_Last = LedDriverId_Left,
} led_driver_id_t; } led_driver_id_t;
typedef enum { typedef enum {
@@ -45,10 +45,13 @@
// Variables: // Variables:
extern uint8_t KeyBacklightBrightness;
extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT]; extern uint8_t LedDriverValues[LED_DRIVER_MAX_COUNT][LED_DRIVER_LED_COUNT];
// Functions: // Functions:
void LedSlaveDriver_DisableLeds(void);
void LedSlaveDriver_UpdateLeds(void);
void LedSlaveDriver_Init(uint8_t ledDriverId); void LedSlaveDriver_Init(uint8_t ledDriverId);
status_t LedSlaveDriver_Update(uint8_t ledDriverId); status_t LedSlaveDriver_Update(uint8_t ledDriverId);

View File

@@ -4,7 +4,7 @@
kboot_driver_state_t KbootDriverState; kboot_driver_state_t KbootDriverState;
static uint8_t rxBuffer[MAX_KBOOT_COMMAND_LENGTH]; static uint8_t rxBuffer[KBOOT_PACKAGE_MAX_LENGTH];
static uint8_t pingCommand[] = {0x5a, 0xa6}; static uint8_t pingCommand[] = {0x5a, 0xa6};
static uint8_t resetCommand[] = {0x5a, 0xa4, 0x04, 0x00, 0x6f, 0x46, 0x0b, 0x00, 0x00, 0x00}; static uint8_t resetCommand[] = {0x5a, 0xa4, 0x04, 0x00, 0x6f, 0x46, 0x0b, 0x00, 0x00, 0x00};
static uint8_t ackMessage[] = {0x5a, 0xa1}; static uint8_t ackMessage[] = {0x5a, 0xa1};
@@ -27,50 +27,52 @@ status_t KbootSlaveDriver_Update(uint8_t kbootInstanceId)
{ {
status_t status = kStatus_Uhk_IdleSlave; status_t status = kStatus_Uhk_IdleSlave;
switch (KbootDriverState.commandType) { switch (KbootDriverState.command) {
case KbootCommand_Idle: case KbootCommand_Idle:
break; break;
case KbootCommand_Ping: case KbootCommand_Ping:
switch (KbootDriverState.phase) { switch (KbootDriverState.phase) {
case 0: case KbootPhase_SendPing:
status = tx(pingCommand, sizeof(pingCommand)); status = tx(pingCommand, sizeof(pingCommand));
KbootDriverState.phase++; KbootDriverState.phase = KbootPhase_CheckPingStatus;
break; break;
case 1: case KbootPhase_CheckPingStatus:
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus; KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
KbootDriverState.phase = KbootDriverState.status == kStatus_Success ? 2 : 0; KbootDriverState.phase = KbootDriverState.status == kStatus_Success
return kStatus_Uhk_NoTransfer; ? KbootPhase_ReceivePingResponse
case 2: : KbootPhase_SendPing;
status = rx(10); return kStatus_Uhk_IdleCycle;
KbootDriverState.phase++; case KbootPhase_ReceivePingResponse:
status = rx(KBOOT_PACKAGE_LENGTH_PING_RESPONSE);
KbootDriverState.phase = KbootPhase_CheckPingResponseStatus;
break; break;
case 3: case KbootPhase_CheckPingResponseStatus:
KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus; KbootDriverState.status = Slaves[SlaveId_KbootDriver].previousStatus;
if (KbootDriverState.status == kStatus_Success) { if (KbootDriverState.status == kStatus_Success) {
KbootDriverState.commandType = KbootCommand_Idle; KbootDriverState.command = KbootCommand_Idle;
} else { } else {
KbootDriverState.phase = 0; KbootDriverState.phase = KbootPhase_SendPing;
return kStatus_Uhk_NoTransfer; return kStatus_Uhk_IdleCycle;
} }
} }
break; break;
case KbootCommand_Reset: case KbootCommand_Reset:
switch (KbootDriverState.phase) { switch (KbootDriverState.phase) {
case 0: case KbootPhase_SendReset:
status = tx(resetCommand, sizeof(resetCommand)); status = tx(resetCommand, sizeof(resetCommand));
KbootDriverState.phase++; KbootDriverState.phase = KbootPhase_ReceiveResetAck;
break; break;
case 1: case KbootPhase_ReceiveResetAck:
status = rx(2); status = rx(KBOOT_PACKAGE_LENGTH_ACK);
KbootDriverState.phase++; KbootDriverState.phase = KbootPhase_ReceiveResetGenericResponse;
break; break;
case 2: case KbootPhase_ReceiveResetGenericResponse:
status = rx(18); status = rx(KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE);
KbootDriverState.phase++; KbootDriverState.phase = KbootPhase_CheckResetSendAck;
break; break;
case 3: case KbootPhase_CheckResetSendAck:
status = tx(ackMessage, sizeof(ackMessage)); status = tx(ackMessage, sizeof(ackMessage));
KbootDriverState.commandType = KbootCommand_Idle; KbootDriverState.command = KbootCommand_Idle;
break; break;
} }
break; break;

View File

@@ -7,7 +7,10 @@
// Macros: // Macros:
#define MAX_KBOOT_COMMAND_LENGTH 32 #define KBOOT_PACKAGE_MAX_LENGTH 32
#define KBOOT_PACKAGE_LENGTH_PING_RESPONSE 10
#define KBOOT_PACKAGE_LENGTH_ACK 2
#define KBOOT_PACKAGE_LENGTH_GENERIC_RESPONSE 18
// Typedefs: // Typedefs:
@@ -21,8 +24,22 @@
KbootCommand_Reset, KbootCommand_Reset,
} kboot_command_t; } kboot_command_t;
typedef enum {
KbootPhase_SendPing,
KbootPhase_CheckPingStatus,
KbootPhase_ReceivePingResponse,
KbootPhase_CheckPingResponseStatus,
} kboot_ping_phase_t;
typedef enum {
KbootPhase_SendReset,
KbootPhase_ReceiveResetAck,
KbootPhase_ReceiveResetGenericResponse,
KbootPhase_CheckResetSendAck,
} kboot_reset_phase_t;
typedef struct { typedef struct {
kboot_command_t commandType; kboot_command_t command;
uint8_t i2cAddress; uint8_t i2cAddress;
uint8_t phase; uint8_t phase;
uint32_t status; uint32_t status;

View File

@@ -69,6 +69,13 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
switch (*uhkModulePhase) { switch (*uhkModulePhase) {
// Jump to bootloader
case UhkModulePhase_JumpToBootloader:
txMessage.data[0] = SlaveCommand_JumpToBootloader;
txMessage.length = 1;
status = tx(i2cAddress);
break;
// Sync communication // Sync communication
case UhkModulePhase_RequestSync: case UhkModulePhase_RequestSync:
txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[0] = SlaveCommand_RequestProperty;
@@ -84,32 +91,54 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
case UhkModulePhase_ProcessSync: { case UhkModulePhase_ProcessSync: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage); bool isMessageValid = CRC16_IsMessageValid(rxMessage);
bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0; bool isSyncValid = memcmp(rxMessage->data, SlaveSyncString, SLAVE_SYNC_STRING_LENGTH) == 0;
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isSyncValid && isMessageValid *uhkModulePhase = isSyncValid && isMessageValid
? UhkModulePhase_RequestProtocolVersion ? UhkModulePhase_RequestModuleProtocolVersion
: UhkModulePhase_RequestSync; : UhkModulePhase_RequestSync;
break; break;
} }
// Get protocol version // Get module protocol version
case UhkModulePhase_RequestProtocolVersion: case UhkModulePhase_RequestModuleProtocolVersion:
txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[0] = SlaveCommand_RequestProperty;
txMessage.data[1] = SlaveProperty_ProtocolVersion; txMessage.data[1] = SlaveProperty_ModuleProtocolVersion;
txMessage.length = 2; txMessage.length = 2;
status = tx(i2cAddress); status = tx(i2cAddress);
*uhkModulePhase = UhkModulePhase_ReceiveProtocolVersion; *uhkModulePhase = UhkModulePhase_ReceiveModuleProtocolVersion;
break; break;
case UhkModulePhase_ReceiveProtocolVersion: case UhkModulePhase_ReceiveModuleProtocolVersion:
status = rx(rxMessage, i2cAddress); status = rx(rxMessage, i2cAddress);
*uhkModulePhase = UhkModulePhase_ProcessProtocolVersion; *uhkModulePhase = UhkModulePhase_ProcessModuleProtocolVersion;
break; break;
case UhkModulePhase_ProcessProtocolVersion: { case UhkModulePhase_ProcessModuleProtocolVersion: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage); bool isMessageValid = CRC16_IsMessageValid(rxMessage);
if (isMessageValid) { if (isMessageValid) {
uhkModuleState->protocolVersion = rxMessage->data[0]; memcpy(&uhkModuleState->moduleProtocolVersion, rxMessage->data, sizeof(version_t));
} }
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestProtocolVersion; *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestFirmwareVersion : UhkModulePhase_RequestModuleProtocolVersion;
break;
}
// Get firmware version
case UhkModulePhase_RequestFirmwareVersion:
txMessage.data[0] = SlaveCommand_RequestProperty;
txMessage.data[1] = SlaveProperty_FirmwareVersion;
txMessage.length = 2;
status = tx(i2cAddress);
*uhkModulePhase = UhkModulePhase_ReceiveFirmwareVersion;
break;
case UhkModulePhase_ReceiveFirmwareVersion:
status = rx(rxMessage, i2cAddress);
*uhkModulePhase = UhkModulePhase_ProcessFirmwareVersion;
break;
case UhkModulePhase_ProcessFirmwareVersion: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
if (isMessageValid) {
memcpy(&uhkModuleState->firmwareVersion, rxMessage->data, sizeof(version_t));
}
status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleId : UhkModulePhase_RequestFirmwareVersion;
break; break;
} }
@@ -130,30 +159,52 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
if (isMessageValid) { if (isMessageValid) {
uhkModuleState->moduleId = rxMessage->data[0]; uhkModuleState->moduleId = rxMessage->data[0];
} }
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleFeatures : UhkModulePhase_RequestModuleId; *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModuleKeyCount : UhkModulePhase_RequestModuleId;
break; break;
} }
// Get module features // Get module key count
case UhkModulePhase_RequestModuleFeatures: case UhkModulePhase_RequestModuleKeyCount:
txMessage.data[0] = SlaveCommand_RequestProperty; txMessage.data[0] = SlaveCommand_RequestProperty;
txMessage.data[1] = SlaveProperty_Features; txMessage.data[1] = SlaveProperty_KeyCount;
txMessage.length = 2; txMessage.length = 2;
status = tx(i2cAddress); status = tx(i2cAddress);
*uhkModulePhase = UhkModulePhase_ReceiveModuleFeatures; *uhkModulePhase = UhkModulePhase_ReceiveModuleKeyCount;
break; break;
case UhkModulePhase_ReceiveModuleFeatures: case UhkModulePhase_ReceiveModuleKeyCount:
status = rx(rxMessage, i2cAddress); status = rx(rxMessage, i2cAddress);
*uhkModulePhase = UhkModulePhase_ProcessModuleFeatures; *uhkModulePhase = UhkModulePhase_ProcessModuleKeyCount;
break; break;
case UhkModulePhase_ProcessModuleFeatures: { case UhkModulePhase_ProcessModuleKeyCount: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage); bool isMessageValid = CRC16_IsMessageValid(rxMessage);
if (isMessageValid) { if (isMessageValid) {
memcpy(&uhkModuleState->features, rxMessage->data, sizeof(uhk_module_features_t)); uhkModuleState->keyCount = rxMessage->data[0];
} }
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModuleFeatures; *uhkModulePhase = isMessageValid ? UhkModulePhase_RequestModulePointerCount : UhkModulePhase_RequestModuleKeyCount;
break;
}
// Get module pointer count
case UhkModulePhase_RequestModulePointerCount:
txMessage.data[0] = SlaveCommand_RequestProperty;
txMessage.data[1] = SlaveProperty_PointerCount;
txMessage.length = 2;
status = tx(i2cAddress);
*uhkModulePhase = UhkModulePhase_ReceiveModulePointerCount;
break;
case UhkModulePhase_ReceiveModulePointerCount:
status = rx(rxMessage, i2cAddress);
*uhkModulePhase = UhkModulePhase_ProcessModulePointerCount;
break;
case UhkModulePhase_ProcessModulePointerCount: {
bool isMessageValid = CRC16_IsMessageValid(rxMessage);
if (isMessageValid) {
uhkModuleState->pointerCount = rxMessage->data[0];
}
status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = isMessageValid ? UhkModulePhase_RequestKeyStates : UhkModulePhase_RequestModulePointerCount;
break; break;
} }
@@ -171,32 +222,19 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
case UhkModulePhase_ProcessKeystates: case UhkModulePhase_ProcessKeystates:
if (CRC16_IsMessageValid(rxMessage)) { if (CRC16_IsMessageValid(rxMessage)) {
uint8_t slotId = uhkModuleDriverId + 1; uint8_t slotId = uhkModuleDriverId + 1;
BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->features.keyCount); BoolBitsToBytes(rxMessage->data, keyStatesBuffer, uhkModuleState->keyCount);
for (uint8_t keyId=0; keyId<uhkModuleState->features.keyCount; keyId++) { for (uint8_t keyId=0; keyId<uhkModuleState->keyCount; keyId++) {
KeyStates[slotId][keyId].current = keyStatesBuffer[keyId]; KeyStates[slotId][keyId].current = keyStatesBuffer[keyId];
} }
} }
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
*uhkModulePhase = UhkModulePhase_JumpToBootloader;
break;
// Jump to bootloader
case UhkModulePhase_JumpToBootloader:
if (uhkModuleState->jumpToBootloader) {
txMessage.data[0] = SlaveCommand_JumpToBootloader;
txMessage.length = 1;
status = tx(i2cAddress);
uhkModuleState->jumpToBootloader = false;
} else {
status = kStatus_Uhk_NoTransfer;
}
*uhkModulePhase = UhkModulePhase_SetTestLed; *uhkModulePhase = UhkModulePhase_SetTestLed;
break; break;
// Set test LED // Set test LED
case UhkModulePhase_SetTestLed: case UhkModulePhase_SetTestLed:
if (uhkModuleSourceVars->isTestLedOn == uhkModuleTargetVars->isTestLedOn) { if (uhkModuleSourceVars->isTestLedOn == uhkModuleTargetVars->isTestLedOn) {
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
} else { } else {
txMessage.data[0] = SlaveCommand_SetTestLed; txMessage.data[0] = SlaveCommand_SetTestLed;
txMessage.data[1] = uhkModuleSourceVars->isTestLedOn; txMessage.data[1] = uhkModuleSourceVars->isTestLedOn;
@@ -210,7 +248,7 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId)
// Set PWM brightness // Set PWM brightness
case UhkModulePhase_SetLedPwmBrightness: case UhkModulePhase_SetLedPwmBrightness:
if (uhkModuleSourceVars->ledPwmBrightness == uhkModuleTargetVars->ledPwmBrightness) { if (uhkModuleSourceVars->ledPwmBrightness == uhkModuleTargetVars->ledPwmBrightness) {
status = kStatus_Uhk_NoTransfer; status = kStatus_Uhk_IdleCycle;
} else { } else {
txMessage.data[0] = SlaveCommand_SetLedPwmBrightness; txMessage.data[0] = SlaveCommand_SetLedPwmBrightness;
txMessage.data[1] = uhkModuleSourceVars->ledPwmBrightness; txMessage.data[1] = uhkModuleSourceVars->ledPwmBrightness;

View File

@@ -5,6 +5,7 @@
#include "fsl_common.h" #include "fsl_common.h"
#include "crc16.h" #include "crc16.h"
#include "versions.h"
// Macros: // Macros:
@@ -29,19 +30,29 @@
UhkModulePhase_ProcessSync, UhkModulePhase_ProcessSync,
// Get protocol version // Get protocol version
UhkModulePhase_RequestProtocolVersion, UhkModulePhase_RequestModuleProtocolVersion,
UhkModulePhase_ReceiveProtocolVersion, UhkModulePhase_ReceiveModuleProtocolVersion,
UhkModulePhase_ProcessProtocolVersion, UhkModulePhase_ProcessModuleProtocolVersion,
// Get firmware version
UhkModulePhase_RequestFirmwareVersion,
UhkModulePhase_ReceiveFirmwareVersion,
UhkModulePhase_ProcessFirmwareVersion,
// Get module id // Get module id
UhkModulePhase_RequestModuleId, UhkModulePhase_RequestModuleId,
UhkModulePhase_ReceiveModuleId, UhkModulePhase_ReceiveModuleId,
UhkModulePhase_ProcessModuleId, UhkModulePhase_ProcessModuleId,
// Get module features // Get module key count
UhkModulePhase_RequestModuleFeatures, UhkModulePhase_RequestModuleKeyCount,
UhkModulePhase_ReceiveModuleFeatures, UhkModulePhase_ReceiveModuleKeyCount,
UhkModulePhase_ProcessModuleFeatures, UhkModulePhase_ProcessModuleKeyCount,
// Get module key count
UhkModulePhase_RequestModulePointerCount,
UhkModulePhase_ReceiveModulePointerCount,
UhkModulePhase_ProcessModulePointerCount,
// Get key states // Get key states
UhkModulePhase_RequestKeyStates, UhkModulePhase_RequestKeyStates,
@@ -49,9 +60,9 @@
UhkModulePhase_ProcessKeystates, UhkModulePhase_ProcessKeystates,
// Misc phases // Misc phases
UhkModulePhase_JumpToBootloader,
UhkModulePhase_SetTestLed, UhkModulePhase_SetTestLed,
UhkModulePhase_SetLedPwmBrightness, UhkModulePhase_SetLedPwmBrightness,
UhkModulePhase_JumpToBootloader,
} uhk_module_phase_t; } uhk_module_phase_t;
@@ -62,15 +73,16 @@
typedef struct { typedef struct {
uint8_t moduleId; uint8_t moduleId;
uint8_t protocolVersion; version_t moduleProtocolVersion;
version_t firmwareVersion;
uhk_module_phase_t phase; uhk_module_phase_t phase;
uhk_module_vars_t sourceVars; uhk_module_vars_t sourceVars;
uhk_module_vars_t targetVars; uhk_module_vars_t targetVars;
i2c_message_t rxMessage; i2c_message_t rxMessage;
uint8_t firmwareI2cAddress; uint8_t firmwareI2cAddress;
uint8_t bootloaderI2cAddress; uint8_t bootloaderI2cAddress;
uhk_module_features_t features; uint8_t keyCount;
bool jumpToBootloader; uint8_t pointerCount;
} uhk_module_state_t; } uhk_module_state_t;
typedef struct { typedef struct {

View File

@@ -6,6 +6,8 @@
#include "slave_drivers/kboot_driver.h" #include "slave_drivers/kboot_driver.h"
#include "i2c.h" #include "i2c.h"
#include "i2c_addresses.h" #include "i2c_addresses.h"
#include "config.h"
#include "i2c_error_logger.h"
uint32_t I2cSlaveScheduler_Counter; uint32_t I2cSlaveScheduler_Counter;
@@ -48,23 +50,27 @@ uhk_slave_t Slaves[] = {
static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t previousStatus, void *userData) static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t previousStatus, void *userData)
{ {
bool isFirstIteration = true; bool isFirstCycle = true;
bool isTransferScheduled = false; bool isTransferScheduled = false;
I2cSlaveScheduler_Counter++; I2cSlaveScheduler_Counter++;
do { do {
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
uhk_slave_t *currentSlave = Slaves + currentSlaveId; uhk_slave_t *currentSlave = Slaves + currentSlaveId;
previousSlave->previousStatus = previousStatus; if (isFirstCycle) {
uhk_slave_t *previousSlave = Slaves + previousSlaveId;
previousSlave->previousStatus = previousStatus;
if (IS_STATUS_I2C_ERROR(previousStatus)) {
LogI2cError(previousSlaveId, previousStatus);
}
if (isFirstIteration) {
bool wasPreviousSlaveConnected = previousSlave->isConnected; bool wasPreviousSlaveConnected = previousSlave->isConnected;
previousSlave->isConnected = previousStatus == kStatus_Success; previousSlave->isConnected = previousStatus == kStatus_Success;
if (wasPreviousSlaveConnected && !previousSlave->isConnected && previousSlave->disconnect) { if (wasPreviousSlaveConnected && !previousSlave->isConnected && previousSlave->disconnect) {
previousSlave->disconnect(previousSlaveId); previousSlave->disconnect(previousSlaveId);
} }
isFirstIteration = false;
isFirstCycle = false;
} }
if (!currentSlave->isConnected) { if (!currentSlave->isConnected) {
@@ -72,18 +78,21 @@ static void slaveSchedulerCallback(I2C_Type *base, i2c_master_handle_t *handle,
} }
status_t currentStatus = currentSlave->update(currentSlave->perDriverId); status_t currentStatus = currentSlave->update(currentSlave->perDriverId);
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_NoTransfer; if (IS_STATUS_I2C_ERROR(currentStatus)) {
LogI2cError(currentSlaveId, currentStatus);
}
isTransferScheduled = currentStatus != kStatus_Uhk_IdleSlave && currentStatus != kStatus_Uhk_IdleCycle;
if (isTransferScheduled) { if (isTransferScheduled) {
currentSlave->isConnected = true; currentSlave->isConnected = true;
} }
if (currentStatus != kStatus_Uhk_NoTransfer) { if (currentStatus != kStatus_Uhk_IdleCycle) {
previousSlaveId = currentSlaveId++; previousSlaveId = currentSlaveId++;
if (currentSlaveId >= SLAVE_COUNT) {
currentSlaveId = 0;
}
} }
if (currentSlaveId >= (sizeof(Slaves) / sizeof(uhk_slave_t))) {
currentSlaveId = 0;
}
} while (!isTransferScheduled); } while (!isTransferScheduled);
} }
@@ -92,7 +101,7 @@ void InitSlaveScheduler(void)
previousSlaveId = 0; previousSlaveId = 0;
currentSlaveId = 0; currentSlaveId = 0;
for (uint8_t i=0; i<sizeof(Slaves) / sizeof(uhk_slave_t); i++) { for (uint8_t i=0; i<SLAVE_COUNT; i++) {
uhk_slave_t *currentSlave = Slaves + i; uhk_slave_t *currentSlave = Slaves + i;
currentSlave->isConnected = false; currentSlave->isConnected = false;
} }

View File

@@ -4,6 +4,14 @@
// Includes: // Includes:
#include "fsl_common.h" #include "fsl_common.h"
#include "config.h"
// Macros:
#define SLAVE_COUNT (sizeof(Slaves) / sizeof(uhk_slave_t))
#define MAX_SLAVE_COUNT 6
#define IS_VALID_SLAVE_ID(slaveId) (0 <= slaveId && slaveId <= MAX_SLAVE_COUNT)
#define IS_STATUS_I2C_ERROR(status) (kStatus_I2C_Busy <= status && status <= kStatus_I2C_Timeout)
// Typedefs: // Typedefs:
@@ -30,12 +38,12 @@
} uhk_slave_t; } uhk_slave_t;
typedef enum { typedef enum {
kStatusGroup_Uhk = -1, kStatusGroup_Uhk = 200,
} uhk_status_group_t; } uhk_status_group_t;
typedef enum { typedef enum {
kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), // Another slave should be scheduled kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), // Another slave should be scheduled
kStatus_Uhk_NoTransfer = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled kStatus_Uhk_IdleCycle = MAKE_STATUS(kStatusGroup_Uhk, 1), // The same slave should be rescheduled
} uhk_status_t; } uhk_status_t;
// Variables: // Variables:

View File

@@ -13,7 +13,7 @@
// Macros: // Macros:
#define SLOT_COUNT 4 #define SLOT_COUNT 4
#define IS_VALID_SLAVE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule) #define IS_VALID_MODULE_SLOT(slotId) (SlotId_LeftKeyboardHalf <= (slotId) && (slotId) <= SlotId_RightModule)
// Typedefs: // Typedefs:

View File

@@ -1,7 +1,7 @@
#include "fsl_pit.h" #include "fsl_pit.h"
#include "timer.h" #include "timer.h"
uint32_t CurrentTime; static volatile uint32_t CurrentTime;
void PIT_TIMER_HANDLER(void) void PIT_TIMER_HANDLER(void)
{ {
@@ -24,9 +24,24 @@ void Timer_Init(void)
PIT_StartTimer(PIT, PIT_TIMER_CHANNEL); PIT_StartTimer(PIT, PIT_TIMER_CHANNEL);
} }
uint32_t Timer_GetCurrentTime() {
return CurrentTime;
}
void Timer_SetCurrentTime(uint32_t *time)
{
*time = CurrentTime;
}
uint32_t Timer_GetElapsedTime(uint32_t *time) uint32_t Timer_GetElapsedTime(uint32_t *time)
{ {
uint32_t elapsedTime = CurrentTime - *time; uint32_t elapsedTime = CurrentTime - *time;
return elapsedTime;
}
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time)
{
uint32_t elapsedTime = Timer_GetElapsedTime(time);
*time = CurrentTime; *time = CurrentTime;
return elapsedTime; return elapsedTime;
} }

View File

@@ -9,13 +9,12 @@
#define TIMER_INTERVAL_MSEC 1 #define TIMER_INTERVAL_MSEC 1
// Variables:
extern uint32_t CurrentTime;
// Functions: // Functions:
void Timer_Init(void); void Timer_Init(void);
uint32_t Timer_GetCurrentTime();
void Timer_SetCurrentTime(uint32_t *time);
uint32_t Timer_GetElapsedTime(uint32_t *time); uint32_t Timer_GetElapsedTime(uint32_t *time);
uint32_t Timer_GetElapsedTimeAndSetCurrent(uint32_t *time);
#endif #endif

View File

@@ -45,15 +45,9 @@ void UsbCommand_ApplyConfig(void)
} }
// Switch to the keymap of the updated configuration of the same name or the default keymap. // Switch to the keymap of the updated configuration of the same name or the default keymap.
if (SwitchKeymapByAbbreviation(oldKeymapAbbreviationLen, oldKeymapAbbreviation)) {
for (uint8_t keymapId = 0; keymapId < AllKeymapsCount; keymapId++) { return;
if (AllKeymaps[keymapId].abbreviationLen == oldKeymapAbbreviationLen &&
!memcmp(oldKeymapAbbreviation, AllKeymaps[keymapId].abbreviation, oldKeymapAbbreviationLen))
{
SwitchKeymap(keymapId);
return;
}
} }
SwitchKeymap(DefaultKeymapIndex); SwitchKeymapById(DefaultKeymapIndex);
} }

View File

@@ -5,6 +5,12 @@
#include "i2c_watchdog.h" #include "i2c_watchdog.h"
#include "buffer.h" #include "buffer.h"
#include "timer.h" #include "timer.h"
#include "key_scanner.h"
#include "usb_report_updater.h"
#include "usb_interfaces/usb_interface_basic_keyboard.h"
#include "usb_interfaces/usb_interface_media_keyboard.h"
#include "usb_interfaces/usb_interface_system_keyboard.h"
#include "usb_interfaces/usb_interface_mouse.h"
uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH]; uint8_t DebugBuffer[USB_GENERIC_HID_OUT_BUFFER_LENGTH];
@@ -14,7 +20,14 @@ void UsbCommand_GetDebugBuffer(void)
SetDebugBufferUint32(5, I2cSlaveScheduler_Counter); SetDebugBufferUint32(5, I2cSlaveScheduler_Counter);
SetDebugBufferUint32(9, I2cWatchdog_WatchCounter); SetDebugBufferUint32(9, I2cWatchdog_WatchCounter);
SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter); SetDebugBufferUint32(13, I2cWatchdog_RecoveryCounter);
SetDebugBufferUint32(40, CurrentTime); SetDebugBufferUint32(17, KeyScannerCounter);
SetDebugBufferUint32(21, UsbReportUpdateCounter);
SetDebugBufferUint32(25, Timer_GetCurrentTime());
SetDebugBufferUint32(29, UsbGenericHidActionCounter);
SetDebugBufferUint32(33, UsbBasicKeyboardActionCounter);
SetDebugBufferUint32(37, UsbMediaKeyboardActionCounter);
SetDebugBufferUint32(41, UsbSystemKeyboardActionCounter);
SetDebugBufferUint32(45, UsbMouseActionCounter);
memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH); memcpy(GenericHidOutBuffer, DebugBuffer, USB_GENERIC_HID_OUT_BUFFER_LENGTH);
} }

View File

@@ -0,0 +1,78 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_get_device_property.h"
#include "usb_protocol_handler.h"
#include "eeprom.h"
#include "versions.h"
#include "slave_drivers/kboot_driver.h"
#include "i2c.h"
#include "init_peripherals.h"
#include "fsl_i2c.h"
#include "timer.h"
version_t deviceProtocolVersion = {
DEVICE_PROTOCOL_MAJOR_VERSION,
DEVICE_PROTOCOL_MINOR_VERSION,
DEVICE_PROTOCOL_PATCH_VERSION,
};
version_t protocolVersions[] =
{
{
FIRMWARE_MAJOR_VERSION,
FIRMWARE_MINOR_VERSION,
FIRMWARE_PATCH_VERSION,
},
{
DEVICE_PROTOCOL_MAJOR_VERSION,
DEVICE_PROTOCOL_MINOR_VERSION,
DEVICE_PROTOCOL_PATCH_VERSION,
},
{
MODULE_PROTOCOL_MAJOR_VERSION,
MODULE_PROTOCOL_MINOR_VERSION,
MODULE_PROTOCOL_PATCH_VERSION,
},
{
USER_CONFIG_MAJOR_VERSION,
USER_CONFIG_MINOR_VERSION,
USER_CONFIG_PATCH_VERSION,
},
{
HARDWARE_CONFIG_MAJOR_VERSION,
HARDWARE_CONFIG_MINOR_VERSION,
HARDWARE_CONFIG_PATCH_VERSION,
}
};
uint16_t configSizes[] = {HARDWARE_CONFIG_SIZE, USER_CONFIG_SIZE};
void UsbCommand_GetDeviceProperty(void)
{
uint8_t propertyId = GetUsbRxBufferUint8(1);
switch (propertyId) {
case DevicePropertyId_DeviceProtocolVersion:
memcpy(GenericHidOutBuffer+1, (uint8_t*)&deviceProtocolVersion, sizeof(deviceProtocolVersion));
break;
case DevicePropertyId_ProtocolVersions:
memcpy(GenericHidOutBuffer+1, (uint8_t*)&protocolVersions, sizeof(protocolVersions));
break;
case DevicePropertyId_ConfigSizes:
memcpy(GenericHidOutBuffer+1, (uint8_t*)&configSizes, sizeof(configSizes));
break;
case DevicePropertyId_CurrentKbootCommand:
GenericHidOutBuffer[1] = KbootDriverState.command;
break;
case DevicePropertyId_I2cMainBusBaudRate:
GenericHidOutBuffer[1] = I2C_MAIN_BUS_BASEADDR->F;
SetUsbTxBufferUint32(2, I2cMainBusRequestedBaudRateBps);
SetUsbTxBufferUint32(6, I2cMainBusActualBaudRateBps);
break;
case DevicePropertyId_Uptime:
SetUsbTxBufferUint32(1, Timer_GetCurrentTime());
break;
default:
SetUsbTxBufferUint8(0, UsbStatusCode_GetDeviceProperty_InvalidProperty);
break;
}
}

View File

@@ -0,0 +1,23 @@
#ifndef __USB_COMMAND_GET_DEVICE_PROPERTY_H__
#define __USB_COMMAND_GET_DEVICE_PROPERTY_H__
// Typedefs:
typedef enum {
DevicePropertyId_DeviceProtocolVersion = 0,
DevicePropertyId_ProtocolVersions = 1,
DevicePropertyId_ConfigSizes = 2,
DevicePropertyId_CurrentKbootCommand = 3,
DevicePropertyId_I2cMainBusBaudRate = 4,
DevicePropertyId_Uptime = 5,
} device_property_t;
typedef enum {
UsbStatusCode_GetDeviceProperty_InvalidProperty = 2,
} usb_status_code_get_device_property_t;
// Functions:
void UsbCommand_GetDeviceProperty(void);
#endif

View File

@@ -1,5 +1,5 @@
#include "fsl_common.h" #include "fsl_common.h"
#include "usb_commands/usb_command_get_keyboard_state.h" #include "usb_commands/usb_command_get_device_state.h"
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
#include "peripherals/merge_sensor.h" #include "peripherals/merge_sensor.h"

View File

@@ -0,0 +1,26 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_get_module_property.h"
#include "usb_protocol_handler.h"
#include "slot.h"
#include "slave_drivers/uhk_module_driver.h"
void UsbCommand_GetModuleProperty()
{
slot_t slotId = GetUsbRxBufferUint8(1);
if (!IS_VALID_MODULE_SLOT(slotId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidModuleSlotId);
}
module_property_id_t modulePropertyId = GetUsbRxBufferUint8(2);
switch (modulePropertyId) {
case ModulePropertyId_VersionNumbers: {
uint8_t moduleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
uhk_module_state_t *moduleState = UhkModuleStates + moduleDriverId;
GenericHidOutBuffer[1] = moduleState->moduleId;
memcpy(GenericHidOutBuffer + 2, &moduleState->moduleProtocolVersion, sizeof(version_t));
memcpy(GenericHidOutBuffer + 8, &moduleState->firmwareVersion, sizeof(version_t));
break;
}
}
}

View File

@@ -0,0 +1,18 @@
#ifndef __USB_COMMAND_GET_MODULE_PROPERTY_H__
#define __USB_COMMAND_GET_MODULE_PROPERTY_H__
// Functions:
void UsbCommand_GetModuleProperty();
// Typedefs:
typedef enum {
ModulePropertyId_VersionNumbers = 0,
} module_property_id_t;
typedef enum {
UsbStatusCode_GetModuleProperty_InvalidModuleSlotId = 2,
} usb_status_code_get_module_property_t;
#endif

View File

@@ -1,33 +0,0 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_get_property.h"
#include "usb_protocol_handler.h"
#include "eeprom.h"
void UsbCommand_GetProperty(void)
{
uint8_t propertyId = GetUsbRxBufferUint8(1);
switch (propertyId) {
case SystemPropertyId_UsbProtocolVersion:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_USB_PROTOCOL_VERSION);
break;
case SystemPropertyId_BridgeProtocolVersion:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION);
break;
case SystemPropertyId_DataModelVersion:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_DATA_MODEL_VERSION);
break;
case SystemPropertyId_FirmwareVersion:
SetUsbTxBufferUint8(1, SYSTEM_PROPERTY_FIRMWARE_VERSION);
break;
case SystemPropertyId_HardwareConfigSize:
SetUsbTxBufferUint16(1, HARDWARE_CONFIG_SIZE);
break;
case SystemPropertyId_UserConfigSize:
SetUsbTxBufferUint16(1, USER_CONFIG_SIZE);
break;
default:
SetUsbTxBufferUint8(0, UsbStatusCode_GetProperty_InvalidProperty);
break;
}
}

View File

@@ -1,30 +0,0 @@
#ifndef __USB_COMMAND_GET_PROPERTY_H__
#define __USB_COMMAND_GET_PROPERTY_H__
// Macros:
#define SYSTEM_PROPERTY_USB_PROTOCOL_VERSION 1
#define SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION 1
#define SYSTEM_PROPERTY_DATA_MODEL_VERSION 1
#define SYSTEM_PROPERTY_FIRMWARE_VERSION 1
// Typedefs:
typedef enum {
SystemPropertyId_UsbProtocolVersion = 0,
SystemPropertyId_BridgeProtocolVersion = 1,
SystemPropertyId_DataModelVersion = 2,
SystemPropertyId_FirmwareVersion = 3,
SystemPropertyId_HardwareConfigSize = 4,
SystemPropertyId_UserConfigSize = 5,
} system_property_t;
typedef enum {
UsbStatusCode_GetProperty_InvalidProperty = 2,
} usb_status_code_get_property_t;
// Functions:
void UsbCommand_GetProperty(void);
#endif

View File

@@ -0,0 +1,19 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_get_slave_i2c_errors.h"
#include "usb_protocol_handler.h"
#include "slave_scheduler.h"
#include "i2c_error_logger.h"
void UsbCommand_GetSlaveI2cErrors()
{
uint8_t slaveId = GetUsbRxBufferUint8(1);
if (!IS_VALID_SLAVE_ID(slaveId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_GetModuleProperty_InvalidSlaveId);
}
i2c_slave_error_counter_t *i2cSlaveErrorCounter = I2cSlaveErrorCounters + slaveId;
GenericHidOutBuffer[1] = i2cSlaveErrorCounter->errorTypeCount;
memcpy(GenericHidOutBuffer + 2, i2cSlaveErrorCounter->errors, sizeof(i2c_error_count_t) * MAX_LOGGED_I2C_ERROR_TYPES_PER_SLAVE);
}

View File

@@ -0,0 +1,14 @@
#ifndef __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
#define __USB_COMMAND_GET_SLAVE_I2C_ERRORS_H__
// Functions:
void UsbCommand_GetSlaveI2cErrors();
// Typedefs:
typedef enum {
UsbStatusCode_GetModuleProperty_InvalidSlaveId = 2,
} usb_status_code_get_slave_i2c_errors_t;
#endif

View File

@@ -7,11 +7,11 @@ void UsbCommand_JumpToModuleBootloader(void)
{ {
uint8_t slotId = GetUsbRxBufferUint8(1); uint8_t slotId = GetUsbRxBufferUint8(1);
if (!IS_VALID_SLAVE_SLOT(slotId)) { if (!IS_VALID_MODULE_SLOT(slotId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId); SetUsbTxBufferUint8(0, UsbStatusCode_JumpToModuleBootloader_InvalidSlaveSlotId);
return; return;
} }
uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId); uint8_t uhkModuleDriverId = SLOT_ID_TO_UHK_MODULE_DRIVER_ID(slotId);
UhkModuleStates[uhkModuleDriverId].jumpToBootloader = true; UhkModuleStates[uhkModuleDriverId].phase = UhkModulePhase_JumpToBootloader;
} }

View File

@@ -0,0 +1,25 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_launch_eeprom_transfer.h"
#include "usb_protocol_handler.h"
#include "eeprom.h"
#include "config_parser/config_globals.h"
void UsbCommand_LaunchEepromTransfer(void)
{
eeprom_operation_t eepromOperation = GetUsbRxBufferUint8(1);
config_buffer_id_t configBufferId = GetUsbRxBufferUint8(2);
if (!IsEepromOperationValid(eepromOperation)) {
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation);
}
if (!IsConfigBufferIdValid(configBufferId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId);
}
status_t status = EEPROM_LaunchTransfer(eepromOperation, configBufferId, NULL);
if (status != kStatus_Success) {
SetUsbTxBufferUint8(0, UsbStatusCode_LaunchEepromTransfer_TransferError);
SetUsbTxBufferUint32(1, status);
}
}

View File

@@ -0,0 +1,16 @@
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_H__
// Typedef
typedef enum {
UsbStatusCode_LaunchEepromTransfer_InvalidEepromOperation = 2,
UsbStatusCode_LaunchEepromTransfer_InvalidConfigBufferId = 3,
UsbStatusCode_LaunchEepromTransfer_TransferError = 4,
} usb_status_code_launch_eeprom_transfer_t;
// Functions:
void UsbCommand_LaunchEepromTransfer(void);
#endif

View File

@@ -1,23 +0,0 @@
#include "fsl_common.h"
#include "usb_commands/usb_command_launch_eeprom_transfer_legacy.h"
#include "usb_protocol_handler.h"
#include "eeprom.h"
void UsbCommand_LaunchEepromTransferLegacy(void)
{
uint8_t legacyEepromTransferId = GetUsbRxBufferUint8(1);
switch (legacyEepromTransferId) {
case 0:
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_HardwareConfig, NULL);
break;
case 1:
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_HardwareConfig, NULL);
break;
case 2:
EEPROM_LaunchTransfer(EepromOperation_Read, ConfigBufferId_ValidatedUserConfig, NULL);
break;
case 3:
EEPROM_LaunchTransfer(EepromOperation_Write, ConfigBufferId_ValidatedUserConfig, NULL);
break;
}
}

View File

@@ -1,8 +0,0 @@
#ifndef __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
#define __USB_COMMAND_LAUNCH_EEPROM_TRANSFER_LEGACY_H__
// Functions:
void UsbCommand_LaunchEepromTransferLegacy(void);
#endif

View File

@@ -3,23 +3,28 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
void UsbCommand_ReadConfig(bool isHardware) void UsbCommand_ReadConfig()
{ {
uint8_t length = GetUsbRxBufferUint8(1); config_buffer_id_t configBufferId = GetUsbRxBufferUint8(1);
uint16_t offset = GetUsbRxBufferUint16(2); uint8_t length = GetUsbRxBufferUint8(2);
uint16_t offset = GetUsbRxBufferUint16(3);
if (!IsConfigBufferIdValid(configBufferId)) {
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_InvalidConfigBufferId);
}
if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) { if (length > USB_GENERIC_HID_OUT_BUFFER_LENGTH - USB_STATUS_CODE_SIZE) {
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge); SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_LengthTooLarge);
return; return;
} }
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : ValidatedUserConfigBuffer.buffer; config_buffer_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId);
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
if (offset + length > bufferLength) { if (offset + length > bufferLength) {
SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds); SetUsbTxBufferUint8(0, UsbStatusCode_ReadConfig_BufferOutOfBounds);
return; return;
} }
memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer + offset, length); memcpy(GenericHidOutBuffer + USB_STATUS_CODE_SIZE, buffer->buffer + offset, length);
} }

View File

@@ -3,13 +3,14 @@
// Functions: // Functions:
void UsbCommand_ReadConfig(bool isHardware); void UsbCommand_ReadConfig();
// Typedefs: // Typedefs:
typedef enum { typedef enum {
UsbStatusCode_ReadConfig_LengthTooLarge = 2, UsbStatusCode_ReadConfig_InvalidConfigBufferId = 2,
UsbStatusCode_ReadConfig_BufferOutOfBounds = 3, UsbStatusCode_ReadConfig_LengthTooLarge = 3,
UsbStatusCode_ReadConfig_BufferOutOfBounds = 4,
} usb_status_code_read_config_t; } usb_status_code_read_config_t;
#endif #endif

View File

@@ -6,5 +6,5 @@ void UsbCommand_SendKbootCommandToModule(void)
{ {
KbootDriverState.phase = 0; KbootDriverState.phase = 0;
KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2); KbootDriverState.i2cAddress = GetUsbRxBufferUint8(2);
KbootDriverState.commandType = GetUsbRxBufferUint8(1); // Command should be set last. KbootDriverState.command = GetUsbRxBufferUint8(1); // Command should be set last.
} }

View File

@@ -0,0 +1,11 @@
#include "usb_protocol_handler.h"
#include "usb_commands/usb_command_set_i2c_baud_rate.h"
#include "init_peripherals.h"
#include "fsl_i2c.h"
void UsbCommand_SetI2cBaudRate(void)
{
uint32_t i2cBaudRate = GetUsbRxBufferUint32(1);
I2cMainBusRequestedBaudRateBps = i2cBaudRate;
ReinitI2cMainBus();
}

View File

@@ -0,0 +1,8 @@
#ifndef __USB_COMMAND_SET_I2C_BAUD_RATE__
#define __USB_COMMAND_SET_I2C_BAUD_RATE__
// Functions:
void UsbCommand_SetI2cBaudRate(void);
#endif

View File

@@ -0,0 +1,17 @@
#include "usb_protocol_handler.h"
#include "usb_commands/usb_command_switch_keymap.h"
#include "keymap.h"
void UsbCommand_SwitchKeymap(void)
{
uint32_t keymapLength = GetUsbRxBufferUint8(1);
char *keymapAbbrev = (char*)GenericHidInBuffer + 2;
if (keymapLength > KEYMAP_ABBREVIATION_LENGTH) {
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength);
}
if (!SwitchKeymapByAbbreviation(keymapLength, keymapAbbrev)) {
SetUsbTxBufferUint8(0, UsbStatusCode_SwitchKeymap_InvalidAbbreviation);
}
}

View File

@@ -0,0 +1,15 @@
#ifndef __USB_COMMAND_SWITCH_KEYMAP_H__
#define __USB_COMMAND_SWITCH_KEYMAP_H__
// Functions:
void UsbCommand_SwitchKeymap(void);
// Typedefs:
typedef enum {
UsbStatusCode_SwitchKeymap_InvalidAbbreviationLength = 2,
UsbStatusCode_SwitchKeymap_InvalidAbbreviation = 3,
} usb_status_code_switch_keymap_t;
#endif

View File

@@ -3,7 +3,7 @@
#include "usb_protocol_handler.h" #include "usb_protocol_handler.h"
#include "eeprom.h" #include "eeprom.h"
void UsbCommand_WriteConfig(bool isHardware) void UsbCommand_WriteConfig(config_buffer_id_t configBufferId)
{ {
uint8_t length = GetUsbRxBufferUint8(1); uint8_t length = GetUsbRxBufferUint8(1);
uint16_t offset = GetUsbRxBufferUint16(2); uint16_t offset = GetUsbRxBufferUint16(2);
@@ -14,8 +14,8 @@ void UsbCommand_WriteConfig(bool isHardware)
return; return;
} }
uint8_t *buffer = isHardware ? HardwareConfigBuffer.buffer : StagingUserConfigBuffer.buffer; uint8_t *buffer = ConfigBufferIdToConfigBuffer(configBufferId)->buffer;
uint16_t bufferLength = isHardware ? HARDWARE_CONFIG_SIZE : USER_CONFIG_SIZE; uint16_t bufferLength = ConfigBufferIdToBufferSize(configBufferId);
if (offset + length > bufferLength) { if (offset + length > bufferLength) {
SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds); SetUsbTxBufferUint8(0, UsbStatusCode_WriteConfig_BufferOutOfBounds);

View File

@@ -1,9 +1,9 @@
#ifndef __USB_COMMAND_WRITE_CONFIG_H__ #ifndef __USB_COMMAND_WRITE_CONFIG_H__
#define __USB_COMMAND_WRITE_CONFIG_H__ #define __USB_COMMAND_WRITE_CONFIG_H__
// Functions: // Includes:
void UsbCommand_WriteConfig(bool isHardware); #include "config_parser/config_globals.h"
// Typedefs: // Typedefs:
@@ -12,4 +12,8 @@
UsbStatusCode_WriteConfig_BufferOutOfBounds = 3, UsbStatusCode_WriteConfig_BufferOutOfBounds = 3,
} usb_status_code_write_config_t; } usb_status_code_write_config_t;
// Functions:
void UsbCommand_WriteConfig(config_buffer_id_t configBufferId);
#endif #endif

View File

@@ -1,3 +1,6 @@
#include "config.h"
#include "led_display.h"
#include "slave_drivers/is31fl3731_driver.h"
#include "usb_device_config.h" #include "usb_device_config.h"
#include "usb_composite_device.h" #include "usb_composite_device.h"
#include "usb_descriptors/usb_descriptor_hid.h" #include "usb_descriptors/usb_descriptor_hid.h"
@@ -5,37 +8,207 @@
#include "bus_pal_hardware.h" #include "bus_pal_hardware.h"
#include "bootloader/wormhole.h" #include "bootloader/wormhole.h"
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
usb_composite_device_t UsbCompositeDevice; usb_composite_device_t UsbCompositeDevice;
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param);
usb_device_class_config_struct_t UsbDeviceCompositeClassConfig[USB_DEVICE_CONFIG_HID] = { static usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = {
{UsbGenericHidCallback, (class_handle_t)NULL, &UsbGenericHidClass}, .deviceCallback = usbDeviceCallback,
{UsbBasicKeyboardCallback, (class_handle_t)NULL, &UsbBasicKeyboardClass}, .count = USB_DEVICE_CONFIG_HID,
{UsbMediaKeyboardCallback, (class_handle_t)NULL, &UsbMediaKeyboardClass}, .config = (usb_device_class_config_struct_t[USB_DEVICE_CONFIG_HID]) {{
{UsbSystemKeyboardCallback, (class_handle_t)NULL, &UsbSystemKeyboardClass}, .classCallback = UsbGenericHidCallback,
{UsbMouseCallback, (class_handle_t)NULL, &UsbMouseClass}, .classInfomation = (usb_device_class_struct_t[]) {{
}; .type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_GENERIC_HID_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_GENERIC_HID_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_NONE,
.protocolCode = USB_HID_PROTOCOL_NONE,
.interfaceNumber = USB_GENERIC_HID_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
.count = USB_GENERIC_HID_ENDPOINT_COUNT,
.endpoint = (usb_device_endpoint_struct_t[USB_GENERIC_HID_ENDPOINT_COUNT]) {
{
.endpointAddress = USB_GENERIC_HID_ENDPOINT_IN_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_IN_PACKET_SIZE,
},
{
.endpointAddress = USB_GENERIC_HID_ENDPOINT_OUT_INDEX | (USB_OUT << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_GENERIC_HID_INTERRUPT_OUT_PACKET_SIZE,
}
}
}
}}
}}
}}
}}
},
{
.classCallback = UsbBasicKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_BASIC_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_BASIC_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_BASIC_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_BASIC_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_BASIC_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_BASIC_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_BASIC_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
},
{
.classCallback = UsbMediaKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_MEDIA_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_MEDIA_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_MEDIA_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_MEDIA_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_MEDIA_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_MEDIA_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_MEDIA_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
},
{
.classCallback = UsbSystemKeyboardCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_SYSTEM_KEYBOARD_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_SYSTEM_KEYBOARD_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_KEYBOARD,
.interfaceNumber = USB_SYSTEM_KEYBOARD_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_SYSTEM_KEYBOARD_ENDPOINT_COUNT]) {{
.endpointAddress = USB_SYSTEM_KEYBOARD_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_SYSTEM_KEYBOARD_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}},
}}
},
{
.classCallback = UsbMouseCallback,
.classInfomation = (usb_device_class_struct_t[]) {{
.type = kUSB_DeviceClassTypeHid,
.configurations = USB_DEVICE_CONFIGURATION_COUNT,
.interfaceList = (usb_device_interface_list_t[USB_DEVICE_CONFIGURATION_COUNT]) {{
.count = USB_MOUSE_INTERFACE_COUNT,
.interfaces = (usb_device_interfaces_struct_t[USB_MOUSE_INTERFACE_COUNT]) {{
.classCode = USB_CLASS_HID,
.subclassCode = USB_HID_SUBCLASS_BOOT,
.protocolCode = USB_HID_PROTOCOL_MOUSE,
.interfaceNumber = USB_MOUSE_INTERFACE_INDEX,
.count = 1,
.interface = (usb_device_interface_struct_t[]) {{
.alternateSetting = USB_INTERFACE_ALTERNATE_SETTING_NONE,
.endpointList = {
USB_MOUSE_ENDPOINT_COUNT,
(usb_device_endpoint_struct_t[USB_MOUSE_ENDPOINT_COUNT]) {{
.endpointAddress = USB_MOUSE_ENDPOINT_INDEX | (USB_IN << USB_DESCRIPTOR_ENDPOINT_ADDRESS_DIRECTION_SHIFT),
.transferType = USB_ENDPOINT_INTERRUPT,
.maxPacketSize = USB_MOUSE_INTERRUPT_IN_PACKET_SIZE,
}}
}
}}
}}
}}
}}
}
}};
usb_device_class_config_list_struct_t UsbDeviceCompositeConfigList = { bool IsHostSleeping = false;
UsbDeviceCompositeClassConfig,
UsbDeviceCallback,
USB_DEVICE_CONFIG_HID
};
static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event, void *param) static void suspendHost(void) {
IsHostSleeping = true;
LedSlaveDriver_DisableLeds();
}
void WakeUpHost(bool sendResume) {
if (sendResume) { // The device should wake up the host.
// Send resume signal - this will call USB_DeviceKhciControl(khciHandle, kUSB_DeviceControlResume, NULL);
USB_DeviceSetStatus(UsbCompositeDevice.deviceHandle, kUSB_DeviceStatusBus, NULL);
}
IsHostSleeping = false;
LedSlaveDriver_UpdateLeds();
}
static usb_status_t usbDeviceCallback(usb_device_handle handle, uint32_t event, void *param)
{ {
usb_status_t error = kStatus_USB_Error; usb_status_t status = kStatus_USB_Error;
uint16_t *temp16 = (uint16_t*)param; uint16_t *temp16 = (uint16_t*)param;
uint8_t *temp8 = (uint8_t*)param; uint8_t *temp8 = (uint8_t*)param;
if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface) { if (!param && event != kUSB_DeviceEventBusReset && event != kUSB_DeviceEventSetInterface && event != kUSB_DeviceEventSuspend && event != kUSB_DeviceEventResume) {
return error; return status;
}
if (IsHostSleeping) {
WakeUpHost(false); // Wake up the keyboard if there is any activity on the bus.
} }
switch (event) { switch (event) {
case kUSB_DeviceEventBusReset: case kUSB_DeviceEventBusReset:
UsbCompositeDevice.attach = 0; UsbCompositeDevice.attach = 0;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break;
case kUSB_DeviceEventSuspend:
if (UsbCompositeDevice.attach) {
suspendHost(); // The host sends this event when it goes to sleep, so turn off all the LEDs.
status = kStatus_USB_Success;
}
break;
case kUSB_DeviceEventResume:
// We will just wake up the host if there is any activity on the bus.
// The problem is that the host won't send a resume event when it boots, so the lights will never come back on.
status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetConfiguration: case kUSB_DeviceEventSetConfiguration:
UsbCompositeDevice.attach = 1; UsbCompositeDevice.attach = 1;
@@ -45,11 +218,11 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8); UsbMediaKeyboardSetConfiguration(UsbCompositeDevice.mediaKeyboardHandle, *temp8);
UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8); UsbSystemKeyboardSetConfiguration(UsbCompositeDevice.systemKeyboardHandle, *temp8);
UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8); UsbMouseSetConfiguration(UsbCompositeDevice.mouseHandle, *temp8);
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventGetConfiguration: case kUSB_DeviceEventGetConfiguration:
*temp8 = UsbCompositeDevice.currentConfiguration; *temp8 = UsbCompositeDevice.currentConfiguration;
error = kStatus_USB_Success; status = kStatus_USB_Success;
break; break;
case kUSB_DeviceEventSetInterface: case kUSB_DeviceEventSetInterface:
if (UsbCompositeDevice.attach) { if (UsbCompositeDevice.attach) {
@@ -62,7 +235,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting); UsbMediaKeyboardSetInterface(UsbCompositeDevice.mediaKeyboardHandle, interface, alternateSetting);
UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting); UsbSystemKeyboardSetInterface(UsbCompositeDevice.systemKeyboardHandle, interface, alternateSetting);
UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting); UsbMouseSetInterface(UsbCompositeDevice.mouseHandle, interface, alternateSetting);
error = kStatus_USB_Success; status = kStatus_USB_Success;
} }
} }
break; break;
@@ -70,32 +243,32 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8); uint8_t interface = (uint8_t)((*temp16 & 0xFF00) >> 8);
if (interface < USB_DEVICE_CONFIG_HID) { if (interface < USB_DEVICE_CONFIG_HID) {
*temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface]; *temp16 = (*temp16 & 0xFF00) | UsbCompositeDevice.currentInterfaceAlternateSetting[interface];
error = kStatus_USB_Success; status = kStatus_USB_Success;
} else { } else {
error = kStatus_USB_InvalidRequest; status = kStatus_USB_InvalidRequest;
} }
break; break;
case kUSB_DeviceEventGetDeviceDescriptor: case kUSB_DeviceEventGetDeviceDescriptor:
error = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param); status = USB_DeviceGetDeviceDescriptor(handle, (usb_device_get_device_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetConfigurationDescriptor: case kUSB_DeviceEventGetConfigurationDescriptor:
error = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param); status = USB_DeviceGetConfigurationDescriptor(handle, (usb_device_get_configuration_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetStringDescriptor: case kUSB_DeviceEventGetStringDescriptor:
error = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param); status = USB_DeviceGetStringDescriptor(handle, (usb_device_get_string_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidDescriptor: case kUSB_DeviceEventGetHidDescriptor:
error = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param); status = USB_DeviceGetHidDescriptor(handle, (usb_device_get_hid_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidReportDescriptor: case kUSB_DeviceEventGetHidReportDescriptor:
error = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param); status = USB_DeviceGetHidReportDescriptor(handle, (usb_device_get_hid_report_descriptor_struct_t *)param);
break; break;
case kUSB_DeviceEventGetHidPhysicalDescriptor: case kUSB_DeviceEventGetHidPhysicalDescriptor:
error = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param); status = USB_DeviceGetHidPhysicalDescriptor(handle, (usb_device_get_hid_physical_descriptor_struct_t *)param);
break; break;
} }
return error; return status;
} }
void USB0_IRQHandler(void) void USB0_IRQHandler(void)
@@ -107,9 +280,6 @@ void USB0_IRQHandler(void)
void InitUsb(void) void InitUsb(void)
{ {
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
SystemCoreClockUpdate(); SystemCoreClockUpdate();
CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000); CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcIrc48M, 48000000);
@@ -121,6 +291,8 @@ void InitUsb(void)
UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle; UsbCompositeDevice.systemKeyboardHandle = UsbDeviceCompositeConfigList.config[USB_SYSTEM_KEYBOARD_INTERFACE_INDEX].classHandle;
UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle; UsbCompositeDevice.mouseHandle = UsbDeviceCompositeConfigList.config[USB_MOUSE_INTERFACE_INDEX].classHandle;
uint8_t usbDeviceKhciIrq[] = USB_IRQS;
uint8_t irqNumber = usbDeviceKhciIrq[CONTROLLER_ID - kUSB_ControllerKhci0];
NVIC_EnableIRQ((IRQn_Type)irqNumber); NVIC_EnableIRQ((IRQn_Type)irqNumber);
USB_DeviceRun(UsbCompositeDevice.deviceHandle); USB_DeviceRun(UsbCompositeDevice.deviceHandle);

View File

@@ -28,10 +28,12 @@
// Variables: // Variables:
extern bool IsHostSleeping;
extern usb_composite_device_t UsbCompositeDevice; extern usb_composite_device_t UsbCompositeDevice;
//Functions: //Functions:
void InitUsb(void); void InitUsb(void);
void WakeUpHost(bool sendResume);
#endif #endif

View File

@@ -21,7 +21,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
HID_RI_REPORT_SIZE(8, 0x08), HID_RI_REPORT_SIZE(8, 0x08),
HID_RI_INPUT(8, HID_IOF_CONSTANT), HID_RI_INPUT(8, HID_IOF_CONSTANT),
// LED status // LED status - Num lock, Caps lock, Scroll lock, Compose, Kana
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS), HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_LEDS),
HID_RI_USAGE_MINIMUM(8, 0x01), HID_RI_USAGE_MINIMUM(8, 0x01),
HID_RI_USAGE_MAXIMUM(8, 0x05), HID_RI_USAGE_MAXIMUM(8, 0x05),
@@ -36,7 +36,7 @@ uint8_t UsbBasicKeyboardReportDescriptor[USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LE
// Scancodes // Scancodes
HID_RI_LOGICAL_MINIMUM(8, 0x00), HID_RI_LOGICAL_MINIMUM(8, 0x00),
HID_RI_LOGICAL_MAXIMUM(8, 0xFF), HID_RI_LOGICAL_MAXIMUM(16, 0xFF),
HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_KEY_CODES), HID_RI_USAGE_PAGE(8, HID_RI_USAGE_PAGE_KEY_CODES),
HID_RI_USAGE_MINIMUM(8, 0x00), HID_RI_USAGE_MINIMUM(8, 0x00),
HID_RI_USAGE_MAXIMUM(8, 0xFF), HID_RI_USAGE_MAXIMUM(8, 0xFF),

View File

@@ -3,7 +3,7 @@
// Macros: // Macros:
#define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 63 #define USB_BASIC_KEYBOARD_REPORT_DESCRIPTOR_LENGTH 64
#define USB_BASIC_KEYBOARD_MAX_KEYS 6 #define USB_BASIC_KEYBOARD_MAX_KEYS 6
// Variables: // Variables:

Some files were not shown because too many files have changed in this diff Show More