Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
L
Libcoincellhell
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Klemm, Carl Philipp
Libcoincellhell
Commits
e43ef91f
Commit
e43ef91f
authored
2 years ago
by
Carl Philipp Klemm
Browse files
Options
Downloads
Patches
Plain Diff
use sync io for get command
parent
45b84e20
No related branches found
No related tags found
No related merge requests found
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
eismultiplexer.c
+28
-22
28 additions, 22 deletions
eismultiplexer.c
eismultiplexer.h
+10
-9
10 additions, 9 deletions
eismultiplexer.h
main.c
+64
-24
64 additions, 24 deletions
main.c
usbshm.c
+12
-7
12 additions, 7 deletions
usbshm.c
usbshm.h
+4
-1
4 additions, 1 deletion
usbshm.h
with
118 additions
and
63 deletions
eismultiplexer.c
+
28
−
22
View file @
e43ef91f
...
@@ -26,10 +26,13 @@
...
@@ -26,10 +26,13 @@
*/
*/
#define _POSIX_C_SOURCE 199309L
#define _POSIX_C_SOURCE 199309L
#include
<stdint.h>
#include
"eismultiplexer.h"
#include
"eismultiplexer.h"
#include
"usbshm.h"
#include
"usbshm.h"
#include
<stdlib.h>
#include
<stdlib.h>
#include
<time.h>
#include
<time.h>
#include
<stdio.h>
static
void
usleep
(
uint64_t
microseconds
)
static
void
usleep
(
uint64_t
microseconds
)
{
{
...
@@ -39,16 +42,6 @@ static void usleep(uint64_t microseconds)
...
@@ -39,16 +42,6 @@ static void usleep(uint64_t microseconds)
nanosleep
(
&
ts
,
NULL
);
nanosleep
(
&
ts
,
NULL
);
}
}
static
void
dataCallback
(
uint8_t
request
,
unsigned
char
*
data
,
size_t
length
,
void
*
user_data
)
{
struct
eismultiplexer
*
muliplexer
=
user_data
;
if
(
length
>=
1
)
muliplexer
->
activeChannels
=
data
[
0
];
sem_post
(
&
muliplexer
->
readSem
);
}
int
eismultiplexer_connect
(
struct
eismultiplexer
*
muliplexer
,
int
serial
)
int
eismultiplexer_connect
(
struct
eismultiplexer
*
muliplexer
,
int
serial
)
{
{
int
ret
;
int
ret
;
...
@@ -56,17 +49,13 @@ int eismultiplexer_connect(struct eismultiplexer* muliplexer, int serial)
...
@@ -56,17 +49,13 @@ int eismultiplexer_connect(struct eismultiplexer* muliplexer, int serial)
if
(
!
muliplexer
->
priv
)
if
(
!
muliplexer
->
priv
)
return
-
1
;
return
-
1
;
ret
=
usbshm_init
(
muliplexer
->
priv
,
&
dataCallback
,
muliplexer
);
ret
=
usbshm_init
(
muliplexer
->
priv
,
NULL
,
muliplexer
);
if
(
ret
)
if
(
ret
)
return
-
2
;
return
-
2
;
ret
=
usbshm_open
(
muliplexer
->
priv
,
0xfe17
,
0x07dc
,
NULL
);
ret
=
usbshm_open
(
muliplexer
->
priv
,
0xfe17
,
0x07dc
,
NULL
);
if
(
ret
)
if
(
ret
)
return
-
3
;
return
-
3
;
ret
=
sem_init
(
&
muliplexer
->
readSem
,
0
,
0
);
if
(
ret
)
return
-
4
;
return
0
;
return
0
;
}
}
...
@@ -92,19 +81,22 @@ int eismultiplexer_connect_channel(struct eismultiplexer* muliplexer, channel_t
...
@@ -92,19 +81,22 @@ int eismultiplexer_connect_channel(struct eismultiplexer* muliplexer, channel_t
int
eismultiplexer_disconnect_channel
(
struct
eismultiplexer
*
muliplexer
,
channel_t
channel
)
int
eismultiplexer_disconnect_channel
(
struct
eismultiplexer
*
muliplexer
,
channel_t
channel
)
{
{
channel_t
channels
=
eismultiplexer_get_connected
(
muliplexer
);
channel_t
channels
=
CHANNEL_NONE
;
if
(
channel
!=
CHANNEL_NONE
)
{
channels
=
eismultiplexer_get_connected
(
muliplexer
);
channels
&=
~
channel
;
channels
&=
~
channel
;
}
return
eismultiplexer_connect_channel_exclusive
(
muliplexer
,
channels
);
return
eismultiplexer_connect_channel_exclusive
(
muliplexer
,
channels
);
}
}
channel_t
eismultiplexer_get_connected
(
struct
eismultiplexer
*
muliplexer
)
channel_t
eismultiplexer_get_connected
(
struct
eismultiplexer
*
muliplexer
)
{
{
u
sbshm_readControlTransfer
(
muliplexer
->
priv
,
3
,
1
)
;
u
int8_t
buffer
[
2
]
=
{}
;
sem_wait
(
&
muliplexer
->
readSem
);
usbshm_readControlTransferSync
(
muliplexer
->
priv
,
3
,
buffer
,
1
);
return
muliplexer
->
activeChannels
;
return
buffer
[
0
]
;
}
}
int
eismultiplexer_set_led
(
struct
eismultiplexer
*
muliplexer
,
bool
on
)
int
eismultiplexer_set_led
(
struct
eismultiplexer
*
muliplexer
,
bool
on
)
{
{
int
ret
;
int
ret
;
...
@@ -113,10 +105,24 @@ int eismultiplexer_set_led(struct eismultiplexer* muliplexer, bool on)
...
@@ -113,10 +105,24 @@ int eismultiplexer_set_led(struct eismultiplexer* muliplexer, bool on)
return
ret
;
return
ret
;
}
}
int
eismultiplexer_write_eeprom
(
struct
eismultiplexer
*
muliplexer
,
uint16_t
addr
,
uint16_t
value
)
{
int
ret
;
while
((
ret
=
usbshm_writeControlTransfer
(
muliplexer
->
priv
,
4
,
NULL
,
0
,
value
,
addr
))
==
USBSHM_ERROR_AGAIN
)
usleep
(
1000000
);
return
ret
;
}
uint16_t
eismultiplexer_read_eeprom
(
struct
eismultiplexer
*
muliplexer
,
uint16_t
addr
)
{
uint8_t
buffer
[
2
]
=
{};
usbshm_readControlTransferSync
(
muliplexer
->
priv
,
5
,
buffer
,
2
);
return
*
((
uint16_t
*
)
buffer
);
}
void
eismultiplexer_disconnect
(
struct
eismultiplexer
*
muliplexer
)
void
eismultiplexer_disconnect
(
struct
eismultiplexer
*
muliplexer
)
{
{
usbshm_distroy
(
muliplexer
->
priv
);
usbshm_distroy
(
muliplexer
->
priv
);
free
(
muliplexer
->
priv
);
free
(
muliplexer
->
priv
);
muliplexer
->
priv
=
NULL
;
muliplexer
->
priv
=
NULL
;
sem_destroy
(
&
muliplexer
->
readSem
);
}
}
This diff is collapsed.
Click to expand it.
eismultiplexer.h
+
10
−
9
View file @
e43ef91f
...
@@ -43,20 +43,18 @@ extern "C" {
...
@@ -43,20 +43,18 @@ extern "C" {
#endif
#endif
typedef
enum
{
typedef
enum
{
CHANNEL_A
=
(
1
<<
1
),
CHANNEL_A
=
(
1
<<
0
),
CHANNEL_B
=
(
1
<<
2
),
CHANNEL_B
=
(
1
<<
1
),
CHANNEL_C
=
(
1
<<
3
),
CHANNEL_C
=
(
1
<<
2
),
CHANNEL_D
=
(
1
<<
4
),
CHANNEL_D
=
(
1
<<
3
),
CHANNEL_E
=
(
1
<<
5
),
CHANNEL_E
=
(
1
<<
4
),
CHANNEL_F
=
(
1
<<
6
),
CHANNEL_F
=
(
1
<<
5
),
CHANNEL_G
=
(
1
<<
7
),
CHANNEL_G
=
(
1
<<
6
),
CHANNEL_NONE
=
0
,
CHANNEL_NONE
=
0
,
}
channel_t
;
}
channel_t
;
struct
eismultiplexer
{
struct
eismultiplexer
{
struct
usbshm
*
priv
;
struct
usbshm
*
priv
;
sem_t
readSem
;
channel_t
activeChannels
;
};
};
/**
/**
...
@@ -112,6 +110,9 @@ int eismultiplexer_set_led(struct eismultiplexer* muliplexer, bool on);
...
@@ -112,6 +110,9 @@ int eismultiplexer_set_led(struct eismultiplexer* muliplexer, bool on);
*/
*/
void
eismultiplexer_disconnect
(
struct
eismultiplexer
*
muliplexer
);
void
eismultiplexer_disconnect
(
struct
eismultiplexer
*
muliplexer
);
int
eismultiplexer_write_eeprom
(
struct
eismultiplexer
*
muliplexer
,
uint16_t
addr
,
uint16_t
value
);
uint16_t
eismultiplexer_read_eeprom
(
struct
eismultiplexer
*
muliplexer
,
uint16_t
addr
);
#ifdef __cplusplus
#ifdef __cplusplus
}
}
#endif
#endif
...
...
This diff is collapsed.
Click to expand it.
main.c
+
64
−
24
View file @
e43ef91f
...
@@ -25,6 +25,7 @@
...
@@ -25,6 +25,7 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
*/
#include
<stdint.h>
#include
<stdio.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<stdlib.h>
#include
<string.h>
#include
<string.h>
...
@@ -33,7 +34,7 @@
...
@@ -33,7 +34,7 @@
void
print_help
(
const
char
*
progname
)
void
print_help
(
const
char
*
progname
)
{
{
printf
(
"usage: %s [OPERATION] [CHANNEL] [VALUE]
\n
"
,
progname
);
printf
(
"usage: %s [OPERATION] [CHANNEL] [VALUE]
\n
"
,
progname
);
printf
(
"available operations: connect disconnect help
\n
"
);
printf
(
"available operations: connect disconnect
clear connect_all get
help
\n
"
);
}
}
channel_t
char_to_channel
(
char
ch
)
channel_t
char_to_channel
(
char
ch
)
...
@@ -67,13 +68,20 @@ channel_t char_to_channel(char ch)
...
@@ -67,13 +68,20 @@ channel_t char_to_channel(char ch)
case
'g'
:
case
'g'
:
case
'G'
:
case
'G'
:
case
'7'
:
case
'7'
:
return
CHANNEL_
NONE
;
return
CHANNEL_
G
;
default:
default:
return
CHANNEL_NONE
;
return
CHANNEL_NONE
;
}
}
}
}
void
disconnect
(
struct
eismultiplexer
*
multiplexer
)
{
eismultiplexer_set_led
(
multiplexer
,
false
);
eismultiplexer_disconnect
(
multiplexer
);
}
int
main
(
int
argc
,
char
*
argv
[])
int
main
(
int
argc
,
char
*
argv
[])
{
{
if
(
argc
<
2
||
strcmp
(
argv
[
1
],
"help"
)
==
0
)
if
(
argc
<
2
||
strcmp
(
argv
[
1
],
"help"
)
==
0
)
...
@@ -90,18 +98,49 @@ int main(int argc, char* argv[])
...
@@ -90,18 +98,49 @@ int main(int argc, char* argv[])
return
1
;
return
1
;
}
}
if
(
argc
!=
4
)
eismultiplexer_set_led
(
&
multiplexer
,
true
);
if
(
strcmp
(
argv
[
1
],
"clear"
)
==
0
)
{
{
print_help
(
argv
[
0
]);
eismultiplexer_disconnect_channel
(
&
multiplexer
,
CHANNEL_NONE
);
eismultiplexer_disconnect
(
&
multiplexer
);
}
else
if
(
strcmp
(
argv
[
1
],
"write"
)
==
0
)
{
eismultiplexer_write_eeprom
(
&
multiplexer
,
0
,
42
);
}
else
if
(
strcmp
(
argv
[
1
],
"read"
)
==
0
)
{
uint16_t
value
=
eismultiplexer_read_eeprom
(
&
multiplexer
,
0
);
printf
(
"0: %u
\n
"
,
value
);
}
else
if
(
strcmp
(
argv
[
1
],
"connect_all"
)
==
0
)
{
eismultiplexer_connect_channel
(
&
multiplexer
,
0xff
);
}
else
if
(
strcmp
(
argv
[
1
],
"get"
)
==
0
)
{
channel_t
channels
=
eismultiplexer_get_connected
(
&
multiplexer
);
printf
(
"%d
\n
"
,
channels
);
for
(
size_t
i
=
0
;
i
<
7
;
++
i
)
{
bool
connected
=
channels
&
(
1
<<
i
);
printf
(
"Channel %c: %s
\n
"
,
(
char
)(
'A'
+
i
),
connected
?
"on"
:
"off"
);
}
}
else
{
if
(
argc
!=
3
)
{
printf
(
"Usage %s %s [CHANNEL]
\n
"
,
argv
[
0
],
argv
[
1
]);
disconnect
(
&
multiplexer
);
return
2
;
return
2
;
}
}
channel_t
channel
=
char_to_channel
(
argv
[
2
][
0
]);
channel_t
channel
=
char_to_channel
(
argv
[
2
][
0
]);
if
(
channel
==
CHANNEL_NONE
)
if
(
channel
==
CHANNEL_NONE
)
{
{
printf
(
"%c is not a valid channel"
,
argv
[
2
][
0
]);
printf
(
"%c is not a valid channel
\n
"
,
argv
[
2
][
0
]);
eismultiplexer_
disconnect
(
&
multiplexer
);
disconnect
(
&
multiplexer
);
return
2
;
return
2
;
}
}
...
@@ -109,8 +148,8 @@ int main(int argc, char* argv[])
...
@@ -109,8 +148,8 @@ int main(int argc, char* argv[])
{
{
if
(
eismultiplexer_connect_channel
(
&
multiplexer
,
channel
))
if
(
eismultiplexer_connect_channel
(
&
multiplexer
,
channel
))
{
{
printf
(
"could not connect channel %c"
,
argv
[
2
][
0
]);
printf
(
"could not connect channel %c
\n
"
,
argv
[
2
][
0
]);
eismultiplexer_
disconnect
(
&
multiplexer
);
disconnect
(
&
multiplexer
);
return
3
;
return
3
;
}
}
}
}
...
@@ -118,12 +157,13 @@ int main(int argc, char* argv[])
...
@@ -118,12 +157,13 @@ int main(int argc, char* argv[])
{
{
if
(
eismultiplexer_disconnect_channel
(
&
multiplexer
,
channel
))
if
(
eismultiplexer_disconnect_channel
(
&
multiplexer
,
channel
))
{
{
printf
(
"could not connect channel %c"
,
argv
[
2
][
0
]);
printf
(
"could not
dis
connect channel %c
\n
"
,
argv
[
2
][
0
]);
eismultiplexer_
disconnect
(
&
multiplexer
);
disconnect
(
&
multiplexer
);
return
3
;
return
3
;
}
}
}
}
}
eismultiplexer_
disconnect
(
&
multiplexer
);
disconnect
(
&
multiplexer
);
return
0
;
return
0
;
}
}
This diff is collapsed.
Click to expand it.
usbshm.c
+
12
−
7
View file @
e43ef91f
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include
"usbshm.h"
#include
"usbshm.h"
#include
<stdint.h>
#include
<stdio.h>
#include
<stdio.h>
#include
<stdatomic.h>
#include
<stdatomic.h>
#include
<stdbool.h>
#include
<stdbool.h>
...
@@ -98,7 +99,6 @@ int usbshm_init(struct usbshm* instance, void (*dataCallback)(uint8_t request, u
...
@@ -98,7 +99,6 @@ int usbshm_init(struct usbshm* instance, void (*dataCallback)(uint8_t request, u
instance
->
user_data
=
user_data
;
instance
->
user_data
=
user_data
;
if
(
objectCounter
==
0
)
if
(
objectCounter
==
0
)
{
{
printf
(
"Usb Init
\n
"
);
ret
=
libusb_init
(
NULL
)
<
0
?
USBSHM_ERROR_ERR
:
0
;
ret
=
libusb_init
(
NULL
)
<
0
?
USBSHM_ERROR_ERR
:
0
;
libusbDataMutex
=
malloc
(
sizeof
(
*
libusbDataMutex
));
libusbDataMutex
=
malloc
(
sizeof
(
*
libusbDataMutex
));
pthread_mutex_init
(
libusbDataMutex
,
NULL
);
pthread_mutex_init
(
libusbDataMutex
,
NULL
);
...
@@ -118,7 +118,6 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const char
...
@@ -118,7 +118,6 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const char
{
{
instance
->
priv
->
handle
=
NULL
;
instance
->
priv
->
handle
=
NULL
;
pthread_mutex_lock
(
libusbDataMutex
);
pthread_mutex_lock
(
libusbDataMutex
);
printf
(
"Listing Devices
\n
"
);
libusb_device
**
list
;
libusb_device
**
list
;
int
count
=
libusb_get_device_list
(
NULL
,
&
list
);
int
count
=
libusb_get_device_list
(
NULL
,
&
list
);
int
errorCode
=
0
;
int
errorCode
=
0
;
...
@@ -163,7 +162,6 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const char
...
@@ -163,7 +162,6 @@ int usbshm_open(struct usbshm* instance, int vendorID, int productID, const char
errorCode
=
USBSHM_ERROR_ERR
;
errorCode
=
USBSHM_ERROR_ERR
;
}
}
libusb_free_device_list
(
list
,
count
);
libusb_free_device_list
(
list
,
count
);
pthread_mutex_unlock
(
libusbDataMutex
);
pthread_mutex_unlock
(
libusbDataMutex
);
return
errorCode
;
return
errorCode
;
...
@@ -221,7 +219,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
...
@@ -221,7 +219,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
else
return
USBSHM_ERROR_AGAIN
;
else
return
USBSHM_ERROR_AGAIN
;
}
}
int
usbshm_readControlTransfer
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
const
uint
8
_t
length
)
int
usbshm_readControlTransfer
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
const
uint
16
_t
length
)
{
{
if
(
!
usbshm_isOpen
(
instance
))
if
(
!
usbshm_isOpen
(
instance
))
return
USBSHM_ERROR_NOT_CONNECTED
;
return
USBSHM_ERROR_NOT_CONNECTED
;
...
@@ -231,7 +229,8 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
...
@@ -231,7 +229,8 @@ int usbshm_readControlTransfer(struct usbshm* instance, const uint8_t request, c
{
{
pthread_mutex_lock
(
libusbDataMutex
);
pthread_mutex_lock
(
libusbDataMutex
);
instance
->
priv
->
buffer
=
malloc
(
length
+
8
);
instance
->
priv
->
buffer
=
malloc
(
length
+
8
);
libusb_fill_control_setup
(
instance
->
priv
->
buffer
,
LIBUSB_REQUEST_TYPE_VENDOR
|
LIBUSB_RECIPIENT_DEVICE
|
LIBUSB_ENDPOINT_IN
,
request
,
request
,
request
,
length
);
libusb_fill_control_setup
(
instance
->
priv
->
buffer
,
LIBUSB_REQUEST_TYPE_VENDOR
|
LIBUSB_RECIPIENT_DEVICE
|
LIBUSB_ENDPOINT_IN
,
request
,
request
,
request
,
length
);
instance
->
priv
->
transfer
=
libusb_alloc_transfer
(
0
);
instance
->
priv
->
transfer
=
libusb_alloc_transfer
(
0
);
libusb_fill_control_transfer
(
instance
->
priv
->
transfer
,
instance
->
priv
->
handle
,
instance
->
priv
->
buffer
,
&
usbshm_transferCallBack
,
instance
,
100
);
libusb_fill_control_transfer
(
instance
->
priv
->
transfer
,
instance
->
priv
->
handle
,
instance
->
priv
->
buffer
,
&
usbshm_transferCallBack
,
instance
,
100
);
int
ret
=
libusb_submit_transfer
(
instance
->
priv
->
transfer
);
int
ret
=
libusb_submit_transfer
(
instance
->
priv
->
transfer
);
...
@@ -265,3 +264,9 @@ static void usbshm_transferCallBack(struct libusb_transfer *transfer)
...
@@ -265,3 +264,9 @@ static void usbshm_transferCallBack(struct libusb_transfer *transfer)
libusb_free_transfer
(
context
->
priv
->
transfer
);
libusb_free_transfer
(
context
->
priv
->
transfer
);
context
->
priv
->
transfer
=
NULL
;
context
->
priv
->
transfer
=
NULL
;
}
}
int
usbshm_readControlTransferSync
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
uint8_t
*
buffer
,
const
uint16_t
length
)
{
return
libusb_control_transfer
(
instance
->
priv
->
handle
,
LIBUSB_REQUEST_TYPE_VENDOR
|
LIBUSB_RECIPIENT_DEVICE
|
LIBUSB_ENDPOINT_IN
,
request
,
request
,
request
,
buffer
,
length
,
2000
);
}
This diff is collapsed.
Click to expand it.
usbshm.h
+
4
−
1
View file @
e43ef91f
...
@@ -28,6 +28,7 @@
...
@@ -28,6 +28,7 @@
#include
<libusb-1.0/libusb.h>
#include
<libusb-1.0/libusb.h>
#include
<pthread.h>
#include
<pthread.h>
#include
<stdatomic.h>
#include
<stdatomic.h>
#include
<stdint.h>
#include
<time.h>
#include
<time.h>
#include
<stdbool.h>
#include
<stdbool.h>
...
@@ -67,5 +68,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
...
@@ -67,5 +68,7 @@ int usbshm_writeControlTransfer(struct usbshm* instance, const uint8_t request,
char
*
buffer
,
const
uint8_t
length
,
char
*
buffer
,
const
uint8_t
length
,
const
uint16_t
wValue
,
const
uint16_t
wIndex
);
const
uint16_t
wValue
,
const
uint16_t
wIndex
);
int
usbshm_readControlTransfer
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
const
uint8_t
length
);
int
usbshm_readControlTransfer
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
const
uint16_t
length
);
int
usbshm_readControlTransferSync
(
struct
usbshm
*
instance
,
const
uint8_t
request
,
uint8_t
*
buffer
,
const
uint16_t
length
);
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment