How to read serial number from USB device ?

Hi,

Here is a part of the ‘usb’ output:

USB 0 (EHCI) v1.10, v1.01 DDK, v1.01 HCD
Control, Interrupt, Bulk, High speed

Device Address : 1
Upstream Host Controller : 0
Upstream Device Address : 0
Upstream Port : 4
Upstream Port Speed : High
Vendor : 0x0951 (Kingston)
Product : 0x1600 (DataTraveler II )
Device Release : r1.00
USB Spec Release : v2.00
Serial Number : 5B6502002021

Which function from USB library can read the Serial Number field?
Is it usbd_string() ?
If yes how to determine it second parametr, called ‘index’ ?

Reagrds,
Jacek

Hi,

Here is my code:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/usbdi.h>

#define VENDOR 0x0951
#define DEVICE 0x1600

usbd_device_ident_t interest = {
VENDOR,
DEVICE,
USBD_CONNECT_WILDCARD,
USBD_CONNECT_WILDCARD,
USBD_CONNECT_WILDCARD,
};

usbd_funcs_t funcs = {
_USBDI_NFUNCS,
NULL,
NULL,
NULL
};

usbd_connect_parm_t cparms = {
NULL,
USB_VERSION,
USBD_VERSION,
0,
0, // argc
NULL, // *argv
0,
&interest,
&funcs
};

struct usbd_connection *connection;
struct usbd_device *device;
usbd_device_instance_t instance;

usbd_device_descriptor_t *ddesc=NULL;
struct usbd_desc_node *node=NULL;
usbd_string_descriptor_t *sdesc=NULL;

