📄 misc_scsi.c.htm
字号:
<a class="l" name="161"> 161 </a> */</span><a class="l" name="162"> 162 </a><b>int</b><a class="l" name="163"> 163 </a><a href="/source/s?defs=build_track_info">build_track_info</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=trackno">trackno</a>, <b>struct</b> <a href="/source/s?defs=track_info">track_info</a> *<a href="/source/s?defs=t_info">t_info</a>)<a class="l" name="164"> 164 </a>{<a class="l" name="165"> 165 </a> <a href="/source/s?defs=uchar_t">uchar_t</a> *<a href="/source/s?defs=ti">ti</a>;<a class="l" name="166"> 166 </a> <a href="/source/s?defs=uchar_t">uchar_t</a> <a href="/source/s?defs=toc">toc</a>[<span class="n">20</span>]; <span class="c">/* 2 entries + 4 byte header */</span><a class="l" name="167"> 167 </a> <b>int</b> <a href="/source/s?defs=ret">ret</a>;<a class="l" name="168"> 168 </a><a class="l" name="169"> 169 </a> (<b>void</b>) <a href="/source/s?defs=memset">memset</a>(<a href="/source/s?defs=t_info">t_info</a>, <span class="n">0</span>, <b>sizeof</b> (*<a href="/source/s?defs=t_info">t_info</a>));<a class="hl" name="170"> 170 </a> <span class="c">/* 1st try READ TRACK INFORMATION */</span><a class="l" name="171"> 171 </a> <a href="/source/s?defs=ti">ti</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=TRACK_INFO_SIZE">TRACK_INFO_SIZE</a>);<a class="l" name="172"> 172 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_no">ti_track_no</a> = <a href="/source/s?defs=trackno">trackno</a>;<a class="l" name="173"> 173 </a><a class="l" name="174"> 174 </a> <span class="c">/* Gererate faked information for writing to DVD */</span><a class="l" name="175"> 175 </a> <b>if</b> (<a href="/source/s?defs=device_type">device_type</a> != <a href="/source/s?defs=CD_RW">CD_RW</a>) {<a class="l" name="176"> 176 </a> <a href="/source/s?defs=uint_t">uint_t</a> <a href="/source/s?defs=bsize">bsize</a>;<a class="l" name="177"> 177 </a><a class="l" name="178"> 178 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> = <span class="n">0x3000</span>;<a class="l" name="179"> 179 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_no">ti_track_no</a> = <span class="n">1</span>;<a class="hl" name="180"> 180 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_session_no">ti_session_no</a> = <span class="n">1</span>;<a class="l" name="181"> 181 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_mode">ti_track_mode</a> = <span class="n">0x4</span>;<a class="l" name="182"> 182 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_data_mode">ti_data_mode</a> = <span class="n">1</span>;<a class="l" name="183"> 183 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a> = <span class="n">0</span>;<a class="l" name="184"> 184 </a><a class="l" name="185"> 185 </a> <span class="c">/* only 1 track on DVD make it max size */</span><a class="l" name="186"> 186 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=read_format_capacity">read_format_capacity</a>(<a href="/source/s?defs=target">target</a>-><a href="/source/s?defs=d_fd">d_fd</a>,<a class="l" name="187"> 187 </a> &<a href="/source/s?defs=bsize">bsize</a>);<a class="l" name="188"> 188 </a> <b>if</b> (<a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> < <a href="/source/s?defs=MAX_CD_BLKS">MAX_CD_BLKS</a>) {<a class="l" name="189"> 189 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=MAX_DVD_BLKS">MAX_DVD_BLKS</a>;<a class="hl" name="190"> 190 </a> }<a class="l" name="191"> 191 </a><a class="l" name="192"> 192 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_nwa">ti_nwa</a> = <span class="n">0</span>;<a class="l" name="193"> 193 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_lra">ti_lra</a> = <span class="n">0</span>;<a class="l" name="194"> 194 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_packet_size">ti_packet_size</a> = <span class="n">0x10</span>;<a class="l" name="195"> 195 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_free_blocks">ti_free_blocks</a> = <span class="n">0</span>;<a class="l" name="196"> 196 </a> }<a class="l" name="197"> 197 </a><a class="l" name="198"> 198 </a> <b>if</b> (<a href="/source/s?defs=read_track_info">read_track_info</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=trackno">trackno</a>, <a href="/source/s?defs=ti">ti</a>)) {<a class="l" name="199"> 199 </a><a class="hl" name="200"> 200 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="201"> 201 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"using read_track_info for TOC \n"</span>);<a class="l" name="202"> 202 </a><a class="l" name="203"> 203 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_no">ti_track_no</a> = <a href="/source/s?defs=ti">ti</a>[<span class="n">2</span>];<a class="l" name="204"> 204 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_session_no">ti_session_no</a> = <a href="/source/s?defs=ti">ti</a>[<span class="n">3</span>];<a class="l" name="205"> 205 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> = (<a href="/source/s?defs=ti">ti</a>[<span class="n">6</span>] >> <span class="n">4</span>) & <span class="n">0xf</span>;<a class="l" name="206"> 206 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> |= (<a href="/source/s?defs=uint32_t">uint32_t</a>)(<a href="/source/s?defs=ti">ti</a>[<span class="n">5</span>] & <span class="n">0xf0</span>);<a class="l" name="207"> 207 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_flags">ti_flags</a> |= (<a href="/source/s?defs=uint32_t">uint32_t</a>)(<a href="/source/s?defs=ti">ti</a>[<span class="n">7</span>]) << <span class="n">8</span>;<a class="l" name="208"> 208 </a> <a href="/source/s?defs=t_info">t_info</a>-><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 href="/source/s?defs=TI_FREE_BLOCKS_VALID">TI_FREE_BLOCKS_VALID</a>;<a class="l" name="209"> 209 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_mode">ti_track_mode</a> = <a href="/source/s?defs=ti">ti</a>[<span class="n">5</span>] & <span class="n">0xf</span>;<a class="hl" name="210"> 210 </a> <b>if</b> ((<a href="/source/s?defs=ti">ti</a>[<span class="n">6</span>] & <span class="n">0xf</span>) == <span class="n">0xf</span>)<a class="l" name="211"> 211 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_data_mode">ti_data_mode</a> = <span class="n">0xff</span>;<a class="l" name="212"> 212 </a> <b>else</b><a class="l" name="213"> 213 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_data_mode">ti_data_mode</a> = <a href="/source/s?defs=ti">ti</a>[<span class="n">6</span>] & <span class="n">0xf</span>;<a class="l" name="214"> 214 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">8</span>]);<a class="l" name="215"> 215 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_nwa">ti_nwa</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">12</span>]);<a class="l" name="216"> 216 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_free_blocks">ti_free_blocks</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">16</span>]);<a class="l" name="217"> 217 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_packet_size">ti_packet_size</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">20</span>]);<a class="l" name="218"> 218 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">24</span>]);<a class="l" name="219"> 219 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_lra">ti_lra</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=ti">ti</a>[<span class="n">28</span>]);<a class="hl" name="220"> 220 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=ti">ti</a>);<a class="l" name="221"> 221 </a> <b>return</b> (<span class="n">1</span>);<a class="l" name="222"> 222 </a> }<a class="l" name="223"> 223 </a> <span class="c">/* READ TRACK INFORMATION not supported, try other options */</span><a class="l" name="224"> 224 </a> <a href="/source/s?defs=free">free</a>(<a href="/source/s?defs=ti">ti</a>);<a class="l" name="225"> 225 </a> <span class="c">/*<a class="l" name="226"> 226 </a> * We can get info for next blank track if READ TRACK INFO is not<a class="l" name="227"> 227 </a> * supported.<a class="l" name="228"> 228 </a> */</span><a class="l" name="229"> 229 </a> <b>if</b> (<a href="/source/s?defs=trackno">trackno</a> == -<span class="n">1</span>)<a class="hl" name="230"> 230 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="231"> 231 </a><a class="l" name="232"> 232 </a> <b>if</b> (<a href="/source/s?defs=debug">debug</a>)<a class="l" name="233"> 233 </a> (<b>void</b>) <a href="/source/s?defs=printf">printf</a>(<span class="s">"using READ_TOC for TOC\n"</span>);<a class="l" name="234"> 234 </a><a class="l" name="235"> 235 </a> <span class="c">/* Try Read TOC */</span><a class="l" name="236"> 236 </a> <b>if</b> (!<a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <span class="n">0</span>, <a href="/source/s?defs=trackno">trackno</a>, <span class="n">20</span>, <a href="/source/s?defs=toc">toc</a>)) {<a class="l" name="237"> 237 </a> <b>return</b> (<span class="n">0</span>);<a class="l" name="238"> 238 </a> }<a class="l" name="239"> 239 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=toc">toc</a>[<span class="n">8</span>]);<a class="hl" name="240"> 240 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_mode">ti_track_mode</a> = <a href="/source/s?defs=toc">toc</a>[<span class="n">5</span>] & <span class="n">0xf</span>;<a class="l" name="241"> 241 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> = <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=toc">toc</a>[<span class="n">16</span>]) - <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=toc">toc</a>[<span class="n">8</span>]);<a class="l" name="242"> 242 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_data_mode">ti_data_mode</a> = <a href="/source/s?defs=get_data_mode">get_data_mode</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <a href="/source/s?defs=read_scsi32">read_scsi32</a>(&<a href="/source/s?defs=toc">toc</a>[<span class="n">8</span>]));<a class="l" name="243"> 243 </a><a class="l" name="244"> 244 </a> <span class="c">/* Numbers for audio tracks are always in 2K chunks */</span><a class="l" name="245"> 245 </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=t_info">t_info</a>-><a href="/source/s?defs=ti_track_mode">ti_track_mode</a> & <span class="n">4</span>) == <span class="n">0</span>)) {<a class="l" name="246"> 246 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_start_address">ti_start_address</a> /= <span class="n">4</span>;<a class="l" name="247"> 247 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_track_size">ti_track_size</a> /= <span class="n">4</span>;<a class="l" name="248"> 248 </a> }<a class="l" name="249"> 249 </a><a class="hl" name="250"> 250 </a> <span class="c">/* Now find out the session thing */</span><a class="l" name="251"> 251 </a> <a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=read_toc">read_toc</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <span class="n">1</span>, <a href="/source/s?defs=trackno">trackno</a>, <span class="n">12</span>, <a href="/source/s?defs=toc">toc</a>);<a class="l" name="252"> 252 </a><a class="l" name="253"> 253 </a> <span class="c">/*<a class="l" name="254"> 254 </a> * Make sure that the call succeeds and returns the requested<a class="l" name="255"> 255 </a> * TOC size correctly.<a class="l" name="256"> 256 </a> */</span><a class="l" name="257"> 257 </a><a class="l" name="258"> 258 </a> <b>if</b> ((<a href="/source/s?defs=ret">ret</a> == <span class="n">0</span>) || (<a href="/source/s?defs=toc">toc</a>[<span class="n">1</span>] != <span class="n">0x0a</span>)) {<a class="l" name="259"> 259 </a><a class="hl" name="260"> 260 </a> <span class="c">/* For ATAPI drives or old Toshiba drives */</span><a class="l" name="261"> 261 </a> <a href="/source/s?defs=ret">ret</a> = <a href="/source/s?defs=read_toc_as_per_8020">read_toc_as_per_8020</a>(<a href="/source/s?defs=dev">dev</a>-><a href="/source/s?defs=d_fd">d_fd</a>, <span class="n">1</span>, <a href="/source/s?defs=trackno">trackno</a>, <span class="n">12</span>, <a href="/source/s?defs=toc">toc</a>);<a class="l" name="262"> 262 </a> }<a class="l" name="263"> 263 </a> <span class="c">/* If this goes through well TOC length will always be 0x0a */</span><a class="l" name="264"> 264 </a> <b>if</b> (<a href="/source/s?defs=ret">ret</a> && (<a href="/source/s?defs=toc">toc</a>[<span class="n">1</span>] == <span class="n">0x0a</span>)) {<a class="l" name="265"> 265 </a> <b>if</b> (<a href="/source/s?defs=trackno">trackno</a> >= <a href="/source/s?defs=toc">toc</a>[<span class="n">6</span>]) {<a class="l" name="266"> 266 </a> <a href="/source/s?defs=t_info">t_info</a>-><a href="/source/s?defs=ti_session_no">ti_session_no</a> = <a href="/source/s?defs=toc">toc</a>[<span class="n">3</span>];<a class="l" name="267"> 267 </a> <a href="/source/s?defs=t_info">t_info</a>-><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="268"> 268 </a> }<a class="l" name="269"> 269 </a> <span class="c">/*<a class="hl" name="270"> 270 </a> * This might be the last track of this session. If so,<a class="l" name="271"> 271 </a> * exclude the leadout and next lead in.<a class="l" name="272"> 272 </a> */</span><a class="l" name="273"> 273 </a> <b>if</b> (<a href="/source/s?defs=trackno">trackno</a> == (<a href="/source/s?defs=toc">toc</a>[<span class="n">6</span>] - <span class="n">1</span>)) {<a class="l" name="274"> 274 </a> <span class="c">/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -