Driver for hardware IO port
13 Jan 2014 13:54 #42679
by mariusl
Regards
Marius
www.bluearccnc.com
Driver for hardware IO port was created by mariusl
Hi All,
I have to write a driver that will access a hardware port on a industrial motherboard. I think the chipset is a winbond device of sorts. I have the input and output address of the port.
I looked at the opto_ac5 hal driver as an example. It would seem to be the only simple driver that does a similar job.
I noticed that the following functions are available for the component but I dont see them in the code. What am I missing?
This is from the document
And this in the code
Am i looking in the right place or is there another way to get a base thread component going?
I have to write a driver that will access a hardware port on a industrial motherboard. I think the chipset is a winbond device of sorts. I have the input and output address of the port.
I looked at the opto_ac5 hal driver as an example. It would seem to be the only simple driver that does a similar job.
I noticed that the following functions are available for the component but I dont see them in the code. What am I missing?
This is from the document
opto_ac5.0.digital-read - Add this to a thread to read all the input points.
opto_ac5.0.digital-write - Add this to a thread to write all the output points and LEDs.
And this in the code
// These methods are exported to the HAL.
static void Device_DigitalInRead(void *this, long period);
static void Device_DigitalOutWrite(void *this, long period);
Am i looking in the right place or is there another way to get a base thread component going?
Regards
Marius
www.bluearccnc.com
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:02 #42680
by cmorley
Replied by cmorley on topic Driver for hardware IO port
They are in the code:
Chris M
// here we read inputs from board
// we read the current data (variable 'pins') of the first port. Then for each of the 24 points
// we compare to the mask of the first port to see which of the 24 io points are inputs (the bits that are false)
// if it is an input then check 'pins' against the mask to see if input bit is true
// update the HAL pin and not-pin accoringly. shift the mask then do the next point (of 24 io points)
// after all pins done-increase 'portnum' to 1 set offset to the offset for port1
// then do it all again on the second port
static void
Device_DigitalInRead(void *arg, long period)
{
board_data_t *pboard = (board_data_t *)arg;
DigitalPinsParams *pDigital;
int i, portnum=0;
unsigned long pins, offset=DATA_READ_OFFSET_0, mask;
// For each port.
while (portnum<2)
{
mask=1;
pDigital = &pboard->port[portnum].io[0];
// Read digital I/O register.
pins= readl (pboard->base + (offset));
for(i = 0; i < 24; i++,pDigital++)
{
if ((pboard->port[portnum].mask & mask) ==0) // is it an input bit ?
{
if ((pins & mask) !=0){ *(pDigital->pValue) =0;
}else{ *(pDigital->pValue) = 1; }
// Update not pin.
*(pDigital->pValueNot) = !*(pDigital->pValue);
}
mask <<=1;// shift mask
}
portnum++;
offset=DATA_READ_OFFSET_1;// change to offset for port1
}
}
Chris M
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:07 - 13 Jan 2014 15:09 #42681
by cmorley
Replied by cmorley on topic Driver for hardware IO port
Or maybe you are wondering where the pins are made:
// we check each ports mask (port[portnum].mask) against a mask bit to see which of the 24 points of i/o are inputs (a false bit is an input)
// then export HAL pins mapped to the proper io structure
// HAL pin numbers represent position in an opto22 relay rack (eg. pin 00 is position 0)
// this way you can configure the i/o in any way for all the 24 points of each port
static int Device_ExportDigitalInPinsParametersFunctions(board_data_t *this, int comp_id, int boardId)
{
int halError=0, channel,mask,portnum=0;
char name[HAL_NAME_LEN + 1];
// Export pins and parameters.
while (portnum<2)
{
mask=1;
for(channel = 0; channel < 24; channel++)
{
if ((this->port[portnum].mask & mask)==0)//physical input?
{
// Pins.
if((halError = hal_pin_bit_newf(HAL_OUT, &(this->port[portnum].io[channel].pValue),
comp_id, "opto-ac5.%d.port%d.in-%02d", boardId, portnum, channel)) != 0)
break;
if((halError = hal_pin_bit_newf(HAL_OUT, &(this->port[portnum].io[channel].pValueNot),
comp_id, "opto-ac5.%d.port%d.in-%02d-not", boardId, portnum, channel)) != 0)
break;
// Init pin.
*(this->port[portnum].io[channel].pValue) = 0;
*(this->port[portnum].io[channel].pValueNot) = 1;
}
mask <<=1;
}
portnum ++;
}
// Export functions.
if(!halError){
rtapi_snprintf(name, sizeof(name), "opto-ac5.%d.digital-read", boardId);
halError = hal_export_funct(name, Device_DigitalInRead, this, 0, 0, comp_id);
}
if(halError){
rtapi_print_msg(RTAPI_MSG_ERR, "ERROR OPTO22_AC5---exporting digital inputs to HAL failed\n");
return(-1);
}
return(0);
}
Last edit: 13 Jan 2014 15:09 by cmorley.
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:11 #42682
by mariusl
Regards
Marius
www.bluearccnc.com
Replied by mariusl on topic Driver for hardware IO port
Hi Chris
Thanks for answering quick. I did see the code but what I dont understand is the difference in syntax between the declaration and the exported function.
Thanks for answering quick. I did see the code but what I dont understand is the difference in syntax between the declaration and the exported function.
Regards
Marius
www.bluearccnc.com
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:22 #42684
by cmorley
Replied by cmorley on topic Driver for hardware IO port
I'm sorry I'm not a good C programmer and I made that program 8 years ago using the skeleton example mostly.
This part of the code ties the pin name to the function call to service it.
Chris M
// Export functions.
if(!halError){
rtapi_snprintf(name, sizeof(name), "opto-ac5.%d.digital-read", boardId);
halError = hal_export_funct(name, Device_DigitalInRead, this, 0, 0, comp_id);
}
This part of the code ties the pin name to the function call to service it.
Chris M
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:28 #42685
by mariusl
Regards
Marius
www.bluearccnc.com
Replied by mariusl on topic Driver for hardware IO port
Chris
I see it now. It is my complete lack of understanding in this area of LCNC.
Where do I find the skeleton for this kind of work?
I see it now. It is my complete lack of understanding in this area of LCNC.
Where do I find the skeleton for this kind of work?
Regards
Marius
www.bluearccnc.com
Please Log in or Create an account to join the conversation.
13 Jan 2014 15:39 #42686
by cmorley
Replied by cmorley on topic Driver for hardware IO port
It takes a bit to get your head around it.
Some driver building docs would be a good addition to the manual....
hal_skeleton.c is in src/hal/drivers
If you are comfortable with building components with comp, look at pcl720.comp (for an ISA card)
Andy made that one so he will probably comment if you have questions about it.
Comp hides some of the RTAI details.
Chris M
Some driver building docs would be a good addition to the manual....
hal_skeleton.c is in src/hal/drivers
If you are comfortable with building components with comp, look at pcl720.comp (for an ISA card)
Andy made that one so he will probably comment if you have questions about it.
Comp hides some of the RTAI details.
Chris M
Please Log in or Create an account to join the conversation.
13 Jan 2014 16:12 #42688
by mariusl
Regards
Marius
www.bluearccnc.com
Replied by mariusl on topic Driver for hardware IO port
I have done several components using Comp so I will go that way. Thanks for the help so far.
For interest sake, how do you do the compile with your C type of component? I mean the make process outside of the source tree while you are writing and testing it.
For interest sake, how do you do the compile with your C type of component? I mean the make process outside of the source tree while you are writing and testing it.
Regards
Marius
www.bluearccnc.com
Please Log in or Create an account to join the conversation.
13 Jan 2014 17:16 #42691
by cmorley
Replied by cmorley on topic Driver for hardware IO port
comp can compile C source.
www.linuxcnc.org/docs/2.5/html/hal/comp....-realtime-components
I did it by adding to the make file. I haven't made a realtime driver in a long time.
Chris M
www.linuxcnc.org/docs/2.5/html/hal/comp....-realtime-components
I did it by adding to the make file. I haven't made a realtime driver in a long time.
Chris M
Please Log in or Create an account to join the conversation.
13 Jan 2014 17:47 #42692
by mariusl
Regards
Marius
www.bluearccnc.com
Replied by mariusl on topic Driver for hardware IO port
Thanks Chris.
I just received a shared library for my DIO port from the supplier. Can I use shared libraries in components?
I just received a shared library for my DIO port from the supplier. Can I use shared libraries in components?
Regards
Marius
www.bluearccnc.com
Please Log in or Create an account to join the conversation.
Time to create page: 0.080 seconds