Skip to content

Instantly share code, notes, and snippets.

@Lauszus
Last active February 16, 2024 11:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Lauszus/8075920c0b64e06eb2a70751b56bb758 to your computer and use it in GitHub Desktop.
Save Lauszus/8075920c0b64e06eb2a70751b56bb758 to your computer and use it in GitHub Desktop.
Raspberry Pi device tree overlay for creating up to four CAN-Bus interfaces on spi0 using four MCP2515's
/*
* Device tree overlay for mcp251x on any spi interface by Kristian Sloth Lauszus.
* Should be used with the "spi0-4cs" overlay.
*/
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835";
/* disable spi-dev for spi0.0 if used */
fragment@0 {
target = <&spidev0>;
__dormant__ {
status = "disabled";
};
};
/* disable spi-dev for spi0.1 if used */
fragment@1 {
target = <&spidev1>;
__dormant__ {
status = "disabled";
};
};
/* disable spi-dev for spi0.2 if used */
fragment@2 {
target-path = "spi0/spidev@2";
__dormant__ {
status = "disabled";
};
};
/* disable spi-dev for spi0.3 if used */
fragment@3 {
target-path = "spi0/spidev@3";
__dormant__ {
status = "disabled";
};
};
/* the interrupt pin of the can-controller */
fragment@4 {
target = <&gpio>;
__overlay__ {
mcp2515_pins: mcp2515_pins {
brcm,pins = <25>;
brcm,function = <0>; /* input */
};
};
};
/* the clock/oscillator of the can-controller */
fragment@5 {
target-path = "/";
__overlay__ {
/* external oscillator of mcp2515 on spi0 */
clk_mcp2515_osc: clk_mcp2515_osc {
compatible = "fixed-clock";
#clock-cells = <0>;
clock-frequency = <16000000>;
};
};
};
/* the spi config of the can-controller itself binding everything together */
fragment@6 {
target = <&spi0>;
__overlay__ {
/* needed to avoid dtc warning */
#address-cells = <1>;
#size-cells = <0>;
mcp2515: mcp2515@0 {
reg = <0>;
compatible = "microchip,mcp2515";
pinctrl-names = "default";
pinctrl-0 = <&mcp2515_pins>;
spi-max-frequency = <10000000>;
interrupt-parent = <&gpio>;
interrupts = <25 8>; /* IRQ_TYPE_LEVEL_LOW */
clocks = <&clk_mcp2515_osc>;
};
};
};
__overrides__ {
spi0-0 = <0>,"+0", /* enable fragment@0 */
<&mcp2515>,"reg:0=0",
<&mcp2515_pins>,"name=mcp2515_spi0_0_pins",
<&clk_mcp2515_osc>,"name=mcp2515-spi0-0-osc";
spi0-1 = <0>,"+1", /* enable fragment@1 */
<&mcp2515>,"reg:0=1",
<&mcp2515_pins>,"name=mcp2515_spi0_1_pins",
<&clk_mcp2515_osc>,"name=mcp2515-spi0-1-osc";
spi0-2 = <0>,"+2", /* enable fragment@2 */
<&mcp2515>,"reg:0=2",
<&mcp2515_pins>,"name=mcp2515_spi0_2_pins",
<&clk_mcp2515_osc>,"name=mcp2515-spi0-2-osc";
spi0-3 = <0>,"+3", /* enable fragment@3 */
<&mcp2515>,"reg:0=3",
<&mcp2515_pins>,"name=mcp2515_spi0_3_pins",
<&clk_mcp2515_osc>,"name=mcp2515-spi0-3-osc";
oscillator = <&clk_mcp2515_osc>,"clock-frequency:0";
spimaxfrequency = <&mcp2515>,"spi-max-frequency:0";
interrupt = <&mcp2515_pins>,"brcm,pins:0",<&mcp2515>,"interrupts:0";
};
};
/*
* Device tree overlay for using 4 CS pins on spi0 by Kristian Sloth Lauszus.
*/
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2835";
fragment@0 {
target = <&spi0>;
frag0: __overlay__ {
/* needed to avoid dtc warning */
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default";
pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
cs-gpios = <&gpio 8 1>, <&gpio 7 1>, <&gpio 6 1>, <&gpio 3 1>;
status = "okay"; /* enable spi0 */
spidev@2 {
compatible = "spidev";
reg = <2>; /* CE2 */
spi-max-frequency = <125000000>;
};
spidev@3 {
compatible = "spidev";
reg = <3>; /* CE3 */
spi-max-frequency = <125000000>;
};
};
};
fragment@1 {
target = <&gpio>;
__overlay__ {
spi0_cs_pins: spi0_cs_pins {
brcm,pins = <8 7 6 3>;
brcm,function = <1>; /* out */
};
};
};
__overrides__ {
cs0_pin = <&frag0>,"cs-gpios:4",
<&spi0_cs_pins>,"brcm,pins:0";
cs1_pin = <&frag0>,"cs-gpios:16",
<&spi0_cs_pins>,"brcm,pins:4";
cs2_pin = <&frag0>,"cs-gpios:28",
<&spi0_cs_pins>,"brcm,pins:8";
cs3_pin = <&frag0>,"cs-gpios:40",
<&spi0_cs_pins>,"brcm,pins:12";
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment