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.

ibm4704.h 2.7KB

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