Hello,
The program included in this email compiles and runs on my beagleboard
xm. The compiler gives no warnings or anything.
Once I prepend an ioctl call with rt_dev_, I get the following
david@david-HP-TouchSmart-tm2-Notebook-PC:~/06-21-2011-xenomai-spi$
arm-none-linux-gnueabi-gcc -o xenomai-spi-eth-00002 $CFLAGS
xenomai-spi-eth-00002.c $LDFLAGS -I
/home/david/122720101858-beagleboard-working-set/kernel/linux/include/
/tmp/cc9aLEWN.o: In function `main':
xenomai-spi-eth-00002.c:(.text+0x334): undefined reference to `rt_dev_ioctl'
collect2: ld returned 1 exit status
I'm perplexed because as I understand it including rtdm/rtdm.h should
allow the function rt_dev_ioctl to be used.
In a previous email I received, it was suggested I change the skin to
rtdm. I set both skin to rtdm. This gave me a different set of errors
referencing rt_task_set_periodic and the like.
Thanks for reading this,
Sincerely,
David
CFLAGS=`DESTDIR=/home/david/sdir
/home/david/sdir/usr/xenomai/bin/xeno-config --skin native --cflags`
LDFLAGS=`DESTDIR=/home/david/sdir
/home/david/sdir/usr/xenomai/bin/xeno-config --skin native --ldflags`
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <sys/mman.h>
#include <getopt.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <native/task.h>
#include <native/timer.h>
#include <native/pipe.h>
#include <rtdk.h>
#include <rtdm/rtipc.h>
#include <rtdm/rtdm.h>
#include <rtdm/rtcan.h>
RT_TASK blink_task;
#define TIMESLEEP 1000000 /* 1 msec(ns) */
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
#define PORT 8080
#define HOST "192.168.1.101"
#define DIRSIZE 8192
#define HIGH 1
#define LOW 0
#define HIGH_TIME 12
#define LOW_TIME 1
#define TIME_USEC 0
static const char *device = "/dev/spidev3.0";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 11000000;
//static uint16_t delay=1;
int fd;
FILE *fp;
FILE *fpx;
char set_value[4];
int state;
int ret = 0;
//struct sockaddr_in sin;
struct sockaddr_in pin;
struct hostent *hp;
int sd;
char hostname[100];
char return_array[400];
int i;
void blink(void *arg __attribute__((__unused__)))
{
uint8_t tx[] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = TIME_USEC,
.speed_hz = speed,
.bits_per_word = bits,
};
rt_task_set_periodic(NULL, TM_NOW, TIMESLEEP);
if (ret == -1)
printf("can't set spi mode");
while(1)
{
rt_task_wait_period(NULL);
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
for(i = 0;i < 360;i++)
{
return_array[i] = 68;
}
return_array[359] = 0;
if (ret < 1)
printf("can't send spi message");
if (send(sd, return_array, strlen(return_array), 0) == -1)
{
perror("send");
exit(1);
}
}
}
void catch_signal() {}
int main(void)
{
signal(SIGTERM, catch_signal);
signal(SIGINT, catch_signal);
/* Avoids memory swapping for this program */
mlockall(MCL_CURRENT|MCL_FUTURE);
fd = open(device, O_RDWR);
// fd = rt_dev_open(device, O_RDWR);
if (fd < 0)
printf("can't open device");
mode |= SPI_CPHA;
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
printf("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
printf("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
printf("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
printf("can't get max speed hz");
/************************************************/
/* Ethernet stuff */
/************************************************/
strcpy(hostname,"192.168.0.101");//HOST);
/* go find out about the desired host machine */
if ((hp = gethostbyname(hostname)) == 0)
{
perror("gethostbyname");
exit(1);
}
/* fill in the socket structure with host information */
memset(&pin, 0, sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
pin.sin_port = htons(PORT);
/* grab an Internet domain socket */
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
exit(1);
}
/* connect to PORT on HOST */
if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1)
{
perror("connect");
exit(1);
}
/* Task Creation */
rt_task_create(&blink_task, "blinkLed", 0, 99, 0);
rt_task_start(&blink_task, &blink, NULL);
getchar();
rt_task_delete(&blink_task);
close(fd);
return 0;
}
_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help