Simple UART on Mesa 6i25 with 5i25 firmware

More
10 years 11 months ago #64871 by sirop
Hallo.

I am trying to add two UART pins to my pin out file, one Tx and one Rx.

But I can not guess which InstanceStride I have to use.

I looked through the pin out files of fivei25.xise and saw there InstanceStride equal to x"10" and x"00" .
Tried both but got errors when loading
Code:
loadrt hm2_pci
.
How to reproduce:

Case: InstanceStride= x"10"

Pin out file: gist.github.com/sirop/c6e2e610b75f3dfbf174
readhmid output: gist.github.com/sirop/3742fc5e7e165446f25e
/var/log/linuxcnc.log snippet: gist.github.com/sirop/8477e859200aae55c0f1

Case: InstanceStride= x"00"
Pin out file: gist.github.com/sirop/e29f68a04c4dd1bbc951
readhmid output: gist.github.com/sirop/8b50a12a3f9e161e197d
/var/log/linuxcnc.log snippet: gist.github.com/sirop/48b12eb98b1c50228199

I looked through this thread www.linuxcnc.org/index.php/english/forum...erna-library-and-api
as well as at the source code of hostmot2.c , but still it is hard to guess for me where I make a mistake.

Thanks for your attention.

Please Log in to join the conversation.

More
10 years 11 months ago #64882 by sirop
Just found this line
Code:
InstStride1: integer := 64; -- instance stride 1 = 64 bytes = 16 x 32 bit registers !! UARTS need 0x10
in TopPCIHostMot2.vhd .

So probably Case: InstanceStride= x"10" is correct and Case: InstanceStride= x"00" is not.

Will try to have a look at hostmot2.c ...

Please Log in to join the conversation.

More
10 years 11 months ago #64883 by andypugh
Look in the regmap file, that defines instance strides. (and lots of other things)

git.linuxcnc.org/gitweb?p=hostmot2-firmw...feddd7deb577;hb=HEAD

Please Log in to join the conversation.

More
10 years 11 months ago #64896 by sirop

andypugh wrote: Look in the regmap file, that defines instance strides. (and lots of other things)

git.linuxcnc.org/gitweb?p=hostmot2-firmw...feddd7deb577;hb=HEAD


Thanks for your answer.
Did not know such a file is there. It is informative but it does not help me now
as Line 45 says:

45 Instance stride is address step to next register of same type but next channel

So if sudo ./mesaflash --device 5i25 --readhmid yields:
Code:
Pin# I/O Pri. func Sec. func Chan Pin func Pin Dir 2 2 IOPort UARTTX 0 TXData (Out) 15 3 IOPort UARTRX 0 RXData (In)
is it correct that both UARTX and UARTRX belong to the same channel?
Or is this question senseless as UARTX and UARTRX are different types?


Anyway I get this error message:
Code:
Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: inconsistent Module Descriptor for UART Transmit Channel, not loading driver Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: Version = 0, expected 0 Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: NumRegisters = 4, expected 4 Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: InstanceStride = 0x00000040, expected 0x00000010 Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: MultipleRegisters = 0x0000000F, expected 0x0000000F Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: inconsistent Module Descriptor! Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: failed to parse Module Descriptor 5 of 8 gtag UART Transmit Channel
grep 'inconsistent Module Descriptor * , not loading driver' shows git.linuxcnc.org/gitweb?p=linuxcnc.git;a...d0908c8f5b7e9d1#l752
int hm2_md_is_consistent_or_complain(...) .

Variables of hm2_module_descriptor_t *md are set one function before in static int hm2_read_module_descriptors(hostmot2_t *hm2)
git.linuxcnc.org/gitweb?p=linuxcnc.git;a...d0908c8f5b7e9d1#l656

