socket.c
上传用户:qiulin1960
上传日期:2013-10-16
资源大小:2844k
文件大小:19k
源码类别:

Windows CE

开发平台:

Windows_Unix

  1. /*++
  2. THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3. ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4. THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5. PARTICULAR PURPOSE.
  6. Copyright (c) 2001. Samsung Electronics, co. ltd  All rights reserved.
  7. Module Name:  
  8.    socket.c
  9.    
  10. Abstract:  
  11. Rev:
  12. 2002.04.22 : add S3C2410 specific initialization codes (by Seung-han, Lim)
  13. 2001.12.21 : Bug Fixup (kwangyoon LEE, kwangyoon@samsung.com)
  14. 2001.12.12 : add S3C2400 Specific codes (kwangyoon LEE, kwangyoon@samsung.com)
  15. Notes: 
  16. --*/
  17. #include <windows.h>
  18. #include <types.h>
  19. #include <cardserv.h>
  20. #include <sockserv.h>
  21. #include <sockpd.h>
  22. #include <memory.h>
  23. //#include <pc.h>
  24. #include "S2440.H"
  25. #include "pd6710.h"
  26. //#define FORCE_POLLING 1
  27. //
  28. // CEPC PCMCIA Socket Services Socket APIs:
  29. //    PDCardInquireSocket
  30. //    PDCardGetSocket
  31. //    PDCardSetSocket
  32. //    PDCardInquireAdapter
  33. //
  34. #define NUM_SOCKETS 1
  35. #define NUM_POWER_ENTRIES 4
  36. #define VCC_DEFAULT_INDEX 2
  37. //
  38. // @doc DRIVERS
  39. //
  40. PDCARD_ADAPTER_INFO v_AdapterInfo = {
  41. 1, // memory granularity (for production platforms, this should be 1)
  42. 0, // adapter capabilities
  43. 8, // cache line size in 32-bit words
  44. NUM_POWER_ENTRIES
  45. };
  46. PDCARD_POWER_ENTRY v_PowerEntries[NUM_POWER_ENTRIES] = {
  47. { 0,    PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
  48. { 33,   PWR_SUPPLY_VCC },
  49. { 50,   PWR_SUPPLY_VCC | PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 },
  50. { 120,  PWR_SUPPLY_VPP1 | PWR_SUPPLY_VPP2 }
  51. };
  52. PDCARD_SOCKET_STATE v_SockState[NUM_SOCKETS] = {
  53. {
  54. SOCK_CAP_IO,
  55. #ifdef FORCE_POLLING
  56. EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|
  57. #else
  58. EVENT_MASK_BATTERY_DEAD|EVENT_MASK_BATTERY_LOW|EVENT_MASK_CARD_DETECT|
  59. #endif
  60.         EVENT_MASK_WRITE_PROTECT, // status change interrupt mask
  61. 0, // present socket state
  62. 0, // control and indicators
  63. 0, // interface type
  64. 0, // Vcc
  65. 0, // Vpp1
  66. 0 // Vpp2
  67. },
  68. };
  69. //volatile PUCHAR g_PCICIndex;
  70. //volatile PUCHAR g_PCICData;
  71. //CRITICAL_SECTION g_PCIC_Crit;
  72. extern volatile PUCHAR g_PCICIndex;
  73. extern volatile PUCHAR g_PCICData;
  74. extern CRITICAL_SECTION g_PCIC_Crit;
  75. extern DWORD g_Irq; // PCMCIA IRQ set in init.c
  76. //extern volatile int BackupFlag;
  77. //extern void PD_DataBackup();
  78. extern void PD_DataRestore();
  79. //
  80. // Set the socket controller registers to initial state with no card inserted.
  81. //
  82. VOID InitSocketNoCard(UINT32 uSocket, BOOL bUserMode)
  83. {
  84. UCHAR tmp;
  85. UINT32 status; 
  86. UINT32 i; 
  87. UINT32 first, last;
  88. PDCARD_WINDOW_STATE WinState;
  89. DEBUGMSG (1,(TEXT("++InitSocketNoCard #%xnr"), uSocket));
  90. //RETAILMSG(1, (TEXT("PDD:SOCKET.C:InitSocketNoCard()rn")));
  91. PCICIndex(uSocket, REG_POWER_CONTROL);
  92. PCICDataWrite(PWR_AUTO_POWER);
  93. // PD6710 specific code to enable management interrupt(routed to -INTR)
  94. tmp = CFG_CARD_DETECT_ENABLE;
  95. PCICIndex(uSocket, REG_STATUS_CHANGE_INT_CONFIG);
  96. PCICDataWrite(tmp);
  97. // Enable Manage Interrupt
  98. PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
  99. tmp = PCICDataRead();
  100. tmp |= INT_ENABLE_MANAGE_INT;
  101. PCICDataWrite(tmp);
  102. //
  103. // Disable the I/O windows
  104. //
  105. first = (uSocket == 0) ? SOCKET0_FIRST_IO_WINDOW : SOCKET1_FIRST_IO_WINDOW;
  106. last = first + 2;
  107. for (i = first; i < last; i++) 
  108. {
  109. status = PDCardGetWindow(i, &WinState);
  110. if (status == CERR_SUCCESS) 
  111. {
  112. WinState.fState &= ~WIN_STATE_ENABLED;
  113. WinState.uOffset = 0;
  114. // set the high bit in the window index if we are in kernel-mode
  115. PDCardSetWindow(bUserMode ? i : (i|ADP_STATE_KERNEL_MODE), &WinState);
  116. }
  117. }
  118. DEBUGMSG (1,(TEXT("--InitSocketNoCardnr")));
  119. }
  120. //
  121. // PDCardGetSocket
  122. //
  123. // @func    STATUS | PDCardGetSocket | Get the socket state of the specified socket.
  124. // @rdesc   Returns one of the CERR_* return codes in cardserv.h.
  125. //
  126. // @comm    This function reads the specified socket's state and returns it in
  127. //          the PDCARD_SOCKET_STATE structure.
  128. //
  129. STATUS
  130. PDCardGetSocket(UINT32 uSocket, // @parm Socket number (first socket is 0)
  131. PPDCARD_SOCKET_STATE pState) // @parm Pointer to PDCARD_SOCKET_STATE structure
  132. {
  133. UINT8 tmp;
  134. PPDCARD_SOCKET_STATE pPDDState;
  135. DEBUGMSG(1,(TEXT("+++PDCardGetSocketrn")));
  136. if (uSocket >= NUM_SOCKETS) 
  137. {
  138. return CERR_BAD_SOCKET;
  139. }
  140. pPDDState = &v_SockState[uSocket];
  141.     
  142. EnterCriticalSection(&g_PCIC_Crit);
  143. pPDDState->fNotifyEvents = 0;        // Start off with nothing
  144. //
  145. // First acknowledge any status change interrupts
  146. //
  147. PCICIndex(uSocket, REG_CARD_STATUS_CHANGE);
  148. tmp = PCICDataRead();
  149. DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) REG_CARD_STATUS_CHANGE(0x%x) = 0x%xrn"),
  150.      uSocket, REG_CARD_STATUS_CHANGE, tmp));
  151. //
  152. // Figure out the socket state
  153. //
  154. PCICIndex(uSocket, REG_INTERFACE_STATUS);
  155. tmp = PCICDataRead();
  156. if ((tmp & (STS_CD1|STS_CD2)) == (STS_CD1|STS_CD2)) 
  157. {
  158. pPDDState->fNotifyEvents |= EVENT_MASK_CARD_DETECT;
  159. } else {
  160. InitSocketNoCard(uSocket, FALSE);
  161. goto pcgs_exit;
  162. }
  163. #ifdef NOT_IMPLEMENTED
  164. switch (tmp & (STS_BVD1|STS_BVD2)) 
  165. {
  166. case STS_BVD1:
  167. pPDDState->fNotifyEvents |= EVENT_MASK_BATTERY_LOW;
  168. DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) BATTERY_LOWrn"), uSocket));
  169. break;
  170. case STS_BVD2:
  171. case 0:
  172. DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) BATTERY_DEADrn"), uSocket));
  173. pPDDState->fNotifyEvents |= EVENT_MASK_BATTERY_DEAD;
  174. break;
  175. }
  176. #endif NOT_IMPLEMENTED
  177. if (tmp & STS_WRITE_PROTECT) 
  178. {
  179. DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) WRITE_PROTECTrn"), uSocket));
  180. pPDDState->fNotifyEvents |= EVENT_MASK_WRITE_PROTECT;
  181. }
  182. if (tmp & STS_CARD_READY) 
  183. {
  184. DEBUGMSG(ZONE_PDD, (TEXT("PDCardGetSocket(%d) CARD_READYrn"), uSocket));
  185. pPDDState->fNotifyEvents |= EVENT_MASK_CARD_READY;
  186. }
  187. DEBUGMSG(1,(TEXT("---PDCardGetSocketrn")));
  188. pcgs_exit:
  189. memcpy(pState, pPDDState, sizeof(PDCARD_SOCKET_STATE));
  190. LeaveCriticalSection(&g_PCIC_Crit);
  191. return CERR_SUCCESS;
  192. }   // PDDCardGetSocket
  193. //
  194. // PDCardSetSocket
  195. //
  196. // @func    STATUS | PDCardSetSocket | Set the socket state of the specified socket.
  197. // @rdesc   Returns one of the CERR_* return codes in cardserv.h.
  198. //
  199. // @comm    This function sets the specified socket's state and adjusts the socket
  200. //          controller appropriately.
  201. //          PDCardGetSocketState will usually be called first and adjustments will
  202. //          be made to the PDCARD_SOCKET_STATE structure before PDCardSetSocketState
  203. //          is called.  This avoids duplicated socket state on different layers and
  204. //          it avoids unintentionally setting socket parameters.
  205. //
  206. // @xref <f PDCardGetSocketState>
  207. //
  208. STATUS
  209. PDCardSetSocket(UINT32 uSocket, // @parm Socket number (first socket is 0)
  210. PPDCARD_SOCKET_STATE pState) // @parm Pointer to PDCARD_SOCKET_STATE structure
  211. {
  212. UINT8 tmp, intctl;
  213. PPDCARD_SOCKET_STATE pPDDState;
  214. STATUS ret;
  215. int t;
  216. DEBUGMSG(1, (TEXT("PDCardSetSocket(%d) enteredrn"), uSocket));
  217. if (uSocket >= NUM_SOCKETS) 
  218. {
  219. ret = CERR_BAD_SOCKET;
  220. goto pcss_fail;
  221. }
  222. //
  223. // Check socket power level indexes
  224. //
  225. if ((pState->fVcc & SOCK_VCC_LEVEL_MASK) >= NUM_POWER_ENTRIES ||
  226. !(v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].fSupply & PWR_SUPPLY_VCC)) 
  227. {
  228. ret = CERR_BAD_VCC;
  229. goto pcss_fail;
  230. }
  231. if (pState->uVpp1 >= NUM_POWER_ENTRIES || pState->uVpp2 >= NUM_POWER_ENTRIES ||
  232. !(v_PowerEntries[pState->uVpp1].fSupply & PWR_SUPPLY_VPP1) ||
  233. !(v_PowerEntries[pState->uVpp2].fSupply & PWR_SUPPLY_VPP2)) 
  234. {
  235. ret = CERR_BAD_VPP;
  236. goto pcss_fail;
  237. }
  238. EnterCriticalSection(&g_PCIC_Crit);
  239. PCICIndex(uSocket, REG_INTERFACE_STATUS);
  240. tmp = PCICDataRead();
  241. if ((tmp & (STS_CD1|STS_CD2)) != (STS_CD1|STS_CD2)) 
  242. {
  243. DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket(%d) No card insertedrn"), uSocket));
  244. InitSocketNoCard(uSocket, FALSE);
  245. goto pcss_exit;
  246. }
  247. pPDDState = &v_SockState[uSocket];
  248. //
  249. // Set the status change interrupt sources
  250. //
  251. #if 1
  252. tmp = (UCHAR)(g_Irq << 4); // CFG_MANAGEMENT_IRQ_BIT* bits will be set
  253. #else
  254. tmp =0;
  255. #endif
  256. if (pState->fInterruptEvents & EVENT_MASK_CARD_DETECT) 
  257. {
  258. tmp |= CFG_CARD_DETECT_ENABLE;
  259. }
  260. if (pState->fInterruptEvents & EVENT_MASK_BATTERY_DEAD) 
  261. {
  262. tmp |= CFG_BATTERY_DEAD_ENABLE;
  263. }
  264. if (pState->fInterruptEvents & EVENT_MASK_BATTERY_LOW) 
  265. {
  266. tmp |= CFG_BATTERY_WARNING_ENABLE;
  267. }
  268. if (pState->fIREQRouting & SOCK_IREQ_ENABLE) 
  269. {
  270. // tmp |= CFG_READY_ENABLE;
  271. PCICIndex(uSocket, REG_STATUS_CHANGE_INT_CONFIG);
  272. PCICDataWrite(tmp);
  273. DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket(%d) REG_STATUS_CHANGE_INT_CONFIG(0x%x) = 0x%xrn"),
  274. uSocket, REG_STATUS_CHANGE_INT_CONFIG, tmp));
  275. #if 1
  276. // PD6710 specific code to enable management interrupt(routed to -INTR)
  277. PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
  278. tmp = PCICDataRead();
  279. tmp |= INT_ENABLE_MANAGE_INT;
  280. PCICDataWrite(tmp);
  281. #endif
  282. //
  283. // Enable or disable IREQ interrupts
  284. //
  285. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  286. tmp = PCICDataRead();
  287. tmp &= (UCHAR)~g_Irq; // Turn off INT_IRQ_BIT* bits
  288. if (pState->fIREQRouting & SOCK_IREQ_ENABLE) 
  289. {
  290. DEBUGMSG(1, (TEXT("Enable IREQ interrupts #%xrn"), g_Irq));
  291. tmp |= ((UCHAR)g_Irq)|INT_CARD_NOT_RESET; // Turn on INT_IRQ_BIT* bits
  292. } else {
  293. tmp |= INT_CARD_NOT_RESET;
  294. }
  295. PCICDataWrite(tmp);
  296. DEBUGMSG(1, (TEXT("PDCardSetSocket voltage = %drn"),
  297. v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].uPowerLevel));
  298. // ignore Vpp 
  299. if ((pState->fVcc & SOCK_VCC_LEVEL_MASK) != (pPDDState->fVcc & SOCK_VCC_LEVEL_MASK)) 
  300. {
  301. //
  302. // Set socket power as requested.
  303. //
  304. switch (v_PowerEntries[pState->fVcc & SOCK_VCC_LEVEL_MASK].uPowerLevel) 
  305. {
  306. case 0:
  307. PCICIndex(uSocket, REG_POWER_CONTROL);
  308. PCICDataWrite(0);
  309. goto pcss_exit; // this is what it used to do so I won't change it
  310. case 33:
  311. PCICIndex(uSocket, 0x16);//REG_MISC_CONTROL_1);
  312. PCICDataWrite(0x02);  // enable 3.3V
  313. DEBUGMSG(1, (TEXT("set to 3.3Vrn")));
  314. break;
  315. case 50:
  316. PCICIndex(uSocket, 0x16);//REG_MISC_CONTROL_1);
  317. if (PCICDataRead() & 0x01) // i.e., if we detect a 5V card:
  318. {
  319. PCICDataWrite(0x00);  // disable 3.3V (i.e., use 5V)
  320. DEBUGMSG(1, (TEXT("set to 5Vrn")));
  321. }
  322. else
  323. {
  324. // this is a 3.3V ONLY card and mustn't be powered at 5V
  325. // so ignore the command; we'd assert here save that card
  326. // services will attempt to apply 5V to read the CIS.
  327. PCICDataWrite(0x02);  // enable 3.3V
  328.   DEBUGMSG(1, (TEXT("set to 3.3V[5V]rn")));
  329. }
  330. break;
  331. default:
  332. ASSERT(0); // this ought to have been caught above
  333. }
  334. // LKY 2001.12
  335. Sleep(100);
  336. //
  337. // Assert RESET
  338. //
  339. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  340. intctl = PCICDataRead();
  341. PCICDataWrite((UINT8)(intctl & ~ INT_CARD_NOT_RESET));
  342. Sleep(20);
  343. PCICIndex(uSocket, REG_POWER_CONTROL);
  344. PCICDataWrite(PWR_OUTPUT_ENABLE | PWR_AUTO_POWER | PWR_VPP2_BIT0 | PWR_VPP1_BIT0);
  345. //
  346. // Power the socket
  347. //
  348. PCICIndex(uSocket, REG_POWER_CONTROL);
  349. PCICDataWrite(PWR_OUTPUT_ENABLE | PWR_AUTO_POWER | PWR_VCC_POWER | PWR_VPP2_BIT0 | PWR_VPP1_BIT0);
  350. Sleep(20);
  351. //
  352. // Deassert RESET
  353. //
  354. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  355. intctl = PCICDataRead();
  356. PCICDataWrite((UINT8)(intctl | INT_CARD_NOT_RESET));
  357. Sleep(20);
  358.     
  359. //
  360. // Allow the card 2 seconds to assert RDY
  361. //
  362. PCICIndex(uSocket, REG_INTERFACE_STATUS);
  363. for (t = 0; t < PCMCIA_MAX_RDY_WAIT_TIME; t += PCMCIA_RDY_POLL_INT) 
  364. {
  365. tmp = PCICDataRead();
  366. if (tmp & STS_CARD_READY) 
  367. {
  368. DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket: Card in socket %d RDY after %dmsrn"),
  369. uSocket, t));
  370. break;
  371. }
  372. Sleep(PCMCIA_RDY_POLL_INT);
  373. }
  374. if (t >= PCMCIA_MAX_RDY_WAIT_TIME) 
  375. {
  376. DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket: CARD IN SOCKET %d NOT RDY AFTER %dmsrn"),
  377. uSocket, t));
  378. }
  379. // LKY 2001.12    
  380. Sleep(300); // necessary for CF cards?
  381. }
  382. if (pState->fIREQRouting & SOCK_IREQ_ENABLE) 
  383. DumpSocketRegisters(uSocket);
  384. *pPDDState = *pState;
  385. pcss_exit:
  386. #ifdef DEBUG
  387. DeltaSocketRegisters(uSocket);
  388. #endif
  389. LeaveCriticalSection(&g_PCIC_Crit);
  390. return CERR_SUCCESS;
  391. pcss_fail:
  392. DEBUGMSG(ZONE_PDD, (TEXT("PDCardSetSocket(%d) returning %drn"), uSocket, ret));
  393. return ret;
  394. }   // PDCardSetSocket
  395. //
  396. // PDCardInquireAdapter
  397. //
  398. // @func    STATUS | PDCardInquireAdapter | Returns the socket controller's characteristics
  399. //                                          and capabilities.
  400. // @rdesc   Returns one of the CERR_* return codes in cardserv.h.
  401. //
  402. STATUS
  403. PDCardInquireAdapter( PPDCARD_ADAPTER_INFO pAdapterInfo ) // @parm Pointer to PDCARD_ADAPTER_INFO structure.
  404. {
  405. if (pAdapterInfo->uPowerEntries < NUM_POWER_ENTRIES) 
  406. {
  407. pAdapterInfo->uPowerEntries = NUM_POWER_ENTRIES;
  408. return CERR_BAD_ARG_LENGTH;
  409. }
  410. // Copy the adapter info
  411. memcpy(pAdapterInfo, &v_AdapterInfo, sizeof(PDCARD_ADAPTER_INFO));
  412. pAdapterInfo = (PPDCARD_ADAPTER_INFO)(((UINT)pAdapterInfo) + sizeof(PDCARD_ADAPTER_INFO));
  413. // Copy the power entries at the end
  414. memcpy(pAdapterInfo, &v_PowerEntries, sizeof(v_PowerEntries));
  415. return CERR_SUCCESS;
  416. }
  417. //
  418. // Set up socket's initial window registers and interrupts
  419. //
  420. VOID
  421. InitSocket( UINT32 uSocket )
  422. {
  423. PDCARD_WINDOW_STATE WinState;
  424. PDCARD_SOCKET_STATE SockState;
  425. UINT32 status; 
  426. UINT32 i; 
  427. UINT32 first, last;
  428. DEBUGMSG(1, (TEXT(":::PCMCIA:InitSocketrn")));
  429. //
  430. // Set the socket to detect status change events
  431. //
  432. SockState = v_SockState[uSocket];
  433. SockState.fInterruptEvents = EVENT_MASK_CARD_DETECT|
  434.                                  EVENT_MASK_CARD_LOCK|
  435.                                  EVENT_MASK_BATTERY_LOW|
  436.                                  EVENT_MASK_BATTERY_DEAD|
  437.                                  EVENT_MASK_WRITE_PROTECT;
  438. #if 0
  439. SockState.fInterfaceType = CFG_IFACE_MEMORY;
  440. SockState.fIREQRouting = 0;
  441. #else
  442. SockState.fInterfaceType = CFG_IFACE_MEMORY_IO; // IO/MEM Interface, 2000.4.26, LKY
  443. SockState.fIREQRouting = 1;  // IRQRouting enabled, 2000.4.26, LKY
  444. #endif
  445. SockState.fVcc = VCC_DEFAULT_INDEX;
  446. PDCardSetSocket(uSocket, &SockState);
  447. //
  448. // Initially enable only the memory windows
  449. //
  450. first = (uSocket == 0) ? 0 : SOCKET1_FIRST_MEMORY_WINDOW;
  451. last = first + SOCKET1_FIRST_MEMORY_WINDOW;
  452. for (i = first; i < last; i++) 
  453. {
  454. status = PDCardGetWindow(i, &WinState);
  455. if (status == CERR_SUCCESS) 
  456. {
  457. WinState.fState |= WIN_STATE_ATTRIBUTE|WIN_STATE_ENABLED;
  458. PDCardSetWindow(i, &WinState);
  459. }
  460. }
  461. }   // InitSocket
  462. //
  463. // PDCardResetSocket
  464. //
  465. // @func    STATUS | PDCardResetSocket | Resets the specified socket.
  466. // @rdesc   Returns one of the CERR_* return codes in cardserv.h.
  467. //
  468. STATUS
  469. PDCardResetSocket( UINT32 uSocket ) // @parm Socket number (first socket is 0)
  470. {
  471. UINT8 tmp;
  472. UINT8 intctl;
  473. UINT32 t; 
  474. DEBUGMSG(1, (TEXT("++PDCardResetSocketrn")));
  475. if (uSocket >= NUM_SOCKETS) 
  476. {
  477. return CERR_BAD_SOCKET;
  478. }
  479. EnterCriticalSection(&g_PCIC_Crit);
  480. PCICIndex(uSocket, REG_INTERFACE_STATUS);
  481. tmp = PCICDataRead();
  482. //
  483. // Power off the socket
  484. //
  485. PCICIndex(uSocket, REG_POWER_CONTROL);
  486. PCICDataWrite(0);
  487. if ((tmp & (STS_CD1|STS_CD2)) != (STS_CD1|STS_CD2)) 
  488. {
  489. //
  490. // Leave it powered off if no card in it.
  491. //
  492. InitSocketNoCard(uSocket, FALSE);
  493. LeaveCriticalSection(&g_PCIC_Crit);
  494. return CERR_NO_CARD;
  495. }
  496. //
  497. // Tri-state outputs for 310ms
  498. //
  499. Sleep(310);
  500. //
  501. // Assert RESET
  502. //
  503. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  504. intctl = PCICDataRead();
  505. PCICDataWrite(0);
  506. //
  507. // Power the socket
  508. //
  509. PCICIndex(uSocket, REG_POWER_CONTROL);
  510. PCICDataWrite(PWR_OUTPUT_ENABLE|PWR_AUTO_POWER|PWR_VCC_POWER);
  511. Sleep(20);
  512. //
  513. // Deassert RESET
  514. //
  515. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  516. PCICDataWrite(INT_CARD_NOT_RESET);
  517. //
  518. // Allow 20ms for card to assert RDY
  519. //
  520. Sleep(20);
  521. //
  522. // Allow the card 2 seconds to assert RDY
  523. //
  524. PCICIndex(uSocket, REG_INTERFACE_STATUS);
  525. for (t = 0; t < PCMCIA_MAX_RDY_WAIT_TIME; t += PCMCIA_RDY_POLL_INT) 
  526. {
  527. tmp = PCICDataRead();
  528. if (tmp & STS_CARD_READY) 
  529. {
  530. DEBUGMSG(ZONE_PDD, (TEXT("PDCardResetSocket: Card in socket %d RDY after %dmsrn"),uSocket, t));
  531. break;
  532. }
  533. Sleep(PCMCIA_RDY_POLL_INT);
  534. }
  535. if (t >= PCMCIA_MAX_RDY_WAIT_TIME) 
  536. {
  537. DEBUGMSG(ZONE_PDD, (TEXT("PDCardResetSocket: CARD IN SOCKET %d NOT RDY AFTER %dmsrn"),uSocket, t));
  538. }
  539. InitSocket(uSocket);
  540. // LKY 2001.12
  541. Sleep(20);
  542. PCICIndex(uSocket, REG_INTERRUPT_AND_GENERAL_CONTROL);
  543. intctl |= INT_CARD_NOT_RESET;
  544. PCICDataWrite(intctl);
  545. // LKY 2001.12
  546. Sleep(20);
  547. #if 0
  548. // Enable Manage Interrupt
  549. PCICIndex(0, REG_INTERRUPT_AND_GENERAL_CONTROL);
  550. intctl = PCICDataRead();
  551. intctl |= INT_ENABLE_MANAGE_INT;
  552. PCICDataWrite(intctl);
  553. #endif
  554. LeaveCriticalSection(&g_PCIC_Crit);
  555.     
  556. DEBUGMSG(1, (TEXT("--PDCardResetSocketrn")));
  557.     
  558. return CERR_SUCCESS;
  559. }   // PDCardResetSocket
  560. //
  561. // PDCardGetAdapter
  562. //
  563. // @func    STATUS | PDCardGetAdapter | Returns power save mode status and capabilities
  564. // @rdesc   Returns one of the CERR_* return codes in cardserv.h
  565. //
  566. STATUS
  567. PDCardGetAdapter( UINT32 uSocket,
  568. PPDCARD_ADAPTER_STATE pState     )
  569. {
  570. UINT8 tmp;
  571. BOOL bUserMode;
  572. if (uSocket >= NUM_SOCKETS) 
  573. {
  574. return CERR_BAD_SOCKET;
  575. }
  576. if (pState == NULL) 
  577. {
  578. return CERR_BAD_ARGS;
  579. }
  580. bUserMode = (*pState & ADP_STATE_KERNEL_MODE) ? FALSE : TRUE;
  581. DEBUGMSG(1, (TEXT("PDCardGetAdapter enteredrn")));
  582. *pState = 0;
  583. if (bUserMode) 
  584. {
  585. EnterCriticalSection(&g_PCIC_Crit);
  586. }
  587. PCICIndex(uSocket, REG_POWER_CONTROL);
  588. tmp = PCICDataRead();
  589. if (!(tmp & PWR_OUTPUT_ENABLE)) 
  590. {
  591. *pState |= ADP_STATE_POWERDOWN;
  592. }
  593. if (bUserMode) 
  594. {
  595. LeaveCriticalSection(&g_PCIC_Crit);
  596. }
  597. DEBUGMSG(1, (TEXT("PDCardGetAdapter donern")));
  598. return CERR_SUCCESS;
  599. }
  600. //
  601. // PDCardSetAdapter
  602. //
  603. // @func    STATUS | PDCardSetAdapter | Sets power save mode status and capabilities
  604. // @rdesc   Returns one of the CERR_* return codes in cardserv.h
  605. //
  606. STATUS
  607. PDCardSetAdapter( UINT32 uSocket,
  608. PPDCARD_ADAPTER_STATE pState )
  609. {
  610. BOOL bUserMode;
  611. // UINT32 bSoc;
  612. if (uSocket >= NUM_SOCKETS) 
  613. {
  614. return CERR_BAD_SOCKET;
  615. }
  616. if (pState == NULL) 
  617. {
  618. return CERR_BAD_ARGS;
  619. }
  620. bUserMode = (*pState & ADP_STATE_KERNEL_MODE) ? FALSE : TRUE;
  621. DEBUGMSG(1, (TEXT("PDCardSetAdapter enteredrn")));
  622. if (bUserMode) 
  623. {
  624. EnterCriticalSection(&g_PCIC_Crit);
  625. }
  626. //
  627. // The socket controller will automatically power up when a card is inserted
  628. // by shlim
  629. // if (*pState & (ADP_STATE_POWERDOWN|ADP_STATE_POWEROFF)) 
  630. if (*pState & (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)) 
  631. {
  632. //RETAILMSG(1, (TEXT("---- (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)rn")));
  633. // Power down the socket
  634. //RETAILMSG(1, (TEXT("PD_DataRestore()rn")));
  635. PD_DataRestore();
  636. InitSocketNoCard(uSocket, bUserMode);
  637. }else {
  638. //RETAILMSG(1, (TEXT("---! (ADP_STATE_POWEROFF | ADP_STATE_POWERDOWN)rn")));
  639. //
  640. // Power up the socket
  641. //
  642. //RETAILMSG(1, (TEXT("PD_DataBackup()rn")));
  643. //PD_DataBackup();
  644. //InitSocketNoCard(uSocket, bUserMode);
  645. }
  646. if (bUserMode) 
  647. {
  648. LeaveCriticalSection(&g_PCIC_Crit);
  649. }
  650. return CERR_SUCCESS;
  651. }