Top / zaurus
 

Sharp Zaurus を最新の状態で使うための走り書き (主にSL-C4桁用)

 
 

小言

  • iPad・iPhone / Android がメジャーになったおかげで Zaurus 安い!
  • タイプメインで使うにはタッチパネルが嫌になる。 qwerty キーボードを押したくなる! (BlackBerry は別)
     

準備

コマンドの入ってるパッケ

  • moreとか --> busybox
  • lessとか --> armutils

使うカーネル

  • darkstar v55
    • cacko/tetsuスペシャルカーネル/pdaXrom等のパッチ全部入り
    • SDHCも対応
    • SharpROM互換 (HancomSheet等がそのまま使える)
       #cat /proc/version
       Linux version 2.4.20 (darkstar@aleijos) (gcc version 2.95.3 20010315 (release)) #1 Tue, 24 Jul 2007 16:57:24 +0200
  • ROM ( zImage ) の他、カーネルツリーも v55 と同じホストにある。
  • クロスコンパイラ類も同じホストにある。
    • ホスト上にある(arm-cacko-linux-gnu-)gcc のバージョンは 2.95.3 @ 2011
 

クロスコンパイル

カーネル

  • ディストロは多分なんでもいい。
  1. カーネルツリー展開
  2. クロスコンパイラ展開
  3. クロスコンパイラにパスを通す
  4. CROSS_COMPILE=/opt/〜/arm-cacko-linux-gnu- みたいにして export
  5. make、または v55 に入ってる makeall.sh でバッチビルド

ドライバ

  • 普通のドライバコンパイルと一緒
  1. カーネルツリーの場所指定 ※カーネルツリーが無いとか言われたら
  2. クロスコンパイラにパスを通す
  3. CROSS_COMPILE=/opt/〜/arm-cacko-linux-gnu- みたいにして export
  4. make
  • firmware 関係でリンクエラーが出るときは
    1. 真面目に firmware を読み込むシンボルを探してリンクする。 firmware の置き場所にも注意。
    2. 不真面目に firmware をドライバに埋め込む
      1. なんかのツールでバイナリを C の16進表記に変換してソースコードに入れとく
        UCHAR g_FirmwareImage[] = { 0x00, 0x01, 0x02, ... };
        INT const g_FirmwareImageLength = sizeof( g_FirmwareImage ) / sizeof( UCHAR );
        
      2. firmware を読むところで上のデータを読ませる

