2007年5月11日金曜日

LinuxでRadio Shark2 (その1:調査編)


Griffin radio SHARK + icecast2 on Debian GNU/Linuxという記事があった。



Radio Shark2の前のバージョンであるRadio SharkはLinuxからUSB-HIDおよびUSB-audioとして見えるようだ。



Radio Shark2とRadio Sharkでは、HIDコントロール回りがちょっと異なる模様。




手元のLinux Note(ubuntu)にRadio Shark2を接続してみた。

以下が/var/log/messages/の表示。


May 11 02:46:17 hong kernel: [12911.420000] usb 1-1: new full speed USB device using uhci_hcd and address 2
May 11 02:46:17 hong kernel: [12911.620000] usb 1-1: configuration #1 chosen from 1 choice
May 11 02:46:17 hong kernel: [12911.792000] usbcore: registered new interface driver snd-usb-audio
May 11 02:46:17 hong kernel: [12911.792000] usbcore: registered new interface driver hiddev
May 11 02:46:17 hong kernel: [12911.796000] input: Griffin Technology, Inc. radioSHARK as /class/input/input8
May 11 02:46:17 hong kernel: [12911.796000] input: USB HID v1.00 Device [Griffin Technology, Inc. radioSHARK] on usb-0000:00:1d.0-1
May 11 02:46:17 hong kernel: [12911.796000] usbcore: registered new interface driver usbhid
May 11 02:46:17 hong kernel: [12911.796000] drivers/usb/input/hid-core.c: v2.6:USB HID core driver



lsusbで見ると、これ↓。


Bus 001 Device 002: ID 077d:627a Griffin Technology



Griffin radio SHARK + icecast2 on Debian GNU/Linuxからリンクしているshark.cを見ると、


#define SHARK_VENDID 0x077d /* Griffin's Vendor ID */
#define SHARK_DEVID 0x627a /* The radioSHARK's Device ID */

というように、変わっていない模様。



