Kiibohd Controller
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

main.c 3.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /* Copyright (c) 2011,2012 Simon Schubert <[email protected]>.
  2. * Modifications by Jacob Alexander 2014-2015 <[email protected]>
  3. *
  4. * This program is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. // ----- Includes -----
  18. // Local Includes
  19. #include "mchck.h"
  20. #include "dfu.desc.h"
  21. // ----- Variables -----
  22. /**
  23. * Unfortunately we can't DMA directly to FlexRAM, so we'll have to stage here.
  24. */
  25. static char staging[FLASH_SECTOR_SIZE];
  26. // ----- Functions -----
  27. static enum dfu_status setup_write(size_t off, size_t len, void **buf)
  28. {
  29. static int last = 0;
  30. if (len > sizeof(staging))
  31. return (DFU_STATUS_errADDRESS);
  32. // We only allow the last write to be less than one sector size.
  33. if (off == 0)
  34. last = 0;
  35. if (last && len != 0)
  36. return (DFU_STATUS_errADDRESS);
  37. if (len != FLASH_SECTOR_SIZE) {
  38. last = 1;
  39. memset(staging, 0xff, sizeof(staging));
  40. }
  41. *buf = staging;
  42. return (DFU_STATUS_OK);
  43. }
  44. static enum dfu_status finish_write( void *buf, size_t off, size_t len )
  45. {
  46. void *target;
  47. if (len == 0)
  48. return (DFU_STATUS_OK);
  49. target = flash_get_staging_area(off + (uintptr_t)&_app_rom, FLASH_SECTOR_SIZE);
  50. if (!target)
  51. return (DFU_STATUS_errADDRESS);
  52. memcpy(target, buf, len);
  53. if (flash_program_sector(off + (uintptr_t)&_app_rom, FLASH_SECTOR_SIZE) != 0)
  54. return (DFU_STATUS_errADDRESS);
  55. return (DFU_STATUS_OK);
  56. }
  57. static struct dfu_ctx dfu_ctx;
  58. void init_usb_bootloader( int config )
  59. {
  60. dfu_init(setup_write, finish_write, &dfu_ctx);
  61. }
  62. void main()
  63. {
  64. #if defined(_mk20dx128vlf5_) // Kiibohd-dfu / Infinity
  65. // XXX McHCK uses B16 instead of A19
  66. // Enabling LED to indicate we are in the bootloader
  67. GPIOA_PDDR |= (1<<19);
  68. // Setup pin - A19 - See Lib/pin_map.mchck for more details on pins
  69. PORTA_PCR19 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1);
  70. GPIOA_PSOR |= (1<<19);
  71. #elif defined(_mk20dx256vlh7_) // Kiibohd-dfu
  72. // Enabling LED to indicate we are in the bootloader
  73. GPIOA_PDDR |= (1<<5);
  74. // Setup pin - A5 - See Lib/pin_map.mchck for more details on pins
  75. PORTA_PCR19 = PORT_PCR_SRE | PORT_PCR_DSE | PORT_PCR_MUX(1);
  76. GPIOA_PSOR |= (1<<5);
  77. #endif
  78. flash_prepare_flashing();
  79. usb_init( &dfu_device );
  80. for (;;)
  81. {
  82. usb_poll();
  83. }
  84. }