lpc.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdarg.h>
  5. #include <serial.h>
  6. #include <lpc.h>
  7. const struct lpc_part lpc_parts[] = {
  8. {"LPC1111/101", 0x041e502b, 2, 8},
  9. {"LPC1111/101 or 102", 0x2516d02b, 2, 8},
  10. {"LPC1111/201", 0x0416502b, 4, 8},
  11. {"LPC1111/201 or 202", 0x2516902b, 4, 8},
  12. {"LPC1112/101", 0x042d502b, 2, 16},
  13. {"LPC1112/101 or 102", 0x2524d02b, 2, 16},
  14. {"LPC1112/201", 0x0425502b, 4, 16},
  15. {"LPC1112/201 or 202", 0x2524902b, 4, 16},
  16. {"LPC1113/201", 0x0434502b, 4, 24},
  17. {"LPC1113/201 or 202", 0x2532902b, 4, 24},
  18. {"LPC1113/301", 0x0434102b, 8, 24},
  19. {"LPC1113/301 or 302", 0x2532102b, 8, 24},
  20. {"LPC1114/201", 0x0444502b, 4, 32},
  21. {"LPC1114/201 or 202", 0x2540902b, 4, 32},
  22. {"LPC1114/301", 0x0444102b, 8, 32},
  23. {"LPC1114/301 or 302", 0x2540102b, 8, 32},
  24. {"LPC11C12/301", 0x1421102b, 8, 16},
  25. {"LPC11C14/301", 0x1440102b, 8, 32},
  26. {"LPC11C22/301", 0x1431102b, 8, 16},
  27. {"LPC11C24/301", 0x1430102b, 8, 32},
  28. {NULL, 0, 0, 0}
  29. };
  30. const struct sprog_family lpc_family = {
  31. .setup = (void*(*)(struct serial_device*)) lpc_setup,
  32. .init = (void(*)(void*)) lpc_init,
  33. .close = (void(*)(void*)) lpc_close
  34. };
  35. void lpc_ispmode(struct lpc_device *dev, int state);
  36. void lpc_reset(struct lpc_device *dev);
  37. int lpc_command(char *text, ...);
  38. int lpc_read_partid(struct lpc_device *dev);
  39. struct lpc_device *lpc_setup(struct serial_device *port) {
  40. struct lpc_device *dev;
  41. dev = malloc(sizeof(struct lpc_device));
  42. dev->port = port;
  43. dev->part = NULL;
  44. lpc_ispmode(dev, 1);
  45. lpc_reset(dev);
  46. return dev;
  47. }
  48. void lpc_init(struct lpc_device *dev) {
  49. char buf[4096];
  50. printf("?");
  51. fflush(stdout);
  52. fgets(buf, sizeof(buf), stdin);
  53. if(strcmp(buf, "Synchronized\r\n")==0)
  54. sprog_error("Synchronization successful\n");
  55. printf("Synchronized\r\n");
  56. fflush(stdout);
  57. fgets(buf, sizeof(buf), stdin); /* deny echoed line */
  58. fgets(buf, sizeof(buf), stdin);
  59. if(strcmp(buf, "OK\r\n")!=0)
  60. sprog_error("Expected OK, received '%s'\n", buf);
  61. sprog_error("Sending clock frequency\n");
  62. printf("12000\r\n");
  63. fflush(stdout);
  64. fgets(buf, sizeof(buf), stdin); /* deny echoed line */
  65. fgets(buf, sizeof(buf), stdin);
  66. if(strcmp(buf, "OK\r\n")!=0)
  67. sprog_error("Expected OK, received '%s'\n", buf);
  68. sprog_error("Reading part ID\n");
  69. if(lpc_read_partid(dev)==0)
  70. sprog_error("Found device: %s, %dkB Flash, %dkB RAM\n", dev->part->name, dev->part->flash, dev->part->ram);
  71. }
  72. int lpc_command(char *text, ...) {
  73. char buf[4096];
  74. int res;
  75. va_list l;
  76. va_start(l, text);
  77. vprintf(text, l);
  78. fflush(stdout);
  79. fgets(buf, sizeof(buf), stdin); /* deny echoed line */
  80. if(scanf("%d\r\n", &res)<1)
  81. return -1;
  82. va_end(l);
  83. return res;
  84. }
  85. int lpc_read_partid(struct lpc_device *dev) {
  86. int i;
  87. int res;
  88. int partid;
  89. res = lpc_command("J\r\n");
  90. sprog_error("Command return code is %d\n", res);
  91. if(res!=0)
  92. return res;
  93. if(scanf("%d\r\n", &partid)<1)
  94. sprog_error("Unable to read part ID\n");
  95. else
  96. sprog_error("Received part ID: %d (0x%08x)\n", partid, partid);
  97. for(i=0; lpc_parts[i].name; i++)
  98. if(lpc_parts[i].part_id==partid)
  99. break;
  100. if(lpc_parts[i].name)
  101. dev->part = &lpc_parts[i];
  102. else
  103. return -1;
  104. return 0;
  105. }
  106. void lpc_ispmode(struct lpc_device *dev, int state) {
  107. serial_setline(dev->port, SERIAL_DTR, state);
  108. }
  109. void lpc_reset(struct lpc_device *dev) {
  110. /* TODO: configure the control lines */
  111. serial_setline(dev->port, SERIAL_RTS, 1);
  112. sprog_sleep(50);
  113. serial_setline(dev->port, SERIAL_RTS, 0);
  114. sprog_sleep(10);
  115. }
  116. void lpc_close(struct lpc_device *dev) {
  117. serial_close(dev->port);
  118. free(dev);
  119. }