Compare commits

..

No commits in common. "master" and "v2.0.1" have entirely different histories.

5 changed files with 129 additions and 807 deletions

4
.gitignore vendored
View File

@ -98,7 +98,3 @@ extra_certificates
signing_key.priv
signing_key.x509
x509.genkey
.vscode
compile_commands.json
intrepid.mod

View File

@ -1,67 +0,0 @@
v3.1.2
Update kernel logging for dropped messages to pr_debug
Added instructions for debug message in README
v3.1.1
Update copyright
Fix Ethernet interfaces
v3.0.4
Update copyright
Add Fedora package requirements to README
Fix for newer 6.4.x Kernel, class_create() sig changed (Doug Potts <dpotts@genrad.com>)
v3.0.3
Update daemon version requirement to 3.1.*
v3.0.2
Bump maximum device count to 64
v3.0.1
Update copyright
v3.0.0
Added Functionality for Ethernet
v2.1.1
Fix support for kernels <5.12
Tested on 5.4.0
v2.1.0
Implement proper functionality for echoing transmits
Transmit errors are now reported properly
Transmit byte count is now reported properly
Use with icsscand >= v2.1.0 for full echo support
v2.0.5
Add support for kernels 5.9+
Tested on 5.11.0-rc5
CAN frames with length > 8 from userspace are rejected rather than truncated
v2.0.4
Ensure carrier is up on new kernels which require it
v2.0.3
Add support for kernels 5.1+
Tested on 5.3.0 (Ubuntu 19.10)
v2.0.2
Add support for older kernels
Tested working properly back to 4.4
Disabled aliasing for kernels <4.15
Required, as these kernels do not have netdevice aliasing
Use the correct format specifier for (s)size_t
Resolves a compile-time warning on 32-bit
Check the return type of copy_from_user
Resolves a compile-time warning on ARM
Standardize kernel version checking
Requires icsscand >= v2.0.1
icsscand v2.0.0 will not work with older kernels, and would display an obscure error
v2.0.1
Resolve runtime warning message on changing MTU
Reviewed our locking behavior, made tweaks where necessary
v2.0.0
Full rewrite
Initial release with CAN-FD support
Requires icsscand >= v2.0.0

View File

