1 /*****************************************************************************
2 Copyright(c) 2012 FCI Inc. All Rights Reserved
4 File name : fc8150_i2c.c
6 Description : fc8150 host interface
8 *******************************************************************************/
10 #include "fci_types.h"
11 #include "fc8150_regs.h"
15 #define HPIC_READ 0x01 /* read command */
16 #define HPIC_WRITE 0x02 /* write command */
17 #define HPIC_AINC 0x04 /* address increment */
18 #define HPIC_BMODE 0x00 /* byte mode */
19 #define HPIC_WMODE 0x10 /* word mode */
20 #define HPIC_LMODE 0x20 /* long mode */
21 #define HPIC_ENDIAN 0x00 /* little endian */
22 #define HPIC_CLEAR 0x80 /* currently not used */
24 #define CHIP_ADDR 0x58
26 static int i2c_bulkread(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length)
28 /* Write your own i2c driver code here for read operation. */
33 static int i2c_bulkwrite(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length)
36 /* Write your own i2c driver code here for Write operation. */
41 static int i2c_dataread(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u32 length)
43 return i2c_bulkread(hDevice, chip, addr, data, length);
46 int fc8150_bypass_read(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length)
49 u8 bypass_addr = 0x03;
53 OAL_OBTAIN_SEMAPHORE();
54 res = i2c_bulkwrite(hDevice, CHIP_ADDR, bypass_addr, &bypass_data, \
56 res |= i2c_bulkread(hDevice, chip, addr, data, length);
57 OAL_RELEASE_SEMAPHORE();
62 int fc8150_bypass_write(HANDLE hDevice, u8 chip, u8 addr, u8 *data, u16 length)
65 u8 bypass_addr = 0x03;
69 OAL_OBTAIN_SEMAPHORE();
70 res = i2c_bulkwrite(hDevice, CHIP_ADDR, bypass_addr, &bypass_data, \
72 res |= i2c_bulkwrite(hDevice, chip, addr, data, length);
73 OAL_RELEASE_SEMAPHORE();
78 int fc8150_i2c_init(HANDLE hDevice, u16 param1, u16 param2)
80 OAL_CREATE_SEMAPHORE();
82 /* for TSIF, you can call here your own TSIF initialization function. */
83 /* tsif_initialize(); */
85 bbm_write(hDevice, BBM_TS_CLK_DIV, 0x04);
86 bbm_write(hDevice, BBM_TS_PAUSE, 0x80);
88 bbm_write(hDevice, BBM_TS_CTRL, 0x02);
89 bbm_write(hDevice, BBM_TS_SEL, 0x84);
94 int fc8150_i2c_byteread(HANDLE hDevice, u16 addr, u8 *data)
97 u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN;
99 OAL_OBTAIN_SEMAPHORE();
100 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
102 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
103 res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, 1);
104 OAL_RELEASE_SEMAPHORE();
109 int fc8150_i2c_wordread(HANDLE hDevice, u16 addr, u16 *data)
112 u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
114 OAL_OBTAIN_SEMAPHORE();
115 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
117 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
118 res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)data, 2);
119 OAL_RELEASE_SEMAPHORE();
124 int fc8150_i2c_longread(HANDLE hDevice, u16 addr, u32 *data)
127 u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
129 OAL_OBTAIN_SEMAPHORE();
130 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
132 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
133 res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)data, 4);
134 OAL_RELEASE_SEMAPHORE();
139 int fc8150_i2c_bulkread(HANDLE hDevice, u16 addr, u8 *data, u16 length)
142 u8 command = HPIC_READ | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
144 OAL_OBTAIN_SEMAPHORE();
145 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
147 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
148 res |= i2c_bulkread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length);
149 OAL_RELEASE_SEMAPHORE();
154 int fc8150_i2c_bytewrite(HANDLE hDevice, u16 addr, u8 data)
157 u8 command = HPIC_WRITE | HPIC_BMODE | HPIC_ENDIAN;
159 OAL_OBTAIN_SEMAPHORE();
160 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
162 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
163 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 1);
164 OAL_RELEASE_SEMAPHORE();
169 int fc8150_i2c_wordwrite(HANDLE hDevice, u16 addr, u16 data)
172 u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
174 OAL_OBTAIN_SEMAPHORE();
175 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
177 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
178 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 2);
179 OAL_RELEASE_SEMAPHORE();
184 int fc8150_i2c_longwrite(HANDLE hDevice, u16 addr, u32 data)
187 u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
189 OAL_OBTAIN_SEMAPHORE();
190 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
192 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
193 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, (u8 *)&data, 4);
194 OAL_RELEASE_SEMAPHORE();
199 int fc8150_i2c_bulkwrite(HANDLE hDevice, u16 addr, u8 *data, u16 length)
202 u8 command = HPIC_WRITE | HPIC_AINC | HPIC_BMODE | HPIC_ENDIAN;
204 OAL_OBTAIN_SEMAPHORE();
205 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
207 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
208 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length);
209 OAL_RELEASE_SEMAPHORE();
214 int fc8150_i2c_dataread(HANDLE hDevice, u16 addr, u8 *data, u32 length)
217 u8 command = HPIC_READ | HPIC_BMODE | HPIC_ENDIAN;
219 OAL_OBTAIN_SEMAPHORE();
220 res = i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_ADDRESS_REG,
222 res |= i2c_bulkwrite(hDevice, CHIP_ADDR, BBM_COMMAND_REG, &command, 1);
223 res |= i2c_dataread(hDevice, CHIP_ADDR, BBM_DATA_REG, data, length);
224 OAL_RELEASE_SEMAPHORE();
229 int fc8150_i2c_deinit(HANDLE hDevice)
231 bbm_write(hDevice, BBM_TS_SEL, 0x00);
235 OAL_DELETE_SEMAPHORE();