-íåèçâåñòíî

 -Ïîèñê ïî äíåâíèêó

Ïîèñê ñîîáùåíèé â CrazyAdmin_Admin

 -Ïîäïèñêà ïî e-mail

 

 -Ñòàòèñòèêà

Ñòàòèñòèêà LiveInternet.ru: ïîêàçàíî êîëè÷åñòâî õèòîâ è ïîñåòèòåëåé
Ñîçäàí: 30.10.2009
Çàïèñåé:
Êîììåíòàðèåâ:
Íàïèñàíî: 298


Íàñòðîéêà ðàáîòû CDMA ìîäåìà ÷åðåç /dev/ttyACM0

Ïîíåäåëüíèê, 16 Íîÿáðÿ 2009 ã. 00:46 + â öèòàòíèê
Îêðóæåíèå

ÎÑ - Fedora 11 (Russian Remix). ßäðî 2.6.29.4-167.fc11.i686.PAE. Mîäåì Maxon
Minimax MM-5500U (CDC ACM ìîäåì). Ôàéëû /etc/wvdial.conf, /etc/resolv.conf
íàñòðîåíû âåðíî. Èñïîëüçóåòñÿ âåðíî íàñòðîåííàÿ ïðîãðàììà äîçâîíà
chestnut-dialer (âåð. 0.3.3) (õîòÿ ìîæíî è áåç íåå åñëè óñòàíîâëåí wvdial).

Ñèòóàöèÿ 1.

Çàãðóæàåòñÿ ÎÑ. Ìîäåì îòêëþ÷åí. Çàòåì ìîäåì âêëþ÷àåòñÿ è äîçâîí íåâîçìîæåí,
ïîñêîëüêó îòñóòñòâóåò ôàéë óñòðîéñòâà /dev/ttyACM0.

Ìîíèòîðèíã êîìàíäîé udevadm monitor ïîêàçûâàåò, ÷òî åãî óäàëÿåò ÿäðî è çàòåì Udev.

Ñèòóàöèÿ 2. 

Çàãðóæàåòñÿ ÎÑ. Ìîäåì âêëþ÷åí. Äîçâîí âîçìîæåí (ôàéë óñòðîéñòâà /dev/ttyACM0
ñóùåñòâóåò). Ìîäåì îòêëþ÷àåòñÿ - ôàéë  óñòðîéñòâà /dev/ttyACM0 ïðîïàäàåò. Ïðè
ïîâòîðíîì âêëþ÷åíèè ìîäåìà ôàéë óñòðîéñòâà îòñóòñòâóåò.  èòîãå äîçâîí íåâîçìîæåí.

Ðåøåíèå.

Ïîäîáíûå ñèòóàöèè âîçíèêàëè, â ÷àñòíîñòè, è â Ubuntu 9.10 è â íåêîòîðûõ äðóãèõ
Linux. Èç ôîðóìîâ âèäíî, ÷òî ïðîáëåìó ðåêîìåíäóþò ðåøàòü ïåðåçàãðóçêîé ìîäóëÿ
ÿäðà cdc-acm è ñîçäàíèåì ôàéëà óñòðîéñòâà â êîìàíäíîì ðåæèìå. Ðåêîìåíäóþò òàêæå
àâòîìàòèçàöèþ ïðè ïîìîùè ïðàâèë udev. Âîçìîæíà äàæå ñèòóàöèÿ êîãäà èìååì ïîñëå
íåñêîëüêèõ plug/unplug ìîäåìà ìíîæåñòâî /dev/ttyACM0..n. È ìîäåì íå
ðàñïîçíàåòñÿ. Ïðàâèëà udev ïîìîãàþò íå âñåãäà (óñòàíîâëåíî ýêñïåðèìåíòàëüíî).

