1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * j1939.h 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2010-2011 EIA Electronics 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify 8*4882a593Smuzhiyun * it under the terms of the GNU General Public License version 2 as 9*4882a593Smuzhiyun * published by the Free Software Foundation. 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #ifndef _UAPI_CAN_J1939_H_ 13*4882a593Smuzhiyun #define _UAPI_CAN_J1939_H_ 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #include <linux/types.h> 16*4882a593Smuzhiyun #include <linux/socket.h> 17*4882a593Smuzhiyun #include <linux/can.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #define J1939_MAX_UNICAST_ADDR 0xfd 20*4882a593Smuzhiyun #define J1939_IDLE_ADDR 0xfe 21*4882a593Smuzhiyun #define J1939_NO_ADDR 0xff /* == broadcast or no addr */ 22*4882a593Smuzhiyun #define J1939_NO_NAME 0 23*4882a593Smuzhiyun #define J1939_PGN_REQUEST 0x0ea00 /* Request PG */ 24*4882a593Smuzhiyun #define J1939_PGN_ADDRESS_CLAIMED 0x0ee00 /* Address Claimed */ 25*4882a593Smuzhiyun #define J1939_PGN_ADDRESS_COMMANDED 0x0fed8 /* Commanded Address */ 26*4882a593Smuzhiyun #define J1939_PGN_PDU1_MAX 0x3ff00 27*4882a593Smuzhiyun #define J1939_PGN_MAX 0x3ffff 28*4882a593Smuzhiyun #define J1939_NO_PGN 0x40000 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* J1939 Parameter Group Number 31*4882a593Smuzhiyun * 32*4882a593Smuzhiyun * bit 0-7 : PDU Specific (PS) 33*4882a593Smuzhiyun * bit 8-15 : PDU Format (PF) 34*4882a593Smuzhiyun * bit 16 : Data Page (DP) 35*4882a593Smuzhiyun * bit 17 : Reserved (R) 36*4882a593Smuzhiyun * bit 19-31 : set to zero 37*4882a593Smuzhiyun */ 38*4882a593Smuzhiyun typedef __u32 pgn_t; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /* J1939 Priority 41*4882a593Smuzhiyun * 42*4882a593Smuzhiyun * bit 0-2 : Priority (P) 43*4882a593Smuzhiyun * bit 3-7 : set to zero 44*4882a593Smuzhiyun */ 45*4882a593Smuzhiyun typedef __u8 priority_t; 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun /* J1939 NAME 48*4882a593Smuzhiyun * 49*4882a593Smuzhiyun * bit 0-20 : Identity Number 50*4882a593Smuzhiyun * bit 21-31 : Manufacturer Code 51*4882a593Smuzhiyun * bit 32-34 : ECU Instance 52*4882a593Smuzhiyun * bit 35-39 : Function Instance 53*4882a593Smuzhiyun * bit 40-47 : Function 54*4882a593Smuzhiyun * bit 48 : Reserved 55*4882a593Smuzhiyun * bit 49-55 : Vehicle System 56*4882a593Smuzhiyun * bit 56-59 : Vehicle System Instance 57*4882a593Smuzhiyun * bit 60-62 : Industry Group 58*4882a593Smuzhiyun * bit 63 : Arbitrary Address Capable 59*4882a593Smuzhiyun */ 60*4882a593Smuzhiyun typedef __u64 name_t; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun /* J1939 socket options */ 63*4882a593Smuzhiyun #define SOL_CAN_J1939 (SOL_CAN_BASE + CAN_J1939) 64*4882a593Smuzhiyun enum { 65*4882a593Smuzhiyun SO_J1939_FILTER = 1, /* set filters */ 66*4882a593Smuzhiyun SO_J1939_PROMISC = 2, /* set/clr promiscuous mode */ 67*4882a593Smuzhiyun SO_J1939_SEND_PRIO = 3, 68*4882a593Smuzhiyun SO_J1939_ERRQUEUE = 4, 69*4882a593Smuzhiyun }; 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun enum { 72*4882a593Smuzhiyun SCM_J1939_DEST_ADDR = 1, 73*4882a593Smuzhiyun SCM_J1939_DEST_NAME = 2, 74*4882a593Smuzhiyun SCM_J1939_PRIO = 3, 75*4882a593Smuzhiyun SCM_J1939_ERRQUEUE = 4, 76*4882a593Smuzhiyun }; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun enum { 79*4882a593Smuzhiyun J1939_NLA_PAD, 80*4882a593Smuzhiyun J1939_NLA_BYTES_ACKED, 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun enum { 84*4882a593Smuzhiyun J1939_EE_INFO_NONE, 85*4882a593Smuzhiyun J1939_EE_INFO_TX_ABORT, 86*4882a593Smuzhiyun }; 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun struct j1939_filter { 89*4882a593Smuzhiyun name_t name; 90*4882a593Smuzhiyun name_t name_mask; 91*4882a593Smuzhiyun pgn_t pgn; 92*4882a593Smuzhiyun pgn_t pgn_mask; 93*4882a593Smuzhiyun __u8 addr; 94*4882a593Smuzhiyun __u8 addr_mask; 95*4882a593Smuzhiyun }; 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun #define J1939_FILTER_MAX 512 /* maximum number of j1939_filter set via setsockopt() */ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun #endif /* !_UAPI_CAN_J1939_H_ */ 100