pi1541/uspi/lib/usbdevicefactory.c

128 lines
3.9 KiB
C

//
// usbdevicefactory.c
//
// USPi - An USB driver for Raspberry Pi written in C
// Copyright (C) 2014-2018 R. Stange <rsta2@o2online.de>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
//
#include <uspi/usbdevicefactory.h>
#include <uspios.h>
#include <uspi/assert.h>
// for factory
#include <uspi/usbstandardhub.h>
#include <uspi/usbmassdevice.h>
#include <uspi/usbkeyboard.h>
#include <uspi/usbmouse.h>
#include <uspi/usbgamepad.h>
#include <uspi/usbmidi.h>
#include <uspi/smsc951x.h>
#include <uspi/lan7800.h>
TUSBDevice *GetDevice (TUSBDevice *pParent, TString *pName);
TUSBDevice *USBDeviceFactoryGetDevice (TUSBDevice *pParent)
{
assert (pParent != 0);
TUSBDevice *pResult;
if ( (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameVendor))) == 0
&& (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameDevice))) == 0
&& (pResult = GetDevice (pParent, USBDeviceGetName (pParent, DeviceNameInterface))) == 0)
{
return 0;
}
assert (pResult != 0);
return pResult;
}
TUSBDevice *GetDevice (TUSBDevice *pParent, TString *pName)
{
assert (pParent != 0);
assert (pName != 0);
TUSBDevice *pResult = 0;
if (StringCompare (pName, "dev9-0-2") == 0)
{
TUSBStandardHub *pDevice = (TUSBStandardHub *) malloc (sizeof (TUSBStandardHub));
assert (pDevice != 0);
USBStandardHub (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "int8-6-50") == 0)
{
TUSBBulkOnlyMassStorageDevice *pDevice = (TUSBBulkOnlyMassStorageDevice *) malloc (sizeof (TUSBBulkOnlyMassStorageDevice));
assert (pDevice != 0);
USBBulkOnlyMassStorageDevice (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "int3-1-1") == 0)
{
TUSBKeyboardDevice *pDevice = (TUSBKeyboardDevice *) malloc (sizeof (TUSBKeyboardDevice));
assert (pDevice != 0);
USBKeyboardDevice (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "int3-1-2") == 0)
{
TUSBMouseDevice *pDevice = (TUSBMouseDevice *) malloc (sizeof (TUSBMouseDevice));
assert (pDevice != 0);
USBMouseDevice (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "ven424-ec00") == 0)
{
TSMSC951xDevice *pDevice = (TSMSC951xDevice *) malloc (sizeof (TSMSC951xDevice));
assert (pDevice != 0);
SMSC951xDevice (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "ven424-7800") == 0)
{
TLAN7800Device *pDevice = (TLAN7800Device *) malloc (sizeof (TLAN7800Device));
assert (pDevice != 0);
LAN7800Device (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "int3-0-0") == 0)
{
TUSBGamePadDevice *pDevice = (TUSBGamePadDevice *) malloc (sizeof (TUSBGamePadDevice));
assert (pDevice != 0);
USBGamePadDevice (pDevice, pParent);
pResult = (TUSBDevice *) pDevice;
}
else if (StringCompare (pName, "int1-3-0") == 0)
{
TUSBMIDIDevice *pDevice = (TUSBMIDIDevice *) malloc (sizeof (TUSBMIDIDevice));
assert (pDevice != 0);
USBMIDIDevice (pDevice, pParent);
pResult = (TUSBDevice *)pDevice;
}
// new devices follow
if (pResult != 0)
{
LogWrite ("usbdev", LOG_NOTICE, "Using device %s", StringGet (pName));
}
_String (pName);
free (pName);
return pResult;
}