Техническое примечание TN2076

Контроллер мощности Набора I/O

Это техническое примечание предоставляет краткое описание Набора I/O KEXT, поддерживающий управление питанием.

Если у Вас не будет времени для приобретения знаний об управлении питанием, то этот technote будет быстро вести Вас через шаги, должно было добавить управление питанием к Вашему KEXT.

Если Вы спешите, загружают Разработчика Проекта KEXT ниже, открывают системный журнал и создают расширение ядра. Можно наблюдать KEXT быть загруженным, регистрирующийся для событий питания и отвечающий на события сна. Можно тогда скопировать и вставить код (не большая сумма) в драйвер.

Наконец существует раздел, указывающий на дополнительную документацию управления питанием, выборки, DDK, и т.д. так, чтобы можно было изучить все относительно управления питанием на Mac OS X, данном, у Вас есть больше времени.

Контроллер мощности Набора I/O: беглый взгляд
Массив состояния электропитания
Процесс регистрации
Ответ на события питания
Проект
Другие источники
Загрузки
История версии документа

Контроллер мощности Набора 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

Загрузки



История версии документа


ДатаПримечания
20.06.2003

Новый документ, описывающий код для включения в KEXT для регистрации для событий управления питанием.