Home | History | Annotate | Download | only in public
      1 /**
      2  * @defgroup MCD_API                    MobiCore Driver API
      3  * @addtogroup MCD_API
      4  * @{
      5  *
      6  * @if DOXYGEN_MCDRV_API
      7  *   @mainpage MobiCore Driver API.
      8  * @endif
      9  *
     10  * MobiCore Driver API.
     11  *
     12  * The MobiCore (MC) Driver API provides access functions to the MobiCore runtime environment and the contained Trustlets.
     13  *
     14  * @image html DoxyOverviewDrvApi500x.png
     15  * @image latex DoxyOverviewDrvApi500x.png "MobiCore Overview" width=12cm
     16  *
     17  * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 -->
     18  *
     19  * Redistribution and use in source and binary forms, with or without
     20  * modification, are permitted provided that the following conditions
     21  * are met:
     22  * 1. Redistributions of source code must retain the above copyright
     23  *    notice, this list of conditions and the following disclaimer.
     24  * 2. Redistributions in binary form must reproduce the above copyright
     25  *    notice, this list of conditions and the following disclaimer in the
     26  *    documentation and/or other materials provided with the distribution.
     27  * 3. The name of the author may not be used to endorse or promote
     28  *    products derived from this software without specific prior
     29  *    written permission.
     30  *
     31  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     32  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     33  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     34  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     35  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
     37  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     38  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     39  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
     40  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     41  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     42  */
     43 #ifndef MCDRIVER_H_
     44 #define MCDRIVER_H_
     45 
     46 #if (!defined(__MC_CLIENT_LIB_API)) && __cplusplus
     47 #define __MC_CLIENT_LIB_API       extern "C"
     48 #else
     49 #define __MC_CLIENT_LIB_API
     50 #endif // __cplusplus
     51 
     52 
     53 #include <stdint.h>
     54 #include <stdbool.h>
     55 
     56 #include "mcUuid.h"
     57 #include "mcVersionInfo.h"
     58 
     59 /*
     60  *  MobiCore driver API error codes.
     61  *  MAJOR part of error code is stable.
     62  *  MCP part contains MCP result code. See MCI/mcimcp.h
     63  *  DETAIL part may be used in testing for specific error code.
     64  *
     65  *  Detail error codes may change in different releases
     66  *  Please do not test DETAIL part when comparing error codes.
     67  */
     68 #define MC_DRV_ERROR_MAJOR(ecode)    ((ecode)       & 0xFF)     /**< Get MAJOR part of error code. */
     69 #define MC_DRV_ERROR_MCP(ecode)     (((ecode)>>8)   & 0xFF)     /**< Get MCP part of error code. */
     70 #define MC_DRV_ERROR_DETAIL(ecode)  (((ecode)>>16)  & 0x0FFF)   /**< Get detail part of error code. */
     71 
     72 typedef uint32_t mcResult_t;
     73 /**
     74  * Return values of MobiCore driver functions.
     75  */
     76 #define MC_DRV_OK                                   0x00000000 /**< Function call succeeded. */
     77 #define MC_DRV_NO_NOTIFICATION                      0x00000001 /**< No notification available. */
     78 #define MC_DRV_ERR_NOTIFICATION                     0x00000002 /**< Error during notification on communication level. */
     79 #define MC_DRV_ERR_NOT_IMPLEMENTED                  0x00000003 /**< Function not implemented. */
     80 #define MC_DRV_ERR_OUT_OF_RESOURCES                 0x00000004 /**< No more resources available. */
     81 #define MC_DRV_ERR_INIT                             0x00000005 /**< Driver initialization failed. */
     82 #define MC_DRV_ERR_UNKNOWN                          0x00000006 /**< Unknown error. */
     83 #define MC_DRV_ERR_UNKNOWN_DEVICE                   0x00000007 /**< The specified device is unknown. */
     84 #define MC_DRV_ERR_UNKNOWN_SESSION                  0x00000008 /**< The specified session is unknown. */
     85 #define MC_DRV_ERR_INVALID_OPERATION                0x00000009 /**< The specified operation is not allowed. */
     86 #define MC_DRV_ERR_INVALID_RESPONSE                 0x0000000a /**< The response header from the MC is invalid. */
     87 #define MC_DRV_ERR_TIMEOUT                          0x0000000b /**< Function call timed out. */
     88 #define MC_DRV_ERR_NO_FREE_MEMORY                   0x0000000c /**< Can not allocate additional memory. */
     89 #define MC_DRV_ERR_FREE_MEMORY_FAILED               0x0000000d /**< Free memory failed. */
     90 #define MC_DRV_ERR_SESSION_PENDING                  0x0000000e /**< Still some open sessions pending. */
     91 #define MC_DRV_ERR_DAEMON_UNREACHABLE               0x0000000f /**< MC daemon not reachable */
     92 #define MC_DRV_ERR_INVALID_DEVICE_FILE              0x00000010 /**< The device file of the kernel module could not be opened. */
     93 #define MC_DRV_ERR_INVALID_PARAMETER                0x00000011 /**< Invalid parameter. */
     94 #define MC_DRV_ERR_KERNEL_MODULE                    0x00000012 /**< Error from Kernel Module, see DETAIL for errno. */
     95 #define MC_DRV_ERR_BULK_MAPPING                     0x00000013 /**< Error during mapping of additional bulk memory to session. */
     96 #define MC_DRV_ERR_BULK_UNMAPPING                   0x00000014 /**< Error during unmapping of additional bulk memory to session. */
     97 #define MC_DRV_INFO_NOTIFICATION                    0x00000015 /**< Notification received, exit code available. */
     98 #define MC_DRV_ERR_NQ_FAILED                        0x00000016 /**< Set up of NWd connection failed. */
     99 
    100 #define MC_DRV_ERR_DAEMON_VERSION                   0x00000017 /**< Wrong daemon version. */
    101 #define MC_DRV_ERR_CONTAINER_VERSION                0x00000018 /**< Wrong container version. */
    102 
    103 // those should become MCP or even detail codes on top of MC_DRV_ERR_MCP_ERROR
    104 #define MC_DRV_ERR_WRONG_PUBLIC_KEY                 0x00000019 /**< System Trustlet public key is wrong. */
    105 #define MC_DRV_ERR_CONTAINER_TYPE_MISMATCH          0x0000001a /**< Wrong containter type(s). */
    106 #define MC_DRV_ERR_CONTAINER_LOCKED                 0x0000001b /**< Container is locked (or not activated). */
    107 #define MC_DRV_ERR_SP_NO_CHILD                      0x0000001c /**< SPID is not registered with root container. */
    108 #define MC_DRV_ERR_TL_NO_CHILD                      0x0000001d /**< UUID is not registered with sp container. */
    109 #define MC_DRV_ERR_UNWRAP_ROOT_FAILED               0x0000001e /**< Unwrapping of root container failed. */
    110 #define MC_DRV_ERR_UNWRAP_SP_FAILED                 0x0000001f /**< Unwrapping of service provider container failed. */
    111 #define MC_DRV_ERR_UNWRAP_TRUSTLET_FAILED           0x00000020 /**< Unwrapping of Trustlet container failed. */
    112 
    113 // use separate numbers for those in the future
    114 #define MC_DRV_ERR_DEVICE_ALREADY_OPEN              MC_DRV_ERR_INVALID_OPERATION /** < Device is already open. */
    115 #define MC_DRV_ERR_SOCKET_CONNECT                   MC_DRV_ERR_DAEMON_UNREACHABLE /**< MC daemon socket not reachable. */
    116 #define MC_DRV_ERR_SOCKET_WRITE                     MC_DRV_ERR_DAEMON_UNREACHABLE /**< MC daemon socket write error. */
    117 #define MC_DRV_ERR_SOCKET_READ                      MC_DRV_ERR_DAEMON_UNREACHABLE /**< MC daemon socket read error. */
    118 #define MC_DRV_ERR_SOCKET_LENGTH                    MC_DRV_ERR_DAEMON_UNREACHABLE /**< MC daemon socket read error. */
    119 #define MC_DRV_ERR_DAEMON_SOCKET                    MC_DRV_ERR_DAEMON_UNREACHABLE /**< MC daemon had problems with socket. */
    120 #define MC_DRV_ERR_DEVICE_FILE_OPEN                 MC_DRV_ERR_INVALID_DEVICE_FILE /**< The device file of the kernel module could not be opened. */
    121 #define MC_DRV_ERR_NULL_POINTER                     MC_DRV_ERR_INVALID_PARAMETER /**< Null pointer passed as parameter. */
    122 #define MC_DRV_ERR_TCI_TOO_BIG                      MC_DRV_ERR_INVALID_PARAMETER /**< Requested TCI length is too high. */
    123 #define MC_DRV_ERR_WSM_NOT_FOUND                    MC_DRV_ERR_INVALID_PARAMETER /**< Requested TCI was not allocated with mallocWsm(). */
    124 #define MC_DRV_ERR_TCI_GREATER_THAN_WSM             MC_DRV_ERR_INVALID_PARAMETER /**< Requested TCI length is bigger than allocated WSM. */
    125 #define MC_DRV_ERR_TRUSTLET_NOT_FOUND               MC_DRV_ERR_INVALID_DEVICE_FILE /** < Trustlet could not be found in mcRegistry. */
    126 #define MC_DRV_ERR_DAEMON_KMOD_ERROR                MC_DRV_ERR_DAEMON_UNREACHABLE /**< Daemon cannot use Kernel module as expected. */
    127 #define MC_DRV_ERR_DAEMON_MCI_ERROR                 MC_DRV_ERR_DAEMON_UNREACHABLE /**< Daemon cannot use MCI as expected. */
    128 #define MC_DRV_ERR_MCP_ERROR                        MC_DRV_ERR_DAEMON_UNREACHABLE /**< MobiCore Control Protocol error. See MC_DRV_ERROR_MCP(). */
    129 #define MC_DRV_ERR_INVALID_LENGTH                   MC_DRV_ERR_NO_FREE_MEMORY /**< Invalid length. */
    130 #define MC_DRV_ERR_KMOD_NOT_OPEN                    MC_DRV_ERR_NO_FREE_MEMORY /**< Device not open. */
    131 #define MC_DRV_ERR_BUFFER_ALREADY_MAPPED            MC_DRV_ERR_BULK_MAPPING /**< Buffer is already mapped to this Trustlet. */
    132 #define MC_DRV_ERR_BLK_BUFF_NOT_FOUND               MC_DRV_ERR_BULK_UNMAPPING /**< Unable to find internal handle for buffer. */
    133 
    134 #define MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN           0x00000021 /**< No device associated with connection. */
    135 #define MC_DRV_ERR_DAEMON_WSM_HANDLE_NOT_FOUND      MC_DRV_ERR_WSM_NOT_FOUND /**< Daemon could not find WSM handle. */
    136 #define MC_DRV_ERR_DAEMON_UNKNOWN_SESSION           MC_DRV_ERR_UNKNOWN_SESSION /**< The specified session is unknown to Daemon. */
    137 
    138 #define MAKE_MC_DRV_MCP_ERROR(mcpCode)              (MC_DRV_ERR_MCP_ERROR | ((mcpCode&0x000FFFFF)<<8))
    139 #define MAKE_MC_DRV_KMOD_WITH_ERRNO(theErrno)       (MC_DRV_ERR_KERNEL_MODULE| (((theErrno)&0x0000FFFF)<<16))
    140 
    141 /**
    142  * Driver control command.
    143  */
    144 typedef enum {
    145     MC_CTRL_DUMMY = 1 /**< Dummy. */
    146 } mcDriverCtrl_t;
    147 
    148 
    149 /** Structure of Session Handle, includes the Session ID and the Device ID the Session belongs to.
    150  * The session handle will be used for session-based MobiCore communication.
    151  * It will be passed to calls which address a communication end point in the MobiCore environment.
    152  */
    153 typedef struct {
    154     uint32_t sessionId; /**< MobiCore session ID */
    155     uint32_t deviceId; /**< Device ID the session belongs to */
    156 } mcSessionHandle_t;
    157 
    158 /** Information structure about additional mapped Bulk buffer between the Trustlet Connector (Nwd) and
    159  * the Trustlet (Swd). This structure is initialized from a Trustlet Connector by calling mcMap().
    160  * In order to use the memory within a Trustlet the Trustlet Connector has to inform the Trustlet with
    161  * the content of this structure via the TCI.
    162  */
    163 typedef struct {
    164     void *sVirtualAddr;         /**< The virtual address of the Bulk buffer regarding the address space of the Trustlet, already includes a possible offset! */
    165     uint32_t sVirtualLen;       /**< Length of the mapped Bulk buffer */
    166 } mcBulkMap_t;
    167 
    168 
    169 #define MC_DEVICE_ID_DEFAULT       0 /**< The default device ID */
    170 #define MC_INFINITE_TIMEOUT        ((int32_t)(-1)) /**< Wait infinite for a response of the MC. */
    171 #define MC_NO_TIMEOUT              0   /**< Do not wait for a response of the MC. */
    172 #define MC_MAX_TCI_LEN             0x100000 /**< TCI/DCI must not exceed 1MiB */
    173 
    174 /* Mark only the following functions for export */
    175 #pragma GCC visibility push(default)
    176 
    177 /** Open a new connection to a MobiCore device.
    178  *
    179  * mcOpenDevice() initializes all device specific resources required to communicate
    180  * with an MobiCore instance located on the specified device in the system. If the device
    181  * does not exist the function will return MC_DRV_ERR_UNKNOWN_DEVICE.
    182  *
    183  * @param [in] deviceId Identifier for the MobiCore device to be used. MC_DEVICE_ID_DEFAULT refers to the default device.
    184  *
    185  * @return MC_DRV_OK if operation has been successfully completed.
    186  * @return MC_DRV_ERR_INVALID_OPERATION if device already opened.
    187  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    188  * @return MC_DRV_ERR_UNKNOWN_DEVICE when deviceId is unknown.
    189  * @return MC_DRV_ERR_INVALID_DEVICE_FILE if kernel module under /dev/mobicore cannot be opened
    190  *
    191  * Uses a Mutex.
    192  */
    193 __MC_CLIENT_LIB_API mcResult_t mcOpenDevice(
    194     uint32_t deviceId
    195 );
    196 
    197 /** Close the connection to a MobiCore device.
    198  * When closing a device, active sessions have to be closed beforehand.
    199  * Resources associated with the device will be released.
    200  * The device may be opened again after it has been closed.
    201  *
    202  * @param [in] deviceId Identifier for the MobiCore device. MC_DEVICE_ID_DEFAULT refers to the default device.
    203  *
    204  * @return MC_DRV_OK if operation has been successfully completed.
    205  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id is invalid.
    206  * @return MC_DRV_ERR_SESSION_PENDING when a session is still open.
    207  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    208  *
    209  * Uses a Mutex.
    210  */
    211 __MC_CLIENT_LIB_API mcResult_t mcCloseDevice(
    212     uint32_t deviceId
    213 );
    214 
    215 /** Open a new session to a Trustlet. The trustlet with the given UUID has to be available in the flash filesystem.
    216  *
    217  * Write MCP open message to buffer and notify MobiCore about the availability of a new command.
    218  * Waits till the MobiCore responses with the new session ID (stored in the MCP buffer).
    219  *
    220  * @param [in,out] session On success, the session data will be returned. Note that session.deviceId has to be the device id of an opened device.
    221  * @param [in] uuid UUID of the Trustlet to be opened.
    222  * @param [in] tci TCI buffer for communicating with the trustlet.
    223  * @param [in] tciLen Length of the TCI buffer. Maximum allowed value is MC_MAX_TCI_LEN.
    224  *
    225  * @return MC_DRV_OK if operation has been successfully completed.
    226  * @return MC_DRV_INVALID_PARAMETER if session parameter is invalid.
    227  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id is invalid.
    228  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon socket occur.
    229  * @return MC_DRV_ERR_UNKNOWN_DEVICE when daemon returns an error.
    230  *
    231  * Uses a Mutex.
    232  */
    233 __MC_CLIENT_LIB_API mcResult_t mcOpenSession(
    234     mcSessionHandle_t  *session,
    235     const mcUuid_t       *uuid,
    236     uint8_t            *tci,
    237     uint32_t           tciLen
    238 );
    239 
    240 /** Close a Trustlet session.
    241  *
    242  * Closes the specified MobiCore session. The call will block until the session has been closed.
    243  *
    244  * @pre Device deviceId has to be opened in advance.
    245  *
    246  * @param [in] session Session to be closed.
    247  *
    248  * @return MC_DRV_OK if operation has been successfully completed.
    249  * @return MC_DRV_INVALID_PARAMETER if session parameter is invalid.
    250  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    251  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    252  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    253  * @return MC_DRV_ERR_INVALID_DEVICE_FILE when daemon cannot open trustlet file.
    254  *
    255  * Uses a Mutex.
    256  */
    257 __MC_CLIENT_LIB_API mcResult_t mcCloseSession(
    258     mcSessionHandle_t *session
    259 );
    260 
    261 /** Notify a session.
    262  * Notifies the session end point about available message data.
    263  * If the session parameter is correct, notify will always succeed.
    264  * Corresponding errors can only be received by mcWaitNotification().
    265  * @pre A session has to be opened in advance.
    266  *
    267  * @param session The session to be notified.
    268  *
    269  * @return MC_DRV_OK if operation has been successfully completed.
    270  * @return MC_DRV_INVALID_PARAMETER if session parameter is invalid.
    271  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    272  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    273  */
    274 __MC_CLIENT_LIB_API mcResult_t mcNotify(
    275     mcSessionHandle_t *session
    276 );
    277 
    278 /** Wait for a notification.
    279  *
    280  * Wait for a notification issued by the MobiCore for a specific session.
    281  * The timeout parameter specifies the number of milliseconds the call will wait for a notification.
    282  * If the caller passes 0 as timeout value the call will immediately return. If timeout value is below 0 the call will block
    283  * until a notification for the session has been received.
    284  *
    285  * @attention if timeout is below 0, call will block:
    286  * Caller has to trust the other side to send a notification to wake him up again.
    287  *
    288  * @param [in] session The session the notification should correspond to.
    289  * @param [in] timeout Time in milliseconds to wait (MC_NO_TIMEOUT : direct return, > 0 : milliseconds, MC_INFINITE_TIMEOUT : wait infinitely)
    290  *
    291  * @return MC_DRV_OK if notification is available.
    292  * @return MC_DRV_ERR_TIMEOUT if no notification arrived in time.
    293  * @return MC_DRV_INFO_NOTIFICATION if a problem with the session was encountered. Get more details with mcGetSessionErrorCode().
    294  * @return MC_DRV_ERR_NOTIFICATION if a problem with the socket occurred.
    295  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    296  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    297  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    298  */
    299 __MC_CLIENT_LIB_API mcResult_t mcWaitNotification(
    300     mcSessionHandle_t  *session,
    301     int32_t            timeout
    302 );
    303 
    304 /**
    305  * Allocate a block of world shared memory (WSM).
    306  * The MC driver allocates a contiguous block of memory which can be used as WSM.
    307  * This implicates that the allocated memory is aligned according to the alignment parameter.
    308  * Always returns a buffer of size WSM_SIZE aligned to 4K.
    309  *
    310  * @param [in]  deviceId The ID of an opened device to retrieve the WSM from.
    311  * @param [in]  align The alignment (number of pages) of the memory block (e.g. 0x00000001 for 4kb).
    312  * @param [in]  len Length of the block in bytes.
    313  * @param [out] wsm Virtual address of the world shared memory block.
    314  * @param [in]  wsmFlags Platform specific flags describing the memory to be allocated.
    315  *
    316  * @attention: align and wsmFlags are currently ignored
    317  *
    318  * @return MC_DRV_OK if operation has been successfully completed.
    319  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    320  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id is invalid.
    321  * @return MC_DRV_ERR_NO_FREE_MEMORY if no more contiguous memory is available in this size or for this process.
    322  *
    323  * Uses a Mutex.
    324  */
    325 __MC_CLIENT_LIB_API mcResult_t mcMallocWsm(
    326     uint32_t  deviceId,
    327     uint32_t  align,
    328     uint32_t  len,
    329     uint8_t   **wsm,
    330     uint32_t  wsmFlags
    331 );
    332 
    333 /**
    334  * Free a block of world shared memory (WSM).
    335  * The MC driver will free a block of world shared memory (WSM) previously allocated with
    336  * mcMallocWsm(). The caller has to assure that the address handed over to the driver
    337  * is a valid WSM address.
    338  *
    339  * @param [in] deviceId The ID to which the given address belongs.
    340  * @param [in] wsm Address of WSM block to be freed.
    341  *
    342  * @return MC_DRV_OK if operation has been successfully completed.
    343  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    344  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id is invalid.
    345  * @return MC_DRV_ERR_FREE_MEMORY_FAILED on failures.
    346  *
    347  * Uses a Mutex.
    348  */
    349 __MC_CLIENT_LIB_API mcResult_t mcFreeWsm(
    350     uint32_t  deviceId,
    351     uint8_t   *wsm
    352 );
    353 
    354 /**
    355  * Map additional bulk buffer between a Trustlet Connector (TLC) and the Trustlet (TL) for a session.
    356  * Memory allocated in user space of the TLC can be mapped as additional communication channel
    357  * (besides TCI) to the Trustlet. Limitation of the Trustlet memory structure apply: only 6 chunks can be mapped
    358  * with a maximum chunk size of 1 MiB each.
    359  *
    360  * @attention It is up to the application layer (TLC) to inform the Trustlet about the additional mapped bulk memory.
    361  *
    362  * @param [in] session Session handle with information of the deviceId and the sessionId. The
    363  * given buffer is mapped to the session specified in the sessionHandle.
    364  * @param [in] buf Virtual address of a memory portion (relative to TLC) to be shared with the Trustlet, already includes a possible offset!
    365  * @param [in] len length of buffer block in bytes.
    366  * @param [out] mapInfo Information structure about the mapped Bulk buffer between the TLC (Nwd) and
    367  * the TL (Swd).
    368  *
    369  * @return MC_DRV_OK if operation has been successfully completed.
    370  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    371  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    372  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    373  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    374  * @return MC_DRV_ERR_BULK_MAPPING when buf is already uses as bulk buffer or when registering the buffer failed.
    375  *
    376  * Uses a Mutex.
    377  */
    378 __MC_CLIENT_LIB_API mcResult_t mcMap(
    379     mcSessionHandle_t  *session,
    380     void               *buf,
    381     uint32_t           len,
    382     mcBulkMap_t        *mapInfo
    383 );
    384 
    385 /**
    386  * Remove additional mapped bulk buffer between Trustlet Connector (TLC) and the Trustlet (TL) for a session.
    387  *
    388  * @attention The bulk buffer will immediately be unmapped from the session context.
    389  * @attention The application layer (TLC) must inform the TL about unmapping of the additional bulk memory before calling mcUnmap!
    390  *
    391  * @param [in] session Session handle with information of the deviceId and the sessionId. The
    392  * given buffer is unmapped from the session specified in the sessionHandle.
    393  * @param [in] buf Virtual address of a memory portion (relative to TLC) shared with the TL, already includes a possible offset!
    394  * @param [in] mapInfo Information structure about the mapped Bulk buffer between the TLC (Nwd) and
    395  * the TL (Swd).
    396  * @attention The clientlib currently ignores the len field in mapInfo.
    397  *
    398  * @return MC_DRV_OK if operation has been successfully completed.
    399  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    400  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    401  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    402  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    403  * @return MC_DRV_ERR_BULK_UNMAPPING when buf was not registered earlier or when unregistering failed.
    404  *
    405  * Uses a Mutex.
    406  */
    407 __MC_CLIENT_LIB_API mcResult_t mcUnmap(
    408     mcSessionHandle_t  *session,
    409     void               *buf,
    410     mcBulkMap_t        *mapInfo
    411 );
    412 
    413 
    414 /**
    415  * @attention: Not implemented.
    416  * Execute driver specific command.
    417  * mcDriverCtrl() can be used to execute driver specific commands.
    418  * Besides the control command MC_CTRL_GET_VERSION commands are implementation specific.
    419  * Please refer to the corresponding specification of the driver manufacturer.
    420  *
    421  * @param [in] param Command ID of the command to be executed.
    422  * @param [in, out] data  Command data and response depending on command.
    423  * @param [in] len Length of the data block.
    424  *
    425  * @return MC_DRV_ERR_NOT_IMPLEMENTED.
    426  */
    427 __MC_CLIENT_LIB_API mcResult_t mcDriverCtrl(
    428     mcDriverCtrl_t  param,
    429     uint8_t         *data,
    430     uint32_t        len
    431 );
    432 
    433 /**
    434  * Get additional error information of the last error that occured on a session.
    435  * After the request the stored error code will be deleted.
    436  *
    437  * @param [in] session Session handle with information of the deviceId and the sessionId.
    438  * @param [out] lastErr >0 Trustlet has terminated itself with this value, <0 Trustlet is dead because of an error within the MobiCore (e.g. Kernel exception).
    439  * See also notificationPayload_t enum in MCI definition at "mcinq.h".
    440  *
    441  * @return MC_DRV_OK if operation has been successfully completed.
    442  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    443  * @return MC_DRV_ERR_UNKNOWN_SESSION when session id is invalid.
    444  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device id of session is invalid.
    445  */
    446 __MC_CLIENT_LIB_API mcResult_t mcGetSessionErrorCode(
    447     mcSessionHandle_t  *session,
    448     int32_t            *lastErr
    449 );
    450 
    451 /**
    452  * Get MobiCore version information of a device.
    453  *
    454  * @param [in] deviceId of an open device.
    455  * @param [out] versionInfo MobiCore version info.
    456  *
    457  * @return MC_DRV_OK if operation has been successfully completed.
    458  * @return MC_DRV_ERR_UNKNOWN_DEVICE when device is not open.
    459  * @return MC_DRV_INVALID_PARAMETER if a parameter is invalid.
    460  * @return MC_DRV_ERR_DAEMON_UNREACHABLE when problems with daemon occur.
    461  */
    462 __MC_CLIENT_LIB_API mcResult_t mcGetMobiCoreVersion(
    463     uint32_t  deviceId,
    464     mcVersionInfo_t *versionInfo
    465 );
    466 #pragma GCC visibility pop
    467 #endif /** MCDRIVER_H_ */
    468 
    469 /** @} */
    470