2 Copyright © 2005-2013, Davy Wentzler. All rights reserved.
6 #include <proto/exec.h>
7 #include <proto/expansion.h>
9 #include "DriverData.h"
15 static void Revo51_Start(struct CardData
*card
)
19 SaveGPIO(card
->pci_dev
, card
);
23 static void Revo51_Stop(struct CardData
*card
)
25 RestoreGPIO(card
->pci_dev
, card
);
30 // Set the direction of the CLK and SDA lines:
31 // For sending, use 1, 1
32 static void Revo51_SetDir_CLK_SDA(struct CardData
*card
, int clock
, int data
)
34 unsigned int mask
= 0, val
;
38 val
= REVO51_I2C_CLOCK
; /* write SCL */
40 val
|= REVO51_I2C_DATA
; /* write SDA */
42 mask
= REVO51_I2C_CLOCK
| REVO51_I2C_DATA
;
43 card
->gpio_dir
&= ~mask
;
44 card
->gpio_dir
|= val
;
45 SetGPIODir(card
->pci_dev
, card
, card
->gpio_dir
);
46 SetGPIOMask(card
, card
->iobase
, ~mask
);
52 // Write data to the SDA line and clock to the SCL
53 static void Revo51_Write_CLK_SDA(struct CardData
*card
, int clk
, int data
)
55 unsigned int val
= 0, mask
= REVO51_I2C_CLOCK
| REVO51_I2C_DATA
;;
58 val
|= REVO51_I2C_CLOCK
;
60 val
|= REVO51_I2C_DATA
;
62 card
->gpio_dir
|= mask
;
63 SetGPIODir(card
->pci_dev
, card
, card
->gpio_dir
);
64 SetGPIOMask(card
, card
->iobase
, ~mask
);
65 SetGPIOData(card
, card
->iobase
, mask
& val
);
71 static int Revo51_GetDataBit(struct CardData
*card
, int ack
)
78 // get data bit from the GPIO pines
79 card
->gpio_dir
&= ~REVO51_I2C_DATA
;
80 SetGPIODir(card
->pci_dev
, card
, card
->gpio_dir
);
81 bit
= GetGPIOData(card
, card
->iobase
) & REVO51_I2C_DATA
? 1 : 0;
87 static struct I2C_bit_ops Revo51_bit_ops
= {
90 Revo51_SetDir_CLK_SDA
,
96 void Revo51_Init(struct CardData
*card
)
98 unsigned char bytes
[4];
100 /* create i2c devices */
101 card
->i2c
= AllocI2C(0x40);
102 card
->i2c
->bit
= &Revo51_bit_ops
;
104 card
->bit_ops
= &Revo51_bit_ops
;
106 //DEBUGPRINTF("Resetting PT2258\n");
108 // step 1: clear reg 0xC0
110 WriteBytesI2C(card
, card
->i2c
, bytes
, 1);
112 // unmute all channels
113 bytes
[0] = REVO51_2258_UNMUTE
;
114 WriteBytesI2C(card
, card
->i2c
, bytes
, 1);
116 // set all 6 channels to no attenuation (0dB)
119 WriteBytesI2C(card
, card
->i2c
, bytes
, 2);