int main (void) {
int error,status;
int devno,hostid;
char* ID;

error = usbd_connect (&cparms, &connection);
if (error != EOK) {
printf ("\n usbd_connect() error number: %d \n",error);
return -1;
}

instance.config = 1;
instance.iface = 0;
instance.alternate = 0;

for (hostid =0; hostid < 8; ++hostid) {
for (devno = 0; devno < 16; ++devno) {
memset(&instance, USBD_CONNECT_WILDCARD,
sizeof(usbd_device_instance_t));
instance.path = hostid, instance.devno = devno;
status = usbd_attach(connection, &instance,0,&device);
// the device has been found
if (status == EOK) {
ddesc = usbd_device_descriptor(device,&node );
if (ddesc == NULL ) {
printf("\n usbd_device_descriptor () error !!\n");
return -1;
}
// is it a specific device ?
if (ddesc->idVendor == VENDOR) {
sdesc = usbd_languages_descriptor(device,&node );
ID = usbd_string(device,3,sdesc->bString[0]);
printf ("\n I found it → hostid: %d, devno: %d, seriall number:
%s \n",hostid,devno,ID);
if (usbd_detach (device) != EOK)
printf ("\n usbd_detach (): error ! \n");
}
else {
if (usbd_detach (device) != EOK)
printf ("\n usbd_detach (): error ! \n");
}
}
}
}
if (usbd_disconnect(connection )!= EOK)
printf ("\n usbd_disconnect (): error ! \n");

return 0;
}

and it works fine under QNX Neutrino.

But I have some problems under QNX4.
I compile application as follows:

cc -lusbdi -liomgr -T1 -o usb_test usb_test.c

but it returns everytime:

./usb_test

usbd_connect() error number: 275

Why I can’t connect to the USB stack ?
Am I doing something wrong ?

Regards,
Jacek


U¿ytkownik “Jacek Rudnicki” <jacek.rudnicki@quantum.com.pl> napisa³ w
wiadomo¶ci news:fbme0d$kp9$1@inn.qnx.com

Hi,

Here is a part of the ‘usb’ output:

USB 0 (EHCI) v1.10, v1.01 DDK, v1.01 HCD
Control, Interrupt, Bulk, High speed

Device Address : 1
Upstream Host Controller : 0
Upstream Device Address : 0
Upstream Port : 4
Upstream Port Speed : High
Vendor : 0x0951 (Kingston)
Product : 0x1600 (DataTraveler II )
Device Release : r1.00
USB Spec Release : v2.00
Serial Number : 5B6502002021

Which function from USB library can read the Serial Number field?
Is it usbd_string() ?
If yes how to determine it second parametr, called ‘index’ ?

Reagrds,
Jacek

Now running previous release of the USB stack (devu-uhci) is little better.
The usbd_connect () function works fine, but I can attach to the USB stack
only when all fields of the ‘instance’ structure are set including device
and
vendor id.

Another thing is that all functions which use device pointer as a parameter
(i.e usbd_device_descriptor(), usbd_languages_descriptor(), usbd_string() )
return NULL.

Did I miss something ?
How can I solve this problem ?

Source code attached.

Regards,
Jacek


U¿ytkownik “Jacek Rudnicki” <jacek.rudnicki@quantum.com.pl> napisa³ w
wiadomo¶ci news:fbokru$mtm$1@inn.qnx.com

Hi,

Here is my code:

#include <stdio.h
#include <stdlib.h
#include <errno.h
#include <sys/usbdi.h

#define VENDOR 0x0951
#define DEVICE 0x1600

usbd_device_ident_t interest = {
VENDOR,
DEVICE,
USBD_CONNECT_WILDCARD,
USBD_CONNECT_WILDCARD,
USBD_CONNECT_WILDCARD,
};

usbd_funcs_t funcs = {
_USBDI_NFUNCS,
NULL,
NULL,
NULL
};

usbd_connect_parm_t cparms = {
NULL,
USB_VERSION,
USBD_VERSION,
0,
0, // argc
NULL, // *argv
0,
&interest,
&funcs
};

struct usbd_connection *connection;
struct usbd_device *device;
usbd_device_instance_t instance;

usbd_device_descriptor_t *ddesc=NULL;
struct usbd_desc_node *node=NULL;
usbd_string_descriptor_t *sdesc=NULL;

int main (void) {
int error,status;
int devno,hostid;
char* ID;

error = usbd_connect (&cparms, &connection);
if (error != EOK) {
printf ("\n usbd_connect() error number: %d \n",error);
return -1;
}

instance.config = 1;
instance.iface = 0;
instance.alternate = 0;

for (hostid =0; hostid < 8; ++hostid) {
for (devno = 0; devno < 16; ++devno) {
memset(&instance, USBD_CONNECT_WILDCARD,
sizeof(usbd_device_instance_t));
instance.path = hostid, instance.devno = devno;
status = usbd_attach(connection, &instance,0,&device);
// the device has been found
if (status == EOK) {
ddesc = usbd_device_descriptor(device,&node );
if (ddesc == NULL ) {
printf("\n usbd_device_descriptor () error !!\n");
return -1;
}
// is it a specific device ?
if (ddesc->idVendor == VENDOR) {
sdesc = usbd_languages_descriptor(device,&node );
ID = usbd_string(device,3,sdesc->bString[0]);
printf ("\n I found it → hostid: %d, devno: %d, seriall
number:
%s \n",hostid,devno,ID);
if (usbd_detach (device) != EOK)
printf ("\n usbd_detach (): error ! \n");
}
else {
if (usbd_detach (device) != EOK)
printf ("\n usbd_detach (): error ! \n");
}
}
}
}
if (usbd_disconnect(connection )!= EOK)
printf ("\n usbd_disconnect (): error ! \n");

return 0;
}

and it works fine under QNX Neutrino.

But I have some problems under QNX4.
I compile application as follows:

cc -lusbdi -liomgr -T1 -o usb_test usb_test.c

but it returns everytime:

./usb_test

usbd_connect() error number: 275

Why I can’t connect to the USB stack ?
Am I doing something wrong ?

Regards,
Jacek


U¿ytkownik “Jacek Rudnicki” <> jacek.rudnicki@quantum.com.pl> > napisa³ w
wiadomo¶ci news:fbme0d$kp9$> 1@inn.qnx.com> …
Hi,

Here is a part of the ‘usb’ output:

USB 0 (EHCI) v1.10, v1.01 DDK, v1.01 HCD
Control, Interrupt, Bulk, High speed

Device Address : 1
Upstream Host Controller : 0
Upstream Device Address : 0
Upstream Port : 4
Upstream Port Speed : High
Vendor : 0x0951 (Kingston)
Product : 0x1600 (DataTraveler II )
Device Release : r1.00
USB Spec Release : v2.00
Serial Number : 5B6502002021

Which function from USB library can read the Serial Number field?
Is it usbd_string() ?
If yes how to determine it second parametr, called ‘index’ ?

Reagrds,
Jacek

\

begin 666 USB_Kingston.c
M(VEN8VQU9&4@/’-T9&EO+F@^#0HC:6YC;‘5D92 <W1D;&EB+F@^#0HC:6YC
M;‘5D92 \97)R;F\N:#X-“B-I;F-L=61E(#QS>7,O=7-B9&DN:#X-@T*(V1E
M9FEN92!614Y$3U()(" P># Y-3$-"B-D969I;F4@1$5624-%"2 @,’@Q-C P
M#0HC9&5F:6YE($-,05-3"2 @,’@P,# X#0HC9&5F:6YE(%-50D-,05-3(" P
M># P,#8-“B-D969I;F4@4%)/5$]#3TP@(#!X,# U, T*#0IU<V)D7V1E=FEC
M95]I9&5N=%]T(”!I;G1E<F5S=" ](‘L-"@D)"0D)“0D)(%9%3D1/4BP-”@D)
M"0D)“0D)($1%5DE#12P-”@D)"0D)"0D)($-,05-3+ T*"0D)"0D)“0D@4U5”
M0TQ!4U,L#0H)"0D)"0D)“2!04D]43T-/3"P-”@D)"0D)“0D)?3L-“G5S8F1?
M9G5N8W-?=”!F=6YC<R ]('L-”@D)“0D)(”!?55-"1$E?3D953D-3+ T*"0D)
M"0D@($Y53$PL#0H)“0D)“2 @3E5,3"P-”@D)“0D)(”!.54Q,#0H@“0D)“2 @
M(” @?3L-”@T*=7-B9%]C;VYN96-T7W!A<FU?=”!C<&%R;7,@/2![#0H)"0D)
M"0D)"4Y53$PL#0H)"0D)"0D)"5530E]615)324].+ T*"0D)"0D)"0E54T)$
M7U9%4E-)3TXL#0H)"0D)"0D)“3 L#0H)“0D)“0D)“3 L(” @(” @+R@(&%R
M9V,-”@D)“0D)“0D)3E5,3"P)+R@F%R9W8)"0D)"0D)"2 @"0D)"0D)"0D)
M"0D)#0H)"0D)"0D)"3 L#0H)"0D)"0D)"29I;G1E<F5S=“P-”@D)"0D)"0D)
M)F9U;F-S#0H)"0D)"0D)('T[#0H-“G-T<G5C=”!U<V)D7V-O;FYE8W1I;VX@
M
F-O;FYE8W1I;VX]3E5,3#L-“G-T<G5C=”!U<V)D7V1E=FEC92 J9&5V:6-E
M/4Y53$P[#0IU<V)D7V1E=FEC95]I;G-T86YC95]T(&EN<W1A;F-E.PT*#0IU
M<V)D7V1E=FEC95]D97-C<FEP=&]R7W0@F1D97-C/4Y53$P[( T<W1R=6-T
M('5S8F1?9&5S8U]N;V1E(“IN;V1E/4Y53$P[#0IU<V)D7W-T<FEN9U]D97-C
M<FEP=&]R7W0@G-D97-C/4Y53$P[#0H-“FEN=”!M86EN("AV;VED2![#0H@
M(”!I;G0@97)R;W(L<W1A='5S.PT*(” @:6YT(&1E=FYO+&AO<W1I9#TP.PT*
M(” @8VAA<BH@240[#0H-“B )#0H)(&5R<F]R(#T@=7-B9%]C;VYN96-T(”@F
M8W!A<FUS+” F8V]N;F5C=&EO;BD[#0H)(&EF(“AE<G)O<B A/2!%3TLI('L-
M”@D)<’)I;G1F("@B7&X@=7-B9%]C;VYN96-T*“D@97)R;W(@;G5M8F5R.B E
M9”!<;B(L97)R;W(I.PT*“2 )<F5T=7)N(“TQ.PT*“2!]“0D)“0D-”@T*(” @
M(”!I;G-T86YC92YC;VYF:6<@/2 Q.PT*(” @(”!I;G-T86YC92YI9F%C92 ]
M(# [#0H@(" @(&EN<W1A;F-E+F%L=&5R;F%T92 ](# [( T*#0H)9F]R(“AH
M;W-T:60@/3 [(&AO<W1I9” (#@[(“LK:&]S=&ED2!["0T"2 @(”!F;W(@
M*&1E=FYO(#T@,#L@9&5V;F@/" Q-CL@RMD979N;RD@>PT(" @(" @(" @
M("!M96US970H)FEN<W1A;F-E+"!54T)$7T-/3DY%0U1?5TE,1$-!4D0L(’-I
M>F5O9BAU<V)D7V1E=FEC95]I;G-T86YC95]T2D[“2 @(” )#0H@(" @(" @
M(" @(&EN<W1A;F-E+G!A=&@@/2!H;W-T:60L(&EN<W1A;F-E+F1E=FYO(#T@
M9&5V;F[#0H)“2 @(&EN<W1A;F-E+FED96YT(#T@:6YT97)E<W0[#0H@(” @
M(" @(" @(’-T871U<R ]('5S8F1?871T86-H
&-O;FYE8W1I;VXL(“9I;G-T
M86YC92PP+“9D979I8V4I.PT*#0H@(” @(” @(" @(&EF(“AS=&%T=7,@/3T@
M14]+2![#0H)"0D@(’!R:6YT9B H(EQN($1E=FEC92!D97-C<FEP=&]R(’!O
M:6YT97(Z(“5X(%QN(BQD979I8V4I.PD-”@D)"2 @9&1E<V,@/2!U<V)D7V1E
M=FEC95]D97-C<FEP=&]R
&1E=FEC92PF;F]D92 I.PT*(” @(" @(" @(" @
M("!I9B H9&1E<V,@/3T@3E5,3" I(‘L-"@D)"0D@<’)I;G1F*")<;B!U<V)D
M7V1E=FEC95]D97-C<FEP=&]R("@I(&5R<F]R("$A7&XB3L-"@D)"0D@<F5T
M=7)N("TQ.PT
(" @(" @(" @(" @("!]#0H-"@D@(" @(" @($E$(#T@=7-B
M9%]S=’)I;F<H9&5V:6-E+#,L,’@P-# Y3L)"0D)( T( D)("!I9B H240@
M(3T@3E5,3"D)#0H)(" @(" @(" @("!P<FEN=&8@")<;B!)(&9O=6YD(&1E
M=FEC92!H;W-T:60Z(“5D+”!D979N;SH@)60L(’-E<FEA;"!N=6UB97(Z("5S
M(%QN(BQH;W-T:60L9&5V;F\L240I.PT
"0D@(&5L<V4-“B @(” )“2 @(” @
M<’)I;G1F("@B7&X@=7-B9%]S=’)I;F<H2!E<G)O<B A(2!<;B(I.PD-"@D@
M( D@(&EF(“AU<V)D7V1E=&%C:” H9&5V:6-E
2 A/2!%3TLI#0H)“2 @(” @
M<’)I;G1F("@B7&X@=7-B9%]D971A8V@@“DZ(&5R<F]R(”$@7&XB3L)“0D@
M(” @(" @(" -“B @(” @(" @(" @?2 @(" @(" @(" @“2 @#0H@(” @(" @
M?0T*“7T-”@EI9B H=7-B9%]D:7-C;VYN96-T*&-O;FYE8W1I;VX@2$]($5/
M2RD-“B @(” @("!P<FEN=&8@
")<;B!U<V)D7V1I<V-O;FYE8W0@“DZ(&5R
L<F]R(”$@7&XB
3L-"@D@(" @(" @(" @“2 @( T*(”!R971U<FX@,#L-"GT
end