3de9ae14ed7d1d74cab60457c36dff265ac2a297
[platform/core/connectivity/mtp-responder.git] / src / transport / mtp_usb_driver.c
1 /*
2  * Copyright (c) 2012, 2013 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <unistd.h>
18 #include <systemd/sd-daemon.h>
19 #include "mtp_usb_driver.h"
20
21 static const mtp_usb_driver_t *usb_driver;
22
23 /*
24  * FUNCTIONS
25  */
26 /* LCOV_EXCL_START */
27 mtp_bool _transport_select_driver(void)
28 {
29         if (access(MTP_DRIVER_PATH, F_OK) == 0) {
30                 usb_driver = &mtp_usb_driver_slp;
31                 DBG("SLP driver selected");
32                 return TRUE;
33         }
34
35         if (access(MTP_EP0_PATH, F_OK) == 0 || sd_listen_fds(0) >= 4) {
36                 usb_driver = &mtp_usb_driver_ffs;
37                 DBG("FFS driver selected");
38                 return TRUE;
39         }
40
41         ERR("No suport for USB gadgets in kernel");
42         return FALSE;
43 }
44
45 mtp_bool _transport_init_usb_device(void)
46 {
47         return usb_driver->transport_init_usb_device();
48 }
49
50 void _transport_deinit_usb_device(void)
51 {
52         usb_driver->transport_deinit_usb_device();
53 }
54
55 mtp_uint32 _get_tx_pkt_size(void)
56 {
57         return usb_driver->get_rx_pkt_size();
58 }
59
60 mtp_uint32 _get_rx_pkt_size(void)
61 {
62         return usb_driver->get_rx_pkt_size();
63 }
64
65 /*
66  * static mtp_int32 _transport_mq_init()
67  * This function create a message queue for MTP,
68  * A created message queue will be used to help data transfer between
69  * MTP module and usb buffer.
70  * @return      This function returns TRUE on success or
71  *              returns FALSE on failure.
72  */
73 mtp_int32 _transport_mq_init(msgq_id_t *rx_mqid, msgq_id_t *tx_mqid)
74 {
75         return usb_driver->transport_mq_init(rx_mqid, tx_mqid);
76 }
77
78 void *_transport_thread_usb_write(void *arg)
79 {
80         return usb_driver->transport_thread_usb_write(arg);
81 }
82
83 void *_transport_thread_usb_read(void *arg)
84 {
85         return usb_driver->transport_thread_usb_read(arg);
86 }
87
88 void *_transport_thread_usb_control(void *arg)
89 {
90         return usb_driver->transport_thread_usb_control(arg);
91 }
92
93 /*
94  * mtp_bool __transport_mq_deinit()
95  * This function destroy a message queue for MTP,
96  * @return      This function returns TRUE on success or
97  *              returns FALSE on failure.
98  */
99 mtp_bool _transport_mq_deinit(msgq_id_t *rx_mqid, msgq_id_t *tx_mqid)
100 {
101         return usb_driver->transport_mq_deinit(rx_mqid, tx_mqid);
102 }
103
104 mtp_uint32 _transport_get_usb_packet_len(void)
105 {
106         return usb_driver->transport_get_usb_packet_len();
107 }
108
109 mtp_transport_type_t _transport_get_type(void)
110 {
111         if (usb_driver == &mtp_usb_driver_slp)
112                 return MTP_TRANSPORT_SLP;
113
114         if (usb_driver == &mtp_usb_driver_ffs)
115                 return MTP_TRANSPORT_FFS;
116
117         return MTP_TRANSPORT_UNKNOWN;
118 }
119 /* LCOV_EXCL_STOP */