IOCudaADBController.cpp [plain text]
#include "IOCudaADBController.h"
#include "AppleCuda.h"
#define super IOADBController
OSDefineMetaClassAndStructors(IOCudaADBController, IOADBController)
bool IOCudaADBController::init ( OSDictionary * properties, AppleCuda * driver )
{
CudaDriver = driver;
pollList = 0;
autopollOn = false;
return super::init(properties);
}
bool IOCudaADBController::start ( IOService *nub )
{
CudaDriver->registerForADBInterrupts ( autopollHandler, this );
if( !super::start(nub))
return false;
return true;
}
IOReturn IOCudaADBController::setAutoPollPeriod ( int microsecs )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD3(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_SET_AUTO_RATE,
((microsecs + 999) / 1000));
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::getAutoPollPeriod ( int * microsecs )
{
IOReturn err;
cuda_request_t cmd;
UInt8 data;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_GET_AUTO_RATE);
cmd.a_reply.a_buffer = &data;
cmd.a_reply.a_bcount = sizeof(UInt8);
err = CudaDriver->doSyncRequest(&cmd);
if ( err == kIOReturnSuccess ) {
*microsecs = data * 1000;
}
return err;
}
IOReturn IOCudaADBController::setAutoPollList ( UInt16 activeAddressMask )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_SET_DEVICE_LIST)
cmd.a_cmd.a_buffer = (UInt8 *) &activeAddressMask;
cmd.a_cmd.a_bcount = sizeof(UInt16);
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::getAutoPollList ( UInt16 * activeAddressMask )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_GET_DEVICE_LIST);
cmd.a_reply.a_buffer = (UInt8 *) activeAddressMask;
cmd.a_reply.a_bcount = sizeof(UInt16);
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::setAutoPollEnable ( bool enable )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD3(&cmd, ADB_PACKET_PSEUDO, ADB_PSEUDOCMD_START_STOP_AUTO_POLL, (enable ? 1 : 0));
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::resetBus ( void )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB, ADB_ADBCMD_RESET_BUS );
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::cancelAllIO ( void )
{
return kIOReturnSuccess;
}
IOReturn IOCudaADBController::flushDevice ( IOADBAddress address )
{
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB, (ADB_ADBCMD_FLUSH_ADB | (address << 4)));
return CudaDriver->doSyncRequest(&cmd);
}
IOReturn IOCudaADBController::readFromDevice (IOADBAddress address, IOADBRegister adbRegister,
UInt8 * data, IOByteCount * length )
{
IOReturn err;
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB,
(ADB_ADBCMD_READ_ADB | (address << 4) | (adbRegister & 3)));
cmd.a_reply.a_buffer = data;
cmd.a_reply.a_bcount = *length;
err = CudaDriver->doSyncRequest(&cmd);
if( err == ADB_RET_OK ) {
*length = cmd.a_reply.a_bcount;
}
else {
*length = 0;
}
return err;
}
IOReturn IOCudaADBController::writeToDevice ( IOADBAddress address, IOADBRegister adbRegister,
UInt8 * data, IOByteCount * length )
{
IOReturn err;
cuda_request_t cmd;
adb_init_request(&cmd);
ADB_BUILD_CMD2(&cmd, ADB_PACKET_ADB,
(ADB_ADBCMD_WRITE_ADB | (address << 4) | (adbRegister & 3)));
cmd.a_cmd.a_buffer = data;
cmd.a_cmd.a_bcount = *length;
err = CudaDriver->doSyncRequest(&cmd);
if( err == ADB_RET_OK ) {
*length = cmd.a_reply.a_bcount;
}
else {
*length = 0;
}
return err;
}