Ñâÿçü ñ ìîäåìîì ìîæíî óñòàíîâèòü è ïðè ïîìîùè ïðåäñòàâëåííîé íèæå 
ñïåöèàëüíî ðàçðàáîòàííîé ïðîãðàììû (òåñòèðîâàëàñü íà Fedora 11 Russian Remix) è
Ubuntu 9.10 (âåðñèè udev 141 è 147 ñîîòâåòñòâåííî).


 // File minimaxd.c
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>
#include <syslog.h>
#define TMP_FILE__PID "/tmp/minimaxd.pid"
#define TMP_FILE__LSUSB "/tmp/lsusbminimax.tmp"
#define PATH_CDC_ACM_MODULE "/sys/module/cdc_acm/initstate"
#define PATH_MODEM_TTY "/dev/ttyACM0"
#define CHECK_MODEM_PLUG_STR "lsusb | grep Qualcomm > /tmp/lsusbminimax.tmp"
int fileexist(const char* filename);
void kill_copy_daemon();
void start_restart();
void stop();
int CheckPlugModem();
void wait_cdc_acm_control();
int CheckPid();
void SetPid();
int GetPid();
void PrintMessageToLog(char* szMessage);
int main(int argc, char* argv[])
{
if(argc==2)
{
if((!strcmp("start",argv[1]))||(!strcmp("restart",argv[1])))
{
kill_copy_daemon();
wait_cdc_acm_control();
}
else
if(!strcmp("stop",argv[1])) kill_copy_daemon();
}
else
{
printf("Start/Restart MiniMax Modem Access:\nminimaxd start|stop|restart\n");
printf("Background start:\nminimaxd start &\n");
}
return 0;
}
int fileexist(const char* filename)
{
int res = 0;
FILE* f=fopen(filename,"rt");
if(f!=NULL) { fclose(f); res=1; }
return res;
}
void kill_copy_daemon()
{
char cmd[255]="";
int pid = GetPid();
if(pid>0)
{
kill((pid_t)(pid), SIGKILL);
strcpy(cmd,"rm -f "); strcat(cmd,TMP_FILE__PID); system(cmd);
strcpy(cmd,"rm -f "); strcat(cmd,TMP_FILE__LSUSB); system(cmd);
PrintMessageToLog("Modem service is stopped");
}
}
void start_restart()
{
system("rm -f /dev/modem");
system("rm -f /dev/ttyACM*");
system("rmmod cdc-acm");
system("modprobe cdc-acm");
system("mknod /dev/ttyACM0 c 166 0");
system("chmod 666 /dev/ttyACM*");
system("ln -s /dev/ttyACM0 /dev/modem");
PrintMessageToLog("Modem service started");
}
void stop()
{
system("rmmod cdc-acm");
system("rm -f /dev/modem");
system("rm -f /dev/ttyACM*");
PrintMessageToLog("Modem service is stopped");
}
int CheckPlugModem()
{
char str[255]="";
int res = 0;
system(CHECK_MODEM_PLUG_STR);
sleep(2);
FILE* f=fopen(TMP_FILE__LSUSB,"rt");
if(f!=NULL)
{
strcpy(str,"");
fscanf(f,"%s",str);
fclose(f);
if(strlen(str)>0) res = 1;
}
return res;
}
void wait_cdc_acm_control()
{
int fl_CDC_ACM_OK=0;
int fl_ttyACM0_OK=0;

if(!CheckPid())
{
SetPid();

while(1)
{
fl_CDC_ACM_OK=fileexist(PATH_CDC_ACM_MODULE);
if(CheckPlugModem())
{
fl_ttyACM0_OK=fileexist(PATH_MODEM_TTY);

if((fl_CDC_ACM_OK==1)&&(fl_ttyACM0_OK==0)) start_restart();
else
if((fl_CDC_ACM_OK==0)&&(fl_ttyACM0_OK==0)) start_restart();
}
else
{
if(fl_CDC_ACM_OK) stop();
}
sleep(3);
}
}
}
int CheckPid()
{
return fileexist(TMP_FILE__PID);
}
void SetPid()
{
pid_t pid = getpid();
FILE* f=fopen(TMP_FILE__PID,"wt");
if(f!=NULL)
{
fprintf(f,"%d",pid);
fclose(f);
}
}
int GetPid()
{
int res = 0;
FILE* f=fopen(TMP_FILE__PID,"rt");
if(f!=NULL)
{
fscanf(f,"%d",&res);
fclose(f);
}
else res = -3;
return res;
}
void PrintMessageToLog(char* szMessage)
{
openlog("MINIMAXD", LOG_ODELAY, LOG_USER);
syslog(LOG_INFO, "%s", szMessage);
closelog();
}
Êîìïèëÿöèÿ êîìàíäîé: gcc ./minimaxd.c -o minimaxd
Äëÿ 64-ðàçðÿäíîé âåðñèè: gcc ./minimaxd.c -m64 -o minimaxd
Ïîëó÷åííûé minimaxd êîïèðóåì â êàòàëîã /usr/local/bin/ Íàçíà÷àåì âëàäåëüöåì root. Òåñòèðîâàíèå. Çàïóñê ïðîãðàììû èç êîììàíäíîé ñòðîêè âûïîëíÿåì òàê:
# minimaxd start
èëè â ôîíå: # minimaxd start &
Ïîäêëþ÷àåì ìîäåì ê usb-ïîðòó, æäåì èíèöèàëèçàöèè îêîëî 5 ñåê. Çàòåì ïðîáóåì äîçâîí. Ïðåðûâàåì äîçâîí. Îòñîåäèíÿåì ìîäåì, ïîäñîåäèíÿåì çàíîâî è ÷åðåç 5 ñåê. ïîâòîðÿåì ïðîöåäóðó. Åñëè âñå Ok, òî çàâåðøàåì ïðîöåäóðó òåñòèðîâàíèÿ. Äëÿ çàâåðøåíèÿ ðàáîòû minimaxd, ðàáîòàþùåé â ôîíå, â äðóãîé êîíñîëè âûïîëíÿåì: # minimaxd stop
Çàïóñê ïðè çàãðóçêå ÎÑ. Â êàòàëîãå /etc/rc.d/init.d ñîçäàåì óïðîùåííûé ñêðèïò (ôàéë minimaxdaemon) äëÿ ìåíåäæìåíòà "äåìîíà": #!/bin/sh
# startup script for Minimax daemon (/usr/local/bin/minimaxd)
DAEMON=/usr/local/bin/minimaxd
minimaxdaemon_start ()
{
echo -n "Starting ${DAEMON}: "
${DAEMON} start &
}
minimaxdaemon_stop ()
{
echo -n "Shutting down ${DAEMON}: "
${DAEMON} stop
}
minimaxdaemon_restart ()
{
echo -n "Restarting ${DAEMON}: "
${DAEMON} restart &
}

