libsmbios_c library
|
00001 // vim:expandtab:autoindent:tabstop=4:shiftwidth=4:filetype=c: 00002 /* 00003 * Copyright (C) 2005 Dell Inc. 00004 * by Michael Brown <Michael_E_Brown@dell.com> 00005 * Licensed under the Open Software License version 2.1 00006 * 00007 * Alternatively, you can redistribute it and/or modify 00008 * it under the terms of the GNU General Public License as published 00009 * by the Free Software Foundation; either version 2 of the License, 00010 * or (at your option) any later version. 00011 00012 * This program is distributed in the hope that it will be useful, but 00013 * WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 00015 * See the GNU General Public License for more details. 00016 */ 00017 00018 00019 #ifndef SMIINTERFACE_H 00020 #define SMIINTERFACE_H 00021 00022 // compat header should always be first header, if system headers included 00023 #include "smbios/compat.h" 00024 00025 #include <iostream> 00026 #include <memory> 00027 00028 // types.h should be first user-defined header. 00029 #include "smbios/types.h" 00030 00031 #include "smbios/IFactory.h" 00032 #include "smbios/IException.h" 00033 00034 // abi_prefix should be last header included before declarations 00035 #include "smbios/config/abi_prefix.hpp" 00036 00037 namespace smi 00038 { 00040 00042 // Exceptions 00043 DECLARE_EXCEPTION( SmiException ); 00044 DECLARE_EXCEPTION_EX( InvalidSmiMode, smi, SmiException ); 00045 DECLARE_EXCEPTION_EX( ParameterError, smi, SmiException ); 00046 DECLARE_EXCEPTION_EX( UnhandledSmi, smi, SmiException ); 00047 DECLARE_EXCEPTION_EX( UnsupportedSmi, smi, SmiException ); 00048 DECLARE_EXCEPTION_EX( SmiExecutedWithError, smi, SmiException ); 00049 DECLARE_EXCEPTION_EX( PasswordVerificationFailed, smi, SmiException ); 00050 DECLARE_EXCEPTION_EX( ConfigError, smi, SmiException ); 00051 00052 class IDellCallingInterfaceSmi 00053 { 00054 public: 00055 virtual ~IDellCallingInterfaceSmi(); 00056 // compiler-generated copy and operator = are good for now, I think. 00057 00058 virtual void setClass( u16 newClass ) = 0; 00059 virtual void setSelect( u16 newSelect ) = 0; 00060 virtual void setArg( u8 argNumber, u32 argValue ) = 0; 00061 virtual u32 getRes( u8 resNumber ) const = 0; 00062 virtual void setArgAsPhysicalAddress( u8 argNumber, u32 bufferOffset ) = 0; 00063 virtual void setBufferSize(size_t size) = 0; 00064 virtual void setBufferContents(const u8 *, size_t size) = 0; 00065 virtual const u8 *getBufferPtr() = 0; 00066 00067 virtual void execute() = 0; 00068 00069 protected: 00070 explicit IDellCallingInterfaceSmi(); 00071 }; 00072 00073 // NOTE: does not hand out singletons 00074 class SmiFactory : public virtual factory::IFactory 00075 { 00076 public: 00077 enum { DELL_CALLING_INTERFACE_SMI_RAW, DELL_CALLING_INTERFACE_SMI,}; 00078 00079 static SmiFactory *getFactory(); 00080 virtual ~SmiFactory() throw(); 00081 virtual std::auto_ptr<IDellCallingInterfaceSmi> makeNew(u8 type) = 0; // not for use 00082 protected: 00083 SmiFactory(); 00084 }; 00085 00086 enum {cbARG1 = 0, cbARG2 = 1, cbARG3 = 2, cbARG4 = 3}; 00087 enum {cbRES1 = 0, cbRES2 = 1, cbRES3 = 2, cbRES4 = 3}; 00088 00089 // non-member helper functions 00090 // These encapsulate some common calling-interface SMI functions 00091 // 00092 void doSimpleCallingInterfaceSmi(u16 smiClass, u16 select, const u32 args[4], u32 res[4]); 00093 std::auto_ptr<smi::IDellCallingInterfaceSmi> setupCallingInterfaceSmi(u16 smiClass, u16 select, const u32 args[4]); 00094 u32 getAuthenticationKey(const std::string &password); 00095 00096 enum password_format_enum { PW_FORMAT_UNKNOWN, PW_FORMAT_SCAN_CODE, PW_FORMAT_ASCII }; 00097 password_format_enum getPasswordFormat(); 00098 00099 #if 0 00100 // not yet implemented 00101 std::string getServiceTag(); 00102 void setServiceTag(const std::string &password, const std::string &newTag); 00103 std::string getAssetTag(); 00104 void setAssetTag(const std::string &password, const std::string &newTag); 00105 #endif 00106 00107 bool getPasswordStatus(u16 which); 00108 00109 u32 readNVStorage (u32 location, u32 *minValue, u32 *maxValue); 00110 u32 readBatteryModeSetting(u32 location, u32 *minValue, u32 *maxValue); 00111 u32 readACModeSetting (u32 location, u32 *minValue, u32 *maxValue); 00112 u32 readSystemStatus(u32 *failingSensorHandle); 00113 00114 u32 writeNVStorage (const std::string &password, u32 location, u32 value, u32 *minValue, u32 *maxValue); 00115 u32 writeBatteryModeSetting(const std::string &password, u32 location, u32 value, u32 *minValue, u32 *maxValue); 00116 u32 writeACModeSetting (const std::string &password, u32 location, u32 value, u32 *minValue, u32 *maxValue); 00117 00118 void getDisplayType(u32 &type, u32 &resolution, u32 &memSizeX256kb); 00119 void getPanelResolution(u32 &horiz, u32 &vert); 00120 void getActiveDisplays(u32 &bits); 00121 void setActiveDisplays(u32 &bits); 00122 00123 void getPropertyOwnershipTag(char *tagBuf, size_t size); 00124 void setPropertyOwnershipTag(const std::string password, const char *newTag, size_t size); 00125 00126 // newer interface 00127 extern const int Bluetooth_Devices_Disable; // docs appear to be wrong. They say 0x0152, but this looks backwards from reality 00128 extern const int Bluetooth_Devices_Enable; // docs appear to be wrong. They say 0x0153, but this looks backwards from reality 00129 extern const int Cellular_Radio_Disable; 00130 extern const int Cellular_Radio_Enable; 00131 extern const int WiFi_Locator_Disable; 00132 extern const int WiFi_Locator_Enable; 00133 extern const int Wireless_LAN_Disable; 00134 extern const int Wireless_LAN_Enable; 00135 extern const int Wireless_Switch_Bluetooth_Control_Disable; 00136 extern const int Wireless_Switch_Bluetooth_Control_Enable; 00137 extern const int Wireless_Switch_Cellular_Control_Disable; 00138 extern const int Wireless_Switch_Cellular_Control_Enable; 00139 extern const int Wireless_Switch_Wireless_LAN_Control_Disable; 00140 extern const int Wireless_Switch_Wireless_LAN_Control_Enable; 00141 00142 // old interface 00143 extern const int Radio_Transmission_Enable; 00144 extern const int Radio_Transmission_Disable; 00145 extern const int Wireless_Device_Disable; 00146 extern const int Wireless_Device_App_Control; 00147 extern const int Wireless_Device_App_Or_Hotkey_Control; 00148 00149 enum radioNum { WLAN_RADIO_NUM=1, BLUETOOTH_RADIO_NUM=2, WWAN_RADIO_NUM=3 }; 00150 void wirelessRadioControl(bool enable, bool boot, bool runtime, int enable_token, int disable_token, int radioNum, std::string password); 00151 00152 enum { WLAN_SWITCH_CTL=1, BLUETOOTH_SWITCH_CTL=2, WWAN_SWITCH_CTL=4, LOCATOR_SWITCH_CTL=5 }; 00153 void wirelessSwitchControl(bool enable, bool boot, bool runtime, int enable_token, int disable_token, int switchNum, std::string password); 00154 00155 enum radioStatusCode { STATUS_ENABLED, STATUS_DISABLED, STATUS_NOT_PRESENT, STATUS_UNSUPPORTED, STATUS_UNKNOWN }; 00156 radioStatusCode wirelessRadioStatus(radioNum which, std::ostream &cout=std::cout, u32 defRes2=0); 00157 } 00158 00159 // always should be last thing in header file 00160 #include "smbios/config/abi_suffix.hpp" 00161 00162 #endif /* SMIINTERFACE_H */