DXGKDDI_ADD_DEVICE callback function

DXGKDDI_ADD_DEVICE callback function

该DDI创建了该显卡的context并将代表该显卡的句柄返回。

Syntax

DXGKDDI_ADD_DEVICE DxgkddiAddDevice;

NTSTATUS DxgkddiAddDevice(
  IN_CONST_PDEVICE_OBJECT PhysicalDeviceObject,
  OUT_PPVOID MiniportDeviceContext
)
{...}

Parameters

PhysicalDeviceObject

标识显卡的指向physical device object (PDO) 的指针。

MiniportDeviceContext

接收代表PhysicalDeviceObject对象的显卡句柄的指针,该句柄由KMD创建。KMD可以返回NULL代表该PhysicalDeviceObject不支持创建context。

Return Value

DxgkDdiAddDevice returns STATUS_SUCCESS if it succeeds; otherwise, it returns one of the error codes defined in Ntstatus.h.

Remarks

DxgkDdiAddDevice 分配了私有context,其关联着PhysicalDeviceObject标识的显卡。可以把MiniportDeviceContext 中返回的句柄当成该显卡的句柄或者是关联着该显卡的context的句柄。DXGK(dxgkrnl.sys)在之后的调用中使用该句柄。下列几个例子列出了DXGK的几个不同组件调用KMD时的几个方法,其中都传入了该句柄。

  • Port driver调用DxgkDdiStartDevice传入的MiniportDeviceContext句柄。
  • VidPN管理器调用DxgkDdiIsSupportedVidPn传入的hAdapter句柄。
  • DXG core 调用DxgkDdiQueryAdapterInfo传入的hAdapter句柄

这个handle有时叫MiniportDeviceContext有时叫hAdapter。不要将该handle与传入KMD的句柄hDevice 相混淆。

一些显卡拥有2到多个PCI function来作为这个显卡对象。例如一些老显卡用多个PCI function来实现多个显卡的view。显示端口驱动为每个PCI function调用DxgkDdiAddDevice来创建这些view。每次调用中KMD能指定是否支持该PCI function(支持则返回非NULL,反之为NULL)。通过传入PhysicalDeviceObject调用IoGetDeviceProperty能够得到指定PCI function的信息。

在DxgkDdiRemoveDeivce中释放这个context block和在DxgkDdiAddDevice 中创建的所有资源。

The DxgkDdiAddDevice function should be made pageable.

Requirements

  
Minimum supported clientAvailable in Windows Vista and later versions of the Windows operating systems.
Target PlatformDesktop
Headerdispmprt.h
IRQLPASSIVE_LEVEL
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于esp32-idf和sx1268的主机唤醒从机sx1268的问题,我可以给你一些建议。 首先,你需要在主机端的esp32-idf中配置好sx1268的SPI接口,并且可以正常发送和接收数据。然后,你需要在从机端的sx1268中设置唤醒源,可以选择使用RTC模块或者外部中断作为唤醒源。 在从机端的sx1268中,你需要按照以下步骤进行配置: 1. 设置sx1268的唤醒源,例如设置RTC模块的唤醒时间或者配置外部中断。 2. 设置sx1268的睡眠模式和待机模式。 3. 在sx1268的唤醒回调函数中,进行sx1268的初始化和配置,例如启动射频模块和SPI接口。 在主机端的esp32-idf中,你需要按照以下步骤进行配置: 1. 发送唤醒命令给从机sx1268。 2. 等待从机sx1268完成唤醒过程。 3. 在主机端的esp32-idf中,进行sx1268的初始化和配置,例如启动射频模块和SPI接口。 4. 完成sx1268的初始化和配置后,主机端的esp32-idf可以与从机sx1268通信,进行数据的发送和接收。 下面是一个简单的esp32-idf和sx1268的主机唤醒从机sx1268的代码示例: 从机sx1268代码: ```c #include "sx126x.h" #define SX126X_PIN_BUSY GPIO_NUM_27 void sx126x_init_rx(sx126x_t * sx126x) { // Set wakeup callback function sx126x_set_wakeup_callback(sx126x, sx126x_init_rx); // Initialize sx126x sx126x_init(sx126x); // Configure sx126x for reception // ... } void app_main(void) { // Initialize sx126x sx126x_t sx126x = { .spi_host = HSPI_HOST, .spi_cs = GPIO_NUM_15, .spi_handle = NULL, .busy_pin = SX126X_PIN_BUSY, .reset_pin = GPIO_NUM_33, .wakeup_pin = GPIO_NUM_32, .wakeup_level = 1, .wakeup_callback = sx126x_init_rx, }; sx126x_init(&sx126x); // Set wakeup source sx126x_rtc_set_alarm(&sx126x, 60 * SX126X_RTC_TICKS_PER_SECOND); sx126x_set_sleep(&sx126x, SX126X_SLEEP_CFG_RC); // Enter deep sleep mode esp_deep_sleep_start(); } ``` 主机esp32-idf代码: ```c #include "driver/gpio.h" #include "driver/spi_master.h" #include "sx126x.h" #define SX126X_SPI_HOST HSPI_HOST #define SX126X_PIN_CS GPIO_NUM_15 #define SX126X_PIN_BUSY GPIO_NUM_27 #define SX126X_PIN_RESET GPIO_NUM_33 spi_device_handle_t spi_handle; void sx126x_wakeup(sx126x_t * sx126x) { // Initialize spi spi_bus_config_t spi_bus_cfg = { .mosi_io_num = GPIO_NUM_23, .miso_io_num = GPIO_NUM_19, .sclk_io_num = GPIO_NUM_18, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 0, .flags = SPICOMMON_BUSFLAG_MASTER }; spi_device_interface_config_t spi_dev_cfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = SX126X_PIN_CS, .queue_size = 1, .flags = SPI_DEVICE_NO_DUMMY, .command_bits = 8, .address_bits = 0, }; spi_bus_initialize(SX126X_SPI_HOST, &spi_bus_cfg, 1); spi_bus_add_device(SX126X_SPI_HOST, &spi_dev_cfg, &spi_handle); // Send wakeup command to sx126x sx126x_set_standby(sx126x); vTaskDelay(10 / portTICK_PERIOD_MS); sx126x_set_fs(sx126x); vTaskDelay(1 / portTICK_PERIOD_MS); // Wait for sx126x to complete wakeup while (gpio_get_level(SX126X_PIN_BUSY) == 1) { vTaskDelay(1 / portTICK_PERIOD_MS); } // Re-enable spi spi_bus_remove_device(spi_handle); spi_bus_free(SX126X_SPI_HOST); spi_bus_initialize(SX126X_SPI_HOST, &spi_bus_cfg, 1); spi_bus_add_device(SX126X_SPI_HOST, &spi_dev_cfg, &spi_handle); } void app_main(void) { // Wake up sx126x sx126x_wakeup(&sx126x); // Initialize sx126x sx126x_t sx126x = { .spi_host = SX126X_SPI_HOST, .spi_cs = SX126X_PIN_CS, .spi_handle = spi_handle, .busy_pin = SX126X_PIN_BUSY, .reset_pin = SX126X_PIN_RESET, }; sx126x_init(&sx126x); // Do something with sx126x // ... } ``` 注意,上述代码仅供参考,具体的实现可能会因为不同的硬件和软件环境而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值