QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
5.7 KiB

3 years ago
/*
Copyright (c) 2012, Broadcom Europe Ltd
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the copyright holder nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef DRIVER_H_
#define DRIVER_H_
#include "vcinclude/common.h"
/******************************************************************************
Global Macros
*****************************************************************************/
// build the driver function table names through macro magic
#define DRIVER_CONCATENATE(a,b) a##b
//concat the driver name and the _get_func_table extension
#define DRIVER_NAME(x) DRIVER_CONCATENATE( x, _get_func_table )
/******************************************************************************
Global Defines
*****************************************************************************/
typedef enum
{
DRIVER_FLAGS_DUMMY
// DRIVER_FLAGS_SUPPORTS_CORE_FREQ_CHANGE = 0x1,
// DRIVER_FLAGS_SUPPORTS_RUN_DOMAIN_CHANGE = 0x2,
// DRIVER_FLAGS_SUPPORTS_SUSPEND_RESUME = 0x4
} DRIVER_FLAGS_T;
/******************************************************************************
Function defines
*****************************************************************************/
//Generic handle passed used by all drivers
typedef struct opaque_driver_handle_t *DRIVER_HANDLE_T;
//Routine to initialise a driver
typedef int32_t (*DRIVER_INIT_T)( void );
//Routine to shutdown a driver
typedef int32_t (*DRIVER_EXIT_T)( void );
//Routine to return a drivers info (name, version etc..)
typedef int32_t (*DRIVER_INFO_T)(const char **driver_name,
uint32_t *version_major,
uint32_t *version_minor,
DRIVER_FLAGS_T *flags );
//Routine to open a driver.
typedef int32_t (*DRIVER_OPEN_T)(const void *params,
DRIVER_HANDLE_T *handle );
//Routine to close a driver
typedef int32_t (*DRIVER_CLOSE_T)( const DRIVER_HANDLE_T handle );
//Test routine to open a test driver
typedef int32_t (*DRIVER_TEST_INIT_T)( DRIVER_HANDLE_T *handle );
//Test routine to close a test driver
typedef int32_t (*DRIVER_TEST_EXIT_T)( const DRIVER_HANDLE_T handle );
/******************************************************************************
Driver struct definition
*****************************************************************************/
/* Basic driver structure, as implemented by all device drivers */
#define COMMON_DRIVER_API(param1) \
/*Used to be param1... but no drivers were using multiple params and MSVC doesn't like vararg macros*/ \
/*Function to initialize the driver. This is used at the start of day to //initialize the driver*/ \
DRIVER_INIT_T init; \
\
/*Routine to shutdown a driver*/ \
DRIVER_EXIT_T exit; \
\
/*Function to get the driver name + version*/ \
DRIVER_INFO_T info; \
\
/*Function to open an instance of the driver. Takes in option parameters, //defined per driver.*/ \
/*Returns a handle to the open driver and a success code*/ \
int32_t (*open)(param1, \
DRIVER_HANDLE_T *handle ); \
\
/*Function to close a driver instance*/ \
/*Returns success code*/ \
DRIVER_CLOSE_T close;
typedef struct
{
//just include the basic driver api
COMMON_DRIVER_API(void const *unused)
} DRIVER_T;
/******************************************************************************
Test Driver struct definition
*****************************************************************************/
/* Test driver structure, implemented by all (optional) test drivers */
#define COMMON_DRIVER_TEST_API \
/*Function used to tell a driver that the core freq is about to change*/ \
/*Returns success code (0 if its ok to change the clock)*/ \
DRIVER_TEST_INIT_T test_init;\
\
/*Function used to tell a driver if a power domain is about to change*/ \
/*Returns success code (0 if its ok to change the power domains)*/ \
DRIVER_TEST_EXIT_T test_exit;
typedef struct
{
//just include the test driver api
COMMON_DRIVER_TEST_API
} DRIVER_TEST_T;
#define VCFW_AUTO_REGISTER_DRIVER(type, name) \
pragma Data(LIT, ".drivers"); \
static const type * const name##_ptr = &name; \
pragma Data;
#define VCFW_AUTO_REGISTER_BASE_DRIVER(type, name) \
pragma Data(LIT, ".drivers_base"); \
static const type * const name##_ptr = &name; \
pragma Data;
#endif // DRIVER_H_