home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / usbd0906.zip / usb_20020906.zip / usbcalls / samples / fmradio / FM-RADIO.CPP < prev    next >
C/C++ Source or Header  |  2001-11-13  |  6KB  |  256 lines

  1. /* fm-radio.c: A user-level program to set the Gemtek (D-Link) FM tuner. */
  2. /*
  3.   Written 2000 by Donald Becker, Scyld Computing Corporation.
  4.   Released under the GPL.
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #define INCL_DOS
  11. #include <os2.h>
  12. #include "..\..\usbcalls.h"
  13.  
  14.  
  15. /* The following are the known command of the radio. */
  16. #if 0
  17. static struct usb_op_request
  18.     get_status = {0xC0, 0x00, 0x00, 0x24, 1},
  19.     set_freq   = {0xC0, 0x01, 0, 0, 1},
  20.     power      = {0xC0, 0x02, 0 /* or 1 to switch on */, 0, 1},
  21. #endif
  22.  
  23. /* The operational mode of the TEA5757 AM/FM radio chip is set by 24 bit
  24.    words, send as a serial bit stream.  The low 16 bits set the PLL
  25.    (phase locked loop) multiplier, in 12.5 KHz steps.  The "FM value" is
  26.    result of this frequency multiplication.  The tuned RF frequency is
  27.    10.7Mhz below this value.
  28.    (10.7 Mhz is a standard FM local oscillator frequency.)
  29.    For instance, to tune 99.1Mhz set the FM value to 109.8Mhz, or
  30.    109.8Mhz/12.5Khz = 8784.
  31.    The 16 bit tuning value is put into the low bytes of the C0 01 command.
  32.    There is no apparent way to set the radio mode bits, 23-16.
  33. */
  34.  
  35.  
  36. const int if_freq = 10700001; /* +1 for rounding.  */
  37. #define STERO_DELAY 240
  38.  
  39. struct top {
  40.     char *cmdopt;
  41.     char *msg;
  42. } cmp_ops[] = {
  43.     {"off", "Turning tuner off"},
  44.     {"mute", "Turning tuner off"},
  45.     {"on", "Turn tuner on"},
  46.     {"unmute", "Turn tuner on"},
  47.     {"status", "Get Status"},
  48.     {0,}};
  49.  
  50.  
  51. BOOL fFmOn(USBHANDLE Handle)
  52. {
  53.   APIRET rc;
  54.   UCHAR ucData[8];
  55.   printf("fFmOn\r\n",rc);
  56.   rc = UsbCtrlMessage( Handle,
  57.                        0xC0, 0x00,
  58.                        0x17, 0x08,
  59.                        1,(UCHAR*)&ucData,
  60.                        0);
  61.   rc = UsbCtrlMessage( Handle,
  62.                        0xC0, 0x02,
  63.                        0x01, 0x00,
  64.                        1,(UCHAR*)&ucData,
  65.                        0);
  66.   if(rc)
  67.     printf("Error rc=%d\r\n",rc);
  68. #ifdef DEBUG
  69.   else
  70.     printf("Radio status %02X\r\n",ucData[0]);
  71. #endif
  72.   return (rc==0);
  73. }
  74.  
  75. BOOL fFmOff(USBHANDLE Handle)
  76. {
  77.   APIRET rc;
  78.   UCHAR ucData[8];
  79.   printf("fFmOff\r\n",rc);
  80.   rc = UsbCtrlMessage( Handle,
  81.                        0xC0, 0x00,
  82.                        0x94, 0xfc,
  83.                        1,(UCHAR*)&ucData,
  84.                        0);
  85.   rc = UsbCtrlMessage( Handle,
  86.                        0xC0, 0x02,
  87.                        0x00, 0x00,
  88.                        1,(UCHAR*)&ucData,
  89.                        0);
  90.   if(rc)
  91.     printf("Error rc=%d\r\n",rc);
  92. #ifdef DEBUG
  93.   else
  94.     printf("Radio status %02X\r\n",ucData[0]);
  95. #endif
  96.   return (rc==0);
  97. }
  98.  
  99. BOOL fTunerSetMute(USBHANDLE Handle, BOOL fMute)
  100. {
  101.   APIRET rc;
  102.   UCHAR ucData[8];
  103.   rc = UsbCtrlMessage( Handle,
  104.                           0xC0, 0x02,
  105.                           fMute?0:1, 0,
  106.                           1,(UCHAR*)&ucData,
  107.                           0);
  108.   if(rc)
  109.     printf("Error rc=%d\r\n",rc);
  110. #ifdef DEBUG
  111.   else
  112.     printf("Radio status %02X\r\n",ucData[0]);
  113. #endif
  114.   return (rc==0);
  115. }
  116.  
  117. BOOL fSetFreq(USBHANDLE Handle, double Freq)
  118. {
  119.   APIRET rc;
  120.   UCHAR ucData[8];
  121.   int pll_div;
  122.   pll_div = ((Freq+10.7)*80);
  123.   printf("Setting tuner to %3.2f Mhz (%d=0x%04X).\n", Freq, pll_div,pll_div);
  124.   rc = UsbCtrlMessage( Handle,
  125.                        0xC0, 0x01,
  126.                        pll_div>>8,pll_div,
  127.                        1,(UCHAR*)&ucData,
  128.                        0);
  129.   if(rc)
  130.     printf("Error rc=%d\r\n",rc);
  131. #ifdef DEBUG
  132.   else
  133.     printf("Radio status %02X\r\n",ucData[0]);
  134. #endif
  135.   return (rc==0);
  136. }
  137.  
  138. BOOL fGetStatus(USBHANDLE Handle, BOOL *fStereo)
  139. {
  140.   APIRET rc;
  141.   UCHAR ucData[8];
  142.   printf("GetStatus\r\n",rc);
  143.   rc = UsbCtrlMessage( Handle,
  144.                        0xC0, 0x00,
  145.                        0, 0x00,//0x24,
  146.                        1,(UCHAR*)&ucData,
  147.                        0);
  148.   *fStereo = (ucData[0]&0x01)==0x00;
  149.   if(rc)
  150.     printf("Error rc=%d\r\n",rc);
  151. #ifdef DEBUG
  152.   else
  153.     printf("Radio status %02X\r\n",ucData[0]);
  154. #endif
  155.   return (rc==0);
  156. }
  157.  
  158. int main(int argc, char *argv[])
  159. {
  160.   USBHANDLE hRadio;
  161.   BOOL fOk;
  162.   APIRET rc;
  163.   BOOL IsStereo;
  164.   int saved_freq;
  165.   USHORT usVendor  = 0x04b4;
  166.   USHORT usProduct = 0x1002;
  167.  
  168.   rc = UsbOpen( &hRadio,
  169.                 usVendor,
  170.                 usProduct,
  171.                 0xFFFF,
  172.                 USB_OPEN_FIRST_UNUSED);
  173.   if(rc)
  174.   {
  175.     fprintf(stderr, "Cannot open Radio");
  176.     return (-3);
  177.   }
  178.  
  179.   UsbSetDeviceConfiguration(hRadio,1);
  180.  
  181.   if (argc >= 2  && argv[1])
  182.   {
  183.     double freq_mhz = 99.9;
  184.     int i;
  185.     for (i = 0; cmp_ops[i].cmdopt; i++)
  186.     {
  187.       if (strcmp(argv[1], cmp_ops[i].cmdopt) == 0)
  188.       {
  189.         switch(i)
  190.         {
  191.           case 0:
  192.           case 1:
  193.             fFmOff(hRadio);
  194.             break;
  195.           case 2:
  196.           case 3:
  197.             fFmOn(hRadio);
  198.             break;
  199.           case 4:
  200.             fGetStatus(hRadio,&IsStereo);
  201.             printf( " Stereo indicator is %s.\n",IsStereo ? "on" : "off");
  202.             return IsStereo?0:-1;
  203.           default:
  204.             printf("Unsupported parameter\r\n");
  205.             break;
  206.         }
  207.  
  208.         UsbClose(hRadio);
  209.         return 0;
  210.       }
  211.     }
  212.  
  213.     if ( ((freq_mhz = atof(argv[1])) == 0) ||
  214.          (freq_mhz<88) || (freq_mhz>109.8) )
  215.     {
  216.       fprintf(stderr, "The frequency must be a number 88.0 - 109.8.\n");
  217.       UsbClose(hRadio);
  218.       return -2;
  219.     }
  220.     fOk = fSetFreq(hRadio, freq_mhz);
  221.     DosSleep(STERO_DELAY);
  222.     fGetStatus(hRadio, &IsStereo);
  223.     printf( " Stereo indicator is %s.\n",IsStereo ? "on" : "off");
  224.     UsbClose(hRadio);
  225.     return IsStereo?0:-1;
  226.   }
  227.  
  228.   // Do a frequency scan.
  229.   int pll_div = 8800;
  230.   printf( "Starting scan frequency is %3.2f MHz.\n", (pll_div/100.0) );
  231.   for (; pll_div < 10980; pll_div += 5)
  232.   {
  233.     fSetFreq(hRadio, (pll_div/100.0));
  234.     DosSleep(STERO_DELAY);
  235.     fGetStatus(hRadio,&IsStereo);
  236.     if (IsStereo)
  237.     {
  238.       printf(" Stereo is on!\n");
  239.       saved_freq = pll_div;
  240.     }
  241.   }
  242.  
  243.   if (saved_freq)
  244.   {
  245.     fSetFreq(hRadio, (saved_freq/100.0));
  246.     printf( "\rSetting tuner to last station, %3.2f.\n",(saved_freq/100.0));
  247.     return 0;
  248.   } else
  249.       printf("\r Finished scan with no found stations.\n");
  250.  
  251.   UsbClose(hRadio);
  252.   return -1;
  253.  
  254. }
  255.  
  256.