abcio.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #ifndef ABCIO_H
  2. #define ABCIO_H
  3. #include <stddef.h>
  4. #include <stdint.h>
  5. #define DEVSEL_NONE 64 /* No device at all selected */
  6. struct abc_dev;
  7. /* Called from an interrupt handler, so hot */
  8. #define ABC_CALLBACK_DECL(func) \
  9. void func(struct abc_dev *dev __unused, \
  10. uint8_t data __unused, \
  11. uint8_t addr __unused)
  12. #define ABC_CALLBACK(func) \
  13. __hot ABC_CALLBACK_DECL(func)
  14. typedef ABC_CALLBACK_DECL((*abc_callback_t));
  15. struct abc_dev {
  16. uint8_t *out_buf;
  17. size_t out_cnt;
  18. const uint8_t *inp_buf;
  19. size_t inp_cnt;
  20. uint16_t callback_mask;
  21. uint16_t event_mask; /* Can be a superset of callback_mask */
  22. uint8_t status_first_out_mask;
  23. uint8_t status_first_inp_mask;
  24. uint8_t out_data[6]; /* [1] is devsel, all 8 bits */
  25. union {
  26. struct {
  27. uint8_t inp_data[2];
  28. uint8_t inp_en;
  29. uint8_t inp_data_def; /* inp_data[0] when no queue active */
  30. };
  31. uint32_t inp_data_w;
  32. };
  33. abc_callback_t callback_out[6];
  34. abc_callback_t callback_inp[2];
  35. abc_callback_t callback_rst;
  36. };
  37. void abc_setup_out_queue(struct abc_dev *dev, void *buf, size_t len,
  38. uint8_t status);
  39. void abc_setup_inp_queue(struct abc_dev *dev, const void *buf, size_t len,
  40. uint8_t status);
  41. void abc_set_inp_default(struct abc_dev *dev, uint8_t val);
  42. void abc_set_inp_status(struct abc_dev *dev, uint8_t val);
  43. void abc_register(struct abc_dev *dev, unsigned int devsel);
  44. void abc_init(void);
  45. void abcdisk_init(void);
  46. void abcdisk_io_poll(void);
  47. void abc_init_memmap(void);
  48. #endif /* ABCIO_H */