Лоток CDROM
Здравствуйте ВСЕ!
Подскажите пожалуйста как программно определить положение лотка CDROM'а
(открыт|закрыт). Насколько я понимаю с помощью сценария это сделать
невозможно.
За последние 60 дней ни разу не выходила
Сайт листа:
http://www.linuxrsp.ru
Открыт:
25-07-2003
Пре-модерация: Нет
Адрес для писем в лист: comp.soft.linux.discuss-list@subscribe.ru
Адрес
модератора: comp.soft.linux.discuss-owner@subscribe.ru
Здравствуйте ВСЕ!
Подскажите пожалуйста как программно определить положение лотка CDROM'а
(открыт|закрыт). Насколько я понимаю с помощью сценария это сделать
невозможно.
В Вск, 20 Мар 2005 в 13:21:37 +0200, Yura Kalinichenko написал(а):
Это все я изучал, но вразумительного ответа для себя не получил,
поэтому и спрашиваю.
Не люблю я все это, они "умничает" не так как мне надо.
Здравствуйте, by_.
Вы писали 20 марта 2005 г., 3:57:27:
#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;
int cdrom;
/*
............
*/
cdrom = fopen("/dev/hdb0", O_RDONLY | O_NONBLOCK);
if(cdrom < 0)
{
printf("can`t open cd-rom device. fopen error");
return 1;
}
result = ioctl (cdrom, CDROM_DRIVE_STATUS, 0);
switch(result)
{
case -1:
printf("ioctl error. can`t get cd-rom status\n");
break;
case CDS_DISC_OK:
printf ("Disc in drive\n");
break;
case CDS_NO_DISC:
printf ("Empty drive\n");
break;
case CDS_TRAY_OPEN:
printf ("cd-rom opened\n");
break;
case CDS_DRIVE_NOT_READY:
printf ("cd-rom not ready.\n");
break;
case CDS_NO_INFO:
printf ("no information\n");
break;
default:
printf ("unknown drive status\n");
break;
}
/*
.............
*/
close(cdrom);
}
писал по памяти, но вроде должно работать =) тут главное суть уловить.
В Вск, 20 Мар 2005 в 15:00:50 +0300, br0adcasT написал(а):
--cut--
Все работает, суть уловил, но возвращает только есть или нет диск, а про то
открыт или закрыт трей молчит как партизан.
Нашел в Documentation/cdrom/cdrom-standard
2.5 Int tray_move(struct cdrom_device_info *cdi, int position)
This function, if implemented, should control the tray movement.
(No other function should control this.) The parameter position
controls the desired direction of movement:
0 Close tray
1 Open tray
This function returns 0 upon success, and a non-zero value upon error.
Note that if the tray is already in the desired position, no action
need be taken, and the return value should be 0.
но если это добавить, то компилятор ругается :
In function `main':
warning: `struct cdrom_device_info' declared inside parameter list
warning: its scope is only this definition or declaration, which is probably
not what you want.
и возвращается нереальное значение, причем одно и тоже в независимости от
положения трея. И что с этим делать я не знаю.
On Sun, 20 Mar 2005 05:57:27 +0500
by_ <by***@m*****.ru> wrote:
Я как то задавал этот вопрос (http://subscribe.ru/archive/comp.soft.linux.discuss/msg/229640).
Правда так и не смог разобраться с проблемой.
Судя по содержанию /usr/include/linux/cdrom.h
#define CDS_NO_INFO 0 /* if not implemented */
#define CDS_NO_DISC 1
#define CDS_TRAY_OPEN 2
#define CDS_DRIVE_NOT_READY 3
#define CDS_DISC_OK 4
можно определить состояние лотка (открыт | закрыт), и если закрыт, то есть или
нет диск.
Однако реально у меня происходит только определение наличия диска. Подозреваю
глючное
железо на своей машине. Если хочешь, проверь на своей.
<!-- cd_info.c -->
#include <stdio.h>
#include <sys/types.h>
#include <linux/types.h>
#include <fcntl.h>
#include <linux/cdrom.h>
int main(void)
{
int cdrom;
int status;
cdrom = open("/dev/cdrom", O_RDONLY | O_NONBLOCK);
status = ioctl(cdrom, CDROM_DRIVE_STATUS);
printf("Возврат drive status: %d\n", status);
status = ioctl(cdrom, CDROM_DISC_STATUS);
printf("Возврат disc status: %d\n", status);
close(cdrom);
}
<!-- cd_info.c -->
Буду рад, если помог. В. Ковалев.
-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 16918; Возраст листа: 604; Участников: 1348
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/336724
В Вск, 20 Мар 2005 в 16:50:45 +0600, Владимир Ковалев написал(а):
или
Тоже самое, глючность железа тут ни причем, проверил на 3 разных приводах.
On Mon, 21 Mar 2005 05:22:38 +0500
by_ <by***@m*****.ru> wrote:
ИМХО собака порылась где-то в автоматическом монтировании или каких-то
довесках, работающих с железом, ну не минуя ядро, но все-таки более, менее
самостоятельно.
Раньше времени не было разбираться, сейчас, пока на больничном, попробую.
Еще есть подозрение, что данная фишка создавалась для аудио дисков.
На эту мысль наводит название констант CDS_, что такое CD понятно,
а что такое S, sound или просто совпадение. Если кто разберется, плиз,
не забывайте про тех, кто не разобрался.
В. Ковалев.
-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 16969; Возраст листа: 605; Участников: 1346
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/337218
Владимир Ковалев wrote:
int main()
{
int result;
int cdrom;
/*
............
*/
cdrom = open("/dev/hdd", O_RDONLY | O_NONBLOCK);
if(cdrom < 0)
{
printf("can`t open cd-rom device. fopen error");
return 1;
}
result = ioctl (cdrom, CDROM_DRIVE_STATUS, 0);
switch(result)
{
case -1:
printf("ioctl error. can`t get cd-rom status\n");
break;
case CDS_DISC_OK:
printf ("Disc in drive\n");
break;
case CDS_NO_DISC:
printf ("Empty drive\n");
break;
case CDS_TRAY_OPEN:
printf ("cd-rom opened\n");
break;
case CDS_DRIVE_NOT_READY:
printf ("cd-rom not ready.\n");
break;
case CDS_NO_INFO:
printf ("no information\n");
break;
default:
printf ("unknown drive status\n");
break;
}
/*
.............
*/
close(cdrom);
}
Причем отлично определяет наличие в приводе как диска с данными так и
аудио-диска. Проверьте, в ранее представленном примере была допущена
ошибка. Вместо fopen надо писать open. В принципе у меня из-за этого и
компиляция не пошла. А сидюк у меня висит на /dev/hdd как вы заметили.
Незнаю что у вас не так?
p.s. У меня Mandrake 10.1 и сидюк TEAC... :-P
-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 16987; Возраст листа: 605; Участников: 1346
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/337403
В сообщении от 1111427757 секунд после начала Эпохи Unix Вы написали:
У меня Fedora Core 3, ядро 2.6.10 и сидюк Cyber Drive (12X).
При открытом лотке показывает "Empty drive"; при закрытом, но без
диска тоже "Empty drive"; при закрытом и с диском - "Disc in drive".
Думаю, это свойство железки.
В Пнд, 21 Мар 2005 в 20:49:49 +0200, Konstantin Korikov написал(а):
Вот об это и идет речь.
Странно но в офтопике это свойство никак не проявляется
Здравствуйте, by_.
Вы писали 22 марта 2005 г., 3:10:24:
А вот так попробуйте (пардон, кстати, за 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);
}
В Втр, 22 Мар 2005 в 22:28:12 +0300, br0adcasT написал(а):
Большое спасибо, это то что надо, работает как надо, а самое главное понятен
смысл как это все работает.
В Пнд, 21 Мар 2005 в 19:55:57 +0300, webus написал(а):
У меня не так то, что не определяется открыт|закрыт трей, а вот с определением
наличия|отсутствия диска в приводе у меня проблем нет все работает отлично.
В Пнд, 21 Мар 2005 в 17:39:14 +0600, Владимир Ковалев написал(а):
Всяческими "авто" приблудами не только не пользуюсь, они даже не установлены,
так что дело здесь скорее всего в драйвере cdrom'а.
S судя по всему от STATUS
В Вск, 20/03/2005 в 05:57 +0500, by_ пишет:
/usr/src/linux/Documentation/cdrom
/usr/include/linux/cdrom.h
А нужно ли ? Особенно при нынешнем распространении autofs, subfs,
supermount...