All of lore.kernel.org
 help / color / mirror / Atom feed
* Writing socketCAN module for my own hardware
@ 2014-08-12  7:51 Florian Feldbauer
  2014-08-12  8:24 ` Marc Kleine-Budde
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-08-12  7:51 UTC (permalink / raw)
  To: linux-can

Hey all,

I have developed a CAN interface for the Raspberry Pi computer using the 
SJA1000 directly connected to the GPIOs of the CPU.
So far this interface is used as chardev and works fine.
But I'm also developing a user-space program using this CAN interface. 
This program should also be compatible with other CAN interfaces like 
the ones from PEAK or Kvazer. So I thought using socketCAN would be a 
good idea.

Is there any documentation on how to write a socketCAN compatible kernel 
module for my own hardware?
I tried writing something similar to the sja1000_isa driver...
So far my modified kernel compiles and I can change bitrate and bring 
the interface up.
But as soon as I try to send a CAN frame I get the error:
Error 105: No buffer space available

Any help appreciated!

Best regards,
Florian

-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-08-12  7:51 Writing socketCAN module for my own hardware Florian Feldbauer
@ 2014-08-12  8:24 ` Marc Kleine-Budde
  2014-08-12  8:57   ` Florian Feldbauer
  0 siblings, 1 reply; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-08-12  8:24 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 1444 bytes --]

On 08/12/2014 09:51 AM, Florian Feldbauer wrote:
> I have developed a CAN interface for the Raspberry Pi computer using the
> SJA1000 directly connected to the GPIOs of the CPU.

This sounds very slow :)

> So far this interface is used as chardev and works fine.
> But I'm also developing a user-space program using this CAN interface.
> This program should also be compatible with other CAN interfaces like
> the ones from PEAK or Kvazer. So I thought using socketCAN would be a
> good idea.

Yes.

> Is there any documentation on how to write a socketCAN compatible kernel
> module for my own hardware?
> I tried writing something similar to the sja1000_isa driver...

IMHO sja1000_platform.c is a better blueprint, as it uses the device
tree to describe the hardware and does not rely on module parameters.

> So far my modified kernel compiles and I can change bitrate and bring
> the interface up.
> But as soon as I try to send a CAN frame I get the error:
> Error 105: No buffer space available

You are sending CAN frames faster than the driver is able to send them,
you have to wait a bit, before sending new CAN frames.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-08-12  8:24 ` Marc Kleine-Budde
@ 2014-08-12  8:57   ` Florian Feldbauer
  2014-08-12 10:01     ` Marc Kleine-Budde
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-08-12  8:57 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

Hey,

Thanks for the quick answer.

On 08/12/2014 10:24 AM, Marc Kleine-Budde wrote:
> On 08/12/2014 09:51 AM, Florian Feldbauer wrote:
>> I have developed a CAN interface for the Raspberry Pi computer using the
>> SJA1000 directly connected to the GPIOs of the CPU.
> This sounds very slow :)
Actually no. At least with the chardev driver it was faster than the 
PEAK USB-CAN-PRO
connected to my laptop.
But I'm using direct memory manipulation to set/clear the GPIOs.
This is much faster than using the designated GPIO functions from the 
kernel...
>
>> So far this interface is used as chardev and works fine.
>> But I'm also developing a user-space program using this CAN interface.
>> This program should also be compatible with other CAN interfaces like
>> the ones from PEAK or Kvazer. So I thought using socketCAN would be a
>> good idea.
> Yes.
>
>> Is there any documentation on how to write a socketCAN compatible kernel
>> module for my own hardware?
>> I tried writing something similar to the sja1000_isa driver...
> IMHO sja1000_platform.c is a better blueprint, as it uses the device
> tree to describe the hardware and does not rely on module parameters.
Ok. I will have a look at it.
>
>> So far my modified kernel compiles and I can change bitrate and bring
>> the interface up.
>> But as soon as I try to send a CAN frame I get the error:
>> Error 105: No buffer space available
> You are sending CAN frames faster than the driver is able to send them,
> you have to wait a bit, before sending new CAN frames.
I'm using
   int nbytes = write( fd, pframe, sizeof(can_frame_t) );
to send a message. I thought this function blocks until the write is 
finished?

My old chardev module was based on the kernel module from PEAK systems and
thus had a FIFO buffer for sending and receiving messages.
 From the above error, I assume, socketCAN has no internal buffer?
What happens if there are many messages received on a small timescale?

   Florian
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-08-12  8:57   ` Florian Feldbauer
@ 2014-08-12 10:01     ` Marc Kleine-Budde
  2014-10-01  7:26       ` Florian Feldbauer
  0 siblings, 1 reply; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-08-12 10:01 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 2808 bytes --]

On 08/12/2014 10:57 AM, Florian Feldbauer wrote:
> On 08/12/2014 10:24 AM, Marc Kleine-Budde wrote:
>> On 08/12/2014 09:51 AM, Florian Feldbauer wrote:
>>> I have developed a CAN interface for the Raspberry Pi computer using the
>>> SJA1000 directly connected to the GPIOs of the CPU.
>> This sounds very slow :)
> Actually no. At least with the chardev driver it was faster than the
> PEAK USB-CAN-PRO
> connected to my laptop.
> But I'm using direct memory manipulation to set/clear the GPIOs.
> This is much faster than using the designated GPIO functions from the
> kernel...

Portability comes with a price.

>>> So far this interface is used as chardev and works fine.
>>> But I'm also developing a user-space program using this CAN interface.
>>> This program should also be compatible with other CAN interfaces like
>>> the ones from PEAK or Kvazer. So I thought using socketCAN would be a
>>> good idea.
>> Yes.
>>
>>> Is there any documentation on how to write a socketCAN compatible kernel
>>> module for my own hardware?
>>> I tried writing something similar to the sja1000_isa driver...
>> IMHO sja1000_platform.c is a better blueprint, as it uses the device
>> tree to describe the hardware and does not rely on module parameters.
> Ok. I will have a look at it.
>>
>>> So far my modified kernel compiles and I can change bitrate and bring
>>> the interface up.
>>> But as soon as I try to send a CAN frame I get the error:
>>> Error 105: No buffer space available
>> You are sending CAN frames faster than the driver is able to send them,
>> you have to wait a bit, before sending new CAN frames.
> I'm using
>   int nbytes = write( fd, pframe, sizeof(can_frame_t) );
> to send a message. I thought this function blocks until the write is
> finished?

No. It will return with a errno if the message cannot be queued.

> My old chardev module was based on the kernel module from PEAK systems and
> thus had a FIFO buffer for sending and receiving messages.
> From the above error, I assume, socketCAN has no internal buffer?

There are buffers for RX and TX.

> What happens if there are many messages received on a small timescale?

If the system can handle the RX load all messages will be queued. Then
there are per socket queues for your userspace applications. If a queue
if full, CAN frames will be dropped. You can get information about
dropped CAN frames with the recvmsg() system call. See candump.c from
the gitorious can-utils for an exmaple.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-08-12 10:01     ` Marc Kleine-Budde
@ 2014-10-01  7:26       ` Florian Feldbauer
  2014-10-01  7:49         ` Marc Kleine-Budde
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-01  7:26 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

Hey all,

I still have some problems with the socket CAN driver for
my Raspberry Pi CAN interface.
I added a printk statement in the read/write register functions to
see what happens.

Looking into the output of `dmesg` after loading the kernel module
I see in an endless loop appearing the lines

