// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
// Hardware Configuration Respoitory Platform Independent Layer (PIL)
//
/**
@file hcr.h
Kernel side API for Hardware Configuration Repository (HCR). The HCR service
provides access to hardware settings defined for the base port.
@publishedPartner
@prototype
*/
#ifndef HCR_H
#define HCR_H
// -- INCLUDES ----------------------------------------------------------------
#include <e32err.h>
#include <e32def.h>
#include <e32cmn.h>
#include <e32des8.h>
// -- CLASSES -----------------------------------------------------------------
/**
The HCR namespace contains all the types and APIs that make up the
Kernel side Hardware Configuration Repository (HCR).
It provides accessor functions to settings held by the HCR and may be used by
kernel side clients such as physical device drivers and other services from
thread contexts.
The published Setting IDs available for use with this API can be found
in the BSP exported header 'hcrconfig.h'. This provides the top-level header
that clients can include to gain access to all IDs for the BSP.
*/
namespace HCR
{
/** Maximum length of a large setting type, in bytes */
static const TInt KMaxSettingLength = 512;
/** Setting category identifier type */
typedef TUint32 TCategoryUid;
/** Setting element identifier type */
typedef TUint32 TElementId;
/** The setting Identifier structure. Used to create static initialised
arrys for use with multiple setting retrieval calls.
*/
struct SSettingId
{
TCategoryUid iCat; //!< Allocated UID for setting category
TElementId iKey; //!< Element indetifier for setting in category
};
/** The setting Identifier type. A class used to uniquely identify a
setting in the HCR. Used in calls to HCR API.
*/
class TSettingId : public SSettingId
{
public:
TSettingId ()
{ iCat = iKey = 0; };
TSettingId (TCategoryUid aCat, TElementId aKey)
{ iCat = aCat; iKey = aKey; };
TSettingId (const SSettingId& aId)
{ iCat = aId.iCat; iKey = aId.iKey; };
TSettingId& operator= (const SSettingId& rhs)
{ iCat = rhs.iCat; iKey = rhs.iKey; return *this; }
};
/** The setting types supported. The types are shown in two groups: Word
size - a maximum of 4 bytes; and ii) Large size - types exceeding 4 bytes
in size.
*/
enum TSettingType
{
ETypeUndefined = 0, //!< Type unknown/not set
// Word size settings
ETypeInt32 = 0x00000001, //!< 32bit signed integer
ETypeInt16 = 0x00000002, //!< 16bit signed integer
ETypeInt8 = 0x00000004, //!< 8bit signed integer
ETypeBool = 0x00000008, //!< 32bit boolean value
ETypeUInt32 = 0x00000010, //!< 32bit unsigned integer
ETypeUInt16 = 0x00000020, //!< 16bit unsigned integer
ETypeUInt8 = 0x00000040, //!< 8bit unsigned integer
ETypeLinAddr = 0x00000100, //!< 32bit virtual address
// Large settings
ETypeBinData = 0x00010000, //!< Raw binary data (TUint8 array)
ETypeText8 = 0x00020000, //!< String data (TText8 array)
ETypeArrayInt32 = 0x00040000, //!< 32bit signed integer array
ETypeArrayUInt32 = 0x00080000, //!< 32bit unsigned integer array
ETypeInt64 = 0x01000000, //!< 64bit signed integer
ETypeUInt64 = 0x02000000, //!< 64bit unsigned integer
};
/**
Retrieve settings of built in types from the HCR.
@param aId The setting identifier
@param aValue The retrieved setting data value
@return KErrNone if successful, output parameters valid
KErrNotFound if aId is not a known setting ID
KErrArgument if the setting identified is not the correct type
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace.
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetInt(const TSettingId& aId, TInt8& aValue);
IMPORT_C TInt GetInt(const TSettingId& aId, TInt16& aValue);
IMPORT_C TInt GetInt(const TSettingId& aId, TInt32& aValue);
IMPORT_C TInt GetInt(const TSettingId& aId, TInt64& aValue);
IMPORT_C TInt GetBool(const TSettingId& aId, TBool& aValue);
IMPORT_C TInt GetUInt(const TSettingId& aId, TUint8& aValue);
IMPORT_C TInt GetUInt(const TSettingId& aId, TUint16& aValue);
IMPORT_C TInt GetUInt(const TSettingId& aId, TUint32& aValue);
IMPORT_C TInt GetUInt(const TSettingId& aId, TUint64& aValue);
IMPORT_C TInt GetLinAddr(const TSettingId& aId, TLinAddr& aValue);
/**
Retrieve a binary data (ETypeBinData) setting from the HCR.
@param aId The setting identifier
@param aMaxLen The maximum value length that can be stored in the buffer
@param aValue A pointer to the buffer or a descriptor to hold the value
@param aLen Contains the length of the setting value written
@return KErrNone if successful and aValue has been set
KErrNotFound if aId is not a known setting ID
KErrArgument if the setting identified is not the correct type
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrTooBig if the setting is larger than the supplied buffer
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetData(const TSettingId& aId, TDes8& aValue);
IMPORT_C TInt GetData(const TSettingId& aId, TUint16 aMaxLen,
TUint8* aValue, TUint16& aLen);
/**
Retrieve a character string (ETypeText8) setting from the HCR.
@param aId The setting identifier
@param aMaxLen The maximum value length that can be stored in the buffer
@param aValue A pointer to the buffer or a descriptor to hold the value
@param aLen Contains the length of the setting value written
@return KErrNone if successful and aValue has been set
KErrNotFound if aId is not a known setting ID
KErrArgument if the setting identified is not the correct type
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrTooBig if the setting is larger than the supplied buffer
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetString(const TSettingId& aId, TDes8& aValue);
IMPORT_C TInt GetString(const TSettingId& aId, TUint16 aMaxLen,
TText8* aValue, TUint16& aLen);
/**
Retrieve an array setting from the HCR. All value length paramters are
measured in bytes.
@param aId The setting identifier
@param aMaxLen The maximum value length that can be stored in the buffer
@param aValue A pointer to the buffer to hold the value
@param aLen Contains the length of the setting value written
@return KErrNone if successful and aValue has been set
KErrNotFound if aId is not a known setting ID
KErrArgument if the setting identified is not the correct type
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrTooBig if the setting is larger than the supplied buffer
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetArray(const TSettingId& aId, TUint16 aMaxLen,
TInt32* aValue, TUint16& aLen);
IMPORT_C TInt GetArray(const TSettingId& aId, TUint16 aMaxLen,
TUint32* aValue, TUint16& aLen);
/**
Retrieve multiple simple settings from the Hardware Configuration
Repository in one call. This method can be used for all settings of size 4
bytes or less (i.e those with a type in 0x0000ffff).
@param aNum in: The number of settings to retrieve. It is also the
size of the arrays in the following arguments
@param aIds in: An ordered array of setting identifiers to retrieve, lowest first
@param aValues out: An array of values, populated on exit
@param aTypes out: An optional array of type enumerations describing
the type of each setting found. May be 0 if client is
not interested
@param aErrors out: A mandatory array supplied by the user which is populated by error
codes for each setting. If no error found for the setting then
KErrNone(=0) is written
setting.
Possible error codes:
KErrArgument if the setting has size larger than
four bytes
KErrNotFound if the setting is not found
KErrNone no any errors reported for this setting
@return Zero or positive number of settings found, -ve on error
KErrArgument if some parameters are wrong(i.e. aErrors is a null
pointer, aNum is negative and so on)
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace
KErrNotReady if the HCR is used before it has been initialised
KErrNoMemory if the memory allocation within this function failed
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetWordSettings(TInt aNum, const SSettingId aIds[],
TInt32 aValues[], TSettingType aTypes[], TInt aErrors[]);
/**
Retrieve the type and size of a HCR setting. Can be used by clients to
obtain the setting size if a dynamic buffer is to be used.
@param aId The setting identifier
@param aType The type enumeration of found setting
@param aLen The length in bytes of found setting
@return KErrNone if successful, output parameters valid
KErrNotFound if aId is not a known setting ID
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt GetTypeAndSize(const TSettingId& aId,
TSettingType& aType, TUint16& aLen);
/**
Retrieve the number of settings held in the HCR for one particular category.
It allows a client to perpare buffers for other calls to the HCR to
retrieve these settings.
This search method will return the total number of setting records found
across all HCR repositories for a given category. It does not apply the
override rules of other routines meaning that it counts duplicates to
maintain performance.
@param aCatUid in: The setting identifier category to use in the search
@return Zero or positive number of settings found in category, -ve on error
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt FindNumSettingsInCategory (TCategoryUid aCatUid);
/**
Retrieve all the setting ids, types and sizes in one particular
category. Can be used by clients to obtain the number, size and types of
all the settings in a category. It allows a client to alloc buffers for
other calls to the HCR to retrieve these settings should any be larger than
4 bytes.
@param aCatUid in: The setting identifier category to use in the search
@param aMaxNum in: The maximum number of settings to return. It is also
the size of the arrays in the following arguments
@param aKeyIds inout: Client supplied array populated on exit. Large
enough to hold all elements in category.
@param aTypes inout: Client supplied array populated with setting types
enumerations on exit. May be 0 if client is
not interested.
@param aLens inout: Client supplied array populated with setting lengths
on exit. May be 0 if client is not interested.
@return Zero or positive number of settings found in category, -ve on error
KErrArgument if some parameters are wrong(i.e. aErrors is a null
pointer, aNum is negative and so on)
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt FindSettings(TCategoryUid aCatUid, TInt aMaxNum,
TElementId aKeyIds[], TSettingType aTypes[], TUint16 aLens[]);
/**
Finds multiple settings in the Hardware Configuration Repository who's
setting ID matches the supplied search bit pattern. This method is useful
for categories that contain structured settings i.e. row/column structured
or record based categories as might be the case with hardware service
providers.
The caller supplies the category to search, an element ID mask and the
pattern to match. SettingIDs that satisfy this logic are returned:
((elementID & aElementMask) == (aPattern & aElementMask))
For example, a set of driver capability structures might be encoded into
an element ID where the 24 MSb are the row/record number and the 8 LSb
are the column/field index. Thus to retrieve all fields in row 2 supply:
aElemMask = 0xffffff00, aPattern = 0x000002**
to retrieve key fields of all records supply:
aElemMask = 0x000000ff, aPattern = 0x******01
(* = dont care)
@param aCat in: The category to retrieve settings for
@param aMaxNum in: The maximum number of settings to retrieve. It is also
the size of the arrays in the following arguments
@param aElemMask in: The bits in the Element ID to be checked against
aPattern
@param aPattern in: Identified the bits that must be set for a
setting to be returned in the search
@param aKeyIds inout: Client supplied array populated on exit. Large
enough to hold aMaxNum element ids.
@param aTypes inout: Client supplied array populated with setting types
enumerations on exit. May be 0 if client is
not interested.
@param aLen inout: Client supplied array populated with setting lengths
on exit. May be 0 if client is not interested.
@return Zero or positive number of settings found in category, -ve on error
KErrArgument if some parameters are wrong(i.e. aErrors is a null
pointer, aNum is negative and so on)
KErrNotReady if the HCR is used before it has been initialised
KErrCorrupt if HCR finds a repository to be corrupt
KErrGeneral if an internal failure occurs, see trace
KErrNoMemory if the memory allocation within this function failed
Otherwise one of the other system-wide error codes.
@pre Call from thread context, during Init1 or later
*/
IMPORT_C TInt FindSettings(TCategoryUid aCat, TInt aMaxNum,
TUint32 aMask, TUint32 aPattern, TElementId aKeyIds[],
TSettingType aTypes[], TUint16 aLens[]);
}
#endif // HCR_H