case $1 in
start)
minimaxdaemon_start
;;

stop)
minimaxdaemon_stop
;;

status)
echo "${DAEMON}:" `pidof ${DAEMON}`
;;

restart)
minimaxdaemon_restart
;;

*)
echo "Usage: minimaxdaemon {start|stop|restart|status}"
exit 1
;;
esac
exit 0
Ñîçäàåì íà minimaxdaemon ñèìâîëè÷åñêèå ññûëêè â êàòàëîãàõ rc?.d. Íàïðèìåð, äëÿ Fedora 11 (Russion Remix): ln -s /etc/rc.d/init.d/minimaxdaemon /etc/rc.d/rc0.d/K01minimaxdaemon
ln -s /etc/rc.d/init.d/minimaxdaemon /etc/rc.d/rc6.d/K01minimaxdaemon
ln -s /etc/rc.d/init.d/minimaxdaemon /etc/rc.d/rc5.d/S96minimaxdaemon
Òåïåðü ìîæíî ïðîâåðèòü ðàáîòó minimaxd ïîñëå ïåðåçàãðóçêè. Çàêëþ÷åíèå Ñëåäóåò îòìåòèòü, ÷òî ýòî âñå âåðíî â ñëó÷àå, åñëè â ÿäðå ñóùåñòâóåò ïîääåðæêà ìîäóëÿ cdc-acm. Çàäåðæêè (ôóíêöèè sleep) ìîãóò áûòü âûáðàíû èíûå. Ïðèìåð ìîæíî ðàññìàòðèâàòü è äëÿ äðóãèõ ïîäîáíûõ ìîäåìîâ, ðàáîòàþùèõ ÷åðåç cdc-acm-ìîäóëü è èñïîëüçóþùèõ /dev/ttyACM0-ôàéë. Îäíàêî, íàäî ó÷åñòü, ÷òî äëÿ îïðåäåëåíèÿ â ñèñòåìå ìîäåìà èñïîëüçóåòñÿ êîìàíäà lsusb è â äàííîì ñëó÷àå îíà â ïðîãðàììå òàêàÿ: lsusb | grep Qualcomm > /tmp/lsusbminimax.tmp
Ò.å. ïîäðàçóìåâàåòñÿ, ÷òî ìîäåì îïðåäåëÿåòñÿ, íàïðèìåð, êàê: Bus 009 Device 003: ID 05c6:3196 Qualcomm, Inc. CDMA Wireless Modem
Ïîýòîìó â ïðîãðàììå è ôèëüòðóåì ïî ñëîâó "Qualcomm".  ñëó÷àå äðóãèõ ïðîèçâîäèòåëåé óïðàâëÿþùóþ êîìàíäó íàäî áóäåò èçìåíèòü.
Ðóáðèêè:  Linux + Hosting + Admin

 

Äîáàâèòü êîììåíòàðèé:
Òåêñò êîììåíòàðèÿ: ñìàéëèêè

Ïðîâåðêà îðôîãðàôèè: (íàéòè îøèáêè)

Ïðèêðåïèòü êàðòèíêó:

 Ïåðåâîäèòü URL â ññûëêó
 Ïîäïèñàòüñÿ íà êîììåíòàðèè
 Ïîäïèñàòü êàðòèíêó