Post

Replies

Boosts

Views

Activity

Reply to DriverKit IOUserSerial Driver
Here my methods: Called from Start()... IOReturn VSPDriverPrivate::ConnectDriverQueues() { IOReturn ret; ret = m_driver->ConnectQueues(&m_itBuffer, &m_rxBuffer, &m_txBuffer, nullptr, nullptr, 0, 0, 8, 8); if (ret != kIOReturnSuccess) { VSPLog(LOG_PREFIX, "ConnectQueues failed to allocate IF/RX/TX buffers.\n"); return ret; } if (m_itBuffer == nullptr) { VSPLog(LOG_PREFIX, "Invalid interrupt buffer detected.\n"); ret = kIOReturnInvalid; return ret; } if (m_rxBuffer == nullptr) { VSPLog(LOG_PREFIX, "Invalid RX buffer detected.\n"); return kIOReturnInvalid; } if (m_txBuffer == nullptr) { VSPLog(LOG_PREFIX, "Invalid TX buffer detected.\n"); return kIOReturnInvalid; } return kIOReturnSuccess; } Inside TxDataAvailable() IOReturn VSPDriverPrivate::TxDataAvailable() { IOReturn ret = kIOReturnSuccess; IOMemoryMap* map = nullptr; VSPLog(LOG_PREFIX, "TxDataAvailable called.\n"); if (m_txBuffer == nullptr) { return kIOReturnBadArgument; } // Access memory of RX IOMemoryDescriptor ret = m_txBuffer->CreateMapping(kIOMemoryMapReadOnly, 0, 0, 0, 0, &map); if (ret != kIOReturnSuccess) { VSPLog(LOG_PREFIX, "TxDataAvailable: Failed to get memory map. code=%d\n", ret); return ret; } // Send data to ... const char* buffer = reinterpret_cast<char*>(map->GetAddress()); const uint64_t size = map->GetLength(); VSPLog(LOG_PREFIX, "TxDataAvailable: address=0x%llx length=%llu\n", (uint64_t) buffer, size); VSPLog(LOG_PREFIX, "TxDataAvailable: debug TX buffer\n"); // !! Debug .... for (uint64_t i = 0; i < size && i < 16; i++) { VSPLog(LOG_PREFIX, "TxDataAvailable: TX> 0x%02x %c\n", buffer[i], buffer[i]); } // copy data to send into tx FIFO buffer memcpy(m_fifo.tx.buffer, buffer, (size < m_fifo.tx.size ? size : m_fifo.tx.size)); // !! cleanup OSSafeReleaseNULL(map); return kIOReturnSuccess;
Topic: App & System Services SubTopic: Core OS Tags:
Feb ’25