基于非IDE專用接口芯片的自主型光盤復(fù)制機(jī)的系統(tǒng)設(shè)計(jì)
4 軟件實(shí)現(xiàn)
參考CD-WO規(guī)范,CD-WO的寫入方式主要有兩種:Track at once(軌道)和Disc/Session at once(分區(qū))。這和光盤的信息存放格式分類有極大的關(guān)系。在國(guó)內(nèi),多分區(qū)的光盤MULT-SESSION CD如MIXED CD、CD-I等較為少見(jiàn),它們是數(shù)據(jù)區(qū)和音頻區(qū)的結(jié)合,一般第一個(gè)分區(qū)與其它分區(qū)不同。某些光盤用Track at once能夠成功地刻錄,而用Disc at once方式則失敗;反之亦然。
通常,Disc at once較為普遍,若寫入CUESheet則整個(gè)光盤的刻錄軌跡位置就固定了。而在實(shí)踐中發(fā)現(xiàn),對(duì)于MIXED-CD用Track at once更容易成功。圖3、圖4是兩種寫入方式的簡(jiǎn)單過(guò)程。
實(shí)際的軟件編程要比這些復(fù)雜。對(duì)于經(jīng)常調(diào)用的過(guò)程,通常都用匯編語(yǔ)言編寫,例如:從IDE接口寄存器中的讀寫(Read-Data-Reg,Write-Data-Reg,Read-Status-Reg,Write-CMD-pkt,Write-Task-Ide)等。而針對(duì)ATAPI的大多命令,都用C51編寫,例如:mode-select(),read-10(ad),write-10(ad),tray-out(),send-cue-sheet()等。
部分執(zhí)行程序的示例如下:
IDE接口地址定義部分 ;;IDE Interface Address
例如:IDE_STATUS EQU 81F7H
……
_Read_Status_Reg: ;;讀IDE驅(qū)動(dòng)器設(shè)備狀態(tài)子程序
lcall _Drive_Select;選擇光驅(qū)
……
mov p1,#IDE_Lmode
mov DPTR,#IDE_STATUS
movx @DPTR,a ;DIOR valid
……
mov p1,#Sram64_Lmode
movx A,@DPTR
mov R7,A ;返回狀態(tài)到r7寄存器
ret
Write_Cmd_Pkt: nop ;寫6字命令包子程序
;寫6字事先已存入內(nèi)空間
cmd_buffer
mov R0,#cmd_buffer
mov R1,#06H ;//6 words to write
send_pkt:
mov A,@R0
mov pl,#Sram64_Lmode
mov DPTR,#IDE_DATA_REG
movx @DPTR,A ;//write low byte
inc R0
;//類似的寫高字節(jié)到16位SRAM
……
;再將16bit從16位SRAM中一次寫入IDE設(shè)備
mov pl,#IDE_WMode ;select IDE device
mov DPTR,#IDE_DATA_REG
;//16bit packet command write
movx a,@DPTR ;DIOW valid
……
inc R0
djnz R1,send_pkt
ret
void send_cue_sh(USI par_len)
{//ATAPI CD-WO Command,10字節(jié) //命令字節(jié)初始化設(shè)備
……
do {
status=Read_Status_Reg(drv);
}while(status0x80); //不忙時(shí)才可寫入
nonDMA_xfer_data 1(); //non DMA(PIO模式)
P1=SRAM32;
status=Read_Status_Reg(drv); //讀取返回的狀態(tài)
if(status0x01) {
rqsense(); //ATAPI Command
}
}/*End of send_cue_sh */
基于非IDE專用接口芯片的自主型光盤復(fù)制機(jī)是對(duì)目前光盤復(fù)制市場(chǎng)的有益補(bǔ)充。其設(shè)計(jì)要求有較高的單片機(jī)、DMA傳輸以及CPLD等硬件知識(shí)和對(duì)CD、CDWO格式以及對(duì)ATAPI整個(gè)命令的了解。
評(píng)論