Re[2]: Лоток CDROM
Здравствуйте, by_.
Вы писали 22 марта 2005 г., 3:10:24:
>> При открытом лотке показывает "Empty drive"; при закрытом, но без
>> диска тоже "Empty drive"; при закрытом и с диском - "Disc in drive".
b> Вот об это и идет речь.
А вот так попробуйте (пардон, кстати, за fopen =( не в ту степь
занесло прошлый раз):
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main()
{
int result, i;
int cdrom;
struct cdrom_generic_command cmd;
__u8 data[0x08];
// будем принимать от привода 8 байт
// это размер заголовка его статуса
//
// за ним могут идти по 4-е байта на каждый слот
// но нам оно не надо вроде =)
//
cdrom = open("/dev/sr0", O_RDONLY | O_NONBLOCK);
if(cdrom < 0)
{
printf("can`t open cd-rom device. fopen error");
return 1;
}
//
memset(data, 0, 0x08);
memset(&cmd, 0, sizeof(struct cdrom_generic_command));
cmd.data_direction = CGC_DATA_READ;
// мы принимаем данные
cmd.cmd[0] = 0xBD;
// команда "MECHANISM STATUS"
//
cmd.cmd[8] = 0x08;
// в 8,9 байты нужно записать размер буфера для данных
cmd.buffer = data;
cmd.buflen = 0x08;
result = ioctl(cdrom, CDROM_SEND_PACKET, &cmd);
if(result == -1)
printf("ioctl error\n");
if(data[1]&0x10)
printf("cdrom opened\n");
else
printf("cdrom closed\n");
// в спецификации INF-8020 биты 0-4
// 2-го байта заголовка помечены как "reserved"
// так что может работать по разному на различных приводах
//
/*
for(i=0; i<0x08; i++)
//if(data[i] != 0)
printf("[%i] = %i\n", i, data[i]);
*/
close(cdrom);
}