# CAN IoT Card driver

**URL:** <https://mangoh.discourse.group/t/can-iot-card-driver/997>\
**Category:** mangOH Red\
**Created:** [December 16, 2017, 12:44pm UTC](https://mangoh.discourse.group/t/can-iot-card-driver/997 "2017-12-16T12:44:54Z")\
**Posts on this page:** 1\
**Showing post:** 44

<div class="post-metadata">

**Author:** ![Naej](https://avatars.discourse-cdn.com/v4/letter/n/bc8723/32.png) [@Naej](https://mangoh.discourse.group/u/Naej)\
**Post date:** [March 28, 2019, 12:35pm UTC](https://mangoh.discourse.group/t/can-iot-card-driver/997/44 "2019-03-28T12:35:16Z")

</div>

Hi,  
I got a mangOH red board with the Talon CAN IoT board. Is there a simple (working ;-]) read example? I’ve tried the @Francis.duhaut code and it won’t compile. I also tried the KillSwitch Example compile but did not works. So I made a simple read code:

#include “legato.h”  
#include “interfaces.h”

#include \<stdio.h\>  
#include \<string.h\>  
#include \<fcntl.h\>  
#include \<sys/ioctl.h\>  
#include \<net/if.h\>  
#include \<linux/can.h\>  
#include \<linux/can/raw.h\>

int soc;  
int read\_can\_port;

int open\_port(const char \*port)  
{  
struct ifreq ifr;  
struct sockaddr\_can addr;

```
/* open socket */
soc = socket(PF_CAN, SOCK_RAW, CAN_RAW);
if(soc < 0)
{
    return (-1);
}

addr.can_family = AF_CAN;
strcpy(ifr.ifr_name, port);

if (ioctl(soc, SIOCGIFINDEX, &ifr) < 0)
{

    return (-1);
}

addr.can_ifindex = ifr.ifr_ifindex;

fcntl(soc, F_SETFL, O_NONBLOCK);

if (bind(soc, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{

    return (-1);
}
LE_INFO("CAN Is Set");
return 0;

```

}

void read\_port()  
{  
LE\_INFO(“Enter Read Function”);  
struct can\_frame frame\_rd;  
int recvbytes = 0;

```
read_can_port = 1;
while(read_can_port)
{
    printf("Read ... recv:%d\n", recvbytes);
    struct timeval timeout = {1, 0};
    
    fd_set readSet;
    FD_ZERO(&readSet);
    FD_SET(soc, &readSet);

    if (select((soc + 1), &readSet, NULL, NULL, &timeout) >= 0)
    {
        if (!read_can_port)
        {
            LE_INFO("Nothing Received");
            break;
        }
        if (FD_ISSET(soc, &readSet))
        {
            LE_INFO("Something Received");
            recvbytes = read(soc, &frame_rd, sizeof(struct can_frame));
            if(recvbytes)
            {
                LE_INFO("Can Received");
                printf("dlc = %d, data = %s\n", frame_rd.can_dlc,frame_rd.data);

            }
        }
    }

}

```

}

int close\_port()  
{  
close(soc);  
return 0;  
}

COMPONENT\_INIT  
{  
LE\_INFO(“Open Port”);  
open\_port(“can0”);  
LE\_INFO(“Close Port”);  
close\_port();  
LE\_INFO(“ReOpen Port”);  
open\_port(“can0”);  
LE\_INFO(“Read CAN”);  
read\_port();  
LE\_INFO(“Quit App”);  
}

It compile, I launch the shell script before running app but i got this error:

swi-mdm9x28-wp user.notice kernel: [96.220890] audit: type=1400 audit(315964898.251:4): lsm=SMACK fn=smack\_inode\_getattr action=denied subject=“app.testCan” object=“admin” requested=r pid=1952 comm=“testCan” path=“pipe:[9211]” dev=“pipefs” ino=9211

Any Idea on what appends? Or better a simple working example? Does someone have reached add a can-utils layer in the yocto configuration? It also lacks a lot of documentation about it.

---

_[View the full topic](https://mangoh.discourse.group/t/can-iot-card-driver/997)._
