Implement FunctionFS transport
[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 "mtp_usb_driver.h"
19
20 static const mtp_usb_driver_t *usb_driver;
21
22 /*
23  * FUNCTIONS
24  */
25 mtp_bool _transport_init_usb_device(void)
26 {
27         if (access(MTP_DRIVER_PATH, F_OK) == 0) {
28                 usb_driver = &mtp_usb_driver_slp;
29         } else if (access(MTP_EP0_PATH, F_OK) == 0) {
30                 usb_driver = &mtp_usb_driver_ffs;
31         } else {
32                 ERR("No suport for USB gadgets in kernel");
33                 return FALSE;
34         }
35
36         return usb_driver->transport_init_usb_device();
37 }
38
39 void _transport_deinit_usb_device(void)
40 {
41         usb_driver->transport_deinit_usb_device();
42 }
43
44 mtp_uint32 _get_tx_pkt_size(void)
45 {
46         return usb_driver->get_rx_pkt_size();
47 }
48
49 mtp_uint32 _get_rx_pkt_size(void)
50 {
51         return usb_driver->get_rx_pkt_size();
52 }
53
54 /*
55  * static mtp_int32 _transport_mq_init()
56  * This function create a message queue for MTP,
57  * A created message queue will be used to help data transfer between
58  * MTP module and usb buffer.
59  * @return      This function returns TRUE on success or
60  *              returns FALSE on failure.
61  */
62 mtp_int32 _transport_mq_init(msgq_id_t *rx_mqid, msgq_id_t *tx_mqid)
63 {
64         return usb_driver->transport_mq_init(rx_mqid, tx_mqid);
65 }
66
67 void *_transport_thread_usb_write(void *arg)
68 {
69         return usb_driver->transport_thread_usb_write(arg);
70 }
71
72 void *_transport_thread_usb_read(void *arg)
73 {
74         return usb_driver->transport_thread_usb_read(arg);
75 }
76
77 void *_transport_thread_usb_control(void *arg)
78 {
79         return usb_driver->transport_thread_usb_control(arg);
80 }
81
82 /*
83  * mtp_bool __transport_mq_deinit()
84  * This function destroy a message queue for MTP,
85  * @return      This function returns TRUE on success or
86  *              returns FALSE on failure.
87  */
88 mtp_bool _transport_mq_deinit(msgq_id_t *rx_mqid, msgq_id_t *tx_mqid)
89 {
90         return usb_driver->transport_mq_deinit(rx_mqid, tx_mqid);
91 }
92
93 mtp_uint32 _transport_get_usb_packet_len(void)
94 {
95         return usb_driver->transport_get_usb_packet_len();
96 }
97
98 mtp_transport_type_t _transport_get_type(void)
99 {
100         if (usb_driver == &mtp_usb_driver_slp)
101                 return MTP_TRANSPORT_SLP;
102
103         if (usb_driver == &mtp_usb_driver_ffs)
104                 return MTP_TRANSPORT_FFS;
105
106         return MTP_TRANSPORT_UNKNOWN;
107 }