Newsgroup: it.comp.os.linux.development
Titolo: Linux ed ASPI, una convivenza possibile?

Vorrei tentare di comunicare con il mio ricevitore digitale Nokia che
ha una interfaccia SCSI. So che attualmente esistono dei programmi
sotto WinXX che utilizzano questa interfaccia di programmazione, ma
dal serial SCSI HOWTO risulta che ASPI non sia disponibile sotto Linux
"perche' non serve". Qualcuno ha esperienze di programmazione sotto
SCSI e mi sa dire qualcosa di + (URL o documenti) sull'argomento?
Grazie
   Valentino
/************************
 * Warp: trekker inside *
 ************************/
To reply cut off NOSPAM from my "Reply-To:" address.
Per rispondermi togli NOSPAM dal mio indirizzo "Reply-TO:"

SCSI e mi sa dire qualcosa di + (URL o documenti) sull'argomento?
E' mooooolto più facile. Devi sapere su che ID viene mappato il Nokia e da
lì ne deduci a che devicefile /dev/sgX corrisponde.
Saputo questo basta un minimo di infarinatura sulla programmazione SCSI:
leggi lo SCSI Programming HOWTO e i sorgenti delle sg_utils
(
www.torque.net/sg
).
In sostanza: scrivi sul file sg i pacchetti con i comandi e leggi dal file
la risposta.
-- 
		Giuseppe Corbelli
    -=< A Metal Heart Is Hard To Tear Apart >=-
ANTI-SPAM: E-Mail address is fake. Substitute cowo with IHATESPAM.

SCSI e mi sa dire qualcosa di + (URL o documenti) sull'argomento?
/usr/share/doc/HOWTO/en-txt/SCSI-Programming-HOWTO.txt.gz
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | * The Internet is full. Go away.  -- Joel Furr *
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

/usr/share/doc/HOWTO/en-txt/SCSI-Programming-HOWTO.txt.gz
E' da li' che sono partito. Volevo solo sapere se esiste una libreria
di compatibilita' per emulare il seguente comando:
ExecSRB.SRB_Cmd	= SC_EXEC_SCSI_CMD;      //comando ASPI
ExecSRB.SRB_HaId = LOBYTE(nAdapterID);   //ID dell'adapter
ASPICompletionEvent=CreateEvent(NULL,FALSE,FALSE,NULL); //routine di
callback
ExecSRB.SRB_Flags = SRB_DIR_OUT | SRB_EVENT_NOTIFY;
ExecSRB.SRB_PostProc = ASPICompletionEvent; //evento di wait
ExecSRB.SRB_Target = LOBYTE(nSCSIID);
ExecSRB.SRB_BufPointer=(unsigned char *)settings_copy; //puntatore ai
dati restituiti dal comando
ExecSRB.SRB_BufLen = nTransferCount;
ExecSRB.SRB_SenseLen = SENSE_LEN;
ExecSRB.SRB_CDBLen = 10;
ExecSRB.CDBByte[0] = 0x3c;		// Read
ExecSRB.CDBByte[1] = 0;			// Channels
ExecSRB.CDBByte[2] = 0;
ExecSRB.CDBByte[3] = (unsigned char)(dwOffset >> 16) & 0xff;
//puntatore ai dati da leggere
ExecSRB.CDBByte[4] = (unsigned char)(dwOffset >> 8) & 0xff;
ExecSRB.CDBByte[5] = (unsigned char)dwOffset & 0xff;
//numero di bytes da leggere
ExecSRB.CDBByte[6] = (unsigned char)(nTransferCount >> 16) & 0xff;
ExecSRB.CDBByte[7] = (unsigned char)(nTransferCount >> 8) & 0xff;
ExecSRB.CDBByte[8] = (unsigned char)nTransferCount & 0xff;
ExecSRB.CDBByte[9] = 0;
pSendASPI32Command(&ExecSRB);
Che richiede nTransferCount bytes a partire dall'indirizzo dwOffset
del ricevitore. In pratica fa un download dei canali in memoria del
ricevitore...
Faro' alcune prove anche stanotte. :-[


