1 // Copyright 2018 The Fuchsia Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #pragma once 6 7 #include <hwreg/bitfields.h> 8 #include <zircon/types.h> 9 10 namespace imx_i2c { 11 12 class SlaveAddressReg : public hwreg::RegisterBase<SlaveAddressReg, uint16_t> { 13 public: 14 DEF_FIELD(7, 1, address); Get()15 static auto Get() { return hwreg::RegisterAddr<SlaveAddressReg>(0x0); } 16 }; 17 18 class FreqReg : public hwreg::RegisterBase<FreqReg, uint16_t> { 19 public: 20 DEF_FIELD(5, 0, freq); Get()21 static auto Get() { return hwreg::RegisterAddr<FreqReg>(0x4); } 22 }; 23 24 class ControlReg : public hwreg::RegisterBase<ControlReg, uint16_t, hwreg::EnablePrinter> { 25 public: 26 DEF_BIT(7, enable); 27 DEF_BIT(6, interrupt_enable); 28 DEF_BIT(5, master); 29 DEF_BIT(4, transmit); 30 DEF_BIT(3, tx_ack_disable); 31 DEF_BIT(2, repeat_start); Get()32 static auto Get() { return hwreg::RegisterAddr<ControlReg>(0x8); } 33 }; 34 35 class StatusReg : public hwreg::RegisterBase<StatusReg, uint16_t, hwreg::EnablePrinter> { 36 public: 37 DEF_BIT(7, transfer_complete); 38 DEF_BIT(6, addressed_as_slave); 39 DEF_BIT(5, bus_busy); 40 DEF_BIT(4, arbitration_lost); 41 DEF_BIT(2, slave_read_write); 42 DEF_BIT(1, interrupt_pending); 43 DEF_BIT(0, ack); Get()44 static auto Get() { return hwreg::RegisterAddr<StatusReg>(0xC); } 45 }; 46 47 // The register is 16 bits but since we only use 8 bits define as uint8_t to avoid casting 48 class DataReg : public hwreg::RegisterBase<DataReg, uint8_t> { 49 public: 50 DEF_FIELD(7, 0, data); Get()51 static auto Get() { return hwreg::RegisterAddr<DataReg>(0x10); } 52 }; 53 54 } // namespace imx_i2c 55