ドライバの問題

  • USB機器
    • v55 にしてから、これまで使えていた USB機器がドライバに認識されなくなった。
      • 確認済み
      1. カーネル (usb.c) は正常に idVendor:idProduct を認識
      2. depmod insmod でのエラーは無し
      3. きちんと kernel 2.5 以下用の probe( struct usb_device*, ... ) が呼ばれている。
        間違って kernel 2.6.* 用の probe( struct usb_interface*, ... ) が呼ばれているわけではない。
      • 検証中
      1. カーネルがコールする、ドライバ側 struct usb_driver メンバ "probe" に渡される 第1引数 struct usb_device* の内容またはその取扱いが変
        Top / zaurus / cross / driver / s0001
        1. struct usb_device のダンプには、idVendor と idProduct に入るべき正常な値が入っているものの、
          ドライバ側のprobe( struct usb_device* dev, ... ) 関数で、dev->descriptor.idVendor は誤った場所を読んでる。


        • 青いところが struct usb_device の正しい descriptor メンバ
        • 橙いところが struct usb_device の正しい descriptor->idVendor と descriptor->idProduct メンバ
        • 赤いところが struct usb_device を誤って読んだせいでオカしくなった idVendor と idProduct

        #dmesg ...

        x: [usb_device] ---- DUMP START ---- 04 00 00 00 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 30 2a c1 c3 30 2a c1 c3 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 24 c1 c3 40 5c f0 c2 12 01 00 02 00 00 00 40 -- -- -- -- 01 00 01 02 00 01 00 00 e0 01 f8 c3 e0 01 f8 c3 e0 f9 c9 c3 ff ff ff ff 09 04 00 00 00 d0 9b c5 a0 b1 92 c3 a0 b1 92 c3 04 2b c1 c3 04 2b c1 c3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00 00 00 80 00 00 00

        x: usb_usb_probe: sizecheck: int 4, char 1, pointer 4, semaphore 20 x: usb_usb_probe: idVendor 0xf9e0, idProduct 0xc3c9 x: usb_usb_probe: invalid descriptor. usb.c: USB device 4 (vend/prod 0x----/0x----) is not claimed by any active driver. Length = 18 DescriptorType = 01 USB version = 2.00 Vendor:Product = ----:---- MaxPacketSize0 = 64 NumConfigurations = 1 Device version = 0.01 Device Class:SubClass:Protocol = 00:00:00 ...

        devnum 04 00 00 00 devpath 32 2e 31 00 00 00 00 00 00 00 00 00 00 00 00 00 speed 02 00 00 00 tt 00 00 00 00 ttport 00 00 00 00 refcnt 02 00 00 00 serialize 00 00 00 00 00 00 00 00 00 00 00 00 30 2a c1 c3 30 2a c1 c3 exclusive_access 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 toggle 40 00 00 00 00 00 00 00 halted 00 00 00 00 00 00 00 00 epmaxpackin 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 00 : 40 00 00 00 40 00 00 00 40 00 00 00 40 00 00 00 epmaxpackout 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 : 00 00 00 00 00 00 00 00 00 00 00 00 00 24 c1 c3 : 40 5c f0 c2 12 01 00 02 00 00 00 40 -- -- -- -- parent 01 00 01 02 bus 00 01 00 00 descriptor .bLength e0 .bDescriptorType 01 .bcdUSB f8 c3 .bDeviceClass e0 .bDeviceSubClass 01 .bDeviceProtocol f8 .bMaxPacketSize0 c3 .idVendor e0 f9 .idProduct c9 c3



        原因の候補:

        1. ドライバのコンパイルオプションがオカシイ
        2. 型のサイズが合ってない
        3. 構造体のアライメントのせい


        参考: kernel-source-root/linux/include/usb.h

        struct usb_device_descriptor {

        __u8bLength;
        __u8bDescriptorType;
        __u16bcdUSB;
        __u8bDeviceClass;
        __u8bDeviceSubClass;
        __u8bDeviceProtocol;
        __u8bMaxPacketSize0;
        __u16idVendor;
        __u16idProduct;
        __u16bcdDevice;
        __u8iManufacturer;
        __u8iProduct;
        __u8iSerialNumber;
        __u8bNumConfigurations;

        } __attribute__ ((packed));

        #define USB_MAXCHILDREN (16) struct usb_device {

        intdevnum;
        chardevpath[16];
        enum{
        USB_SPEED_UNKNOWN = 0,
        USB_SPEED_LOW, USB_SPEED_FULL,
        USB_SPEED_HIGH
        }speed;
        struct usb_tt*tt;
        intttport;
        atomic_trefcnt;
        struct semaphoreserialize;
        struct semaphoreexclusive_access;
        unsigned inttoggle[2];
        unsigned inthalted[2];
        intepmaxpacketin[16];
        intepmaxpacketout[16];
        struct usb_device*parent;
        struct usb_bus*bus;
        struct usb_device_descriptordescriptor;
        struct usb_config_descriptor*config;
        struct usb_config_descriptor*actconfig;
        char**rawdescriptors;
        inthave_langid;
        intstring_langid;
        void*hcpriv;
        struct list_headinodes;
        struct list_headfilelist;
        intmaxchild;
        struct usb_device*children[ USB_MAXCHILDREN ];

        };


トップ 編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード 新規 一覧 単語検索 最終更新 リンク元 ヘルプ 最終更新のRSS xenowire
Last-modified: Thu, 25 Jan 2018 15:13:51 JST