📄 device.c.htm
字号:
<a class="l" name="175"> 175 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=cap">cap</a>);<a class="l" name="176"> 176 </a> }<a class="l" name="177"> 177 </a><a class="l" name="178"> 178 </a> <span class="c">/* Detect if it's a Lite-ON drive with a streaming CD problem */</span><a class="l" name="179"> 179 </a> <b>if</b> ((<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"LITE-ON"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">8</span>], <span class="n">7</span>) == <span class="n">0</span>) &&<a class="hl" name="180"> 180 </a> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"LTR-48"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">6</span>) == <span class="n">0</span>)) {<a class="l" name="181"> 181 </a> <a href="/source/s?defs=use_cd_speed">use_cd_speed</a> = <span class="n">1</span>;<a class="l" name="182"> 182 </a> }<a class="l" name="183"> 183 </a><a class="l" name="184"> 184 </a> <span class="c">/*<a class="l" name="185"> 185 </a> * a workaround for the firmware problem in LITE-ON COMBO drives.<a class="l" name="186"> 186 </a> * streaming for these drives sets it only to max speed regardless<a class="l" name="187"> 187 </a> * of requested speed. cd_speed_ctrl allow speeds less than max<a class="l" name="188"> 188 </a> * to be set but not max thus the code below. (x48 is max speed<a class="l" name="189"> 189 </a> * for these drives).<a class="hl" name="190"> 190 </a> */</span><a class="l" name="191"> 191 </a> <b>if</b> ((<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"LITE-ON"</span>, (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">8</span>], <span class="n">7</span>) == <span class="n">0</span>) &&<a class="l" name="192"> 192 </a> (<a href="/source/s?defs=strncmp">strncmp</a>(<span class="s">"COMBO SOHC-4836VS"</span>,<a class="l" name="193"> 193 </a> (<b>const</b> <b>char</b> *)&<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>[<span class="n">16</span>], <span class="n">17</span>) == <span class="n">0</span>))<a class="l" name="194"> 194 </a> <b>if</b> (<a href="/source/s?defs=requested_speed">requested_speed</a> < <span class="n">48</span>)<a class="l" name="195"> 195 </a> <a href="/source/s?defs=use_cd_speed">use_cd_speed</a> = <span class="n">1</span>;<a class="l" name="196"> 196 </a><a class="l" name="197"> 197 </a> <a href="/source/s?defs=cap">cap</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<span class="n">8</span>);<a class="l" name="198"> 198 </a> <b>if</b> (<a href="/source/s?defs=is_old_sun_drive">is_old_sun_drive</a>(<a href="/source/s?defs=dev">dev</a>)) {<a class="l" name="199"> 199 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_read_audio">d_read_audio</a> = <a href="/source/s?defs=toshiba_read_audio">toshiba_read_audio</a>;<a class="hl" name="200"> 200 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_speed_ctrl">d_speed_ctrl</a> = <a href="/source/s?defs=toshiba_speed_ctrl">toshiba_speed_ctrl</a>;<a class="l" name="201"> 201 </a> } <b>else</b> {<a class="l" name="202"> 202 </a> <span class="c">/*<a class="l" name="203"> 203 </a> * If the CD Read Feature is supported, READ CD will work<a class="l" name="204"> 204 </a> * and will return jitter free audio data. Otherwise, look<a class="l" name="205"> 205 </a> * at Page Code 2A for this information.<a class="l" name="206"> 206 </a> */</span><a class="l" name="207"> 207 </a> <b>if</b> (<a href="/source/s?defs=ftr_supported">ftr_supported</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=MMC_FTR_CD_READ">MMC_FTR_CD_READ</a>) == <span class="n">1</span>) {<a class="l" name="208"> 208 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_read_audio">d_read_audio</a> = <a href="/source/s?defs=read_audio_through_read_cd">read_audio_through_read_cd</a>;<a class="l" name="209"> 209 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_cap">d_cap</a> |= <a href="/source/s?defs=DEV_CAP_ACCURATE_CDDA">DEV_CAP_ACCURATE_CDDA</a>;<a class="hl" name="210"> 210 </a> } <b>else</b> <b>if</b> (<a href="/source/s?defs=get_mode_page">get_mode_page</a>(<a href="/source/s?defs=fd">fd</a>, <span class="n">0x2A</span>, <span class="n">0</span>, <span class="n">8</span>, <a href="/source/s?defs=cap">cap</a>)) {<a class="l" name="211"> 211 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">5</span>] & <span class="n">1</span>) {<a class="l" name="212"> 212 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_read_audio">d_read_audio</a> = <a href="/source/s?defs=read_audio_through_read_cd">read_audio_through_read_cd</a>;<a class="l" name="213"> 213 </a> <b>if</b> (<a href="/source/s?defs=cap">cap</a>[<span class="n">5</span>] & <span class="n">2</span>)<a class="l" name="214"> 214 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_cap">d_cap</a> |= <a href="/source/s?defs=DEV_CAP_ACCURATE_CDDA">DEV_CAP_ACCURATE_CDDA</a>;<a class="l" name="215"> 215 </a> }<a class="l" name="216"> 216 </a> }<a class="l" name="217"> 217 </a> <span class="c">/*<a class="l" name="218"> 218 </a> * If the Real Time Streaming Feature is supported then<a class="l" name="219"> 219 </a> * Real-time streaming commands can be used for speed control<a class="hl" name="220"> 220 </a> * (except when we want to use cd_speed_ctrl explicitly which<a class="l" name="221"> 221 </a> * is specified by setting use_cd_speed to 1).<a class="l" name="222"> 222 </a> * Otherwise try SET CD SPEED.<a class="l" name="223"> 223 </a> */</span><a class="l" name="224"> 224 </a> <b>if</b> ((<a href="/source/s?defs=ftr_supported">ftr_supported</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=MMC_FTR_RT_STREAM">MMC_FTR_RT_STREAM</a>) == <span class="n">1</span>) &&<a class="l" name="225"> 225 </a> !<a href="/source/s?defs=use_cd_speed">use_cd_speed</a>) {<a class="l" name="226"> 226 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_speed_ctrl">d_speed_ctrl</a> = <a href="/source/s?defs=rt_streaming_ctrl">rt_streaming_ctrl</a>;<a class="l" name="227"> 227 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="228"> 228 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"using rt speed ctrl\n"</span>);<a class="l" name="229"> 229 </a> } <b>else</b> {<a class="hl" name="230"> 230 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_speed_ctrl">d_speed_ctrl</a> = <a href="/source/s?defs=cd_speed_ctrl">cd_speed_ctrl</a>;<a class="l" name="231"> 231 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="232"> 232 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"using cd speed ctrl\n"</span>);<a class="l" name="233"> 233 </a> }<a class="l" name="234"> 234 </a> }<a class="l" name="235"> 235 </a> <b>if</b> (<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_read_audio">d_read_audio</a> != <a href="/source/s?defs=NULL">NULL</a>)<a class="l" name="236"> 236 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_cap">d_cap</a> |= <a href="/source/s?defs=DEV_CAP_EXTRACT_CDDA">DEV_CAP_EXTRACT_CDDA</a>;<a class="l" name="237"> 237 </a><a class="l" name="238"> 238 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> = <span class="n">0</span>;<a class="l" name="239"> 239 </a><a class="hl" name="240"> 240 </a> <span class="c">/*<a class="l" name="241"> 241 </a> * Find the block size of the device so we can translate<a class="l" name="242"> 242 </a> * the <a href="/source/s?path=reads/">reads</a>/<a href="/source/s?path=reads/writes">writes</a> to the device blocksize.<a class="l" name="243"> 243 </a> */</span><a class="l" name="244"> 244 </a><a class="l" name="245"> 245 </a> <b>if</b> (<a href="/source/s?defs=ioctl">ioctl</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=DKIOCGMEDIAINFO">DKIOCGMEDIAINFO</a>, &<a href="/source/s?defs=mediainfo">mediainfo</a>) < <span class="n">0</span>) {<a class="l" name="246"> 246 </a> <span class="c">/*<a class="l" name="247"> 247 </a> * If DKIOCGMEDIAINFO fails we'll try to get<a class="l" name="248"> 248 </a> * the blocksize from the device itself.<a class="l" name="249"> 249 </a> */</span><a class="hl" name="250"> 250 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="251"> 251 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"DKIOCGMEDIAINFO failed\n"</span>);<a class="l" name="252"> 252 </a> <b>if</b> (<a href="/source/s?defs=read_capacity">read_capacity</a>(<a href="/source/s?defs=fd">fd</a>, <a href="/source/s?defs=cap">cap</a>))<a class="l" name="253"> 253 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(<a href="/source/s?defs=cap">cap</a> + <span class="n">4</span>);<a class="l" name="254"> 254 </a> } <b>else</b> {<a class="l" name="255"> 255 </a><a class="l" name="256"> 256 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> = <a href="/source/s?defs=mediainfo">mediainfo</a>.<a href="/source/s?defs=dki_lbsize">dki_lbsize</a>;<a class="l" name="257"> 257 </a> }<a class="l" name="258"> 258 </a><a class="l" name="259"> 259 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>) {<a class="hl" name="260"> 260 </a> <a href="/source/s?defs=uint_t">uint_t</a> <a href="/source/s?defs=bsize">bsize</a>;<a class="l" name="261"> 261 </a><a class="l" name="262"> 262 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"blocksize = %d\n"</span>, <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a>);<a class="l" name="263"> 263 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"read_format_capacity = %d \n"</span>,<a class="l" name="264"> 264 </a> <a href="/source/s?defs=read_format_capacity">read_format_capacity</a>(<a href="/source/s?defs=fd">fd</a>, &<a href="/source/s?defs=bsize">bsize</a>));<a class="l" name="265"> 265 </a> }<a class="l" name="266"> 266 </a><a class="l" name="267"> 267 </a> <span class="c">/*<a class="l" name="268"> 268 </a> * Some devices will return invalid blocksizes. ie. Toshiba<a class="l" name="269"> 269 </a> * drives will return 2352 when an audio CD is inserted.<a class="hl" name="270"> 270 </a> * Older Sun drives will use 512 byte block sizes. All newer<a class="l" name="271"> 271 </a> * drives should have 2k blocksizes.<a class="l" name="272"> 272 </a> */</span><a class="l" name="273"> 273 </a> <b>if</b> (((<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> != <span class="n">512</span>) && (<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> != <span class="n">2048</span>))) {<a class="l" name="274"> 274 </a> <b>if</b> (<a href="/source/s?defs=is_old_sun_drive">is_old_sun_drive</a>(<a href="/source/s?defs=dev">dev</a>)) {<a class="l" name="275"> 275 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> = <span class="n">512</span>;<a class="l" name="276"> 276 </a> } <b>else</b> {<a class="l" name="277"> 277 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a> = <span class="n">2048</span>;<a class="l" name="278"> 278 </a> }<a class="l" name="279"> 279 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="hl" name="280"> 280 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">" switching to %d\n"</span>, <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_blksize">d_blksize</a>);<a class="l" name="281"> 281 </a> }<a class="l" name="282"> 282 </a><a class="l" name="283"> 283 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=cap">cap</a>);<a class="l" name="284"> 284 </a> <b>if</b> (<a href="/source/s?defs=user_supplied">user_supplied</a>) {<a class="l" name="285"> 285 </a> <a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_name">d_name</a> = (<b>char</b> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=strlen">strlen</a>(<a href="/source/s?defs=user_supplied">user_supplied</a>) + <span class="n">1</span>);<a class="l" name="286"> 286 </a> (<b>void</b>) <a href="/source/s?defs=strcpy">strcpy</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_name">d_name</a>, <a href="/source/s?defs=user_supplied">user_supplied</a>);<a class="l" name="287"> 287 </a> }<a class="l" name="288"> 288 </a> <a href="/source/s?defs=TRACE">TRACE</a>(<a href="/source/s?defs=traceall_msg">traceall_msg</a>(<span class="s">"Got device %s\n"</span>, <a href="/source/s?defs=node">node</a>));<a class="l" name="289"> 289 </a> <b>return</b> (<a href="/source/s?defs=dev">dev</a>);<a class="hl" name="290"> 290 </a>}<a class="l" name="291"> 291 </a><a class="l" name="292"> 292 </a><b>void</b><a class="l" name="293"> 293 </a><a href="/source/s?defs=fini_device">fini_device</a>(<a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=dev">dev</a>)<a class="l" name="294"> 294 </a>{<a class="l" name="295"> 295 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_inq">d_inq</a>);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -