Portál AbcLinuxu, 3. května 2025 14:08
Podpora: | kompletní |
Ovladač: | dodává někdo jiný |
ttyS14 at I/O 0x400 (irq = 3) is a 16C950/954
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í...)
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:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.