On Thu, 8 Oct 2015 14:00:39 -0700, you wrote: >> >> *Well, I'd guess something like this: the FIFO data is stored on the* >> * heap, which is malloc'd. You need the pointers as needed to figure* >> * out where it is. Standard pointers to head and tail of the ring* >> * buffer will be stored locally, unless someone did a pointer to the* >> * data structure of the FIFO (but not the data itself). I'm doing that* >> * in an OS that I'm writing. The only advantage here is that heap* >> * memory (or managed memory) is managed by the OS, and should not belong* >> * to any one task. (you could argue that, but it's more convenient this* >> * way for me.)* >> > >I can not say it any better than this: >http://linux.about.com/library/cmd/blcmdl4_mem.htm So basically, when you >mmap() /dev/mem/ you get a pointer to any system address you point it to. >In this case, for me, the physical address space assigned by the kernel, >for the peripherals. This is what I *think* is happening. I'm still >learning how this works, by starting off with examples by others.
mem is the whole system memory, protected or otherwise. It doesn't seem to include ports; port is the I/O memory. I suspect that you're right (not a linux type, but it seems to be what's going on). > >So what I've figured out already is that the code I'm using, and have >partly written myself. Gives me a pointer to the ADC registers - and more. >I know it works, as I can enable the ADC, take readings with my executable, >or devmem2, the values are very likely accurate for reason mentioned >previously. Then I've written code myself based on information I've read >from the TRM to disable the ADC clock when done. After which devemem2 no >longer returns a value from this area of memory - Which is the memory >location for the first FIFO ( FIFO0 ) Of the ADC. no longer returns any value or doesn't return a value you expect? You should be able to read the memory regardless. What it says is another matter. > >What I would really like to find is a good comprehensive guide, document, >or something about this whole process. I have not really found this yet, >and maybe I've been looking in the wrong places ? Stuff like POSIX shared >memory, etc, may be considered advanced topics in programming. But I'd >personally consider the topic of /dev/mem/ far more advanced. Certainly, it >can be "dangerous" to start poking around in random memory locations on a >live system. Which is why in this case, I started off experimenting with >code written by others. Just offhand, I'd suggest not messing with the hardware directly, but using the system drivers unless you want to write system level drivers. > >Being able to write code from scratch to disable the ADC when done with it, >has boosted my confidence *some*. But I know I have a lot to learn about >this topic, and at least the Linux kernel memory addressing schema. Guess there isn't a linux ADC driver for this chip. I'm used to writing bare metal drivers myself, but not for linux at all. The heap memory is effectively the *remaining* memory that the operating system doesn't use, it should include all of the data segments, the ram data, and the current stack. From this, malloc pulls memory, (in the GCC-AVR) from the bottom up. So it doesn't at all seem to be the same as the "mem" array, or the "port" array... Harvey > >On Thu, Oct 8, 2015 at 12:18 PM, Harvey White <ma...@dragonworks.info> >wrote: > >> On Wed, 7 Oct 2015 19:18:02 -0700, you wrote: >> >> >Harvey, >> > >> >Actually, you're right. the previously mentioned FIFO is actually 100h in >> >size, my bad. Too much on my brain here. What I described above is >> actually >> >what each 32bit field *in* that buffer *is*. hah ! >> >> Good, that means that there *is* a FIFO. >> > >> >Anyway, I make it a habit to jump into things like this because they're >> >hard to do. So I often find myself struggling with details like this. But >> >in this case, not only am I "fighting" the hardware. I'm also fighting my >> >ignorance of how Linux stores this information in memory. >> > >> >> Well, I'd guess something like this: the FIFO data is stored on the >> heap, which is malloc'd. You need the pointers as needed to figure >> out where it is. Standard pointers to head and tail of the ring >> buffer will be stored locally, unless someone did a pointer to the >> data structure of the FIFO (but not the data itself). I'm doing that >> in an OS that I'm writing. The only advantage here is that heap >> memory (or managed memory) is managed by the OS, and should not belong >> to any one task. (you could argue that, but it's more convenient this >> way for me.) >> >> >> >What I hope to take away from this is something like: "God, that was a >> pain >> >in the butt, but man was it worth it!" Meaning: hopefully I'll learn >> >something worth knowing ;) >> >> I suspect you will, so go for it. >> >> Best of luck >> >> Harvey >> >> > >> >On Wed, Oct 7, 2015 at 6:58 PM, Harvey White <ma...@dragonworks.info> >> wrote: >> > >> >> On Wed, 7 Oct 2015 18:36:00 -0700, you wrote: >> >> >> >> >> >> >> >> *You're working with two things, FIFO and ADC.* >> >> >> >> >> >> * What does the ADC do when the FIFO is full?* >> >> >> >> >> >> * What does the FIFO do when it is full?* >> >> >> >> >> >> * How do you know?* >> >> >> >> >> >> * Do you record it?* >> >> > >> >> > >> >> >Hey Harvey, >> >> > >> >> >There is nothing wrong with my code per se. What is wrong however, and >> >> >possibly indirectly related to the code in question. Is that I'm still >> >> >learning the hardware, and some very obscure details as to how Linux >> plays >> >> >a part in that. >> >> >> >> Oh, I'm not suggesting that there is something wrong with your code, >> >> but I am wondering if there is something wrong with the process >> >> involved. >> >> >> >> Just off the top of my head (and without offence, since I'd apply the >> >> same list to myself... and have.... >> >> >> >> 1) do we know what the OS is doing? >> >> 2) do we know what the hardware is doing? >> >> 3) do we know what the firmware/driver is doing? >> >> 4) have we made a mistake? >> >> 5) is someone else's code not doing what's designed? >> >> 6) have we run into a boundary condition of some sort that is not >> >> handled? >> >> 7) how do we know the above answers? >> >> >> >> Has nothing to do with programmer (your) competence. I'd decent at >> >> this, and I've graduated to more complex and obscure mistakes, >> >> although I will occasionally make simple ones just to keep myself in >> >> practice (for what, I don't know....) >> >> >> >> > >> >> >So, the way I understand it is that stepping is related to averaging. >> In >> >> >this context, a step is a single sample in a set of samples contained >> in >> >> an >> >> >average. Here is what I think I understand. Once enabled, the first >> step >> >> >reads from the pin, stores the value, decrements the stepping value, >> then >> >> >checks if step > 0 - to possibly restart the sampling. Once all steps >> are >> >> >finished ( 1, 2, 4, 8, or 16 possible steps ), the step enable bit is >> >> >toggled. So this last part here, I'm not clear on, but I think I have >> the >> >> >rest correct. But assuming this last part is correct, what could be >> >> >happening is that once I have a full buffer, the step enable bit is >> >> >enabled, and the ADC then "goes to sleep" until one, or more channels >> have >> >> >their step enable bit set. >> >> >> >> Sounds more like a sequence where the "stepping" is used to indicate >> >> which samples the multiplexed input of the ADC is actually sampling >> >> and measuring. >> >> >> >> The AVR megas and Xmegas do this. >> >> >> >> Analog multiplexer hooked to ADC. >> >> >> >> > >> >> >The FIFO, in my case FIFO0DATA is only a single 32bit register. 12bit >> >> data, >> >> >4bit reserved, 3bit channel id, the rest reserved. So, technically, it >> is >> >> >always full. I never clear the whole register, only the data field 12 >> >> bits. >> >> >When I do this with devmem2, the value resets, and the whole field >> >> >refreshes with new values. >> >> >> >> Now *that* is not what I'd call a FIFO. It's a single buffer, not a >> >> First In First Out multibyte buffer with lots of storage, but a single >> >> byte buffer for one reading. The most you can ever get behind is one >> >> reading cycle. >> >> > >> >> >With the above said, I suppose you are right in that my code might be >> >> >wrong, but still I think it is more of a hardware misunderstanding. Not >> >> >that I think that I am the greatest C programmer to ever live, but >> >> usually, >> >> >I can code my way out of a wet paper bag. >> >> >> >> Oh, and a few dry ones as well.... That, as I mentioned, is not the >> >> issue. >> >> >> >> Often times I find it useful to go back and check the fundamental >> >> assumptions just because. >> >> >> >> <yoda voice> >> >> Is no fault, is only program. >> >> <end yoda voice> >> >> >> >> >> >> > >> >> >At any rate. Believe it or not prior to answering your post. I did hit >> on >> >> >the idea that I could either manually toggle step enable ( was just >> >> reading >> >> >a bit of code on this ), or I could manually clear the lower 12bits on >> the >> >> >FIFO register, and see what happens. >> >> >> >> Not sure what that'll do, but give it a try. >> >> >> >> Not sure about the ARM hardware, but I know how other processor do >> >> this, and there are some little gotchas. >> >> >> >> Harvey >> >> >> >> > >> >> > >> >> >On Wed, Oct 7, 2015 at 5:45 PM, Harvey White <ma...@dragonworks.info> >> >> wrote: >> >> > >> >> >> On Wed, 7 Oct 2015 17:20:26 -0700, you wrote: >> >> >> >> >> >> >Oh and dahm, one more thing heh. Sorry people I'm kind of >> remembering >> >> this >> >> >> >as I think about it. Normally I keep notes, but was up late >> attempting >> >> to >> >> >> >track this issue down. So, I'm reasonably sure the FIFO is not >> >> refreshing, >> >> >> >as if I flush the data value manually ( value address &= ~0xFFFF ), >> it >> >> >> >never gets repopulated. >> >> >> > >> >> >> >Once more, if I read out the sample in order based on channel id, >> the >> >> >> >values stay the same form one iteration to the next. But If I burst >> >> read >> >> >> in >> >> >> >whatever comes from the FIFO next, the values do change, but repeat >> >> after >> >> >> >many read. Which let us just assume, for now, it's the length of the >> >> >> buffer >> >> >> >I set through iio:device0. >> >> >> > >> >> >> >*Perhaps* I just need to enable / disable the ADC once the buffer >> >> fills - >> >> >> >via iio ? I'm not sure, as I've only been working with the ADC for >> >> about >> >> >> >what ? A week now ? With no prior experience . . . >> >> >> >> >> >> You're working with two things, FIFO and ADC. >> >> >> >> >> >> What does the ADC do when the FIFO is full? >> >> >> >> >> >> What does the FIFO do when it is full? >> >> >> >> >> >> How do you know? >> >> >> >> >> >> Do you record it? >> >> >> >> >> >> Harvey >> >> >> >> >> >> >> >> >> > >> >> >> >On Wed, Oct 7, 2015 at 5:10 PM, William Hermans <yyrk...@gmail.com> >> >> >> wrote: >> >> >> > >> >> >> >> More info on the issues I'm having with the FIFO. The data seems >> to >> >> >> >> repeat, and never changes between system reboots. I'm not sure if >> >> this >> >> >> is >> >> >> >> my fault, or the fault of something to do with this Linux kernel, >> the >> >> >> iio >> >> >> >> user space drivers, or something else. For now, I'm assuming it >> is my >> >> >> >> fault. Things that I am noticing: >> >> >> >> >> >> >> >> When reading the values out of the ADC via mmap() versus using >> iio, >> >> the >> >> >> >> values read out are not in the same range. Using sysfs, the >> floating >> >> >> >> voltage values are around ~4000. But with mmap() these values vary >> >> >> starting >> >> >> >> from as low as in the hundreds, or up close to, but not passing >> 4000. >> >> >> The >> >> >> >> ID field for the ADC's *always* stay in the correct range though. >> >> Which >> >> >> is >> >> >> >> why I think I'm not flushing / clearing the FIFO correctly - More >> on >> >> >> this >> >> >> >> later. >> >> >> >> >> >> >> >> It does not matter how I configure the ADC( sysfs or mmap() ) in >> this >> >> >> >> case. What I've been experimenting with is a header file >> originally >> >> >> written >> >> >> >> for the Beaglebone white, but I checked the base address / offset >> >> >> >> constants( against the TRM ), and they seem to be exactly the >> same. >> >> >> Here, >> >> >> >> my problem lies in not completely understanding the hardware, and >> how >> >> >> >> various things interact inside of, or with Linux. Writing the >> >> software >> >> >> for >> >> >> >> all this once understood. For me, will be trivial. >> >> >> >> >> >> >> >> What does make sense to me with this problem is that I do not >> >> understand >> >> >> >> how to flush the buffer, and then tell the ADC "hey send more >> >> samples". >> >> >> But >> >> >> >> I am not exactly sure this is what my problem is. This is just a >> >> guess >> >> >> on >> >> >> >> my behalf, that makes the most sense. >> >> >> >> >> >> >> >> Another thing that did occur to me is that I'm reading from the >> FIFO >> >> too >> >> >> >> fast. But there are many factors here, including but not limited >> to: >> >> >> >> Averaging, stepping, clock divider, and ADC clock cycles needed to >> >> read >> >> >> out >> >> >> >> a correct value. These are the things that are foremost on my mind >> >> right >> >> >> >> now, of which I have limited understanding of - so far. >> >> >> >> >> >> >> >> On Wed, Oct 7, 2015 at 4:44 PM, William Hermans < >> yyrk...@gmail.com> >> >> >> wrote: >> >> >> >> >> >> >> >>> *Have you experimented with buffer size? is there any optimal >> value >> >> >> >>>> calculation? Would it have any impact on the result, Like if we >> >> keep a >> >> >> >>>> larger buffer and than directly take that buffer that way it >> would >> >> be >> >> >> >>>> faster? I have currently kept 1k.* >> >> >> >>> >> >> >> >>> >> >> >> >>> Yeah sorry, I'm kind of in my own world here at the moment. >> Anyway, >> >> >> like >> >> >> >>> I mentioned above I was speaking of the ADC FIFO. As for >> buffering >> >> into >> >> >> >>> system RAM, this is certainly possible, and very likely >> preferable. >> >> >> This >> >> >> >>> can also be done, very easily, using POSIX shared memory. >> >> Potentially, >> >> >> this >> >> >> >>> is a problem, as once the data is in RAM, how do you get it back >> out >> >> >> for >> >> >> >>> transport. Without using additional CPU cycles, or using the >> PRU's ? >> >> >> Not >> >> >> >>> using the PRU's for this by the way, is a constraint I've placed >> on >> >> >> myself. >> >> >> >>> Just to see if it is *reasonably* possible. Indeed, I do believe >> it >> >> is >> >> >> >>> possible, but not quite sure how reasonable that possibility >> *is*. >> >> - >> >> >> Yet. >> >> >> >>> >> >> >> >>> On Wed, Oct 7, 2015 at 4:34 PM, William Hermans < >> yyrk...@gmail.com> >> >> >> >>> wrote: >> >> >> >>> >> >> >> >>>> Well, the buffer I'm talking about is the ADC buffer. I've been >> >> >> looking >> >> >> >>>> through others code for PRU -> ADC, and have been attempting to >> >> >> translate >> >> >> >>>> that. I'm afraid my ASM skills are very lacking for this task( I >> >> have >> >> >> not >> >> >> >>>> written ASM code in years ). However the constants used in much >> of >> >> >> the code >> >> >> >>>> out there, are the same. So while I do not yet know what LBBO, >> and >> >> >> stuff >> >> >> >>>> liek r0-r31 mean for program flow, I can figure out the >> addressing >> >> >> very >> >> >> >>>> quickly. Not to mention that the TRM has this information too, >> but >> >> >> the TRM >> >> >> >>>> is very terse reading for many things. It's great for "cherry >> >> picking" >> >> >> >>>> offsets, but much of the information is not presented in an >> order >> >> that >> >> >> >>>> makes the most sense to me. ie, you have to bounce around too >> much >> >> >> form one >> >> >> >>>> place to another in this *huge* manual . . . >> >> >> >>>> >> >> >> >>>> So, I may have to take a break, and get to know the PRU assembly >> >> >> >>>> language well before proceeding much further. Which is >> something I >> >> >> intended >> >> >> >>>> on doing anyhow, just not right at this moment. One thing that >> has >> >> me >> >> >> >>>> excited here is an idea that came to me last night. Concerning >> >> using >> >> >> the >> >> >> >>>> PRU's in a way I've not seen anyone else do - yet. Well, I've >> seen >> >> >> mention >> >> >> >>>> of others touching on the subject I suppose, but . . . yeah I do >> >> not >> >> >> want >> >> >> >>>> to let my "secrete" out just yet. >> >> >> >>>> >> >> >> >>>> On Wed, Oct 7, 2015 at 2:48 PM, Rathin Dholakia < >> >> >> >>>> rathindhola...@gmail.com> wrote: >> >> >> >>>> >> >> >> >>>>> Hi William, >> >> >> >>>>> >> >> >> >>>>> Oh, I had already seen that and experimented with it..!!but had >> >> >> >>>>> forgotten, after watching your link I recollected. I am really >> >> sorry >> >> >> for >> >> >> >>>>> silly question. >> >> >> >>>>> >> >> >> >>>>> Have you experimented with buffer size? is there any optimal >> >> value >> >> >> >>>>> calculation? Would it have any impact on the result, Like if we >> >> keep >> >> >> a >> >> >> >>>>> larger buffer and than directly take that buffer that way it >> >> would be >> >> >> >>>>> faster? I have currently kept 1k. >> >> >> >>>>> >> >> >> >>>>> And yes, Priority is a priority!! I though you were on break >> from >> >> >> >>>>> BBB,...!! :-) >> >> >> >>>>> >> >> >> >>>>> Sincerely, >> >> >> >>>>> Rathin >> >> >> >>>>> >> >> >> >>>>> -- >> >> >> >>>>> For more options, visit http://beagleboard.org/discuss >> >> >> >>>>> --- >> >> >> >>>>> You received this message because you are subscribed to the >> Google >> >> >> >>>>> Groups "BeagleBoard" group. >> >> >> >>>>> To unsubscribe from this group and stop receiving emails from >> it, >> >> >> send >> >> >> >>>>> an email to beagleboard+unsubscr...@googlegroups.com. >> >> >> >>>>> For more options, visit https://groups.google.com/d/optout. >> >> >> >>>>> >> >> >> >>>> >> >> >> >>>> >> >> >> >>> >> >> >> >> >> >> >> >> >> >> -- >> >> >> For more options, visit http://beagleboard.org/discuss >> >> >> --- >> >> >> You received this message because you are subscribed to the Google >> >> Groups >> >> >> "BeagleBoard" group. >> >> >> To unsubscribe from this group and stop receiving emails from it, >> send >> >> an >> >> >> email to beagleboard+unsubscr...@googlegroups.com. >> >> >> For more options, visit https://groups.google.com/d/optout. >> >> >> >> >> >> >> -- >> >> For more options, visit http://beagleboard.org/discuss >> >> --- >> >> You received this message because you are subscribed to the Google >> Groups >> >> "BeagleBoard" group. >> >> To unsubscribe from this group and stop receiving emails from it, send >> an >> >> email to beagleboard+unsubscr...@googlegroups.com. >> >> For more options, visit https://groups.google.com/d/optout. >> >> >> >> -- >> For more options, visit http://beagleboard.org/discuss >> --- >> You received this message because you are subscribed to the Google Groups >> "BeagleBoard" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to beagleboard+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.