io.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #ifndef IO_H
  2. #define IO_H
  3. #include <stdint.h>
  4. #include <stdarg.h>
  5. #include <stdbool.h>
  6. #include "ioregs.h"
  7. #include "picorv32.h"
  8. #include "irq.h"
  9. static __always_inline void pause(void)
  10. {
  11. /* Placeholder for anything that might want to be done while waiting */
  12. }
  13. static __always_inline void set_leds(unsigned int leds)
  14. {
  15. SYS_LED = leds;
  16. }
  17. static __always_inline void set_led(unsigned int led, bool on)
  18. {
  19. unsigned int leds = SYS_LED;
  20. unsigned int mask = 1 << led;
  21. leds &= ~mask;
  22. leds |= on ? mask : 0;
  23. SYS_LED = leds;
  24. }
  25. enum leds {
  26. LED_SDCARD,
  27. LED_DISKIO,
  28. LED_ABCBUS
  29. };
  30. static __always_inline no_return reset(unsigned int type)
  31. {
  32. p_maskirq(~0, 0); /* Block all interrupts */
  33. for (;;)
  34. SYS_RESET = type;
  35. }
  36. extern const uint32_t time_zero;
  37. static __always_inline uint32_t rdtime(void)
  38. {
  39. uint32_t t;
  40. asm volatile("rdtime %0" : "=r" (t));
  41. return t;
  42. }
  43. static __always_inline uint64_t rdtimeq(void)
  44. {
  45. uint32_t l, h1, h0;
  46. asm volatile("rdtimeh %0; rdtime %1; %rdtimeh %2"
  47. : "=r" (h1), "=r" (l), "=r" (h0));
  48. return ((uint64_t)(((int32_t)l < 0) ? h1 : h0) << 32) + l;
  49. }
  50. static __always_inline void udelay(uint32_t us)
  51. {
  52. uint32_t cycles = us * (CPU_HZ / 1000000);
  53. uint32_t start = rdtime();
  54. while (rdtime() - start < cycles)
  55. pause();
  56. }
  57. static inline void i2c_set_speed(unsigned int khz)
  58. {
  59. I2C_DIVISOR = ((CPU_HZ/4000)-1)/khz;
  60. }
  61. static __always_inline void wait_romcopy_done(void)
  62. {
  63. while (~irqmask() & (1 << ROMCOPY_IRQ))
  64. pause();
  65. }
  66. /* Read a random 32-bit number */
  67. static inline uint32_t rdrand(void)
  68. {
  69. waitfor(RANDOM_IRQ);
  70. return RANDOM_DATA;
  71. }
  72. #endif /* IO_H */