Страница 1 из 19
PCI контроллер. Halcompail и драйвер.
Добавлено: 19 июн 2015, 01:00
T00T
Доброго всем времени суток.
В EMC есть такая возможность - добавить модуль HAL.
Вот у меня назрела такая необходимость.
И нужно добавить драйвер устройства.
Итак, что сделано:
Установлен Linuxcnc-dev. Создал файл драйвера, ну пока он просто содран с драйвера evoreg, который есть в исходниках. В нём нет пока ничего для железа, но работать он тоже не хочет.
Т.е. я говорю о том, что в драйвере пока только функции HAL.
Ну м прописал его в ini и hal
При компиляции 1 warning:
Код: Выделить всё
vladimir@desktop:~$ sudo halcompile --install to_pci.c
[sudo] password for vladimir:
make KBUILD_EXTRA_SYMBOLS=/usr/realtime-2.6.32-122-rtai/modules/linuxcnc/Module.symvers -C /usr/src/linux-headers-2.6.32-122-rtai SUBDIRS=`pwd` CC=gcc V=0 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-122-rtai'
CC [M] /tmp/tmpCNpiHe/to_pci.o
/tmp/tmpCNpiHe/to_pci.c: In function ‘init_module’:
/tmp/tmpCNpiHe/to_pci.c:89: warning: assignment makes integer from pointer without a cast
Building modules, stage 2.
MODPOST 1 modules
CC /tmp/tmpCNpiHe/to_pci.mod.o
LD [M] /tmp/tmpCNpiHe/to_pci.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-122-rtai'
cp to_pci.ko /usr/realtime-2.6.32-122-rtai/modules/linuxcnc/
Есть идеи?
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 01:55
Lexxa
эт ты к чему драйвер прикручивать надумал?
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 02:00
Serg
T00T писал(а):/tmp/tmpCNpiHe/to_pci.c:89: warning: assignment makes integer from pointer without a cast
Какое слово тебе перевести?
Я б посоветовал начать с учебника по языку C...
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 02:20
T00T
Тупанул, не на то описание функций hala поглядел, короче возвращает не ошибку..

Поздно уже просто......
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 02:22
T00T
Lexxa писал(а):эт ты к чему драйвер прикручивать надумал?
Есть идеи кое какие....
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 02:49
T00T
UAVpilot писал(а):T00T писал(а):/tmp/tmpCNpiHe/to_pci.c:89: warning: assignment makes integer from pointer without a cast
Какое слово тебе перевести?
Я б посоветовал начать с учебника по языку C...
Спасибо, за совет, воспользовался учебником, в общем скомпилилось всё на ура.
Теперь такой вопрос:
Функцию update_port нужно прописывать в хале.
В общем если не прописываешь то оболочка EMC запускается, а если прописать - то ошибка, мол не находит её.
Код: Выделить всё
Debug file information:
Can not find -sec RS274NGC -var PARAMETER_FILE -num 1
HAL: ERROR: function 'update_port' not found
./my.hal:13: addf failed
2222
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components
Kernel message information:
[ 412.866652] I-pipe: Domain RTAI registered.
[ 412.866670] RTAI[hal]: <3.8.1> mounted over IPIPE-NOTHREADS 2.6-03.
[ 412.866674] RTAI[hal]: compiled with gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) .
[ 412.866682] RTAI[hal]: mounted (IPIPE-NOTHREADS, IMMEDIATE (INTERNAL IRQs DISPATCHED), ISOL_CPUS_MASK: 0).
[ 412.866685] PIPELINE layers:
[ 412.866690] d3bd4e20 9ac15d93 RTAI 200
[ 412.866693] c085cb20 0 Linux 100
[ 412.961120] RTAI[malloc]: global heap size = 2097152 bytes, <BSD>.
[ 412.961447] RTAI[sched]: IMMEDIATE, MP, USER/KERNEL SPACE: <with RTAI OWN KTASKs>, kstacks pool size = 524288 bytes.
[ 412.961453] RTAI[sched]: hard timer type/freq = APIC/16744223(Hz); default timing: periodic; linear timed lists.
[ 412.961458] RTAI[sched]: Linux timer freq = 250 (Hz), TimeBase freq = 1808360000 hz.
[ 412.961461] RTAI[sched]: timer setup = 999 ns, resched latency = 2944 ns.
[ 412.962348] RTAI[usi]: enabled.
[ 413.177572] RTAI[math]: loaded.
[ 416.083698] RTAI[math]: unloaded.
[ 416.193878] SCHED releases registered named ALIEN RTGLBH
[ 416.210361] RTAI[malloc]: unloaded.
[ 416.308022] RTAI[sched]: unloaded (forced hard/soft/hard transitions: traps 0, syscalls 0).
[ 416.314664] I-pipe: Domain RTAI unregistered.
[ 416.314679] RTAI[hal]: unmounted.
И ещё вопрос - в модуле ядра выводятся сообщения, типа
rtapi_print_msg(RTAPI_MSG_INFO,"to_pci: installed driver for %d card(s)\n", num_ports);
Где их можно просматривать, для отладки очень надо......
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 08:04
Serg
T00T писал(а):Функцию update_port нужно прописывать в хале.
Не знает HAL о ней ничего, потому и ругается.
Возможно это прозвучит жестоко, но без чтения документации и без понимания что-же именно ты понаписал в to_pci.c тут никак не обойтись...
T00T писал(а):И ещё вопрос - в модуле ядра выводятся сообщения, типа
rtapi_print_msg(RTAPI_MSG_INFO,"to_pci: installed driver for %d card(s)\n", num_ports);
Где их можно просматривать, для отладки очень надо......
Этим заведует DEBUG в ini, но там тоже всё не просто.
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 12:46
T00T
UAVpilot писал(а):
Не знает HAL о ней ничего, потому и ругается.
Этим заведует DEBUG в ini, но там тоже всё не просто.
В общем то уже знает, и не ругается.

