fdc37c93x.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include "u.h"
  2. #include "../port/lib.h"
  3. #include "mem.h"
  4. #include "dat.h"
  5. #include "fns.h"
  6. #include "io.h"
  7. /*
  8. * SMC FDC37C93x Plug and Play Compatible Ultra I/O Controller.
  9. */
  10. enum { /* I/O Ports */
  11. Config = 0x370, /* could also be 0x3F0 */
  12. Index = 0,
  13. Data = 1,
  14. };
  15. static int fddregs[] = {
  16. 0x30,
  17. 0x60, 0x61,
  18. 0x70,
  19. 0x74,
  20. 0xF0,
  21. 0xF1,
  22. 0xF2,
  23. 0xF4,
  24. 0xF5,
  25. 0,
  26. };
  27. #define OUTB(p, d) outb(p, d); microdelay(10);
  28. void
  29. fdc37c93xdump(void)
  30. {
  31. int config, i, x;
  32. config = Config;
  33. OUTB(config, 0x55);
  34. OUTB(config, 0x55);
  35. OUTB(config+Index, 0x20);
  36. x = inb(config+Data);
  37. print("fdc37c93x: Device ID 0x%2.2uX\n", x);
  38. OUTB(config+Index, 0x22);
  39. x = inb(config+Data);
  40. print("fdc37c93x: Power/Control 0x%2.2uX\n", x);
  41. OUTB(config+Index, 0x07);
  42. OUTB(config+Data, 0);
  43. for(i = 0; fddregs[i]; i++){
  44. OUTB(config+Index, fddregs[i]);
  45. x = inb(config+Data);
  46. print("FDD%2.2uX: 0x%2.2uX\n", fddregs[i], x);
  47. }
  48. OUTB(config+Index, 0x70);
  49. OUTB(config+Data, 0x06);
  50. OUTB(config+Index, 0x74);
  51. OUTB(config+Data, 0x02);
  52. OUTB(config+Index, 0x30);
  53. OUTB(config+Data, 0x01);
  54. OUTB(config, 0xAA);
  55. }