⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sbpcd.c.txt

📁 Linux块设备驱动分析与模拟实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
1605       switch_drive(j);
1606       DPRINTF((DBG_ID,"SBPCD: check_drives: drive %d activated.\n",j));
1607       i=check_version();
1608       DPRINTF((DBG_ID,"SBPCD: check_version returns %d.\n",i));
1609       if (i>=0)
1610         {
1611           ndrives++;
1612           DS[d].drv_options=drv_pattern[j];
1613           if (!new_drive) DS[d].drv_options&=~(speed_auto|speed_300|speed_150);
1614           printk("%sDrive %d: %s%.4s (%.4s)\n", printk_header,
1615                  DS[d].drv_minor,
1616                  drive_family,
1617                  DS[d].drive_model,
1618                  DS[d].firmware_version);
1619           printk_header="       - ";
1620         }
1621       else DS[d].drv_minor=-1;
1622     }
1623   if (ndrives==0) return (-1);
1624   return (0);
1625 }
1626 /*==========================================================================*/
1627 #if 000
1628 static void timewait(void)
1629 {
1630   int i;
1631   for (i=0; i<65500; i++);
1632 }
1633 #endif 000
1634 /*==========================================================================*/
1635 #if FUTURE
1636 /*
1637  *  obtain if requested service disturbs current audio state
1638  */            
1639 static int obey_audio_state(u_char audio_state, u_char func,u_char subfunc)
1640 {
1641   switch (audio_state)                   /* audio status from controller  */
1642     {
1643     case aud_11: /* "audio play in progress" */
1644     case audx11:
1645       switch (func)                      /* DOS command code */
1646         {
1647         case cmd_07: /* input flush  */
1648         case cmd_0d: /* open device  */
1649         case cmd_0e: /* close device */
1650         case cmd_0c: /* ioctl output */
1651           return (1);
1652         case cmd_03: /* ioctl input  */
1653           switch (subfunc)
1654             /* DOS ioctl input subfunction */
1655             {
1656             case cxi_00:
1657             case cxi_06:
1658             case cxi_09:
1659               return (1);
1660             default:
1661               return (ERROR15);
1662             }
1663           return (1);
1664         default:
1665           return (ERROR15);
1666         }
1667       return (1);
1668     case aud_12:                  /* "audio play paused"      */
1669     case audx12:
1670       return (1);
1671     default:
1672       return (2);
1673     }
1674 }
1675 #endif FUTURE
1676 /*==========================================================================*/
1677 /* allowed is only
1678  * ioctl_o, flush_input, open_device, close_device, 
1679  * tell_address, tell_volume, tell_capabiliti,
1680  * tell_framesize, tell_CD_changed, tell_audio_posi
1681  */
1682 static int check_allowed1(u_char func1, u_char func2)
1683 {
1684 #if 000
1685   if (func1==ioctl_o) return (0);
1686   if (func1==read_long) return (-1);
1687   if (func1==read_long_prefetch) return (-1);
1688   if (func1==seek) return (-1);
1689   if (func1==audio_play) return (-1);
1690   if (func1==audio_pause) return (-1);
1691   if (func1==audio_resume) return (-1);
1692   if (func1!=ioctl_i) return (0);
1693   if (func2==tell_SubQ_run_tot) return (-1);
1694   if (func2==tell_cdsize) return (-1);
1695   if (func2==tell_TocDescrip) return (-1);
1696   if (func2==tell_TocEntry) return (-1);
1697   if (func2==tell_subQ_info) return (-1);
1698   if (new_drive) if (func2==tell_SubChanInfo) return (-1);
1699   if (func2==tell_UPC) return (-1);
1700 #else
1701   return (0);
1702 #endif 000
1703 }
1704 /*==========================================================================*/
1705 static int check_allowed2(u_char func1, u_char func2)
1706 {
1707 #if 000
1708   if (func1==read_long) return (-1);
1709   if (func1==read_long_prefetch) return (-1);
1710   if (func1==seek) return (-1);
1711   if (func1==audio_play) return (-1);
1712   if (func1!=ioctl_o) return (0);
1713   if (new_drive)
1714     {
1715       if (func2==EjectDisk) return (-1);
1716       if (func2==CloseTray) return (-1);
1717     }
1718 #else
1719   return (0);
1720 #endif 000
1721 }
1722 /*==========================================================================*/
1723 static int check_allowed3(u_char func1, u_char func2)
1724 {
1725 #if 000
1726   if (func1==ioctl_i)
1727     {
1728       if (func2==tell_address) return (0);
1729       if (func2==tell_capabiliti) return (0);
1730       if (func2==tell_CD_changed) return (0);
1731       if (!new_drive) if (func2==tell_SubChanInfo) return (0);
1732       return (-1);
1733     }
1734   if (func1==ioctl_o)
1735     {
1736       if (func2==DriveReset) return (0);
1737       if (!new_drive)
1738         {
1739           if (func2==EjectDisk) return (0);
1740           if (func2==LockDoor) return (0);
1741           if (func2==CloseTray) return (0);
1742         }
1743       return (-1);
1744     }
1745   if (func1==flush_input) return (-1);
1746   if (func1==read_long) return (-1);
1747   if (func1==read_long_prefetch) return (-1);
1748   if (func1==seek) return (-1);
1749   if (func1==audio_play) return (-1);
1750   if (func1==audio_pause) return (-1);
1751   if (func1==audio_resume) return (-1);
1752 #else
1753   return (0);
1754 #endif 000
1755 }
1756 /*==========================================================================*/
1757 static int seek_pos_audio_end(void)
1758 {
1759   int i;
1760 
1761   i=msf2blk(DS[d].pos_audio_end)-1;
1762   if (i<0) return (-1);
1763   i=xx_Seek(i,0);
1764   return (i);
1765 }
1766 /*==========================================================================*/
1767 static int ReadToC(void)
1768 {
1769   int i, j;
1770   DS[d].diskstate_flags &= ~toc_bit;
1771   DS[d].ored_ctl_adr=0;
1772   for (j=DS[d].n_first_track;j<=DS[d].n_last_track;j++)
1773     {
1774       i=xx_ReadTocEntry(j);
1775       if (i<0) return (i);
1776       DS[d].TocBuffer[j].nixbyte=DS[d].TocEnt_nixbyte;
1777       DS[d].TocBuffer[j].ctl_adr=DS[d].TocEnt_ctl_adr;
1778       DS[d].TocBuffer[j].number=DS[d].TocEnt_number;
1779       DS[d].TocBuffer[j].format=DS[d].TocEnt_format;
1780       DS[d].TocBuffer[j].address=DS[d].TocEnt_address;
1781       DS[d].ored_ctl_adr |= DS[d].TocEnt_ctl_adr;
1782     }
1783 /* fake entry for LeadOut Track */
1784   DS[d].TocBuffer[j].nixbyte=0;
1785   DS[d].TocBuffer[j].ctl_adr=0;
1786   DS[d].TocBuffer[j].number=0;
1787   DS[d].TocBuffer[j].format=0;
1788   DS[d].TocBuffer[j].address=DS[d].size_msf;
1789 
1790   DS[d].diskstate_flags |= toc_bit;
1791   return (0);
1792 }
1793 /*==========================================================================*/
1794 static int DiskInfo(void)
1795 {
1796   int i;
1797 
1798   i=SetSpeed();
1799   if (i<0)
1800     {
1801       DPRINTF((DBG_INF,"SBPCD: DiskInfo: first SetSpeed returns %d\n", i));
1802       i=SetSpeed();
1803       if (i<0)
1804         {
1805           DPRINTF((DBG_INF,"SBPCD: DiskInfo: second SetSpeed returns %d\n", i));
1806           return (i);
1807         }
1808     }
1809   i=xx_ModeSense();
1810   if (i<0)
1811     {
1812       DPRINTF((DBG_INF,"SBPCD: DiskInfo: first xx_ModeSense returns %d\n", i));
1813       i=xx_ModeSense();
1814       if (i<0)
1815         {
1816           DPRINTF((DBG_INF,"SBPCD: DiskInfo: second xx_ModeSense returns %d\n", i));
1817           return (i);
1818         }
1819       return (i);
1820     }
1821   i=xx_ReadCapacity();
1822   if (i<0)
1823     {
1824       DPRINTF((DBG_INF,"SBPCD: DiskInfo: first ReadCapacity returns %d\n", i));
1825       i=xx_ReadCapacity();
1826       if (i<0)
1827         {
1828           DPRINTF((DBG_INF,"SBPCD: DiskInfo: second ReadCapacity returns %d\n", i));
1829           return (i);
1830         }
1831       return (i);
1832     }
1833   i=xx_ReadTocDescr();
1834   if (i<0)
1835     {
1836       DPRINTF((DBG_INF,"SBPCD: DiskInfo: ReadTocDescr returns %d\n", i));
1837       return (i);
1838     }
1839   i=ReadToC();
1840   if (i<0)
1841     {
1842       DPRINTF((DBG_INF,"SBPCD: DiskInfo: ReadToC returns %d\n", i));
1843       return (i);
1844     }
1845   i=yy_CheckMultiSession();
1846   if (i<0)
1847     {
1848       DPRINTF((DBG_INF,"SBPCD: DiskInfo: yy_CheckMultiSession returns %d\n", i));
1849       return (i);
1850     }
1851   i=xx_ReadTocEntry(DS[d].n_first_track);
1852   if (i<0)
1853     {
1854       DPRINTF((DBG_INF,"SBPCD: DiskInfo: xx_ReadTocEntry(1) returns %d\n", i));
1855       return (i);
1856     }
1857   i=xx_ReadUPC();
1858   if (i<0)
1859     {
1860       DPRINTF((DBG_INF,"SBPCD: DiskInfo: xx_ReadUPC returns %d\n", i));
1861       return (i);
1862     }
1863   return (0);
1864 }
1865 /*==========================================================================*/
1866 /*
1867  *  called always if driver gets entered
1868  *  returns 0 or ERROR2 or ERROR15
1869  */
1870 static int prepare(u_char func, u_char subfunc)
1871 {
1872   int i;
1873 
1874   if (!new_drive)
1875     {
1876       i=inb(CDi_status);
1877       if (i&s_attention) GetStatus();
1878     }
1879   else GetStatus();
1880   if (DS[d].CD_changed==0xFF)
1881     {
1882 #if MANY_SESSION
1883 #else
1884       DS[d].diskstate_flags=0;
1885 #endif MANY_SESSION
1886       DS[d].audio_state=0;
1887       if (!st_diskok)
1888         {
1889           i=check_allowed1(func,subfunc);
1890           if (i<0) return (-2);
1891         }
1892       else 
1893         {
1894           i=check_allowed3(func,subfunc);
1895           if (i<0)
1896             {
1897               DS[d].CD_changed=1;
1898               return (-15);
1899             }
1900         }
1901     }
1902   else
1903     {
1904       if (!st_diskok)
1905         {
1906 #if MANY_SESSION
1907 #else
1908           DS[d].diskstate_flags=0;
1909 #endif MANY_SESSION
1910           DS[d].audio_state=0;
1911           i=check_allowed1(func,subfunc);
1912           if (i<0) return (-2);
1913         }
1914       else
1915         { 
1916           if (st_busy)
1917             {
1918               if (DS[d].audio_state!=audio_pausing)
1919                 {
1920                   i=check_allowed2(func,subfunc);
1921                   if (i<0) return (-2);
1922                 }
1923             }
1924           else
1925             {
1926               if (DS[d].audio_state==audio_playing) seek_pos_audio_end();
1927               DS[d].audio_state=0;
1928             }
1929           if (!frame_size_valid)
1930             {
1931               i=DiskInfo();
1932               if (i<0)
1933                 {
1934 #if MANY_SESSION
1935 #else
1936                   DS[d].diskstate_flags=0;
1937 #endif MANY_SESSION
1938                   DS[d].audio_state=0;
1939                   i=check_allowed1(func,subfunc);
1940                   if (i<0) return (-2);
1941                 }
1942             }
1943         }
1944     }
1945   return (0);
1946 }
1947 /*==========================================================================*/
1948 static int xx_PlayAudioMSF(int pos_audio_start,int pos_audio_end)
1949 {
1950   int i;
1951 
1952   if (DS[d].audio_state==audio_playing) return (-EINVAL);
1953   clr_cmdbuf();
1954   if (new_drive)
1955     {
1956       drvcmd[0]=0x0E;
1957       flags_cmd_out = f_putcmd | f_respo2 | f_ResponseStatus |
1958                        f_obey_p_check | f_wait_if_busy;
1959     }
1960   else
1961     {
1962       drvcmd[0]=0x0B;
1963       flags_cmd_out = f_putcmd | f_respo2 | f_lopsta | f_getsta |
1964                        f_ResponseStatus | f_obey_p_check | f_wait_if_busy;
1965     }
1966   drvcmd[1]=(pos_audio_start>>16)&0x00FF;
1967   drvcmd[2]=(pos_audio_start>>8)&0x00FF;
1968   drvcmd[3]=pos_audio_start&0x00FF;
1969   drvcmd[4]=(pos_audio_end>>16)&0x00FF;
1970   drvcmd[5]=(pos_audio_end>>8)&0x00FF;
1971   drvcmd[6]=pos_audio_end&0x00FF;
1972   response_count=0;
1973   i=cmd_out();
1974   return (i);
1975 }
1976 /*==========================================================================*/
1977 /*==========================================================================*/
1978 
1979 /*==========================================================================*/
1980 /*==========================================================================*/
1981 /*
1982  * ioctl support, adopted from scsi/sr_ioctl.c and mcd.c
1983  */
1984 static int sbpcd_ioctl(struct inode *inode,struct file *file,
1985                        u_int cmd, u_long arg)
1986 {
1987   int i, st;
1988 
1989   DPRINTF((DBG_IO2,"SBPCD: ioctl(%d, 0x%08lX, 0x%08lX)\n",
1990                                 MINOR(inode->i_rdev), cmd, arg));
1991   if (!inode) return (-EINVAL);
1992   i=MINOR(inode->i_rdev);
1993   if ( (i<0) || (i>=NR_SBPCD) )
1994     {
1995       printk("SBPCD: ioctl: bad device: %d\n", i);
1996       return (-ENODEV);             /* no such drive */
1997     }
1998   switch_drive(i);
1999 
2000   st=GetStatus();
2001   if (st<0) return (-EIO);
2002   
2003 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -