Keyboard firmwares for Atmel AVR and Cortex-M
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.

ibm4704.h 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. /*
  2. Copyright 2014 Jun WAKO <[email protected]>
  3. */
  4. #ifndef IBM4704_H
  5. #define IBM4704_H
  6. #define IBM4704_ERR_NONE 0
  7. #define IBM4704_ERR_PARITY 0x70
  8. void ibm4704_init(void);
  9. uint8_t ibm4704_send(uint8_t data);
  10. uint8_t ibm4704_recv_response(void);
  11. uint8_t ibm4704_recv(void);
  12. /* Check pin configuration */
  13. #if !(defined(IBM4704_CLOCK_PORT) && \
  14. defined(IBM4704_CLOCK_PIN) && \
  15. defined(IBM4704_CLOCK_DDR) && \
  16. defined(IBM4704_CLOCK_BIT))
  17. # error "ibm4704 clock pin configuration is required in config.h"
  18. #endif
  19. #if !(defined(IBM4704_DATA_PORT) && \
  20. defined(IBM4704_DATA_PIN) && \
  21. defined(IBM4704_DATA_DDR) && \
  22. defined(IBM4704_DATA_BIT))
  23. # error "ibm4704 data pin configuration is required in config.h"
  24. #endif
  25. /*--------------------------------------------------------------------
  26. * static functions
  27. *------------------------------------------------------------------*/
  28. static inline void clock_lo(void)
  29. {
  30. IBM4704_CLOCK_PORT &= ~(1<<IBM4704_CLOCK_BIT);
  31. IBM4704_CLOCK_DDR |= (1<<IBM4704_CLOCK_BIT);
  32. }
  33. static inline void clock_hi(void)
  34. {
  35. /* input with pull up */
  36. IBM4704_CLOCK_DDR &= ~(1<<IBM4704_CLOCK_BIT);
  37. IBM4704_CLOCK_PORT |= (1<<IBM4704_CLOCK_BIT);
  38. }
  39. static inline bool clock_in(void)
  40. {
  41. IBM4704_CLOCK_DDR &= ~(1<<IBM4704_CLOCK_BIT);
  42. IBM4704_CLOCK_PORT |= (1<<IBM4704_CLOCK_BIT);
  43. _delay_us(1);
  44. return IBM4704_CLOCK_PIN&(1<<IBM4704_CLOCK_BIT);
  45. }
  46. static inline void data_lo(void)
  47. {
  48. IBM4704_DATA_PORT &= ~(1<<IBM4704_DATA_BIT);
  49. IBM4704_DATA_DDR |= (1<<IBM4704_DATA_BIT);
  50. }
  51. static inline void data_hi(void)
  52. {
  53. /* input with pull up */
  54. IBM4704_DATA_DDR &= ~(1<<IBM4704_DATA_BIT);
  55. IBM4704_DATA_PORT |= (1<<IBM4704_DATA_BIT);
  56. }
  57. static inline bool data_in(void)
  58. {
  59. IBM4704_DATA_DDR &= ~(1<<IBM4704_DATA_BIT);
  60. IBM4704_DATA_PORT |= (1<<IBM4704_DATA_BIT);
  61. _delay_us(1);
  62. return IBM4704_DATA_PIN&(1<<IBM4704_DATA_BIT);
  63. }
  64. static inline uint16_t wait_clock_lo(uint16_t us)
  65. {
  66. while (clock_in() && us) { asm(""); _delay_us(1); us--; }
  67. return us;
  68. }
  69. static inline uint16_t wait_clock_hi(uint16_t us)
  70. {
  71. while (!clock_in() && us) { asm(""); _delay_us(1); us--; }
  72. return us;
  73. }
  74. static inline uint16_t wait_data_lo(uint16_t us)
  75. {
  76. while (data_in() && us) { asm(""); _delay_us(1); us--; }
  77. return us;
  78. }
  79. static inline uint16_t wait_data_hi(uint16_t us)
  80. {
  81. while (!data_in() && us) { asm(""); _delay_us(1); us--; }
  82. return us;
  83. }
  84. /* idle state that device can send */
  85. static inline void idle(void)
  86. {
  87. clock_hi();
  88. data_hi();
  89. }
  90. /* inhibit device to send
  91. * keyboard checks Data line on start bit(Data:hi) and it stops sending if Data line is low.
  92. */
  93. static inline void inhibit(void)
  94. {
  95. clock_hi();
  96. data_lo();
  97. }
  98. #endif