Advertisement
Cremulus

External STM32F ParaSys Disk Support

Aug 25th, 2023
1,152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.60 KB | None | 0 0
  1. static void vPS_WriteSlaveStrobe(bool bSet)
  2.   {
  3.   if (bSet)
  4.     SET_PORT(GPIOE,B8);
  5.   else
  6.     CLR_PORT(GPIOE,B8);
  7.   }
  8.  
  9. static bool inline bPS_ReadMasterStrobe(void)
  10.   {
  11.   if (GPIOE->IDR & B7)
  12.     return true;
  13.   else
  14.     return false;
  15.   }
  16.  
  17. static bool inline bPS_ReadCMDorDATA(void)
  18.   {
  19.   if (GPIOE->IDR & B10)
  20.     return true;
  21.   else
  22.     return false;
  23.   }
  24.  
  25. static bool inline bPS_ReadEXTRA(void)
  26.   {
  27.   if (GPIOE->IDR & B9)
  28.     return true;
  29.   else
  30.     return false;
  31.   }
  32.  
  33. static void vPS_WriteData(u8 u8Val)
  34.   {
  35.   // D0
  36.   if (u8Val & 0x01)
  37.     SET_PORT(GPIOE,B11);
  38.   else
  39.     CLR_PORT(GPIOE,B11);
  40.   // D1
  41.   if (u8Val & 0x02)
  42.     SET_PORT(GPIOE,B12);
  43.   else
  44.     CLR_PORT(GPIOE,B12);
  45.   // D2
  46.   if (u8Val & 0x04)
  47.     SET_PORT(GPIOE,B13);
  48.   else
  49.     CLR_PORT(GPIOE,B13);
  50.   // D3
  51.   if (u8Val & 0x08)
  52.     SET_PORT(GPIOE,B14);
  53.   else
  54.     CLR_PORT(GPIOE,B14);
  55.   // D4
  56.   if (u8Val & 0x10)
  57.     SET_PORT(GPIOE,B15);
  58.   else
  59.     CLR_PORT(GPIOE,B15);
  60.   // D5
  61.   if (u8Val & 0x20)
  62.     SET_PORT(GPIOD,B8);
  63.   else
  64.     CLR_PORT(GPIOD,B8);
  65.   // D6
  66.   if (u8Val & 0x40)
  67.     SET_PORT(GPIOD,B9);
  68.   else
  69.     CLR_PORT(GPIOD,B9);
  70.   // D7
  71.   if (u8Val & 0x80)
  72.     SET_PORT(GPIOD,B10);
  73.   else
  74.     CLR_PORT(GPIOD,B10);
  75.   }
  76.  
  77. static u8 u8PS_ReadData(void)
  78.   {
  79.   u8 u8Res;
  80.  
  81.   u8Res = 0x00;
  82.   // D0
  83.   if (GPIOE->IDR & B11)
  84.     u8Res |= 0x01;
  85.   // D1
  86.   if (GPIOE->IDR & B12)
  87.     u8Res |= 0x02;
  88.   // D2
  89.   if (GPIOE->IDR & B13)
  90.     u8Res |= 0x04;
  91.   // D3
  92.   if (GPIOE->IDR & B14)
  93.     u8Res |= 0x08;
  94.   // D4
  95.   if (GPIOE->IDR & B15)
  96.     u8Res |= 0x10;
  97.   // D5
  98.   if (GPIOD->IDR & B8)
  99.     u8Res |= 0x20;
  100.   // D6
  101.   if (GPIOD->IDR & B9)
  102.     u8Res |= 0x40;
  103.   // D7
  104.   if (GPIOD->IDR & B10)
  105.     u8Res |= 0x80;
  106.  
  107.   return u8Res;
  108.   }
  109.  
  110. static bool bPS_ReadByte(u8 *pu8Val,bool *pbCorD, bool *pbExtra)
  111.   {
  112.   // Make sure the port is an input
  113.   vPS_SetDataPortToInput();
  114.   __DMB();
  115.  
  116.   while(bPS_ReadMasterStrobe() == true)
  117.     {
  118.     }
  119.  
  120.   *pbCorD = bPS_ReadCMDorDATA();
  121.   *pbExtra = bPS_ReadEXTRA();
  122.   *pu8Val = u8PS_ReadData();
  123.  
  124.   __DMB();
  125.   vPS_WriteSlaveStrobe(false);
  126.  
  127.   while(bPS_ReadMasterStrobe() == false)
  128.     {
  129.     }
  130.   vPS_WriteSlaveStrobe(true);
  131.   __DMB();
  132.   // We're okay
  133.   return true;
  134.   }
  135.  
  136. // Use both edges of the strobes to send two bytes
  137. static bool bPS_ReadMultipleWord(int iCnt,u8 *pu8Data)
  138.   {
  139.   // Make sure the port is an input
  140.   vPS_SetDataPortToInput();
  141.   __DMB();
  142.  
  143.   while (iCnt--)
  144.     {
  145.     while(bPS_ReadMasterStrobe() == true)
  146.       {
  147.       }
  148.  
  149.     *pu8Data++ = u8PS_ReadData(); // Read it
  150.  
  151.     __DMB();
  152.     vPS_WriteSlaveStrobe(false);
  153.  
  154.     while(bPS_ReadMasterStrobe() == false)
  155.       {
  156.       }
  157.     *pu8Data++ = u8PS_ReadData(); // Read it
  158.  
  159.  
  160.     __DMB();
  161.     vPS_WriteSlaveStrobe(true);
  162.     }
  163.  
  164.   // We're okay
  165.   return true;
  166.   }
  167.  
  168.  
  169. static bool bPS_WriteByte(u8 u8Val)
  170.   {
  171.   while(bPS_ReadMasterStrobe() == true)
  172.     {
  173.     }
  174.  
  175.   vPS_WriteData(u8Val);
  176.   vPS_SetDataPortToOutput();
  177.   __DMB();
  178.   vPS_WriteSlaveStrobe(false);
  179.   __DMB();
  180.   while(bPS_ReadMasterStrobe() == false)
  181.     {
  182.     }
  183.   vPS_SetDataPortToInput();
  184.   vPS_WriteSlaveStrobe(true);
  185.   __DMB();
  186.   // We're okay
  187.   return true;
  188.   }
  189.  
  190. // Use both edges of the strobes to send two bytes
  191. static bool bPS_WriteMultipleWord(int iCnt,u8 *pu8Data)
  192.   {
  193.   // Wait until the master is reading
  194.   while(bPS_ReadMasterStrobe() == true)
  195.     {
  196.     }
  197.  
  198.   vPS_SetDataPortToOutput(); // Drive the port lines
  199.  
  200.   while (iCnt--)
  201.     {
  202.     // Wait until the master is reading
  203.     while(bPS_ReadMasterStrobe() == true)
  204.       {
  205.       }
  206.  
  207.     vPS_WriteData(*pu8Data++);
  208.     __DMB();
  209.  
  210.     vPS_WriteSlaveStrobe(false);
  211.     __DMB();
  212.  
  213.     // Wait for the master to indicate it has read the port
  214.     while(bPS_ReadMasterStrobe() == false)
  215.       {
  216.       }
  217.  
  218.     vPS_WriteData(*pu8Data++);
  219.     __DMB();
  220.  
  221.     vPS_WriteSlaveStrobe(true);
  222.     __DMB();
  223.     }
  224.  
  225.   // We're okay
  226.   return true;
  227.   }
  228.  
  229.  
  230. ////////////// The code in main
  231.  
  232.     // Handle ParaSys
  233.     while (true)
  234.       {
  235.       if (bPS_ReadByte(&u8CMD,&bCorD,&bExtra))
  236.         {
  237.     // We're only going to respond to bytes sent with bExtra high
  238.     if (bExtra)
  239.       {
  240.       switch(u8CMD)
  241.         {
  242.         case 0x10: // Read a block
  243.           bCmdOK = bPS_ReadByte(&u8DEVICE,&bCorD,&bExtra);
  244.           if (bExtra == false)
  245.             {
  246.             bCmdOK &= bPS_ReadByte(&u8BLOCK,&bCorD,&bExtra);
  247.             if (bExtra == false)
  248.               {
  249.               bCmdOK &= bPS_ReadByte(&u8PART,&bCorD,&bExtra);
  250.               if (bExtra == false)
  251.                 {
  252. //                vWriteTxCRLF_UART1();
  253. //                vWriteTxHex8_UART1(u8DEVICE);
  254. //                vWriteTxHex8_UART1(u8BLOCK);
  255. //                vWriteTxHex8_UART1(u8PART);
  256. //                vWriteTxSPACE_UART1();
  257.                 // Is this a request for block we have in the buffer?
  258.                 if ((u8PART == 0) || (u8DEVICE != u8BR_DEVICE) || (u8BLOCK != u8BR_BLOCK))
  259.                   {
  260.                   // No, read it
  261.                   u8BR_DEVICE = u8DEVICE;
  262.                   u8BR_BLOCK = u8BLOCK;
  263.                   // Read the SD card
  264.                   if (!bReadBasilBlock(u8BR_DEVICE,u8BR_BLOCK,u8BR_BUFFER))
  265.                     {
  266.                     for(i=0;i<0x1000;i++)
  267.                       u8BR_BUFFER[i]=0xE5;
  268.                     }
  269.                   }
  270.                 // We need to write this block
  271.                 bPS_WriteMultipleWord(32,&u8BR_BUFFER[u8PART*64]);
  272.                 // Done?
  273.                 if (u8PART == 0x3F)
  274.                   {
  275.                   vWriteTxStr_UART1("\r\nRead Block ");
  276.                   vWriteTxHex8_UART1(u8DEVICE);
  277.                   vWriteTxHex8_UART1(u8BLOCK);
  278.                    }
  279.                 }
  280.               }
  281.             }
  282.           break;
  283.             case 0x11: // Write a block
  284.               bCmdOK = bPS_ReadByte(&u8DEVICE,&bCorD,&bExtra);
  285.               if (bExtra == false)
  286.                 {
  287.                 bCmdOK &= bPS_ReadByte(&u8BLOCK,&bCorD,&bExtra);
  288.                 if (bExtra == false)
  289.                   {
  290.                   bCmdOK &= bPS_ReadByte(&u8PART,&bCorD,&bExtra);
  291.                   if (bExtra == false)
  292.                     {
  293. //                    vWriteTxCRLF_UART1();
  294. //                    vWriteTxHex8_UART1(u8DEVICE);
  295. //                    vWriteTxHex8_UART1(u8BLOCK);
  296. //                    vWriteTxHex8_UART1(u8PART);
  297. //                    vWriteTxSPACE_UART1();
  298.                 // Start a new buffer
  299.                 if ((u8PART == 0) || (u8DEVICE != u8BW_DEVICE) || (u8BLOCK != u8BW_BLOCK))
  300.                   {
  301.                   u8BW_DEVICE = u8DEVICE;
  302.                   u8BW_BLOCK = u8BLOCK;
  303.                   u8BW_PART = 0;
  304.                   }
  305.                 // Is this what we're expecting?
  306.                 if ((u8PART == u8BW_PART) && (u8DEVICE == u8BW_DEVICE) && (u8BLOCK == u8BW_BLOCK))
  307.                   {
  308.                   // We need to read this block
  309.                   bPS_ReadMultipleWord(32,&u8BW_BUFFER[u8BW_PART*64]);
  310.                   // And move to the next part
  311.                   u8BW_PART++;
  312.                   // Is our buffer full?
  313.                   if (u8BW_PART == 0x40)
  314.                     {
  315.                     vWriteTxStr_UART1("\r\nWrite Block ");
  316.                     vWriteTxHex8_UART1(u8DEVICE);
  317.                     vWriteTxHex8_UART1(u8BLOCK);
  318.  
  319.                     if (!bWriteBasilBlock(u8BW_DEVICE,u8BW_BLOCK,u8BW_BUFFER))
  320.                       {
  321.                       vWriteTxStr_UART1(" - FAILED!!!\r\n");
  322.                       }
  323.                     }
  324.                   }
  325.                 else
  326.                   {
  327.                   // Now we need to read and ignore the 64-bytes
  328.                   for(i=0;i<64;i++)
  329.                     {
  330.                     bCmdOK &= bPS_ReadByte(&u8VALUE,&bCorD,&bExtra);
  331.                     }
  332.                   }
  333.                 }
  334.               }
  335.             }
  336.           break;
  337.             case 0x12: // Set a filename
  338.               bCmdOK = bPS_ReadByte(&u8DEVICE,&bCorD,&bExtra);
  339.               if (u8DEVICE < 4)
  340.                {
  341.                 u8 *pu8FileName = sDiskFilenames[u8DEVICE];
  342.                 if (bExtra == false)
  343.                   {
  344.                   // Read the filename until a zero
  345.                   do {
  346.                     bCmdOK &= bPS_ReadByte(&u8VALUE,&bCorD,&bExtra);
  347.                     *pu8FileName++ = u8VALUE;
  348.                     } while(u8VALUE != 0);
  349.                   }
  350.                 vWriteTxStr_UART1("\r\nSet Filename ");
  351.                 vWriteTxHex8_UART1(u8DEVICE);
  352.                 vWriteTxStr_UART1(" [");
  353.                 vWriteTxStr_UART1(sDiskFilenames[u8DEVICE]);
  354.                 vWriteTxStr_UART1("]");
  355.                 }
  356.               break;
  357.            }
  358.           }
  359.         }
  360.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement