862 lines
32 KiB
C
862 lines
32 KiB
C
/*
|
|
* Copyright (C) 2018 Intel Corporation. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*
|
|
*/
|
|
|
|
#ifndef _IOC_H_
|
|
#define _IOC_H_
|
|
|
|
#include <stdint.h>
|
|
#include <pthread.h>
|
|
|
|
#include <sys/queue.h>
|
|
#include <sys/epoll.h>
|
|
|
|
/*
|
|
* Carrier Board Communication(CBC) frame definition
|
|
* +---+---------+-----------+---------------+---------+----------+---------+
|
|
*
|
|
* +---------------+-------------+
|
|
* | ServiceHeader | DataPayload |
|
|
* | 8b | 24b...504b |
|
|
* ++--------------+-------------+
|
|
* Service Layer
|
|
* \ /
|
|
* +-------------+----------\-------------/
|
|
* | Multiplexer | Priority | UpperLayer |
|
|
* | 5b | 3b | |
|
|
* +-------------+------------------------+
|
|
* Address Layer
|
|
* \ /
|
|
* +---+---------+-----------+---------------+---------\----------/---------+
|
|
* |SOF|Extension|FrameLength|SequenceCounter|TimeStamp|UpperLayer|CheckSum |
|
|
* |8b | 1b | 5b | 2b |32B(n/a) | | 8b |
|
|
* +---+---------+-----------+---------------+---------+----------+---------+
|
|
* Link Layer
|
|
*
|
|
*/
|
|
|
|
#define CBC_SOF_VALUE 0x05 /* CBC start of frame value */
|
|
#define CBC_EXT_VALUE 0x00 /* CBC extension bit value */
|
|
#define CBC_PRIO_MASK 0x07 /* CBC priority bitmask */
|
|
#define CBC_MUX_MASK 0x1F /* CBC muxtiplexer bitmask */
|
|
#define CBC_LEN_MASK 0x1F /* CBC frame length bitmask */
|
|
#define CBC_SEQ_MASK 0x03 /* CBC sequence bitmask */
|
|
#define CBC_EXT_MASK 0x01 /* CBC extension bits bitmask */
|
|
#define CBC_MUX_OFFSET 3 /* CBC muxtiplexer offset */
|
|
#define CBC_SEQ_OFFSET 0 /* CBC sequence offset */
|
|
#define CBC_LEN_OFFSET 2 /* CBC service frame length offset */
|
|
#define CBC_EXT_OFFSET 7 /* CBC extension bits offset */
|
|
#define CBC_LEN_UNIT 4 /* CBC frame content in block length */
|
|
#define CBC_PRIO_OFFSET 0 /* CBC priority offset */
|
|
#define CBC_CHKSUM_SIZE 1 /* CBC checksum size */
|
|
#define CBC_GRANULARITY 4 /* CBC frame alignment */
|
|
#define CBC_LINK_HDR_SIZE 3 /* CBC link layer header size */
|
|
#define CBC_ADDR_HDR_SIZE 1 /* CBC address layser header size */
|
|
#define CBC_SRV_HDR_SIZE 1 /* CBC service layer header size */
|
|
#define CBC_MAX_FRAME_SIZE 96 /* CBC maximum frame size */
|
|
#define CBC_MIN_FRAME_SIZE 8 /* CBC mininum frame size */
|
|
#define CBC_MAX_SERVICE_SIZE 64 /* CBC maximum service size */
|
|
|
|
/*
|
|
* Define the start positions of each layer headers.
|
|
* CBC_SOF_POS: start of frame start byte position
|
|
* CBC_ELS_POS: externsion, frame length and sequence start byte position
|
|
* CBC_ADDR_POS: address protocol start byte postion
|
|
* CBC_SRV_POS: service protocol start byte position
|
|
* CBC_PAYLOAD_POS: CBC payload start byte position
|
|
*/
|
|
#define CBC_SOF_POS 0
|
|
#define CBC_ELS_POS (CBC_SOF_POS + 1)
|
|
#define CBC_ADDR_POS (CBC_SOF_POS + CBC_LINK_HDR_SIZE - CBC_CHKSUM_SIZE)
|
|
#define CBC_SRV_POS (CBC_ADDR_POS + CBC_ADDR_HDR_SIZE)
|
|
#define CBC_PAYLOAD_POS (CBC_SRV_POS + CBC_SRV_HDR_SIZE)
|
|
|
|
#define CBC_WK_RSN_BTN (1 << 5) /* CBC wakeup reason field button */
|
|
#define CBC_WK_RSN_RTC (1 << 9) /* CBC wakeup reason field rtc */
|
|
#define CBC_WK_RSN_DOR (1 << 11) /* CBC wakeup reason field cardoor */
|
|
#define CBC_WK_RSN_FS5 (1 << 22) /* CBC wakeup reason field force S5 */
|
|
#define CBC_WK_RSN_SOC (1 << 23) /* CBC wakeup reason field soc */
|
|
/* CBC wakeup reason field debug channel */
|
|
#define CBC_WK_RSN_DGB (1 << 24)
|
|
|
|
/* CBC wakeup reason filed suspend or shutdown */
|
|
#define CBC_WK_RSN_SHUTDOWN (0)
|
|
|
|
/*
|
|
* IOC mediator permits ignition button, cardoor, RTC, SOC and force S5 wakeup
|
|
* reasons which comes from IOC firmware, others will be masked.
|
|
*/
|
|
#define CBC_WK_RSN_ALL \
|
|
(CBC_WK_RSN_BTN | CBC_WK_RSN_RTC | CBC_WK_RSN_DOR | CBC_WK_RSN_SOC | \
|
|
CBC_WK_RSN_FS5)
|
|
|
|
/*
|
|
* CBC ring buffer is used to buffer bytes before build one complete CBC frame.
|
|
*/
|
|
#define CBC_RING_BUFFER_SIZE 256
|
|
|
|
/*
|
|
* Default whitelist node is NULL before whitelist initialization.
|
|
*/
|
|
#define DEFAULT_WLIST_NODE (0)
|
|
|
|
/*
|
|
* Default IOC channels file descriptor is -1 before open.
|
|
*/
|
|
#define IOC_INIT_FD -1
|
|
|
|
/*
|
|
* Maximum CBC requests number.
|
|
*/
|
|
#define IOC_MAX_REQUESTS 200
|
|
|
|
/*
|
|
* Maximum epoll events.
|
|
*/
|
|
#define IOC_MAX_EVENTS 32
|
|
|
|
/* IOC default path */
|
|
#define IOC_DP_NONE ""
|
|
|
|
/*
|
|
* IOC native channel path definition.
|
|
*/
|
|
#define IOC_NP_PMT "/dev/cbc-pmt"
|
|
#define IOC_NP_LF "/dev/cbc-lifecycle"
|
|
#define IOC_NP_SIG "/dev/cbc-signals"
|
|
#define IOC_NP_ESIG "/dev/cbc-early-signals"
|
|
#define IOC_NP_DIAG "/dev/cbc-diagnosis"
|
|
#define IOC_NP_DLT "/dev/cbc-dlt"
|
|
#define IOC_NP_LIND "/dev/cbc-linda"
|
|
#define IOC_NP_RAW0 "/dev/cbc-raw0"
|
|
#define IOC_NP_RAW1 "/dev/cbc-raw1"
|
|
#define IOC_NP_RAW2 "/dev/cbc-raw2"
|
|
#define IOC_NP_RAW3 "/dev/cbc-raw3"
|
|
#define IOC_NP_RAW4 "/dev/cbc-raw4"
|
|
#define IOC_NP_RAW5 "/dev/cbc-raw5"
|
|
#define IOC_NP_RAW6 "/dev/cbc-raw6"
|
|
#define IOC_NP_RAW7 "/dev/cbc-raw7"
|
|
#define IOC_NP_RAW8 "/dev/cbc-raw8"
|
|
#define IOC_NP_RAW9 "/dev/cbc-raw9"
|
|
#define IOC_NP_RAW10 "/dev/cbc-raw10"
|
|
#define IOC_NP_RAW11 "/dev/cbc-raw11"
|
|
#define IOC_NP_FLF "/tmp/ioc_fake_lifecycle"
|
|
#define IOC_NP_FSIG "/tmp/ioc_fake_signal"
|
|
#define IOC_NP_FRAW "/tmp/ioc_fake_raw11"
|
|
|
|
/*
|
|
* CBC signal data command types.
|
|
* Signal Data Message
|
|
* +----------------+--------------+
|
|
* | SignalDataCMD | Payload |
|
|
* | 8b | 0~56b |
|
|
* +----------------+--------------+
|
|
*/
|
|
enum cbc_signal_data_command {
|
|
CBC_SD_SINGLE_SIGNAL = 1, /* Single signal update */
|
|
CBC_SD_MULTI_SIGNAL = 2, /* Multi signal update */
|
|
CBC_SD_GROUP_SIGNAL = 3, /* Group signal update */
|
|
CBC_SD_DEFAULT_VALUES = 4, /* Update default values */
|
|
CBC_SD_UPDATE_SNA = 5, /* Update SNA values */
|
|
CBC_SD_INVAL_SSIG = 6, /* Invalidate signal */
|
|
CBC_SD_INVAL_MSIG = 7, /* Invalidate multi signals */
|
|
CBC_SD_INVAL_SGRP = 8, /* Invalidate signal group */
|
|
CBC_SD_INVAL_MGRP = 9, /* Invalidate muliti groups */
|
|
CBC_SD_OPEN_CHANNEL = 253, /* Open signal channel */
|
|
CBC_SD_CLOSE_CHANNEL = 254, /* Clsoe signal channel */
|
|
CBC_SD_RESET_CHANNEL = 255, /* Reset signal channel */
|
|
CBC_SD_MAX
|
|
};
|
|
|
|
/*
|
|
* CBC system control command types.
|
|
* +------------------+------------+
|
|
* | SystemControlCMD | Payload |
|
|
* | 8b | 24b |
|
|
* +------------------+------------+
|
|
*/
|
|
enum cbc_system_control_command {
|
|
CBC_SC_WK_RSN = 1, /* Wakeup reasons */
|
|
CBC_SC_HB = 2, /* Heartbeat */
|
|
CBC_SC_BOOTSEL = 3, /* Boot selector */
|
|
CBC_SC_SPRS_HB = 4, /* Suppress heartbeat check */
|
|
CBC_SC_RTC = 5, /* Set RTC wakeup timer */
|
|
CBC_SC_MAX
|
|
};
|
|
|
|
/*
|
|
* CBC system control - heartbeat: command types.
|
|
* Heartbeat Message
|
|
* +------------------+---------+-----------------+------+
|
|
* | SystemControlCMD | Command | SUS_STAT Action | Resv |
|
|
* | 8b | 8b | 8b | 8b |
|
|
* +------------------+---------+-----------------+------+
|
|
*/
|
|
enum cbc_heartbeat_command {
|
|
CBC_HB_SD_PREP, /* Shutdown prepared */
|
|
CBC_HB_ACTIVE, /* Active */
|
|
CBC_HB_SD_DLY, /* Shutdown delay */
|
|
CBC_HB_INITIAL, /* Initial */
|
|
CBC_HB_STANDBY, /* Standby */
|
|
CBC_HB_DIAG, /* Diagnosis */
|
|
CBC_HB_SD_REQ, /* Cm shutdown request */
|
|
CBC_HB_SD_EXE, /* Shutdown execute */
|
|
CBC_HB_EMG_SD, /* Mmergency shutdown execute */
|
|
CBC_HB_MAX
|
|
};
|
|
|
|
/*
|
|
* CBC system control - heartbeat: suspend state action types.
|
|
*/
|
|
enum cbc_sus_stat_action {
|
|
CBC_SS_INVALID, /* Invalid */
|
|
CBC_SS_HALT_I0, /* Halt */
|
|
CBC_SS_REBOOT0, /* Reboot */
|
|
CBC_SS_HALT_I1, /* Ignore once then halt */
|
|
CBC_SS_REBOOT1, /* Ignore once then reboot */
|
|
CBC_SS_HALT_I2, /* Ignore twice then halt */
|
|
CBC_SS_REBOOT2, /* Ignore twice then reboot */
|
|
CBC_SS_REFRESH, /* Ram refresh, S3 */
|
|
CBC_SS_MAX
|
|
};
|
|
|
|
/*
|
|
* CBC system control - RTC: command type.
|
|
* RTC Message
|
|
* +------------------+-------------+-------------+-------------+
|
|
* | SystemControlCMD | Timer value | Timer value | Granularity |
|
|
* | SVC-Header: 5 | Bits 0...7 | Bits 8...15 | 0 - seconds |
|
|
* | | | | 1 - minutes |
|
|
* | | | | 2 - hours |
|
|
* | | | | 3 - days |
|
|
* | | | | 4 - week |
|
|
* | 8b | 8b | 8b | 8b |
|
|
* +------------------+-------------+-------------+-------------+
|
|
*/
|
|
enum cbc_rtc_timer_unit {
|
|
CBC_RTC_TIMER_U_SEC,
|
|
CBC_RTC_TIMER_U_MIN,
|
|
CBC_RTC_TIMER_U_HOUR,
|
|
CBC_RTC_TIMER_U_DAY,
|
|
CBC_RTC_TIMER_U_WEEK,
|
|
};
|
|
|
|
/*
|
|
* CBC rx signal identity definition.
|
|
*/
|
|
enum cbc_rx_signal_id {
|
|
CBC_SIG_ID_STFR = 20000, /* SetTunerFrequency */
|
|
CBC_SIG_ID_EGYO = 20001, /* EnableGyro */
|
|
CBC_SIG_ID_WACS = 20002, /* WriteAmplifierConfigurationSequence*/
|
|
CBC_SIG_ID_RIFC = 20003, /* RequestIocFblChecksum */
|
|
CBC_SIG_ID_RIWC = 20004, /* RequestIocWfChecksum */
|
|
CBC_SIG_ID_RIAC = 20005, /* RequestIocAppChecksum */
|
|
CBC_SIG_ID_RIVS = 20006, /* RequestIocVersion */
|
|
CBC_SIG_ID_RRMS = 20007, /* RequestRuntimeMeasurement */
|
|
CBC_SIG_ID_MTAM = 20008, /* MuteAmplifier */
|
|
CBC_SIG_ID_PBST = 20009, /* ParkingBrakeSetting */
|
|
CBC_SIG_ID_PBAT = 20010, /* ParkingBrakeAutomaticSetting */
|
|
CBC_SIG_ID_HFSS = 20011, /* HvacFanSpeedSetting */
|
|
CBC_SIG_ID_HFDST = 20012, /* HvacFanDirectionSetting */
|
|
CBC_SIG_ID_HVAST = 20013, /* HvacAcSetting */
|
|
CBC_SIG_ID_HAMS = 20014, /* HvacAcMaxSetting */
|
|
CBC_SIG_ID_HATST = 20015, /* HvacAutoSetting */
|
|
CBC_SIG_ID_HDEFST = 20016, /* HvacDefrostSetting */
|
|
CBC_SIG_ID_HDMXST = 20017, /* HvacDefrostMaxSetting */
|
|
CBC_SIG_ID_HDST = 20018, /* HvacDualSetting */
|
|
CBC_SIG_ID_HHSMS = 20019, /* HvacHeatingSideMirrorSetting */
|
|
CBC_SIG_ID_HHSWS = 20020, /* HvacHeatingSteeringWheelSetting */
|
|
CBC_SIG_ID_HPWST = 20021, /* HvacPowerSetting */
|
|
CBC_SIG_ID_HRCST = 20022, /* HvacRecirculationSetting */
|
|
CBC_SIG_ID_HTCST = 20023, /* HvacTemperatureCabinSetting */
|
|
CBC_SIG_ID_HTSST = 20024, /* HvacTemperatureSeatSetting */
|
|
CBC_SIG_ID_HTUST = 20025, /* HvacTemperatureUnitsSetting */
|
|
CBC_SIG_ID_HVSST = 20026, /* HvacVentilationSeatSetting */
|
|
CBC_SIG_ID_HRAST = 20027, /* HvacRecirculationAutomaticSetting */
|
|
CBC_SIG_ID_USBVBUS = 20028, /* SupportUsbOtgVbusControl */
|
|
CBC_SIG_ID_VICL = 651, /* VideoInCtrl */
|
|
};
|
|
|
|
/*
|
|
* CBC tx signal identity definition.
|
|
*/
|
|
enum cbc_tx_signal_id {
|
|
CBC_SIG_ID_MBV = 501, /* MainBatteryVoltage */
|
|
CBC_SIG_ID_TSA = 502, /* TemperatureSensorAmplifier */
|
|
CBC_SIG_ID_TSE = 503, /* TemperatureSensorEnvironment */
|
|
CBC_SIG_ID_VSWA = 701, /* VehicleSteeringWheelAngle */
|
|
CBC_SIG_ID_VSPD = 702, /* VehicleSpeed */
|
|
CBC_SIG_ID_VESP = 703, /* VehicleEngineSpeed */
|
|
CBC_SIG_ID_VECT = 704, /* VehicleEngineCoolantTemp */
|
|
CBC_SIG_ID_VRGR = 705, /* VehicleReverseGear */
|
|
CBC_SIG_ID_VPS = 706, /* VehiclePowerStatus */
|
|
CBC_SIG_ID_VPM = 707, /* VehiclePowerMode */
|
|
CBC_SIG_ID_VMD = 708, /* VehicleMode */
|
|
CBC_SIG_ID_VIS = 709, /* VehicleImmobilizerState */
|
|
CBC_SIG_ID_VGP = 710, /* VehicleGearshiftPosition */
|
|
CBC_SIG_ID_VAG = 711, /* VehicleActualGear */
|
|
CBC_SIG_ID_VFS = 712, /* VehicleFuelStatus */
|
|
CBC_SIG_ID_VFL = 713, /* VehicleFuelLevel */
|
|
CBC_SIG_ID_VDTE = 714, /* VehicleDistanceToEmpty */
|
|
CBC_SIG_ID_SWUB = 715, /* SteeringWheelUpBtn */
|
|
CBC_SIG_ID_SWRB = 716, /* SteeringWheelRightBtn */
|
|
CBC_SIG_ID_SWPB = 717, /* SteeringWheelPrevBtn */
|
|
CBC_SIG_ID_SWNB = 718, /* SteeringWheelNextBtn */
|
|
CBC_SIG_ID_SWLB = 719, /* SteeringWheelLeftBtn */
|
|
CBC_SIG_ID_SWDB = 720, /* SteeringWheelDownBtn */
|
|
CBC_SIG_ID_SWVA = 721, /* SteeringWheelVolumeAdjust */
|
|
CBC_SIG_ID_SWSCB = 722, /* SteeringWheelSpeechCtrlBtn */
|
|
CBC_SIG_ID_SWPLB = 723, /* SteeringWheelPlayBtn */
|
|
CBC_SIG_ID_SWPCB = 724, /* SteeringWheelPickupCallBtn */
|
|
CBC_SIG_ID_SWPSB = 725, /* SteeringWheelPauseBtn */
|
|
CBC_SIG_ID_SWHB = 726, /* SteeringWheelHomeBtn */
|
|
CBC_SIG_ID_SWEB = 727, /* SteeringWheelEnterBtn */
|
|
CBC_SIG_ID_SWECB = 728, /* SteeringWheelEndCallBtn */
|
|
CBC_SIG_ID_SWCB = 729, /* SteeringWheelConfigBtn */
|
|
CBC_SIG_ID_SWCLB = 730, /* SteeringWheelCancelBtn */
|
|
CBC_SIG_ID_SWAMB = 731, /* SteeringWheelAudioMuteBtn */
|
|
CBC_SIG_ID_RRSUB = 732, /* RightRearSeatUpBtn */
|
|
CBC_SIG_ID_RRSRB = 733, /* RightRearSeatRightBtn */
|
|
CBC_SIG_ID_RRSPB = 734, /* RightRearSeatPrevBtn */
|
|
CBC_SIG_ID_RRSP9B = 735, /* RightRearSeatPosition9Btn */
|
|
CBC_SIG_ID_RRSP8B = 736, /* RightRearSeatPosition8Btn */
|
|
CBC_SIG_ID_RRSP7B = 737, /* RightRearSeatPosition7Btn */
|
|
CBC_SIG_ID_RRSP6B = 738, /* RightRearSeatPosition6Btn */
|
|
CBC_SIG_ID_RRSP5B = 739, /* RightRearSeatPosition5Btn */
|
|
CBC_SIG_ID_RRSP4B = 740, /* RightRearSeatPosition4Btn */
|
|
CBC_SIG_ID_RRSP3B = 741, /* RightRearSeatPosition3Btn */
|
|
CBC_SIG_ID_RRSP2B = 742, /* RightRearSeatPosition2Btn */
|
|
CBC_SIG_ID_RRSP1B = 743, /* RightRearSeatPosition1Btn */
|
|
CBC_SIG_ID_RRSP0B = 744, /* RightRearSeatPosition0Btn */
|
|
CBC_SIG_ID_RRSNB = 745, /* RightRearSeatNextBtn */
|
|
CBC_SIG_ID_RRSLB = 746, /* RightRearSeatLeftBtn */
|
|
CBC_SIG_ID_RRSDB = 747, /* RightRearSeatDownBtn */
|
|
CBC_SIG_ID_RRSVA = 748, /* RightRearSeatVolumeAdjust */
|
|
CBC_SIG_ID_RSSSB = 749, /* RightRearSeatStopBtn */
|
|
CBC_SIG_ID_RRSSCB = 750, /* RightRearSeatSpeechCtrlBtn */
|
|
CBC_SIG_ID_RRSSB = 751, /* RightRearSeatSearchBtn */
|
|
CBC_SIG_ID_RRSRDB = 752, /* RightRearSeatRadioBtn */
|
|
CBC_SIG_ID_RRSPLB = 753, /* RightRearSeatPlayBtn */
|
|
CBC_SIG_ID_RRSPSB = 754, /* RightRearSeatPauseBtn */
|
|
CBC_SIG_ID_RRSOMB = 755, /* RightRearSeatOpticalMediaBtn */
|
|
CBC_SIG_ID_RRSHB = 756, /* RightRearSeatHomeBtn */
|
|
CBC_SIG_ID_RRSHDB = 757, /* RightRearSeatHarddiskBtn */
|
|
CBC_SIG_ID_RRSENB = 758, /* RightRearSeatEnterBtn */
|
|
CBC_SIG_ID_RRSEJB = 759, /* RightRearSeatEjectBtn */
|
|
CBC_SIG_ID_RRSCB = 760, /* RightRearSeatConfigBtn */
|
|
CBC_SIG_ID_RRSCLB = 761, /* RightRearSeatCancelBtn */
|
|
CBC_SIG_ID_RRSAMB = 762, /* RightRearSeatAudioMuteBtn */
|
|
CBC_SIG_ID_RVCS = 763, /* RearViewCameraStatus */
|
|
CBC_SIG_ID_PSS = 764, /* PdcSwitchStatus */
|
|
CBC_SIG_ID_PUB = 765, /* PassengerUpBtn */
|
|
CBC_SIG_ID_PRB = 766, /* PassengerRightBtn */
|
|
CBC_SIG_ID_PPB = 767, /* PassengerPrevBtn */
|
|
CBC_SIG_ID_PP9B = 768, /* PassengerPosition9Btn */
|
|
CBC_SIG_ID_PP8B = 769, /* PassengerPosition8Btn */
|
|
CBC_SIG_ID_PP7B = 770, /* PassengerPosition7Btn */
|
|
CBC_SIG_ID_PP6B = 771, /* PassengerPosition6Btn */
|
|
CBC_SIG_ID_PP5B = 772, /* PassengerPosition5Btn */
|
|
CBC_SIG_ID_PP4B = 773, /* PassengerPosition4Btn */
|
|
CBC_SIG_ID_PP3B = 774, /* PassengerPosition3Btn */
|
|
CBC_SIG_ID_PP2B = 775, /* PassengerPosition2Btn */
|
|
CBC_SIG_ID_PP1B = 776, /* PassengerPosition1Btn */
|
|
CBC_SIG_ID_PP0B = 777, /* PassengerPosition0Btn */
|
|
CBC_SIG_ID_PNB = 778, /* PassengerNextBtn */
|
|
CBC_SIG_ID_PLB = 779, /* PassengerLeftBtn */
|
|
CBC_SIG_ID_PDB = 780, /* PassengerDownBtn */
|
|
CBC_SIG_ID_PVA = 781, /* PassengerVolumeAdjust */
|
|
CBC_SIG_ID_PSB = 782, /* PassengerStopBtn */
|
|
CBC_SIG_ID_PSCB = 783, /* PassengerSpeechCtrlBtn */
|
|
CBC_SIG_ID_PSRB = 784, /* PassengerSearchBtn */
|
|
CBC_SIG_ID_PRDB = 785, /* PassengerRadioBtn */
|
|
CBC_SIG_ID_PPLB = 786, /* PassengerPlayBtn */
|
|
CBC_SIG_ID_PPSB = 787, /* PassengerPauseBtn */
|
|
CBC_SIG_ID_POMB = 788, /* PassengerOpticalMediaBtn */
|
|
CBC_SIG_ID_PHMB = 789, /* PassengerHomeBtn */
|
|
CBC_SIG_ID_PHDB = 790, /* PassengerHarddiskBtn */
|
|
CBC_SIG_ID_PENB = 791, /* PassengerEnterBtn */
|
|
CBC_SIG_ID_PEJB = 792, /* PassengerEjectBtn */
|
|
CBC_SIG_ID_PCFB = 793, /* PassengerConfigBtn */
|
|
CBC_SIG_ID_PCLB = 794, /* PassengerCancelBtn */
|
|
CBC_SIG_ID_PAMB = 795, /* PassengerAudioMuteBtn */
|
|
CBC_SIG_ID_LRSUB = 796, /* LeftRearSeatUpBtn */
|
|
CBC_SIG_ID_LRSRB = 797, /* LeftRearSeatRightBtn */
|
|
CBC_SIG_ID_LRSPB = 798, /* LeftRearSeatPrevBtn */
|
|
CBC_SIG_ID_LRSP9B = 799, /* LeftRearSeatPosition9Btn */
|
|
CBC_SIG_ID_LRSP8B = 800, /* LeftRearSeatPosition8Btn */
|
|
CBC_SIG_ID_LRSP7B = 801, /* LeftRearSeatPosition7Btn */
|
|
CBC_SIG_ID_LRSP6B = 802, /* LeftRearSeatPosition6Btn */
|
|
CBC_SIG_ID_LRSP5B = 803, /* LeftRearSeatPosition5Btn */
|
|
CBC_SIG_ID_LRSP4B = 804, /* LeftRearSeatPosition4Btn */
|
|
CBC_SIG_ID_LRSP3B = 805, /* LeftRearSeatPosition3Btn */
|
|
CBC_SIG_ID_LRSP2B = 806, /* LeftRearSeatPosition2Btn */
|
|
CBC_SIG_ID_LRSP1B = 807, /* LeftRearSeatPosition1Btn */
|
|
CBC_SIG_ID_LRSP0B = 808, /* LeftRearSeatPosition0Btn */
|
|
CBC_SIG_ID_LRSNB = 809, /* LeftRearSeatNextBtn */
|
|
CBC_SIG_ID_LRSLB = 810, /* LeftRearSeatLeftBtn */
|
|
CBC_SIG_ID_LRSDB = 811, /* LeftRearSeatDownBtn */
|
|
CBC_SIG_ID_LRSVA = 812, /* LeftRearSeatVolumeAdjust */
|
|
CBC_SIG_ID_LRSAMB = 813, /* LeftRearSeatAudioMuteBtn */
|
|
CBC_SIG_ID_LRSSB = 814, /* LeftRearSeatStopBtn */
|
|
CBC_SIG_ID_LRSSCB = 815, /* LeftRearSeatSpeechCtrlBtn */
|
|
CBC_SIG_ID_LRSSRB = 816, /* LeftRearSeatSearchBtn */
|
|
CBC_SIG_ID_LRSRDB = 817, /* LeftRearSeatRadioBtn */
|
|
CBC_SIG_ID_LRSPLB = 818, /* LeftRearSeatPlayBtn */
|
|
CBC_SIG_ID_LRSPSB = 819, /* LeftRearSeatPauseBtn */
|
|
CBC_SIG_ID_LRSOMB = 820, /* LeftRearSeatOpticalMediaBtn */
|
|
CBC_SIG_ID_LRSHMB = 821, /* LeftRearSeatHomeBtn */
|
|
CBC_SIG_ID_LRSHDB = 822, /* LeftRearSeatHarddiskBtn */
|
|
CBC_SIG_ID_LRSENB = 823, /* LeftRearSeatEnterBtn */
|
|
CBC_SIG_ID_LRSEJB = 824, /* LeftRearSeatEjectBtn */
|
|
CBC_SIG_ID_LRSCFB = 825, /* LeftRearSeatConfigBtn */
|
|
CBC_SIG_ID_LRSCLB = 826, /* LeftRearSeatCancelBtn */
|
|
CBC_SIG_ID_DVA = 827, /* DriverVolumeAdjust */
|
|
CBC_SIG_ID_DECSP = 828, /* DriverErgoCommanderSteps */
|
|
CBC_SIG_ID_DECST = 829, /* DriverErgoCommanderStatus */
|
|
CBC_SIG_ID_DAMB = 830, /* DriverAudioMuteBtn */
|
|
CBC_SIG_ID_DNB = 831, /* DriverNextBtn */
|
|
CBC_SIG_ID_DLB = 832, /* DriverLeftBtn */
|
|
CBC_SIG_ID_DDB = 833, /* DriverDownBtn */
|
|
CBC_SIG_ID_DUB = 834, /* DriverUpBtn */
|
|
CBC_SIG_ID_DRB = 835, /* DriverRightBtn */
|
|
CBC_SIG_ID_DPB = 836, /* DriverPrevBtn */
|
|
CBC_SIG_ID_DP9B = 837, /* DriverPosition9Btn */
|
|
CBC_SIG_ID_DP8B = 838, /* DriverPosition8Btn */
|
|
CBC_SIG_ID_DP7B = 839, /* DriverPosition7Btn */
|
|
CBC_SIG_ID_DP6B = 840, /* DriverPosition6Btn */
|
|
CBC_SIG_ID_DP5B = 841, /* DriverPosition5Btn */
|
|
CBC_SIG_ID_DP4B = 842, /* DriverPosition4Btn */
|
|
CBC_SIG_ID_DP3B = 843, /* DriverPosition3Btn */
|
|
CBC_SIG_ID_DP2B = 844, /* DriverPosition2Btn */
|
|
CBC_SIG_ID_DP1B = 845, /* DriverPosition1Btn */
|
|
CBC_SIG_ID_DP0B = 846, /* DriverPosition0Btn */
|
|
CBC_SIG_ID_DSCB = 847, /* DriverSpeechCtrlBtn */
|
|
CBC_SIG_ID_DSRB = 848, /* DriverSearchBtn */
|
|
CBC_SIG_ID_DRDB = 849, /* DriverRadioBtn */
|
|
CBC_SIG_ID_DSTB = 850, /* DriverStopBtn */
|
|
CBC_SIG_ID_DPLB = 851, /* DriverPlayBtn */
|
|
CBC_SIG_ID_DPSB = 852, /* DriverPauseBtn */
|
|
CBC_SIG_ID_DOMB = 853, /* DriverOpticalMediaBtn */
|
|
CBC_SIG_ID_DHMB = 854, /* DriverHomeBtn */
|
|
CBC_SIG_ID_DHHB = 855, /* DriverHarddiskBtn */
|
|
CBC_SIG_ID_DENB = 856, /* DriverEnterBtn */
|
|
CBC_SIG_ID_DEJB = 857, /* DriverEjectBtn */
|
|
CBC_SIG_ID_DCFB = 858, /* DriverConfigBtn */
|
|
CBC_SIG_ID_DCLB = 859, /* DriverCancelBtn */
|
|
CBC_SIG_ID_DSTG = 860, /* DoorStatusTailgate */
|
|
CBC_SIG_ID_DSRR = 861, /* DoorStatusRightRear */
|
|
CBC_SIG_ID_DSRF = 862, /* DoorStatusRightFront */
|
|
CBC_SIG_ID_DSLR = 863, /* DoorStatusLeftRear */
|
|
CBC_SIG_ID_DSLF = 864, /* DoorStatusLeftFront */
|
|
CBC_SIG_ID_DSEH = 865, /* DoorStatusEngineHood */
|
|
CBC_SIG_ID_CSSRRW = 866, /* ChildSafetyStatusRightRearWnd */
|
|
CBC_SIG_ID_CSSRR = 867, /* ChildSafetyStatusRightRear */
|
|
CBC_SIG_ID_CSSLRW = 868, /* ChildSafetyStatusLeftRearWnd */
|
|
CBC_SIG_ID_CSSLR = 869, /* ChildSafetyStatusLeftRear */
|
|
CBC_SIG_ID_ATEMP = 870, /* AmbientTemperature */
|
|
CBC_SIG_ID_ANSL = 871, /* AmbientNoiseLevel */
|
|
CBC_SIG_ID_ALTI = 872, /* AmbientLightIntensity */
|
|
CBC_SIG_ID_VSA = 873, /* VehicleSteeringAngle */
|
|
CBC_SIG_ID_LLAT = 875, /* LocationLatitude */
|
|
CBC_SIG_ID_LLON = 876, /* LocationLongitude */
|
|
CBC_SIG_ID_LALT = 877, /* LocationAltitude */
|
|
CBC_SIG_ID_LACC = 878, /* LocationAccuracy */
|
|
CBC_SIG_ID_LHED = 879, /* LocationHeading */
|
|
CBC_SIG_ID_LSPD = 880, /* LocationSpeed */
|
|
CBC_SIG_ID_LSRC = 881, /* LocationSource */
|
|
CBC_SIG_ID_LSCT = 882, /* LocationSourceCount */
|
|
CBC_SIG_ID_PDFB = 884, /* PdcDistanceFrontCenter */
|
|
CBC_SIG_ID_PDFL1 = 885, /* PdcDistanceFrontLeft1 */
|
|
CBC_SIG_ID_PDFL2 = 886, /* PdcDistanceFrontLeft2 */
|
|
CBC_SIG_ID_PDFL3 = 887, /* PdcDistanceFrontLeft3 */
|
|
CBC_SIG_ID_PDFR1 = 888, /* PdcDistanceFrontRight1 */
|
|
CBC_SIG_ID_PDFR2 = 889, /* PdcDistanceFrontRight2 */
|
|
CBC_SIG_ID_PDFR3 = 890, /* PdcDistanceFrontRight3 */
|
|
CBC_SIG_ID_PDRC = 892, /* PdcDistanceRearCenter */
|
|
CBC_SIG_ID_PDRL1 = 893, /* PdcDistanceRearLeft1 */
|
|
CBC_SIG_ID_PDRL2 = 894, /* PdcDistanceRearLeft2 */
|
|
CBC_SIG_ID_PDRL3 = 895, /* PdcDistanceRearLeft3 */
|
|
CBC_SIG_ID_PDRR1 = 896, /* PdcDistanceRearRight1 */
|
|
CBC_SIG_ID_PDRR2 = 897, /* PdcDistanceRearRight2 */
|
|
CBC_SIG_ID_PDRR3 = 898, /* PdcDistanceRearRight3 */
|
|
CBC_SIG_ID_VXA = 900, /* VehicleXAcceleration */
|
|
CBC_SIG_ID_VYA = 901, /* VehicleYAcceleration */
|
|
CBC_SIG_ID_VZA = 902, /* VehicleZAcceleration */
|
|
CBC_SIG_ID_IACR = 906, /* IocAppChecksumResponse */
|
|
CBC_SIG_ID_IWCR = 907, /* IocWfChecksumResponse */
|
|
CBC_SIG_ID_IFCR = 908, /* IocFblChecksumResponse */
|
|
CBC_SIG_ID_GYROX = 911, /* GyroX */
|
|
CBC_SIG_ID_GYROY = 912, /* GyroY */
|
|
CBC_SIG_ID_IAVB = 915, /* IocAppVersionBuild */
|
|
CBC_SIG_ID_IAVMJ = 916, /* IocAppVersionMajor */
|
|
CBC_SIG_ID_RAV = 919, /* RuntimeAverageValue */
|
|
CBC_SIG_ID_RMAX = 920, /* RuntimeMaxValue */
|
|
CBC_SIG_ID_RMIN = 921, /* RuntimeMinValue */
|
|
CBC_SIG_ID_ACCX = 924, /* AccX */
|
|
CBC_SIG_ID_ACCY = 925, /* AccY */
|
|
CBC_SIG_ID_ACCZ = 926, /* AccZ */
|
|
CBC_SIG_ID_MDS = 927, /* MrbDipSwitch */
|
|
CBC_SIG_ID_FCP = 928, /* FanCurrentRpm */
|
|
CBC_SIG_ID_GYROZ = 929, /* GyroZ */
|
|
CBC_SIG_ID_IAVMN = 930, /* IocAppVersionMinor */
|
|
CBC_SIG_ID_RTST = 931, /* RuntimeSamplesTaken */
|
|
CBC_SIG_ID_PKBK = 933, /* ParkingBrake */
|
|
CBC_SIG_ID_PKBKST = 934, /* ParkingBrakeSetting */
|
|
CBC_SIG_ID_PKBKAT = 935, /* ParkingBrakeAutomatic */
|
|
CBC_SIG_ID_PKBKAS = 936, /* ParkingBrakeAutomaticSetting */
|
|
CBC_SIG_ID_HFSPD = 937, /* HvacFanSpeed */
|
|
CBC_SIG_ID_HFSST = 938, /* HvacFanSpeedSetting */
|
|
CBC_SIG_ID_HFDIR = 939, /* HvacFanDirection */
|
|
CBC_SIG_ID_HFDSTT = 940, /* HvacFanDirectionSetting */
|
|
CBC_SIG_ID_HVACA = 941, /* HvacAc */
|
|
CBC_SIG_ID_HVASTT = 942, /* HvacAcSetting */
|
|
CBC_SIG_ID_HAMAX = 943, /* HvacAcMax */
|
|
CBC_SIG_ID_HVMST = 944, /* HvacAcMaxSetting */
|
|
CBC_SIG_ID_HAUTO = 945, /* HvacAuto */
|
|
CBC_SIG_ID_HATSTT = 946, /* HvacAutoSetting */
|
|
CBC_SIG_ID_HVDEF = 947, /* HvacDefrost */
|
|
CBC_SIG_ID_HDEFSTT = 948, /* HvacDefrostSetting */
|
|
CBC_SIG_ID_HDFMAX = 949, /* HvacDefrostMax */
|
|
CBC_SIG_ID_HDMXSTT = 950, /* HvacDefrostMaxSetting */
|
|
CBC_SIG_ID_HDUAL = 951, /* HvacDual */
|
|
CBC_SIG_ID_HDSTT = 952, /* HvacDualSetting */
|
|
CBC_SIG_ID_HHSMR = 953, /* HvacHeatingSideMirror */
|
|
CBC_SIG_ID_HHSMST = 954, /* HvacHeatingSideMirrorSetting */
|
|
CBC_SIG_ID_HHSWL = 955, /* HvacHeatingSteeringWheel */
|
|
CBC_SIG_ID_HHSWST = 956, /* HvacHeatingSteeringWheelSetting */
|
|
CBC_SIG_ID_HPOWR = 957, /* HvacPower */
|
|
CBC_SIG_ID_HPWSTT = 958, /* HvacPowerSetting */
|
|
CBC_SIG_ID_HRECC = 959, /* HvacRecirculation */
|
|
CBC_SIG_ID_HRECST = 960, /* HvacRecirculationSetting */
|
|
CBC_SIG_ID_HTEMCB = 961, /* HvacTemperatureCabin */
|
|
CBC_SIG_ID_HTCSTT = 962, /* HvacTemperatureCabinSetting */
|
|
CBC_SIG_ID_HTMPST = 963, /* HvacTemperatureSeat */
|
|
CBC_SIG_ID_HTSSTT = 964, /* HvacTemperatureSeatSetting */
|
|
CBC_SIG_ID_HTMPU = 965, /* HvacTemperatureUnits */
|
|
CBC_SIG_ID_HTUSTT = 966, /* HvacTemperatureUnitsSetting */
|
|
CBC_SIG_ID_HVTST = 967, /* HvacVentilationSeat */
|
|
CBC_SIG_ID_HVSSTT = 968, /* HvacVentilationSeatSetting */
|
|
CBC_SIG_ID_HRCAT = 969, /* HvacRecirculationAutomatic */
|
|
CBC_SIG_ID_HRASTT = 970, /* HvacRecirculationAutomaticSetting */
|
|
};
|
|
|
|
/*
|
|
* CBC rx group identity definition.
|
|
*/
|
|
enum cbc_rx_group_id {
|
|
CBC_GRP_ID_0 = 0,
|
|
};
|
|
|
|
/*
|
|
* CBC tx group identity definition.
|
|
*/
|
|
enum cbc_tx_group_id {
|
|
CBC_GRP_ID_LOC = 874, /* Location */
|
|
CBC_GRP_ID_PDF = 883, /* PdcDistanceFront */
|
|
CBC_GRP_ID_PDR = 891, /* PdcDistanceRear */
|
|
CBC_GRP_ID_VAC = 899, /* VehicleAcceleration */
|
|
CBC_GRP_ID_GAS = 909, /* GyroAbs */
|
|
CBC_GRP_ID_IVR = 913, /* IocVersionResponse */
|
|
CBC_GRP_ID_IRM = 917, /* IocRuntimeMeasurementResultsResponse */
|
|
CBC_GRP_ID_GAC = 922, /* GyroAcc */
|
|
};
|
|
|
|
/*
|
|
* IOC channels definition.
|
|
* Include all native CBC channels and one virtual UART
|
|
*/
|
|
enum ioc_ch_id {
|
|
IOC_NATIVE_PMT, /* Native /dev/cbc-pmt */
|
|
IOC_NATIVE_LFCC, /* Native /dev/cbc-lifecycle */
|
|
IOC_NATIVE_SIGNAL, /* Native /dev/cbc-signals */
|
|
IOC_NATIVE_ESIG, /* Native /dev/cbc-early-signals */
|
|
IOC_NATIVE_DIAG, /* Native /dev/cbc-diagnosis */
|
|
IOC_NATIVE_DLT, /* Native /dev/cbc_dlt */
|
|
IOC_NATIVE_LINDA, /* Native /dev/cbc-lindata */
|
|
IOC_NATIVE_RAW0, /* Native /dev/cbc-raw0 */
|
|
IOC_NATIVE_RAW1, /* Native /dev/cbc-raw1 */
|
|
IOC_NATIVE_RAW2, /* Native /dev/cbc-raw2 */
|
|
IOC_NATIVE_RAW3, /* Native /dev/cbc-raw3 */
|
|
IOC_NATIVE_RAW4, /* Native /dev/cbc-raw4 */
|
|
IOC_NATIVE_RAW5, /* Native /dev/cbc-raw5 */
|
|
IOC_NATIVE_RAW6, /* Native /dev/cbc-raw6 */
|
|
IOC_NATIVE_RAW7, /* Native /dev/cbc-raw7 */
|
|
IOC_NATIVE_RAW8, /* Native /dev/cbc-raw8 */
|
|
IOC_NATIVE_RAW9, /* Native /dev/cbc-raw9 */
|
|
IOC_NATIVE_RAW10, /* Native /dev/cbc-raw10 */
|
|
IOC_NATIVE_RAW11, /* Native /dev/cbc-raw11 */
|
|
IOC_VIRTUAL_UART, /* Virtual UART */
|
|
IOC_LOCAL_EVENT, /* Local channel for IOC event */
|
|
IOC_NATIVE_DUMMY0, /* Native fake lifecycle channel */
|
|
IOC_NATIVE_DUMMY1, /* Native fake signal channel */
|
|
IOC_NATIVE_DUMMY2, /* Native Fake oem raw channel */
|
|
IOC_CH_MAX
|
|
};
|
|
|
|
/*
|
|
* CBC priority is used to pack CBC address layer header.
|
|
*/
|
|
enum cbc_prio {
|
|
CBC_PRIO_LOW = 2,
|
|
CBC_PRIO_MEDIUM = 3,
|
|
CBC_PRIO_HIGH = 6
|
|
};
|
|
|
|
/*
|
|
* CBC invalidation types.
|
|
*/
|
|
enum cbc_inval_type {
|
|
CBC_INVAL_T_SIGNAL,
|
|
CBC_INVAL_T_GROUP
|
|
};
|
|
|
|
/*
|
|
* CBC signal and group state flag.
|
|
*/
|
|
enum cbc_flag {
|
|
CBC_INACTIVE,
|
|
CBC_ACTIVE
|
|
};
|
|
|
|
/*
|
|
* CBC queue types.
|
|
* Rx queue buffers cbc_requests for virtual UART -> native CBC channels.
|
|
* Tx queue buffers cbc_requests for antive CBC cdevs -> virtual UART.
|
|
* Free queue buffers the cbc_requests that are not in rx/tx queues for new data
|
|
* comming.
|
|
*/
|
|
enum cbc_queue_type {
|
|
CBC_QUEUE_T_RX,
|
|
CBC_QUEUE_T_TX,
|
|
CBC_QUEUE_T_FREE
|
|
};
|
|
|
|
/*
|
|
* CBC request types.
|
|
*/
|
|
enum cbc_request_type {
|
|
CBC_REQ_T_PROT, /* CBC protocol request */
|
|
CBC_REQ_T_SUSPEND, /* CBC suspend request */
|
|
CBC_REQ_T_SHUTDOWN, /* CBC shutdown request */
|
|
CBC_REQ_T_HB_INIT, /* CBC Heartbeat init request */
|
|
CBC_REQ_T_UOS_ACTIVE, /* CBC UOS active request */
|
|
CBC_REQ_T_UOS_INACTIVE /* CBC UOS inactive request */
|
|
};
|
|
|
|
/*
|
|
* Open the channel and add it into IOC epoll event data if the channel state
|
|
* is ON, otherwise ignore it.
|
|
*/
|
|
enum ioc_ch_stat {
|
|
IOC_CH_OFF,
|
|
IOC_CH_ON
|
|
};
|
|
|
|
struct cbc_signal {
|
|
uint16_t id; /* CBC signal id number */
|
|
uint16_t len; /* CBC signal length in bits not bytes */
|
|
enum cbc_flag flag; /* CBC signal active/inactive flag */
|
|
};
|
|
|
|
struct cbc_group {
|
|
uint16_t id; /* CBC group id number */
|
|
enum cbc_flag flag; /* CBC group active/inactive flag */
|
|
};
|
|
|
|
struct wlist_signal {
|
|
uint16_t id;
|
|
struct cbc_signal *sig;
|
|
};
|
|
|
|
struct wlist_group {
|
|
uint16_t id;
|
|
struct cbc_group *grp;
|
|
};
|
|
|
|
/*
|
|
* CBC ring is used to buffer bytes before build one complete CBC frame.
|
|
*/
|
|
struct cbc_ring {
|
|
uint32_t head;
|
|
uint32_t tail;
|
|
uint8_t buf[CBC_RING_BUFFER_SIZE];
|
|
};
|
|
|
|
/*
|
|
* CBC configuration contains signal/group tables and whiltlist tables.
|
|
*/
|
|
struct cbc_config {
|
|
int32_t cbc_sig_num; /* CBC signals number */
|
|
int32_t cbc_grp_num; /* CBC groups number */
|
|
int32_t wlist_sig_num; /* Whitelist signals number */
|
|
int32_t wlist_grp_num; /* Whitelist groups number */
|
|
struct cbc_signal *cbc_sig_tbl; /* CBC signals table */
|
|
struct cbc_group *cbc_grp_tbl; /* CBC groups table */
|
|
struct wlist_signal *wlist_sig_tbl; /* Whitelist signals table */
|
|
struct wlist_group *wlist_grp_tbl; /* Whitelist groups table */
|
|
};
|
|
|
|
/*
|
|
* IOC channel information.
|
|
*/
|
|
struct ioc_ch_info {
|
|
int32_t fd; /* IOC channel fd */
|
|
char name[32]; /* IOC channel name */
|
|
enum ioc_ch_id id; /* IOC channel identity number */
|
|
enum ioc_ch_stat stat; /* IOC channel state */
|
|
};
|
|
|
|
/*
|
|
* CBC request is mainly structure of communication between threads.
|
|
*/
|
|
struct cbc_request {
|
|
int32_t srv_len; /* Service frame length */
|
|
int32_t link_len; /* Link frame length */
|
|
enum ioc_ch_id id; /* Channel id number */
|
|
enum cbc_request_type rtype; /* Request types */
|
|
uint8_t buf[CBC_MAX_FRAME_SIZE];
|
|
|
|
SIMPLEQ_ENTRY(cbc_request) me_queue;
|
|
};
|
|
|
|
/*
|
|
* IOC state types.
|
|
*/
|
|
enum ioc_state_type {
|
|
IOC_S_INIT,
|
|
IOC_S_ACTIVE,
|
|
IOC_S_SUSPENDING,
|
|
IOC_S_SUSPENDED
|
|
};
|
|
|
|
/*
|
|
* IOC event types.
|
|
*/
|
|
enum ioc_event_type {
|
|
IOC_E_INVALID,
|
|
IOC_E_HB_ACTIVE,
|
|
IOC_E_RAM_REFRESH,
|
|
IOC_E_HB_INACTIVE,
|
|
IOC_E_SHUTDOWN,
|
|
IOC_E_RESUME,
|
|
IOC_E_KNOCK,
|
|
};
|
|
|
|
/*
|
|
* VM request types.
|
|
*/
|
|
enum vm_request_type {
|
|
VM_REQ_NONE,
|
|
VM_REQ_STOP,
|
|
VM_REQ_SUSPEND,
|
|
VM_REQ_RESUME
|
|
};
|
|
|
|
/*
|
|
* CBC packet is mainly structure for CBC protocol process.
|
|
*/
|
|
struct cbc_pkt {
|
|
bool uos_active; /* Mark UOS active status */
|
|
uint32_t reason; /* Record current wakeup reason */
|
|
struct cbc_request *req; /* CBC packet data */
|
|
struct cbc_config *cfg; /* CBC and whitelist configurations */
|
|
enum cbc_queue_type qtype; /* Routes cbc_request to queue */
|
|
enum ioc_event_type evt; /* Record last event */
|
|
struct ioc_dev *ioc; /* IOC device */
|
|
};
|
|
|
|
/*
|
|
* CBC simple queue head definition.
|
|
*/
|
|
SIMPLEQ_HEAD(cbc_qhead, cbc_request);
|
|
|
|
/*
|
|
* IOC device structure.
|
|
* IOC device is a virtual device and DM has virtual device data structure
|
|
* for virtual devices management in the further.
|
|
* So export the ioc_dev definition to the IOC header file.
|
|
*/
|
|
struct ioc_dev {
|
|
char name[16]; /* Core thread name */
|
|
bool cbc_enable; /* Tx and Rx protocol enable flag */
|
|
int closing; /* Close IOC mediator device flag */
|
|
int epfd; /* Epoll fd */
|
|
int32_t evt_fd; /* Pipe write fd to trigger one event */
|
|
uint32_t boot_reason; /* Boot or resume wakeup reason */
|
|
enum vm_request_type vm_req; /* Request from VM Manager (acrnctl) */
|
|
enum ioc_state_type state; /* IOC state type */
|
|
struct epoll_event *evts; /* Epoll events table */
|
|
struct cbc_request *pool; /* CBC requests pool */
|
|
struct cbc_ring ring; /* Ring buffer */
|
|
pthread_t tid; /* Core thread id */
|
|
struct cbc_qhead free_qhead; /* Free queue head */
|
|
pthread_mutex_t free_mtx; /* Free queue mutex */
|
|
|
|
char rx_name[16]; /* Rx thread name */
|
|
struct cbc_qhead rx_qhead; /* Rx queue head */
|
|
struct cbc_config rx_config; /* Rx configuration */
|
|
pthread_t rx_tid;
|
|
pthread_cond_t rx_cond;
|
|
pthread_mutex_t rx_mtx;
|
|
void (*ioc_dev_rx)(struct cbc_pkt *pkt);
|
|
|
|
char tx_name[16]; /* Tx thread name */
|
|
struct cbc_qhead tx_qhead; /* Tx queue head */
|
|
struct cbc_config tx_config; /* Tx configuration */
|
|
pthread_t tx_tid;
|
|
pthread_cond_t tx_cond;
|
|
pthread_mutex_t tx_mtx;
|
|
void (*ioc_dev_tx)(struct cbc_pkt *pkt);
|
|
};
|
|
|
|
/*
|
|
* IOC state information.
|
|
*/
|
|
struct ioc_state_info {
|
|
enum ioc_state_type cur_stat;
|
|
enum ioc_state_type next_stat;
|
|
enum ioc_event_type evt;
|
|
int32_t (*handler)(struct ioc_dev *ioc);
|
|
};
|
|
|
|
/* Parse IOC parameters */
|
|
int ioc_parse(const char *opts);
|
|
|
|
struct vmctx;
|
|
|
|
/* IOC mediator common ops */
|
|
int ioc_init(struct vmctx *ctx);
|
|
void ioc_deinit(struct vmctx *ctx);
|
|
|
|
/* Build a cbc_request and send it to CBC protocol stack */
|
|
void ioc_build_request(struct ioc_dev *ioc, int32_t link_len, int32_t srv_len);
|
|
|
|
/* Send data to native CBC cdevs and virtual PTY(UART DM) device */
|
|
int ioc_ch_xmit(enum ioc_ch_id id, const uint8_t *buf, size_t size);
|
|
|
|
/* Main handlers of CBC protocol stack */
|
|
void cbc_rx_handler(struct cbc_pkt *pkt);
|
|
void cbc_tx_handler(struct cbc_pkt *pkt);
|
|
|
|
/* Copy to buf to the ring buffer */
|
|
int cbc_copy_to_ring(const uint8_t *buf, size_t size, struct cbc_ring *ring);
|
|
|
|
/* Build a cbc_request based on CBC link layer protocol */
|
|
void cbc_unpack_link(struct ioc_dev *ioc);
|
|
|
|
/* Whitelist initialization */
|
|
void wlist_init_signal(struct cbc_signal *cbc_tbl, size_t cbc_size,
|
|
struct wlist_signal *wlist_tbl, size_t wlist_size);
|
|
void wlist_init_group(struct cbc_group *cbc_tbl, size_t cbc_size,
|
|
struct wlist_group *wlist_tbl, size_t wlist_size);
|
|
|
|
/* Set CBC log file */
|
|
void cbc_set_log_file(FILE *f);
|
|
|
|
/* Update IOC state by the event */
|
|
void ioc_update_event(int fd, enum ioc_event_type evt);
|
|
#endif
|