io_hd64461.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: io_hd64461.c,v 1.6 2000/11/16 23:28:44 yaegashi Exp $
  3.  * Copyright (C) 2000 YAEGASHI Takeshi
  4.  * Typical I/O routines for HD64461 system.
  5.  */
  6. #include <linux/config.h>
  7. #include <asm/io.h>
  8. #include <asm/hd64461.h>
  9. static __inline__ unsigned long PORT2ADDR(unsigned long port)
  10. {
  11. /* 16550A: HD64461 internal */
  12. if (0x3f8<=port && port<=0x3ff)
  13. return CONFIG_HD64461_IOBASE + 0x8000 + ((port-0x3f8)<<1);
  14. if (0x2f8<=port && port<=0x2ff)
  15. return CONFIG_HD64461_IOBASE + 0x7000 + ((port-0x2f8)<<1);
  16. #ifdef CONFIG_HD64461_ENABLER
  17. /* NE2000: HD64461 PCMCIA channel 0 (I/O) */
  18. if (0x300<=port && port<=0x31f)
  19. return 0xba000000 + port;
  20. /* ide0: HD64461 PCMCIA channel 1 (memory) */
  21. /* On HP690, CF in slot 1 is configured as a memory card
  22.    device.  See CF+ and CompactFlash Specification for the
  23.    detail of CF's memory mapped addressing. */
  24. if (0x1f0<=port && port<=0x1f7) return 0xb5000000 + port;
  25. if (port == 0x3f6) return 0xb50001fe;
  26. if (port == 0x3f7) return 0xb50001ff;
  27. /* ide1 */
  28. if (0x170<=port && port<=0x177) return 0xba000000 + port;
  29. if (port == 0x376) return 0xba000376;
  30. if (port == 0x377) return 0xba000377;
  31. #endif
  32. /* ??? */
  33. if (port < 0x10000) return 0xa0000000 + port;
  34. /* HD64461 internal devices (0xb0000000) */
  35. if (port < 0x20000) return CONFIG_HD64461_IOBASE + port - 0x10000;
  36. /* PCMCIA channel 0, I/O (0xba000000) */
  37. if (port < 0x30000) return 0xba000000 + port - 0x20000;
  38. /* PCMCIA channel 1, memory (0xb5000000) */
  39. if (port < 0x40000) return 0xb5000000 + port - 0x30000;
  40. /* Whole physical address space (0xa0000000) */
  41. return 0xa0000000 + (port & 0x1fffffff);
  42. }
  43. static inline void delay(void)
  44. {
  45. ctrl_inw(0xa0000000);
  46. }
  47. unsigned char hd64461_inb(unsigned long port)
  48. {
  49. return *(volatile unsigned char*)PORT2ADDR(port);
  50. }
  51. unsigned char hd64461_inb_p(unsigned long port)
  52. {
  53. unsigned long v = *(volatile unsigned char*)PORT2ADDR(port);
  54. delay();
  55. return v;
  56. }
  57. unsigned short hd64461_inw(unsigned long port)
  58. {
  59. return *(volatile unsigned short*)PORT2ADDR(port);
  60. }
  61. unsigned int hd64461_inl(unsigned long port)
  62. {
  63. return *(volatile unsigned long*)PORT2ADDR(port);
  64. }
  65. void hd64461_insb(unsigned long port, void *buffer, unsigned long count)
  66. {
  67. unsigned char *buf=buffer;
  68. while(count--) *buf++=inb(port);
  69. }
  70. void hd64461_insw(unsigned long port, void *buffer, unsigned long count)
  71. {
  72. unsigned short *buf=buffer;
  73. while(count--) *buf++=inw(port);
  74. }
  75. void hd64461_insl(unsigned long port, void *buffer, unsigned long count)
  76. {
  77. unsigned long *buf=buffer;
  78. while(count--) *buf++=inl(port);
  79. }
  80. void hd64461_outb(unsigned char b, unsigned long port)
  81. {
  82. *(volatile unsigned char*)PORT2ADDR(port) = b;
  83. }
  84. void hd64461_outb_p(unsigned char b, unsigned long port)
  85. {
  86. *(volatile unsigned char*)PORT2ADDR(port) = b;
  87. delay();
  88. }
  89. void hd64461_outw(unsigned short b, unsigned long port)
  90. {
  91. *(volatile unsigned short*)PORT2ADDR(port) = b;
  92. }
  93. void hd64461_outl(unsigned int b, unsigned long port)
  94. {
  95.         *(volatile unsigned long*)PORT2ADDR(port) = b;
  96. }
  97. void hd64461_outsb(unsigned long port, const void *buffer, unsigned long count)
  98. {
  99. const unsigned char *buf=buffer;
  100. while(count--) outb(*buf++, port);
  101. }
  102. void hd64461_outsw(unsigned long port, const void *buffer, unsigned long count)
  103. {
  104. const unsigned short *buf=buffer;
  105. while(count--) outw(*buf++, port);
  106. }
  107. void hd64461_outsl(unsigned long port, const void *buffer, unsigned long count)
  108. {
  109. const unsigned long *buf=buffer;
  110. while(count--) outl(*buf++, port);
  111. }