IrDA wbudowana nsc-ircc sposób na b

Wszystko związane z jądrem systemowym, sterownikami, sprzętem itp.
Awatar użytkownika
Gawron
Posty: 16
Rejestracja: 01 marca 2009, 20:13

IrDA wbudowana nsc-ircc sposób na błąd modułu.

Post autor: Gawron »

Witam.
Próbowałem połączyć Nokię 6610i z IBM ThinkPad 600X za pomocą IrDA.
Udało mi się uzyskać połączenie jedynie w trybie FIR po modyfikacji parametrów modułu.
Podaję szczegółowy opis sprzętu i procedury.
Oto chip mojego portu

Kod: Zaznacz cały

findchip -v
Found NSC PC87338 Controller at 0x2e, DevID=0x0b, Rev. 2
    SIR Base 0x2f8, FIR Base 0x2f8
    IRQ = 3, DMA = 1
    Enabled: yes, Suspended: no
    UART compatible: yes
    Half duplex delay = 0 us
i z debugowaniem

Kod: Zaznacz cały

findchip -dv
Found PC87338 chip, revision=2
Chip is in PnP mode
Found NSC PC87338 Controller at 0x2e, DevID=0x0b, Rev. 2
    SIR Base 0x2f8, FIR Base 0x2f8
    IRQ = 3, DMA = 1
    Enabled: yes, Suspended: no
    UART compatible: yes
    Half duplex delay = 0 us
lspci nie wykryło portu irda. Zainstalowałem pnputils i lspnp -v dało następujący wynik:

Kod: Zaznacz cały

00:05 IBM0071 IBM Thinkpad infrared port
    state = active
    io 0x2f8-0x2ff
    irq 3
    dma 1
Jeszcze dane z dmesg

Kod: Zaznacz cały

[   27.629225] nsc-ircc, chip->init
[   27.629237] nsc-ircc, Found chip at base=0x02e
[   27.629275] nsc-ircc, driver loaded (Dag Brattli)
[   27.630576] IrDA: Registered device irda0
[   27.630648] nsc-ircc, Found dongle: Differential serial interface
Wygląda na to, że system ładuje już na starcie sterownik niestety po module obsługi portów szeregowych. Oto wcześniejsze komunikaty dmesg:

Kod: Zaznacz cały

isapnp: Scanning for PnP cards...
[    4.397697] isapnp: No Plug & Play device found
[    4.410570] Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing enabled
[    4.410900] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[    4.412840] 00:03: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
cat /proc/interrupts nie wykazuje przerwań zajętych przez IrDA i COM. Przynajmniej ja nie mogłem ich odnaleźć.

Kod: Zaznacz cały

cat /proc/interrupts
            CPU0      
  0:     420024    XT-PIC-XT        timer
  1:       1839    XT-PIC-XT        i8042
  2:          0    XT-PIC-XT        cascade
  3:          4    XT-PIC-XT     
  4:          7    XT-PIC-XT     
  5:          3    XT-PIC-XT     
  6:          5    XT-PIC-XT        floppy
  7:          4    XT-PIC-XT        parport0
  8:          1    XT-PIC-XT        rtc0
  9:     177743    XT-PIC-XT        acpi
 10:          3    XT-PIC-XT     
 11:      13525    XT-PIC-XT        uhci_hcd:usb1, yenta, yenta, CS46XX
 12:     138490    XT-PIC-XT        i8042
 14:      72222    XT-PIC-XT        ide0
NMI:          0   Non-maskable interrupts
LOC:          0   Local timer interrupts
RES:          0   Rescheduling interrupts
CAL:          0   function call interrupts
TLB:          0   TLB shootdowns
TRM:          0   Thermal event interrupts
SPU:          0   Spurious interrupts
ERR:          0
MIS:          0
Ponieważ nie ma tu mojej irdy, myślę że jest to urządzenie ISA.
Sprawdziłem informacje o kanałach dma dla urządzeń ISA

Kod: Zaznacz cały

  cat /proc/dma
 1: irda0
 2: floppy
 4: cascade
i znalazłem irdę. Nie wiem tylko co oznacza cascade.
Teraz dane o portach szeregowych.

