I2C overhaul part 2
This commit is contained in:
@@ -253,7 +253,7 @@ typedef struct mach64_t
|
||||
|
||||
int overlay_v_acc;
|
||||
|
||||
void *i2c;
|
||||
void *i2c, *ddc;
|
||||
} mach64_t;
|
||||
|
||||
static video_timings_t timing_mach64_isa = {VIDEO_ISA, 3, 3, 6, 5, 5, 10};
|
||||
@@ -3372,7 +3372,7 @@ static void *mach64_common_init(const device_t *info)
|
||||
mach64->fifo_thread = thread_create(fifo_thread, mach64);
|
||||
|
||||
mach64->i2c = i2c_gpio_init("ddc_ati_mach64");
|
||||
ddc_init(i2c_gpio_get_bus(mach64->i2c));
|
||||
mach64->ddc = ddc_init(i2c_gpio_get_bus(mach64->i2c));
|
||||
|
||||
return mach64;
|
||||
}
|
||||
@@ -3464,6 +3464,9 @@ void mach64_close(void *p)
|
||||
thread_destroy_event(mach64->wake_fifo_thread);
|
||||
thread_destroy_event(mach64->fifo_not_full_event);
|
||||
|
||||
ddc_close(mach64->ddc);
|
||||
i2c_gpio_close(mach64->i2c);
|
||||
|
||||
free(mach64);
|
||||
}
|
||||
|
||||
|
||||
@@ -27,11 +27,6 @@
|
||||
#include <86box/i2c.h>
|
||||
|
||||
|
||||
typedef struct {
|
||||
uint8_t addr_register;
|
||||
} ddc_t;
|
||||
|
||||
|
||||
static uint8_t edid_data[128] = {
|
||||
0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, /* Fixed header pattern */
|
||||
0x09, 0xf8, /* Manufacturer "BOX" - apparently unassigned by UEFI - and it has to be big endian */
|
||||
@@ -74,59 +69,20 @@ static uint8_t edid_data[128] = {
|
||||
};
|
||||
|
||||
|
||||
uint8_t
|
||||
ddc_read_byte_cmd(void *bus, uint8_t addr, uint8_t cmd, void *priv)
|
||||
{
|
||||
return edid_data[cmd & 0x7f];
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
ddc_read_byte(void *bus, uint8_t addr, void *priv)
|
||||
{
|
||||
ddc_t *dev = (ddc_t *) priv;
|
||||
return ddc_read_byte_cmd(bus, addr, dev->addr_register++, priv);
|
||||
}
|
||||
|
||||
|
||||
uint16_t
|
||||
ddc_read_word_cmd(void *bus, uint8_t addr, uint8_t cmd, void *priv)
|
||||
{
|
||||
return (ddc_read_byte_cmd(bus, addr, cmd + 1, priv) << 8) | ddc_read_byte_cmd(bus, addr, cmd, priv);
|
||||
}
|
||||
|
||||
|
||||
uint8_t
|
||||
ddc_read_block_cmd(void *bus, uint8_t addr, uint8_t cmd, uint8_t *data, uint8_t len, void *priv)
|
||||
{
|
||||
uint8_t read = 0;
|
||||
for (uint8_t i = cmd; (i < len) && (i < 0x80); i++)
|
||||
data[read++] = ddc_read_byte_cmd(bus, addr, i, priv);
|
||||
return read;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ddc_write_byte(void *bus, uint8_t addr, uint8_t val, void *priv)
|
||||
{
|
||||
ddc_t *dev = (ddc_t *) priv;
|
||||
dev->addr_register = val;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
void *
|
||||
ddc_init(void *i2c)
|
||||
{
|
||||
ddc_t *dev = (ddc_t *) malloc(sizeof(ddc_t));
|
||||
memset(dev, 0, sizeof(ddc_t));
|
||||
|
||||
uint8_t checksum = 0;
|
||||
for (int c = 0; c < 127; c++)
|
||||
checksum += edid_data[c];
|
||||
edid_data[127] = 256 - checksum;
|
||||
|
||||
i2c_sethandler(i2c, 0x50, 1,
|
||||
NULL, ddc_read_byte, ddc_read_byte_cmd, ddc_read_word_cmd, ddc_read_block_cmd,
|
||||
NULL, ddc_write_byte, NULL, NULL, NULL,
|
||||
dev);
|
||||
return i2c_eeprom_init(i2c, 0x50, edid_data, sizeof(edid_data), 0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ddc_close(void *dev_handle)
|
||||
{
|
||||
i2c_eeprom_close(dev_handle);
|
||||
}
|
||||
|
||||
@@ -288,7 +288,7 @@ typedef struct virge_t
|
||||
|
||||
uint8_t serialport;
|
||||
|
||||
void *i2c;
|
||||
void *i2c, *ddc;
|
||||
} virge_t;
|
||||
|
||||
static video_timings_t timing_diamond_stealth3d_2000_vlb = {VIDEO_BUS, 2, 2, 3, 28, 28, 45};
|
||||
@@ -3849,7 +3849,7 @@ static void *s3_virge_init(const device_t *info)
|
||||
virge->fifo_thread = thread_create(fifo_thread, virge);
|
||||
|
||||
virge->i2c = i2c_gpio_init("ddc_s3_virge");
|
||||
ddc_init(i2c_gpio_get_bus(virge->i2c));
|
||||
virge->ddc = ddc_init(i2c_gpio_get_bus(virge->i2c));
|
||||
|
||||
return virge;
|
||||
}
|
||||
@@ -3868,6 +3868,9 @@ static void s3_virge_close(void *p)
|
||||
thread_destroy_event(virge->fifo_not_full_event);
|
||||
|
||||
svga_close(&virge->svga);
|
||||
|
||||
ddc_close(virge->ddc);
|
||||
i2c_gpio_close(virge->i2c);
|
||||
|
||||
free(virge);
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ typedef struct banshee_t
|
||||
|
||||
int type;
|
||||
|
||||
void *i2c;
|
||||
void *i2c, *ddc;
|
||||
} banshee_t;
|
||||
|
||||
enum
|
||||
@@ -2629,7 +2629,7 @@ static void *banshee_init_common(const device_t *info, wchar_t *fn, int has_sgra
|
||||
banshee->vidSerialParallelPort = VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W;
|
||||
|
||||
banshee->i2c = i2c_gpio_init("ddc_voodoo_banshee");
|
||||
ddc_init(i2c_gpio_get_bus(banshee->i2c));
|
||||
banshee->ddc = ddc_init(i2c_gpio_get_bus(banshee->i2c));
|
||||
|
||||
video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_banshee);
|
||||
|
||||
@@ -2676,6 +2676,7 @@ static void banshee_close(void *p)
|
||||
|
||||
voodoo_card_close(banshee->voodoo);
|
||||
svga_close(&banshee->svga);
|
||||
ddc_close(banshee->ddc);
|
||||
i2c_gpio_close(banshee->i2c);
|
||||
|
||||
free(banshee);
|
||||
|
||||
Reference in New Issue
Block a user