PCI контроллер. Halcompail и драйвер.

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

PCI контроллер. Halcompail и драйвер.

Сообщение 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/
Есть идеи?
Вложения
aa.rar
конфиг, ошибки, код драйвера
(6.92 КБ) 668 скачиваний
Последний раз редактировалось T00T 06 май 2016, 11:42, всего редактировалось 2 раза.
Я не волшебник я пока учусь......
Аватара пользователя
Lexxa
Мастер
Сообщения: 2703
Зарегистрирован: 16 дек 2011, 16:48
Репутация: 319
Настоящее имя: Алексей
Откуда: ryazan
Контактная информация:

Re: Halcompail и драйвер.

Сообщение Lexxa »

эт ты к чему драйвер прикручивать надумал?
:bender:
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Halcompail и драйвер.

Сообщение Serg »

T00T писал(а):/tmp/tmpCNpiHe/to_pci.c:89: warning: assignment makes integer from pointer without a cast
Какое слово тебе перевести? :)

Я б посоветовал начать с учебника по языку C...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Тупанул, не на то описание функций hala поглядел, короче возвращает не ошибку.. :)
Поздно уже просто......
Я не волшебник я пока учусь......
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Lexxa писал(а):эт ты к чему драйвер прикручивать надумал?
Есть идеи кое какие....
Я не волшебник я пока учусь......
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение 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);
Где их можно просматривать, для отладки очень надо......
Я не волшебник я пока учусь......
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Halcompail и драйвер.

Сообщение 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, но там тоже всё не просто.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

UAVpilot писал(а): Не знает HAL о ней ничего, потому и ругается.
Этим заведует DEBUG в ini, но там тоже всё не просто.
В общем то уже знает, и не ругается. :)
В axis выводиться в нижнем углу сообщение "NoneType" object has no attribute 'rfind'.
Это он к чему?
И да я понимаю что где то об этом можно прочитать. Если бы я знал где именно, то прочитал бы.
UAVpilot писал(а): Этим заведует DEBUG в ini, но там тоже всё не просто.
Оказалось в первый раз всё просто, я думаю что и тут всё просто....
Ну да ладно...
Я не волшебник я пока учусь......
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Halcompail и драйвер.

Сообщение Nick »

Вообще проще всего проверять компонент так:
1. запускаешь halrun
2. туда пишешь loadrt твой компонент.
3. смотришь, что появилось.
Потом по мере надобности дополняешь loadrt всякими addf и прочим.
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Я вот пока не знаю что такое Halrun, надо опять искать описание.....
Я правильно понимаю Запускается хал компонент добавляется rt компонент и функции. И типа всё без EMC работает.
Последний раз редактировалось T00T 19 июн 2015, 14:07, всего редактировалось 1 раз.
Я не волшебник я пока учусь......
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Halcompail и драйвер.

Сообщение Nick »

Это команада запускает hal, туда можно писать команды hal (строки из hal файла).
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Вот я пока не понял как в функцию аргументы прописывать
типа говорит требуется 2 аргумента
Я не волшебник я пока учусь......
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Вопрос то остаётся как просматривать диагностические сообщения из ядра при работе модуля - очень надо для отладки.
Пока нашё вот такой способ - проще выводить через printk(). И через dmesg глядеть, конечно не удобно но как есть :)

В общем уже : dmesg: to_pci: installed driver for 1 card(s). Адреса устройства читаются верно :)
едем дальше!!!!!!!!!!!!!!!
Я не волшебник я пока учусь......
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение 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.

Что то не туда пишется походу....
Я не волшебник я пока учусь......
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

Re: Halcompail и драйвер.

Сообщение Serg »

T00T писал(а):Тут без вопросов.
Кроме одного: где память по сами пины?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение 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.
Я не волшебник я пока учусь......
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Halcompail и драйвер.

Сообщение nkp »

эту функцию в хал прописывать не требуется?
"skeleton.%d.write", n
вроде как в примере :
Pin: 'skeleton.<portnum>.pin-<pinnum>-out'
Function: 'skeleton.<portnum>.write'
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение 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 ;
Я не волшебник я пока учусь......
nkp
Мастер
Сообщения: 8340
Зарегистрирован: 28 ноя 2011, 00:25
Репутация: 1589
Контактная информация:

Re: Halcompail и драйвер.

Сообщение nkp »

T00T писал(а):Ну чтоб таких вопросов не возникало.
я лишь хотел обратить внимание на следующий момент:
в хал функция прописана как
addf update_port servo-thread
вот я засомневался в синтаксисе...
экспорт прописан же как
to_pci.%d.update
T00T
Мастер
Сообщения: 742
Зарегистрирован: 16 дек 2011, 12:07
Репутация: 100
Контактная информация:

Re: Halcompail и драйвер.

Сообщение T00T »

Да, да спасибо, уже разобрались в 8 посте. :) просто не стал исправленный хал приводить.
Сейчас непонятки в передаче значения пинам.....
Я не волшебник я пока учусь......
Ответить

Вернуться в «LinuxCNC»