Re: [ES40-developers] Patch: support MSF flag for READ TOC/PMA/ATIP
Status: Alpha
Brought to you by:
iamcamiel
|
From: Camiel V. <iam...@gm...> - 2008-02-20 20:18:00
|
Hi Brian,
I just put it in CVS.
Camiel.
On Feb 18, 2008 9:19 PM, Brian Wheeler <bdw...@in...> wrote:
> I snagged the algorithm from libcdio. It should be right, but all I
> know is that its "right" enough that FreeBSD boots again.
>
> Brian
>
> Index: Disk.cpp
> ===================================================================
> RCS file: /cvsroot/es40/es40/src/Disk.cpp,v
> retrieving revision 1.24
> diff -u -r1.24 Disk.cpp
> --- Disk.cpp 18 Feb 2008 14:52:10 -0000 1.24
> +++ Disk.cpp 18 Feb 2008 20:17:30 -0000
> @@ -617,6 +617,45 @@
> }
> }
>
> +
> +/**
> + * Basic algorithm taken from libcdio for converting lba to msf
> + **/
> +
> +#define PREGAP_SECTORS 150
> +#define CD_FRAMES_PER_SEC 75
> +#define CD_MAX_LSN 450150
> +
> +#define bin2bcd(x) ((x / 10) << 4) | (x % 10)
> +
> +static u32 lba2msf(off_t_large lba) {
> + int m,s,f;
> +
> + lba -= PREGAP_SECTORS;
> + if(lba >= -PREGAP_SECTORS) {
> + m = (lba + PREGAP_SECTORS) / (CD_FRAMES_PER_SEC * 60);
> + lba -= m * (CD_FRAMES_PER_SEC * 60);
> + s = (lba + PREGAP_SECTORS) / CD_FRAMES_PER_SEC;
> + lba -= s * CD_FRAMES_PER_SEC;
> + f = lba + PREGAP_SECTORS;
> + } else {
> + m = (lba + CD_MAX_LSN) / (CD_FRAMES_PER_SEC * 60);
> + lba -= m * (CD_FRAMES_PER_SEC * 60);
> + s = (lba + CD_MAX_LSN) / CD_FRAMES_PER_SEC;
> + lba -= s * CD_FRAMES_PER_SEC;
> + f = lba + CD_MAX_LSN;
> + }
> +
> + if(m > 99) m=99;
> +
> + //printf("m=%d, s=%d, f=%d == m=%x, s=%x, f=%x\n", m,s,f,bin2bcd(m),bin2bcd(s),bin2bcd(f));
> +
> + return bin2bcd(m)<<16 | bin2bcd(s)<<8 | bin2bcd(f);
> +
> +
> +}
> +
> +
> /**
> * \brief Handle a SCSI command.
> *
> @@ -1312,12 +1351,6 @@
> #if defined(DEBUG_SCSI)
> printf("%s: CDROM READ TOC.\n", devid_string);
> #endif
> - if (state.scsi.cmd.data[1]&0x02)
> - {
> - printf("%s: I don't understand READ TOC/PMA/ATIP with MSF bit set.\n",devid_string);
> - FAILURE("SCSI Command Failed");
> - }
> -
> if (state.scsi.cmd.data[2]&0x0f)
> {
> printf("%s: I don't understand READ TOC/PMA/ATIP with format %01x.\n",devid_string,state.scsi.cmd.data[2] & 0x0f);
> @@ -1355,20 +1388,41 @@
> state.scsi.dati.data[q++] = 0x14; // adr/control (Q-channel: current position, data track, no copy)
> state.scsi.dati.data[q++] = 1; // track number
> state.scsi.dati.data[q++] = 0; // reserved
> - state.scsi.dati.data[q++] = 0>>24; //lba
> - state.scsi.dati.data[q++] = 0>>16;
> - state.scsi.dati.data[q++] = 0>>8;
> - state.scsi.dati.data[q++] = 0;
> + if(state.scsi.cmd.data[1]&0x02)
> + {
> + u32 x = lba2msf(0);
> + state.scsi.dati.data[q++]=0;
> + state.scsi.dati.data[q++]=(x & 0xff0000) >> 16;
> + state.scsi.dati.data[q++]=(x & 0xff00) >> 8;
> + state.scsi.dati.data[q++]=x & 0xff;
> + }
> + else
> + {
> + state.scsi.dati.data[q++] = 0>>24; //lba
> + state.scsi.dati.data[q++] = 0>>16;
> + state.scsi.dati.data[q++] = 0>>8;
> + state.scsi.dati.data[q++] = 0;
> + }
> }
> state.scsi.dati.data[q++] = 0; // reserved
> state.scsi.dati.data[q++] = 0x16; // adr/control (Q-channel: current position, data track, copy)
> state.scsi.dati.data[q++] = 0xAA; // track number
> state.scsi.dati.data[q++] = 0; // reserved
> - state.scsi.dati.data[q++] = (u8)(get_lba_size()>>24); //lba
> - state.scsi.dati.data[q++] = (u8)(get_lba_size()>>16);
> - state.scsi.dati.data[q++] = (u8)(get_lba_size()>>8);
> - state.scsi.dati.data[q++] = (u8)get_lba_size();
> -
> + if(state.scsi.cmd.data[1]&0x02)
> + {
> + u32 x = lba2msf(get_lba_size());
> + state.scsi.dati.data[q++]=0;
> + state.scsi.dati.data[q++]=(x & 0xff0000) >> 16;
> + state.scsi.dati.data[q++]=(x & 0xff00) >> 8;
> + state.scsi.dati.data[q++]=x & 0xff;
> + }
> + else
> + {
> + state.scsi.dati.data[q++] = (u8)(get_lba_size()>>24); //lba
> + state.scsi.dati.data[q++] = (u8)(get_lba_size()>>16);
> + state.scsi.dati.data[q++] = (u8)(get_lba_size()>>8);
> + state.scsi.dati.data[q++] = (u8)get_lba_size();
> + }
> state.scsi.dati.data[0] = (u8)(q>>8);
> state.scsi.dati.data[1] = (u8)q;
>
> @@ -1505,6 +1559,7 @@
> return SCSI_PHASE_COMMAND;
> }
>
> +
> static int primes_54[54]
> = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
> 31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by: Microsoft
> Defy all challenges. Microsoft(R) Visual Studio 2008.
> http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
> _______________________________________________
> Es40-developers mailing list
> Es4...@li...
> https://lists.sourceforge.net/lists/listinfo/es40-developers
>
|