more experimenting
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7106 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
717659810b
commit
2aef37bf20
@ -1,9 +1,9 @@
|
||||
#include "lala/lala.h"
|
||||
#include "ichaudio.h"
|
||||
|
||||
status_t ichaudio_attach(drv_t *dev, void **cookie, int id_table_index);
|
||||
status_t ichaudio_powerctl(void *cookie);
|
||||
status_t ichaudio_detach(void *cookie);
|
||||
status_t ichaudio_attach(drv_t *drv, void **cookie);
|
||||
status_t ichaudio_powerctl(drv_t *drv, void *cookie);
|
||||
status_t ichaudio_detach(drv_t *drv, void *cookie);
|
||||
|
||||
id_table_t ichaudio_id_table[] = {
|
||||
{ 0x8086, 0x7195, -1, -1, -1, -1, -1, "Intel 82443MX AC97 audio" },
|
||||
@ -19,7 +19,7 @@ id_table_t ichaudio_id_table[] = {
|
||||
{ 0x10DE, 0x00DA, -1, -1, -1, -1, -1, "NVIDIA nForce 3 (MCP3) AC97 audio" },
|
||||
{ 0x1022, 0x764D, -1, -1, -1, -1, -1, "AMD AMD8111 AC97 audio" },
|
||||
{ 0x1022, 0x7445, -1, -1, -1, -1, -1, "AMD AMD768 AC97 audio" },
|
||||
{ 0x1003, 0x0004, -1, -1, -1, -1, -1, "Highpoint HPT372 RAID" },
|
||||
{ 0x1103, 0x0004, -1, -1, -1, -1, -1, "Highpoint HPT372 RAID" },
|
||||
{ 0x1095, 0x3112, -1, -1, -1, -1, -1, "Silicon Image SATA Si3112" },
|
||||
{ 0x8086, 0x244b, -1, -1, -1, -1, -1, "Intel IDE Controller" },
|
||||
{ 0x8979, 0x6456, -1, -1, -1, -1, -1, "does not exist" },
|
||||
@ -37,7 +37,7 @@ driver_info_t driver_info = {
|
||||
|
||||
|
||||
status_t
|
||||
ichaudio_attach(drv_t *dev, void **_cookie, int id_table_index)
|
||||
ichaudio_attach(drv_t *drv, void **_cookie)
|
||||
{
|
||||
ichaudio_cookie *cookie = (ichaudio_cookie *) malloc(sizeof(ichaudio_cookie));
|
||||
if (!cookie) return B_ERROR;
|
||||
@ -56,7 +56,7 @@ err:
|
||||
|
||||
|
||||
status_t
|
||||
ichaudio_detach(void *_cookie)
|
||||
ichaudio_detach(drv_t *drv, void *_cookie)
|
||||
{
|
||||
ichaudio_cookie *cookie = (ichaudio_cookie *)_cookie;
|
||||
|
||||
@ -66,7 +66,7 @@ ichaudio_detach(void *_cookie)
|
||||
|
||||
|
||||
status_t
|
||||
ichaudio_powerctl(void *_cookie)
|
||||
ichaudio_powerctl(drv_t *drv, void *_cookie)
|
||||
{
|
||||
ichaudio_cookie *cookie = (ichaudio_cookie *)_cookie;
|
||||
|
||||
|
@ -2,14 +2,23 @@
|
||||
#include <Drivers.h>
|
||||
#include <Errors.h>
|
||||
#include <OS.h>
|
||||
#include <PCI.h>
|
||||
#include <malloc.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "lala.h"
|
||||
|
||||
int32 api_version = B_CUR_DRIVER_API_VERSION;
|
||||
|
||||
#define MAX_DEVICES 8
|
||||
|
||||
char * device_names[MAX_DEVICES];
|
||||
int device_count = 0;
|
||||
char * drv_path[MAX_DEVICES + 1];
|
||||
drv_t * drv_data[MAX_DEVICES];
|
||||
int drv_count;
|
||||
|
||||
pci_module_info *pcimodule;
|
||||
|
||||
|
||||
status_t
|
||||
init_hardware(void)
|
||||
@ -18,34 +27,102 @@ init_hardware(void)
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
|
||||
status_t
|
||||
init_driver(void)
|
||||
{
|
||||
struct pci_info info;
|
||||
struct pci_info *pciinfo = &info;
|
||||
int pciindex;
|
||||
int devindex;
|
||||
|
||||
dprintf("init_driver\n");
|
||||
dprintf("driver base name '%s'\n", driver_info.basename);
|
||||
|
||||
if (get_module(B_PCI_MODULE_NAME,(module_info **)&pcimodule) < 0) {
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
drv_count = 0;
|
||||
|
||||
for (pciindex = 0; B_OK == pcimodule->get_nth_pci_info(pciindex, pciinfo); pciindex++) {
|
||||
dprintf("Checking PCI device, vendor 0x%04x, id 0x%04x, bus 0x%02x, dev 0x%02x, func 0x%02x, rev 0x%02x, api 0x%02x, sub 0x%02x, base 0x%02x\n",
|
||||
pciinfo->vendor_id, pciinfo->device_id, pciinfo->bus, pciinfo->device, pciinfo->function,
|
||||
pciinfo->revision, pciinfo->class_api, pciinfo->class_sub, pciinfo->class_base);
|
||||
|
||||
for (devindex = 0; driver_info.table[devindex].vendor != 0; devindex++) {
|
||||
if (driver_info.table[devindex].vendor != -1 && driver_info.table[devindex].vendor != pciinfo->vendor_id)
|
||||
continue;
|
||||
if (driver_info.table[devindex].device != -1 && driver_info.table[devindex].device != pciinfo->device_id)
|
||||
continue;
|
||||
if (driver_info.table[devindex].revision != -1 && driver_info.table[devindex].revision != pciinfo->revision)
|
||||
continue;
|
||||
if (driver_info.table[devindex].class != -1 && driver_info.table[devindex].class != pciinfo->class_base)
|
||||
continue;
|
||||
if (driver_info.table[devindex].subclass != -1 && driver_info.table[devindex].subclass != pciinfo->class_sub)
|
||||
continue;
|
||||
if (pciinfo->header_type == 0) {
|
||||
if (driver_info.table[devindex].subsystem_vendor != -1 && driver_info.table[devindex].subsystem_vendor != pciinfo->u.h0.subsystem_vendor_id)
|
||||
continue;
|
||||
if (driver_info.table[devindex].subsystem_device != -1 && driver_info.table[devindex].subsystem_device != pciinfo->u.h0.subsystem_id)
|
||||
continue;
|
||||
}
|
||||
|
||||
dprintf("found device '%s'\n", driver_info.table[devindex].name);
|
||||
|
||||
drv_path[drv_count] = (char *) malloc(strlen(driver_info.basename) + 5);
|
||||
sprintf(drv_path[drv_count], "%s/%d", driver_info.basename, drv_count + 1);
|
||||
|
||||
drv_data[drv_count] = (drv_t *) malloc(sizeof(drv_t));
|
||||
drv_data[drv_count]->pci = pcimodule;
|
||||
drv_data[drv_count]->bus = pciinfo->bus;
|
||||
drv_data[drv_count]->device = pciinfo->device;
|
||||
drv_data[drv_count]->function = pciinfo->function;
|
||||
drv_data[drv_count]->name = driver_info.table[devindex].name;
|
||||
drv_data[drv_count]->flags = driver_info.table[devindex].flags;
|
||||
|
||||
drv_count++;
|
||||
break;
|
||||
}
|
||||
if (drv_count == MAX_DEVICES)
|
||||
break;
|
||||
}
|
||||
|
||||
drv_path[drv_count + 1] = NULL;
|
||||
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
void
|
||||
uninit_driver(void)
|
||||
{
|
||||
int i;
|
||||
dprintf("uninit_driver\n");
|
||||
|
||||
for (i = 0; i < drv_count; i++) {
|
||||
free(drv_path[i]);
|
||||
free(drv_data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
static status_t
|
||||
ich_open(const char *name, uint32 flags, void** cookie)
|
||||
{
|
||||
dprintf("open\n");
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
static status_t
|
||||
ich_close(void* cookie)
|
||||
{
|
||||
dprintf("close\n");
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
static status_t
|
||||
ich_free(void* cookie)
|
||||
{
|
||||
dprintf("free\n");
|
||||
return B_OK;
|
||||
}
|
||||
|
||||
@ -69,11 +146,6 @@ ich_write(void* cookie, off_t position, const void* buffer, size_t* num_bytes)
|
||||
return B_IO_ERROR;
|
||||
}
|
||||
|
||||
static const char *ich_name[] = {
|
||||
"audio/lala/ichaudio/1",
|
||||
NULL
|
||||
};
|
||||
|
||||
device_hooks ich_hooks = {
|
||||
ich_open,
|
||||
ich_close,
|
||||
@ -83,11 +155,11 @@ device_hooks ich_hooks = {
|
||||
ich_write
|
||||
};
|
||||
|
||||
const char**
|
||||
const char **
|
||||
publish_devices(void)
|
||||
{
|
||||
dprintf("publish_devices\n");
|
||||
return ich_name;
|
||||
return (const char **) drv_path;
|
||||
}
|
||||
|
||||
device_hooks*
|
||||
|
@ -4,7 +4,19 @@
|
||||
#include <OS.h>
|
||||
#include <malloc.h>
|
||||
|
||||
typedef void drv_t;
|
||||
typedef struct
|
||||
{
|
||||
pci_module_info * pci;
|
||||
|
||||
uint8 bus;
|
||||
uint8 device;
|
||||
uint8 function;
|
||||
|
||||
const char * name;
|
||||
uint32 flags;
|
||||
|
||||
} drv_t;
|
||||
|
||||
typedef void stream_id;
|
||||
typedef void control_id;
|
||||
|
||||
@ -20,9 +32,9 @@ typedef struct {
|
||||
uint32 flags;
|
||||
} id_table_t;
|
||||
|
||||
typedef status_t (*drv_attach) (drv_t *dev, void **cookie, int id_table_index);
|
||||
typedef status_t (*drv_powerctl) (void *cookie);
|
||||
typedef status_t (*drv_detach) (void *cookie);
|
||||
typedef status_t (*drv_attach) (drv_t *drv, void **cookie);
|
||||
typedef status_t (*drv_powerctl) (drv_t *drv, void *cookie);
|
||||
typedef status_t (*drv_detach) (drv_t *drv, void *cookie);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user