Менеджер PMU
pmu-xzynq
ЗОСРВ «Нейтрино»
aarch64
![]() | Эту утилиту может запустить только пользователь root . |
Сервер pmu-xzynq обеспечивает поддержку шины Zynq UltraScale+ PMU (Platform Management Unit).
Доступ к конкретным регистрам и возможностям осуществляется при помощи вызова devctl(). Список доступных команд DCMD_PM_*
можно посмотреть в файле <hw/zynqmp_pmu.h>
. Там же описаны структуры, используемые при отправке команд devctl().
Подключение к менеджеру pmu-xzynq:
#include <devctl.h>#include <sys/dcmd_chr.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <errno.h>#include <hw/zynqmp_pmu.h>#include <hw/clk.h>int main( int argc, char *argv[] ){int fd;if ( (fd = open( ZYNQMP_PMU_DEV, O_RDWR )) == -1 ){fprintf( stderr, "Error with open() on %s. Make sure it exists.\n", ZYNQMP_PMU_DEV );perror( NULL );return (-1);}...}
Выполнение команды PM_GET_API_VERSION:
int xzynq_pm_get_api_ver( int fd ){int err;zynqmp_pmu_api_version_t version = { 0 };err = devctl( fd, DCMD_PM_GET_API_VERSION, &version, sizeof( version ), NULL );if ( err ) {fprintf( stderr, "Error read API version %s\n", strerror( err ) );return err;} else {printf( "Platform Management API v%d.%d\n", version.major, version.minor );}return err;}
Выполнение команды PM_REQUEST_SUSPEND:
int xzynq_pm_request_suspend( int fd, uint32_t id ){int err;zynqmp_pmu_request_suspend_t req = { .id = id, .ack = ZYNQMP_PM_REQUEST_ACK_DEFAULT };err = devctl( fd, DCMD_PM_REQUEST_SUSPEND, &req, sizeof( req ), NULL );if ( err ){fprintf( stderr, "Error request suspend: %s\n", strerror( err ) );return err;}return err;}
Выполнение команд PM_MMIO_WRITE
и PM_MMIO_READ:
int xzynq_pm_mmio_read( int fd, uint32_t address ){int error;zynqmp_pmu_mmio_t mmio = {.address = address };if ( error = devctl( fd, DCMD_PM_MMIO_READ, &mmio, sizeof( mmio ), NULL ) ){fprintf( stderr, "Error read MMIO: %s\n", strerror( error ) );return (-1);}printf( "%s: REG %08X: 0x%08x\n", __func__, mmio.address, mmio.value );return (0);}int xzynq_pm_mmio_write( int fd, uint32_t address, uint32_t mask, uint32_t value ){int error;zynqmp_pmu_mmio_t mmio = {.address = address, .mask = mask, .value = value };if ( error = devctl( fd, DCMD_PM_MMIO_WRITE, &mmio, sizeof( mmio ), NULL ) ){fprintf( stderr, "Error write MMIO: %s\n", strerror( error ) );return (-1);}return (0);}
Выполнение команды PM_REGISTER_ACCESS:
int xzynq_pm_cfgreg_get( int fd, uint32_t address ){int error;zynqmp_pmu_cfgreg_t cfgreg = {.address = address };if ( error = devctl( fd, DCMD_PM_GET_CFGREG, &cfgreg, sizeof( cfgreg ), NULL ) ){fprintf( stderr, "Error read CFGREG: %s\n", strerror( error ) );return (-1);}printf( "%s: REG %08X: 0x%08x\n", __func__, cfgreg.address, cfgreg.value );return (0);}int xzynq_pm_cfgreg_set( int fd, uint32_t address, uint32_t mask, uint32_t value ){int error;zynqmp_pmu_cfgreg_t cfgreg = {.address = address, .mask = mask, .value = value };if ( error = devctl( fd, DCMD_PM_SET_CFGREG, &cfgreg, sizeof( cfgreg ), NULL ) ){fprintf( stderr, "Error write CFGREG: %s\n", strerror( error ) );return (-1);}return (0);}
Базовые подсистемы ЗОСРВ «Нейтрино», Драйверы
Предыдущий раздел: перейти