[  129.210361] sja1000_raspi: Read register 0: 0x21
[  129.210394] sja1000_raspi: Write register 4: 0x00
[  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet 
defined

Is this an expected behavior?

After setting the bitrate using
$> ip link set can0 type can bitrate 250000
The above messages stop.

dmesg output at this point:
[  172.870195] sja1000_raspi: Read register 15: 0xff
[  172.870231] sja1000_raspi: Read register 14: 0xff
[  172.872933] sja1000_raspi sja1000_raspi.0 can0: setting BTR0=0x01 
BTR1=0x1c
[  172.872971] sja1000_raspi: Write register 6: 0x01
[  172.872987] sja1000_raspi: Write register 7: 0x1c
[  173.269190] sja1000_raspi: Read register 0: 0x21
[  173.269221] sja1000_raspi: Write register 4: 0x00
[  173.269287] sja1000_raspi: Write register 15: 0x00
[  173.269303] sja1000_raspi: Write register 14: 0x00
[  173.269319] sja1000_raspi: Read register 12: 0xff
[  173.269336] sja1000_raspi: Read register 0: 0x21
[  173.269348] sja1000_raspi: Write register 0: 0x00
[  173.269369] sja1000_raspi: Read register 0: 0x20
[  173.269381] sja1000_raspi: Write register 4: 0x7f
[  173.269446] sja1000_raspi: Read register 15: 0x0c
[  173.269462] sja1000_raspi: Read register 14: 0x03

The main problem is: If I now try to change the bitrate again
I get a "Device or resource busy" error.
demsg shows in this case simply these to lines:
[  445.848207] sja1000_raspi: Read register 15: 0x0c
[  445.848241] sja1000_raspi: Read register 14: 0x03

After bringing the interface up and trying to listen on the CANbus
using candump from the can-utils I get nothing, although a second
node is sending frames and bitrate settings are correct.

I'm working with the raspberry pi kernel 
(https://github.com/raspberrypi/linux)
version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3

Source of my own kernel module is also on github
https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c

As written before, I could not find a documentation of socketCAN and 
simply tried
to "copy" the sja1000_isa.c driver...naybe I did something completely 
wrong or missed
something?

Any help is very much appreciated!

Best regards,
Florian

On 08/12/2014 12:01 PM, Marc Kleine-Budde wrote:
> On 08/12/2014 10:57 AM, Florian Feldbauer wrote:
>> On 08/12/2014 10:24 AM, Marc Kleine-Budde wrote:
>>> On 08/12/2014 09:51 AM, Florian Feldbauer wrote:
>>>> I have developed a CAN interface for the Raspberry Pi computer using the
>>>> SJA1000 directly connected to the GPIOs of the CPU.
>>> This sounds very slow :)
>> Actually no. At least with the chardev driver it was faster than the
>> PEAK USB-CAN-PRO
>> connected to my laptop.
>> But I'm using direct memory manipulation to set/clear the GPIOs.
>> This is much faster than using the designated GPIO functions from the
>> kernel...
> Portability comes with a price.
>
>>>> So far this interface is used as chardev and works fine.
>>>> But I'm also developing a user-space program using this CAN interface.
>>>> This program should also be compatible with other CAN interfaces like
>>>> the ones from PEAK or Kvazer. So I thought using socketCAN would be a
>>>> good idea.
>>> Yes.
>>>
>>>> Is there any documentation on how to write a socketCAN compatible kernel
>>>> module for my own hardware?
>>>> I tried writing something similar to the sja1000_isa driver...
>>> IMHO sja1000_platform.c is a better blueprint, as it uses the device
>>> tree to describe the hardware and does not rely on module parameters.
>> Ok. I will have a look at it.
>>>> So far my modified kernel compiles and I can change bitrate and bring
>>>> the interface up.
>>>> But as soon as I try to send a CAN frame I get the error:
>>>> Error 105: No buffer space available
>>> You are sending CAN frames faster than the driver is able to send them,
>>> you have to wait a bit, before sending new CAN frames.
>> I'm using
>>    int nbytes = write( fd, pframe, sizeof(can_frame_t) );
>> to send a message. I thought this function blocks until the write is
>> finished?
> No. It will return with a errno if the message cannot be queued.
>
>> My old chardev module was based on the kernel module from PEAK systems and
>> thus had a FIFO buffer for sending and receiving messages.
>>  From the above error, I assume, socketCAN has no internal buffer?
> There are buffers for RX and TX.
>
>> What happens if there are many messages received on a small timescale?
> If the system can handle the RX load all messages will be queued. Then
> there are per socket queues for your userspace applications. If a queue
> if full, CAN frames will be dropped. You can get information about
> dropped CAN frames with the recvmsg() system call. See candump.c from
> the gitorious can-utils for an exmaple.
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01  7:26       ` Florian Feldbauer
@ 2014-10-01  7:49         ` Marc Kleine-Budde
  2014-10-01 12:32           ` Florian Feldbauer
  0 siblings, 1 reply; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-10-01  7:49 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 3390 bytes --]

On 10/01/2014 09:26 AM, Florian Feldbauer wrote:
> I still have some problems with the socket CAN driver for
> my Raspberry Pi CAN interface.
> I added a printk statement in the read/write register functions to
> see what happens.
> 
> Looking into the output of `dmesg` after loading the kernel module
> I see in an endless loop appearing the lines
> 
> [  129.210361] sja1000_raspi: Read register 0: 0x21
> [  129.210394] sja1000_raspi: Write register 4: 0x00
> [  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet
> defined
> 
> Is this an expected behavior?

Do you have network manager or a similar program running that is trying
to handle the CAN interface?

> After setting the bitrate using
> $> ip link set can0 type can bitrate 250000
> The above messages stop.
> 
> dmesg output at this point:
> [  172.870195] sja1000_raspi: Read register 15: 0xff
> [  172.870231] sja1000_raspi: Read register 14: 0xff
> [  172.872933] sja1000_raspi sja1000_raspi.0 can0: setting BTR0=0x01
> BTR1=0x1c
> [  172.872971] sja1000_raspi: Write register 6: 0x01
> [  172.872987] sja1000_raspi: Write register 7: 0x1c
> [  173.269190] sja1000_raspi: Read register 0: 0x21
> [  173.269221] sja1000_raspi: Write register 4: 0x00
> [  173.269287] sja1000_raspi: Write register 15: 0x00
> [  173.269303] sja1000_raspi: Write register 14: 0x00
> [  173.269319] sja1000_raspi: Read register 12: 0xff
> [  173.269336] sja1000_raspi: Read register 0: 0x21
> [  173.269348] sja1000_raspi: Write register 0: 0x00
> [  173.269369] sja1000_raspi: Read register 0: 0x20
> [  173.269381] sja1000_raspi: Write register 4: 0x7f
> [  173.269446] sja1000_raspi: Read register 15: 0x0c
> [  173.269462] sja1000_raspi: Read register 14: 0x03
> 
> The main problem is: If I now try to change the bitrate again
> I get a "Device or resource busy" error.

You'll get this busy error if the device is still "up", so there is
someone who automatically does something similar to "ifconfig can0 up".

> demsg shows in this case simply these to lines:
> [  445.848207] sja1000_raspi: Read register 15: 0x0c
> [  445.848241] sja1000_raspi: Read register 14: 0x03
> 
> After bringing the interface up and trying to listen on the CANbus
> using candump from the can-utils I get nothing, although a second
> node is sending frames and bitrate settings are correct.

Do you get any interrupts?

> I'm working with the raspberry pi kernel
> (https://github.com/raspberrypi/linux)
> version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3
> 
> Source of my own kernel module is also on github
> https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c
> 
> 
> As written before, I could not find a documentation of socketCAN and
> simply tried
> to "copy" the sja1000_isa.c driver...naybe I did something completely
> wrong or missed
> something?

Yes, making a copy of the driver is probably not the right thing....
BTW: where's are the original copyright notes?

> Any help is very much appreciated!

regards,
Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01  7:49         ` Marc Kleine-Budde
@ 2014-10-01 12:32           ` Florian Feldbauer
  2014-10-01 12:41             ` Marc Kleine-Budde
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-01 12:32 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

On 10/01/2014 09:49 AM, Marc Kleine-Budde wrote:
> On 10/01/2014 09:26 AM, Florian Feldbauer wrote:
>> I still have some problems with the socket CAN driver for
>> my Raspberry Pi CAN interface.
>> I added a printk statement in the read/write register functions to
>> see what happens.
>>
>> Looking into the output of `dmesg` after loading the kernel module
>> I see in an endless loop appearing the lines
>>
>> [  129.210361] sja1000_raspi: Read register 0: 0x21
>> [  129.210394] sja1000_raspi: Write register 4: 0x00
>> [  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet
>> defined
>>
>> Is this an expected behavior?
> Do you have network manager or a similar program running that is trying
> to handle the CAN interface?
network-manager is not installed and looking at the active services and 
processes
I don't see anything which looks like a network manager...
>> After setting the bitrate using
>> $> ip link set can0 type can bitrate 250000
>> The above messages stop.
>>
>> dmesg output at this point:
>> [  172.870195] sja1000_raspi: Read register 15: 0xff
>> [  172.870231] sja1000_raspi: Read register 14: 0xff
>> [  172.872933] sja1000_raspi sja1000_raspi.0 can0: setting BTR0=0x01
>> BTR1=0x1c
>> [  172.872971] sja1000_raspi: Write register 6: 0x01
>> [  172.872987] sja1000_raspi: Write register 7: 0x1c
>> [  173.269190] sja1000_raspi: Read register 0: 0x21
>> [  173.269221] sja1000_raspi: Write register 4: 0x00
>> [  173.269287] sja1000_raspi: Write register 15: 0x00
>> [  173.269303] sja1000_raspi: Write register 14: 0x00
>> [  173.269319] sja1000_raspi: Read register 12: 0xff
>> [  173.269336] sja1000_raspi: Read register 0: 0x21
>> [  173.269348] sja1000_raspi: Write register 0: 0x00
>> [  173.269369] sja1000_raspi: Read register 0: 0x20
>> [  173.269381] sja1000_raspi: Write register 4: 0x7f
>> [  173.269446] sja1000_raspi: Read register 15: 0x0c
>> [  173.269462] sja1000_raspi: Read register 14: 0x03
>>
>> The main problem is: If I now try to change the bitrate again
>> I get a "Device or resource busy" error.
> You'll get this busy error if the device is still "up", so there is
> someone who automatically does something similar to "ifconfig can0 up".
hmm....I just noticed that, the interface is always brought up 
automatically.
Even if I run `if config can0 down` the interface is brought up again....


>> demsg shows in this case simply these to lines:
>> [  445.848207] sja1000_raspi: Read register 15: 0x0c
>> [  445.848241] sja1000_raspi: Read register 14: 0x03
>>
>> After bringing the interface up and trying to listen on the CANbus
>> using candump from the can-utils I get nothing, although a second
>> node is sending frames and bitrate settings are correct.
> Do you get any interrupts?
Seems not the case
Sending doesn't work either...
 From a very quick look, it seems the GPIOs are not set...But to be sure
I have to build a small adapter in order to properly connect our digital 
scope to it...
>> I'm working with the raspberry pi kernel
>> (https://github.com/raspberrypi/linux)
>> version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3
>>
>> Source of my own kernel module is also on github
>> https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c
>>
>>
>> As written before, I could not find a documentation of socketCAN and
>> simply tried
>> to "copy" the sja1000_isa.c driver...naybe I did something completely
>> wrong or missed
>> something?
> Yes, making a copy of the driver is probably not the right thing....
> BTW: where's are the original copyright notes?
"Copy" in this case means: I looked into 
sja1000_isa.c/sja1000_platform.c to see what function have
to be implemented and what parameters do they use.
I copied the corresponding functions from my chardev driver and modified 
them
accordingly....

>> Any help is very much appreciated!
> regards,
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01 12:32           ` Florian Feldbauer
@ 2014-10-01 12:41             ` Marc Kleine-Budde
  2014-10-01 12:56               ` Florian Feldbauer
  2014-10-09 15:06               ` Florian Feldbauer
  0 siblings, 2 replies; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-10-01 12:41 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 2027 bytes --]

On 10/01/2014 02:32 PM, Florian Feldbauer wrote:
>> Do you get any interrupts?
> Seems not the case
> Sending doesn't work either...
> From a very quick look, it seems the GPIOs are not set...But to be sure
> I have to build a small adapter in order to properly connect our digital
> scope to it...

Let's see if there is actual output on the GPIO lines...

BTW: what's the use-case of the rpi, better buy a beagle bone black.
IIRC you need to attach the CAN phy, and you're ready to go. It comes
with two internal CAN cores, the first one is quite easy to setup, the
second one uses the same pins as one the the I2C busses, which has to be
disabled then... And you can use a proper mainline kernel.

>>> I'm working with the raspberry pi kernel
>>> (https://github.com/raspberrypi/linux)
>>> version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3
>>>
>>> Source of my own kernel module is also on github
>>> https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c
>>>
>>>
>>>
>>> As written before, I could not find a documentation of socketCAN and
>>> simply tried
>>> to "copy" the sja1000_isa.c driver...naybe I did something completely
>>> wrong or missed
>>> something?
>> Yes, making a copy of the driver is probably not the right thing....
>> BTW: where's are the original copyright notes?
> "Copy" in this case means: I looked into
> sja1000_isa.c/sja1000_platform.c to see what function have
> to be implemented and what parameters do they use.
> I copied the corresponding functions from my chardev driver and modified
> them
> accordingly....

IANAL, but it's best practice to state which parts of your driver is
based on the work of others.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01 12:41             ` Marc Kleine-Budde
@ 2014-10-01 12:56               ` Florian Feldbauer
  2014-10-01 13:11                 ` Marc Kleine-Budde
  2014-10-09 15:06               ` Florian Feldbauer
  1 sibling, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-01 12:56 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

On 10/01/2014 02:41 PM, Marc Kleine-Budde wrote:
> On 10/01/2014 02:32 PM, Florian Feldbauer wrote:
>>> Do you get any interrupts?
>> Seems not the case
>> Sending doesn't work either...
>>  From a very quick look, it seems the GPIOs are not set...But to be sure
>> I have to build a small adapter in order to properly connect our digital
>> scope to it...
> Let's see if there is actual output on the GPIO lines...
>
> BTW: what's the use-case of the rpi, better buy a beagle bone black.
> IIRC you need to attach the CAN phy, and you're ready to go. It comes
> with two internal CAN cores, the first one is quite easy to setup, the
> second one uses the same pins as one the the I2C busses, which has to be
> disabled then... And you can use a proper mainline kernel.
I'm working at the university for experimental hadron physik. And for
our experiment we need a low budget, high performance CANbus interface
running under Linux.
We came up with the idea of the Rpi, since it's small, it has ethernet, 
and it is
cheap (~30 euro). And with the sja1000 connected to the GPIOs you can 
achieve
the high data throughput (up to 6666 extended data frames with 8 byte 
length @1Mbit/s)

Actually I don't know if any other embedded linux board like the beagle 
bone
was considered...
>>>> I'm working with the raspberry pi kernel
>>>> (https://github.com/raspberrypi/linux)
>>>> version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3
>>>>
>>>> Source of my own kernel module is also on github
>>>> https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c
>>>>
>>>>
>>>>
>>>> As written before, I could not find a documentation of socketCAN and
>>>> simply tried
>>>> to "copy" the sja1000_isa.c driver...naybe I did something completely
>>>> wrong or missed
>>>> something?
>>> Yes, making a copy of the driver is probably not the right thing....
>>> BTW: where's are the original copyright notes?
>> "Copy" in this case means: I looked into
>> sja1000_isa.c/sja1000_platform.c to see what function have
>> to be implemented and what parameters do they use.
>> I copied the corresponding functions from my chardev driver and modified
>> them
>> accordingly....
> IANAL, but it's best practice to state which parts of your driver is
> based on the work of others.
Yes, you're right! It will be added in the next commit...
(The current branch ver3.0.0 of my repo is currently still a development 
branch...)

   Florian
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01 12:56               ` Florian Feldbauer
@ 2014-10-01 13:11                 ` Marc Kleine-Budde
  0 siblings, 0 replies; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-10-01 13:11 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 1390 bytes --]

On 10/01/2014 02:56 PM, Florian Feldbauer wrote:
>> BTW: what's the use-case of the rpi, better buy a beagle bone black.
>> IIRC you need to attach the CAN phy, and you're ready to go. It comes
>> with two internal CAN cores, the first one is quite easy to setup, the
>> second one uses the same pins as one the the I2C busses, which has to be
>> disabled then... And you can use a proper mainline kernel.

> I'm working at the university for experimental hadron physik. And for
> our experiment we need a low budget, high performance CANbus interface
> running under Linux.

High performance and bit banging in one sentence (or SoC) is a bit
contradictory :)

> We came up with the idea of the Rpi, since it's small, it has ethernet,
> and it is
> cheap (~30 euro). And with the sja1000 connected to the GPIOs you can
> achieve
> the high data throughput (up to 6666 extended data frames with 8 byte
> length @1Mbit/s)

Beagle Bone is about ~60€ in single quantities.

> Actually I don't know if any other embedded linux board like the beagle
> bone
> was considered...

:(

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-01 12:41             ` Marc Kleine-Budde
  2014-10-01 12:56               ` Florian Feldbauer
@ 2014-10-09 15:06               ` Florian Feldbauer
  2014-10-09 16:13                 ` Marc Kleine-Budde
  1 sibling, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-09 15:06 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

Hey all,

I now checked everything with a mixed signal scope and
one thing came to my eye:

After loading the module, I get the error:
[   16.806860] sja1000_raspi sja1000_raspi.0: registering sja1000_raspi 
device (reg_base=0xf2200000, irq=174)
[   16.836560] sja1000_raspi sja1000_raspi.0 (unregistered net_device): 
setting SJA1000 into reset mode failed!
[   16.871684] sja1000_raspi sja1000_raspi.0: sja1000_raspi device 
registered (reg_base=0xf2200000, irq=174)

Although I can see at the scope, that reading register 0 of the SJA1000 
returns the value 1 as it should be.
Also, it seems that there is some kind of endless loop reading this 
register.

Now, what I don't understand at all:
Removing the module and loading it again works.
I don't get the error that setting the SJA1000 into reset mode failed,
the register is only read once after loading the module,
and sending/reading CAN frames from the bus after setting a proper 
bitrate works too....

Any Ideas why the first initialization of the kernel module doesn't work?
When is the probe function of the module actually called?

A completely other question: I wanted to use libsocketcan to check the 
state of the interface,
bringing it up in case it's down, within my C/C++ Program.
Is there a way to use this lib as a normal user? Maybe some group the 
user has to be in?

Regards,
Florian

On 10/01/2014 02:41 PM, Marc Kleine-Budde wrote:
> On 10/01/2014 02:32 PM, Florian Feldbauer wrote:
>>> Do you get any interrupts?
>> Seems not the case
>> Sending doesn't work either...
>>  From a very quick look, it seems the GPIOs are not set...But to be sure
>> I have to build a small adapter in order to properly connect our digital
>> scope to it...
> Let's see if there is actual output on the GPIO lines...
>
> BTW: what's the use-case of the rpi, better buy a beagle bone black.
> IIRC you need to attach the CAN phy, and you're ready to go. It comes
> with two internal CAN cores, the first one is quite easy to setup, the
> second one uses the same pins as one the the I2C busses, which has to be
> disabled then... And you can use a proper mainline kernel.
>
>>>> I'm working with the raspberry pi kernel
>>>> (https://github.com/raspberrypi/linux)
>>>> version 3.12.y commit c256eb9968c8997dce47350d2075e42f1b3991d3
>>>>
>>>> Source of my own kernel module is also on github
>>>> https://github.com/ffeldbauer/epics_RPi_can/blob/ver3.0.0/CAN_interface/driver/sja1000_raspi.c
>>>>
>>>>
>>>>
>>>> As written before, I could not find a documentation of socketCAN and
>>>> simply tried
>>>> to "copy" the sja1000_isa.c driver...naybe I did something completely
>>>> wrong or missed
>>>> something?
>>> Yes, making a copy of the driver is probably not the right thing....
>>> BTW: where's are the original copyright notes?
>> "Copy" in this case means: I looked into
>> sja1000_isa.c/sja1000_platform.c to see what function have
>> to be implemented and what parameters do they use.
>> I copied the corresponding functions from my chardev driver and modified
>> them
>> accordingly....
> IANAL, but it's best practice to state which parts of your driver is
> based on the work of others.
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-09 15:06               ` Florian Feldbauer
@ 2014-10-09 16:13                 ` Marc Kleine-Budde
  2014-10-10  7:43                   ` Florian Feldbauer
  0 siblings, 1 reply; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-10-09 16:13 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 4329 bytes --]

Hello Florian,

please don't top-post.

On 10/09/2014 05:06 PM, Florian Feldbauer wrote:
> I now checked everything with a mixed signal scope and
> one thing came to my eye:
> 
> After loading the module, I get the error:
> [   16.806860] sja1000_raspi sja1000_raspi.0: registering sja1000_raspi
> device (reg_base=0xf2200000, irq=174)
> [   16.836560] sja1000_raspi sja1000_raspi.0 (unregistered net_device):
> setting SJA1000 into reset mode failed!
> [   16.871684] sja1000_raspi sja1000_raspi.0: sja1000_raspi device
> registered (reg_base=0xf2200000, irq=174)
> 
> Although I can see at the scope, that reading register 0 of the SJA1000
> returns the value 1 as it should be.
> Also, it seems that there is some kind of endless loop reading this
> register.

No, just a loop of up to 100 :)

> static void set_reset_mode(struct net_device *dev)                               
> {                                                                                
>         struct sja1000_priv *priv = netdev_priv(dev);                            
>         unsigned char status = priv->read_reg(priv, SJA1000_MOD);                
>         int i;                                                                   
>                                                                                  
>         /* disable interrupts */                                                 
>         priv->write_reg(priv, SJA1000_IER, IRQ_OFF);                             
>                                                                                  
>         for (i = 0; i < 100; i++) {                                              
>                 /* check reset bit */                                            
>                 if (status & MOD_RM) {                                           
>                         priv->can.state = CAN_STATE_STOPPED;                     
>                         return;                                                  
>                 }                                                                
>                                                                                  
>                 /* reset chip */                                                 
>                 priv->write_reg(priv, SJA1000_MOD, MOD_RM);                      
>                 udelay(10);                                                      
>                 status = priv->read_reg(priv, SJA1000_MOD);                      
>         }                                                                        
>                                                                                  
>         netdev_err(dev, "setting SJA1000 into reset mode failed!\n");            
> }                                                      

Instrument this code to see what's going on.

> Now, what I don't understand at all:
> Removing the module and loading it again works.
> I don't get the error that setting the SJA1000 into reset mode failed,
> the register is only read once after loading the module,
> and sending/reading CAN frames from the bus after setting a proper
> bitrate works too....

Maybe the delay is to small for your big banging io interface.

> Any Ideas why the first initialization of the kernel module doesn't work?
> When is the probe function of the module actually called?

As soon as there is a matching driver//device combination on a bus.
Looking at your driver, it's racy. You should not do any hardware setup
in the init function.

> A completely other question: I wanted to use libsocketcan to check the
> state of the interface,
> bringing it up in case it's down, within my C/C++ Program.
> Is there a way to use this lib as a normal user? Maybe some group the
> user has to be in?

IIRC your process needs NET_ADMIN capabilities (CAP_NET_ADMIN). I
personally never used capabilities, but there are libcap and libcap-ng
(https://people.redhat.com/sgrubb/libcap-ng/), which might help.

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-09 16:13                 ` Marc Kleine-Budde
@ 2014-10-10  7:43                   ` Florian Feldbauer
  2014-10-10  8:06                     ` Marc Kleine-Budde
  0 siblings, 1 reply; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-10  7:43 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

Hey,

On 10/09/2014 06:13 PM, Marc Kleine-Budde wrote:
> Hello Florian,
>
> please don't top-post.
>
> On 10/09/2014 05:06 PM, Florian Feldbauer wrote:
>> I now checked everything with a mixed signal scope and
>> one thing came to my eye:
>>
>> After loading the module, I get the error:
>> [   16.806860] sja1000_raspi sja1000_raspi.0: registering sja1000_raspi
>> device (reg_base=0xf2200000, irq=174)
>> [   16.836560] sja1000_raspi sja1000_raspi.0 (unregistered net_device):
>> setting SJA1000 into reset mode failed!
>> [   16.871684] sja1000_raspi sja1000_raspi.0: sja1000_raspi device
>> registered (reg_base=0xf2200000, irq=174)
>>
>> Although I can see at the scope, that reading register 0 of the SJA1000
>> returns the value 1 as it should be.
>> Also, it seems that there is some kind of endless loop reading this
>> register.
> No, just a loop of up to 100 :)
Maybe it's correlated with the issue that the message
[  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet
appears over and over again in dmesg, but register 0 is definitely
read more than 100 times...
>
>> static void set_reset_mode(struct net_device *dev)
>> {
>>          struct sja1000_priv *priv = netdev_priv(dev);
>>          unsigned char status = priv->read_reg(priv, SJA1000_MOD);
>>          int i;
>>                                                                                   
>>          /* disable interrupts */
>>          priv->write_reg(priv, SJA1000_IER, IRQ_OFF);
>>                                                                                   
>>          for (i = 0; i < 100; i++) {
>>                  /* check reset bit */
>>                  if (status & MOD_RM) {
>>                          priv->can.state = CAN_STATE_STOPPED;
>>                          return;
>>                  }
>>                                                                                   
>>                  /* reset chip */
>>                  priv->write_reg(priv, SJA1000_MOD, MOD_RM);
>>                  udelay(10);
>>                  status = priv->read_reg(priv, SJA1000_MOD);
>>          }
>>                                                                                   
>>          netdev_err(dev, "setting SJA1000 into reset mode failed!\n");
>> }
> Instrument this code to see what's going on.
>
>> Now, what I don't understand at all:
>> Removing the module and loading it again works.
>> I don't get the error that setting the SJA1000 into reset mode failed,
>> the register is only read once after loading the module,
>> and sending/reading CAN frames from the bus after setting a proper
>> bitrate works too....
> Maybe the delay is to small for your big banging io interface.
>
>> Any Ideas why the first initialization of the kernel module doesn't work?
>> When is the probe function of the module actually called?
> As soon as there is a matching driver//device combination on a bus.
> Looking at your driver, it's racy. You should not do any hardware setup
> in the init function.
Ok...I moved the whole configuration of the GPIOs into the probe 
function (instead of the init)
and now it works! Thanks!

Now I only have to solve the problem, that bringing the interface down 
is not possible....
Always need to reboot just to change bitrate is no fun.
Maybe I should consult the Raspberry community, if there is some kind of 
network manager...

Again, many thanks for your help!!
Regards,
Florian
>
>> A completely other question: I wanted to use libsocketcan to check the
>> state of the interface,
>> bringing it up in case it's down, within my C/C++ Program.
>> Is there a way to use this lib as a normal user? Maybe some group the
>> user has to be in?
> IIRC your process needs NET_ADMIN capabilities (CAP_NET_ADMIN). I
> personally never used capabilities, but there are libcap and libcap-ng
> (https://people.redhat.com/sgrubb/libcap-ng/), which might help.
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-10  7:43                   ` Florian Feldbauer
@ 2014-10-10  8:06                     ` Marc Kleine-Budde
  2014-10-10  8:09                       ` Florian Feldbauer
  0 siblings, 1 reply; 15+ messages in thread
From: Marc Kleine-Budde @ 2014-10-10  8:06 UTC (permalink / raw)
  To: Florian Feldbauer, linux-can

[-- Attachment #1: Type: text/plain, Size: 1762 bytes --]

On 10/10/2014 09:43 AM, Florian Feldbauer wrote:
>>> Although I can see at the scope, that reading register 0 of the SJA1000
>>> returns the value 1 as it should be.
>>> Also, it seems that there is some kind of endless loop reading this
>>> register.
>> No, just a loop of up to 100 :)

> Maybe it's correlated with the issue that the message
> [  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet
> appears over and over again in dmesg, but register 0 is definitely
> read more than 100 times...

As mentioned earlier, you have probably a mechanism running on your
system, that tries to enable the CAN interface. Bringing up the
interface without a set bit-rate is not allowed.

[...]

>>> Any Ideas why the first initialization of the kernel module doesn't
>>> work?
>>> When is the probe function of the module actually called?
>> As soon as there is a matching driver//device combination on a bus.
>> Looking at your driver, it's racy. You should not do any hardware setup
>> in the init function.
> Ok...I moved the whole configuration of the GPIOs into the probe
> function (instead of the init)
> and now it works! Thanks!
> 
> Now I only have to solve the problem, that bringing the interface down
> is not possible....
> Always need to reboot just to change bitrate is no fun.
> Maybe I should consult the Raspberry community, if there is some kind of
> network manager...

What kind of distribution are you using?

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 181 bytes --]

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: Writing socketCAN module for my own hardware
  2014-10-10  8:06                     ` Marc Kleine-Budde
@ 2014-10-10  8:09                       ` Florian Feldbauer
  0 siblings, 0 replies; 15+ messages in thread
From: Florian Feldbauer @ 2014-10-10  8:09 UTC (permalink / raw)
  To: Marc Kleine-Budde, linux-can

On 10/10/2014 10:06 AM, Marc Kleine-Budde wrote:
> On 10/10/2014 09:43 AM, Florian Feldbauer wrote:
>>>> Although I can see at the scope, that reading register 0 of the SJA1000
>>>> returns the value 1 as it should be.
>>>> Also, it seems that there is some kind of endless loop reading this
>>>> register.
>>> No, just a loop of up to 100 :)
>> Maybe it's correlated with the issue that the message
>> [  129.210423] sja1000_raspi sja1000_raspi.0 can0: bit-timing not yet
>> appears over and over again in dmesg, but register 0 is definitely
>> read more than 100 times...
> As mentioned earlier, you have probably a mechanism running on your
> system, that tries to enable the CAN interface. Bringing up the
> interface without a set bit-rate is not allowed.
>
> [...]
>
>>>> Any Ideas why the first initialization of the kernel module doesn't
>>>> work?
>>>> When is the probe function of the module actually called?
>>> As soon as there is a matching driver//device combination on a bus.
>>> Looking at your driver, it's racy. You should not do any hardware setup
>>> in the init function.
>> Ok...I moved the whole configuration of the GPIOs into the probe
>> function (instead of the init)
>> and now it works! Thanks!
>>
>> Now I only have to solve the problem, that bringing the interface down
>> is not possible....
>> Always need to reboot just to change bitrate is no fun.
>> Maybe I should consult the Raspberry community, if there is some kind of
>> network manager...
> What kind of distribution are you using?
raspbian wheezy, version from 2014-09-09
>
> Marc
>


-- 
----------------------------------------
| Dr. Florian Feldbauer                |
|                                      |
| Helmholtz-Institut Mainz /           |
| Johannes Gutenberg-Universität Mainz |
| Johann-Joachim-Becher-Weg 36         |
| D-55128 Mainz                        |
|                                      |
| Office: SB1 / 00-213                 |
| Phone:  (+49)6131 / 39-29605         |
----------------------------------------


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2014-10-10  8:09 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-12  7:51 Writing socketCAN module for my own hardware Florian Feldbauer
2014-08-12  8:24 ` Marc Kleine-Budde
2014-08-12  8:57   ` Florian Feldbauer
2014-08-12 10:01     ` Marc Kleine-Budde
2014-10-01  7:26       ` Florian Feldbauer
2014-10-01  7:49         ` Marc Kleine-Budde
2014-10-01 12:32           ` Florian Feldbauer
2014-10-01 12:41             ` Marc Kleine-Budde
2014-10-01 12:56               ` Florian Feldbauer
2014-10-01 13:11                 ` Marc Kleine-Budde
2014-10-09 15:06               ` Florian Feldbauer
2014-10-09 16:13                 ` Marc Kleine-Budde
2014-10-10  7:43                   ` Florian Feldbauer
2014-10-10  8:06                     ` Marc Kleine-Budde
2014-10-10  8:09                       ` Florian Feldbauer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.