<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>A mind exercise experiment. One idea per day.</description><title>nomel.org</title><generator>Tumblr (3.0; @nomel)</generator><link>http://nomel.org/</link><item><title>Beaglebone: PRU Debug Scripts</title><description>&lt;a href="https://docs.google.com/file/d/0B80aJokrBccATGtkd1NoLVhsQnc/edit?usp=sharing"&gt;Beaglebone: PRU Debug Scripts&lt;/a&gt;: &lt;p&gt;PRU debug bash scripts&lt;/p&gt;
&lt;p&gt;Compile pasm with -l to generate a line-by-line list of the generated code.&lt;/p&gt;
&lt;p&gt;disable - disabled execution&lt;/p&gt;
&lt;p&gt;enable - enables execution&lt;/p&gt;
&lt;p&gt;init - resets and starts pru execution&lt;/p&gt;
&lt;p&gt;mem - does a memory dump of the first memory addresses&lt;/p&gt;
&lt;p&gt;regs - dumps the register contents (pru must be paused)&lt;/p&gt;
&lt;p&gt;pc - shows program counter&lt;/p&gt;
&lt;p&gt;step - steps the code. “step 5” to step 5 asm lines.&lt;/p&gt;
&lt;p&gt;reset - resets the pru&lt;/p&gt;</description><link>http://nomel.org/post/48969449703</link><guid>http://nomel.org/post/48969449703</guid><pubDate>Fri, 26 Apr 2013 21:08:00 -0400</pubDate></item><item><title>Beaglebone: I2C Reserved Address List</title><description>&lt;p&gt;This isn&amp;#8217;t documented. Why would it be? But, running Angstrom, as the Beaglebone comes out of the box, the following i2c addresses are reserved:&lt;/p&gt;
&lt;p&gt;i2c-1: &lt;span&gt;0x24, 0x35, 0x50, 0x51&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;i2c-3: &lt;span&gt;0x1B, 0x54, 0x55, 0x56, 0x57&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;There are only two ic&amp;#8217;s connected to the i2c busses: power management (i2c-1&amp;#160;0x24) and an eeprom (i2c-1&amp;#160;0x50). The others are reserved by some kernel drivers. Who knows!&lt;/span&gt;&lt;/p&gt;</description><link>http://nomel.org/post/48402087089</link><guid>http://nomel.org/post/48402087089</guid><pubDate>Fri, 19 Apr 2013 21:48:40 -0400</pubDate></item><item><title>Beaglebone Tutorial: UART? Gotta isolate!</title><description>&lt;p&gt;LCD_DATA[15:0] are sysboot pins. This means that the levels on these pins, during boot, are used to configure the system.&lt;/p&gt;
&lt;p&gt;Looking at the Beaglebone reference manual, you&amp;#8217;ll notice that UART 2 to 5, have inputs on these pins. This means you MUST use something to isolate the pins until after the system has booted.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll also notice that UART1 shares pins with I2C2, the cape eeprom pins. So, if you have a proper cape that uses I2C2, you can&amp;#8217;t use UART1.&lt;/p&gt;
&lt;p&gt;So&amp;#8230;the only way to use uart on the Beaglebone is to use external circuitry to isolate the pins during boot.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Awesome.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Best part is, by moving the UART output signals to the sysboot, they could have completely prevented this requirement. :-|&lt;/span&gt;&lt;/p&gt;</description><link>http://nomel.org/post/46021748404</link><guid>http://nomel.org/post/46021748404</guid><pubDate>Fri, 22 Mar 2013 18:34:44 -0400</pubDate></item><item><title>New Beaglebone Preview</title><description>&lt;p&gt;&lt;a href="http://beagleboard.org/unzipped/" target="_blank"&gt;http://beagleboard.org/unzipped/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Uses the AM3358 chip (&lt;span&gt;c&lt;/span&gt;&lt;a href="http://www.ti.com/product/am3358#parametrics" title="AM335x Comparison" target="_blank"&gt;omparison&lt;/a&gt; with &lt;span&gt;AM3359 in current Beaglebone&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/file/d/0B80aJokrBccAMjNPRDBoMkUwWXc/view" target="_blank"&gt;Beaglebone SxSW 2013 Slideshow&lt;/a&gt;, with a few details on the new board.&lt;/p&gt;</description><link>http://nomel.org/post/45223525894</link><guid>http://nomel.org/post/45223525894</guid><pubDate>Tue, 12 Mar 2013 19:17:00 -0400</pubDate></item><item><title>Beaglebone Tutorial: PRU Custom Communication Interface, Part 1</title><description>&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://show.zoho.com/embed?id=1703625000000004104" title="PRU System Events and ARM Interrupts" target="_blank"&gt;Part 1: Triggering the ARM interrupts using PRU events.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Part 2: Interfacing with the PRU memory.&lt;/p&gt;
&lt;p&gt;Part 3: Interfacing with the PRU interrupts using the pruss_uio userspace i/o.&lt;/p&gt;</description><link>http://nomel.org/post/44328902194</link><guid>http://nomel.org/post/44328902194</guid><pubDate>Fri, 01 Mar 2013 19:19:00 -0500</pubDate></item><item><title>Ugh: oncrpc-windows library with C++ and "undefined reference to" errors</title><description>&lt;p&gt;&lt;strong&gt;&lt;a href="http://sourceforge.net/projects/oncrpc-windows/" title="o n c r p c for windows." target="_blank"&gt;oncrpc-windows&lt;/a&gt; on&lt;a href="http://sourceforge.net" target="_blank"&gt; Sourceforge&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The rpc/rpc.h header that comes with this library doesn&amp;#8217;t have the&lt;/p&gt;
&lt;p&gt;&lt;span&gt;extern &amp;#8220;C&amp;#8221; {}&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;switches around it, so you&amp;#8217;ll get errors like&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;undefined reference to `clnt_perrno(clnt_stat)&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re using the library in a c++ project, you&amp;#8217;ll need to put the &amp;#8220;extern&amp;#8221; switch in the rpc.h header, or wrap it around the&lt;/p&gt;
&lt;p&gt;&lt;span&gt;#include &amp;#8220;rpc/rpc.h&amp;#8221;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;wherever it&amp;#8217;s declared.&lt;/p&gt;</description><link>http://nomel.org/post/44212975657</link><guid>http://nomel.org/post/44212975657</guid><pubDate>Thu, 28 Feb 2013 06:46:00 -0500</pubDate></item><item><title>Ugh: ONC+/TI-RPC using Cygwin dll - Unknown Protocol error</title><description>&lt;p&gt;So, you compiled your RPC client and it runs great in the Cygwin console. You use cygcheck to get the required dll&amp;#8217;s and move it else where, so you can run it outside the Cygwin console.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re using TI-RPC, you missed a file: /etc/netconfig&lt;/p&gt;
&lt;p&gt;The TI-RPC library uses the NETPATH environment variable or this hard coded value to look up the protocols this machine supports.&lt;/p&gt;
&lt;p&gt;This file is, literally, only used by TI-RPC on most systems. What purpose does it serve? If you&amp;#8217;re just using TCP or UDP, absolutely none. It simply redefines standard socket constants, stuff that every other socket based server/client in existence does just fine, but you still need it. TI-RPC is based off of SUN RPC, which was made in the long-long ago, back when things besides tcp and udp, ipv4 and ipv6, weren&amp;#8217;t universally used. Some examples of supported protocol families include: &lt;span&gt;appletalk, nit, decnet, ccitt, datakit, chaos, pup. I don&amp;#8217;t even.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;Solution:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Scrap it all like I did and use &lt;a href="http://sourceforge.net/projects/oncrpc-windows/" title="o n c r p c for Windows" target="_blank"&gt;oncrpc-windows&lt;/a&gt;.&lt;/p&gt;</description><link>http://nomel.org/post/42047799354</link><guid>http://nomel.org/post/42047799354</guid><pubDate>Fri, 01 Feb 2013 16:59:00 -0500</pubDate></item><item><title>Idea: Line-unfollower painter</title><description>&lt;p&gt;Maybe with an &lt;a href="http://spritesmods.com/?art=mouseeye" title="Optical mouse as camera" target="_blank"&gt;optical mouse for an eye&lt;/a&gt;, generate a &amp;#8220;decision&amp;#8221; from the image of the paper fibers and paint under the &amp;#8220;head&amp;#8221; of the line follower that would select the next direction and color to put down (or change in direction and color). Maybe stack a few standard image processing algorithms to come up with the &amp;#8220;decision&amp;#8221;. Might end up with some interesting, organic looking, artwork.&lt;/p&gt;
&lt;p&gt;Maybe even have the rules of the &amp;#8220;decision&amp;#8221; change based on the image underneath. Seeing enough blue could trigger some color and some sharp direction change.&lt;/p&gt;
&lt;p&gt;Probably wouldn&amp;#8217;t be too interesting on a small canvas, but something like a mural might be.&lt;/p&gt;
&lt;p&gt;Maybe have the color influenced by absolute position so things like logos or big faces could be subtly hidden in.&lt;/p&gt;</description><link>http://nomel.org/post/41173251770</link><guid>http://nomel.org/post/41173251770</guid><pubDate>Mon, 21 Jan 2013 23:51:00 -0500</pubDate></item><item><title>Lame Idea: Sound pens</title><description>&lt;p&gt;Sound pens for kids. You run your thumb nail along the length of the mechanical pencil/pen and it plays back some resemblance of a word or recording by vibrating your thumbnail with some groves cut/molded onto the surface.&lt;/p&gt;
&lt;p&gt;I loved &amp;#8220;something generated from something else&amp;#8221; type things when I was a kid.&lt;/p&gt;
&lt;p&gt;To market it, could automate a cutter to do custom sounds.&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Better yet, have this as a &amp;#8220;customization&amp;#8221; option for electronic devices. Is that your phone? Rub a stick on it and hear your sound byte.&lt;/span&gt;&lt;/p&gt;</description><link>http://nomel.org/post/41172668172</link><guid>http://nomel.org/post/41172668172</guid><pubDate>Mon, 21 Jan 2013 23:43:00 -0500</pubDate></item><item><title>Interesting thing: Light collection from shadow living plant</title><description>&lt;p&gt;I found some shadow living plants under a redwood tree. They had rubbery leaves that nearly felt sticky. From what I could tell from the way the light sparkled off of the leaves, they felt this way because the surface of every leaf was covered with thousands of micro-facet surfaces. This plant only lived exactly in the redwoods shadow. I can&amp;#8217;t imagine soil conditions would be that much different across such a fine line (1/4 inch between bushy plant and nothing), so I&amp;#8217;m assuming it &amp;#8220;actively&amp;#8221; refused to grow if too much light.&lt;/p&gt;
&lt;p title="Research Paper: Two types of chloroplast"&gt;I&amp;#8217;m assuming this guy took an opposite approach to light loving plants. Rather than competing for bright light and dealing with its variability and problems moving between the &lt;a href="http://www.bio21.bas.bg/ipp/gapbfiles/v-25/99_3-4_03-16.pdf" title="Research Paper: Two types of chloroplast" target="_blank"&gt;two types of chloroplast&lt;/a&gt;, these guys probably maximize their low-light chloroplast year round while they chill, alone, in the shade, possibly unable to make any real amount of high-light chloroplast. I&amp;#8217;m guessing the texture on the surface of the leafs has to do with maximizing the ambient light collected from the sky.&lt;/p&gt;
&lt;p title="Research Paper: Two types of chloroplast"&gt;It would be *very* interesting to see if any of the tricks used by the plant could be used on the surface of low-light photovoltaic cells.&lt;/p&gt;
&lt;p title="Research Paper: Two types of chloroplast"&gt;I&amp;#8217;m guessing the texture, chloroplast placement, and things like the gradient of the index of refraction near the surface would all be interesting.&lt;/p&gt;</description><link>http://nomel.org/post/41172144948</link><guid>http://nomel.org/post/41172144948</guid><pubDate>Mon, 21 Jan 2013 23:36:37 -0500</pubDate></item><item><title>Photo</title><description>&lt;img src="http://24.media.tumblr.com/tumblr_mdnbo3tSDz1r6mclmo1_400.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;</description><link>http://nomel.org/post/36935984545</link><guid>http://nomel.org/post/36935984545</guid><pubDate>Sat, 01 Dec 2012 01:20:28 -0500</pubDate></item><item><title>Ugh: How to specify network interface for boost::asio::ip::udp multicast receive</title><description>&lt;p&gt;With some funky formatting so it&amp;#8217;ll fit better&amp;#8230;.&lt;/p&gt;
&lt;p&gt;I have the socket_ as a private variable in a class, that&amp;#8217;s why scoped_ptr is used.&lt;/p&gt;
&lt;p&gt;I use the &lt;a href="http://www.hyperic.com/support/docs/sigar/" title="Sigar API" target="_blank"&gt;Sigar API&lt;/a&gt; for a cross platform way to get a list of interface addresses. You&amp;#8217;ll see people &lt;a href="http://stackoverflow.com/questions/2674314/get-local-ip-address-using-boost-asio" target="_blank"&gt;trying to use boost&lt;/a&gt;, but that does not give a list of interface addresses. It uses hostname resolution, which only works if you have a DNS or something to look up the hostname.&lt;/p&gt;
&lt;div&gt;
&lt;blockquote&gt;
&lt;p&gt;boost::scoped_ptr&amp;lt;boost::asio::ip::udp::socket&amp;gt; socket_;&lt;/p&gt;
&lt;p&gt;#ifdef _linux&lt;br/&gt;// for linux, use the multicast address as the bind&lt;/p&gt;
&lt;p&gt;boost::asio::ip::udp::endpoint listen_endpoint(&lt;br/&gt;    multicast_address,&lt;br/&gt;    multicast_port&lt;br/&gt;);&lt;/p&gt;
&lt;p&gt;#else&lt;br/&gt;// for windows, use the interface address&lt;/p&gt;
&lt;p&gt;boost::asio::ip::udp::endpoint listen_endpoint(&lt;br/&gt;   interface_address,&lt;br/&gt;   multicast_port&lt;br/&gt;);&lt;/p&gt;
&lt;p&gt;#endif&lt;/p&gt;
&lt;p&gt;socket_.reset(&lt;br/&gt;    new boost::asio::ip::udp::socket(&lt;br/&gt;        io_service,&lt;br/&gt;        listen_endpoint.protocol()&lt;br/&gt;    )&lt;br/&gt;);&lt;/p&gt;
&lt;p&gt;socket_-&amp;gt;bind(listen_endpoint);&lt;/p&gt;
&lt;p&gt;if( interface_address.is_v4() ){&lt;br/&gt;    socket_-&amp;gt;set_option(&lt;br/&gt;        boost::asio::ip::multicast::join_group(&lt;br/&gt;            multicast_address.to_v4(),&lt;br/&gt;            interface_address.to_v4()&lt;br/&gt;        )&lt;br/&gt;    );&lt;/p&gt;
&lt;p&gt;}else{&lt;/p&gt;
&lt;p&gt;    // need to find cross platform way to get interface number&lt;/p&gt;
&lt;p&gt;    socket_-&amp;gt;set_option(&lt;br/&gt;        boost::asio::ip::multicast::join_group(&lt;br/&gt;            multicast_address.to_v6(),&lt;br/&gt;            &amp;lt;ipv6 interface index int here&amp;gt;&lt;br/&gt;        )&lt;br/&gt;    );&lt;br/&gt;}&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Binding to &amp;#8220;0.0.0.0&amp;#8221; only seems to listen on one interface.&lt;/p&gt;
&lt;/div&gt;</description><link>http://nomel.org/post/36927715811</link><guid>http://nomel.org/post/36927715811</guid><pubDate>Fri, 30 Nov 2012 22:57:00 -0500</pubDate></item><item><title>Art Installation: Yesterday Machine</title><description>&lt;p&gt;Time delay of analog tape loop with video and audio, delayed by one day. Digital for a cheap version.&lt;/p&gt;</description><link>http://nomel.org/post/30985726747</link><guid>http://nomel.org/post/30985726747</guid><pubDate>Thu, 06 Sep 2012 03:35:28 -0400</pubDate></item><item><title>Art Installation: Street corner video chat</title><description>&lt;p&gt;With kiosks at major intersections of major cities around the world.&lt;/p&gt;</description><link>http://nomel.org/post/30985708657</link><guid>http://nomel.org/post/30985708657</guid><pubDate>Thu, 06 Sep 2012 03:34:32 -0400</pubDate></item><item><title>BeagleBone Tutorial: BeagleBone Expansion Header PRU-ICSS GPIO Pin List</title><description>&lt;p&gt;&lt;a href="https://docs.google.com/spreadsheet/ccc?key=0As0aJokrBccAdGkxeHkyYW1qRHNQdm5yZDhPQlRNR2c" title="docs.google.com: BeagleBone Expansion Header to PRU GPIO Map" target="_blank"&gt;BeagleBone Expansion Header PRU GPIO&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This is a list of the PRU-ICSS high speed GPIO pins available on the BeagleBone expansion header.&lt;/p&gt;</description><link>http://nomel.org/post/30362411977</link><guid>http://nomel.org/post/30362411977</guid><pubDate>Mon, 27 Aug 2012 22:56:00 -0400</pubDate><category>ti</category><category>pru</category><category>pru-icss</category><category>BeagleBone</category><category>expansion header</category><category>pru GPIO</category><category>gpio toggle</category></item><item><title>BeagleBone Tutorial: How to compile kernel modules and "hello world" on the BeagleBone</title><description>&lt;p&gt;This tutorial shows the commands to compile and install the &amp;#8220;hello world&amp;#8221; of kernel module compilation using the stock Angstrom distribution that comes on the BeagleBone.&lt;/p&gt;
&lt;p&gt;This only requires a few opkg commands. I didn&amp;#8217;t see this anywhere on the newsgroups or forums&amp;#8230;no idea why.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://lwn.net/Kernel/LDD3/" title="lwn.net: LDD 3" target="_blank"&gt;Linux Device Drivers, Third Edition&lt;/a&gt; (&lt;a href="http://lwn.net/images/pdf/LDD3/ch02.pdf" title="lwn.net: LDD 3, Chapter 2" target="_blank"&gt;Chapter 2&lt;/a&gt;)&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://crashcourse.ca/introduction-linux-kernel-programming-2nd-edition/lesson-4-configuring-and-building-your-first-kerne" target="_blank"&gt;Introduction to Linux Kernel Programming, Lesson 4, Configuring and building your first kernel&lt;/a&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get to the latest version of everything&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;~# opkg update&lt;br/&gt;~# opkg upgrade&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Update refreshes the package list. Upgrade upgrades all packages to the latest versions, including the kernel.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Get the kernel source files and make stuff&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;~# opkg install kernel-headers&lt;br/&gt;~# opkg install kernel-dev&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you screw something up later on, you can do a&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;~# opkg install kernel-headers &lt;em&gt;&amp;#8212;force-reinstall&lt;/em&gt;&lt;br/&gt;&lt;em&gt;~# opkg install kernel-dev &lt;em&gt;&amp;#8212;force-reinstall&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The kernel source is now in /usr/src/kernel. I don&amp;#8217;t know if it&amp;#8217;s all there&amp;#8230;but it&amp;#8217;ll compile modules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;~# cd /usr/src/kernel&lt;br/&gt;/usr/src/kernel# make scripts&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;&amp;#8220;make scripts&amp;#8221; compiles a few things used for the kernel module building.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Compile hello.c kernel module&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;/usr/src/kernel# cd test&lt;br/&gt;/usr/src/kernel/test# make CROSS_COMPILE=&amp;#8221;&amp;#8220;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &amp;#8216;CROSS_COMPILE=&amp;#8221;&amp;#8220;&amp;#8217; is needed since it&amp;#8217;s a native build.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll get an error like this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;make: *** &lt;strong&gt;&lt;em&gt;/lib/modules/3.2.28/build&lt;/em&gt;&lt;/strong&gt;: No such file or directory.  Stop.&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Make this path a symbolic link to the kernel source directory with&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;ln -s /usr/src/kernel /lib/modules/3.2.28/build&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;Now, make the test again&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;/usr/src/kernel/test# make CROSS_COMPILE=&amp;#8221;&amp;#8220;&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;and install your first compiled kernel module&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;insmod kernel.ko&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;WOOOHOO!&lt;/p&gt;
&lt;p&gt;Oh&amp;#8230;wait&amp;#8230;where&amp;#8217;s the message that&amp;#8217;s it&amp;#8217;s supposed to print? Check the kernel messages&amp;#8230;&lt;/p&gt;
&lt;blockquote&gt;
&lt;div&gt;
&lt;p&gt;/usr/src/kernel/test# dmesg&lt;br/&gt;&amp;#8230;&lt;br/&gt;[ 6376.390960] Hello, world&lt;/p&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;WOOOOOOOOOHOOOOOOOOO!&lt;/p&gt;
&lt;p&gt;Happy kernel module writing (if there is such a thing)! :D&lt;/p&gt;
&lt;p&gt;I have written a full kernel module, interrupts and all, using only this source.&lt;/p&gt;</description><link>http://nomel.org/post/30357133735</link><guid>http://nomel.org/post/30357133735</guid><pubDate>Mon, 27 Aug 2012 21:44:00 -0400</pubDate><category>BeagleBone</category><category>kernel module</category><category>hello world</category><category>compile</category></item><item><title>BeagleBone Tutorial: Accessing Main Memory From the PRU (and visa versa)</title><description>&lt;p&gt;This tutorial shows how to access any part of the main memory from within the PRU, and reasons you shouldn&amp;#8217;t.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;PRU Reference:&lt;br/&gt;&lt;a href="https://github.com/beagleboard/am335x_pru_package/blob/master/am335xPruReferenceGuide.pdf" title="githib.com: AM335x PRU-ICSS Reference Guide" target="_blank"&gt;AM335X PRU Reference Guide&lt;/a&gt; from the &lt;a href="https://github.com/beagleboard/am335x_pru_package" title="githib.com: BeagleBoard PRU Software Package" target="_blank"&gt;AM335X PRU Package&lt;/a&gt; (&lt;a href="http://blog.boxysean.com/2012/08/12/first-steps-with-the-beaglebone-pru/" title="blog.boxsean.com: First steps with the BeagleBoard PRU" target="_blank"&gt;usage tutorial&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span&gt;Technical Reference Manual:&lt;/span&gt;&lt;a href="http://www.ti.com/lit/pdf/SPRUH73" target="_blank"&gt;&lt;br/&gt;AM335xARM Cortex-A8Microprocessors (MPUs) Technical Reference Manual&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;PRU Local Memory&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each PRU-ICSS has local memory that, from the perspective of the PRU, spans from address 0x00000000 to 0x0007FFFF, with the memory mapping found in table 5 of the PRU Reference.&lt;br/&gt;&lt;br/&gt;Reads and writes to this memory, including the 12kB of memory shared between the two PRUs, are only 1 clock tick (clock runs at 200MHz).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memory Outside the PRU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;All memory available to the CPU (including the PRU memory) can be accessed by the PRU through an interconnect, the L3. For details on the L3, see the Interconnects chapter in the Technical Reference Manual.&lt;br/&gt;&lt;br/&gt;For quick summary, the L3 performs data reads and writes to other blocks of the chip using a network-on-a-chip protocol (handles the &amp;#8220;send this to&amp;#8221; and &amp;#8220;get this from&amp;#8221; type addressing and handshaking) that&amp;#8217;s physically connected with an &lt;a href="http://ocpip.org/faqs_general_technical.php" title="ocpip.org: OCP Technical Faqs" target="_blank"&gt;Open Core Protocol (OCP)&lt;/a&gt; socket (a standard way to physically connect subsystems of a chip).&lt;br/&gt;&lt;br/&gt;Another way to read that is &amp;#8220;There&amp;#8217;s lots of overhead&amp;#8221;. Where local reads and writes were instant, within one clock tick, reads and writes though the L3 take many cycles. How many? Well, that depends on if the L3 is busy passing data around for some other part of the chip.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessing Memory External To The PRU&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For the PRU, all addresses from 0x00000000 to 0x0007FFFF are local data. By enabling the OCP socket, the PRU gets to the L3. Connected to the L3, any memory read or write to addresses from 0x00080000 and beyond are routed through the L3 to the main memory, with the main memory address equal to what was requested. For example, reading address 0x0008005 will return the value from main memory address 0x00080005.&lt;/p&gt;
&lt;p&gt;To access main memory addresses below 0x00080000, a global memory shit of -0x00080000 can be enabled. With the shift enabled, reading address 0x00080005 with the PRU will return the value from main memory address 0x00000005.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Setting Up The PRU To Access Main Memory&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;em&gt;Enable the OCP socket to connect the PRU to the L3&lt;br/&gt;&lt;br/&gt;&lt;/em&gt;To enable the OCP port so the PRU &lt;strong&gt;can&lt;/strong&gt; access main memory, set the STANDBY_INIT bit to 0 in the PRUs SYSCFG register, disabling the standby mode, and enabling the port.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Set the address offset field&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;&lt;em&gt;To read main from 0x00080000 and up&lt;/em&gt;, set the address offset bit PMAS_PRU&amp;lt;n&amp;gt; in the PMAS PRU register to 0 to disable the offset. The main memory address is the same as what was specified in the PRU code. Reading PRU address 0x00090200 return the contents from main memory address 0x00090200.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;To read main memory addresses 0x00000000 to 0x0007FFFF&lt;/em&gt;, set the PMAS_PRU&amp;lt;n&amp;gt; bit to 1, enabling the offset. The main memory address is now 0x00080000 less than that requested by the PRU, so reading PRU memory address 0x00080150 return the value in main memory address 0x00080150 - 0x00080000 = 0x00000150.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;GPIO pins can be accessed through the global memory, but they shouldn&amp;#8217;t (tutorial on its way).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Accessing PRU Memory From The CPU&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There&amp;#8217;s nothing special here. The CPU accessing the PRU memory through an L4 interconnect, which is always enabled, so there&amp;#8217;s nothing special to do beforehand: the memory is always accessible.&lt;/p&gt;
&lt;p&gt;Find the base address for the PRU that you want to access, and look up the offset for the PRU memory you&amp;#8217;re interest in using Table 6 in the PRU Reference. Notice that the memory offsets &lt;em&gt;match&lt;/em&gt; the PRU local memory, with a few of the &amp;#8220;reserved&amp;#8221; fields populated.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What NOT To Do&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think these are fairly obvious, but should be stated anyways.&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you need to poll memory, poll local memory&lt;/em&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Any pru &amp;lt;&amp;#8212;&amp;gt; main memory communication (with the exception of the PRU GPIO) has to go through a memory bus. Be aware that doing something like using the PRU to quickly poll some main memory, rather than a local memory, will flood the memory bus and most likely slow down whatever else interesting you&amp;#8217;re doing with the CPU. If you need to poll memory to wait for some rare value, always poll local memory.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;If your CPU is the one polling, poll main memory, and have the PRU set that main memory address.&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;If your PRU is needs to poll, have the CPU set the PRU memory (it has full access to &lt;strong&gt;all&lt;/strong&gt; PRU memory, including registers).&lt;/li&gt;
&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Poll GPIO or use an interrupt! PRU interrupts basically poll some of the PRU GPIO lines. They &lt;strong&gt;don&amp;#8217;t&lt;/strong&gt; come through the L3 or L4 interconnect, so will be much quicker. They can also be used to wake up the PRU from a suspended state, if you want to save some power.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;From The PRU, Leave Any High Speed GPIO To The PRU GPIO&lt;br/&gt;&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Don&amp;#8217;t toggle the main GPIO pins from the PRU using their host memory addresses. And even worse, don&amp;#8217;t toggle the PRU GPIO pins using the host memory address. Use the PRU GPIO pins. They&amp;#8217;re one-tick access for reads and writes. That&amp;#8217;s what they&amp;#8217;re there for! Again, accessing through the main memory will be slow, have unpredictable access/toggle times, and flood the memory bus.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a &lt;a href="https://docs.google.com/spreadsheet/ccc?key=0As0aJokrBccAdGkxeHkyYW1qRHNQdm5yZDhPQlRNR2c#gid=0" title="docs.google.com: BeagleBone Expansion Header to PRU GPIO Map" target="_blank"&gt;list of PRU GPIO pins accessible on the BeagleBone header&lt;/a&gt;. See below for a PRU GPIO tutorial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Related&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nomel.org/post/30006589199/beaglebone-tutorial-configuring-gpio-pins" target="_blank"&gt;BeagleBone Tutorial: Configuring GPIO Pins&lt;/a&gt;&lt;br/&gt;BeagleBone Tutorial: Toggling GPIO Pins From Within The PRU-ICSS (on its way)&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Errors? Something unclear? Leave a comment!&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;</description><link>http://nomel.org/post/30006622413</link><guid>http://nomel.org/post/30006622413</guid><pubDate>Wed, 22 Aug 2012 22:03:00 -0400</pubDate><category>BeagleBone</category><category>main memory</category><category>pru</category><category>pru-icss</category><category>pru gpio</category><category>global memory</category></item><item><title>BeagleBone Tutorial: Configuring GPIO Pins</title><description>&lt;p&gt;This tutorial explains how to locate and configure the GPIO pins for input, output, pull-up, pull-down, high-z, etc.&lt;/p&gt;
&lt;p&gt;I couldn&amp;#8217;t find this information clearly stated in any one place, so here&amp;#8217;s my attempt. If the TI wiki was actually a wiki that allowed people to edit it, I&amp;#8217;m sure something like this would already be there.&lt;/p&gt;
&lt;p&gt;&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;References&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Technical Reference Manual:&lt;a href="http://www.ti.com/lit/pdf/SPRUH73" title="AM335xARM Cortex-A8Microprocessors (MPUs) Technical Reference Manual" target="_blank"&gt;&lt;br/&gt;AM335xARM Cortex-A8Microprocessors (MPUs) Technical Reference Manual&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Product Preview:&lt;br/&gt;&lt;a href="http://www.ti.com/lit/ds/sprs717d/sprs717d.pdf" title="AM335xARM Cortex-A8 Microprocessors(MPUs) Product Preview" target="_blank"&gt;AM335xARM Cortex-A8 Microprocessors(MPUs) Product Preview&lt;/a&gt;&lt;strong&gt;&lt;br/&gt;&lt;br/&gt;&lt;/strong&gt;Alexanders Fast GPIO Access Tutorial:&lt;br/&gt;&lt;a href="http://www.alexanderhiam.com/tutorials/beaglebone-io-using-python-mmap/#comment-252" title="alexanderhiam.com: BeagleBone IO using Python and mmap" target="_blank"&gt;BeagleBone IO using Python and mmap&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br/&gt;GPIO Pins&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are only a limited number of physical pins to choose from, but many internal signals to put to those physical pins. Due to this limited pin count, most GPIO pins can be multiplexed to many different internal signals. In addition to internal signal selection, some pins can be configured to have pullups or pulldowns, fast or slow rise times, and as input or output pins. All of these settings are contained in a pin configuration register with one register for each pin.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pad Control / Configuration Register&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The configuration register is 32 bits wide and is the same format for all pins and does three things:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Sets up the internal multiplexer to select an internal signal to that gets connected to the pin.&lt;/li&gt;
&lt;li&gt;Sets the pin to an input, otherwise it&amp;#8217;s an output only pin.&lt;/li&gt;
&lt;li&gt;Connects or disconnects an internal pullup or pulldown.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;The format of the configuration register is the same for all pins, and can be found in section 9.2.2, &amp;#8220;Pad Control Registers&amp;#8221; in the Technical Reference Manual, but here&amp;#8217;s my version of the table:&lt;/p&gt;
&lt;p&gt;&lt;img alt="image" src="http://media.tumblr.com/tumblr_m96tzdDIa41qzpj6d.png"/&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bringing An Internal Signal Out To A Pin&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Since each pin can be connected to multiple internal signals, a multiplexer is used to select which internal signal gets brought out. Table 2-7 in the Product Preview lists all signals that can be brought out for each pin, and the MUXMODE value that needs to be placed in the pins configuration register to bring that signal out. For the beaglebone, the pins leading to the headers and the MUXMODE values to bring out all the different signals are listed in Table 9 in the &lt;a href="http://beagleboard.org/static/BONESRM_latest.pdf" target="_blank"&gt;BeagleBone System Reference Manual&lt;/a&gt; &amp;#8230; OH JUST KIDDING, they only partially filled out the table. Most are there, but a bunch are missing, including all of the PRU-ICSS GPIO signals (which can be found &lt;a href="http://nomel.org/post/30362411977/beaglebone-tutorial-boaglebone-expansion-header" title="PRU Header pins" target="_blank"&gt;here&lt;/a&gt;).&lt;br/&gt;&lt;br/&gt;&lt;em&gt;&lt;strong&gt;To route an internal signal to a GPIO pin&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;em&gt;Find the pin name that the internal signal routes to&lt;/em&gt;.&lt;br/&gt;&lt;br/&gt;Look up the physical &amp;#8220;pin name&amp;#8221; that the internal signal can be muxed to in table 2-7 &amp;#8220;Ball Characteristics&amp;#8221; section of the Product Preview. You&amp;#8217;ll find the internal signals listed in the &amp;#8220;Signal Name&amp;#8221; column, and the pin that this signal can be connected to in the &amp;#8220;Pin Name&amp;#8221; column. Next to the signal name will be a mode number. This is the MUXMODE value that needs to go into the pins configuration register. Write down the Pin Name and the mode number.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Find the settings that the pin and signal support&lt;br/&gt;&lt;br/&gt;&lt;/em&gt;In table 2-7, you&amp;#8217;ll also see a &amp;#8220;Type&amp;#8221; and &amp;#8220;Pullup/Down Type&amp;#8221; column.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The Type column&lt;/em&gt; shows if the signal is an input, output, or both. This determines what values can be used for the RXACTIVE field of the configuration register. If I or I/O is listed, RXACTIVE can be enabled and the value will end up in some register location than can be read (see the signals details for where). Otherwise, it shouldn&amp;#8217;t be, since the received value wont be accessible.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;The pull up and down types&lt;/em&gt; show if there is a pull up (PU) or pull down (PD) attached to the pin. If either aren&amp;#8217;t listed, then there&amp;#8217;s nothing to connect, so enabling wont do anything.&lt;br/&gt;&lt;br/&gt;I could only find one mention of slew, used for the DDR pins. I&amp;#8217;m assuming the setting is ignored for all other pins.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Find the configuration register to configure the pin.&lt;br/&gt;&lt;br/&gt;&lt;/em&gt;The configuration registers are contained in the Control Module memory space. Each register is listed as an offset from the Control Modules starting memory address, so the final configuration register memory location will be the Control Module address + the configuration register offset.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Look up the &amp;#8220;Control Module&amp;#8221; memory address&lt;/em&gt; in the processors Memory Map in the Technical Reference Manual. For the BeagleBone with a Cortex-A8, this is 0x44E30000.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Look up the find the configuration register offset&lt;/em&gt; for the pin name in table 9-10, &amp;#8220;Control_Modules Registers&amp;#8221;, in the Technical Reference Manual. The names listed aren&amp;#8217;t exactly the pin names, but it should be obvious. For instance, the entry for pin GPMC_A11 is conf_gpmc_a11.&lt;br/&gt;&lt;br/&gt;&lt;em&gt;Example:&lt;/em&gt; Lets say the signal we&amp;#8217;re trying to get out is gpio1_27. The pin name is GPMC_A11. The Control Module start address is 0x44E30000. The configuration register for this pin is listed as conf_gpmc_a11, with an offset value listed as 0x086C. The memory location for the configuration register is 0x44E30000 + 0x086C = 0x44E3086C.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Set the configuration register&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;Decide what pullup, slew, and input settings desired pull up/down settings and select the mode to the value found in step 1. Write the configuration register&amp;#8230;but how?&lt;br/&gt;&lt;br/&gt;There&amp;#8217;s a command called devmem2 that will let you read and write to any non-protected memory locations. &amp;#8220;Unfortunately&amp;#8221;, the GPIO configuration bits are in kernel space, so require privileged (kernel) mode (&lt;a href="http://www.alexanderhiam.com/tutorials/beaglebone-io-using-python-mmap/" target="_blank"&gt;thanks Alexander&lt;/a&gt;). This means you&amp;#8217;ll have to &lt;a href="http://nomel.org/post/30357133735/beaglebone-tutorial-how-to-compile-kernel-module" title="Compile a Kernel Module on the BeagleBone" target="_blank"&gt;make a kernel module&lt;/a&gt;, or use file system routines to set the registers. As Alexanders tutorial points out, it&amp;#8217;ll look something like&lt;br/&gt;&lt;br/&gt;    echo &lt;strong&gt;&lt;em&gt;&amp;lt;value&amp;gt;&lt;/em&gt;&lt;/strong&gt; &amp;gt; /sys/kernel/debug/omap_mux/&lt;strong&gt;&lt;em&gt;&amp;lt;pin name&amp;gt;&lt;/em&gt;&lt;/strong&gt;&lt;br/&gt;&lt;br/&gt;where &lt;strong&gt;&lt;em&gt;&amp;lt;value&amp;gt;&lt;/em&gt;&lt;/strong&gt; is the value to put into the configuration register for the &lt;strong&gt;&lt;em&gt;&amp;lt;pin name&amp;gt;&lt;/em&gt;&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Bam!&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;If the pin had output capabilities, it should track your internal signal value. If the pin had input capabilities, and you enabled it, you should be able to read the pins state through the signals read memory address.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;High speed toggle rate&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you need something high speed and deterministic (known timing), you can use the PRU GPIO pins. With these, 200MHz is achievable, with the availability of a free 200MHz 28-bit shift register and PWM built in!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Other BeagleBone Tutorials&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://nomel.org/post/30006622413/beaglebone-tutorial-accessing-main-memory-from-the-pru" target="_blank"&gt;BeagleBone Tutorial: Accessing Main Memory From The PRU&lt;/a&gt;&lt;br/&gt;&lt;a href="http://nomel.org/post/30357133735/beaglebone-tutorial-how-to-compile-kernel-module" target="_self"&gt;BeagleBone Tutorial: How to compile kernel module “hello world” on the BeagleBone&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Errors? Something unclear? Leave a comment!&lt;/strong&gt;&lt;/p&gt;</description><link>http://nomel.org/post/30006589199</link><guid>http://nomel.org/post/30006589199</guid><pubDate>Wed, 22 Aug 2012 22:03:00 -0400</pubDate><category>ti</category><category>am335x</category><category>am3358</category><category>embedded linux</category><category>BeagleBone</category><category>gpio</category><category>toggle gpio</category><category>pru</category><category>PRU-ICSS</category><category>global memory</category></item><item><title>Idea: Remote temperature sensing for combustion chambers</title><description>&lt;p&gt;Using a few infrared detectors with various wavelengths placed near the intake valve, you could pretty accurately estimate the maximum temperature inside the combustion chamber when the valve opened.&lt;/p&gt;
&lt;p&gt;The internals of the combustion chamber would reflect infrared pretty perfectly, allowing it to bounce out of the intake valve while it was opened. The multiple infrared detectors would have overlapping response curves to allow a multi-spectral infrared color estimation. Using the maximum detected color, you could estimate the temperature by comparing it to a blackbody radiator.&lt;/p&gt;
&lt;p&gt;The valve-closed levels could be used to cancel any ambient levels, and the signal could be filtered against the changes in intensity from the changes in valve aperture size as the valve opened and closed.&lt;/p&gt;
&lt;p&gt;Being near the intake, the sensor might stay clean clean. A window could be placed in the side of the intake pipe to keep the sensor out of harms way, with a light collector of some kind focused on the intake valve.&lt;/p&gt;
&lt;p&gt;Maximum temperature is nice to know since it is what would cause any pre-ignition.&lt;/p&gt;</description><link>http://nomel.org/post/29579391762</link><guid>http://nomel.org/post/29579391762</guid><pubDate>Thu, 16 Aug 2012 18:51:00 -0400</pubDate></item><item><title>Idea: Motion Sickness Surface</title><description>&lt;p&gt;To help prevent car sickness while reading, use the &amp;#8220;make sure the horizon is in view&amp;#8221; approach by back-illuminating the page you&amp;#8217;re reading with a pattern that remains, from an inertial perspective, stable.&lt;/p&gt;
&lt;p&gt;A notepad holder/device cover (like iPad) with a low res led pattern, a gyro, and an accelerometer. The led matrix would display a pattern that would remain relatively constant in space, held by the gyro and accelerometers.&lt;/p&gt;
&lt;p&gt;So, as you bounced your way down the rail line, the page would appear to move around on the pattern, matching the acceleration signals from your semicircular canals.&lt;/p&gt;
&lt;p&gt;With a decent graphics card, this could be built into laptops/tablets to move images, text, or the whole screen image, around on the display space.&lt;/p&gt;
&lt;p&gt;Fixed patterns would also make an interesting Halloween costume.&lt;/p&gt;</description><link>http://nomel.org/post/25452834263</link><guid>http://nomel.org/post/25452834263</guid><pubDate>Tue, 19 Jun 2012 16:13:00 -0400</pubDate></item></channel></rss>