So let's look at the interesting part of the function:
Code:
static int hm2_read_module_descriptors(hostmot2_t *hm2) { int addr = hm2->idrom_offset + hm2->idrom.offset_to_modules; for ( hm2->num_mds = 0; hm2->num_mds < HM2_MAX_MODULE_DESCRIPTORS; hm2->num_mds ++, addr += 12 ) { rtapi_u32 d[3]; hm2_module_descriptor_t *md = &hm2->md[hm2->num_mds]; if (!hm2->llio->read(hm2->llio, addr, d, 12)) { HM2_ERR("error reading Module Descriptor %d (at 0x%04x)\n", hm2->num_mds, addr); return -EIO; } ................................................................................................................. md->base_address = (d[1] >> 00) & 0x0000FFFF; md->num_registers = (d[1] >> 16) & 0x000000FF; md->register_stride = (d[1] >> 24) & 0x0000000F; if (md->register_stride == 0) { md->register_stride = hm2->idrom.register_stride_0; } else if (md->register_stride == 1) { md->register_stride = hm2->idrom.register_stride_1; } else { HM2_ERR("Module Descriptor %d (at 0x%04x) has invalid RegisterStride %d\n", hm2->num_mds, addr, md->register_stride); return -EINVAL; } md->instance_stride = (d[1] >> 28) & 0x0000000F; if (md->instance_stride == 0) { md->instance_stride = hm2->idrom.instance_stride_0; } else if (md->instance_stride == 1) { md->instance_stride = hm2->idrom.instance_stride_1; } else { HM2_ERR("Module Descriptor %d (at 0x%04x) has invalid InstanceStride %d\n", hm2->num_mds, addr, md->instance_stride); return -EINVAL; } md->multiple_registers = d[2]; .......................................................................... } return 0; }

So in my case d[1] for UARTTTag would consist of:
Code:
BASE ADDRESS, NUMBER OF REGISTERS, STRIDES UARTTDataAddr&PadT, UARTTNumRegs, x"10" x"61" & x"00" , x"04" , x"10" 01100001 00000000 , 00000100, 00010000

I suppose we have to turn over these 32 bits as otherwise the right shift operator would not make any sense.
So we have then:
Code:
00010000 00000100 01100001 00000000

Then these three make sense
Code:
md->base_address = (d[1] >> 00) & 0x0000FFFF; // = 0110000100000000 md->num_registers = (d[1] >> 16) & 0x000000FF; // = 00000100 md->register_stride = (d[1] >> 24) & 0x0000000F; // = 00000000

But what about:
Code:
md->instance_stride = (d[1] >> 28) & 0x0000000F; // = 00000001 if (md->instance_stride == 0) { md->instance_stride = hm2->idrom.instance_stride_0;

then:
Code:
else if (md->instance_stride == 1) { md->instance_stride = hm2->idrom.instance_stride_1; // 0x0000040:= 64 in decimal }

This also confirms the error message from /var/log/linuxcnc.log.
However, we expect UARTS to have an Instance Stride equal to x"10" or 16 in decimal.
Is this a bug in hostmot2.c ?

Please Log in to join the conversation.

More
10 years 11 months ago #64901 by andypugh

sirop wrote: Did not know such a file is there. It is informative but it does not help me now
as Line 45 says:

45 Instance stride is address step to next register of same type but next channel


If you look at the UART section of the register definition then you will see that the instance stride is 0x10
git.linuxcnc.org/gitweb?p=hostmot2-firmw...deb577;hb=HEAD#l1179

Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: InstanceStride = 0x00000040, expected 0x00000010


The regmap file says that the instance stride is 0x10 and that is what the driver expects.

However, I have a vague memory that there is a problem that Hostmot2 doesn't really have enough options for instance stride..

Looking through old emails I find:

> On 4 June 2012 22:48, Peter C. Wallace <pcw@mesanet.com> wrote:
>>
>> UARTs fixed for all 0x10 instance(channel) strides
>
> Where do you make that change?
> (I am entertaining myself by building a custom firmware, with a UART.
> I am thinking that fast serial is a better way to get the resolver
> positions out of the Arduino)
>

Its in the TopXXX.vhd file in the strides section:

InstStride1: integer := 64; -- 4..7 64 for sserial Ick double Ick
-- InstStride1: integer := 16; -- 4..7 16 for BSPI/UART Ick double Ick

note the commented out line and the comments


And this brings up a sore spot in the HM2 firmware IDROM format.
Currently sserial and uart/bspi dont get along because there are only
2 options for each type of strides (0 and 1) and three are needed to
have normal(4), 16 and 64

The proper fix is IDROM type 4 where the instance strides are dropped from the
global section of the IDROM and added to the ModuleID section (so the 4 bit
stride selectors in the module ID records are now used directly to specify the
strides so stride = 2^Selector allowing strides of 1 to 32768 bytes in powers
of 2 per module)

Please Log in to join the conversation.

More
10 years 11 months ago #64902 by sirop

> On 4 June 2012 22:48, Peter C. Wallace <pcw@nospam.com> wrote:


And this brings up a sore spot in the HM2 firmware IDROM format.
Currently sserial and uart/bspi dont get along because there are only
2 options for each type of strides (0 and 1) and three are needed to
have normal(4), 16 and 64

The proper fix is IDROM type 4 where the instance strides are dropped from the
global section of the IDROM and added to the ModuleID section (so the 4 bit
stride selectors in the module ID records are now used directly to specify the
strides so stride = 2^Selector allowing strides of 1 to 32768 bytes in powers
of 2 per module)



Well, I read this as a missing feature or a bug.
Do I misunderstand this?

Please Log in to join the conversation.

More
10 years 11 months ago #64903 by sirop
Maybe, not a universal answer, but might work in my case:
Code:
704 md->instance_stride = (d[1] >> 28) & 0x0000000F; 705 if (md->instance_stride == 0) { 706 md->instance_stride = hm2->idrom.instance_stride_0; 707 } else if (md->instance_stride == 1) { if ((hm2_get_general_function_name(md->gtag)=="UARTTTag\0") || (hm2_get_general_function_name(md->gtag)=="UARTRTag\0")) md->instance_stride=0x10; else 708 md->instance_stride = hm2->idrom.instance_stride_1; 709 } else { 710 HM2_ERR("Module Descriptor %d (at 0x%04x) has invalid InstanceStride %d\n", hm2->num_mds, addr, md->instance_stride); 711 return -EINVAL; 712 }

Please Log in to join the conversation.

More
10 years 11 months ago #64905 by andypugh
It might be simplest just to comment out the "return -EINVAL" so that you get the warning but execution continues.

Please Log in to join the conversation.

More
10 years 11 months ago #64906 by sirop
I have not quoted the place from the source code where this error message
Code:
Nov 5 22:06:06 debian-cml2 msgd:0: hal_lib:3535:rt hm2/hm2_5i25.0: inconsistent Module Descriptor for UART Transmit Channel, not loading driver
comes from.

It comes from git.linuxcnc.org/gitweb?p=linuxcnc.git;a...d0908c8f5b7e9d1#l762
Code:
762 if (hm2_md_is_consistent(hm2, md_index, version, num_registers, instance_stride, multiple_registers)) return 1; 763 764 HM2_ERR( 765 "inconsistent Module Descriptor for %s, not loading driver\n", 766 hm2_get_general_function_name(md->gtag) 767 );

So

It might be simplest just to comment out the "return -EINVAL" so that you get the warning but execution continues.

would not help.

Please Log in to join the conversation.

More
10 years 11 months ago #64908 by andypugh
Actually, a better idea is to set the instance stride in uart.c to 0x10, and then delete the (now pointless) check in lines 41 to 45
git.linuxcnc.org/gitweb?p=linuxcnc.git;a...f9d8a3d345df;hb=HEAD

I do keep meaning to make uart.c accept the same config string scheme as the absolute encoders so that you don't have to write a .comp driver to use it.
(ditto BSPI). The problem is that there are many ways to mark the beginning of a byte sequence for multi-byte data.

Perhaps the config string would need to accept hex codes to denote "punctuation" such as the 0x7e used by HDLC

Please Log in to join the conversation.

Time to create page: 0.257 seconds
Powered by Kunena Forum