📄 sbpcd.c.txt
字号:
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 + -