@ -1,10 +1,10 @@
Version 3.1.2
Version 2.0.1
This is the kernel object portion of the Intrepid Control Systems SocketCAN support. For SocketCAN to work with Intrepid devices you will need to have this kernel object loaded on your system. Once the module is built and loaded run [icsscand](https://github.com/intrepidcs/icsscand) to turn on SocketCAN support.
First, install the necessary dependencies for building kernel modules:
- Ubuntu: `sudo apt install linux-headers-generic build-essential gcc git`
- Fedora: `sudo dnf install git kernel-devel-matched`
First, install the necessary dependencies for building kernel modules.
On Ubuntu, this is acomplished by running `sudo apt install linux-headers-generic build-essential gcc git`
Clone this repository by running `git clone https://github.com/intrepidcs/intrepid-socketcan-kernel-module.git`
@ -45,50 +45,3 @@ can_raw
can_dev
intrepid
```
## Dynamic Debug Support
The module includes debug messages that can be enabled at runtime using the kernel's dynamic debug framework. This requires your kernel to be built with `CONFIG_DYNAMIC_DEBUG=y` (most modern distributions include this).
### Enabling Debug Messages
After building and loading the module with the standard `make` and `make install`, you can enable debug output:
**Enable all debug messages for the intrepid module:**
```bash
$ echo "module intrepid +p" | sudo tee /sys/kernel/debug/dynamic_debug/control
```
**Disable debug messages:**
```bash
$ echo "module intrepid -p" | sudo tee /sys/kernel/debug/dynamic_debug/control
```
**Enable debug messages for specific functions:**
```bash
$ echo "file intrepid.c func function_name +p" | sudo tee /sys/kernel/debug/dynamic_debug/control
```
**View current debug settings:**
```bash
$ sudo cat /sys/kernel/debug/dynamic_debug/control | grep intrepid
```
**View debug output:**
```bash
$ sudo dmesg | grep intrepid
$ sudo dmesg -w # Follow live output
```
### Available Debug Messages
The debug messages provide information about:
- CAN bittiming configuration
- Frame validation and processing
- Message dropping conditions
- Error handling
Debug messages are primarily triggered during:
- CAN interface configuration
- Frame transmission/reception
- Error conditions and message drops

File diff suppressed because it is too large Load Diff

View File

@ -16,12 +16,12 @@ typedef union {
uint32_t extendedFrame : 1;
uint32_t remoteFrame : 1;
uint32_t crcError : 1;
uint32_t canErrorPassive : 1; // Occupies the same space as headerCRCError
uint32_t canErrorPassive : 1;
uint32_t incompleteFrame : 1;
uint32_t lostArbitration : 1;
uint32_t undefinedError : 1;
uint32_t canBusOff : 1;
uint32_t canBusRecovered : 1;
uint32_t canErrorWarning : 1;
uint32_t canBusShortedPlus : 1;
uint32_t canBusShortedGround : 1;
uint32_t checksumError : 1;
@ -98,10 +98,6 @@ typedef union {
#pragma warning(pop)
#endif
typedef uint16_t neonetid_t;
typedef uint8_t neonettype_t;
typedef uint16_t neomessagetype_t;
#define ICSNEO_NETWORK_TYPE_INVALID ((uint8_t)0)
#define ICSNEO_NETWORK_TYPE_INTERNAL ((uint8_t)1) // Used for statuses that don't actually need to be transferred to the client application
#define ICSNEO_NETWORK_TYPE_CAN ((uint8_t)2)
@ -113,73 +109,42 @@ typedef uint16_t neomessagetype_t;
#define ICSNEO_NETWORK_TYPE_OTHER ((uint8_t)0xFF)
typedef struct {
uint8_t _reserved1[16];
neomessage_statusbitfield_t status;
uint64_t timestamp;
uint64_t _reservedTimestamp;
uint8_t _reserved2[sizeof(size_t) * 2 + 7 + sizeof(neonetid_t) + sizeof(neonettype_t)];
neomessagetype_t messageType;
uint8_t _reserved3[12];
uint64_t timestampReserved;
const uint8_t* data;
size_t length;
uint8_t header[4];
uint16_t netid;
uint8_t type;
uint8_t reserved[17];
} neomessage_t; // 72 bytes total
// Any time you add another neomessage_*_t type, make sure to add it to the static_asserts below!
typedef struct {
neomessage_statusbitfield_t status;
uint64_t timestamp;
uint64_t _reservedTimestamp;
const uint8_t* data;
size_t length;
uint8_t header[4];
neonetid_t netid;
neonettype_t type;
uint8_t _reserved0;
uint16_t description;
neomessagetype_t messageType;
uint8_t _reserved1[12];
} neomessage_frame_t;
typedef struct {
neomessage_statusbitfield_t status;
uint64_t timestamp;
uint64_t _reservedTimestamp;
uint64_t timestampReserved;
const uint8_t* data;
size_t length;
uint32_t arbid;
neonetid_t netid;
neonettype_t type;
uint16_t netid;
uint8_t type;
uint8_t dlcOnWire;
uint16_t description;
neomessagetype_t messageType;
uint8_t _reserved1[12];
uint8_t reserved[16];
} neomessage_can_t;
typedef struct {
neomessage_statusbitfield_t status;
uint64_t timestamp;
uint64_t _reservedTimestamp;
size_t _reserved2[2];
uint8_t transmitErrorCount;
uint8_t receiveErrorCount;
uint8_t _reserved3[5];
neonetid_t netid;
neonettype_t type;
neomessagetype_t messageType;
uint8_t _reserved4[12];
} neomessage_can_error_t;
typedef struct {
neomessage_statusbitfield_t status;
uint64_t timestamp;
uint64_t _reservedTimestamp;
uint64_t timestampReserved;
const uint8_t* data;
size_t length;
uint8_t preemptionFlags;
uint8_t _reservedHeader[3];
neonetid_t netid;
neonettype_t type;
uint8_t _reserved0;
uint16_t description;
neomessagetype_t messageType;
uint8_t _reserved1[12];
uint8_t reservedHeader[3];
uint16_t netid;
uint8_t type;
uint8_t reserved[17];
} neomessage_eth_t;
#pragma pack(pop)