Rockchip · AI & Linux Hub

Аппаратные интерфейсы

Полный справочник API Rockchip PCIe EP: Linux RC, Windows ioctl и EP

Полный справочник API Rockchip PCIe EP: Linux RC, Windows ioctl и EP — V3.3.0.

· ArmSoM Editorial · Rockchip source documentation · 35 мин чтения

Оригинал V3.3.0, по 57 страниц в каждом языке. Сохранены API, синтаксис, параметры, результаты, структуры и примеры. Это платформенный справочник: проверьте возможности EP/RC конкретной ArmSoM, версию chips_connect SDK, ядро и ABI драйвера. Поддержка на ArmSoM не проверялась; сброс, загрузка прошивок и DMA не выполнялись. Независимых технических рисунков нет; таблицы редактируемые.

Вопросы оригинала: описание bar5 указывает bar1; rk_pcie_task_destroy ссылается на rk_pcie_ap_init; предварительный rk_pcie_dev_init отличается от rk_pcie_device_init; заголовок Windows говорит EP, но содержит RC ioctl. Сверьте с соответствующим SDK, не исправляя имена догадками.

Различие API: китайские страницы 30 и 56 содержат E_TASK_MSG_DESTORY, английские — E_TASK_MSG_DESTROY. Написание оригиналов сохранено; русский и немецкий следуют английскому. При компиляции сверяйтесь с заголовком SDK. Повторные вызовы pthread_mutex_unlock и условие if (ret) сохранены, выполнение не проверялось.

ArmSoM Docs · Rockchip Linux

1. Справочник Chips Connect API

1.1 PCIe Linux RC

1.1.1 rk_pcie_get_pci_bus_addresses

Описание

Получить адреса шин всех подходящих PCI-устройств системы.

Синтаксис

int rk_pcie_get_pci_bus_addresses(int vendor_id, int device_id, struct pcie_dev_bus
*pci_bus)

Параметры

Имя параметра Описание Вход/выход
vendor_id Идентификатор производителя PCIe Вход
device_id Идентификатор продукта PCIe Вход
pci_bus Структура адреса шины PCI Выход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_get_pci_bus_addresses

1.1.2 rk_pcie_device_init

Описание

Инициализировать устройство PCIe.

Синтаксис

RK_PCIE_HANDLES rk_pcie_device_init(struct pcie_dev_attr_st *dev)

Параметры

Имя параметра Описание Вход/выход
dev Структура настройки устройства PCIe Вход

Возвращаемые значения

Возвращаемое значение Описание
Не NULL Успех
NULL Ошибка

Пример

#define VENDOR_ID                   0x1d87
#define DEVICE_ID                   0x356a

struct pcie_dev_bus dev_bus;
struct pcie_dev_attr_st dev_attr;
RK_PCIE_HANDLES rk_handle;
int ret;

ret = rk_pcie_get_pci_bus_addresses(VENDOR_ID, DEVICE_ID, &dev_bus);
if (ret != 0) {
    printf("get pci bus address fail\n");
    return -1;
}

printf("ep dev max num : %d\n", dev_bus.dev_max_num);
if (dev_bus.dev_max_num == 0) {
    printf("no ep device, exit ... \n");
} else {
    // Initialize PCIe device
    dev_attr.using_rc_dma = 0; // Disable RC DMA, use EP DMA transfer
    dev_attr.rc_dma_chn = 0;
    dev_attr.vendor_id = VENDOR_ID;
    dev_attr.device_id = DEVICE_ID;
    dev_attr.use_dma_only_in_rc = 0;
    // Select the first matching device
    memcpy(dev_attr.pci_bus_address, dev_bus.pci_bus_address[0],
strlen(dev_bus.pci_bus_address[0]));

    // Initialize EP device
    rk_handle = rk_pcie_device_init(&dev_attr);
    if (rk_handle == NULL) {
        printf("pcie device init fail:%s \n", dev_attr.pci_bus_address);
        return -1;
    }

    // Deinitialize PCIe device, release resources
    ret = rk_pcie_device_deinit(rk_handle, 0);
    if (ret != 0) {
        printf("pcie deinit device fail....ret = %d\n", ret);
        return -1;
    }
}

Связанные темы

rk_pcie_device_deinit

1.1.3 rk_pcie_device_deinit

Описание

Деинициализировать устройство PCIe и освободить ресурсы.

Синтаксис

int rk_pcie_device_deinit(RK_PCIE_HANDLES handles, int en_remove)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
en_remove Освободить ресурсы и удалить устройство Вход

Возвращаемое значение

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_device_init

1.1.4 rk_pcie_task_create

Описание

Создать задачу по атрибутам, выделить память и организовать управление BUFF. Вызов блокируется, ожидая вызова интерфейса создания задачи устройством EP.

Синтаксис

int rk_pcie_task_create(RK_PCIE_HANDLES handles, struct pcie_task_attr_st *task)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
task Структура настройки PCIe Task Вход

Возвращаемые значения

Возвращаемое значение Описание
Больше 0 Успех, task_id
Меньше 0 Ошибка; см. коды ошибок

Пример

// Select the first matching device
rc_ctx.rk_handle = rk_pcie_device_init(&rc_ctx.dev_attr);
if (rc_ctx.rk_handle == NULL) {
    printf("pcie device init fail:%s \n", rc_ctx.dev_attr.pci_bus_address);
    return -1;
}

rc_ctx.task_attr.send_buff_num = 5; // Number of send buffers
rc_ctx.task_attr.send_buff_size = 1048576;   // Size of send buffer
rc_ctx.task_attr.recv_buff_num = 5; // Number of receive buffers
rc_ctx.task_attr.recv_buff_size = 8294408 ;  // Size of receive buffer
rc_ctx.task_attr.wait_timeout_ms = -1;  // Blocking wait
rc_ctx.task_id = rk_pcie_task_create(rc_ctx.rk_handle, &rc_ctx.task_attr);
if (rc_ctx.task_id < 0) {
    printf("pcie init create task fail....\n");
    return -1;
}

rk_pcie_get_ep_mode(rc_ctx.rk_handle, &rc_ctx.devmode);
printf("ep ap init, dev mode: %d, submode: %d\n", rc_ctx.devmode.mode,
rc_ctx.devmode.submode);
ret = rk_pcie_task_destroy(rc_ctx.rk_handle, rc_ctx.task_id);
if (ret != 0) {
    printf("pcie destory task fail....ret = %d\n", ret);
    return -1;
}

Связанные темы

rk_pcie_task_destroy

Примечание

Интерфейс зависит от rk_pcie_dev_init: сначала инициализируйте устройство, затем задачу.

1.1.5 rk_pcie_task_destroy

Описание

Деинициализировать Task, освободив её память и ресурсы управления BUFF.

Синтаксис

int rk_pcie_task_destroy(RK_PCIE_HANDLES handles, int task_id)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
task_id ID задачи Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_ap_init.

Связанные темы

rk_pcie_ap_init

1.1.6 rk_pcie_boot_init

Описание

Инициализировать PCIE BOOT.

Синтаксис

int rk_pcie_boot_init(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

// Initialize PCIE device
rc_ctx.rk_handle = rk_pcie_device_init(&rc_ctx.dev_attr);
if (rc_ctx.rk_handle == NULL) {
    printf("device init fail \n");
    return -1;
}

// Initialize PCIE Boot
ret = rk_pcie_boot_init(rc_ctx.rk_handle);
if (ret != 0) {
    printf("pcie boot init ep fail....ret = %d\n", ret);
    return -1;
}

// pcie boot
rk_pcie_boot_download_firmware_list(&rc_ctx, &pcie_boot_info, &pcie_boot_ini);

// ep boot
rk_ep_boot_download_firmware_list(&rc_ctx, &ep_boot_info, &ep_boot_ini);

// Release PCIE Boot resources
ret = rk_pcie_boot_deinit(rc_ctx.rk_handle);
if (ret != 0) {
    printf("pcie boot deinit ep fail....ret = %d\n", ret);
    return -1;
}

printf("download ep end\n");

Связанные темы

rk_pcie_boot_deinit

Примечание

Интерфейс зависит от rk_pcie_dev_init: сначала инициализируйте устройство, затем boot.

1.1.7 rk_pcie_boot_deinit

Описание

Деинициализировать PCIe BOOT.

Синтаксис

int rk_pcie_boot_deinit(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

rk_pcie_boot_init

Связанные темы

rk_pcie_boot_init

1.1.8 rk_pcie_boot_download_firmware

Описание

Загрузить прошивку PCIE BOOT.

Синтаксис

int rk_pcie_boot_download_firmware(RK_PCIE_HANDLES handles, unsigned char *firmware, size_t
firmware_size, unsigned long remote_load_addr)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
firmware Данные прошивки Вход
firmware_size Размер прошивки Вход
remote_load_addr Адрес загрузки удалённой прошивки Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

int rk_ep_download_firmware(struct rc_context_st *rc_ctx, char *firmware, unsigned long
load_addr)
{
    int fd;
    unsigned long len;
    unsigned long size = 1024 * 1024;
    void *buffer = malloc(size);
    int ret;
    fd = open(firmware, O_RDONLY);
    if (fd == -1) {
        printf(" open %s file error, ret = %d \n", firmware, fd);
        return -1;
    }

    while ((len = read(fd, buffer, size)) > 0) {
        ret = rk_pcie_boot_download_firmware(rc_ctx->rk_handle, buffer, len, load_addr);
        if (ret != 0) {
            return -1;
        }

        load_addr += len;
    }

    close(fd);
    return 0;
}

Связанные темы

rk_ep_download_firmware

1.1.9 rk_pcie_boot_run

Описание

Запустить прошивку PCIe BOOT.

Синтаксис

int rk_pcie_boot_run(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

rk_pcie_boot_init

Связанные темы

rk_pcie_boot_run

1.1.10 rk_pcie_get_ep_info

Описание

Получить информацию состояния EP, максимум 96KB.

Синтаксис

int rk_pcie_get_ep_info(RK_PCIE_HANDLES handles, void *status, size_t status_size)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
status Указатель void, структура состояния определяется пользователем Выход
status_size Размер структуры состояния Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Нормально
Ненулевое значение Ошибка; см. коды ошибок

Пример

struct ep_info_st {
    unsigned int link_status;
    unsigned int temp;
    long long timestamp;
    unsigned char cpu_load;
    unsigned char npu_load;
    unsigned char gpu_load;
};

long long timestamp;
while(1) {
    ret = rk_pcie_get_ep_info(rc_ctx.rk_handle, ep_info, sizeof(struct ep_info_st));
    if(timestamp == ep_info->timestamp) {
        printf("EP device status is abnormal \n");
        break;
    }
    timestamp = ep_info->timestamp;
}

Связанные темы

rk_pcie_get_ep_info

1.1.11 rk_pcie_get_user_cmd

Описание

Получить указатель на определённую область BAR0 для пользовательских команд, максимум 256KB.

Синтаксис

void *rk_pcie_get_user_cmd(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемое значение

Возвращаемое значение Описание
Не NULL Успех, указатель пользовательской командной области
NULL Ошибка

Пример

struct user_cmd_st {
    unsigned int max_chn;
    unsigned int width;
    unsigned int height;
    unsigned int codecid;
    unsigned int output_id;
    unsigned int init;
};

user_cmd = (struct user_cmd_st *)rk_pcie_get_user_cmd(rc_ctx.rk_handle);
user_cmd->max_chn = rc_ctx.max_chn;
user_cmd->width = rc_ctx.width;
user_cmd->height = rc_ctx.height;
user_cmd->codecid = rc_ctx.codecid;
user_cmd->output_id = 1; //0:RGB888 1:BGRA8888
user_cmd->init = 1;

Связанные темы

rk_pcie_get_user_cmd

1.1.12 rk_pcie_get_buff

Описание

Получить доступный буфер PCIe.

Синтаксис

struct pcie_buff_node *rk_pcie_get_buff(RK_PCIE_HANDLES handles, int task_id, enum
EBuff_Type type)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
task_id ID задачи Вход
type Тип буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
Не NULL Указатель доступного буфера
NULL Нет указателя доступного буфера

Пример

node = rk_pcie_get_buff(ctx->rk_handle, ctx->task_id, E_RECV); //Obtain an available receive BUF
if (node) {
    if (check_info(node->vir_addr + node->size - CHECK_SIZE) == 0) { //Verify the BUF data is correct
        pthread_mutex_unlock(&ctx->mutex_stream_speed);
        ctx->stream_speed_index++;
        pthread_mutex_unlock(&ctx->mutex_stream_speed);
        memset(node->vir_addr + node->size - CHECK_SIZE, 0, CHECK_SIZE);
    } else {
        printf("check data ==================== error \n");
        for (int i = 0; i < CHECK_SIZE; i++) {
            unsigned char *p = node->vir_addr + node->size - CHECK_SIZE;
            printf("%d ", p[i]);
        }
        printf("\ncheck data ===ssss========node->size = %d======== error \n", (int)node-
>size);
    }
    rk_pcie_release_buff(ctx->rk_handle, ctx->task_id, node);  //Release BUF
} else {
    usleep(1000);
}

Связанные темы

rk_pcie_release_buff

1.1.13 rk_pcie_send_buff

Описание

Отправить буфер PCIE, блокируясь до завершения DMA.

Синтаксис

int rk_pcie_send_buff(RK_PCIE_HANDLES handles, int task_id, struct pcie_buff_node *pbuff)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
task_id ID задачи Вход
pbuff Указатель буфера PCIE Вход

Возвращаемое значение

Возвращаемое значение Описание
0 Успешная отправка: данные переданы DMA.
Ненулевое значение Ошибка; см. коды ошибок

Пример

node = rk_pcie_get_buff(ctx->rk_handle, ctx->task_id, E_SEND); // Get an available send buffer
if (node) {
    node->size = buffer_size;
    // Operate on the buffer, write data
    memcpy(node->vir_addr, mptr, node->size);
    add_check_info(node->vir_addr + node->size - CHECK_SIZE);
    rk_pcie_send_buff(ctx->rk_handle, ctx->task_id, node); // Send to the other end
    index++;
} else {
    usleep(1000);
}

Связанные темы

rk_pcie_send_buff

1.1.14 rk_pcie_get_bar1_user_buffer

Описание

Получить виртуальный адрес отображения bar1.

Синтаксис

void *rk_pcie_get_bar1_user_buffer(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор всех подходящих устройств Вход

Возвращаемые значения

Возвращаемое значение Описание
void * Виртуальный адрес
NULL Ошибка; см. коды ошибок

1.1.15 rk_pcie_get_bar5_user_buffer

Описание

Получить виртуальный адрес отображения bar1.

Синтаксис

void *rk_pcie_get_bar5_user_buffer(RK_PCIE_HANDLES handles)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор всех подходящих устройств Вход

Возвращаемые значения

Возвращаемое значение Описание
void * Виртуальный адрес
NULL Ошибка; см. коды ошибок

1.1.16 rk_pcie_set_bar_inbound_cpu_addr

Описание

Настроить входящее отображение BAR.

Синтаксис

u_int64_t rk_pcie_set_bar_inbound_cpu_addr(RK_PCIE_HANDLES handles, u_int32_t atu_index,
u_int64_t cpu_address, u_int32_t size)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор всех подходящих устройств Вход
atu_index Индекс ATU Вход
cpu_address Отображённый адрес CPU Вход
size Ограничение размера отображения Вход

Возвращаемые значения

Возвращаемое значение Описание
cpu_address Возвращает адрес CPU

1.1.17 rk_pcie_release_buff

Описание

Освободить буфер PCIE.

Синтаксис

int rk_pcie_release_buff(RK_PCIE_HANDLES handles, int task_id, struct pcie_buff_node *pbuff)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор всех подходящих устройств Вход
task_id ID задачи Вход
pbuff Указатель буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успешно освобождено
Ненулевое значение Ошибка; см. коды ошибок

Пример

rk_pcie_get_buff

Связанные темы

rk_pcie_release_buff

1.1.18 rk_pcie_get_buff_max_size

Описание

Получить максимально поддерживаемый размер буфера.

Синтаксис

long rk_pcie_get_buff_max_size(RK_PCIE_HANDLES handles, int task_id, enum EBuff_Type type)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор всех подходящих устройств Вход
task_id ID задачи Вход
type Тип буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
Больше или равно 0 Размер буфера
Меньше 0 Ошибка; см. коды ошибок

Пример

long buffer_size = rk_pcie_get_buff_max_size(ctx->rk_handle, ctx->task_id, E_SEND);

Связанные темы

rk_pcie_get_buff_max_size

1.1.19 rk_pcie_get_ep_mode

Описание

Получить текущий режим EP: loader, kernel, application и другие. Определения режимов находятся в rk_pcie_rc.h.

Синтаксис

int rk_pcie_get_ep_mode(RK_PCIE_HANDLES handles, struct pcie_dev_mode *devmode)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
devmode Структура режима устройства Выход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

struct rc_context_st {
    RK_PCIE_HANDLES rk_handle;
    struct pcie_task_attr_st dev_attr;
    struct pcie_dev_mode devmode;
}rc_ctx;

// Initialize the first matching device
rc_ctx.rk_handle = rk_pcie_device_init(&rc_ctx.dev_attr);
if (rc_ctx.rk_handle == NULL) {
    printf("device init fail \n");
    usleep(1000000);
    continue;
}

rk_pcie_get_ep_mode(rc_ctx.rk_handle, &rc_ctx.devmode);
printf("111 ep device init, dev mode: 0x%.2x, submode: 0x%.2x\n", rc_ctx.devmode.mode,
rc_ctx.devmode.submode);

Связанные темы

rk_pcie_get_ep_mode

1.1.20 Повторное сканирование PCI-устройств

Описание

Повторно сканировать PCI-устройства системы. Для восстановления EP после аварийного перезапуска нужно удалить устройство, затем выполнить повторное сканирование.

Синтаксис

void rk_pcie_rescan_devices(void)

Параметры

Нет

Возвращаемое значение

Нет

Пример

Нет

Связанные темы

rk_pcie_rescan_devices

1.1.21 rk_pcie_send_msg_to_ep_bus

Описание

Отправить сообщение на EP, максимум 1504Bytes за сообщение.

Синтаксис

int rk_pcie_send_msg_to_ep_bus(RK_PCIE_HANDLES handles, int task_id, void *data, size_t
size)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
task_id ID задачи Вход
data Указатель сообщения Вход
size Длина сообщения Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

rc_ctx.task_attr.send_buff_num = 5;
rc_ctx.task_attr.send_buff_size = 5 * 1024 * 1024;
rc_ctx.task_attr.recv_buff_num = 5;
rc_ctx.task_attr.recv_buff_size = 5 * 1024 * 1024;
rc_ctx.task_attr.wait_timeout_ms = -1;
rc_ctx.task_id = rk_pcie_task_create(rc_ctx.rk_handle, &rc_ctx.task_attr);
if (rc_ctx.task_id < 0) {
    printf("pcie init create task fail....\n");
    return -1;
}

rk_pcie_get_ep_mode(rc_ctx.rk_handle, &rc_ctx.devmode);
printf("ep ap init, dev mode: 0x%.2x, submode: 0x%.2x\n", rc_ctx.devmode.mode,
rc_ctx.devmode.submode);

rc_ctx.user_cmd.cmd = EP_TEST_STATUS_RUN_APP;
rk_pcie_send_msg_to_ep_bus(rc_ctx.rk_handle, rc_ctx.task_id, (void *)&rc_ctx.user_cmd,
sizeof(struct task_user_cmd_st));

Связанные темы

rk_pcie_send_msg_to_ep_bus

1.1.22 rk_pcie_get_msg_for_task_id

Описание

Получить сообщения EP по ID задачи.

Синтаксис

int rk_pcie_get_msg_for_task_id(RK_PCIE_HANDLES handles, struct pcie_task_msg_st *msg, int
task_id, int timeout_ms)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
msg Указатель структуры сообщения Выход
task_id ID задачи Вход
timeout_ms Тайм-аут в ms; -1 — блокирующий режим с бесконечным ожиданием в ядре (не рекомендуется). Рекомендуется 100ms. Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

unsigned char cmd;
struct pcie_task_msg_st msg;
ret = rk_pcie_get_msg_for_task_id(rc_ctx.rk_handle, &msg, rc_ctx.task_id, 100);
if (ret == RK_PCIE_OK) {
    cmd = msg.data[0];
    printf("recv ep msg: %d \n", cmd);
    if (cmd == 10) {
        break;
    }
}

Связанные темы

rk_pcie_get_msg_for_task_id

1.1.23 rk_pcie_get_ep_obj_info

Описание

Получить основные сведения об EP.

Синтаксис

int rk_pcie_get_ep_obj_info(RK_PCIE_HANDLES handles, struct pcie_ep_obj_info_for_user *info)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
info Буфер основных сведений Выход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

struct pcie_ep_obj_info_for_user info;
ret = rk_pcie_get_msg_for_task_id(rc_ctx.rk_handle, &info);
if (ret == RK_PCIE_OK) {
    return ret;
}

1.1.24 rk_pcie_get_ep_err_event_count

Описание

Получить счётчики ошибок PCIe EP.

Синтаксис

int rk_pcie_get_ep_err_event_count(RK_PCIE_HANDLES handles, struct pcie_err_event_count
*info)

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход
info Счётчик ошибок PCIe Выход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

struct pcie_err_event_count info;
ret = rk_pcie_get_ep_err_event_count(rc_ctx.rk_handle, &info);
if (ret == RK_PCIE_OK) {
    return ret;
}

1.1.25 rk_pcie_is_alive

Описание

Проверить состояние линии PCIe.

Синтаксис

int rk_pcie_is_alive(RK_PCIE_HANDLES handles);

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемые значения

Возвращаемое значение Описание
cc_true Линия исправна
cc_false Линия неисправна

Пример

ret = rk_pcie_is_alive(rc_ctx.rk_handle);
if (!ret) {
    printf("PCIe link down\n");
    return ret;
}

1.1.26 rk_pcie_device_hardware_reset

Описание

Пользовательский интерфейс драйвера ядра для аппаратного сброса. Драйвер должен реализовать ioctl PCIE_EP_RESET_CTRL. В ходе операции управление PERST# выполняет аппаратный сброс EP.

Синтаксис

int rk_pcie_device_hardware_reset(RK_PCIE_HANDLES handles);

Параметры

Имя параметра Описание Вход/выход
handles Дескриптор устройства Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Сброс успешен
Ненулевое значение Сброс не удался или не поддерживается; см. коды ошибок

Пример

До сброса остановите все транзакции PCIe. Например:

printf("Reset beging...\n");
/* Reset Progress: Stop all transmision */
rc_ctx.recv_ep_exit = 1;
rc_ctx.send_ep_exit = 1;
for (int i = 0; i < THREADS_MAX; i++) {
    pthread_join(rc_ctx.thr_recv_ep[i], NULL);
    pthread_join(rc_ctx.thr_send_ep[i], NULL);
}
usleep(500000);

/* Reset Progress: Destroy task */
ret = rk_pcie_task_destroy(rc_ctx.rk_handle, rc_ctx.task_id);
if (ret != 0) {
    printf("pcie destroy task fail....ret = %d\n", ret);
    return -1;
}
usleep(100000);

/* Reset Progress: Hardware reset */
ret = rk_pcie_device_hardware_reset(rc_ctx.rk_handle);
if (ret != 0) {
    printf("pcie device hardware reset fail....ret = %d\n", ret);
}

/* Reset Progress: Wait for link up */
usleep(1000000);

/* Reset Progress: Deinit device */
ret = rk_pcie_device_deinit(rc_ctx.rk_handle, 1);
if (ret != 0) {
    printf("pcie deinit device fail....ret = %d\n", ret);
    return -1;
}

/* Reset Progress: Rescan PCI */
rk_pcie_rescan_devices();
printf("Reset done\n");

return 0;

1.1.27 Типы данных

Типы и структуры данных PCIE RC: RK_PCIE_HANDLES: Определяет дескриптор устройства. EBuff_Type: Определяет тип буфера PCIE. ETask_Msg_Type: Определяет тип сообщения Task. struct pcie_buff_node: Определяет атрибуты буфера PCIE. struct pcie_dev_bus: Определяет сведения о шине PCI-устройства.

struct pcie_dev_mode: Определяет режим PCIE EP. struct pcie_dev_attr_st: Определяет атрибуты PCIE EP. struct pcie_task_attr_st: Определяет атрибуты Task. struct pcie_task_msg_st: Определяет структуру сообщения Task. struct pcie_ep_obj_info_for_user: Определяет основные сведения PCIe. struct pcie_err_event_count: Определяет сведения об ошибках PCIe.

1.1.27.1 RK_PCIE_HANDLES

Описание

Определяет дескриптор устройства.

Определение

typedef void* RK_PCIE_HANDLES;
1.1.27.2 EBuff_Type

Описание

Определяет типы буфера PCIE.

Определение

enum EBuff_Type {
    E_SEND = 0,
    E_RECV,
};

Поля

Имя поля Описание
E_SEND Передающий буфер.
E_RECV Принимающий буфер.
1.1.27.3 ETask_Msg_Type

Пояснение

Определяет типы сообщений PCIE.

Определение

enum ETask_Msg_Type {
    E_TASK_MSG_NONE = 0,
    E_TASK_MSG_CREATE,
    E_TASK_MSG_DESTROY,
    E_TASK_MSG_USER,
    E_TASK_MSG_MAX,
};

Поля

Имя поля Описание
E_TASK_MSG_NONE Значение по умолчанию, без значения.
E_TASK_MSG_CREATE Создание задачи.
E_TASK_MSG_DESTROY Уничтожение задачи.
E_TASK_MSG_USER Пользовательское сообщение.
E_TASK_MSG_MAX Максимальный тип сообщения.
1.1.27.4 Узел буфера PCIe

Пояснение

Определяет структуру атрибутов буфера PCIE.

Определение

struct pcie_buff_node{
    void *vir_addr;
    size_t phy_addr;
    size_t size;
};

Поля

Имя поля Описание
vir_addr Виртуальный адрес.
phy_addr Физический адрес.
size Размер памяти: для отправки пользователь задаёт объём данных не больше ёмкости буфера; для приёма — размер данных другой стороны.
1.1.27.5 Шина PCIe-устройства

Пояснение

Определяет информацию шины PCI-устройств.

Определение

struct pcie_dev_bus {
    int dev_max_num;
    char pci_bus_address[PCI_DEV_MAX][PCI_BUS_MAX_NAME];
};

Поля

Имя поля Описание
dev_max_num Число подходящих устройств системы.
pci_bus_address Адрес шины PCI-устройств.
1.1.27.6 Режим устройства PCIe EP

Описание

Определяет режим устройства PCIe EP.

Определение

struct pcie_dev_mode {
    unsigned short mode;
    unsigned short submode;
};

Поля

Имя поля Описание
mode Текущий режим EP:
#define RKEP_MODE_BOOTROM 1
#define RKEP_MODE_LOADER 2
#define RKEP_MODE_KERNEL 3
#define RKEP_MODE_FUN0 4
#define RKEP_MODE_ERR 0xffff //Device exception requires reload
submode Состояние режима EP:
#define RKEP_SMODE_INIT 0
#define RKEP_SMODE_LNKRDY 1
#define RKEP_SMODE_LNKUP 2
#define RKEP_SMODE_FWDLRDY 0x10
#define RKEP_SMODE_FWDLDONE 0x11
#define RKEP_SMODE_APPRDY 0x20
#define RKEP_SMODE_APPDEINIT 0x21
#define RKEP_SMODE_ERR 0xffff
1.1.27.7 pcie_dev_attr_st

Описание

Определяет структуру атрибутов устройства PCIE EP.

Определение

struct pcie_dev_st {
    int vendor_id;
    int device_id;
    char pci_bus_address[PCI_BUS_MAX_NAME];
    unsigned char using_rc_dma: 1;
    unsigned char rc_dma_chn: 1;
    unsigned char enable_speed: 1;
    unsigned char use_dma_only_in_rc: 1; // Only call DMA to transmit and receive data on the RC side
};

Поля

Имя поля Описание
vendor_id ID производителя EP.
device_id ID устройства EP.
pci_bus_address Адрес шины EP.
using_rc_dma При соединении RK режим включает DMA RC для повышения скорости. Для нескольких EP рекомендуется отключить его и использовать DMA EP.
rc_dma_chn DMA RC поддерживает два канала: 0/1.
enable_speed Включить статистику скорости; общую скорость EP показывает cat /tmp/pcie_debug*.
use_dma_only_in_rc Вызывать DMA для передачи и приёма только на RC.
1.1.27.8 Структура атрибутов PCIe Task

Описание

Определяет структуру атрибутов PCIe Task.

Определение

struct pcie_task_attr_st {
    int wait_timeout_ms;
    unsigned int send_buff_num;
    size_t send_buff_size;
    unsigned int recv_buff_num;
    size_t recv_buff_size;
};

Поля

Имя поля Описание
wait_timeout_ms Тайм-аут интерфейса; -1 — блокирующий режим.
send_buff_num Количество передающих буферов PCIE для чередования.
send_buff_size Размер передающего буфера.
recv_buff_num Количество принимающих буферов PCIE для чередования.
recv_buff_size Размер принимающего буфера.
1.1.27.9 pcie_task_msg_st

Описание

Определяет структуру сообщения PCIE Task.

Определение

struct pcie_task_msg_st {
    enum ETask_Msg_Type type;
    int task_id;
    size_t size;
    char lock;
    unsigned char data[TASK_MSG_DATA_SIZE];
};

Поля

Имя поля Описание
type Тип сообщения.
task_id ID задачи.
size Длина сообщения.
lock Зарезервировано.
data Содержимое сообщения.
1.1.27.10 pcie_ep_obj_info_for_user

Описание

Определяет структуру основных сведений PCIE.

Определение

struct pcie_ep_obj_info_for_user {
    unsigned int magic;
    unsigned int rc_cc_version;
    unsigned int ep_cc_version;
    unsigned int func_drv_version;
    unsigned short vid;
    unsigned int did;
    unsigned int sub_vid;
    unsigned int sub_did;
};

Поля

Имя поля Описание
magic Сигнатура Chips Connect, 32 бита, по умолчанию 0x524B4550; задаётся драйвером ядра EP
rc_cc_version Версия Chips Connect RC, 32-битный возрастающий счётчик; 0x1 соответствует V1
ep_cc_version Версия Chips Connect EP, 32-битный возрастающий счётчик; 0x1 соответствует V1
func_drv_version Версия драйвера PCIe: 32 бита, старшие 8 резервные, остальные группы по 8 бит задают части версии; 0x00030100 соответствует V3.1.0
vid ID производителя PCI, 16 бит
did ID устройства PCI, 16 бит
sub_vid ID производителя подсистемы, 16 бит
sub_did ID устройства подсистемы, 16 бит
1.1.27.11 pcie_err_event_count

Описание

Определяет структуру счётчиков ошибок PCIe.

Определение

struct pcie_err_event_count {
    unsigned char ebuf_overflow;
    unsigned char ebuf_under_run;
    unsigned char decode_error;
    unsigned char running_disparity_error;
    unsigned char skp_os_parity_error;
    unsigned char sync_header_error;
    unsigned char ctl_skp_os_parity_error;
    unsigned char detect_ei_infer;
    unsigned char receiver_error;
    unsigned char rx_recovery_request;
    unsigned char n_fts_timeout;
    unsigned char framing_error;
    unsigned char deskew_error;
    unsigned char bad_tlp;
    unsigned char lrc_error;
    unsigned char bad_dllp;
    unsigned char replay_number_rollover;
    unsigned char replay_timeout;
    unsigned char rx_nak_dllp;
    unsigned char tx_nak_dllp;
    unsigned char retry_tlp;
    unsigned char fc_timeout;
    unsigned char poisoned_tlp;
    unsigned char ecr_error;
    unsigned char unsupported_request;
    unsigned char completer_abort;
    unsigned char completion_timeout;
    /* The location above is hardware information and cannot be changed */
    unsigned char redundant_phase;
};

Поля

Имя поля Сокращение Описание
ebuf_overflow EBUF Overflow -
ebuf_under_run EBUF Under-run -
decode_error Decode Ошибка Ошибка декодирования пакета, сбой сигнала
running_disparity_error Running Disparity Ошибка Ошибка дисбаланса 8b/10b, сбой сигнала Gen2
skp_os_parity_error SKP OS Parity Ошибка Ошибка чётности SKP, сбой сигнала Gen3
sync_header_error SYNC Header Ошибка Ошибка заголовка синхронизации, сбой сигнала
ctl_skp_os_parity_error CTL SKP OS Parity Ошибка Ошибка чётности управляемой SKP-последовательности, сбой сигнала Gen3
detect_ei_infer Detect EI Infer Обнаружены перекрёстные помехи
receiver_error Receiver Ошибка Ошибка приёмника
rx_recovery_request Rx Recovery Request RX получает запрос периферии на recovery для коррекции сигнала
n_fts_timeout N_FTS Timeout n_FTS периферии не соответствует стандарту; неправильный переход L0s → L0 вызывает recovery
framing_error Framing Ошибка Ошибка декодирования кадра, сбой сигнала
deskew_error Deskew Ошибка Ошибка deskew, сбой сигнала
bad_tlp BAD TLP Получен ошибочный TLP
lrc_error LCRC Ошибка Ошибка CRC линии, сбой сигнала
bad_dllp BAD DLLP Ошибочный пакет DLLP, сбой сигнала
replay_number_rollover Replay Number Rollover Повторные пакеты переполнили буфер повторов
replay_timeout Replay Timeout Тайм-аут повторной передачи ошибочных пакетов
rx_nak_dllp Rx Nak DLLP Получен DLLP снизу, доступ отклонён
tx_nak_dllp Tx Nak DLLP Нижестоящее устройство отклонило отправленный DLLP
retry_tlp Retry TLP Число повторно переданных TLP, показатель частоты ошибок
fc_timeout FC Timeout Тайм-аут обновления управления потоком
poisoned_tlp Poisoned TLP Зарегистрирован ошибочный тип TLP, возможны сбой линии или изменение бита RAM
ecr_error ECRC Ошибка Ошибка конечного CRC, сбой сигнала
unsupported_request Unsupported Request Получен неподдерживаемый тип запроса TLP, возможно из-за отказа доступа периферии
completer_abort Completer Abort Запрос RC получен, но внутренняя ошибка требует прекращения доступа
completion_timeout Completion Timeout Тайм-аут чтения ресурсов периферии и возврата TLP
redundant_phase Резервная фаза Счётчик для проверки непрерывного обновления состояния

1.2 PCIE Windows EP

Драйверы Windows предоставляют приложениям следующие ioctl:

ioctl Описание функции
IOCTL_RKEP_DOWNLOAD_FIRMWARE Передать прошивку EP
IOCTL_RKEP_BOOT_RUN Запустить EP после передачи прошивки
IOCTL_RKEP_CREATE_TASK Создать задачу
IOCTL_RKEP_DESTROY_TASK Освободить задачу
IOCTL_RKEP_SEND_BUF Отправить буфер EP
IOCTL_RKEP_GET_BUF Получить буферные данные EP
IOCTL_RKEP_GET_EP_MODE Получить текущий режим EP
IOCTL_RKEP_SEND_MSG_TO_EP_BUS Отправить событие сообщения EP
IOCTL_RKEP_GET_MSG_FOR_TASK_ID Получить событие сообщения EP

1.2.1 Типы данных

Типы и структуры данных PCIE RC: RK_PCIE_TASK_ATTR: Определяет атрибуты Task. RK_PCIE_DESTROY_TASK: Структура освобождения Task.

RK_PCIE_IOCTL_STATUS: Определяет структуру состояния вызова ioctl PCIE. RK_PCIE_TASK_MSG: Определяет структуру сообщения Task. RK_PCIE_BUFF_NODE: Определяет структуру PCIE EP BUF. RK_PCIE_DEV_MODE: Определяет структуру режима PCIE EP. RK_PCIE_TASK_INFO: Определяет структуру информации Task. RK_PCIE_DOWNLOAD_FIRMWARE: Определяет структуру загрузки прошивки.

1.2.1.1 RK_PCIE_TASK_ATTR

Описание

Определяет структуру атрибутов PCIE Task.

Определение

typedef struct _RK_PCIE_TASK_ATTR {
    int WaitTimeoutMs;
    int SendBuffNum;
    int SendBuffSize;
    int RecvBuffNum;
    int RecvBuffSize;
}  RK_PCIE_TASK_ATTR, *PRK_PCIE_TASK_ATTR;

Поля

Имя поля Описание
WaitTimeoutMs Тайм-аут интерфейса; блокирующий режим не поддерживается.
SendBuffNum Количество передающих буферов PCIE для чередования.
SendBuffSize Размер передающего буфера.
RecvBuffNum Количество принимающих буферов PCIE для чередования.
RecvBuffSize Размер принимающего буфера.
1.2.1.2 RK_PCIE_DESTROY_TASK

Описание

Определяет структуру освобождения PCIE Task.

Определение

typedef struct _RK_PCIE_DESTROY_TASK {
    int TaskID;
}  RK_PCIE_DESTROY_TASK, *PRK_PCIE_DESTROY_TASK;

Поля

Имя поля Описание
TaskID ID освобождаемой задачи
1.2.1.3 RK_PCIE_IOCTL_STATUS

Описание

Определяет структуру состояния вызова ioctl PCIE.

Определение

typedef struct _RK_PCIE_IOCTL_STATUS {
    int Status;
    char Data[0];
} RK_PCIE_IOCTL_STATUS, *PRK_PCIE_IOCTL_STATUS;

Поля

Имя поля Описание
Состояние Результат ioctl; см. enum _RK_PCIE_RET
Данные Данные, возвращённые ioctl
1.2.1.4 RK_PCIE_TASK_MSG

Описание

Определяет структуру сообщения Task.

Определение

typedef struct _RK_PCIE_TASK_MSG {
    int TaskID;
    int Size;
    char Data[TASK_MSG_DATA_SIZE];
} RK_PCIE_TASK_MSG, *PRK_PCIE_TASK_MSG;

Поля

Имя поля Описание
TaskID ID задачи
Размер Длина сообщения, максимум 1504 Bytes
Данные Содержимое сообщения
1.2.1.5 RK_PCIE_BUFF_NODE

Описание

Определяет структуру PCIE EP BUF.

Определение

typedef struct _RK_PCIE_BUFF_NODE {
    int Size;
    int TaskID;
    int TimeOut10Ms;
    char Reserved[52];  // 64 = 52 + 4 + 4 + 4
    char Data[0];
} RK_PCIE_BUFF_NODE, *PRK_PCIE_BUFF_NODE;

Поля

Имя поля Описание
Размер Длина данных
TaskID ID задачи
TimeOut10Ms Тайм-аут интерфейса без блокирующего режима, минимальная единица 10ms.
Зарезервировано Резервный размер
Данные Данные
1.2.1.6 RK_PCIE_DEV_MODE

Описание

Определяет структуру режима устройства PCIE EP.

Определение

typedef struct _RK_PCIE_DEV_MODE {
    unsigned short Mode;
    unsigned short SubMode;
} RK_PCIE_DEV_MODE, *PRK_PCIE_DEV_MODE;

Поля

Имя поля Описание
Режим Текущий режим EP:
#define RKEP_MODE_BOOTROM 1
#define RKEP_MODE_LOADER 2
#define RKEP_MODE_KERNEL 3
#define RKEP_MODE_FUN0 4
#define RKEP_MODE_ERR 0xffff //Device exception, reload required
SubMode Состояние режима EP:
#define RKEP_SMODE_INIT 0
#define RKEP_SMODE_LNKRDY 1
#define RKEP_SMODE_LNKUP 2
#define RKEP_SMODE_FWDLRDY 0x10
#define RKEP_SMODE_FWDLDONE 0x11
#define RKEP_SMODE_APPRDY 0x20
#define RKEP_SMODE_APPDEINIT 0x21
#define RKEP_SMODE_ERR 0xffff
1.2.1.7 RK_PCIE_TASK_INFO

Описание

Определяет структуру информации Task.

Определение

typedef struct _RK_PCIE_TASK_INFO {
    int TaskID;
} RK_PCIE_TASK_INFO, *PRK_PCIE_TASK_INFO;

Поля

Имя поля Описание
TaskID ID задачи
1.2.1.8 RK_PCIE_DOWNLOAD_FIRMWARE

Описание

Определяет структуру загрузки прошивки.

Определение

typedef struct _RK_PCIE_DOWNLOAD_FIRMWARE {
    size_t RemoteLoadAddr;
    size_t Size;
    char Data[0];
} RK_PCIE_DOWNLOAD_FIRMWARE, *PRK_PCIE_DOWNLOAD_FIRMWARE;

Поля

Имя поля Описание
RemoteLoadAddr Адрес памяти EP
Размер Длина прошивки
Данные Содержимое прошивки

1.3 Конечная точка PCIE

1.3.1 rk_pcie_device_init

Описание

Инициализирует устройство PCIe.

Синтаксис

int rk_pcie_device_init(void)

Параметры

Нет

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

typedef struct
{
    pthread_t thr_recv_rc;
    pthread_t thr_send_rc;
    char recv_rc_exit;
    char send_rc_exit;
} ep_context_st;
int main(void)
{
    int ret = 0;
    struct task_context_st task_ctx[PCIE_DMA_TASK_MAX] = {0};
    struct pcie_task_msg_st msg;
    struct task_user_cmd_st *user_cmd;

    ret = rk_pcie_device_init();
    if (ret != 0) {
        printf("pcie init device error....\n");
        return -1;
    }

    while (1) {
        ret = rk_pcie_get_msg_for_bus(&msg, 100);
        if (ret) {
            printf("task_id:%d type:%d size:%ld \n", msg.task_id, msg.type, msg.size);
            switch (msg.type) {
            case E_TASK_MSG_CREATE:
                task_create(&task_ctx[msg.task_id], msg.task_id);
                break;
            case E_TASK_MSG_DESTORY:
                task_destory(&task_ctx[msg.task_id], msg.task_id);
                break;
            case E_TASK_MSG_USER: {
                user_cmd = (struct task_user_cmd_st *)msg.data;
                switch (user_cmd->cmd) {
                case TASK_USER_CMD_INIT_APP:
                    app_create(&task_ctx[msg.task_id], msg.task_id);
                    break;
                case TASK_USER_CMD_DEINIT_APP:
                    app_destory(&task_ctx[msg.task_id], msg.task_id);
                    break;
                }
            }
            break;
            default:
                printf("error msg type!!! \n");
                break;
            }
        }
    }

    rk_pcie_device_deinit();

    return 0;
}

Связанные темы

rk_pcie_device_deinit

1.3.2 rk_pcie_device_deinit

Описание

Деинициализировать PCIe, освободить ресурсы.

Синтаксис

int rk_pcie_device_deinit(void)

1.3.3 rk_pcie_task_create

Описание

Создать Task, инициализировать память и управление BUFF.

Синтаксис

int rk_pcie_task_create(int task_id)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи, переданный сообщением RC Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_device_deinit

1.3.4 rk_pcie_task_destroy

Описание

Деинициализировать Task, освободить память, управление BUFF и прочие ресурсы.

Синтаксис

int rk_pcie_task_destroy(int task_id)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_device_init

1.3.5 rk_pcie_set_ep_info

Описание

Задать информацию состояния EP.

Синтаксис

int rk_pcie_set_ep_info(void *status, size_t status_size)

Параметры

Имя параметра Описание Вход/выход
status Указатель void, структура состояния определяется пользователем Вход
status_size Размер структуры состояния Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

struct ep_info_st {
    unsigned int link_status;
    unsigned int temp;
    long long timestamp;
    unsigned char cpu_load;
    unsigned char npu_load;
    unsigned char gpu_load;
};

ep_info_st ep_info;
while(1) {
    ep_info.timestamp = time(NULL);
    rk_pcie_set_ep_info((void *)&ep_info, sizeof(struct ep_info_st));
}

Связанные темы

rk_pcie_get_ep_info

1.3.6 rk_pcie_get_user_cmd

Описание

Получить указатель на область BAR0 для пользовательских команд.

Синтаксис

void *rk_pcie_get_user_cmd(void)

Параметры

Нет

Возвращаемое значение

Возвращаемое значение Описание
Не NULL Успех, указатель памяти пользовательской командной области
NULL Ошибка

Пример

struct user_cmd_st {
    unsigned int max_chn;
    unsigned int width;
    unsigned int height;
    unsigned int codecid;
    unsigned int output_id;
    unsigned int init;
};
ep_ctx.user_cmd = rk_pcie_get_user_cmd();

while(ep_ctx.user_cmd->init != 1) {
    usleep(1000);
}

ep_ctx.video_obj.width = ep_ctx.user_cmd->width;
ep_ctx.video_obj.height = ep_ctx.user_cmd->height;
ep_ctx.video_obj.input_mode = ep_ctx.user_cmd->codecid;
ep_ctx.video_obj.output_mode = ep_ctx.user_cmd->output_id;
ep_ctx.video_obj.max_chn = ep_ctx.user_cmd->max_chn;
ep_ctx.max_chn = ep_ctx.video_obj.max_chn;

Связанные темы

rk_pcie_get_user_cmd

1.3.7 rk_pcie_get_bar1_user_buffer

Описание

Получить виртуальный адрес отображения bar1.

Синтаксис

void *rk_pcie_get_bar1_user_buffer(void)

Параметры

Нет.

Возвращаемое значение

Возвращаемое значение Описание
void * Виртуальный адрес
NULL Ошибка; см. коды ошибок

1.3.8 rk_pcie_get_bar5_user_buffer

Описание

Получить виртуальный адрес отображения bar1.

Синтаксис

void *rk_pcie_get_bar5_user_buffer(void)

Параметры

Нет.

Возвращаемое значение

Возвращаемое значение Описание
void * Виртуальный адрес
NULL Ошибка; см. коды ошибок

1.3.9 rk_pcie_set_bar_inbound_cpu_addr

Описание

Настроить входящее отображение BAR.

Синтаксис

u_int64_t rk_pcie_set_bar_inbound_cpu_addr(u_int32_t atu_index, u_int64_t cpu_address,
u_int32_t size)

Параметры

Имя параметра Описание Вход/выход
atu_index Индекс ATU Вход
cpu_address Отображённый адрес CPU Вход
size Ограничение размера отображения Вход

Возвращаемое значение

Возвращаемое значение Описание
cpu_address Возвращает адрес CPU

1.3.10 rk_pcie_get_buff

Описание

Получить доступный буфер PCIE.

Синтаксис

struct pcie_buff_node *rk_pcie_get_buff(int task_id, enum EBuff_Type type)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход
type Тип буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
Не NULL Указатель доступного буфера
NULL Нет доступного буфера

Пример

node = rk_pcie_get_buff(ctx->task_id, E_SEND);
if (node) {
    node->size = buffer_size;
    memset(node->vir_addr, index, node->size);
    add_check_info(node->vir_addr + node->size - CHECK_SIZE);
    rk_pcie_send_buff(ctx->task_id, node);
    index++;
} else {
    usleep(1000);
}

Связанные темы

rk_pcie_send_buff

1.3.11 rk_pcie_send_buff

Описание

Отправить буфер PCIE.

Синтаксис

int rk_pcie_send_buff(int task_id, struct pcie_buff_node *pbuff)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход
pbuff Указатель буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успешно отправлено
Ненулевое значение Ошибка; см. коды ошибок

Пример

rk_pcie_get_buff

Связанные темы

rk_pcie_get_buff

1.3.12 rk_pcie_release_buff

Описание

Освободить буфер PCIE.

Синтаксис

int rk_pcie_release_buff(int task_id, struct pcie_buff_node *pbuff)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход
pbuff Указатель буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успешно освобождено
Ненулевое значение Ошибка; см. коды ошибок

Пример

node = rk_pcie_get_buff(ctx->task_id, E_RECV);
if (node) {
    if (check_info(node->vir_addr + node->size - CHECK_SIZE) == 0) {
        pthread_mutex_lock(&ctx->mutex_stream_speed);
        ctx->stream_speed_index++;
        pthread_mutex_unlock(&ctx->mutex_stream_speed);
        // if (mptr != NULL) {
        //     memcpy(mptr, node->vir_addr, node->size);
        // }
        memset(node->vir_addr + node->size - CHECK_SIZE, 0, CHECK_SIZE);
    } else {
        printf("check data ==================== error \n");
        for (int i = 0; i < CHECK_SIZE; i++) {
            unsigned char *p = node->vir_addr + node->size - CHECK_SIZE;
            printf("%d ", p[i]);
        }
        printf("\ncheck data ===ssss========node->size = %d======== error \n", (int)node-
>size);
    }
    rk_pcie_release_buff(ctx->task_id, node);
} else {
    usleep(1000);
}

Связанные темы

rk_pcie_release_buff

1.3.13 rk_pcie_get_buff_max_size

Описание

Получить максимально поддерживаемый размер буфера.

Синтаксис

long rk_pcie_get_buff_max_size(int task_id, enum EBuff_Type type)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход
type Тип буфера PCIE Вход

Возвращаемые значения

Возвращаемое значение Описание
Больше или равно 0 Размер буфера
Меньше 0 Ошибка; см. коды ошибок

Пример

long buffer_size = rk_pcie_get_buff_max_size(ctx->task_id, E_SEND);

Связанные темы

rk_pcie_get_buff_max_size

1.3.14 rk_pcie_get_msg_for_bus

Описание

Ожидать сообщение RC.

Синтаксис

int rk_pcie_get_msg_for_bus(struct pcie_task_msg_st *msg, int timeout_ms)

Параметры

Имя параметра Описание Вход/выход
timeout_ms Тайм-аут в ms; -1 — блокирующий режим с бесконечным ожиданием в ядре (не рекомендуется). Рекомендуется 100ms. Вход

Возвращаемые значения

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_device_deinit

1.3.15 rk_pcie_send_msg_to_rc_task

Описание

Отправить сообщение RC.

Синтаксис

int rk_pcie_send_msg_to_rc_task(int task_id, void *data, size_t size)

Параметры

Имя параметра Описание Вход/выход
task_id ID задачи Вход
data Указатель сообщения Вход
size Длина сообщения Вход

Возвращаемое значение

Возвращаемое значение Описание
0 Успех
Ненулевое значение Ошибка; см. коды ошибок

Пример

См. пример rk_pcie_device_init.

Связанные темы

rk_pcie_device_deinit

1.3.16 Типы данных

Типы и структуры данных PCIE RC: EBuff_Type: Определяет тип буфера PCIe. ETask_Msg_Type: Определяет тип сообщения Task. struct pcie_buff_node: Определяет атрибуты буфера PCIe. struct pcie_task_msg_st: Определяет атрибуты сообщения.

1.3.16.1 EBuff_Type

Описание

Определяет типы буфера PCIE.

Определение

enum EBuff_Type {
    E_SEND = 0,
    E_RECV,
};

Поля

Имя поля Описание
E_SEND Передающий буфер.
E_RECV Принимающий буфер.
1.3.16.2 ETask_Msg_Type

Описание

Определяет типы сообщений задач.

Определение

enum ETask_Msg_Type {
    E_TASK_MSG_NONE = 0,
    E_TASK_MSG_CREATE,
    E_TASK_MSG_DESTROY,
    E_TASK_MSG_USER,
    E_TASK_MSG_MAX,
};

Поля

Имя поля Описание
E_TASK_MSG_NONE Значение по умолчанию, без значения
E_TASK_MSG_CREATE Создать задачу
E_TASK_MSG_DESTROY Уничтожить задачу
E_TASK_MSG_USER Пользовательское сообщение
E_TASK_MSG_MAX Максимальный тип сообщения
1.3.16.3 Узел буфера PCIe

Описание

Определяет атрибуты буфера PCIe. Изменения структуры должны одновременно выполняться на RC и EP.

Определение

struct pcie_buff_node {
    void *vir_addr;
    size_t phy_addr;
    size_t size;
};

Поля

Имя поля Описание
vir_addr Виртуальный адрес.
phy_addr Физический адрес.
size Размер памяти: для отправки пользователь задаёт объём данных не больше ёмкости буфера; для приёма — размер данных другой стороны.
1.3.16.4 pcie_task_msg_st

Описание

Определяет атрибуты сообщения. Структуру необходимо изменять одновременно на RC и EP.

Определение

struct pcie_task_msg_st {
    enum ETask_Msg_Type type;
    int task_id;
    size_t size;
    char lock;
    unsigned char data[TASK_MSG_DATA_SIZE];
};

Поля

Имя поля Описание
type Тип сообщения.
task_id ID задачи.
size Длина сообщения.
lock Зарезервировано.
data Содержимое сообщения.

1.4 Коды ошибок

Код ошибки Макроопределение Описание
-1 RK_PCIE_ERR_BAD Неисправная линия PCIE
-2 RK_PCIE_ERR_UNKNOWN Системная ошибка
-3 RK_PCIE_ERR_NULL_PTR Нулевой указатель
-4 RK_PCIE_ERR_MALLOC Ошибка выделения памяти
-5 RK_PCIE_ERR_OPEN_FILE Ошибка открытия файла
-6 RK_PCIE_ERR_VALUE Значение ошибки
-8 RK_PCIE_ERR_TIMEOUT Возврат по тайм-ауту
-10 RK_PCIE_ERR_UNSUPPORT Неподдерживаемая функция
-13 RK_PCIE_ERR_HW_UNSUPPORT Аппаратура не поддерживается
-15 RK_PCIE_ERR_MMAP Ошибка mmap
-65 RK_PCIE_ERR_INIT Ошибка инициализации
-66 RK_PCIE_ERR_NOINIT Система не инициализирована
-68 RK_PCIE_ERR_NOMEM Недостаточно памяти
-69 RK_PCIE_ERR_OUTOF_RANGE Параметр вне диапазона

Другие статьи по теме → · Учебные маршруты →