��制御が変わっているなら、IDも変えてくれれば良いのに(^^;



radioSHARKにDelphiのRadio Shark2制御ソフトが、ソースコード付きで公開されている。感謝。

しかも、Radio Shark用のソースもある。

比較すれば、両者の違いがすぐ分かる(^^;



とりあえず、ソースを展開して、ディレクトリ毎diffをとってみた。


diff Shark1/Unit1.dfm Shark2/Unit1.dfm
6c6
< Caption = 'ControlSHARK1'
---
> Caption = 'ControlSHARK2'
diff Shark1/Unit1.pas Shark2/Unit1.pas
3,4c3,4
< ControlSHARK1
< version 0.2.1
---
> ControlSHARK2
> version 0.2.2
7c7
< Griffin Technology の radio SHARK 1 を
---
> Griffin Technology の radio SHARK 2 を
30c30
< //SOFTWARE_VERSION = '0.2.1';
---
> //SOFTWARE_VERSION = '0.2.2';
34c34
< RADIOSHARK1_VERSION = $01; // <-- ここが radio SHARK 2 と異なる
---
> RADIOSHARK2_VERSION = $10;
36,37c36,37
< FM_DEFAULT_VAL = 1017; // 適当に
< AM_DEFAULT_VAL = 828; // 適当に
---
> FM_DEFAULT_VAL = 765; // 適当に
> AM_DEFAULT_VAL = 558; // 適当に
94d93
< procedure LightBlueFlash(aInterval: Byte);
121c120
< function IsRadioShark1(HidDev: TJvHidDevice): Boolean; stdcall;
---
> function IsRadioShark2(HidDev: TJvHidDevice): Boolean; stdcall;
127c126
< and (HidDev.Attributes.VersionNumber = RADIOSHARK1_VERSION) // プロダクトバージョン で識別
---
> and (HidDev.Attributes.VersionNumber = RADIOSHARK2_VERSION) // プロダクトバージョン で識別
141c140
< and (HidDev.Attributes.VersionNumber <> RADIOSHARK1_VERSION) // プロダクトバージョン で識別
---
> and (HidDev.Attributes.VersionNumber <> RADIOSHARK2_VERSION) // プロダクトバージョン で識別
144c143
< FormMain.StatusBarMsg.SimpleText := 'radioSHARK1以外には対応していません '
---
> FormMain.StatusBarMsg.SimpleText := 'radioSHARK2以外には対応していません '
149c148
< Result := True;
---
> //Result := True;
159,160c158
< // 列挙モニター
< {
---
> {// 列挙モニター
167,169c165,166
<
< // radioSHARK1 の場合
< if HidDeviceController.CheckOutByCallback(HidDev, IsRadioShark1) then
---
> // radioSHARK2 の場合
> if HidDeviceController.CheckOutByCallback(HidDev, IsRadioShark2) then
189c186
< // radioSHARK2, radioSHARK3(?) の場合 (でっかいお世話です?)
---
> // radioSHARK1, radioSHARK3(?) の場合 (でっかいお世話です?)
204c201
< (HidDev.Attributes.VersionNumber = RADIOSHARK1_VERSION) then
---
> (HidDev.Attributes.VersionNumber = RADIOSHARK2_VERSION) then
233c230
< numToWrite := CurrentDevice.Caps.OutputReportByteLength; // radioSHARK1 の場合は 7
---
> numToWrite := CurrentDevice.Caps.OutputReportByteLength; // radioSHARK2 の場合は 8
264,267c261,264
< FM [freq] MHz にセット
< C0 02 ?? ?? 00 00
< ?? ?? (16進数) <=> (freq * 10 * 8) + 0x0358
< +8 で +0.1 MHz
---
> FM [freq] MHz にセット
> 81 ?? ?? 33 04 00 28 ( <== 合ってる? 後半部分の値が何を意味しているのか分からない)
> ?? ?? (16進数) <=> (freq * 10 * 2) - 3 (10進数)
> +1 で +0.05 MHz
271c268
< FreqHexVal := IntToHex((aFreq * 8) + $0358, 4);
---
> FreqHexVal := IntToHex( (aFreq * 2) - 3 , 4 );
276c273
< HidDeviceWrite([$C0,$02,HexHigh,HexLow,$00,$00]);
---
> HidDeviceWrite([$81,HexHigh,HexLow,$33,$04,$00,$28]);
289,292c286,289
< AM [freq] kHz にセット
< C0 12 ?? ?? 00 00
< ?? ?? (16進数) <=> freq + 0x01C2
< +1 で +1 kHz
---
> AM [freq] kHz にセット
> 81 ?? ?? F3 36 00 24 <== 合ってる?
> ?? ?? (16進数) <=> (freq * 4) + 16300 (10進数) ]
> +1 で +0.25 kHz
295c292
< FreqHexVal := IntToHex(aFreq + $01C2, 4);
---
> FreqHexVal := IntToHex( (aFreq * 4) + 16300 , 4 );
300c297
< HidDeviceWrite([$C0,$12,HexHigh,HexLow,$00,$00]);
---
> HidDeviceWrite([$81,HexHigh,HexLow,$F3,$36,$00,$24]);
307c304
< HidDeviceWrite([$A0,$FF,$00,$00,$00,$00]);
---
> HidDeviceWrite([$83,$FF,$00,$00,$00,$00,$00]);
312c309
< HidDeviceWrite([$A0,$00,$00,$00,$00,$00]);
---
> HidDeviceWrite([$83,$00,$00,$00,$00,$00,$00]);
317c314
< HidDeviceWrite([$A9,$00,$00,$00,$00,$00]);
---
> HidDeviceWrite([$84,$01,$00,$00,$00,$00,$00]);
322c319
< HidDeviceWrite([$A8,$00,$00,$00,$00,$00]);
---
> HidDeviceWrite([$84,$00,$00,$00,$00,$00,$00]);
327c324
< HidDeviceWrite([$A0,aBrightness,$00,$00,$00,$00]);
---
> HidDeviceWrite([$83,aBrightness,$00,$00,$00,$00,$00]);
330,333d326
< procedure TFormMain.LightBlueFlash(aInterval: Byte);
< begin
< HidDeviceWrite([$A1,aInterval,$00,$00,$00,$00]);
< end;
419,425d411
< if (ParaLowStr = '-flash') or (ParaLowStr = '/flash') then
< begin
< Inc(i);
< LightBlueFlash(Byte(StrToIntDef(ParamStr(i), 1)));
< end
<
< else



なんとかなるかなぁ。


0 件のコメント:

コメントを投稿