20#include "FtdiSerialDevice.h"
21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/utilities/PointerGuard.h"
23#include "pedigree/kernel/utilities/Vector.h"
24#include "pedigree/kernel/utilities/new"
26#include "modules/system/usb/UsbConstants.h"
27#include "modules/system/usb/UsbDevice.h"
29#define FTDI_BAUD_RATE 9600
31static uint8_t nSubdivisors[8] = {0, 3, 2, 4, 1, 5, 6, 7};
33FtdiSerialDevice::FtdiSerialDevice(
UsbDevice* dev)
36FtdiSerialDevice::~FtdiSerialDevice() {}
43 uint16_t nDivisor = (48000000 / 2) / FTDI_BAUD_RATE, nSubdivisor = nSubdivisors[nDivisor % 8];
47 controlRequest(UsbRequestType::Vendor, 3, (nSubdivisor & 3) << 14 | nDivisor, nSubdivisor >> 2);
50 for (
size_t i = 0; i <
m_pInterface->endpointList.count(); i++) {
52 if (!m_pInEndpoint && (pEndpoint->nTransferType == Endpoint::Bulk) && pEndpoint->bIn)
53 m_pInEndpoint = pEndpoint;
54 if (!m_pOutEndpoint && (pEndpoint->nTransferType == Endpoint::Bulk) && pEndpoint->bOut)
55 m_pOutEndpoint = pEndpoint;
56 if (m_pInEndpoint && m_pOutEndpoint)
61 ERROR(
"USB: FTDI: No IN endpoint");
65 if (!m_pOutEndpoint) {
66 ERROR(
"USB: FTDI: No OUT endpoint");
73char FtdiSerialDevice::read() {
74 char* pChar =
new char(0);
76 syncIn(m_pInEndpoint,
reinterpret_cast<uintptr_t
>(pChar), 1);
80void FtdiSerialDevice::write(
char c) {
81 char* pChar =
new char(c);
83 syncOut(m_pOutEndpoint,
reinterpret_cast<uintptr_t
>(pChar), 1);
virtual void initialiseDriver()
Implemented by the driver class, initialises driver-specific stuff.
Interface * m_pInterface
Interface in use.
bool controlRequest(uint8_t nRequestType, uint8_t nRequest, uint16_t nValue, uint16_t nIndex, uint16_t nLength=0, uintptr_t pBuffer=0, uint32_t timeout=5000)
Performs an USB control request.
UsbState m_UsbState
The current state of the device.