[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:23981] Re: Potato PCMCIA on Let's Note S21



佐野@浜松です。

In <200009121432.XAA04540@xxxxxxxxxxxxxxxxxxxxxxxxxxx>,
  on "Tue, 12 Sep 2000 23:33:04 +0900',
   with "Re: Potato PCMCIA on Let's Note S21",
 OZAWA -Crouton- Sakuro <crouton@xxxxxxxxxxxxxxxx> さん wrote:

> うぅ。できれば本体のインストールはネットワーク経由でやりたかったんですが……。
> # 手持ちのCD-ROMドライブが悪名高いKXL-810ANなんで使えない。

あれ ? KXL-810AN ってサポートされているはずですが。
 PC カード給電の場合はちょっとしたツールが必要だけど、
 AC アダプタで使う場合にはそのまま接続すれば認識しません ?

 pcmcia-cs 3.1.4 以降で野村さんのパッチが採用されていると
思っていたのですが。実際 TP235 に KXL-810AN を接続して動作
を確認したこともありますし。

 PC カード給電の場合は以下のコードを make して ./kxl810 0 
 (/dev/sg0 の場合) を実行すると使えるようになるはず。

 # タイムアウトを待つのが長いけれど、葢を開閉すると早く動き出す。
 # 附属の SCSI カード以外に使うとカードを壊す場合があるそうなので
 # 要注意のこと。

このコードも作者の野村さん (s.nomura@xxxxxxxxxxxxxxx) にメールで
問い合わせて GPL での配布許可をもらったのですが、時間が無くて
 pcmcia-source パッケージの contrib に入れてもらうという目論見は
実現していません。誰か BTS してくれる人がいることを期待。

 ===== Makefile =====
OBJS    = main.o
PROGRAM = kxl810

CFLAGS  = -O2

$(PROGRAM): $(OBJS)
	cc -o $(PROGRAM) $(OBJS)

clean:
	$(RM) $(OBJS)


 ===== main.c =====
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>

main(int argc, char *argv[])
{
  int fd, on, sp;
  char fname[16];
  u_char inq[36 + 1];

  if (argc != 2){
    help();
    exit(-1);
  }

  sprintf(fname, "/dev/sg%c", argv[1][0]);
  if ((fd = open(fname, O_RDWR)) < 0){
    perror(fname);
    exit(1);
  }

  if (inquiry(fd, 0, inq, sizeof inq) < 0){
    close(fd);
    exit(-1);
  }
  inq[36] = '\0';
  printf("%s\n", inq + 8);

  cmdE0(fd, 0, on);
  close(fd);
  exit(0);
}

help()
{
  fprintf(stderr, "Usage: kxl810 {a|b|c|d|e|f}\n");
}

#include <scsi/sg.h>

u_char sg_buf[1024];

inquiry(int fd, int lun, void *inq)
{
  struct sg_header *sg = (struct sg_header *)sg_buf;
  u_char *cmd = sg_buf + sizeof (struct sg_header);
  int n;

  sg->reply_len = sizeof (struct sg_header) + 36;
  sg->pack_id = 1;
  sg->twelve_byte = 0;
  cmd[0] = 0x12;
  cmd[1] = (lun << 5);
  cmd[2] = 0x00;
  cmd[3] = 0x00;
  cmd[4] = 36;
  cmd[5] = 0x00;

  n = sizeof (struct sg_header) + 6;
  if (write(fd, sg_buf, n) != n){
    perror("inquiry: write");
    return (-1);
  }
  if ((n = read(fd, sg_buf, sizeof sg_buf)) <= 0){
    perror("inquiry: read");
    return (-1);
  }
  if (sg->result != 0){
    fprintf(stderr, "inquiry: error code = 0x%x\n", sg->result);
    return (-1);
  }
  memcpy(inq, sg_buf + sizeof (struct sg_header), 36);
  return (0);
}


cmdE0(int fd, int lun)
{
  struct sg_header *sg = (struct sg_header *)sg_buf;
  u_char *cmd = sg_buf + sizeof (struct sg_header);
  int n;

printf("command 0xe0:\n");
  sg->reply_len = sizeof (struct sg_header);
  sg->pack_id = 1;
  sg->twelve_byte = 1;
  cmd[0] = 0xe0;
  cmd[1] = 0x00;
  cmd[2] = 0x00;
  cmd[3] = 0x00;
  cmd[4] = 0x00;
  cmd[5] = 0x54;
  cmd[6] = 0x4f;
  cmd[7] = 0x4d;
  cmd[8] = 0x59;
  cmd[9] = 0x30;
  cmd[10] = 0x31;
  cmd[11] = 0x48;

  n = sizeof (struct sg_header) + 12;
  if (write(fd, sg_buf, n) != n){
    perror("cmdE0: write");
    return (-1);
  }
  if ((n = read(fd, sg_buf, sizeof sg_buf)) <= 0){
    perror("cmdE0: read");
    return (-1);
  }
  if (sg->result != 0){
    fprintf(stderr, "cmdE0: error code = 0x%x\n", sg->result);
    return (-1);
  }
  return (0);
}

 ===== README =====
kxl810

■ 概要
  Panasonic KXL-810 を付属の SCSI カードからの給電で動作可能にする
  ツールです。

■ 免責
  作者は、本ソフトウェアに起因するいかなる損害に対しても責任は
  負いません。また、サポートの義務も負いません。

■ 履歴
  v0.1   1999,11.1.

■ 注意
  必ず付属の SCSI I/F カードをお使い下さい。
  それ以外の SCSI I/F カードを使うとカードが壊れる可能性があります。

■ 使い方
  kxl810 {a|b|c|d|e|f|g}

  PCカード給電での動作を enable にするコマンドを CD-ROM ドライブへ
  送ります。
  引数 {a|b|c|d|e|f|g} はそれぞれ /dev/sg{a|b|c|d|e|f|g} に対応します。

  この CD-ROM しか接続していない場合は /dev/sga になりますから

    kxl810 a

  で OK です。

★実行には root 権限が必要です。


 (Debian の場合は sg0, sg1, sg2 などになるので ./kxl810 0 などの
  ような使い方になります)

では。

-- 
     # (わたしのおうちは浜松市、「夜のお菓子」で有名さ。)
    <kgh12351@xxxxxxxxxxx> : Taketoshi Sano (佐野 武俊)