Skip navigation.
Home
The QNX Community Portal

View topic - How to read serial number from USB device ?

How to read serial number from USB device ?

Read-only archive of qnx.ddk (Writing device drivers for scanners, video card, optical mouse, etc) at inn.qnx.com

How to read serial number from USB device ?

Postby jacus » Wed Sep 05, 2007 2:26 pm

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
jacus
Senior Member
 
Posts: 239
Joined: Tue Apr 22, 2003 8:36 am

Re: How to read serial number from USB device ?

Postby jacus » Thu Sep 06, 2007 10:35 am

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

jacus
Senior Member
 
Posts: 239
Joined: Tue Apr 22, 2003 8:36 am

Re: How to read serial number from USB device ?

Postby jacus » Mon Sep 10, 2007 1:01 pm

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;VED*2![#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=&ED*2!["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]T*2D["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&XB*3L-"@D)"0D@<F5T
M=7)N("TQ.PT*(" @(" @(" @(" @("!]#0H-"@D@(" @(" @($E$(#T@=7-B
M9%]S=')I;F<H9&5V:6-E+#,L,'@P-# Y*3L)"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<H*2!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&XB*3L)"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
jacus
Senior Member
 
Posts: 239
Joined: Tue Apr 22, 2003 8:36 am


Return to qnx.ddk

Who is online

Users browsing this forum: No registered users and 2 guests

cron