В axis выводиться в нижнем углу сообщение "NoneType" object has no attribute 'rfind'.
Это он к чему?
И да я понимаю что где то об этом можно прочитать. Если бы я знал где именно, то прочитал бы.
UAVpilot писал(а):
Этим заведует DEBUG в ini, но там тоже всё не просто.
Оказалось в первый раз всё просто, я думаю что и тут всё просто....
Ну да ладно...
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 13:17
Nick
Вообще проще всего проверять компонент так:
1. запускаешь halrun
2. туда пишешь loadrt твой компонент.
3. смотришь, что появилось.
Потом по мере надобности дополняешь loadrt всякими addf и прочим.
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 13:59
T00T
Я вот пока не знаю что такое Halrun, надо опять искать описание.....
Я правильно понимаю Запускается хал компонент добавляется rt компонент и функции. И типа всё без EMC работает.
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 14:06
Nick
Это команада запускает hal, туда можно писать команды hal (строки из hal файла).
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 14:08
T00T
Вот я пока не понял как в функцию аргументы прописывать
типа говорит требуется 2 аргумента
Re: Halcompail и драйвер.
Добавлено: 19 июн 2015, 14:11
T00T
Вопрос то остаётся как просматривать диагностические сообщения из ядра при работе модуля - очень надо для отладки.
Пока нашё вот такой способ - проще выводить через printk(). И через dmesg глядеть, конечно не удобно но как есть
В общем уже : dmesg: to_pci: installed driver for 1 card(s). Адреса устройства читаются верно

