n.yamamoto
2014年7月17日 16時40分
Yamamotoです。
以前、Armadillo-220で使用していたAppをArmadillo-420に載せ替えているのですが
USBからのHIDモード通信でUPSと通信しようとしているのですが、最初のコマンド送信でUSBが切断されてしまいます。
何か情報がありましたら教えていただけませんでしょうか?
起動直後の処理は以下の通り
--------------------------------------------------------------------------
Hermit-At v2.1.5 (armadillo4x0) compiled at 17:01:18, Jul 27 2012
Uncompressing kernel................................................................................................................done.
Uncompressing ramdisk................................................................................................................................................................................................................................................................................................................................................................................................................................................................................done.
Doing console=ttymxc2
Linux version 2.6.26-at19 (2.6.26) (atmark@atde3) (gcc version 4.3.2 (Debian 4.3.2-1.1) ) #4 PREEMPT Fri Jul 11 14:10:29 JST 2014
CPU: ARM926EJ-S [41069264] revision 4 (ARMv5TEJ), cr=00053177
Machine: Armadillo-420
Memory policy: ECC disabled, Data cache writeback
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
CPU0: D cache: 16384 bytes, associativity 4, 32 byte lines, 128 sets
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 16256
Kernel command line: console=ttymxc2
MXC IRQ initialized
PID hash table entries: 256 (order: 8, 1024 bytes)
MXC GPT timer initialized, rate = 133000000
Console: colour dummy device 80x30
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 46420KB available (3300K code, 228K data, 128K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
net_namespace: 480 bytes
NET: Registered protocol family 16
MXC WDOG1 Enabled
CPU is i.MX25 Revision 1.2
Clock input source is 24000000
MXC GPIO hardware
GPIO-56 autorequested
Using SDMA I.API
MXC DMA API initialized
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
MXC I2C driver
MXC I2C driver
MXC I2C driver
MC34704 regulator successfully probed
mc34704 0-0054: Loaded
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP reno registered
NET: Registered protocol family 1
checking if image is initramfs...it isn't (bad gzip magic numbers); looks like an initrd
Freeing initrd memory: 14821K
usb: Host 2 host (serial) registered
usb: DR host (utmi) registered
msgmni has been set to 119
io scheduler noop registered
io scheduler cfq registered (default)
Serial: MXC Internal UART driver
mxcintuart.1: ttymxc1 at MMIO 0x43f94000 (irq = 32) is a Freescale MXC
mxcintuart.2: ttymxc2 at MMIO 0x5000c000 (irq = 18) is a Freescale MXC
console [ttymxc2] enabled
mxcintuart.4: ttymxc4 at MMIO 0x5002c000 (irq = 40) is a Freescale MXC
brd: module loaded
loop: module loaded
FEC Ethernet Driver
PPP generic driver version 2.4.2
Linux video capture interface: v2.00
usbcore: registered new interface driver uvcvideo
USB Video Class driver (v0.1.0)
Driver 'sd' needs updating - please use bus_type methods
armadillo-nor: Found 1 x16 devices at 0x0 in 16-bit bank
Intel/Sharp Extended Query Table at 0x010A
Intel/Sharp Extended Query Table at 0x010A
Intel/Sharp Extended Query Table at 0x010A
Intel/Sharp Extended Query Table at 0x010A
Intel/Sharp Extended Query Table at 0x010A
Using buffer write method
Using auto-unlock on power-up/resume
cfi_cmdset_0001: Erase suspend on write enabled
armadillo-nor: use default partitions(4)
Creating 4 MTD partitions on "armadillo-nor":
0x00000000-0x00020000 : "nor.bootloader"
0x00020000-0x00220000 : "nor.kernel"
0x00220000-0x00fe0000 : "nor.userland"
0x00fe0000-0x01000000 : "nor.config"
fsl-ehci fsl-ehci.0: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.0: new USB bus registered, assigned bus number 1
fsl-ehci fsl-ehci.0: irq 35, io mem 0x53ff4400
fsl-ehci fsl-ehci.0: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
fsl-ehci fsl-ehci.1: Freescale On-Chip EHCI Host Controller
fsl-ehci fsl-ehci.1: new USB bus registered, assigned bus number 2
fsl-ehci fsl-ehci.1: irq 37, io mem 0x53ff4000
fsl-ehci fsl-ehci.1: USB 2.0 started, EHCI 1.00, driver 10 Dec 2004
usb usb2: configuration #1 chosen from 1 choice
hub 2-0:1.0: USB hub found
hub 2-0:1.0: 1 port detected
usbcore: registered new interface driver cdc_acm
cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver usbserial
usbserial: USB Serial Driver core
usbserial: USB Serial support registered for pl2303
usbcore: registered new interface driver pl2303
pl2303: Prolific PL2303 USB to serial adaptor driver
input: gpio-keys as /devices/platform/gpio-keys.0/input/input0
rtc-s35390a 1-0030: rtc core: registered rtc-s35390a as rtc0
rtc-s35390a 2-0030: error resetting chip
rtc-s35390a: probe of 2-0030 failed with error -5
i2c /dev entries driver
mxsdhci: MXC Secure Digital Host Controller Interface driver
mxsdhci: MXC SDHCI Controller Driver.
mmc0: SDHCI detect irq 159 irq 9 INTERNAL DMA
Registered led device: red
Registered led device: green
Registered led device: yellow
usb 2-1: new low speed USB device using fsl-ehci and address 2
mmc0: new high speed SD card at address 1234
mmcblk0: mmc0:1234 SA128 121088KiB
mmcblk0:<6>usb 2-1: configuration #1 chosen from 1 choice
p1
HID device claimed by neither input, hiddev nor hidraw
usbcore: registered new interface driver usbhid
usbhid: v2.6:USB HID core driver
Advanced Linux Sound Architecture Driver Version 1.0.16.
usbcore: registered new interface driver snd-usb-audio
usbcore: registered new interface driver snd-usb-caiaq
ASoC version 0.13.2
ALSA device list:
No soundcards found.
ip_tables: (C) 2000-2006 Netfilter Core Team
TCP cubic registered
NET: Registered protocol family 17
NET: Registered protocol family 15
Static Power Management for Freescale i.MX25
rtc-s35390a 1-0030: setting system clock to 2000-01-01 00:17:46 UTC (946685866)
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 14821KiB [1 disk] into ram disk... done.
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 128K
init started: BusyBox v1.00 (2014.07.01-01:14+0000) multi-call binary
Starting fsck for root filesystem.
fsck 1.25 (20-Sep-2001)
ext2fs_check_if_mount: No such file or directory while determining whether /dev/ram0 is mounted.
/dev/ram0: clean, 1041/1264 files, 13517/14821 blocks
Checking root filesystem: done
Remounting root rw: done
Mounting proc: done
Mounting usbfs: done
Mounting sysfs: done
Cleaning up system: done
Running local start scripts.
Starting udevd: done
Loading /etc/config: done
Changing file permissions: done
Configure /home/ftp: done
Starting syslogd: done
Starting klogd: done
Starting basic firewall: done
Setting hostname: done
Configuring network interfaces: fec: PHY @ 0x0, ID 0x0007c0f1 -- LAN8720
eth0: link down
done
Starting inetd: done
Setting at-cgi: done
Starting lighttpd: done
Creating avahi.services: eth0: link up, 10Mbps, half-duplex
done
Starting avahi.daemon: done
Mounting ramfs /home/ftp/pub: done
Running local start script (/etc/config/rc.local).
===== rc.local start!! =====
NTP Set Start cmd=( ntpdate 192.168.0.30 ) Start
sh: ntpdate: not found
ntpdate cmd Error
:
usbMstUpsOmron_Com.c:usbInit:114:Device Match!
Device Find!!
Class code check OK!!
Device open OK!!
Configuration set OK!!
Configuration claim OK!!
usbMstUpsOmron_Com.c:usbWriteControlMsg:210:ReqType=32
Siz=0x8 (No error)c:usbWriteControlMsg:227:usb_control_msg=8 Dh=0x1D018 Typ=0x21 Dat=Q1
fsl-ehci fsl-ehci.1: HC died; cleaning up
usb 2-1: USB disconnect, address 2 <====== ここで送信直後に切断されている
usbMstUpsOmron_Com.c:usbReadInterrupt:251:usb_interrupt_read=-19 Dh=0x1D018 Dat= Siz=0x40 (No error)
usbMstUpsOmron.c:readBitDeviceMonitorTbl:914:error.
usbMstUpsOmron.c:readMonitorTbl:712:error.
usbMstUpsOmron_Com.c:usbWriteControlMsg:210:ReqType=32
Siz=0x8 (error sending control message: No such device)msg=-19 Dh=0x1D018 Typ=0x21 Dat=Q1
usbMstUpsOmron.c:readBitDeviceMonitorTbl:919:error ret=-19 Siz=0x8
usbMstUpsOmron.c:readMonitorTbl:712:error.
:
---------------------------------------------------------------------------------------
プログラム処理は抜粋ですが、以下のような感じです
--------------------------------------------------------------------------------------
#define HID_REPORT_GET 0x01
#define HID_REPORT_SET 0x09
#define HID_GET_IDLE 0x02
#define HID_SET_IDLE 0x0A
#define HID_RT_INPUT 0x01
#define HID_RT_OUTPUT 0x02
#define HID_RT_FEATURE 0x03
void main()
{
STATUS iRet = 0;
int i = 0;
for(i = 0; i < USB_INIT_RETRY_MAX; i++){
/* USB通信初期化 */
iRet = usbInit(VENDOR_ID, PRODUCT_ID);
if(iRet != RET_OK){
printf("USB device initialize. (Count = %d)\n", (i + 1));
}
else{
break;
}
usleep(100000); /* 100(ms)スリープ */
}
for(ulTxCount = 0; ulTxCount < (g_ParamInf.ulTxRetry + 1); ulTxCount++) {
iWrSize = usbWriteControlMsg(s_cSendBuff, iSendSize);
if(iWrSize == iSendSize) {
iRecvSize = 64;
iRdSize = usbReadInterrupt(s_cRecvBuff, iRecvSize);
if(iRdSize == iRecvSize) {
:
}
else if(iRdSize == -2) { /* 通信タイムアウト */
/* 再送信する */
}
else {
DBG_PRINT( "%s:%s:%d:error.\n", __FILE__, __func__, __LINE__ );
return RET_NG;
}
}
else {
DBG_PRINT( "%s:%s:%d:error ret=%d Siz=0x%X \n", __FILE__, __func__, __LINE__, iWrSize, iSendSize );
return RET_NG;
}
}
}
STATUS usbInit(USHORT usVendorId, USHORT usProductId)
{
BOOL boDevFindFlag = FALSE;
s_usVendorId = usVendorId;
s_usProductId = usProductId;
if(s_boInitFlag == TRUE){
return (RET_NG);
}
usb_init(); /* 初期化 */
if (!usb_get_busses()) {
usb_find_busses(); /* バスを探す */
usb_find_devices(); /* デバイスを探す */
}
for (s_pBus = usb_get_busses(); s_pBus; s_pBus = s_pBus->next) {
for (s_pDev = s_pBus->devices; s_pDev; s_pDev = s_pDev->next) {
if (s_pDev->descriptor.idVendor == usVendorId || /* ベンダーID */
s_pDev->descriptor.idProduct == usProductId) { /* プロダクトID */
boDevFindFlag = TRUE; /* 指定デバイス発見 */
DBG_PRINT( "%s:%s:%d:Device Match!\n", __FILE__, __func__, __LINE__ );
break;
}
}
if(boDevFindFlag == TRUE){
break;
}
}
DBG_PRINT("Device Find!!\n");
/* クラスコードチェック */
if(s_pDev->config->interface->altsetting->bInterfaceClass != USB_CLASS_HID){
return (RET_NG);
}
DBG_PRINT("Class code check OK!!\n");
s_pDh = usb_open(s_pDev);
if(s_pDh == NULL){
return (RET_NG);
}
DBG_PRINT("Device open OK!!\n");
/* コンフィギュレーション */
if(usb_set_configuration(s_pDh, s_pDev->config->bConfigurationValue) < 0){
/* エラーならデタッチして呼び出し元に戻る */
DBG_PRINT("usb_set_configuration() error.(%s)\n",usb_strerror());
usb_detach_kernel_driver_np(s_pDh, s_pDev->config->interface->altsetting->bInterfaceNumber);
usbClose();
s_boInitFlag = FALSE;
return (RET_NG);
}
DBG_PRINT("Configuration set OK!!\n");
/* クレームインターフェース(インターフェース要求) */
if(usb_claim_interface(s_pDh, s_pDev->config->interface->altsetting->bInterfaceNumber) < 0){
printf("usb_claim_configuration Error.(%s)\n", usb_strerror());
/* エラーならデタッチして呼び出し元に戻る */
usb_detach_kernel_driver_np(s_pDh, s_pDev->config->interface->altsetting->bInterfaceNumber);
usbClose();
s_boInitFlag = FALSE;
return (RET_NG);
}
DBG_PRINT("Configuration claim OK!!\n");
s_pIfDesc = s_pDev->config->interface->altsetting;
s_pEpDesc = s_pIfDesc->endpoint;
s_boInitFlag = TRUE;
return (RET_OK);
}
int usbWriteControlMsg(char *pcBuff, int iWrSize)
{
int iRet = 0;
UCHAR ucReqType = 0;
UCHAR *pucExtra;
pucExtra = s_pIfDesc->extra; /* HIDクラスデスクリプタを取得 */
if(pucExtra != NULL){
/* HIDデスクリプタのディスクリプタタイプ */
if((pucExtra[1] == USB_DT_HID) || (pucExtra[1] == USB_DT_HUB)){
ucReqType = USB_TYPE_CLASS;
DBG_PRINT( "%s:%s:%d:ReqType=%d \n", __FILE__, __func__, __LINE__, ucReqType );
}
}
#if 1
iRet = usb_control_msg(s_pDh,
USB_ENDPOINT_OUT | ucReqType | USB_RECIP_INTERFACE,
// USB_REQ_SET_CONFIGURATION,
HID_REPORT_SET, /* USB_TYPE_CLASS時 */
// 0,
(HID_RT_OUTPUT << 8) + 0, /* as report id */
0,
pcBuff,
iWrSize,
g_ParamInf.ulTimeOut * 1000);
#endif
DBG_PRINT( "%s:%s:%d:usb_control_msg=%d Dh=0x%X Typ=0x%X Dat=%s Siz=0x%X (%s)\n", __FILE__, __func__, __LINE__,
iRet, s_pDh, USB_ENDPOINT_OUT | ucReqType | USB_RECIP_INTERFACE, pcBuff, iWrSize, usb_strerror() );
return (iRet);
}
int usbReadInterrupt(char *pcBuff, int iRdSize)
{
int iRet = 0;
iRet = usb_interrupt_read(s_pDh,
s_pEpDesc->bEndpointAddress,
pcBuff,
iRdSize,
g_ParamInf.ulTimeOut * 1000);
DBG_PRINT( "%s:%s:%d:usb_interrupt_read=%d Dh=0x%X Dat=%s Siz=0x%X (%s)\n", __FILE__, __func__, __LINE__,
iRet, s_pDh, pcBuff, iRdSize, usb_strerror() );
return (iRet);
}
--------------------------------------------------------------------------------------
コメント
n.yamamoto
Yamamotoです。
補足で解ったことがあります。
[Armadillo:07737] Re: armadillo-420 usb cdc_acmのドライバが落ちる
http://lists.atmark-techno.com/pipermail/armadillo/2011-December/007740…
で気なったのでUSB-HUB経由でためしたところ正常に通信できました。
この種の結果が無いのですが、どうなったのか教えていただけませんでしょうか?
at_daisuke.sasaki
佐々木大輔です。
接続に問題のあるデバイスが、USB HUBを経由する事で問題が解決する理由として、
以下のような事が考えられます。
(1) デバイスが規格違反の電流を引いている場合
ArmadilloがUSBバスに供給するVBUS(電源)は、パワースイッチにより制御されています。
USBデバイスが規格違反となるような電流を引いている場合や
突入電流など瞬間的に大きな電流が流れた場合、パワースイッチはVBUSをOFFしてしまいます。
これにより、ArmadilloのUSBホストとデバイス間の通信に問題が発生し、
結果的にDisconnectしてしまいます。
この状況では、ACアダプタを接続し使用する、セルフパワーHUBを
ArmadilloとUSBデバイス間に挟むことで、問題が解決する場合があります。
(2) FSデバイス/LSデバイスとArmadillo-400シリーズのHostとの接続性の問題
ご使用のデバイスがFull-Speed(FS)デバイスまたはLow-Speed(LS)デバイスの場合、
USB2.0のUSB-HUBを挟む事で問題が解決する場合があります。
Armadillo-400シリーズのプロセッサは、FSデバイス/LSデバイスが接続されると、
プロセッサのUSBホスト内にある、TT(Transaction Translator)というモジュールが、
FS/LSのパケットを生成します。
従い、Armadillo - USBデバイス間はFSまたはLSで通信を行います。
しかし、USB2.0のHUBが挟まると、Armadillo - USB2.0 HUB間は
High-Speed(HS)の通信を行い、USB2.0 HUB内のTTモジュールが
HSのパケットをFS/LSに変換するという動作になります。
FS/LSの変換処理に起因する、USBホストとUSBデバイス間の接続性に起因し、
問題が発生している場合には、USB2.0のHUBを挟む事で問題が解決する場合があります。
n.yamamoto
at_daisuke.sasaki
佐々木大輔です。
> 佐々木様の意見と状況から(2)のような気がしますが確認方法はないのですよね?
(1)の現象か、(2)の現象かの切り分けという意味では、
Armadilloとデバイス間に挟んでいるUSBハブが
セルフパワーハブ(ハブに電源入力あり)かバスパワーハブ(ハブに電源入力なし)で
切り分ける事ができます。
ハブに電源入力が無く、USBホスト(Armadillo)から給電しているのにもかかわらず、
問題が解決するならば、(1)の問題ではありません。
> (1)の場合ですと起動時にUSBは認識して繋がっているが、linusbを使用して通信を開始するときの突入電量が発生しているということでしょうか?
USBデバイスによって、挿した瞬間から電流を引くものや、
エニュマレーションにより、デバイスがアクティブになった後(Set Configurationなどにより)に
多くの電流を引くものなど様々です。
後者の場合には、接続した瞬間にはDisconnectせず、通信中にDisconnectしてしまう事があり得ます。
ちなみにUPS装置ですと、
USBのインターフェースはセルフパワーデバイスとして動いているのでしょうか?
バスパワーデバイスとして動いているのでしょうか?
そもそも、UPS装置自体がセルフパワーデバイスであれば、
(1)の問題では無いと思います。
> (2)ですとTT内になるので追跡が難しいということでしょうか?
ログやUSBのパケットなどを採取し、詳細に追っていくと、
ソフトウェアで回避できる問題か、わかる可能性があるとは思いますが、、、。
n.yamamoto
n.yamamoto
2014年7月17日 16時47分
Yamamotoです。
済みません。
表題を「USBからのHIDモード通信でfsl-ehci fsl-ehci.1: HC died; cleaning upエラー」としたかったのですが、途中で送ってしまいました。
それと補足でUPSはオムロンのBZ35LT2です。
PCとは同一のUSBケーブルを使用してシャットダウンツールで通信出来ているらしいことは確認しました。
よろしくお願いします。