Leaked source code of windows server 2003
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.

397 lines
14 KiB

  1. // $Header: G:/SwDev/WDM/Video/bt848/rcs/Gpio.cpp 1.2 1998/04/29 22:43:33 tomz Exp $
  2. #include "gpio.h"
  3. /////////////////////////////////////////////////////////////////////////////
  4. // Constructor
  5. /////////////////////////////////////////////////////////////////////////////
  6. GPIO::GPIO( void ) :
  7. // construct all GPIO related register and register fields
  8. decRegGPIO ( 0x10C, RW ), // GPIO register
  9. decFieldGPCLKMODE( decRegGPIO, 10, 1, RW ),
  10. decFieldGPIOMODE( decRegGPIO, 11, 2, RW ),
  11. decFieldGPWEC( decRegGPIO, 13, 1, RW ),
  12. decFieldGPINTI( decRegGPIO, 14, 1, RW ),
  13. decFieldGPINTC( decRegGPIO, 15, 1, RW ),
  14. decRegGPOE( 0x118, RW ), // GPOE register
  15. decRegGPIE( 0x11C, RW ), // GPIE register
  16. decRegGPDATA( 0x200, WO ), // GPDATA register
  17. initOK( false )
  18. {
  19. initOK = true;
  20. }
  21. /////////////////////////////////////////////////////////////////////////////
  22. // Destructor
  23. /////////////////////////////////////////////////////////////////////////////
  24. GPIO::~GPIO()
  25. {
  26. }
  27. /////////////////////////////////////////////////////////////////////////////
  28. // Method: bool GPIO::IsInitOK( void )
  29. // Purpose: Check if GPIO is initialized successfully
  30. // Input: None
  31. // Output: None
  32. // Return: true or false
  33. /////////////////////////////////////////////////////////////////////////////
  34. bool GPIO::IsInitOK( void )
  35. {
  36. return( initOK );
  37. }
  38. /////////////////////////////////////////////////////////////////////////////
  39. // Method: void GPIO::SetGPCLKMODE( State s )
  40. // Purpose: Set or clear GPCLKMODE
  41. // Input: State s - On to set; Off to clear
  42. // Output: None
  43. // Return: None
  44. /////////////////////////////////////////////////////////////////////////////
  45. void GPIO::SetGPCLKMODE( State s )
  46. {
  47. decFieldGPCLKMODE = s;
  48. }
  49. /////////////////////////////////////////////////////////////////////////////
  50. // Method: int GPIO::GetGPCLKMODE( void )
  51. // Purpose: Get value of GPCLKMODE
  52. // Input: None
  53. // Output: None
  54. // Return: int - On (1) or Off (0)
  55. /////////////////////////////////////////////////////////////////////////////
  56. int GPIO::GetGPCLKMODE( void )
  57. {
  58. return ( decFieldGPCLKMODE );
  59. }
  60. /////////////////////////////////////////////////////////////////////////////
  61. // Method: void GPIO::SetGPIOMODE( GPIOMode mode )
  62. // Purpose: Set GPIO mode
  63. // Input: GPIOMode mode - GPIO_NORMAL, GPIO_SPI_OUTPUT, GPIO_SPI_INPUT,
  64. // GPIO_DEBUG_TEST
  65. // Output: None
  66. // Return: None
  67. /////////////////////////////////////////////////////////////////////////////
  68. void GPIO::SetGPIOMODE( GPIOMode mode )
  69. {
  70. decFieldGPIOMODE = mode;
  71. }
  72. /////////////////////////////////////////////////////////////////////////////
  73. // Method: int GPIO::GetGPIOMODE( void )
  74. // Purpose: Get GPIO mode
  75. // Input: None
  76. // Output: None
  77. // Input: int - GPIO_NORMAL, GPIO_SPI_OUTPUT, GPIO_SPI_INPUT, GPIO_DEBUG_TEST
  78. /////////////////////////////////////////////////////////////////////////////
  79. int GPIO::GetGPIOMODE( void )
  80. {
  81. return( decFieldGPIOMODE );
  82. }
  83. /////////////////////////////////////////////////////////////////////////////
  84. // Method: void GPIO::SetGPWEC( State s )
  85. // Purpose: Set or clear GPWEC
  86. // Input: State s - On to set; Off to clear
  87. // Output: None
  88. // Return: None
  89. /////////////////////////////////////////////////////////////////////////////
  90. void GPIO::SetGPWEC( State s )
  91. {
  92. decFieldGPWEC = s;
  93. }
  94. /////////////////////////////////////////////////////////////////////////////
  95. // Method: int GPIO::GetGPWEC( void )
  96. // Purpose: Get value of GPWEC
  97. // Input: None
  98. // Output: None
  99. // Return: int - On (1) or Off (0)
  100. /////////////////////////////////////////////////////////////////////////////
  101. int GPIO::GetGPWEC( void )
  102. {
  103. return ( decFieldGPWEC );
  104. }
  105. /////////////////////////////////////////////////////////////////////////////
  106. // Method: void GPIO::SetGPINTI( State s )
  107. // Purpose: Set or clear GPINTI
  108. // Input: State s - On to set; Off to clear
  109. // Output: None
  110. // Return: None
  111. /////////////////////////////////////////////////////////////////////////////
  112. void GPIO::SetGPINTI( State s )
  113. {
  114. decFieldGPINTI = s;
  115. }
  116. /////////////////////////////////////////////////////////////////////////////
  117. // Method: int GPIO::GetGPINTI( void )
  118. // Purpose: Get value of GPINTI
  119. // Input: None
  120. // Output: None
  121. // Return: int - On (1) or Off (0)
  122. /////////////////////////////////////////////////////////////////////////////
  123. int GPIO::GetGPINTI( void )
  124. {
  125. return ( decFieldGPINTI );
  126. }
  127. /////////////////////////////////////////////////////////////////////////////
  128. // Method: void GPIO::SetGPINTC( State s )
  129. // Purpose: Set or clear GPINTC
  130. // Input: State s - On to set; Off to clear
  131. // Output: None
  132. // Return: None
  133. /////////////////////////////////////////////////////////////////////////////
  134. void GPIO::SetGPINTC( State s )
  135. {
  136. decFieldGPINTC = s;
  137. }
  138. /////////////////////////////////////////////////////////////////////////////
  139. // Method: int GPIO::GetGPINTC( void )
  140. // Purpose: Get value of GPINTC
  141. // Input: None
  142. // Output: None
  143. // Return: int - On (1) or Off (0)
  144. /////////////////////////////////////////////////////////////////////////////
  145. int GPIO::GetGPINTC( void )
  146. {
  147. return ( decFieldGPINTC );
  148. }
  149. /////////////////////////////////////////////////////////////////////////////
  150. // Method: ErrorCode GPIO::SetGPOE( int bit, State s )
  151. // Purpose: Set or clear a bit in GPOE
  152. // Input: int bit - bit to be set or clear
  153. // State s - On to set; Off to clear
  154. // Output: None
  155. // Return: Success or Fail
  156. /////////////////////////////////////////////////////////////////////////////
  157. ErrorCode GPIO::SetGPOE( int bit, State s )
  158. {
  159. // range checking
  160. if ( ( bit < 0 ) || ( bit > MAX_GPIO_BIT ) )
  161. return ( Fail );
  162. RegField decFieldTemp( decRegGPOE, (BYTE)bit, 1, RW ); // create a reg field
  163. decFieldTemp = s;
  164. return ( Success );
  165. }
  166. /////////////////////////////////////////////////////////////////////////////
  167. // Method: void GPIO::SetGPOE( DWORD value )
  168. // Purpose: Set GPOE value
  169. // Input: DWORD value - value to be set to
  170. // Output: None
  171. // Return: None
  172. /////////////////////////////////////////////////////////////////////////////
  173. void GPIO::SetGPOE( DWORD value )
  174. {
  175. decRegGPOE = ( value & 0x00FFFFFFL ); // bits [23:0]
  176. }
  177. /////////////////////////////////////////////////////////////////////////////
  178. // Method: int GPIO::GetGPOE( int bit )
  179. // Purpose: Get value of a bit in GPOE
  180. // Input: int bit - bit to get value from
  181. // Output: None
  182. // Return: int - On (1), Off (0), or -1 for parameter error
  183. /////////////////////////////////////////////////////////////////////////////
  184. int GPIO::GetGPOE( int bit )
  185. {
  186. // range checking
  187. if ( ( bit < 0 ) || ( bit > MAX_GPIO_BIT ) )
  188. return ( -1 );
  189. RegField decFieldTemp( decRegGPOE, (BYTE)bit, 1, RW ); // create a reg field
  190. return( decFieldTemp );
  191. }
  192. /////////////////////////////////////////////////////////////////////////////
  193. // Method: DWORD GPIO::GetGPOE( void )
  194. // Purpose: Get value of GPOE
  195. // Input: None
  196. // Output: None
  197. // Return: Content of GPOE (DWORD)
  198. /////////////////////////////////////////////////////////////////////////////
  199. DWORD GPIO::GetGPOE( void )
  200. {
  201. return ( decRegGPOE & 0x00FFFFFFL );
  202. }
  203. /////////////////////////////////////////////////////////////////////////////
  204. // Method: ErrorCode GPIO::SetGPIE( int bit, State s )
  205. // Purpose: Set or clear a bit in GPIE
  206. // Input: int bit - bit to be set or clear
  207. // State s - On to set; Off to clear
  208. // Output: None
  209. // Return: Success or Fail
  210. /////////////////////////////////////////////////////////////////////////////
  211. ErrorCode GPIO::SetGPIE( int bit, State s )
  212. {
  213. // range checking
  214. if ( ( bit < 0 ) || ( bit > MAX_GPIO_BIT ) )
  215. return ( Fail );
  216. RegField decFieldTemp( decRegGPIE, (BYTE)bit, 1, RW ); // create a reg field
  217. decFieldTemp = s;
  218. return ( Success );
  219. }
  220. /////////////////////////////////////////////////////////////////////////////
  221. // Method: void GPIO::SetGPIE( DWORD value )
  222. // Purpose: Set GPIE value
  223. // Input: DWORD value - value to be set to
  224. // Output: None
  225. // Return: None
  226. /////////////////////////////////////////////////////////////////////////////
  227. void GPIO::SetGPIE( DWORD value )
  228. {
  229. decRegGPIE = ( value & 0x00FFFFFFL ); // bits [23:0]
  230. }
  231. /////////////////////////////////////////////////////////////////////////////
  232. // Method: int GPIO::GetGPIE( int bit )
  233. // Purpose: Get value of a bit in GPIE
  234. // Input: int bit - bit to get value from
  235. // Output: None
  236. // Return: int - On (1), Off (0), or -1 for parameter error
  237. /////////////////////////////////////////////////////////////////////////////
  238. int GPIO::GetGPIE( int bit )
  239. {
  240. // range checking
  241. if ( ( bit < 0 ) || ( bit > MAX_GPIO_BIT ) )
  242. return ( -1 );
  243. RegField decFieldTemp( decRegGPIE, (BYTE)bit, 1, RW ); // create a reg field
  244. return( decFieldTemp );
  245. }
  246. /////////////////////////////////////////////////////////////////////////////
  247. // Method: DWORD GPIO::GetGPIE( void )
  248. // Purpose: Get value of GPIE
  249. // Input: None
  250. // Output: None
  251. // Return: Content of GPIE (DWORD)
  252. /////////////////////////////////////////////////////////////////////////////
  253. DWORD GPIO::GetGPIE( void )
  254. {
  255. return ( decRegGPIE & 0x00FFFFFFL );
  256. }
  257. /////////////////////////////////////////////////////////////////////////////
  258. // Method: ErrorCode GPIO::SetGPDATA( GPIOReg * data, int size, int offset )
  259. // Purpose: Set GPDATA registers contents
  260. // Input: GPIOReg * data - ptr to data to be copied from
  261. // int size - number of registers to be copied; max is 64
  262. // int offset - how many registers to skip (default = 0)
  263. // Output: None
  264. // Return: Success or Fail
  265. /////////////////////////////////////////////////////////////////////////////
  266. ErrorCode GPIO::SetGPDATA( GPIOReg * data, int size, int offset )
  267. {
  268. // check size and offset for out of bound
  269. if ( ( offset < 0 ) || ( size < 0 ) || ( size + offset > MAX_GPDATA_SIZE ) )
  270. return ( Fail );
  271. // point to offseted register
  272. GPIOReg * p = (GPIOReg *)((char *)decRegGPDATA.GetBaseAddress() +
  273. decRegGPDATA.GetOffset() +
  274. offset * sizeof( GPIOReg )); // pts to offseted register
  275. memcpy( p, data, size * sizeof( GPIOReg ) );
  276. return ( Success );
  277. }
  278. /////////////////////////////////////////////////////////////////////////////
  279. // Method: ErrorCode GPIO::GetGPDATA( GPIOReg * data, int size, int offset )
  280. // Purpose: Get GPDATA registers contents
  281. // Input: GPIOReg * data - ptr to data to be copied to
  282. // int size - number of registers to be copied; max is 64
  283. // int offset - how many registers to skip (default = 0)
  284. // Output: None
  285. // Return: Success or Fail
  286. /////////////////////////////////////////////////////////////////////////////
  287. ErrorCode GPIO::GetGPDATA( GPIOReg * data, int size, int offset )
  288. {
  289. // check size and offset for out of bound
  290. if ( ( offset < 0 ) || ( size < 0 ) || ( size + offset > MAX_GPDATA_SIZE ) )
  291. return ( Fail );
  292. // point to offseted register
  293. GPIOReg * p = (GPIOReg *)((char *)decRegGPDATA.GetBaseAddress() +
  294. decRegGPDATA.GetOffset() +
  295. offset * sizeof( GPIOReg )); // pts to offseted register
  296. memcpy( data, p, size * sizeof( GPIOReg ) );
  297. return ( Success );
  298. }
  299. /////////////////////////////////////////////////////////////////////////////
  300. // Method: ErrorCode GPIO::SetGPDATA( int fromBit, int toBit,
  301. // DWORD value, int offset )
  302. // Purpose: Set GPDATA contents with specified range of bits
  303. // Input: int fromBit - starting bit
  304. // int toBit - ending bit
  305. // DWORD value - value to set to
  306. // int offset - how many registers to skip (default = 0)
  307. // Output: None
  308. // Return: Success or Fail
  309. // Comment: By specifying a range of bits to be set, it allows a portion of
  310. // the GDATA register to be modified. For example,
  311. // SetGPDATA( 8, 10, 5, 0 )
  312. // would set the first GPDATA register's [10:8] to value 0x101
  313. /////////////////////////////////////////////////////////////////////////////
  314. ErrorCode GPIO::SetGPDATA( int fromBit, int toBit, DWORD value, int offset )
  315. {
  316. // check size and offset for out of bound
  317. if ( ( fromBit < 0 ) || ( fromBit > MAX_GPIO_BIT ) ||
  318. ( toBit < 0 ) || ( toBit > MAX_GPIO_BIT ) || ( fromBit > toBit ) ||
  319. ( offset < 0 ) || ( offset > MAX_GPDATA_SIZE ) )
  320. return ( Fail );
  321. // make sure value can "fit" into range of bits specified
  322. if ( value >= (DWORD) ( 0x00000001L << ( toBit - fromBit + 1 ) ) )
  323. return ( Fail );
  324. RegisterDW reg( decRegGPDATA.GetOffset() + offset * sizeof( GPIOReg ), RW );
  325. RegField field( reg, (BYTE)fromBit, (BYTE)(toBit - fromBit + 1), RW );
  326. field = value;
  327. return ( Success );
  328. }
  329. /////////////////////////////////////////////////////////////////////////////
  330. // Method: ErrorCode GPIO::GetGPDATA( int fromBit, int toBit,
  331. // DWORD * value, int offset )
  332. // Purpose: Get GPDATA contents with specified range of bits
  333. // Input: int fromBit - starting bit
  334. // int toBit - ending bit
  335. // int offset - how many registers to skip (default = 0)
  336. // Output: DWORD * value - value retrieved
  337. // Return: Success or Fail
  338. // Comment: By specifying a range of bits to be set, it allows a portion of
  339. // the GDATA register to be retrieved. For example,
  340. // GetGPDATA( 8, 10, &data, 0 )
  341. // would set *data to the first GPDATA register's [10:8] content
  342. /////////////////////////////////////////////////////////////////////////////
  343. ErrorCode GPIO::GetGPDATA( int fromBit, int toBit, DWORD * value, int offset )
  344. {
  345. // check size and offset for out of bound
  346. if ( ( fromBit < 0 ) || ( fromBit > MAX_GPIO_BIT ) ||
  347. ( toBit < 0 ) || ( toBit > MAX_GPIO_BIT ) || ( fromBit > toBit ) ||
  348. ( offset < 0 ) || ( offset > MAX_GPDATA_SIZE ) )
  349. return ( Fail );
  350. RegisterDW reg( decRegGPDATA.GetOffset() + offset * sizeof( GPIOReg ), RW );
  351. RegField field( reg, (BYTE)fromBit, (BYTE)(toBit - fromBit + 1), RW );
  352. *value = field;
  353. return ( Success );
  354. }