Kod: Zaznacz cały

 setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test

 setserial -a /dev/ttyS1
/dev/ttyS1: No such device
po włączeniu quickboot w BIOS

Kod: Zaznacz cały

/dev/ttyS1, Line 1, UART: unknown, Port: 0x02f8, IRQ: 3
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
Odwrotne ustawienie portów w Biosie daje wynik:

Kod: Zaznacz cały

 setserial -a /dev/ttyS0
/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test

 setserial -a /dev/ttyS1
/dev/ttyS1, Line 1, UART: 16550A, Port: 0x02f8, IRQ: 3
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test
Chociaż port jest widoczny, IrDA nadal nie działa prawidłowo.
Ustawienie IrDA na COM 2 (2f8) jest zalecane dla thinkpadów, dlatego ostatecznie pozostałem przy takim ustawieniu.
Rzeczywiste dane portu uzyskane z BIOS dzięki programowi ps2.exe for DOS firmy IBM to:

Kod: Zaznacz cały

ps2 ? ir
ADDress 1
DMA    3
IRQ      3
COMADDress 2F8
Prawdopodobnie sterownik ma drobny błąd polegający na złym rozpoznawaniu producenta chipsetu. Niestety nie jestem w stanie samodzielnie tego sprawdzić, bo nie znam się na programowaniu sterowników. Informację o błędzie znalazłem w starszych opisach patchy do sterownika. Zrezygnowałem z instalowania patcha, bo nie ma wersji do jądra 2.6.26 a poza tym kompilacja kernela na procesorze 450 MHz trwałaby cały dzień i działała do następnej aktualizacji.
Wydaje mi się, że informacja po załadowaniu modułu FIR

Kod: Zaznacz cały

 kernel: [ 9903.835088] nsc-ircc 00:05: activated
 kernel: [ 9903.835172] nsc-ircc, chip->init
 kernel: [ 9903.835184] nsc-ircc, Found chip at base=0x02e
 kernel: [ 9903.835222] nsc-ircc, driver loaded (Dag Brattli)
 kernel: [ 9903.839110] IrDA: Registered device irda0
 kernel: [ 9903.839125] nsc-ircc, Using dongle: IBM31T1100 or Temic TFDS6000/TFDS6500
 kernel: [ 9924.865030] IrCOMM protocol (Dag Brattli)
 irattach: executing: '/sbin/modprobe irda0'
 irattach: + FATAL: Module irda0 not found.
 irattach: Trying to load module irda0 exited with status 1
 irattach: executing: 'echo florens > /proc/sys/net/irda/devname'
 irattach: executing: 'echo 1 > /proc/sys/net/irda/discovery'
 irattach: Starting device irda0
potwierdza tezę o błędnych danych o producencie w module.
Wypróbowałem następujące metody połączenia.
1. SIR z użyciem irtty.
Uruchomienie irdy

Kod: Zaznacz cały

irattach /dev/ttyS1 -s
i nic nie działa
Dane z /var/log/messages

Kod: Zaznacz cały

Stopping device /dev/ttyS1
irattach: ioctl(SIOCGIFFLAGS): No such device
irattach: exiting ...
Wniosek nie da się uruchomić IrDA w trybie SIR
Próbowałem trochę powalczyć z setpnp
Niestety, aby setpnp mogło działać trzeba włączyć obsługę pnp w jądrze.
2. FIR
Sterownik FIR powinien się ładować przed modułem obsługi portów szeregowych inaczej IrDA jest zajęta przez zwykły port SIR i sterownik FIR nie może zainicjalizować chipa. Dlatego usunąłem

Kod: Zaznacz cały

rmmod irtty-sir sir-dev nsc-ircc ircomm-tty ircomm
dało wynik

Kod: Zaznacz cały

ERROR: Module ircomm_tty does not exist in /proc/modules
ERROR: Module ircomm does not exist in /proc/modules
ale nie zaszkodzi upewnić się, czy wszystkie moduły SIR zostały usunięte.
Wyłączyłem połączenie szeregowe

Kod: Zaznacz cały

