Пакеты поддержки модулей для ЗОСРВ «Нейтрино» > AArch64 (ARM64) > BSP для Xilinx Zynq UltraScale+ MPSoC > Описание компонентов > Список компонентов, входящих в состав ППМ > pmu-xzynq



pmu-xzynq

Менеджер PMU

Синтаксис:

pmu-xzynq

Платформы:

ЗОСРВ «Нейтрино»

Целевые архитектуры:

aarch64

Описание:


Caution: Эту утилиту может запустить только пользователь 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);
}

Классификация:

Базовые подсистемы ЗОСРВ «Нейтрино», Драйверы




Предыдущий раздел: перейти