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

📄 misc_scsi.c.htm

📁 光驱cdrom读写源代码,scsi命令解析
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<a class="l" name="275">    275 </a>			 * 1.5 Min leadout + 1 min. leadin + 2 sec. pre-gap.<a class="l" name="276">    276 </a>			 * For 2nd+ leadout it will be 0.5 min. But currently<a class="l" name="277">    277 </a>			 * there is no direct way. And it will not happen<a class="l" name="278">    278 </a>			 * for any normal case.<a class="l" name="279">    279 </a>			 *<a class="hl" name="280">    280 </a>			 * 75 <a href="/source/s?path=frames/">frames</a>/<a href="/source/s?path=frames/sec">sec</a>, 60 <a href="/source/s?path=sec/">sec</a>/<a href="/source/s?path=sec/min">min</a>, so leadin gap is<a class="l" name="281">    281 </a>			 * ((1.5 +1)*60 + 2)*75 = 11400 frames (blocks)<a class="l" name="282">    282 </a>			 */</span><a class="l" name="283">    283 </a>			<a href="/source/s?defs=t_info">t_info</a>-&gt;<a href="/source/s?defs=ti_track_size">ti_track_size</a> -= <span class="n">11400</span>;<a class="l" name="284">    284 </a>		}<a class="l" name="285">    285 </a>	} <b>else</b> {<a class="l" name="286">    286 </a>		<b>if</b> (<a href="/source/s?defs=check_track_size">check_track_size</a>(<a href="/source/s?defs=dev">dev</a>, <a href="/source/s?defs=trackno">trackno</a>, <a href="/source/s?defs=t_info">t_info</a>) != <span class="n">1</span>)<a class="l" name="287">    287 </a>			<b>return</b> (<span class="n">0</span>);<a class="l" name="288">    288 </a>	}<a class="l" name="289">    289 </a><a class="hl" name="290">    290 </a>	<b>return</b> (<span class="n">1</span>);<a class="l" name="291">    291 </a>}<a class="l" name="292">    292 </a><a class="l" name="293">    293 </a><span class="c">/*<a class="l" name="294">    294 </a> * The size of the last track in one of the first N - 1 sessions of an<a class="l" name="295">    295 </a> * N-session (N &gt; 1) disc is reported incorrectly by some drives and calculated<a class="l" name="296">    296 </a> * incorrectly for others, because a <a href="/source/s?path=pre-gap/">pre-gap</a>/<a href="/source/s?path=pre-gap/lead-out/">lead-out</a>/<a href="/source/s?path=pre-gap/lead-out/lead-in">lead-in</a> section that ends<a class="l" name="297">    297 </a> * a session is erroneously considered part of that track. This function checks<a class="l" name="298">    298 </a> * for this corner case, and adjusts the track size if necessary.<a class="l" name="299">    299 </a> */</span><a class="hl" name="300">    300 </a><b>static</b> <b>int</b><a class="l" name="301">    301 </a><a href="/source/s?defs=check_track_size">check_track_size</a>(<a href="/source/s?defs=cd_device">cd_device</a> *<a href="/source/s?defs=dev">dev</a>, <b>int</b> <a href="/source/s?defs=trk_num">trk_num</a>, <b>struct</b> <a href="/source/s?defs=track_info">track_info</a> *<a href="/source/s?defs=tip">tip</a>)<a class="l" name="302">    302 </a>{<a class="l" name="303">    303 </a>	<a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>;<a class="l" name="304">    304 </a>	<a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=raw_toc">raw_toc</a>;<a class="l" name="305">    305 </a>	<a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a> <a href="/source/s?defs=hdr">hdr</a>;<a class="l" name="306">    306 </a>	<a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a>;<a class="l" name="307">    307 </a>	<b>int</b> <a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>;<a class="l" name="308">    308 </a>	<b>int</b> <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>;<a class="l" name="309">    309 </a>	<a href="/source/s?defs=uint32_t">uint32_t</a> <a href="/source/s?defs=trk_size">trk_size</a>;<a class="hl" name="310">    310 </a><a class="l" name="311">    311 </a>	<span class="c">/* Request Raw TOC Header for session count. */</span><a class="l" name="312">    312 </a>	<b>if</b> (<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-&gt;<a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=FORMAT_RAW_TOC">FORMAT_RAW_TOC</a>, <span class="n">1</span>,<a class="l" name="313">    313 </a>	    <b>sizeof</b> (<a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a>), (<a href="/source/s?defs=uchar_t">uchar_t</a> *)&amp;<a href="/source/s?defs=hdr">hdr</a>) != <span class="n">1</span>)<a class="l" name="314">    314 </a>		<b>return</b> (<span class="n">0</span>);<a class="l" name="315">    315 </a><a class="l" name="316">    316 </a>	<span class="c">/* Is this a multi-session medium? */</span><a class="l" name="317">    317 </a>	<b>if</b> (<a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_last_sess_num">rh_last_sess_num</a> &gt; <a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_first_sess_num">rh_first_sess_num</a>) {<a class="l" name="318">    318 </a>		<span class="c">/* Yes; request entire Raw TOC. */</span><a class="l" name="319">    319 </a>		<a href="/source/s?defs=raw_toc_len">raw_toc_len</a> = <a href="/source/s?defs=read_scsi16">read_scsi16</a>(&amp;<a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_data_len1">rh_data_len1</a>) + <a href="/source/s?defs=RTOC_DATA_LEN_SZ">RTOC_DATA_LEN_SZ</a>;<a class="hl" name="320">    320 </a>		<a href="/source/s?defs=raw_toc">raw_toc</a> = (<a href="/source/s?defs=uchar_t">uchar_t</a> *)<a href="/source/s?defs=my_zalloc">my_zalloc</a>(<a href="/source/s?defs=raw_toc_len">raw_toc_len</a>);<a class="l" name="321">    321 </a><a class="l" name="322">    322 </a>		<b>if</b> (<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-&gt;<a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=FORMAT_RAW_TOC">FORMAT_RAW_TOC</a>, <span class="n">1</span>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=raw_toc">raw_toc</a>)<a class="l" name="323">    323 </a>		    != <span class="n">1</span>)<a class="l" name="324">    324 </a>			<b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="325">    325 </a><a class="l" name="326">    326 </a>		<b>if</b> (<a href="/source/s?defs=rtoc_get_trk_sess_num">rtoc_get_trk_sess_num</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=trk_num">trk_num</a>,<a class="l" name="327">    327 </a>		    &amp;<a href="/source/s?defs=trk_sess_num">trk_sess_num</a>) != <span class="n">1</span>)<a class="l" name="328">    328 </a>			<b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="329">    329 </a><a class="hl" name="330">    330 </a>		<a href="/source/s?defs=tip">tip</a>-&gt;<a href="/source/s?defs=ti_session_no">ti_session_no</a> = <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>;<a class="l" name="331">    331 </a>		<a href="/source/s?defs=tip">tip</a>-&gt;<a href="/source/s?defs=ti_flags">ti_flags</a> |= <a href="/source/s?defs=TI_SESSION_NO_VALID">TI_SESSION_NO_VALID</a>;<a class="l" name="332">    332 </a><a class="l" name="333">    333 </a>		<span class="c">/* Is the track in one of the first N - 1 sessions? */</span><a class="l" name="334">    334 </a>		<b>if</b> (<a href="/source/s?defs=trk_sess_num">trk_sess_num</a> &lt; <a href="/source/s?defs=hdr">hdr</a>.<a href="/source/s?defs=rh_last_sess_num">rh_last_sess_num</a>) {<a class="l" name="335">    335 </a>			<b>if</b> (<a href="/source/s?defs=rtoc_get_sess_last_trk_num">rtoc_get_sess_last_trk_num</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>, <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>,<a class="l" name="336">    336 </a>			    <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>, &amp;<a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>) != <span class="n">1</span>)<a class="l" name="337">    337 </a>				<b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="338">    338 </a><a class="l" name="339">    339 </a>			<span class="c">/* Is the track the last track in the session? */</span><a class="hl" name="340">    340 </a>			<b>if</b> (<a href="/source/s?defs=trk_num">trk_num</a> == <a href="/source/s?defs=sess_last_trk_num">sess_last_trk_num</a>) {<a class="l" name="341">    341 </a>				<b>if</b> (<a href="/source/s?defs=rtoc_get_sess_leadout_lba">rtoc_get_sess_leadout_lba</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>,<a class="l" name="342">    342 </a>				    <a href="/source/s?defs=raw_toc_len">raw_toc_len</a>, <a href="/source/s?defs=trk_sess_num">trk_sess_num</a>,<a class="l" name="343">    343 </a>				    &amp;<a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a>) != <span class="n">1</span>)<a class="l" name="344">    344 </a>					<b>goto</b> <a href="/source/s?defs=fail">fail</a>;<a class="l" name="345">    345 </a><a class="l" name="346">    346 </a>				<a href="/source/s?defs=trk_size">trk_size</a> = <a href="/source/s?defs=sess_leadout_lba">sess_leadout_lba</a> -<a class="l" name="347">    347 </a>				    <a href="/source/s?defs=tip">tip</a>-&gt;<a href="/source/s?defs=ti_start_address">ti_start_address</a>;<a class="l" name="348">    348 </a><a class="l" name="349">    349 </a>				<span class="c">/* Fix track size if it was too big. */</span><a class="hl" name="350">    350 </a>				<b>if</b> (<a href="/source/s?defs=tip">tip</a>-&gt;<a href="/source/s?defs=ti_track_size">ti_track_size</a> &gt; <a href="/source/s?defs=trk_size">trk_size</a>)<a class="l" name="351">    351 </a>					<a href="/source/s?defs=tip">tip</a>-&gt;<a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=trk_size">trk_size</a>;<a class="l" name="352">    352 </a>			}<a class="l" name="353">    353 </a>		}<a class="l" name="354">    354 </a>		<a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>);<a class="l" name="355">    355 </a>	}<a class="l" name="356">    356 </a>	<b>return</b> (<span class="n">1</span>);<a class="l" name="357">    357 </a><a class="l" name="358">    358 </a><a href="/source/s?defs=fail">fail</a>:<a class="l" name="359">    359 </a>	<a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=raw_toc">raw_toc</a>);<a class="hl" name="360">    360 </a>	<b>return</b> (<span class="n">0</span>);<a class="l" name="361">    361 </a>}<a class="l" name="362">    362 </a><a class="l" name="363">    363 </a><span class="c">/*<a class="l" name="364">    364 </a> * Determine what session number a track is in by parsing the Raw TOC format of<a class="l" name="365">    365 </a> * the the READ <a href="/source/s?path=TOC/">TOC</a>/<a href="/source/s?path=TOC/PMA/">PMA</a>/<a href="/source/s?path=TOC/PMA/ATIP">ATIP</a> command response data.<a class="l" name="366">    366 </a> */</span><a class="l" name="367">    367 </a><b>static</b> <b>int</b><a class="l" name="368">    368 </a><a href="/source/s?defs=rtoc_get_trk_sess_num">rtoc_get_trk_sess_num</a>(<a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=rtoc">rtoc</a>, <a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=rtoc_len">rtoc_len</a>, <b>int</b> <a href="/source/s?defs=trk_num">trk_num</a>,<a class="l" name="369">    369 </a>    <b>int</b> *<a href="/source/s?defs=sess_nump">sess_nump</a>)<a class="hl" name="370">    370 </a>{<a class="l" name="371">    371 </a>	<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *<a href="/source/s?defs=tdp">tdp</a> = (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *)(<a href="/source/s?defs=rtoc">rtoc</a> + <b>sizeof</b> (<a href="/source/s?defs=rtoc_hdr_t">rtoc_hdr_t</a>));<a class="l" name="372">    372 </a>	<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *<a href="/source/s?defs=last_tdp">last_tdp</a> = (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a> *)(<a href="/source/s?defs=rtoc">rtoc</a> + <a href="/source/s?defs=rtoc_len">rtoc_len</a> -<a class="l" name="373">    373 </a>	    <b>sizeof</b> (<a href="/source/s?defs=rtoc_td_t">rtoc_td_t</a>));<a class="l" name="374">    374 </a><a class="l" name="375">    375 </a>	<b>if</b> ((<a href="/source/s?defs=tdp">tdp</a> = <a href="/source/s?defs=get_rtoc_td">get_rtoc_td</a>(<a href="/source/s?defs=tdp">tdp</a>, <a href="/source/s?defs=last_tdp">last_tdp</a>, <a href="/source/s?defs=Q_MODE_1">Q_MODE_1</a>, (<a href="/source/s?defs=uchar_t">uchar_t</a>)<a href="/source/s?defs=trk_num">trk_num</a>)) !=<a class="l" name="376">    376 </a>	    <a href="/source/s?defs=NULL">NULL</a>) {<a class="l" name="377">    377 </a>		*<a href="/source/s?defs=sess_nump">sess_nump</a> = <a href="/source/s?defs=tdp">tdp</a>-&gt;<a href="/source/s?defs=rt_session_num">rt_session_num</a>;<a class="l" name="378">    378 </a>		<b>return</b> (<span class="n">1</span>);<a class="l" name="379">    379 </a>	} <b>else</b><a class="hl" name="380">    380 </a>		<b>return</b> (<span class="n">0</span>);<a class="l" name="381">    381 </a>}<a class="l" name="382">    382 </a><a class="l" name="383">    383 </a><span class="c">/*<a class="l" name="384">    384 </a> * Determine the last track number in a specified session number by parsing the<a class="l" name="385">    385 </a> * Raw TOC format of the READ <a href="/source/s?path=TOC/">TOC</a>/<a href="/source/s?path=TOC/PMA/">PMA</a>/<a href="/source/s?path=TOC/PMA/ATIP">ATIP</a> command response data.<a class="l" name="386">    386 </a> */</span><a class="l" name="387">    387 </a><b>static</b> <b>int</b><a class="l" name="388">    388 </a><a href="/source/s?defs=rtoc_get_sess_last_trk_num">rtoc_get_sess_last_trk_num</a>(<a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=rtoc">rtoc</a>, <a href="/source/s?defs=size_t">size_t</a> <a href="/source/s?defs=rtoc_len">rtoc_len</a>, <b>int</b> <a href="/source/s?defs=sess_num">sess_num</a>,

⌨️ 快捷键说明

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