xref: /qemu/tests/qtest/pca9552-test.c (revision 5141d4158cf0dbdc13e42f175d1718d40b789f75)
1*5141d415SCédric Le Goater /*
2*5141d415SCédric Le Goater  * QTest testcase for the PCA9552 LED blinker
3*5141d415SCédric Le Goater  *
4*5141d415SCédric Le Goater  * Copyright (c) 2017-2018, IBM Corporation.
5*5141d415SCédric Le Goater  *
6*5141d415SCédric Le Goater  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7*5141d415SCédric Le Goater  * See the COPYING file in the top-level directory.
8*5141d415SCédric Le Goater  */
9*5141d415SCédric Le Goater 
10*5141d415SCédric Le Goater #include "qemu/osdep.h"
11*5141d415SCédric Le Goater 
12*5141d415SCédric Le Goater #include "libqtest.h"
13*5141d415SCédric Le Goater #include "libqos/i2c.h"
14*5141d415SCédric Le Goater #include "hw/misc/pca9552_regs.h"
15*5141d415SCédric Le Goater 
16*5141d415SCédric Le Goater #define PCA9552_TEST_ID   "pca9552-test"
17*5141d415SCédric Le Goater #define PCA9552_TEST_ADDR 0x60
18*5141d415SCédric Le Goater 
19*5141d415SCédric Le Goater static I2CAdapter *i2c;
20*5141d415SCédric Le Goater 
21*5141d415SCédric Le Goater static uint8_t pca9552_get8(I2CAdapter *i2c, uint8_t addr, uint8_t reg)
22*5141d415SCédric Le Goater {
23*5141d415SCédric Le Goater     uint8_t resp[1];
24*5141d415SCédric Le Goater     i2c_send(i2c, addr, &reg, 1);
25*5141d415SCédric Le Goater     i2c_recv(i2c, addr, resp, 1);
26*5141d415SCédric Le Goater     return resp[0];
27*5141d415SCédric Le Goater }
28*5141d415SCédric Le Goater 
29*5141d415SCédric Le Goater static void pca9552_set8(I2CAdapter *i2c, uint8_t addr, uint8_t reg,
30*5141d415SCédric Le Goater                          uint8_t value)
31*5141d415SCédric Le Goater {
32*5141d415SCédric Le Goater     uint8_t cmd[2];
33*5141d415SCédric Le Goater     uint8_t resp[1];
34*5141d415SCédric Le Goater 
35*5141d415SCédric Le Goater     cmd[0] = reg;
36*5141d415SCédric Le Goater     cmd[1] = value;
37*5141d415SCédric Le Goater     i2c_send(i2c, addr, cmd, 2);
38*5141d415SCédric Le Goater     i2c_recv(i2c, addr, resp, 1);
39*5141d415SCédric Le Goater     g_assert_cmphex(resp[0], ==, cmd[1]);
40*5141d415SCédric Le Goater }
41*5141d415SCédric Le Goater 
42*5141d415SCédric Le Goater static void receive_autoinc(void)
43*5141d415SCédric Le Goater {
44*5141d415SCédric Le Goater     uint8_t resp;
45*5141d415SCédric Le Goater     uint8_t reg = PCA9552_LS0 | PCA9552_AUTOINC;
46*5141d415SCédric Le Goater 
47*5141d415SCédric Le Goater     i2c_send(i2c, PCA9552_TEST_ADDR, &reg, 1);
48*5141d415SCédric Le Goater 
49*5141d415SCédric Le Goater     /* PCA9552_LS0 */
50*5141d415SCédric Le Goater     i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
51*5141d415SCédric Le Goater     g_assert_cmphex(resp, ==, 0x54);
52*5141d415SCédric Le Goater 
53*5141d415SCédric Le Goater     /* PCA9552_LS1 */
54*5141d415SCédric Le Goater     i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
55*5141d415SCédric Le Goater     g_assert_cmphex(resp, ==, 0x55);
56*5141d415SCédric Le Goater 
57*5141d415SCédric Le Goater     /* PCA9552_LS2 */
58*5141d415SCédric Le Goater     i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
59*5141d415SCédric Le Goater     g_assert_cmphex(resp, ==, 0x55);
60*5141d415SCédric Le Goater 
61*5141d415SCédric Le Goater     /* PCA9552_LS3 */
62*5141d415SCédric Le Goater     i2c_recv(i2c, PCA9552_TEST_ADDR, &resp, 1);
63*5141d415SCédric Le Goater     g_assert_cmphex(resp, ==, 0x54);
64*5141d415SCédric Le Goater }
65*5141d415SCédric Le Goater 
66*5141d415SCédric Le Goater static void send_and_receive(void)
67*5141d415SCédric Le Goater {
68*5141d415SCédric Le Goater     uint8_t value;
69*5141d415SCédric Le Goater 
70*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
71*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x55);
72*5141d415SCédric Le Goater 
73*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
74*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x0);
75*5141d415SCédric Le Goater 
76*5141d415SCédric Le Goater     /* Switch on LED 0 */
77*5141d415SCédric Le Goater     pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0, 0x54);
78*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS0);
79*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x54);
80*5141d415SCédric Le Goater 
81*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT0);
82*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x01);
83*5141d415SCédric Le Goater 
84*5141d415SCédric Le Goater     /* Switch on LED 12 */
85*5141d415SCédric Le Goater     pca9552_set8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3, 0x54);
86*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_LS3);
87*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x54);
88*5141d415SCédric Le Goater 
89*5141d415SCédric Le Goater     value = pca9552_get8(i2c, PCA9552_TEST_ADDR, PCA9552_INPUT1);
90*5141d415SCédric Le Goater     g_assert_cmphex(value, ==, 0x10);
91*5141d415SCédric Le Goater }
92*5141d415SCédric Le Goater 
93*5141d415SCédric Le Goater int main(int argc, char **argv)
94*5141d415SCédric Le Goater {
95*5141d415SCédric Le Goater     QTestState *s = NULL;
96*5141d415SCédric Le Goater     int ret;
97*5141d415SCédric Le Goater 
98*5141d415SCédric Le Goater     g_test_init(&argc, &argv, NULL);
99*5141d415SCédric Le Goater 
100*5141d415SCédric Le Goater     s = qtest_start("-machine n800 "
101*5141d415SCédric Le Goater                     "-device pca9552,bus=i2c-bus.0,id=" PCA9552_TEST_ID
102*5141d415SCédric Le Goater                     ",address=0x60");
103*5141d415SCédric Le Goater     i2c = omap_i2c_create(s, OMAP2_I2C_1_BASE);
104*5141d415SCédric Le Goater 
105*5141d415SCédric Le Goater     qtest_add_func("/pca9552/tx-rx", send_and_receive);
106*5141d415SCédric Le Goater     qtest_add_func("/pca9552/rx-autoinc", receive_autoinc);
107*5141d415SCédric Le Goater 
108*5141d415SCédric Le Goater     ret = g_test_run();
109*5141d415SCédric Le Goater 
110*5141d415SCédric Le Goater     if (s) {
111*5141d415SCédric Le Goater         qtest_quit(s);
112*5141d415SCédric Le Goater     }
113*5141d415SCédric Le Goater     g_free(i2c);
114*5141d415SCédric Le Goater 
115*5141d415SCédric Le Goater     return ret;
116*5141d415SCédric Le Goater }
117