Portál AbcLinuxu, 3. května 2025 14:08

Siemens MC45

Podpora: kompletní
Ovladač: dodává někdo jiný

Technické parametry

 

Identifikace pod Linuxem

ttyS14 at I/O 0x400 (irq = 3) is a 16C950/954

Postup zprovoznění pod Linuxem

Petr Vandrovec napsal patch a postnul jej do linux kernel mailing listu.

 

Je tam napsany i navod na zprovozneni.

(Smyslem patche je probudit MC45 ze sleep módu, ve kterém se nachází po startu. Jiná možnost, jak MC45 probudit je něj zavolat z jiného telefonu; to samozřejmě lze použít pouze k otestování funkčnosti bez nutnosti hned patchovat jádro, nikoliv k běžnému použití...)

Poznámka

1) Patch funguje a karta prijima AT prikazy na vanilla jadrech. Aplikovat patch do kernelu FC3 slo, ale karta nebezela. Podobnou zkusenost meli lidi i s MDK jadry.

 

2) Nevim jestli je nekde archiv lkml v plain textu a tak jsem ten patch vykousany z html dal sem.

 

3) Spojeni k inetu nahazuju takto:

rm /dev/modem &>/dev/null
ln -s /dev/ttyS14 /dev/modem >/dev/null
setserial -bG /dev/modem baud_base 1152000 &>/dev/null
nohup wvdial &>/dev/null &

4) cat /etc/wvdial.conf

[Dialer Defaults]
Modem = /dev/modem
Baud = 57600
Init1 = ATZ
Init2 = AT+CGDCONT=1,"IP","INTERNET"
Init3 =
Area Code =
Phone = *99***1#
Username = internet
Password = none
Ask Password = 0
Dial Command = ATDT
Stupid Mode = 1
Compuserve = 0
Force Address =
Idle Seconds = 0
DialMessage1 =
DialMessage2 =
ISDN = 0
Auto DNS = 1

 

Protože patch na Jikosových stránkách už není, dovolil jsem si ho přetisknout:

diff -urN linux/include/pcmcia/ciscode.h linux/include/pcmcia/ciscode.h
 --- linux/include/pcmcia/ciscode.h 2004-08-28 23:21:03.000000000 +0200
 +++ linux/include/pcmcia/ciscode.h 2004-08-28 23:36:24.000000000 +0200
 @@ -135,4 +135,7 @@
 
 #define MANFID_XIRCOM 0x0105
 
 +#define MANFID_POSSIO 0x030c
 +#define PRODID_POSSIO_GCC 0x0003
 +
 #endif /* _LINUX_CISCODE_H */
 diff -urN linux/drivers/serial/serial_cs.c linux/drivers/serial/serial_cs.c
 --- linux/drivers/serial/serial_cs.c 2004-08-28 23:19:58.000000000 +0200
 +++ linux/drivers/serial/serial_cs.c 2004-08-30 02:53:05.000000000 +0200
 @@ -44,6 +44,7 @@
 #include <linux/serial.h>
 #include <linux/serial_core.h>
 #include <linux/major.h>
 +#include <linux/delay.h>
 #include <asm/io.h>
 #include <asm/system.h>
 
 @@ -112,6 +113,8 @@
 int multi;
 int slave;
 int manfid;
 + int prodid;
 + int c950ctrl;
 dev_node_t node[4];
 int line[4];
 };
 @@ -127,6 +130,33 @@
 
 static dev_link_t *dev_list = NULL;
 
 +static void wakeup_card(struct serial_info *info)
 +{
 + int ctrl = info->c950ctrl;
 +
 + if (info->manfid == MANFID_OXSEMI) {
 + outb(12, ctrl + 1);
 + } else if (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC) {
 + /* request_region? oxsemi branch does no request_region too... */
 + /* This sequence is needed to properly initialize MC45 attached to OXCF950.
 + * I tried decreasing these msleep()s, but it worked properly (survived
 + * 1000 stop/start operations) with these timeouts (or bigger). */
 + outb(0xA, ctrl + 1);
 + msleep(100);
 + outb(0xE, ctrl + 1);
 + msleep(300);
 + outb(0xC, ctrl + 1);
 + msleep(100);
 + outb(0xE, ctrl + 1);
 + msleep(200);
 + outb(0xF, ctrl + 1);
 + msleep(100);
 + outb(0xE, ctrl + 1);
 + msleep(100);
 + outb(0xC, ctrl + 1);
 + }
 +}
 +
 /*======================================================================
 
 After a card is removed, serial_remove() will unregister
 @@ -191,6 +221,7 @@
 
 for (i = 0; i < info->ndev; i++)
 serial8250_resume_port(info->line[i]);
 + wakeup_card(info);
 }
 }
 
 @@ -554,15 +585,20 @@
 }
 
 /* The Oxford Semiconductor OXCF950 cards are in fact single-port:
 - 8 registers are for the UART, the others are extra registers */
 - if (info->manfid == MANFID_OXSEMI) {
 + 8 registers are for the UART, the others are extra registers.
 + Siemen's MC45 PCMCIA (Possio's GCC) is OXCF950 based too. */
 + if (info->manfid == MANFID_OXSEMI ||
 + (info->manfid == MANFID_POSSIO && info->prodid == PRODID_POSSIO_GCC)) {
 + int err;
 +
 if (cf->index == 1 || cf->index == 3) {
 - setup_serial(info, base2, link->irq.AssignedIRQ);
 - outb(12, link->io.BasePort1 + 1);
 + err = setup_serial(info, base2, link->irq.AssignedIRQ);
 + base2 = link->io.BasePort1;
 } else {
 - setup_serial(info, link->io.BasePort1, link->irq.AssignedIRQ);
 - outb(12, base2 + 1);
 + err = setup_serial(info, link->io.BasePort1, link->irq.AssignedIRQ);
 }
 + info->c950ctrl = base2;
 + wakeup_card(info);
 return 0;
 }
 
 @@ -622,9 +658,10 @@
 tuple.DesiredTuple = CISTPL_MANFID;
 if (first_tuple(handle, &tuple, &parse) == CS_SUCCESS) {
 info->manfid = le16_to_cpu(buf[0]);
 + info->prodid = le16_to_cpu(buf[1]);
 for (i = 0; i < MULTI_COUNT; i++)
 if ((info->manfid == multi_id[i].manfid) &&
 - (le16_to_cpu(buf[1]) == multi_id[i].prodid))
 + (info->prodid == multi_id[i].prodid))
 break;
 if (i < MULTI_COUNT)
 info->multi = multi_id[i].multi;

Dokument vytvořil: tomaso, 4.11.2004 08:50 | Poslední úprava: Petr Tomášek, 27.2.2011 15:07 | Další přispěvatelé: Bluebear | Historie změn | Zobrazeno: 1392×

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.