state flags, makefiles

This commit is contained in:
dzavalishin 2015-06-25 13:26:34 +03:00
parent 164b218112
commit 82c6826ddc
9 changed files with 129 additions and 26 deletions

17
src/Makefile Executable file
View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

1
src/config.mk Executable file
View File

@ -0,0 +1 @@
MAKEFLAGS += --no-print-directory

View File

@ -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 );
}

View File

@ -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 ) \

View File

@ -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

12
src/test/Makefile Executable file
View File

@ -0,0 +1,12 @@
include ../config.mk
all::
# TODO
install::
# TODO
clean::
cd unit; sh clean.sh; cd ..

View File

@ -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;
}