uartkeys.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include <stdio.h>
  2. #include "minilisp.h"
  3. #include "alloc.h"
  4. #include "stream.h"
  5. #include "compiler_new.h"
  6. #include <unistd.h>
  7. #include <fcntl.h>
  8. Cell* uartkeys_open(Cell* cpath) {
  9. if (!cpath || cpath->tag!=TAG_STR) {
  10. printf("[uartkeys] open error: non-string path given\r\n");
  11. return alloc_nil();
  12. }
  13. return alloc_int(1);
  14. }
  15. Cell* uartkeys_read(Cell* stream) {
  16. int k = 0;
  17. if (mmio_read(UART0_FR) & (1 << 4)) {
  18. k = 0;
  19. } else {
  20. k = mmio_read(UART0_DR);
  21. }
  22. if (k==27) {
  23. k = uart_getc();
  24. }
  25. if (k==91) {
  26. k = uart_getc();
  27. if (k==27) {
  28. // fast repetition
  29. k = uart_getc();
  30. k = uart_getc();
  31. }
  32. if (k==68) k=19;
  33. if (k==67) k=20;
  34. if (k==65) k=17;
  35. if (k==66) k=18;
  36. //printf("~~ inkey unknown sequence: 91,%d\r\n",k);
  37. }
  38. if (k==13) k=10;
  39. /*char c = 0;
  40. if (ki>0) {
  41. ki--;
  42. c = uart_key_in[0];
  43. // FIFO
  44. for (int i=0; i<KBUFSZ-1; i++) {
  45. uart_key_in[i]=uart_key_in[i+1];
  46. }
  47. }*/
  48. Cell* res = alloc_string_copy(" ");
  49. ((uint8_t*)res->addr)[0] = k;
  50. return res;
  51. }
  52. Cell* uartkeys_write(Cell* arg) {
  53. // could be used to control LEDs
  54. return NULL;
  55. }
  56. Cell* uartkeys_mmap(Cell* arg) {
  57. return alloc_nil();
  58. }
  59. void mount_uartkeys() {
  60. fs_mount_builtin("/keyboard", uartkeys_open, uartkeys_read, uartkeys_write, 0, uartkeys_mmap);
  61. }