Контроллер мощности Набора I/O
Это техническое примечание предоставляет краткое описание Набора I/O KEXT, поддерживающий управление питанием.
Если у Вас не будет времени для приобретения знаний об управлении питанием, то этот technote будет быстро вести Вас через шаги, должно было добавить управление питанием к Вашему KEXT.
Если Вы спешите, загружают Разработчика Проекта KEXT ниже, открывают системный журнал и создают расширение ядра. Можно наблюдать KEXT быть загруженным, регистрирующийся для событий питания и отвечающий на события сна. Можно тогда скопировать и вставить код (не большая сумма) в драйвер.
Наконец существует раздел, указывающий на дополнительную документацию управления питанием, выборки, DDK, и т.д. так, чтобы можно было изучить все относительно управления питанием на Mac OS X, данном, у Вас есть больше времени.
Контроллер мощности Набора I/O: беглый взгляд
Контроллер мощности Набора I/O является объектом, управляющим напряжением (Vcc) и текущий (i) к устройству ввода-вывода обычно через драйвер (KEXT).
Сделать Ваш KEXT контроллером мощности, Вы must:.
Создайте массив состояния электропитания. Этот массив определяет Ваши параметры питания или потребности, такие как текущее повышение, и рассчитайте времена, установившийся ток, и т.д.
Зарегистрируйте свой KEXT в Наборе I/O. Этот шаг помещает Ваше устройство в плоскость IOPower Реестра I/O.
Переопределите setPowerState метод своего провайдера. Ваш setPowerState метод получит, включаются и от сообщений. Ваш KEXT должен сделать то, что необходимо, чтобы удалить и восстановить питание к Вашему устройству, включая любую stes информацию, которая может быть необходима Вашему KEXT.
Эти три шага описаны более подробно ниже.
Массив состояния электропитания
Массив состояния электропитания, содержавшийся в Разработчике SDK, расположен в этом пути.
/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/IOKit/pwr_mgt/IOPMpowerState.h
Пример, показанный в Перечислении 1, имеет массив состояния электропитания с двумя состояниями, состояния которого «включены» и «выключены». Массивы с двумя состояниями (вкл\выкл) распространены и обеспечивают простой способ добавить код управления питанием к Вашему KEXT. См. Главу 10 Основных принципов Набора I/O и заголовочного файла в проекте HelloIOKitWithPowerManagement Загрузки для большего количества подробных данных.
Смотрите на заголовочный файл во вложенном проекте и Главе 10 Основных принципов Набора I/O для подробных данных.
Это завершает первый шаг. Теперь необходимо будет зарегистрировать массив состояния электропитания.
Перечисление состояния электропитания перечисления 1 и массив
enum {
kDTSOffState = 0,
kDTSOnState = 1,
kNumDTSStates = 2
};
static const IOPMPowerState ourPowerStates[kNumDTSStates] = {
{kIOPMPowerStateVersion1,0,0,0,0,0,0,0,0,0,0,0},
{kIOPMPowerStateVersion1,kIOPMDeviceUsable,
IOPMPowerOn,IOPMPowerOn,0,0,0,0,0,0,0,0}
}; |
Процесс регистрации
Существует три функции, которые необходимо вызвать для завершения процесса регистрации управления питанием, как показано в Перечислении 2.
Во-первых, вызовите PMinit, чтобы выделить и инициализировать переменные экземпляра управления питанием. Обязательно вызовите PMinit, прежде чем Вы попытаетесь получить доступ к тем переменным или методам управления питанием.
Во-вторых, вызовите свой метод родительского класса registerPowerDriver, чтобы добровольно предложить управлять Вашим устройством и не забывать проверять на успех.
Наконец необходимо вызвать метод родительского класса для присоединения к плоскости IOPower Реестра I/O.
Перечисление 2 , Регистрирующееся как контроллер мощности
IOLog("PowerManagement is Starting\n");
// initialize superclass variables from IOService.h
PMinit();
// register as controlling driver from IOService.h
myValue = registerPowerDriver( this,
(IOPMPowerState *) ourPowerStates, kNumDTSStates );
if (myValue != kIOReturnSuccess) {
IOLog("%s: Failed to registerPowerDriver.\n", getName());
}
// join the tree from IOService.h
provider->joinPMtree( this); |
Ответ на события питания
Последний шаг должен реализовать (переопределяют) setPowerState метод Вашего родителя IOService. Ваш драйвер является единственным объектом, понимающим, как включить и выключить Ваше устройство. Поместите объявление, показанное в Перечисление 4 в Ваш заголовочный файл:
Перечисление 3 setPowerState Объявление
virtual IOReturn setPowerState(unsigned long, IOService *); |
Эта тривиальная реализация будет достаточна для этого технического примечания. Можно изучить подробные данные этой реализации в Главе 10 Основных принципов Набора I/O.
Однако при помещении компьютера для сна, через Меню Apple, эта реализация зарегистрирует свою запись в IOLog.
Перечисление 4 setPowerState Реализация
IOReturn com_DTS_iokit_HelloIOKit::setPowerState(
unsigned long whatState, IOService* dontCare){
IOLog("Setting power state:%lu\n", whatState);
// turn your device on/off here
return IOPMAckImplied;
} |
Это - все, что необходимо сделать для имения простого осведомленного о питании драйвера включения - выключения. Теперь давайте смотреть на эти три шага, поскольку они появляются в полном Наборе I/O KEXT.
Проект
Вложенный проект Разработчика Проекта получен из Привет учебное руководство по Набору I/O.
Если Вы плохо знакомы с разработкой Apple, Вы могли бы хотеть выполнить это учебное руководство сначала. В противном случае просто загрузите проект. Этот проект включает три шага управления питанием, описанные выше, и готов работать. Необходимо будет знать, как загрузить KEXT в папку Extensions. Если Вы не знаете, как сделать это, посмотрите раздел «Test the Device Driver» учебного руководства.
Другие источники
Наконец, если у Вас есть время, можно получить больше информации об управлении питанием из следующих источников:
Диспетчер электропитания DDK содержит выборки, инструменты, и т.д.
Документ под названием Фундаментальная Глава 10 Набора I/O, «Управляя Питанием и Удалением устройства» также имеет текущую информацию.
Сопутствующее техническое примечание этому, TN 2075 PowerManagement для Macintosh; начало работы, описывает все ссылки к различным данным управления питанием.
Удача с Вашим усилием по разработке. Разработка DTS
Загрузки
theProject («tn2076.sit», 6.9K)
История версии документа
| Дата | Примечания |
|---|---|
| 20.06.2003 | Новый документ, описывающий код для включения в KEXT для регистрации для событий управления питанием. |