mirror of https://github.com/dzavalishin/openpod
state flags, makefiles
This commit is contained in:
parent
164b218112
commit
82c6826ddc
|
@ -0,0 +1,17 @@
|
|||
include config.mk
|
||||
|
||||
default::
|
||||
@echo make all or make install
|
||||
@echo doing make all by default
|
||||
$(MAKE) all
|
||||
|
||||
install::
|
||||
# TODO
|
||||
|
||||
all::
|
||||
# TODO
|
||||
|
||||
clean::
|
||||
$(MAKE) -C libs clean
|
||||
$(MAKE) -C test clean
|
||||
|
|
@ -14,16 +14,19 @@
|
|||
|
||||
errno_t simple_driver_sense( struct pod_driver *drv )
|
||||
{
|
||||
// TODO detect hardware here
|
||||
drv->private_data = &test_device;
|
||||
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_INIT );
|
||||
|
||||
#if 0
|
||||
// TODO detect hardware here
|
||||
if( not_detected )
|
||||
{
|
||||
drv->private_data = 0;
|
||||
return ENOENT;
|
||||
}
|
||||
#endif
|
||||
drv->private_data = &test_device;
|
||||
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_FOUND );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -19,7 +19,8 @@ errno_t simple_driver_activate( struct pod_driver *drv )
|
|||
|
||||
if( dev == 0 ) return ENOENT;
|
||||
|
||||
// TODO update flag in device struct?
|
||||
POD_DEV_STATE_CLEAR( dev, POD_DEV_STATE_PAUSE );
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_LINKED );
|
||||
|
||||
rc = pod_dev_link( drv, dev );
|
||||
if( rc ) return rc;
|
||||
|
@ -43,12 +44,11 @@ errno_t simple_driver_deactivate( struct pod_driver *drv )
|
|||
rc = pod_dev_event( drv, dev, POD_EVENT_LOG, "device deactivated" );
|
||||
if( rc ) return rc;
|
||||
|
||||
// TODO update flag in device struct?
|
||||
|
||||
|
||||
rc = pod_dev_unlink( drv, dev );
|
||||
if( rc ) return rc;
|
||||
|
||||
//POD_DEV_STATE_SET( dev, POD_DEV_STATE_PAUSE );
|
||||
POD_DEV_STATE_CLEAR( dev, POD_DEV_STATE_LINKED );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
MAKEFLAGS += --no-print-directory
|
|
@ -59,33 +59,58 @@ typedef struct pod_dev_f
|
|||
|
||||
#define POD_DEVICE_MAGIC 0xDEFF00A3
|
||||
|
||||
// TODO describe state flags in spec
|
||||
|
||||
// Device is initialized (constructed)
|
||||
#define POD_DEV_STATE_INIT (1<<0)
|
||||
// Device hardware existst and operational
|
||||
#define POD_DEV_STATE_FOUND (1<<1)
|
||||
// Device is linked to the kernel and supposed to be ready to serve requests
|
||||
#define POD_DEV_STATE_LINKED (1<<2)
|
||||
// Device is still linked to the kernel, but is paused, no requests must
|
||||
// be started in this state, but device accepts requests
|
||||
#define POD_DEV_STATE_PAUSE (1<<3)
|
||||
// Device is stopping, no requests are served, and will
|
||||
// return pod_rq_status_stopped err code
|
||||
#define POD_DEV_STATE_EXIT (1<<4)
|
||||
|
||||
|
||||
#define POD_DEV_REPORT_STATE( ___dev ) do { int state_copy = (___dev)->state_flags; pod_dev_event( drv, dev, POD_EVENT_STATE, &state_copy ); } while(0)
|
||||
|
||||
#define POD_DEV_STATE_SET( ___dev, ___stfl ) do { (___dev)->state_flags |= (___stfl); POD_DEV_REPORT_STATE( ___dev ) } while(0)
|
||||
#define POD_DEV_STATE_CLEAR( ___dev, ___stfl ) do { (___dev)->state_flags &= ~(___stfl); POD_DEV_REPORT_STATE( ___dev ) } while(0)
|
||||
|
||||
#define POD_DEV_STATE_CHECK( ___dev, ___stfl ) ( ( ((___dev)->state_flags) & (___stfl) ) != 0 )
|
||||
|
||||
|
||||
|
||||
typedef struct pod_device
|
||||
{
|
||||
// char magic[4];
|
||||
uint32_t magic;
|
||||
uint32_t magic;
|
||||
|
||||
uint8_t class_id;
|
||||
uint8_t pad0;
|
||||
uint8_t pad1;
|
||||
uint8_t flags; // operating or not
|
||||
uint8_t class_id;
|
||||
uint8_t class_flags; // Class specific flags,
|
||||
uint8_t pad1;
|
||||
uint8_t state_flags; // Device state
|
||||
|
||||
struct pod_driver *drv;
|
||||
|
||||
pod_dev_f *calls; // dev io entry points
|
||||
pod_dev_f *calls; // dev io entry points
|
||||
|
||||
pod_properties *prop;
|
||||
|
||||
void *class_interface; // dev class specific interface
|
||||
void *private_data;
|
||||
void *class_interface; // dev class specific interface
|
||||
void *private_data;
|
||||
|
||||
// ----------------------------------------------------------------------
|
||||
// Fields below are used by default framework code
|
||||
|
||||
// Request queue, used by pod_dev_q_ functions
|
||||
struct pod_q *default_r_q; // default request q
|
||||
pod_request *curr_rq; // request we do now
|
||||
pod_thread *rq_run_thread; // thread used to run requests
|
||||
pod_cond *rq_run_cond; // triggered to run next request
|
||||
pod_request *curr_rq; // request we do now
|
||||
pod_thread *rq_run_thread; // thread used to run requests
|
||||
pod_cond *rq_run_cond; // triggered to run next request
|
||||
|
||||
} pod_device;
|
||||
|
||||
|
@ -104,6 +129,12 @@ inline errno_t pod_rq_enqueue( pod_device *dev, pod_request *rq )
|
|||
return 0;
|
||||
}
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_INIT ) )
|
||||
return ENXIO;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_FOUND ) )
|
||||
return ENODEV;
|
||||
|
||||
rq->err = pod_rq_status_unprocessed;
|
||||
|
||||
return dev->calls->enqueue( dev, rq );
|
||||
|
@ -115,6 +146,12 @@ inline errno_t pod_rq_dequeue( pod_device *dev, pod_request *rq )
|
|||
if( (dev == 0) || (dev->calls == 0) || (dev->calls->dequeue == 0 ) )
|
||||
return EFAULT;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_INIT ) )
|
||||
return ENXIO;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_FOUND ) )
|
||||
return ENODEV;
|
||||
|
||||
return dev->calls->dequeue( dev, rq );
|
||||
}
|
||||
|
||||
|
@ -123,6 +160,12 @@ inline errno_t pod_rq_fence( pod_device *dev, pod_request *rq )
|
|||
if( (dev == 0) || (dev->calls == 0) || (dev->calls->fence == 0 ) )
|
||||
return EFAULT;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_INIT ) )
|
||||
return ENXIO;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_FOUND ) )
|
||||
return ENODEV;
|
||||
|
||||
return dev->calls->fence( dev, rq );
|
||||
}
|
||||
|
||||
|
@ -131,6 +174,12 @@ inline errno_t pod_rq_raise( pod_device *dev, pod_request *rq, uint32_t io_prio
|
|||
if( (dev == 0) || (dev->calls == 0) || (dev->calls->raise_prio == 0 ) )
|
||||
return EFAULT;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_INIT ) )
|
||||
return ENXIO;
|
||||
|
||||
if( !POD_DEV_STATE_CHECK( dev, POD_DEV_STATE_FOUND ) )
|
||||
return ENODEV;
|
||||
|
||||
return dev->calls->raise_prio( dev, rq, io_prio );
|
||||
}
|
||||
|
||||
|
|
|
@ -14,6 +14,20 @@
|
|||
//*******************************************************************
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
//
|
||||
// Constants
|
||||
//
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
// Driver supports boolean alpha channel (blits if alpha byte is not zero)
|
||||
#define POD_CLASS_VIDEO_FLAG_HAS_APLHA (1<<0)
|
||||
// Driver supports fractional alpha channel (blit mixes pixel according to alpha byte value)
|
||||
#define POD_CLASS_VIDEO_FLAG_HAS_FAPLHA (1<<0)
|
||||
// Driver supports Z buffer (blits if Z coordinate of pixel we paint is > than Z coordinate of onscreen pixel )
|
||||
#define POD_CLASS_VIDEO_FLAG_HAS_ZBUF (1<<2)
|
||||
|
||||
|
||||
// çíà÷åíèå ïîëÿ operation èëè èíäåêñ â òàáëèöó ìåòîäîâ class_interface
|
||||
typedef enum pod_video_operartions
|
||||
{
|
||||
|
@ -45,11 +59,11 @@ typedef enum pod_v_flags {
|
|||
|
||||
|
||||
|
||||
//*******************************************************************
|
||||
//-------------------------------------------------------------------
|
||||
//
|
||||
// Struct to fill into the class_specific field of request
|
||||
//
|
||||
//*******************************************************************
|
||||
//-------------------------------------------------------------------
|
||||
|
||||
// TODO move defines to rq hdr - BUG, must return rq
|
||||
#define create_op_rq( __type, __class, __op ) \
|
||||
|
|
|
@ -37,7 +37,8 @@ typedef struct pod_thread
|
|||
// ------------------------------------------------------------------
|
||||
|
||||
// Event types
|
||||
#define POD_EVENT_LOG 0
|
||||
#define POD_EVENT_LOG 0 // Log a message about the device, pointer to msg string
|
||||
#define POD_EVENT_STATE 0 // Report driver state change, pointer to int state_flags (readonly)
|
||||
|
||||
errno_t pod_dev_link( struct pod_driver *drv, struct pod_device *dev ); // Report a new available device to the OS kernel
|
||||
errno_t pod_dev_unlink( struct pod_driver *drv, struct pod_device *dev ); // Report device to be unavailable
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
include ../config.mk
|
||||
|
||||
all::
|
||||
# TODO
|
||||
|
||||
install::
|
||||
# TODO
|
||||
|
||||
clean::
|
||||
cd unit; sh clean.sh; cd ..
|
||||
|
||||
|
|
@ -265,7 +265,8 @@ errno_t test_driver_activate( struct pod_driver *drv )
|
|||
|
||||
if( dev == 0 ) return ENOENT;
|
||||
|
||||
// TODO update flag in device struct?
|
||||
POD_DEV_STATE_CLEAR( dev, POD_DEV_STATE_PAUSE );
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_LINKED );
|
||||
|
||||
rc = pod_dev_link( drv, dev );
|
||||
if( rc ) return rc;
|
||||
|
@ -285,15 +286,15 @@ errno_t test_driver_deactivate( struct pod_driver *drv )
|
|||
|
||||
if( dev == 0 ) return ENOENT;
|
||||
|
||||
|
||||
rc = pod_dev_event( drv, dev, POD_EVENT_LOG, "device deactivated" );
|
||||
if( rc ) return rc;
|
||||
|
||||
// TODO update flag in device struct?
|
||||
|
||||
|
||||
rc = pod_dev_unlink( drv, dev );
|
||||
if( rc ) return rc;
|
||||
|
||||
//POD_DEV_STATE_SET( dev, POD_DEV_STATE_PAUSE );
|
||||
POD_DEV_STATE_CLEAR( dev, POD_DEV_STATE_LINKED );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -301,10 +302,15 @@ errno_t test_driver_deactivate( struct pod_driver *drv )
|
|||
|
||||
errno_t test_driver_sense( struct pod_driver *drv )
|
||||
{
|
||||
// 'find' hardware
|
||||
|
||||
drv->private_data = &test_device;
|
||||
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_INIT );
|
||||
|
||||
// 'find' hardware
|
||||
|
||||
POD_DEV_STATE_SET( dev, POD_DEV_STATE_FOUND );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue