qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

pca9552-test.c (2360B)


      1 /*
      2  * QTest testcase for the PCA9552 LED blinker
      3  *
      4  * Copyright (c) 2017-2018, IBM Corporation.
      5  *
      6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
      7  * See the COPYING file in the top-level directory.
      8  */
      9 
     10 #include "qemu/osdep.h"
     11 
     12 #include "libqtest.h"
     13 #include "libqos/qgraph.h"
     14 #include "libqos/i2c.h"
     15 #include "hw/misc/pca9552_regs.h"
     16 
     17 #define PCA9552_TEST_ID   "pca9552-test"
     18 #define PCA9552_TEST_ADDR 0x60
     19 
     20 static void pca9552_init(QI2CDevice *i2cdev)
     21 {
     22     /* Switch on LEDs 0 and 12 */
     23     i2c_set8(i2cdev, PCA9552_LS0, 0x54);
     24     i2c_set8(i2cdev, PCA9552_LS3, 0x54);
     25 }
     26 
     27 static void receive_autoinc(void *obj, void *data, QGuestAllocator *alloc)
     28 {
     29     QI2CDevice *i2cdev = (QI2CDevice *)obj;
     30     uint8_t resp;
     31     uint8_t reg = PCA9552_LS0 | PCA9552_AUTOINC;
     32 
     33     pca9552_init(i2cdev);
     34 
     35     qi2c_send(i2cdev, &reg, 1);
     36 
     37     /* PCA9552_LS0 */
     38     qi2c_recv(i2cdev, &resp, 1);
     39     g_assert_cmphex(resp, ==, 0x54);
     40 
     41     /* PCA9552_LS1 */
     42     qi2c_recv(i2cdev, &resp, 1);
     43     g_assert_cmphex(resp, ==, 0x55);
     44 
     45     /* PCA9552_LS2 */
     46     qi2c_recv(i2cdev, &resp, 1);
     47     g_assert_cmphex(resp, ==, 0x55);
     48 
     49     /* PCA9552_LS3 */
     50     qi2c_recv(i2cdev, &resp, 1);
     51     g_assert_cmphex(resp, ==, 0x54);
     52 }
     53 
     54 static void send_and_receive(void *obj, void *data, QGuestAllocator *alloc)
     55 {
     56     QI2CDevice *i2cdev = (QI2CDevice *)obj;
     57     uint8_t value;
     58 
     59     value = i2c_get8(i2cdev, PCA9552_LS0);
     60     g_assert_cmphex(value, ==, 0x55);
     61 
     62     value = i2c_get8(i2cdev, PCA9552_INPUT0);
     63     g_assert_cmphex(value, ==, 0x0);
     64 
     65     pca9552_init(i2cdev);
     66 
     67     value = i2c_get8(i2cdev, PCA9552_LS0);
     68     g_assert_cmphex(value, ==, 0x54);
     69 
     70     value = i2c_get8(i2cdev, PCA9552_INPUT0);
     71     g_assert_cmphex(value, ==, 0x01);
     72 
     73     value = i2c_get8(i2cdev, PCA9552_LS3);
     74     g_assert_cmphex(value, ==, 0x54);
     75 
     76     value = i2c_get8(i2cdev, PCA9552_INPUT1);
     77     g_assert_cmphex(value, ==, 0x10);
     78 }
     79 
     80 static void pca9552_register_nodes(void)
     81 {
     82     QOSGraphEdgeOptions opts = {
     83         .extra_device_opts = "address=0x60"
     84     };
     85     add_qi2c_address(&opts, &(QI2CAddress) { 0x60 });
     86 
     87     qos_node_create_driver("pca9552", i2c_device_create);
     88     qos_node_consumes("pca9552", "i2c-bus", &opts);
     89 
     90     qos_add_test("tx-rx", "pca9552", send_and_receive, NULL);
     91     qos_add_test("rx-autoinc", "pca9552", receive_autoinc, NULL);
     92 }
     93 libqos_init(pca9552_register_nodes);