s3c4510.c
上传用户:fsjiahua
上传日期:2013-03-07
资源大小:89k
文件大小:19k
源码类别:

并口编程

开发平台:

Visual C++

  1. #define VERSION "1.0"
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #include <time.h>
  5. #include <conio.h>
  6. #include "s3c4510.h"
  7. int pin[] =
  8. {
  9. //0
  10.     1,  // UARXD1_IN      PEXINT(7) out
  11. 1,  // UARXD1_IN      PEXINT(7) out enable
  12.     1,  // nUADSR0_OUT     PEXINT(7) observe_only
  13.     1,  // UATXD0_OUT     PEXINT(6) out
  14.     1,  // nUADTR0_IN     PEXINT(6) out enable
  15.     1,  // UARXD0_IN       PEXINT(6) observe_only
  16.     1,  // SDA_OUT           PEXINT(5) out
  17.     1,  // SDA_IN          PEXINT(5) out enable
  18.     1,  // SCL_OUT         PEXINT(5) observe_only
  19.     1,  // SCL_IN           PEXINT(4) out
  20.     1,  // P_17_ENB          PEXINT(4) out enable
  21. //10
  22.     1,  // P_17_OUT         PEXINT(4) observe_only
  23.     1,  // P_17_IN           PEXINT(3) out
  24.     1,  // P_16_ENB         PEXINT(3) out enable
  25.     1,  // P_16_OUT        PEXINT(3) observe_only
  26.     1,  // P_16_IN           PEXINT(2) out
  27.     1,  // P_15_ENB          PEXINT(2) out enable
  28.     1,  // P_15_OUT          PEXINT(2) observe_only
  29.     1,  // P_15_IN           PEXINT(1) out
  30.     1,  // P_14_ENB           PEXINT(1) out enable
  31.     1,  // P_14_OUT           PEXINT(1) observe_only
  32. //20
  33.     1,  // P_14_IN           PEXINT(0) out
  34.     1,  // P_13_ENB              PEXINT(0) out enable
  35.     1,  // P_13_OUT          PEXINT(0) observe_only
  36.     1,  // P_13_IN             PNXDACK0
  37.     1,  // P_12_ENB            PNXDACK0 out enable
  38.     1,  // P_12_OUT           PNXDACK0  observe_only
  39.     1,  // P_12_IN              PNXDREQ0  
  40.     1,  // P_11_ENB              PNXDREQ0 out enable
  41.     1,  // P_11_OUT              PNXDREQ0  observe_only
  42.     1,  // P_11_IN                 PNXWAIT  
  43. //30
  44.     1,  // P_10_ENB                PNXWAIT  out enable
  45.     1,  // P_10_OUT               PNXWAIT   observe_only
  46.     1,  // P_10_IN              PSCLK
  47.     1,  // P_9_ENB              PSCLK   out enable
  48.     1,  // P_9_OUT               PSCKE
  49.     1,  // P_9_IN                    PSCKE   out enable
  50.     1,  // P_8_ENB           PNGCS(7)
  51.     1,  // P_8_OUT           nGCS_6_OUT
  52.     1,  // P_8_IN            nRCS_5_OUT
  53.     0,  // P_7_ENB            nRCS_5_OUT enable
  54. //40
  55.     1,  // P_7_OUT             nRCS_4_OUT
  56.     0,  // P_7_IN               nRCS_4_OUT enable
  57.     1,  // P_6_ENB              nRCS_3_OUT
  58.     0,  // P_6_OUT             nRCS_3_OUT enable
  59.     1,  // P_6_IN                nRCS_2_OUT
  60.     0,  // P_5_ENB              nRCS_2_OUT enable
  61.     1,  // P_5_OUT                nRCS_1_OUT
  62.     0,  // P_5_IN                nRCS_1_OUT enable
  63.     1,  // P_4_ENB               nRCS_0_OUT
  64.     1,  // P_4_OUT          nDWE_OUT
  65. //50
  66.     1,  // P_4_IN               nOE_OUT
  67.     1,  // P_3_ENB             nWBE_3_OUT
  68.     1,  // P_3_OUT             nWBE_3_OUT enable
  69.     1,  // P_3_IN               nWBE_2_OUT
  70.     1,  // P_2_ENB              nWBE_2_OUT enable
  71.     1,  // P_2_OUT              nWBE_1_OUT
  72.     1,  // P_2_IN               nWBE_1_OUT
  73.     0,  // P_1_ENB            nWBE_DWE_OE_CS0_OUT_ENB
  74.     1,  // P_1_OUT             PNCAS(3)
  75.     0,  // P_1_IN              PNCAS(3 enable)
  76. //60
  77.     1,  // P_0_ENB             PNCAS(2)
  78.     0,  // P_0_OUT               PNCAS(2)  enable
  79.     1,  // P_0_IN               PNCAS(1)
  80.     1,  // D_31_OUT                PNCAS(0)
  81.     0,  // D_31_IN     nGCS_6-7_OUT  PNCAS(0-1) enable
  82.     0,  // D_30_OUT    //a0  66-101 都为0
  83.     0,  // D_30_IN
  84.     0,  // D_29_OUT
  85.     0,  // D_29_IN
  86.     0,  // D_28_OUT
  87. //70
  88.     0,  // D_28_IN
  89.     0,  // D_27_OUT
  90.     0,  // D_27_IN
  91.     0,  // D_26_OUT
  92.     0,  // D_26_IN
  93.     0,  // D_25_OUT
  94.     0,  // D_25_IN
  95.     0,  // D_24_OUT
  96.     0,  // D_24_IN
  97.     0,  // D_23_OUT
  98. //80
  99.     0,  // D_23_IN
  100.     0,  // D_22_OUT    a15
  101.     0,  // D_22_IN
  102.     0,  // D_21_OUT    a16
  103.     0,  // D_21_IN
  104.     0,  // D_20_OUT    a17
  105.     0,  // D_20_IN
  106.     0,  // D_19_OUT    a18
  107.     0,  // D_19_IN
  108.     0,  // D_18_OUT
  109. //90
  110.     0,  // D_18_IN
  111.     0,  // D_17_OUT
  112.     0,  // D_17_IN
  113.     0,  // D_16_OUT
  114.     0,  // D_16_IN
  115.     0,  // D_15_OUT
  116.     0,  // D_15_IN
  117.     0,  // D_14_OUT
  118.     0,  // D_14_IN
  119.     0,  // D_13_OUT   a24
  120. //100
  121.     0,  // D_13_IN
  122.     0,  //          d0-out
  123.     0,  //          d0-in
  124.     0,  // D_11_OUT
  125.     0,  // D_11_IN
  126.     0,  // D_10_OUT
  127.     0,  // D_10_IN
  128.     0,  // D_9_OUT
  129.     0,  // D_9_IN
  130.     0,  // D_8_OUT
  131. //110
  132.     0,  // D_8_IN
  133.     0,  // D_7_OUT
  134.     0,  // D_7_IN
  135.     0,  // D_6_OUT
  136.     0,  // D_6_IN
  137.     0,  // D_5_OUT  d7-out
  138.     1,  // D_5_IN   d7-d0-out-enable
  139.     0,  // D_4_OUT
  140.     0,  // D_4_IN    d8-out
  141.     0,  // D_3_OUT   d8-in
  142. //120
  143.     0,  // D_3_IN     
  144.     0,  // D_2_OUT
  145.     0,  // D_2_IN
  146.     0,  // D_1_OUT
  147.     0,  // D_1_IN
  148.     0,  // D_0_OUT
  149.     0,  // D_0_IN
  150.     0,  //1,// D_OUT_ENB    
  151.     0,  // A_21_OUT
  152.     0,  // A_20_OUT
  153. //130
  154.     0,  // A_19_OUT
  155.     0,  // A_18_OUT
  156.     0,  // A_17_OUT    d15 out
  157.     1,  // A_16_OUT    d15-d8-out-enable
  158.     0,  // A_15_OUT
  159.     0,  // A_14_OUT     D16_OUT
  160.     1,  // A_13_OUT     D16_OUT_ENB
  161.     0,  // A_12_OUT     D16_IN
  162.     0,  // A_11_OUT
  163.     1,  // A_10_OUT        D17_OUT_ENB
  164. //140
  165.     0,  // A_9_OUT
  166.     0,  // A_8_OUT
  167.     1,  // A_7_OUT       D18_OUT_ENB
  168.     0,  // A_6_OUT
  169.     0,  // A_5_OUT
  170.     1,  // A_4_OUT       D19_OUT_ENB
  171.     0,  // A_3_OUT
  172.     0,  // A_2_OUT
  173.     1,  // A_1_OUT        D20_OUT_ENB
  174.     0,  // A_0_OUT
  175. //150
  176.     0,  // ExtMACK_OUT
  177.     1,  // ExtMREQ_IN      D21_OUT_ENB
  178.     0,  // nWBE_3_OUT
  179.     0,  // nWBE_2_OUT
  180.     1,  // nWBE_1_OUT       D22_OUT_ENB
  181.     0,  // nWBE_0_OUT
  182.     0,  // nDWE_OUT
  183.     1,  // nCAS_3_OUT        D23_OUT_ENB
  184.     0,  // nCAS_2_OUT
  185.     0,  // nCAS_1_OUT
  186. //160
  187.     1,  // nCAS_0_OUT        D24_OUT_ENB
  188.     0,  // nRAS_3_OUT
  189.     0,  // nRAS_2_OUT
  190.     1,  // nRAS_1_OUT        D25_OUT_ENB
  191.     0,  // nRAS_0_OUT
  192.     0,  // nRCS_5_OUT
  193.     1,  // nRCS_4_OUT        D26_OUT_ENB
  194.     0,  // nRCS_3_OUT
  195.     0,  // nRCS_2_OUT
  196.     1,  // nRCS_1_OUT        D27_OUT_ENB
  197. //170
  198.     0,  // CLKSEL_IN
  199.     0,  // nRESET_IN
  200.     1,  // MCLK_IN         D28_OUT_ENB
  201.     0,  // MCLKO_OUT
  202.     0,  // CLKOEN_IN
  203.     1,  // nRCS_0_OUT       D29_OUT_ENB
  204.     0,  // B0SIZE_1_IN
  205.     0,  // B0SIZE_0_IN
  206.     1,  // nOE_OUT            D30_OUT_ENB
  207.     0,  // nEWAIT_IN
  208. //180
  209.     0,  // nECS_3_OUT
  210.     1,  // nECS_2_OUT         D31_OUT_ENB
  211.     1,  // nECS_1_OUT        D31_IN
  212.     1,  // nECS_0_OUT         PTXD0
  213.     1,  // DIS_BUS            PTXD0   out enable
  214.     1,  // UCLK_IN             PTXD0   observe_only
  215.     1,  // TMODE_IN           PRXD0
  216.     1,  // MDC_OUT              PRXD0  out enable
  217.     1,  // LITTLE_IN             PRXD0 observe_only
  218.     1,  // MDIO_OE              PVD(0)
  219. //190
  220.     1,  // MDIO_OUT          PVD(0) out enable
  221.     1,  // MDIO_IN             PVD(0) observe_only
  222.     1,  // TX_EN_TXEN_10M_OUT     PVD(1)
  223.     1,  // TX_CLK_TXCLK_10M_OUT    PVD(1) out enable
  224.     1,  // TX_ERR_PCOMP_10M_OUT   PVD(1) observe_only
  225.     1,  // TXD3_OUT                 PVD(2)
  226.     1,  // TXD2_OUT                     PVD(2) out enable
  227.     1,  // TXD1_LOOP10_OUT             PVD(2) observe_only
  228.     1,  // TXD0_TXD_10M_OUT          PVD(3)
  229.     1,  // COL_COL_10M_IN           PVD(3) out enable
  230. //200
  231.     1,  // RX_CLK_RXCLK_10M_IN         PVD(3) observe_only
  232.     1,  // RX_ERR_IN                   PVCLK
  233.     1,  // RXD3_IN                     PVCLK  out enable
  234.     1,  // RXD2_IN                PVCLK   observe_only
  235.     1,  // RXD1_IN               PVLINE      
  236.     1,  // RXD0_RXD_10M_IN     PVLINE   out enable
  237.     1,  // RX_DV_LINK10_IN   PVLINE   observe_only
  238.     1,  // CRS_CRS_10M_IN   PVM
  239.     1,  // TXCBEN            PVM    out enable
  240.     1,  // TXCB_OUT           PVM   observe_only
  241. //210
  242.     1,  // TXCB_IN              PVFRAME
  243.     1,  // nSYNCB_OUT        PVFRAME  out enable
  244.     1,  // RXCB_IN          PVFRAME  observe_only
  245.     1,  // nDCDB_IN        PTOUT(4)
  246.     1,  // nCTSB_IN         PTOUT(4) out enable
  247.     1,  // TXDB_OUT        PTOUT(4)   observe_only
  248.     1,  // nRTSB_OUT        PTOUT(3)
  249.     1,  // RXDB_IN         PTOUT(3) out enable
  250.     1,  // nDTRB_OUT       PTOUT(43)   observe_only
  251.     1,  // TXCAEN              PTOUT(2)
  252. //220
  253.     1,  // TXCA_OUT        PTOUT(2) out enable
  254.     1,  // TXCA_IN           PTOUT(2)   observe_only
  255.     1,  // nSYNCA_OUT         PTOUT(1)
  256.     1,  // RXCA_IN         PTOUT(1) out enable
  257.     1,  // nDCDA_IN        PTOUT(1)   observe_only
  258.     1,  // nCTSA_IN              PTOUT(0)
  259.     1,  // TXDA_OUT          PTOUT(0) out enable
  260.     1,  // nRTSA_OUT          PTOUT(0)   observe_only
  261.     1,  // RXDA_IN            PEXTCLK  observe_only
  262.     1,  // nDTRA_OUT          PIICSCL
  263. //230
  264.     1,  // nUADSR1_OUT         PIICSCL  observe_only
  265.     1,  // UATXD1_OUT          PIICSDA
  266.     1 ,  // nUADTR1_IN        PIICSDA  observe_only
  267.      1,  // RXCA_IN           PSIOTXD
  268.     1,  // nDCDA_IN           PSIOTXD  out enable
  269.     1,  // nCTSA_IN            PSIOTXD  observe_only
  270.     1,  // TXDA_OUT           PSIORDY
  271.     1,  // nRTSA_OUT           PSIORDY   out enable
  272.     1,  // RXDA_IN               PSIORDY  observe_only
  273.     1,  // nDTRA_OUT         PSIORXD
  274. //240
  275.     1,  // nUADSR1_OUT    PSIORXD         out enable
  276.     1,  // UATXD1_OUT        PSIORXD  observe_only
  277.     1 ,  // nUADTR1_IN   PSIOCLK
  278. 1,  // RXCA_IN        PSIOCLK   out enable
  279.     1,  // nDCDA_IN         PSIOCLK  observe_only
  280.     1,  // nCTSA_IN        PENDIAN
  281.     1,  // TXDA_OUT         PENDIAN  out enable
  282.     1,  // nRTSA_OUT         PENDIAN  observe_only
  283.     1,  // RXDA_IN           internal
  284.     1,  // nDTRA_OUT           internal
  285. //250
  286.     1,  // nUADSR1_OUT      internal
  287.     1,  // UATXD1_OUT         internal
  288.     1  , // nUADTR1_IN        PNRESET    observe_only
  289.     1,  // nDTRA_OUT           PCLKOUT
  290.     1,  // nUADSR1_OUT          PCLKOUT  out enable
  291.     1,  // UATXD1_OUT           PCLKOUT    observe_only
  292.  //   1   // nUADTR1_IN 
  293. };
  294. int lpt_address;
  295. void error_out(char *error_string)
  296. {
  297. printf("%sn",error_string);
  298. exit(0);
  299. }
  300. unsigned short test_port(void)     // 不需要改
  301. {
  302. // search for valid parallel port
  303.     lpt_address = 0;
  304.     OUTB(LPT1, 0x55);
  305.     if(INB(LPT1) == 0x55)  lpt_address = LPT1;
  306.     OUTB(LPT2, 0x55);
  307.     if(INB(LPT2) == 0x55)  lpt_address = LPT2;
  308.     OUTB(LPT3, 0x55);
  309.     if(INB(LPT3) == 0x55)  lpt_address = LPT3;
  310.     return(lpt_address);
  311. }
  312. int putp(int tdi, int tms, int rp)
  313. {
  314.     // Output pins (LPT driving)
  315.     // LPT D2      Pin 4  and TCK (bit 2 lptaddress )
  316.     // LPT D3      Pin 5  and TDI (bit 3 lptaddress )
  317.     // LPT D1      Pin 3  and TMS (bit 1 lptaddress )
  318.     // LPT D0      Pin 2 and TRST (bit 0 lptaddress )
  319.     //
  320.     // Input pin (S3C4510 board drives)
  321.     // LPT BUSY    Pin 11 and TDO (bit 7 lptaddress + 1)
  322. //std jtag pin connect
  323.  //    13      SELECTED      11      TDO  (bit 4 lptaddress + 1)
  324.  //   8         DATA6     5       TDI
  325.  //   3  DATA1  7  TMS
  326.  //   2  DATA0  9  TCK
  327.  //   4   DATA2       3  nTRT
  328. int tdo = -1;
  329. int t1,t2;
  330. t1 = tdi*64+tms*2+4;
  331. OUTB(lpt_address, t1);         //TCK low
  332. t1= tdi*64+tms*2+1+4;
  333. OUTB(lpt_address, t1);         // TCK high
  334. if(rp == RP)
  335.     {
  336.         OUTB(lpt_address, tdi*64+tms*2+4);        // TCK low
  337. t1 = INB(lpt_address + 1);
  338. t2 = (t1 & 0x10)>>4;
  339.         tdo = t2;  // get TDO data
  340.     }
  341. return tdo;
  342. }
  343. void reset_jtag(void)                //不用动 //对于std jtag,
  344.                                         //rst没有取反,先写0,后写1
  345. {
  346. int i;
  347.     OUTB(lpt_address, 0);            // TRST low
  348. Sleep(5);
  349.     OUTB(lpt_address, 0x4);               // TRST high
  350. Sleep(5);
  351. for( i=0; i<8; i++) putp(1,1,IP);   // move to TEST_LOGIC/RESET
  352. putp(1,0,IP);                       // move to Run_Test/Idle
  353. }
  354. void test_logic_reset(void)
  355. {
  356. putp(1,1,IP); // keep TMS set to 1 force a test logic reset
  357. putp(1,1,IP); // no matter where you are in the TAP controller
  358. putp(1,1,IP);
  359. putp(1,1,IP);
  360. putp(1,1,IP);
  361. putp(1,1,IP);
  362. }
  363. int check_id(char *device_id)
  364. {
  365. // compare passed device ID to the one returned from the ID command
  366. char in_id[40];
  367.     BOOL error_flag = FALSE;
  368.     int i;
  369.     for(i = 34; i >= 0; i--)
  370. {
  371. if(i == 4 || i == 21 || i == 33)
  372. {
  373. in_id[i] = ' ';
  374. i--;
  375. }
  376. if(putp(1,0,RP) == 0)
  377. in_id[i] = '0';
  378. else
  379. in_id[i] = '1';
  380. if((in_id[i] != *(device_id + i)) && (*(device_id + i) != '*'))
  381. {
  382. error_flag = TRUE;
  383. }
  384. }
  385. in_id[35] = 0;
  386. if(error_flag)
  387. {
  388. printf("error, failed to read device IDn");
  389. printf("check cables and powern");
  390. printf("ACT: %sn",in_id);
  391. printf("EXP: %snn",device_id);
  392. return -1;
  393. }
  394.     if(!strcmp(device_id,S3C4510ID)) // print S3C4510 device revision
  395. {
  396.         int s3c_rev =
  397. (int)(in_id[0] - '0') * 8 +
  398. (int)(in_id[1] - '0') * 4 +
  399. (int)(in_id[2] - '0') * 2 +
  400. (int)(in_id[3] - '0');
  401.         printf("S3C44b0x revision %dn",s3c_rev);
  402. }
  403. return 0;
  404. }
  405. void id_command(void)
  406. {
  407. putp(1,0,IP); //Run-Test/Idle
  408. putp(1,0,IP); //Run-Test/Idle
  409. putp(1,0,IP); //Run-Test/Idle
  410. putp(1,0,IP); //Run-Test/Idle
  411. putp(1,1,IP);
  412. putp(1,1,IP); //select IR scan
  413. putp(1,0,IP); //capture IR
  414. putp(1,0,IP); //shift IR
  415.     putp(0,0,IP);   //S3C4510 IDCODE, LSB first
  416.     putp(1,0,IP);   //
  417.     putp(1,0,IP);   //
  418.     putp(1,1,IP);   //Exit1-IR
  419. putp(1,1,IP); //Update-IR
  420. putp(1,0,IP); //Run-Test/Idle
  421. putp(1,0,IP); //Run-Test/Idle
  422. putp(1,0,IP); //Run-Test/Idle
  423.     putp(1,1,IP);   //select DR scan
  424.     putp(1,0,IP);   //capture DR
  425.     if(check_id(S3C4510ID))
  426.         error_out("failed to read device ID for the S3C4510");
  427. putp(1,1,IP); //Exit1-DR
  428. putp(1,1,IP); //Update-DR
  429. putp(1,0,IP); //Run-Test/Idle
  430. putp(1,0,IP); //Run-Test/Idle
  431. putp(1,0,IP); //Run-Test/Idle
  432. }
  433. void bypass_all(void)
  434. {
  435. putp(1,0,IP); //Run-Test/Idle
  436. putp(1,0,IP); //Run-Test/Idle
  437. putp(1,0,IP); //Run-Test/Idle
  438. putp(1,0,IP); //Run-Test/Idle
  439. putp(1,1,IP);
  440. putp(1,1,IP); //select IR scan
  441. putp(1,0,IP); //capture IR
  442. putp(1,0,IP); //shift IR
  443.     putp(1,0,IP);   //S3C4510 BYPASS
  444. putp(1,0,IP); //
  445. putp(1,0,IP); //
  446. putp(1,1,IP); //Exit1-IR
  447. putp(1,1,IP); //Update-IR
  448. putp(1,0,IP); //Run-Test/Idle
  449. putp(1,0,IP); //Run-Test/Idle
  450. putp(1,0,IP); //Run-Test/Idle
  451. }
  452. void extest(void)
  453. {
  454. putp(1,0,IP); //Run-Test/Idle
  455. putp(1,0,IP); //Run-Test/Idle
  456. putp(1,0,IP); //Run-Test/Idle
  457. putp(1,0,IP); //Run-Test/Idle
  458. putp(1,1,IP);
  459. putp(1,1,IP); //select IR scan
  460. putp(1,0,IP); //capture IR
  461. putp(1,0,IP); //shift IR
  462.     putp(0,0,IP);   //S3C4510 extest
  463. putp(0,0,IP); //
  464. putp(0,0,IP); //
  465.     putp(0,1,IP);   //Exit1-IR
  466. putp(1,1,IP); //Update-IR
  467. putp(1,0,IP); //Run-Test/Idle
  468. putp(1,0,IP); //Run-Test/Idle
  469. putp(1,0,IP); //Run-Test/Idle
  470. }
  471. void write_rom2(DWORD address, WORD data)
  472. {
  473.     access_bus2(WRITE, address, data, IP);
  474. access_bus2(SETUP, address, data, IP); // clear status register
  475. }
  476. WORD read_rom2(DWORD address)
  477. {
  478.     access_bus2(READ, address, 0, IP);  //相当于写地址
  479.     return (WORD)(access_bus2(READ, address, 0 , RP)); //相当于读书局
  480. }
  481. DWORD access_bus2(int rw, DWORD address, DWORD data, int rp)  // acess the cs1 rom bank1
  482. {
  483.     return s3c4510_bus2(nRCS_0_OUT, rw, address, data, rp);
  484. }
  485. DWORD s3c4510_bus2(int cs, int rw, DWORD address, DWORD data, int rp)
  486. {
  487.     int out_dat[300], i;
  488.     DWORD li, busdat = 0;
  489.     // Preset S3C4510 pins to default values (all others set in S3C4510.h)
  490.     pin[nRCS_0_OUT] = 1;
  491.     pin[nRCS_1_OUT] = 1;
  492.     pin[nRCS_2_OUT] = 1;
  493.     pin[nRCS_3_OUT] = 1;
  494. /*
  495.     pin[nRCS_4_OUT] = 1;
  496.     pin[nRCS_5_OUT] = 1;
  497.     pin[nECS_0_OUT] = 1;
  498.     pin[nECS_1_OUT] = 1;
  499.     pin[nECS_2_OUT] = 1;
  500.     pin[nECS_3_OUT] = 1;
  501. */
  502. pin[nWBE_DWE_OE_CS0_OUT_ENB] = 0;
  503.     pin[nOE_OUT]    = 0;
  504.     pin[nWBE_0_OUT] = 1;
  505.     pin[nWBE_1_OUT] = 1;
  506.     pin[nWBE_2_OUT] = 1;
  507.     pin[nWBE_3_OUT] = 1;
  508.     pin[nDWE_OUT] = 1; 
  509.     pin[nGCS_6_OUT] = 1;   //sdram
  510.     pin[D7_0_OUT_ENB] = 0;
  511.     pin[D15_8_OUT_ENB] = 0;
  512.  pin[A15_1_OUT_ENB] = 0;
  513.      pin[A0_OUT_ENB] = 0;
  514.      pin[A16_OUT_ENB] = 0;
  515.  pin[A17_OUT_ENB] = 0;
  516.  pin[A18_OUT_ENB] = 0;
  517.  pin[A19_OUT_ENB] = 0;
  518.  pin[A20_OUT_ENB] = 0;
  519.  pin[A21_OUT_ENB] = 1;
  520.  pin[A22_OUT_ENB] = 1;
  521.  pin[A23_OUT_ENB] = 1;
  522.  pin[A24_OUT_ENB] = 1;
  523.  
  524.     for(i = 1; i < 15; i++)    //set A1-A14
  525.         pin[67+i] = (int)((address >> i) & 1);     // a1 = cell 68
  526.     for(i = 15; i < 25; i++)    //set A15-A24
  527.         pin[82+(i-15)*2] = (int)((address >> i) & 1);  //a15 = 82
  528. if(rw == READ)
  529. {
  530.         pin[cs] = 0;
  531.     pin[D7_0_OUT_ENB] = 1;
  532.         pin[D15_8_OUT_ENB] = 1;
  533. // pin[D_OUT_ENB] = 1;
  534. pin[nOE_OUT]    = 0;
  535. }
  536. if(rw == WRITE)
  537. {
  538.         pin[cs]         = 0;
  539.         pin[nDWE_OUT]= 0;   //pin[nWBE_0_OUT] 
  540.         pin[nOE_OUT]    = 1;
  541.     pin[D7_0_OUT_ENB] = 0;
  542.         pin[D15_8_OUT_ENB] = 0;
  543.       //  pin[D_OUT_ENB]  = 0;  // switch data pins to drive
  544.         for(li = 0L; li < 8L; li++)    //设置D0-D7
  545.             pin[102+li*2] = (int)((data >> li) & 1L);  // serialize data pins
  546.         for(li = 0L; li < 8L; li++)     //设置D8-D15
  547.             pin[119+li*2] = (int)((data >> (li+8)) & 1L);  // serialize data pins
  548. }
  549. if( rw == HOLD) // just like a write except WE, WE needs setup time
  550. {
  551. pin[cs]         = 0;
  552.         pin[nOE_OUT]   = 1;
  553.     pin[D7_0_OUT_ENB] = 1;
  554.         pin[D15_8_OUT_ENB] = 1;
  555.        // pin[D_OUT_ENB] = 0;
  556.     pin[nDWE_OUT]= 1;
  557. //pin[nWBE_0_OUT] = 1;
  558.         //for(li = 0L; li < 32L; li++)
  559.         //    pin[125-li*2] = (int)((data >> li) & 1L);  // serialize data pins
  560. }
  561. if(rw == SETUP ) // just like a write except WE, WE needs setup time
  562. {
  563. pin[cs]         = 0;
  564.         pin[nOE_OUT]   = 1;
  565. pin[D7_0_OUT_ENB] = 0;
  566.         pin[D15_8_OUT_ENB] = 0;
  567.       //  pin[D_OUT_ENB] = 0;
  568. pin[nDWE_OUT]= 1;
  569. // pin[nWBE_0_OUT] = 1;
  570.         for(li = 0L; li < 8L; li++)    //设置D0-D7
  571.             pin[102+li*2] = (int)((data >> li) & 1L);  // serialize data pins
  572.         for(li = 0L; li < 8L; li++)     //设置D8-D15
  573.             pin[119+li*2] = (int)((data >> (li+8)) & 1L);  // serialize data pins
  574.         
  575. }
  576. if(rw == RS) // setup prior to RD_nWR_OUT
  577. {
  578. pin[nOE_OUT] = 1;
  579. pin[cs]      = 0;
  580. //pin[nWBE_0_OUT] = 0;
  581. pin[nDWE_OUT]= 0;
  582. }
  583.     putp(1,0,IP);   // Run-Test/Idle
  584.     putp(1,0,IP);   // Run-Test/Idle
  585.     putp(1,0,IP);   // Run-Test/Idle
  586.     putp(1,0,IP);   // Run-Test/Idle
  587.     putp(1,1,IP);   // select DR scan
  588.     putp(1,0,IP);   // capture DR
  589.     putp(1,0,IP);   // shift IR
  590.     for(i = 0; i < 256; i++)    // shift write data in to JTAG port and read data out
  591.         out_dat[i] = putp(pin[i],0,rp);
  592.     putp(0,1,IP);   // Exit1-DR
  593.     putp(1,1,IP);   // Update-DR
  594.     putp(1,0,IP);   // Run-Test/Idle
  595.     putp(1,0,IP);   // Run-Test/Idle
  596.     putp(1,0,IP);   // Run-Test/Idle
  597.     busdat = 0;
  598.     for(i = 0; i < 7; i++) // convert serial data to single DWORD
  599. {
  600.         busdat = busdat | (DWORD)(out_dat[102 + i*2] << i);  
  601. }
  602.     busdat = busdat | (DWORD)(out_dat[117] << 7);  
  603. for(i = 0; i < 7; i++) // convert serial data to single DWORD
  604. {
  605.         busdat = busdat | (DWORD)(out_dat[119 + i*2] << (i+8));  //????
  606. }
  607.     busdat = busdat | (DWORD)(out_dat[134] << 15); 
  608.    // printf("busdat %xn",busdat);
  609. return(busdat);
  610. }