xref: /OK3568_Linux_fs/kernel/include/uapi/linux/can/j1939.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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