едем дальше!!!!!!!!!!!!!!!
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 01:18
T00T
В общем то пока актуальных вопросов 2.
Знатоки си подскажите......
Первый вопрос такой:
объявление структуры данных такое и выделение под него памяти
Код: Выделить всё
typedef struct {
void *mem_base;
__u32 io_base;
int len;
hal_bit_t *digital_in[32]; /* ptrs for digital input pins 0 - 31 */
hal_bit_t *digital_out[32]; /* ptrs for digital output pins 0 - 31 */
} to_pci_t;
/* pointer to array of evoreg_t structs in shared memory, 1 per port */
static to_pci_t *device_data;
...................
device_data = hal_malloc(num_ports * sizeof(to_pci_t));
if (device_data == 0) {
rtapi_print_msg(RTAPI_MSG_ERR,"to_pci: ERROR: hal_malloc() failed\n");
r = -1;
goto fail0;
}
Тут без вопросов.
Передаём пины in в хал.
Код: Выделить всё
for ( i=0; i<=31;i++) {
retval = hal_pin_bit_newf(HAL_OUT, &(device_data->digital_in[i]),
comp_id, "to_pci.%d.pin-%02d-in", 1, i);
функция которая опрашивает пины.
Код: Выделить всё
void update_port(void *arg, long period){
to_pci_t *port;
__u32 tmp,mask;
int pin;
port = arg;
// read digital inputs
tmp=*((__u32*)ttmp);
mask = 0x00000001;
for (pin=0 ; pin < 31 ; pin++) {
*(port->digital_in[pin]) = (tmp & mask) ? 1:0 ;
mask <<= 1;
}
}
ttmp - адрес ячейки откуда данные надо брать
В переменную tmp данные поступают верно!!!!!
Косяк вот тут:
*(port->digital_in[pin]) = (tmp & mask) ? 1:0 ;
По моему написано всё верно.
Компилиться без ошибок и варнингов.
Если эту функцию убрать, то AXIS запускается, и идёт постоянное обращение к устройству, но соответственно данные не передаются.
Если убрать звёздочку то варнинг - типа не тот тип данных... AXIS запускается, и идёт постоянное обращение к устройству, данных уже и не может быть.
А если эту функцию поставить то EMC начинает загружаться, происходит первое обращение к устройству и.......
Всё рухнулось
Код: Выделить всё
Print file information:
RUN_IN_PLACE=no
LINUXCNC_DIR=
LINUXCNC_BIN_DIR=/usr/bin
LINUXCNC_TCL_DIR=/usr/lib/tcltk/linuxcnc
LINUXCNC_SCRIPT_DIR=
LINUXCNC_RTLIB_DIR=/usr/realtime-2.6.32-122-rtai/modules/linuxcnc
LINUXCNC_CONFIG_DIR=
LINUXCNC_LANG_DIR=/usr/share/linuxcnc/tcl/msgs
INIVAR=inivar
HALCMD=halcmd
LINUXCNC_EMCSH=/usr/bin/wish8.5
LINUXCNC - 2.8.0-pre1-693-g65603e7
Machine configuration directory is '/home/vladimir/linuxcnc/configs/my-conf'
Machine configuration file is 'my.ini'
INIFILE=/home/vladimir/linuxcnc/configs/my-conf/my.ini
PARAMETER_FILE=
TASK=milltask
HALUI=
DISPLAY=axis
Starting LinuxCNC...
Starting LinuxCNC server program: linuxcncsvr
Loading Real Time OS, RTAPI, and HAL_LIB modules
Starting LinuxCNC IO program: io
Found file:./my.hal
Starting TASK program: milltask
Starting DISPLAY program: axis
USRMOT: ERROR: command timeout
USRMOT: ERROR: command timeout
USRMOT: ERROR: command timeout
USRMOT: ERROR: command timeout
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
waiting for s.axes
Shutting down and cleaning up LinuxCNC...
USRMOT: ERROR: command timeout
Killing task linuxcncsvr, PID=7314
Killing task milltask, PID=7352
USRMOT: ERROR: command timeout
USRMOT: ERROR: command timeout
Timeout, trying kill -9
Removing HAL_LIB, RTAPI, and Real Time OS modules
Removing NML shared memory segments
Debug file information:
Can not find -sec RS274NGC -var PARAMETER_FILE -num 1
Waiting for component 'inihal' to become ready...................................A configuration error is preventing LinuxCNC from starting.
More information may be available when running from a terminal.
...7314
. PID TTY STAT TIME COMMAND
7352
PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
.. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
.. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
.. PID TTY STAT TIME COMMAND
7352 ? S 0:00 milltask -ini /home/vladimir/linuxcnc/configs/my-conf/my.ini
.
<commandline>:0: milltask exited without becoming ready
PID TTY STAT TIME COMMAND
Stopping realtime threads
Unloading hal components
Kernel message information:
[ 6851.911482] I-pipe: Domain RTAI registered.
[ 6851.911498] RTAI[hal]: <3.8.1> mounted over IPIPE-NOTHREADS 2.6-03.
[ 6851.911502] RTAI[hal]: compiled with gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) .
[ 6851.911510] RTAI[hal]: mounted (IPIPE-NOTHREADS, IMMEDIATE (INTERNAL IRQs DISPATCHED), ISOL_CPUS_MASK: 0).
[ 6851.911513] PIPELINE layers:
[ 6851.911517] f9c1ce20 9ac15d93 RTAI 200
[ 6851.911520] c085cb20 0 Linux 100
[ 6851.948897] RTAI[malloc]: global heap size = 2097152 bytes, <BSD>.
[ 6851.949141] RTAI[sched]: IMMEDIATE, MP, USER/KERNEL SPACE: <with RTAI OWN KTASKs>, kstacks pool size = 524288 bytes.
[ 6851.949147] RTAI[sched]: hard timer type/freq = APIC/16744233(Hz); default timing: periodic; linear timed lists.
[ 6851.949152] RTAI[sched]: Linux timer freq = 250 (Hz), TimeBase freq = 1808525000 hz.
[ 6851.949155] RTAI[sched]: timer setup = 999 ns, resched latency = 2943 ns.
[ 6851.949331] RTAI[usi]: enabled.
[ 6852.104947] RTAI[math]: loaded.
[ 6852.221876] to_pci: io_base: E2000000, mem_base: f9406000
[ 6852.222191] to_pci: installed driver for 1 card(s)
[ 6852.255359] RTAPI: Task 1[f3faf800]: Fault with vec=14, signo=11 ip=f93f602a.
[ 6852.255365] RTAPI: This fault may not be recoverable without rebooting.
[ 6861.087174] to_pci: exit
[ 6863.381923] RTAI[math]: unloaded.
[ 6863.484825] SCHED releases registered named ALIEN RTGLBH
[ 6863.501744] RTAI[malloc]: unloaded.
[ 6863.600020] RTAI[sched]: unloaded (forced hard/soft/hard transitions: traps 0, syscalls 0).
[ 6863.606360] I-pipe: Domain RTAI unregistered.
[ 6863.606374] RTAI[hal]: unmounted.
В чём косяк
[ 6852.255359] RTAPI: Task 1[f3faf800]: Fault with vec=14, signo=11 ip=f93f602a.
[ 6852.255365] RTAPI: This fault may not be recoverable without rebooting.
Что то не туда пишется походу....
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 09:44
Serg
T00T писал(а):Тут без вопросов.
Кроме одного: где память по сами пины?
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 10:42
T00T
Код: Выделить всё
device_data = hal_malloc(num_ports * sizeof(to_pci_t));
Тут место под структуру выделяю, и передаю значение в указатель структуры.(Ну а в ней пины!!!!)
hal_malloc() allocates a block of memory from the main HAL
shared memory area. It should be used by all components to
allocate memory for HAL pins and parameters.
It allocates 'size' bytes, and returns a pointer to the
allocated space, or NULL (0) on error.
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 10:59
nkp
эту функцию в хал прописывать не требуется?
"skeleton.%d.write", n
вроде как в примере :
Pin: 'skeleton.<portnum>.pin-<pinnum>-out'
Function: 'skeleton.<portnum>.write'
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 11:29
T00T
Ну чтоб таких вопросов не возникало.
Код:
Код: Выделить всё
#include "rtapi_ctype.h" /* isspace() */
#include "rtapi.h" /* RTAPI realtime OS API */
#include "rtapi_app.h" /* RTAPI realtime module decls */
#include "hal.h" /* HAL public API decls */
#include <linux/types.h>
/* module information */
MODULE_AUTHOR("");
MODULE_DESCRIPTION("");
MODULE_LICENSE("GPL");
/***********************************************************************
* STRUCTURES AND GLOBAL VARIABLES *
************************************************************************/
typedef struct {
void *mem_base;
__u32 io_base;
int len;
hal_bit_t *digital_in[32]; /* ptrs for digital input pins 0 - 31 */
hal_bit_t *digital_out[32]; /* ptrs for digital output pins 0 - 31 */
} to_pci_t;
/* pointer to array of to_pci_t structs in shared memory, 1 per port */
static to_pci_t *device_data;
/* other globals */
static int comp_id; /* component ID */
static int num_ports; /* number of ports configured */
/***********************************************************************
* LOCAL FUNCTION DECLARATIONS *
************************************************************************/
static void update_port(void *arg, long period);
/***********************************************************************
* INIT AND EXIT CODE *
************************************************************************/
#define driver_NAME "to_pci"
int rtapi_app_main(void)
{
char name[HAL_NAME_LEN + 1];
int n,i,r ;
int retval=0;
/* only one port at the moment */
num_ports = 1;
n = 0;
/* STEP 1: initialise the driver */
comp_id = hal_init(driver_NAME);
if (comp_id < 0) {
rtapi_print_msg(RTAPI_MSG_ERR,"to_pci: ERROR: hal_init() failed\n");
return -1;
}
/* STEP 2: allocate shared memory for to_hal data */
device_data = hal_malloc(num_ports * sizeof(to_pci_t));
if (device_data == 0) {
rtapi_print_msg(RTAPI_MSG_ERR,"to_pci: ERROR: hal_malloc() failed\n");
r = -1;
goto fail0;
}
//////////////////////
/* Export IO pin's */
/* export write only HAL pin's for the input bit */
for ( i=0; i<=31;i++) {
retval = hal_pin_bit_newf(HAL_OUT, &(device_data->digital_in[i]),
comp_id, "to_pci.%d.pin-%02d-in", 1, i);
if (retval < 0) {
rtapi_print_msg(RTAPI_MSG_ERR, "to_pci: ERROR: port %d var export failed with err=%i\n", n + 1,retval);
r = -1;
goto fail1;
}
}
/* export read only HAL pin for the output bit */
for ( i=0; i<=31;i++) {
retval += hal_pin_bit_newf(HAL_IN, &(device_data->digital_out[i]),
comp_id, "to_pci.%d.pin-%02d-out", 1, i);
if (retval < 0) {
rtapi_print_msg(RTAPI_MSG_ERR,"to_pci: ERROR: port %d var export failed with err=%i\n", n + 1,
retval);
r = -1;
goto fail1;
}
}
/* STEP 4: export function */
rtapi_snprintf(name, sizeof(name), "to_pci.%d.update", n + 1);
retval = hal_export_funct(name, update_port, &device_data, 1, 0,
comp_id);
if (retval < 0) {
rtapi_print_msg(RTAPI_MSG_ERR,"to_pci: ERROR: port %d write funct export failed\n", n + 1);
r = -1;
goto fail1;
}
rtapi_print_msg(RTAPI_MSG_INFO,"to_pci: installed driver for %d card(s)\n", num_ports);
printk(KERN_ALERT "to_pci: installed driver for %d card(s)\n", num_ports);
hal_ready(comp_id);
return 0;
fail1:
fail0:
hal_exit(comp_id);
return r;
}
void rtapi_app_exit(void)
{
hal_exit(comp_id);
printk(KERN_ALERT "to_pci: exit\n");
}
/**************************************************************
* REALTIME PORT WRITE FUNCTION *
**************************************************************/
void update_port(void *arg, long period){
to_pci_t *port;
__u32 tmp,mask;
int pin;
port = arg;
// read digital inputs
tmp= 0x000000AA;
mask = 0x00000001;
for (pin=0 ; pin < 31 ; pin++) {
*(port->digital_in[pin]) = (tmp & mask) ? 1:0 ;
mask <<= 1;
}
}
В общем сий драйвер должен просто передать число 0x000000AA на пины, но нет!!! Ошибка в этом месте *(port->digital_in[pin]) = (tmp & mask) ? 1:0 ;
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 11:49
nkp
T00T писал(а):Ну чтоб таких вопросов не возникало.
я лишь хотел обратить внимание на следующий момент:
в хал функция прописана как
addf update_port servo-thread
вот я засомневался в синтаксисе...
экспорт прописан же как
to_pci.%d.update
Re: Halcompail и драйвер.
Добавлено: 20 июн 2015, 12:04
T00T
Да, да спасибо, уже разобрались в 8 посте.

просто не стал исправленный хал приводить.
Сейчас непонятки в передаче значения пинам.....