setserial /dev/ttyS1 uart none
Załadowałem moduł z parametrami zgodnymi z ustawieniami biosu uzyskanymi wcześniej za pomocą narzędzia ps2.exe for DOS firmy IBM.

Kod: Zaznacz cały

modprobe nsc-ircc dongle_id=9 io=0x2f8 irq=3 dma=3
Ograniczyłem prędkośc transferu, dla irdy telefonu komórkowego. Wydaje mi się, że szybszy transfer spowoduje problemy w połączeniu. Bez tego wpisu komputer nie łączył się z telefonem. SIR pozwala na prędkości 115200.

Kod: Zaznacz cały

echo 115200 > /proc/sys/net/irda/max_baud_rate
uruchomiłem sterownik IrCOMM > szeregowy TTY

Kod: Zaznacz cały

modprobe ircomm-tty

Kod: Zaznacz cały

irattach irda0 -s
i połączenie z telefonem się udało
Teraz bardzo istotna uwaga. Sprawdzanie wpisów /proc/sys/net/irda/discovery czasami nie daje żadnych wyników, jedynie zapis 1. irdadump pokazuje jednak połączenie z telefonem, a ifconfig ilość wysłanych i pobranych danych z interfejsu irda0. Początkowo sugerowałem się brakiem wyników w logu discovery i błędnie myślałem, że IrDA jest niesprawna.
Mam pytanie dotyczące wpisu /etc/modutils/irda-utils, czy
alias tty-ldisc-11 irtty nie powinien być alias tty-ldisk-11 irtty-sir. Według linux irda how to od jądra 2.6 irtty zmienił się na irtty-sir.
Sptkałem się również z opinią według której wszystkie wpisy w irda-utils są nieważne dla jądra 2.6. Nie wiem na ile jest to zgodne z prawdą.
Gdyby ktoś chciał uruchomić ps2exe bez partycji DOS na dysku można pobrać obraz dyskietki freeDOS uruchomić freeDOS wyjąć dyskietkę po załadowaniu programu wstawić 2 dyskietkę z następującymi programami przekopiowanymi z programu ps2 for DOS
aodbsmd.ddp
aodbsmd.sys
diskdo
diskdo.id
diskdo.ver
helpmsg1.dat
helpmsg2.dat
helpmsg3.dat
paranum3.dat
ps2.exe
ps2.msg
ps2.ver
ps2a.idp
ps2main.exe
ps2n.idp
ps2vdd.dll
routine1.dat
routine2.dat
routine3.dat
routine4.dat
routine5.dat
utildos2.rsp
i można korzystać z ps2. Jedyną wadą takiego rozwiązania jest wolniejsza praca programu.
Po zmianie wszystkich ustawień należy zrestartować system małpim chwytem ctrl+alt+Delete. Wyłączenie komputera spowoduje utratę zmian.
Przepraszam, za bardzo długi opis, ale chciałem opisać wszystkie moje próby, żeby oszczędzić wam powtarzania nieskutecznych metod na uruchomieni tego dosyć kłopotliwego sprzętu.
Gdyby komuś udało się uruchomić irdę w trybie SIR na sterowniku nsc-ircc na starym ThinkPadzie, prosiłbym o opis jak tego dokonał.
Problem rozwiązany w małej dystrybucji Slitaz 4 (kernel 2.6.37), bo ten stary laptop jest za mało wydajny na Wheezy.

Teraz nie trzeba podawać żadnych parametrów dla modułu. Nie trzeba nawet zmieniać prędkości transferu.
Wystarczą 3 polecenia
[LEFT]modprobe nsc-ircc [/LEFT]
[LEFT]modprobe irtty-sir
[/LEFT]
[LEFT]ifconfig irda0 up[/LEFT]
[LEFT]Drugie polecenie uruchamia irdę w trybie sir. Port irdy to /dev/ttyS1[/LEFT]
[LEFT]W dystrybucji Slitaz trzeba samodzielnie skompilować moduł nsc-ircc, ale to nie dotyczy Debiana, więc pomijam opis kompilacji.[/LEFT]
fnmirk
Senior Member
Posty: 8282
Rejestracja: 03 grudnia 2007, 06:37

Post autor: fnmirk »

Odświeżenie tematu.
ODPOWIEDZ