la risposta.
Ti ringrazio, sono arrivato alle stesse conclusioni, anche se non
capisco come fare una traduzione dei comandi ASPI come il seguente:
ExecSRB.SRB_Cmd	= SC_EXEC_SCSI_CMD;
ExecSRB.SRB_HaId = LOBYTE(nAdapterID);
ASPICompletionEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
ExecSRB.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
ExecSRB.SRB_PostProc = ASPICompletionEvent;
ExecSRB.SRB_Target = LOBYTE(nSCSIID);
ExecSRB.SRB_BufPointer = szChannelLengthData;
ExecSRB.SRB_BufLen = 4;
ExecSRB.SRB_SenseLen = SENSE_LEN;
ExecSRB.SRB_CDBLen = 10;
ExecSRB.CDBByte[0] = 0x3c;		// read buffer
ExecSRB.CDBByte[1] = 1;			// ask for channel length
ExecSRB.CDBByte[2] = 0;
ExecSRB.CDBByte[3] = 0;
ExecSRB.CDBByte[4] = 0;
ExecSRB.CDBByte[5] = 0;
ExecSRB.CDBByte[6] = 0;
ExecSRB.CDBByte[7] = 0;
ExecSRB.CDBByte[8] = 4;			// four bytes only
ExecSRB.CDBByte[9] = 0;
pSendASPI32Command(&ExecSRB);
che in pratica invia il comando 0x3c (read buffer) seguito da 1 (dammi
quanti canali ho memorizzato nel ricevitore) ed il risultato va nella
variabile szChannelLengthData.
Devo provare a tradurlo con l'API generic scsi. Spero solo che il
pacchetto dati sia CDBByte[], cosi' lo copio talis et qualis...
chissa'!!!
Devo inoltre capire se il mio veccio controller SCSI Future Domain 885
(roba di 10 anni fa) funziona anche con periferiche SCSI2...
Se ti interessa ti faro' sapere se funziona, si prospetta una lunga
notte. ;-]
Ciao e grazie 


che usa ASPI per leggere dalla porta SCSI del ricevitore digitale uno
/dev/sg*, non dovrebbe essere troppo difficile da usare. Non conosco
librerie, potrebbe essere l'occasione di scriverne una. :-)


Written by 
vcoloss...@libero.it
:
[snip]

Bah, non ho mai usato il comando read buffer ma la cosa la vedo facile...
Io mi diletto di programmazione SCSI, e posso cercare di aiutarti, anche se
sono un po' incapace :-)
Prendi ad esempio questo pezzo di READ TOC: la struttura di base é sempre quella
[include vari]
#define OFF sizeof(struct sg_header)
#define READTOC_CMD_LEN 10
#define TR_DESC_LEN 8
typedef struct tTOCDataFormat {
  unsigned int TOCDataLenght:16;
  unsigned char FirstTRN:8;
  unsigned char LastTRN:8;
}TTOCDataFormat;
typedef struct tTrackDesc {
  unsigned char RSVD1:8;
  unsigned char ADR:4;
  unsigned char Cntrl:4;
  unsigned char TrackNumber;
  unsigned char RSVD2:8;
  unsigned char AbsoluteADDRR;
  unsigned char AbsoluteADDRM;
  unsigned char AbsoluteADDRS;
  unsigned char AbsoluteADDRF;
}TTrackDesc;
[variabili]
unsigned char readtocCmdBlk [READTOC_CMD_LEN] =
                                {0x43, 2, 0, 0, 0, 0, 1, 0x02, 0x43, 0};
unsigned char readtocBuff[OFF + 804];
int readtocInLen = OFF + sizeof(readtocCmdBlk);
int readtocOutLen = OFF + 804;
unsigned char * readtocData = readtocBuff + OFF;
struct sg_header * readtoc_header = (struct sg_header *)readtocBuff;
TTOCDataFormat *TOCDataFormat;
TTrackDesc *TrackDesc;
[controlli vari]
[apri il file sg]
if ((sg_fd = open(file_name, O_RDWR)) < 0) {
  sprintf(ebuff, "sg_simple1: error opening file: %s", file_name);
  perror(ebuff);
  return 1;
}
[imposti header e comando]
readtoc_header->reply_len = readtocOutLen;
readtoc_header->pack_id=100;
readtoc_header->twelve_byte=0;
readtoc_header->other_flags=0;
memcpy(readtocBuff + OFF, readtocCmdBlk, READTOC_CMD_LEN);
[scrivi e leggi il risultato]
if (write(sg_fd, readtocBuff, readtocInLen) < 0) {
  perror("sg_simple1: Inquiry write error");
  close(sg_fd);
  return 1;
}
 
if (read(sg_fd, readtocBuff, readtocOutLen) < 0) {
  perror("sg_simple1: Inquiry read error");
  close(sg_fd);
  return 1;
}
Auguri!
Ah, io cerco compagni per un progettino che mira ad implementare TUTTI i
comandi SCSI in uno o più programmi. Devo considerarti volontario? :-)


 librerie, potrebbe essere l'occasione di scriverne una. :-)
forse libcdaudio, ma non sono sicuro.
-- 
  /Kinkie
Se sulla scatola c'e` scritto "Per windows 95 e superiori", dovrebbe
funzionare sotto Linux, vero?

forse libcdaudio, ma non sono sicuro.
LA libreria è quella di Joerg Schilling compresa nella distribuzione di
cdrecord.


comandi SCSI in uno o più programmi. Devo considerarti volontario? :-)
Be', dopo che saro' riuscito a scrdinare il MediaMaster avro' fatto
sufficiente esperienza per propormi...
Bye


sufficiente esperienza per propormi...
Ci conto!
