<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="sodnpoo.xsl" type="text/xsl"?>
<xml showalllink="/?x=&amp;n=all"><a href="http://sodnpoo.com/?x=html">HTML version</a><post>
  <title>arduino mx25l 4mb flash</title>
  <date>
  3 May 2013
  </date>
  <p>
  </p>
  <image src="/posts.assets/MX25L3205D_1.jpg"/>
  <p>
  The above image is a MX25L3205 4MB flash chip mounted on a stripboard breakout. It was salvaged from a laptop motherboard that had been water damaged (a couple of the bigger power transistors were melted along with some burn marks where I presume tracks used to be). 
  </p>
  <p>  
  I carefully desoldered it and measured it against a small, scrap piece of stripboard. The original plan was to bug wire it but as the inner legs happen to have the same spacing as the stripboard tracks I just needed to bend the outer legs first up so they were now flat rather than pointing down and then out into an L shape, so that when on the stripboard the tips would just be above next track along. A single blob of solder was used on an inner leg to position and hold the it in place while the others were soldered. To minimise the likely-hood of shorts - and particularly on the outer legs - I tried to use only just enough solder to let the surface tension touch the tips. It's not beautiful but as my first attempt to solder an SMD part I'm quite pleased with the result - and there were no shorts either!
  </p>
  <image src="/posts.assets/MX25L3205D_2.jpg"/>
  <p>
  The arduino is connected over the SPI bus, but as the MX25L3205 is a 3.3v part the three output pins (SCK/yellow, MOSI/green, SS/blue) are put through voltage dividers (1.8KOhm/3.3KOhm) to protect it. As 3.3v is above the threshold needed for the arduino to register a line as high, MISO/orange is just directly connected.
  
  </p>
  <p>  
  Pin configuration:
  </p>
  <image src="/posts.assets/MX25L3205D_3.jpg"/>
  <p>
    <ol>
      <li>
      CS - SS/D10
      </li>
      <li>
      SO - MISO/D12
      </li>
      <li>
      WP/ACC - 3.3v
      </li>
      <li>
      GND
      </li>
      <li>
      VCC - 3.3v
      </li>
      <li>
      HOLD - 3.3v
      </li>
      <li>
      SCLK - SCK/D13
      </li>
      <li>
      SI - MOSI/D11
      </li>
    </ol>  
  </p>
  <p>
  With the hardware side completed I wrote some simple code to issue the 'read identification'/RDID command. It took some minor tweaks to get the data I was expecting but once I got 0xC2, 0x20, 0x15 I knew the chip was good.
  </p>
  <p>
  I suspected that it was the dead laptop's bios chip so decided next to dump the contents to a file to find out. For this I implemented the READ command and pushed the results to the PC via the arduino's serial. It took a while to dump the whole 4 MB - the method I used was less than optimal - but running the dump file through strings produced this snippet:
  </p>
  <pre>
?d?d?d?dn
... DEBUG BUFFER OVERFLOW!!!
EFI_LOAD_ERROR
EFI_INVALID_PARAMETER
EFI_UNSUPPORTED
EFI_BAD_BUFFER_SIZE
EFI_BUFFER_TOO_SMALL
EFI_NOT_READY
EFI_DEVICE_ERROR
EFI_WRITE_PROTECTED
EFI_OUT_OF_RESOURCES
EFI_VOLUME_CORRUPTED
EFI_VOLUME_FULL  
  </pre>
  <p>
  Which seems to confirm it's an EFI bios. Also in there was:
  </p>  
  <pre>
9p?-
w(mA
DELL
0102$DELG
Inspiron N5010
$BV#
A02$DI$G
  </pre>
  <p>
  I've extended the code out to be interactively command driven, and implemented enough commands to be able to read and write to it. The currently available commands are:
  </p>
  <pre>
h        : print help  
d        : print RDID  
s        : print RDSR  
u&lt;x&gt; &lt;y&gt; : dump from x for y bytes  
w        : WREN (write enable)
i        : WRDI (write disable)
c        : CE (chip erase)
e&lt;sector&gt;: SE (sector erase)
b&lt;block&gt; : BE (block erase)
q&lt;x&gt; &lt;y&gt; : PP write byte y at address x  
  </pre>
  <p>
  The code expects 'Newline' to be selected in the arduino serial monitor. Where a parameter is required you can use any notation strtol() allows e.g. to dump the first ten bytes both "u0 10" and "u0x00 0x0a" will work. To write to the chip you first need to issue a 'write enable'/WREN command and then a 'program page'/PP. Be aware that PP only flips bits to 0, it doesn't flip them to 1 because of this it's recommended you erase the chip(CE)/sector(SE)/block(BE) before writing. For more information please see the <a href="https://www.google.co.uk/search?q=mx25l3205dm2i-12g%20datasheet">datasheet</a>.
  </p>
  <pre>
/*
MX25L3205D

Requires PC side sending \n (Newline) as line ending
*/

#include &lt;SPI.h&gt;

const int slaveSelectPin = 10;

void setup() {
  Serial.begin(9600);

  pinMode (slaveSelectPin, OUTPUT);

  // initialize SPI:
  SPI.begin(); 
  SPI.setDataMode(SPI_MODE3);
  SPI.setBitOrder(MSBFIRST);
}

void Print_Help(){
  Serial.println(" h        : print help");  
  Serial.println(" d        : print RDID");  
  Serial.println(" s        : print RDSR");  
  Serial.println(" u&lt;x&gt; &lt;y&gt; : dump from x for y bytes");  
  Serial.println(" w        : WREN (write enable)");
  Serial.println(" i        : WRDI (write disable)");
  Serial.println(" c        : CE (chip erase)");
  Serial.println(" e&lt;sector&gt;: SE (sector erase)");
  Serial.println(" b&lt;block&gt; : BE (block erase)");
  Serial.println(" q&lt;x&gt; &lt;y&gt; : PP write byte y at address x");
}

unsigned long SerialReadLongUntil(char until){
  String s;
  char c = 0;        
  while(c != until){
    if(Serial.available() &gt; 0){
      c = Serial.read();
      s += c;
    }
  }
  char buf[16]; 
  s.toCharArray(buf, 16);
  return (unsigned long)strtol(buf, NULL, 0);  
}

void loop() {

  if (Serial.available() &gt; 0) {
    switch(Serial.read()){
      
      case 'h':
        Print_Help();
      break;
      case 'd':
        Print_RDID();
      break;
      case 's':
        Print_RDSR();
      break;
      
      case 'u': { //some validation would be nice...
        unsigned long start = SerialReadLongUntil(' ');
        unsigned long len = SerialReadLongUntil('\n');
        Dump(start, len);
        break;
      }
      case 'w':
        WREN();
      break;
      case 'i':
        WRDI();
      break;
      case 'c':
        CE();
      break;
      case 'e': {
        unsigned long addr = SerialReadLongUntil('\n');
        _SE(addr);
        break;
      }
      case 'b': {
        unsigned long addr = SerialReadLongUntil('\n');
        BE(addr);
        break;
      }
      
      case 'q': { //write a single byte
        unsigned long addr = SerialReadLongUntil(' ');
        byte val = SerialReadLongUntil('\n');
        WritePP1(addr, val);
        Dump(addr, 1);
        break;
      }
      
    }
  }

}

/*
(6) Read Data Bytes (READ)
The read instruction is for reading data out. The address is latched on rising edge of SCLK, and data shifts out on the falling
edge of SCLK at a maximum frequency fR. The first address byte can be at any location. The address is automatically
increased to the next higher address after each byte data is shifted out, so the whole memory can be read out at a single
READ instruction. The address counter rolls over to 0 when the highest address has been reached.
The sequence of issuing READ instruction is: CS# goes low-&gt; sending READ instruction code-&gt; 3-byte address on SI
-&gt; data out on SO-&gt; to end READ operation can use CS# to high at any time during data out. (see Figure. 17)
*/
void READ(){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x03); //READ
  SPI.transfer(0x00); // start at 0x000000
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  unsigned long addr = 0x000000;
  while(addr &lt;= 0x3FFFFF){ //3FFFFFh 32 Mb
    byte val = SPI.transfer(0x00);
    Serial.println(val, HEX);
    addr++;
  }
  digitalWrite(slaveSelectPin,HIGH);  
}
/*
(3) Read Identification (RDID)
The RDID instruction is for reading the manufacturer ID of 1-byte and followed by Device ID of 2-byte. The MXIC
Manufacturer ID is C2(hex), the memory type ID is 20(hex) as the first-byte device ID, and the individual device ID of
second-byte ID are listed as table of "ID Definitions".
The sequence of issuing RDID instruction is: CS# goes low-&gt; sending RDID instruction code -&gt; 24-bits ID data out on SO
-&gt; to end RDID operation can use CS# to high at any time during data out. (see Figure. 14)
While Program/Erase operation is in progress, it will not decode the RDID instruction, so there's no effect on the cycle of
program/erase operation which is currently in progress. When CS# goes high, the device is at standby stage.
*/
void RDID(byte *manufacturerID, byte *memorytypeID, byte *memory){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x9f);
  *manufacturerID = SPI.transfer(0x00);
  *memorytypeID = SPI.transfer(0x00);
  *memory = SPI.transfer(0x00);
  digitalWrite(slaveSelectPin,HIGH); 
}

void Print_RDID(){
  byte manufacturerID, memorytypeID, memory;
  RDID(&amp;manufacturerID, &amp;memorytypeID, &amp;memory);
  
  Serial.print("manufacturerID: ");
  Serial.println(manufacturerID, HEX);
  Serial.print("memorytypeID:   ");
  Serial.println(memorytypeID, HEX);
  Serial.print("memory:         ");
  Serial.println(memory, HEX);
}

/*
(4) Read Status Register (RDSR)
The RDSR instruction is for reading Status Register Bits. The Read Status Register can be read at any time (even in
program/erase/write status register condition) and continuously. It is recommended to check the Write in Progress (WIP)
bit before sending a new instruction when a program, erase, or write status register operation is in progress.
The sequence of issuing RDSR instruction is: CS# goes low-&gt; sending RDSR instruction code-&gt; Status Register data out
on SO (see Figure. 15)
*/
void RDSR(byte *rdsr){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x05);
  *rdsr = SPI.transfer(0x00);
  digitalWrite(slaveSelectPin,HIGH);   
}

void Print_RDSR(){
  byte rdsr = 0;
  RDSR(&amp;rdsr);
  
  Serial.print("WIP : ");
  Serial.println(rdsr &amp; 1);
  Serial.print("WEL : ");
  Serial.println(rdsr &gt;&gt; 1 &amp; 1);
  Serial.print("BP0 : ");
  Serial.println(rdsr &gt;&gt; 2 &amp; 1);
  Serial.print("BP1 : ");
  Serial.println(rdsr &gt;&gt; 3 &amp; 1);
  Serial.print("BP2 : ");
  Serial.println(rdsr &gt;&gt; 4 &amp; 1);
  Serial.print("BP3 : ");
  Serial.println(rdsr &gt;&gt; 5 &amp; 1);
  Serial.print("CP  : ");
  Serial.println(rdsr &gt;&gt; 6 &amp; 1);
  Serial.print("SRWD: ");
  Serial.println(rdsr &gt;&gt; 7 &amp; 1);
}

/*
(1) Write Enable (WREN)
The Write Enable (WREN) instruction is for setting Write Enable Latch (WEL) bit. For those instructions like PP, CP, SE,
BE, CE, and WRSR, which are intended to change the device content, should be set every time after the WREN instruction
setting the WEL bit.
The sequence of issuing WREN instruction is: CS# goes low-&gt; sending WREN instruction code-&gt; CS# goes high. (see
Figure 12)
*/
void WREN(){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x06);
  digitalWrite(slaveSelectPin,HIGH);   
}

/*
The Write Disable (WRDI) instruction is for resetting Write Enable Latch (WEL) bit.
The sequence of issuing WRDI instruction is: CS# goes low-&gt; sending WRDI instruction code-&gt; CS# goes high. (see Figure
13)
*/
void WRDI(){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x04);
  digitalWrite(slaveSelectPin,HIGH);   
}

/* chip erase */
void CE(){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x60);
  digitalWrite(slaveSelectPin,HIGH);   
}

/* sector erase */
//needs the damn underscore as SE is defined elsewhere...
void _SE(unsigned long addr){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0xd8);
  SPI.transfer(addr &gt;&gt; 16 &amp; 0xff);
  SPI.transfer(addr &gt;&gt; 8 &amp; 0xff);
  SPI.transfer(addr &amp; 0xff);
  digitalWrite(slaveSelectPin,HIGH);   
}
/* block erase */
void BE(unsigned long addr){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0xd8);
  SPI.transfer(addr &gt;&gt; 16 &amp; 0xff);
  SPI.transfer(addr &gt;&gt; 8 &amp; 0xff);
  SPI.transfer(addr &amp; 0xff);
  digitalWrite(slaveSelectPin,HIGH);   
}

void PP(){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x02);
  SPI.transfer(0x00); // start at 0x000000
  SPI.transfer(0x00);
  SPI.transfer(0x00);

  SPI.transfer('A');
  SPI.transfer('B');
  SPI.transfer('C');
  SPI.transfer('D');
  SPI.transfer('E');
  SPI.transfer('F');
  SPI.transfer('G');
  SPI.transfer('H');
  SPI.transfer('I');
  SPI.transfer('J');
  SPI.transfer('K');

  digitalWrite(slaveSelectPin,HIGH);   
}

void DumpStart(unsigned long count){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x03); //READ
  SPI.transfer(0x00); // start at 0x000000
  SPI.transfer(0x00);
  SPI.transfer(0x00);
  unsigned long addr = 0x000000;
  while(addr &lt; count){ //3FFFFFh 32 Mb
    byte val = SPI.transfer(0x00);
    Serial.print(addr, HEX);
    Serial.print('\t');
    Serial.print('\t');
    Serial.print(val, HEX);
    Serial.print('\t');
    Serial.println(char(val));
    addr++;
    //delay(100);
  }
  digitalWrite(slaveSelectPin,HIGH);   
}

void Dump(unsigned long addr, unsigned long count){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x03); //READ
  SPI.transfer(addr &gt;&gt; 16 &amp; 0xff);
  SPI.transfer(addr &gt;&gt; 8 &amp; 0xff);
  SPI.transfer(addr &amp; 0xff);
  count = addr + count;
  while(addr &lt; count){ //3FFFFFh 32 Mb
    byte val = SPI.transfer(0x00);
    Serial.print(addr, HEX);
    Serial.print('\t');
    Serial.print('\t');
    Serial.print(val, HEX);
    Serial.print('\t');
    Serial.println(char(val));
    addr++;
  }
  digitalWrite(slaveSelectPin,HIGH);   
}

void WritePP1(unsigned long addr, byte val){
  digitalWrite(slaveSelectPin,LOW);
  SPI.transfer(0x02);
  SPI.transfer(addr &gt;&gt; 16 &amp; 0xff);
  SPI.transfer(addr &gt;&gt; 8 &amp; 0xff);
  SPI.transfer(addr &amp; 0xff);
  SPI.transfer(val);
  digitalWrite(slaveSelectPin,HIGH);   
}  
  </pre>
  <p>
  I've left a couple of unexposed functions in the code (PP(), DumpStart() and READ()) as they might be useful if someone needs to extend it any further.
  </p>
</post><post>
  <title>a10 uart</title>
  <date>
  15 Apr 2013
  </date>
  <p>
  </p>
  <image src="/posts.assets/a10_uart1.jpg"/>
  <p>
  Now I have a working <a href="http://www.sodnpoo.com/posts.xml/variable_sample_rate_stellaris_logic_analyser.xml">logic analyser</a> I wanted to see if I could use it to find the serial console ports hidden away on the main boards of one of the embedded linux devices I have. I decided to look at the no-name, 7 inch android tablet I was given last year as it's based on the Allwinner A10 - there are huge numbers of devices based on these chips so some familiarity with the architecture can be only be a good thing.
  </p>
  <p>
  Finding the uart turned out to be pretty easy; on bottom left of the mainboard there are two groups of three copper pads, I first used my multimeter to identify the grounds - on both groups this was the left pad - then I checked the voltages on the other pads to be sure that I wasn't about to damage anything.
  </p>
  <p>
  Then using a stellaris and OLS set to capture at 2MHz I held a probe on each of the four remaining pads in turn and pressed the power button, hoping that the wake from sleep would produce some kernel messages. The group of pads on the right side of the board didn't seem to do much, the centre pad looks to be connected to the power button and the other one might just be v+. Testing on the centre pin on the other set of pads showed binary data though and once run though the uart analyser in OLS was exactly the kernel messages I was expecting.
  </p>
  <image src="/posts.assets/a10_uart2.jpg"/>
  <p>
  I soldered three wires onto the pads and put a female header on the other end, then assembled a FTDI usb&lt;-&gt;uart breakout and a 5v to 3.3v level shifter (as the A10 appears to be a 3.3v system) on a small breadboard. After connecting the USB to a PC I then used cu to connect to ttyUSB0 at 115200. At this point I now had an interactive root shell and decided to reboot the device to get the boot logs:
  </p>
  <pre>
HELLO! BOOT0 is starting!
boot0 version : .2.2
dram size =512
Succeed in opening nand flash.
Succeed in reading Boot1 file head.
The size of Boot1 is 0x00036000.
The file stored in 0X00000000 of block 2 is perfect.
Check is correct.
Ready to disable icache.
Succeed in loading Boot1.
Jump to Boot1.
[       0.122] boot1 version : 1.2.6
[       0.122] pmu type = 3
[       0.123] bat vol = 3919
[       0.152] axi:ahb:apb=3:2:2
[       0.152] set dcdc2=1400, clock=1008 successed
[       0.154] key
[       0.167] no key found
[       0.167] flash init start
[       0.182] flash init finish
[       0.184] fs init ok
[       0.184] fattype FAT16
[       0.185] fs mount ok
[       0.191] script finish
[       0.192] power finish
[       0.196] BootMain start
[       0.196] 0
[       0.205] gpio config
[       0.205] gpio finish
[       0.279] startup status = -1
[       0.279] The all optional count is 1
[       0.281] key high 6, low 4
[       0.284] key value = -1
[       0.287] key invalid
[       0.292] test for multi os boot with display
[       0.295] ERR: Parse_Pic_BMP failed
[       0.297] show pic finish
[       0.300] load kernel start
[       0.773] load kernel successed
[       0.773] start address = 0x40008000
[       0.775] jump to
[    0.000000] Linux version 2.6.36-android (paco@inet) (gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50) ) #5 PREEMPT Wed Mar 7 15:51:05 CST 2012
[    0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=10c53c7f
[    0.000000] CPU: VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine: sun4i
[    0.000000] Lichee System fixup
[    0.000000] Total Detected Memory: 512MB with 1 banks
[    0.000000] fbmem: start=0x5a000000, size=0x02000000
[    0.000000] Memory Reserved:
[    0.000000]   VE:	0x43000000, 0x04a00000
[    0.000000]   FB:	0x5a000000, 0x02000000
[    0.000000]   G2D:	0x58000000, 0x01000000
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] On node 0 totalpages: 114688
[    0.000000] free_area_init_node: node 0, pgdat c07b4910, node_mem_map c0873000
[    0.000000]   DMA zone: 896 pages used for memmap
[    0.000000]   DMA zone: 0 pages reserved
[    0.000000]   DMA zone: 113792 pages, LIFO batch:31
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 113792
[    0.000000] Kernel command line: console=ttyS0,115200 root=/dev/nandb rw init=/init fbmem=32M@0x5a000000 loglevel=8;
[    0.000000] 
[    0.000000] 
[    0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[    0.000000] Memory: 448MB = 448MB total
[    0.000000] Memory: 321176k/321176k available, 137576k reserved, 0K highmem
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     DMA     : 0xfee00000 - 0xffe00000   (  16 MB)
[    0.000000]     vmalloc : 0xdc800000 - 0xf0000000   ( 312 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xdc000000   ( 448 MB)
[    0.000000]     pkmap   : 0xbfe00000 - 0xc0000000   (   2 MB)
[    0.000000]     modules : 0xbf000000 - 0xbfe00000   (  14 MB)
[    0.000000]       .init : 0xc0008000 - 0xc002f000   ( 156 kB)
[    0.000000]       .text : 0xc002f000 - 0xc0772000   (7436 kB)
[    0.000000]       .data : 0xc0772000 - 0xc07b5540   ( 270 kB)
[    0.000000] SLUB: Genslabs=9, HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Hierarchical RCU implementation.
[    0.000000] 	RCU-based detection of stalled CPUs is disabled.
[    0.000000] 	Verbose stalled-CPUs detection is disabled.
[    0.000000] NR_IRQS:96
[    0.000000] timer_set_mode: periodic
[    0.000000] Console: colour dummy device 80x30
[    0.000000] Calibrating delay loop... 1005.97 BogoMIPS (lpj=5029888)
[    0.240000] pid_max: default: 32768 minimum: 301
[    0.250000] Mount-cache hash table entries: 512
[    0.250000] CPU: Testing write buffer coherency: ok
[    0.250000] devtmpfs: initialized
[    0.250000] DRAM Size: 512
[    0.250000] regulator: core version 0.5
[    0.250000] NET: Registered protocol family 16
[    0.250000] hw perfevents: enabled with ARMv7 Cortex-A8 PMU driver, 5 counters available
[    0.250000] SOFTWINNER DMA Driver, (c) 2003-2004,2006 Simtec Electronics
[    0.250000] bio: create slab &lt;bio-0&gt; at 0
[    0.250000] SCSI subsystem initialized
[    0.250000] libata version 3.00 loaded.
[    0.260000] usbcore: registered new interface driver usbfs
[    0.260000] usbcore: registered new interface driver hub
[    0.260000] usbcore: registered new device driver usb
[    0.260000] Advanced Linux Sound Architecture Driver Version 1.0.23.
[    0.260000] Bluetooth: Core ver 2.15
[    0.260000] NET: Registered protocol family 31
[    0.260000] Bluetooth: HCI device and connection manager initialized
[    0.260000] Bluetooth: HCI socket layer initialized
[    0.260000] cfg80211: Calling CRDA to update world regulatory domain
[    0.260000] Init eGon pin module V2.0
[    0.260000] Switching to clocksource aw 64bits couter
[    0.260000] NET: Registered protocol family 2
[    0.260000] IP route cache hash table entries: 4096 (order: 2, 16384 bytes)
[    0.270000] TCP established hash table entries: 16384 (order: 5, 131072 bytes)
[    0.270000] TCP bind hash table entries: 16384 (order: 4, 65536 bytes)
[    0.270000] TCP: Hash tables configured (established 16384 bind 16384)
[    0.270000] TCP reno registered
[    0.270000] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    0.270000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    0.270000] NET: Registered protocol family 1
[    0.270000] RPC: Registered udp transport module.
[    0.270000] RPC: Registered tcp transport module.
[    0.270000] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.270000] sw_sys: init
[    0.270000] [pm]aw_pm_init!
[    0.270000] ashmem: initialized
[    0.280000] NTFS driver 2.1.29 [Flags: R/W].
[    0.280000] fuse init (API version 7.15)
[    0.280000] msgmni has been set to 627
[    0.280000] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
[    0.280000] io scheduler noop registered
[    0.280000] io scheduler deadline registered
[    0.280000] io scheduler cfq registered (default)
[    0.280000] G2D: drv_g2d_init
[    0.280000] G2D: g2dmem: g2d_start=58000000, g2d_size=1000000
[    0.280000] G2D: head:d8000000,tail:d9000000
[    0.280000] G2D: Module initialized.major:251
[    0.280000] sw-uart.0: ttyS0 at MMIO 0x1c28000 (irq = 1) is a sw-uart0
[    0.820000] console [ttyS0] enabled
[    0.820000] sw-uart.2: ttyS2 at MMIO 0x1c28800 (irq = 3) is a sw-uart2
[    0.830000] brd: module loaded
[    0.840000] loop: module loaded
[    0.840000] [NAND]nand driver, init.
[    0.850000] [NAND] nand gpio_request
[    0.850000] [NAND] nand driver version: 0x2 0x9 
[    0.850000] [NAND] nand driver update: 20120214
[    0.860000] nand interrupte register ok
[    0.860000] ret of NFC_ChangMode is 0 
[    0.870000] dma_hdle  is 0 
[    0.870000] dma_hdle  is 10000008 
[    0.890000] The 0 disk name = BOOTFS, class name = DISK, disk size = 32768
[    0.900000] The 1 disk name = LROOTFS, class name = DISK, disk size = 65536
[    0.910000] The 2 disk name = LSYSTEMFS, class name = DISK, disk size = 524288
[    0.920000] The 3 disk name = LDATAFS, class name = DISK, disk size = 3774874
[    0.920000] The 4 disk name = MISC, class name = DISK, disk size = 2048
[    0.930000] The 5 disk name = LRECOVERYFS, class name = DISK, disk size = 65536
[    0.940000] The 6 disk name = LCACHEFS, class name = DISK, disk size = 262144
[    0.950000] The 7 disk name = UDISK, class name = DISK, disk size = 3053158
[    0.960000] The 7 disk size = 3053158
[    0.960000] part total count = 8
[    0.960000]  nanda:
[    0.970000]  nandb: unknown partition table
[    0.970000]  nandc: unknown partition table
[    0.980000]  nandd: unknown partition table
[    0.990000]  nande: unknown partition table
[    0.990000]  nandf: unknown partition table
[    1.000000]  nandg: unknown partition table
[    1.010000]  nandh:
[    1.010000] benn: nand probe enter
[    1.010000] [NAND]nand driver, ok.
[    1.020000] PPP generic driver version 2.4.2
[    1.020000] PPP Deflate Compression module registered
[    1.030000] PPP BSD Compression module registered
[    1.030000] PPP MPPE Compression module registered
[    1.040000] NET: Registered protocol family 24
[    1.040000] emac driver is disabled 
[    1.050000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.050000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[    1.060000] [sw-ehci1]: probe, pdev-&gt;name: sw-ehci, pdev-&gt;id: 1, sw_ehci: 0xc07f3424
[    1.070000] [sw-ehci1]: open clock
[    1.090000] [sw-ehci1]: Set USB Power ON
[    1.100000] sw-ehci sw-ehci.1: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.110000] sw-ehci sw-ehci.1: new USB bus registered, assigned bus number 1
[    1.110000] sw-ehci sw-ehci.1: irq 39, io mem 0xf1c14000
[    1.140000] sw-ehci sw-ehci.1: USB 0.0 started, EHCI 1.00
[    1.140000] hub 1-0:1.0: USB hub found
[    1.150000] hub 1-0:1.0: 1 port detected
[    1.150000] [sw-ohci1]: probe, pdev-&gt;name: sw-ohci, pdev-&gt;id: 1, sw_ohci: 0xc07f3534
[    1.160000] [sw-ohci1]: open clock
[    1.180000] sw-ohci sw-ohci.1: SW USB2.0 'Open' Host Controller (OHCI) Driver
[    1.190000] sw-ohci sw-ohci.1: new USB bus registered, assigned bus number 2
[    1.200000] sw-ohci sw-ohci.1: irq 64, io mem 0xf1c14400
[    1.260000] hub 2-0:1.0: USB hub found
[    1.260000] hub 2-0:1.0: 1 port detected
[    1.270000] [sw-ehci2]: probe, pdev-&gt;name: sw-ehci, pdev-&gt;id: 2, sw_ehci: 0xc07f3648
[    1.280000] [sw-ehci2]: open clock
[    1.300000] [sw-ehci2]: Set USB Power ON
[    1.310000] sw-ehci sw-ehci.2: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[    1.310000] sw-ehci sw-ehci.2: new USB bus registered, assigned bus number 3
[    1.320000] sw-ehci sw-ehci.2: irq 40, io mem 0xf1c1c000
[    1.350000] sw-ehci sw-ehci.2: USB 0.0 started, EHCI 1.00
[    1.350000] ehci_irq: port change detect
[    1.360000] hub 3-0:1.0: USB hub found
[    1.360000] hub 3-0:1.0: 1 port detected
[    1.360000] [sw-ehci2]: sw_usb_disable_ehci
[    1.370000] [sw-ehci2]: remove, pdev-&gt;name: sw-ehci, pdev-&gt;id: 2, sw_ehci: 0xc07f3648
[    1.380000] sw-ehci sw-ehci.2: remove, state 1
[    1.380000] usb usb3: USB disconnect, address 1
[    1.390000] sw-ehci sw-ehci.2: USB bus 3 deregistered
[    1.400000] [sw-ehci2]: Set USB Power OFF
[    1.400000] [sw-ehci2]: close clock
[    1.400000] [sw-ohci2]: probe, pdev-&gt;name: sw-ohci, pdev-&gt;id: 2, sw_ohci: 0xc07f3758
[    1.410000] [sw-ohci2]: open clock
[    1.440000] [sw-ohci2]: Set USB Power ON
[    1.440000] sw-ohci sw-ohci.2: SW USB2.0 'Open' Host Controller (OHCI) Driver
[    1.450000] sw-ohci sw-ohci.2: new USB bus registered, assigned bus number 3
[    1.460000] sw-ohci sw-ohci.2: irq 65, io mem 0xf1c1c400
[    1.520000] hub 3-0:1.0: USB hub found
[    1.520000] hub 3-0:1.0: 1 port detected
[    1.530000] [sw-ohci2]: sw_usb_disable_ohci
[    1.530000] [sw-ohci2]: remove, pdev-&gt;name: sw-ohci, pdev-&gt;id: 2, sw_ohci: 0xc07f3758
[    1.540000] sw-ohci sw-ohci.2: remove, state 1
[    1.550000] usb usb3: USB disconnect, address 1
[    1.550000] sw-ohci sw-ohci.2: USB bus 3 deregistered
[    1.560000] [sw-ohci2]: Set USB Power OFF
[    1.560000] [sw-ohci2]: close clock
[    1.570000] Initializing USB Mass Storage driver...
[    1.570000] usbcore: registered new interface driver usb-storage
[    1.580000] USB Mass Storage support registered.
[    1.580000] usbcore: registered new interface driver usbserial
[    1.590000] USB Serial support registered for generic
[    1.600000] usbcore: registered new interface driver usbserial_generic
[    1.600000] usbserial: USB Serial Driver core
[    1.610000] USB Serial support registered for GSM modem (1-port)
[    1.610000] usbcore: registered new interface driver option
[    1.620000] option: v0.7.2:USB Driver for GSM modems
[    1.630000] WRN:L158(drivers/usb/sun4i_usb/manager/usb_manager.c):ERR: get usbc(1) id failed
[    1.640000] WRN:L164(drivers/usb/sun4i_usb/manager/usb_manager.c):ERR: get usbc(1) det_vbus failed
[    1.650000] WRN:L158(drivers/usb/sun4i_usb/manager/usb_manager.c):ERR: get usbc(2) id failed
[    1.660000] WRN:L164(drivers/usb/sun4i_usb/manager/usb_manager.c):ERR: get usbc(2) det_vbus failed
[    1.690000] sw_hcd_host0 sw_hcd_host0: sw_hcd host driver
[    1.690000] sw_hcd_host0 sw_hcd_host0: new USB bus registered, assigned bus number 3
[    1.700000] hub 3-0:1.0: USB hub found
[    1.710000] hub 3-0:1.0: 1 port detected
[    1.710000] android init
[    1.710000] android-platform_device_register
[    1.720000] ------print_msc_config-----
[    1.720000] vendor_id             = 0x18d1
[    1.730000] mass_storage_id       = 0x1
[    1.730000] adb_id                = 0x2
[    1.730000] usb_manufacturer_name = USB Developer
[    1.740000] usb_product_name      = Android
[    1.740000] usb_serial_number     = 20080411
[    1.750000] msc_vendor_name       = USB 2.0
[    1.750000] msc_product_name      = USB Flash Driver
[    1.760000] msc_release           = 100
[    1.760000] luns                  = 3
[    1.770000] ---------------------------
[    1.770000] android_probe pdata: c0790544
[    1.780000] WRN:L2671(drivers/usb/sun4i_usb/udc/sw_udc.c):ERR: usb device is not active
[    1.790000] android_bind
[    1.790000] android_bind_config
[    1.790000] Gadget Android: controller 'sw_usb_udc' not recognized
[    1.800000] WRN:L2671(drivers/usb/sun4i_usb/udc/sw_udc.c):ERR: usb device is not active
[    1.810000] android_usb gadget: android_usb ready
[    1.810000] f_adb init
[    1.820000] android_register_function adb
[    1.820000] f_mass_storage init
[    1.820000] fsg_probe pdev: c07906a0, pdata: c0790568
[    1.830000] android_register_function usb_mass_storage
[    1.840000] android_usb gadget: Mass Storage Function, version: 2009/09/11
[    1.840000] android_usb gadget: Number of LUNs=3
[    1.850000]  lun0: LUN: removable file: (no medium)
[    1.850000]  lun1: LUN: removable file: (no medium)
[    1.860000]  lun2: LUN: removable file: (no medium)
[    1.860000] adb_bind_config
[    1.870000] [ps2]: sw_ps2_init
[    1.870000] ps2: cannot find any unsing configuration for 2 ps/2 controller, return directly!
[    1.880000] mice: PS/2 mouse device common for all mice
[    1.890000] sun4i RTC version 0.1 
[    1.890000] sun4i-rtc sun4i-rtc: f23_rtc_probe tmp_data = 380239881
[    1.900000] using rtc device, rtc, for alarms
[    1.900000] sun4i-rtc sun4i-rtc: rtc core: registered rtc as rtc0
[    1.910000] i2c /dev entries driver
[    1.910000] ================power===================, status = 0 
[    1.920000] gsensor: registered bma250 @ addr 0x18
[    1.930000] ctp_used == 0. 
[    1.930000] ctp_used == 1. 
[    1.930000] i2c_info_ctp1[0].type is: Goodix-TS, name is Goodix-TS. 
[    1.940000] i2c: Goodix-TS_ctp1_twi_addr is 85, 0x55. 
[    1.950000] i2c: Goodix-TS_ctp_twi_id is 2. 
[    1.950000] ================Goodix-TS==============, twi_id = 2, status = 0 
[    1.960000] ctp_used == 1. 
[    1.960000] i2c_info_ctp2[0].type is: ssd253x-ts, name is ssd253x-ts. 
[    1.970000] i2c: ssd253x-ts_ctp2_twi_addr is 72, 0x48. 
[    1.970000] i2c: ssd253x-ts_ctp2_twi_id is 2. 
[    1.980000] ================ssd253x-ts==============, twi_id = 2, status = 0 
[    1.990000] ctp_used == 1. 
[    1.990000] i2c_info_ctp[0].type is: novatek-ts, name is novatek-ts. 
[    2.000000] i2c: novatek-ts_ctp_twi_addr is 1, 0x1. 
[    2.000000] i2c: novatek-ts_ctp3_twi_id is 2. 
[    2.010000] ================novatek-ts==============, twi_id = 2, status = 0 
[    2.020000] ctp4_used == 1. 
[    2.020000] i2c_info_ctp4[0].type is: ssd253x, name is ssd253x. 
[    2.030000] i2c: ssd253x_ctp4_twi_addr is 75, 0x4b. 
[    2.030000] i2c: ssd253x_ctp4_twi_id is 2. 
[    2.040000] ================ssd253x==============, twi_id = 2, status = 0 
[    2.040000] bus num = 0, twi used = 1 
[    2.050000] bus num = 1, twi used = 1 
[    2.050000] bus num = 2, twi used = 1 
[    2.060000] config i2c gpio with gpio_config api 
[    2.060000] twi0, apb clock = 24000000 
[    2.070000] _twi_set_clk: clk_n = 0, clk_m = 5
[    2.070000] axp_mfd 0-0034: AXP (CHIP ID: 0x21) detected
[    2.080000] [AXP]axp driver uning configuration failed(322)
[    2.090000] [AXP]power_start = 0
[    2.090000] I2C: i2c-0: AW16XX I2C adapter
[    2.090000] **********start************
[    2.100000] 0x40 
[    2.100000] 0xf8 
[    2.100000] 0x28 
[    2.100000] 0x0 
[    2.110000] 0x0 
[    2.110000] **********end************
[    2.110000] twi1, apb clock = 24000000 
[    2.120000] _twi_set_clk: clk_n = 0, clk_m = 11
[    2.120000] I2C: i2c-1: AW16XX I2C adapter
[    2.130000] **********start************
[    2.130000] 0x40 
[    2.130000] 0xf8 
[    2.140000] 0x58 
[    2.140000] 0x0 
[    2.140000] 0x0 
[    2.140000] **********end************
[    2.150000] twi2, apb clock = 24000000 
[    2.150000] _twi_set_clk: clk_n = 0, clk_m = 11
[    2.160000] I2C: i2c-2: AW16XX I2C adapter
[    2.160000] **********start************
[    2.160000] 0x40 
[    2.170000] 0xf8 
[    2.170000] 0x58 
[    2.170000] 0x0 
[    2.170000] 0x0 
[    2.170000] **********end************
[    2.180000] lirc_dev: IR Remote Control driver registered, major 250 
[    2.190000] IR NEC protocol handler initialized
[    2.190000] IR RC5(x) protocol handler initialized
[    2.200000] IR RC6 protocol handler initialized
[    2.200000] IR JVC protocol handler initialized
[    2.210000] IR Sony protocol handler initialized
[    2.210000] IR LIRC bridge handler initialized
[    2.220000] Linux video capture interface: v2.00
[    2.220000] usbcore: registered new interface driver em28xx
[    2.230000] em28xx driver loaded
[    2.230000] Em28xx: Initialized (Em28xx Audio Extension) extension
[    2.240000] cx231xx v4l2 driver loaded.
[    2.240000] usbcore: registered new interface driver cx231xx
[    2.250000] cx231xx: Cx231xx Audio Extension initialized
[    2.260000] usbcore: registered new interface driver usbvision
[    2.260000] USBVision USB Video Device Driver for Linux : 0.9.10
[    2.270000] usbcore: registered new interface driver pvrusb2
[    2.280000] pvrusb2: V4L in-tree version:Hauppauge WinTV-PVR-USB2 MPEG2 Encoder/Tuner
[    2.280000] pvrusb2: Debug mask is 31 (0x1f)
[    2.290000] SE401 usb camera driver version 0.24 registering
[    2.300000] usbcore: registered new interface driver se401
[    2.300000] usbcore: registered new interface driver zr364xx
[    2.310000] zr364xx: Zoran 364xx
[    2.310000] usbcore: registered new interface driver stkwebcam
[    2.320000] sn9c102: V4L2 driver for SN9C1xx PC Camera Controllers v1:1.47pre49
[    2.330000] usbcore: registered new interface driver sn9c102
[    2.330000] et61x251: V4L2 driver for ET61X[12]51 PC Camera Controllers v1:1.09
[    2.340000] usbcore: registered new interface driver et61x251
[    2.350000] pwc: Philips webcam module version 10.0.13 loaded.
[    2.350000] pwc: Supports Philips PCA645/646, PCVC675/680/690, PCVC720[40]/730/740/750 &amp; PCVC830/840.
[    2.360000] pwc: Also supports the Askey VC010, various Logitech Quickcams, Samsung MPC-C10 and MPC-C30,
[    2.370000] pwc: the Creative WebCam 5 &amp; Pro Ex, SOTEC Afina Eye and Visionite VCS-UC300 and VCS-UM100.
[    2.380000] pwc: Trace options: 0x0001
[    2.390000] usbcore: registered new interface driver Philips webcam
[    2.400000] gspca: main v2.10.0 registered
[    2.400000] usbcore: registered new interface driver hdpvr
[    2.410000] usbcore: registered new interface driver ibmcam
[    2.410000] usbcore: registered new interface driver ultracam
[    2.420000] konicawc: v1.4:Konica Webcam driver
[    2.420000] usbcore: registered new interface driver konicawc
[    2.430000] usbcore: registered new interface driver vicam
[    2.440000] usbcore: registered new interface driver s2255
[    2.440000] usbcore: registered new interface driver uvcvideo
[    2.450000] USB Video Class driver (v0.1.0)
[    2.450000] [cedar dev]: install start!!!
[    2.460000] [cedar dev]: install end!!!
[    2.460000] [ace_drv] init end!!!
[    2.470000] [pa_drv] start!!!
[    2.470000] [pa_drv] init end!!!
[    2.480000] regulator: axp20_ldo1: 1300 mV 
[    2.480000] regulator: axp20_ldo2: 1800 &lt;--&gt; 3300 mV at 3000 mV 
[    2.490000] regulator: axp20_ldo3: 700 &lt;--&gt; 3500 mV at 2800 mV 
[    2.500000] regulator: axp20_ldo4: 1250 &lt;--&gt; 3300 mV at 2800 mV 
[    2.500000] regulator: axp20_buck2: 700 &lt;--&gt; 2275 mV at 1400 mV 
[    2.510000] regulator: axp20_buck3: 700 &lt;--&gt; 3500 mV at 1250 mV 
[    2.520000] regulator: axp20_ldoio0: 1800 &lt;--&gt; 3300 mV at 2800 mV 
[    2.530000] input: axp20-supplyer as /devices/platform/aw16xx-i2c.0/i2c-0/0-0034/axp20-supplyer.28/input/input0
[    2.540000] [AXP]axp driver uning configuration failed(1580)
[    2.550000] [AXP]pmu_suspendpwroff_vol = 3500
[    2.560000] device-mapper: uevent: version 1.0.3
[    2.570000] device-mapper: ioctl: 4.18.0-ioctl (2010-06-29) initialised: dm-devel@redhat.com
[    2.580000] device-mapper: multipath: version 1.1.1 loaded
[    2.580000] device-mapper: multipath round-robin: version 1.0.0 loaded
[    2.590000] Bluetooth: HCI UART driver ver 2.2
[    2.600000] Bluetooth: HCI H4 protocol initialized
[    2.600000] Bluetooth: HCI BCSP protocol initialized
[    2.610000] Bluetooth: HCILL protocol initialized
[    2.610000] [mmc_pm]: no sdio card used in configuration
[    2.620000] [mmc]: awsmc_init
[    2.620000] [mmc]: awsmc controller unsing config sdc0 1, sdc1 1, sdc2 0, sdc3 1
[    2.630000] [mmc]: awsmc.0: pdev-&gt;name: awsmc, pdev-&gt;id: 00000000
[    2.640000] [mmc]: smc 0, source = sdram_pll_p, src_clk = 408000000, mclk 40800000, 
[    2.650000] [mmc]: MMC Driver init host 0
[    2.650000] [mmc]: sdc 0 idma des address d9a98000
[    2.660000] [mmc]: mmc 0 suspend pins
[    2.660000] [mmc]: awsmc.0: Initialisation Done. ret 0
[    2.670000] [mmc]: awsmc.1: pdev-&gt;name: awsmc, pdev-&gt;id: 00000001
[    2.670000] [mmc]: smc 1, source = sdram_pll_p, src_clk = 408000000, mclk 40800000, 
[    2.680000] [mmc]: MMC Driver init host 1
[    2.690000] [mmc]: sdc 1 idma des address d9a9c000
[    2.690000] [mmc]: mmc 1 suspend pins
[    2.700000] [mmc]: awsmc.1: Initialisation Done. ret 0
[    2.700000] [mmc]: awsmc.3: pdev-&gt;name: awsmc, pdev-&gt;id: 00000003
[    2.710000] [mmc]: smc 3, source = sdram_pll_p, src_clk = 408000000, mclk 81600000, 
[    2.720000] [mmc]: MMC Driver init host 3
[    2.720000] [mmc]: sdc 3 idma des address d9aa0000
[    2.730000] [mmc]: mmc 3 suspend pins
[    2.730000] [mmc]: awsmc.3: Initialisation Done. ret 0
[    2.740000] usbcore: registered new interface driver usbhid
[    2.740000] usbhid: USB HID core driver
[    2.750000] logger: created 64K log 'log_main'
[    2.750000] logger: created 256K log 'log_events'
[    2.760000] logger: created 64K log 'log_radio'
[    2.760000] logger: created 64K log 'log_system'
[    2.770000] enter sun4i Audio codec!!!
[    2.770000] sun4i audio support initialized
[    2.780000] baseaddr = dc84ac00
[    2.780000] audiocodec_adap_awxx_init: script_parser_fetch err. 
[    2.790000] sun4i Audio codec successfully loaded..
[    2.790000] No device for DAI sun4i-hdmiaudio
[    2.800000] No device for DAI SNDHDMI
[    2.800000] asoc: SNDHDMI &lt;-&gt; sun4i-hdmiaudio mapping ok
[    2.810000] [SPDIF]sun4i-spdif cannot find any using configuration for controllers, return directly!
[    2.820000] [SPDIF]sndspdif cannot find any using configuration for controllers, return directly!
[    2.830000] [SPDIF]sun4i_sndspdif cannot find any using configuration for controllers, return directly!
[    2.840000] usbcore: registered new interface driver snd-usb-audio
[    2.850000] usbcore: registered new interface driver snd-ua101
[    2.850000] usbcore: registered new interface driver snd-usb-caiaq
[    2.860000] ALSA device list:
[    2.870000]   #0: sun4i-CODEC  Audio Codec
[    2.870000]   #1: SUN4I_SNDHDMI (SNDHDMI)
[    2.870000] nf_conntrack version 0.5.0 (5018 buckets, 20072 max)
[    2.880000] IPv4 over IPv4 tunneling driver
[    2.890000] GRE over IPv4 tunneling driver
[    2.890000] ip_tables: (C) 2000-2006 Netfilter Core Team
[    2.900000] TCP cubic registered
[    2.900000] NET: Registered protocol family 10
[    2.910000] IPv6 over IPv4 tunneling driver
[    2.910000] NET: Registered protocol family 17
[    2.920000] NET: Registered protocol family 15
[    2.920000] Bluetooth: L2CAP ver 2.15
[    2.930000] Bluetooth: L2CAP socket layer initialized
[    2.930000] Bluetooth: SCO (Voice Link) ver 0.6
[    2.940000] Bluetooth: SCO socket layer initialized
[    2.940000] Bluetooth: RFCOMM TTY layer initialized
[    2.950000] Bluetooth: RFCOMM socket layer initialized
[    2.950000] Bluetooth: RFCOMM ver 1.11
[    2.960000] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    2.960000] Bluetooth: BNEP filters: protocol multicast
[    2.970000] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[    2.980000] L2TP core driver, V2.0
[    2.980000] PPPoL2TP kernel driver, V2.0
[    2.980000] lib80211: common routines for IEEE802.11 drivers
[    2.990000] lib80211_crypt: registered algorithm 'NULL'
[    3.000000] [mmc_pm]: No sdio card, please check your config !!
[    3.000000] VFP support v0.3: implementor 41 architecture 3 part 30 variant c rev 3
[    3.010000] regulator_init_complete: incomplete constraints, leaving axp20_buck3 on
[    3.020000] regulator_init_complete: incomplete constraints, leaving axp20_buck2 on
[    3.030000] regulator_init_complete: incomplete constraints, leaving axp20_ldo4 on
[    3.040000] regulator_init_complete: incomplete constraints, leaving axp20_ldo3 on
[    3.050000] regulator_init_complete: incomplete constraints, leaving axp20_ldo2 on
[    3.060000] sun4i-rtc sun4i-rtc: f23_rtc_gettime
[    3.060000] sun4i-rtc sun4i-rtc: read time 2010-1-1 0:1:46
[    3.070000] sun4i-rtc sun4i-rtc: setting system clock to 2010-01-01 00:01:46 UTC (1262304106)
[    3.110000] EXT3-fs (nandb): error: couldn't mount because of unsupported optional features (240)
[    3.120000] EXT2-fs (nandb): error: couldn't mount because of unsupported optional features (244)
[    3.140000] EXT4-fs (nandb): warning: maximal mount count reached, running e2fsck is recommended
[    3.150000] EXT4-fs (nandb): recovery complete
[    3.160000] EXT4-fs (nandb): mounted filesystem with ordered data mode. Opts: (null)
[    3.160000] VFS: Mounted root (ext4 filesystem) on device 93:8.
[    3.170000] devtmpfs: mounted
[    3.170000] Freeing init memory: 156K
[    3.470000] [LCD] lcd_module_init
[    4.160000] init: width = 800
[    4.160000] init: height = 480
[    4.160000] init: s.st_size = 1536000
[    4.260000] init:  do_mount 
[    4.270000] init:  do_mount 
[    4.270000] init:  do_mount 
[    4.270000] init:  do_mount 
[    4.280000] init:  do_mount 
[    4.280000] init:  do_mount 
[    4.290000] EXT4-fs (nandc): barriers disabled
[    4.310000] EXT4-fs (nandc): warning: maximal mount count reached, running e2fsck is recommended
[    4.320000] EXT4-fs (nandc): recovery complete
[    4.330000] EXT4-fs (nandc): mounted filesystem with ordered data mode. Opts: barrier=0
[    4.330000] init:  do_mount 
[    4.350000] EXT4-fs (nandd): barriers disabled
[   12.910000] JBD2: Disabling barriers on nandb-8, not supported by device
[   12.920000] EXT4-fs (nandd): recovery complete
[   13.400000] EXT4-fs (nandd): mounted filesystem with ordered data mode. Opts: barrier=0
[   13.410000] init: do_umount: /data 
[   14.090000] EXT4-fs (nandd): barriers disabled
[   14.100000] EXT4-fs (nandd): mounted filesystem with ordered data mode. Opts: noauto_da_alloc,barrier=0
[   14.110000] init:  do_mount 
[   14.120000] EXT4-fs (nandg): barriers disabled
[   15.100000] EXT4-fs (nandg): recovery complete
[   15.110000] EXT4-fs (nandg): mounted filesystem with ordered data mode. Opts: barrier=0
[   15.110000] init:  do_mount 
[   15.120000] init: dont need format /dev/block/nandh
[   15.220000] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.
[   15.230000] init: cannot find '/system/etc/install-recovery.sh', disabling 'flash_recovery'
[   15.760000] sun4i-ts.c: sun4i_ts_init: start ...
[   15.770000] rtp_used == 1. 
[   15.770000] sun4i-ts: tp_screen_size is 7 inch.
[   15.780000] sun4i-ts: tp_regidity_level is 5.
[   15.780000] sun4i-ts: tp_press_threshold_enable is 0.
[   15.790000] sun4i-ts: rtp_sensitive_level is 15.
[   15.790000] sun4i-ts: rtp_exchange_x_y_flag is 0.
[   15.800000] sun4i-ts.c: sun4i_ts_probe: start...
[   15.800000] begin get platform resourec
[   15.810000] input: sun4i-ts as /devices/platform/sun4i-ts/input/input1
[   15.820000] tp init
[   15.820000] sun4i-ts.c: sun4i_ts_probe: end
[   15.820000] ==register_early_suspend =
[   15.860000] input: sun4i-keyboard as /devices/virtual/input/input2
[   15.870000] ==register_early_suspend =
[   15.970000] UMP: UMP device driver  loaded
[   16.120000] mali: use config clk_div 3
[   16.130000] mali: clk_div 3
[   16.130000] Mali: mali clock set completed, clock is  320000000 Mhz
[   16.140000] mali: use config clk_div 3
[   16.140000] mali: clk_div 3
[   16.140000] Mali: mali clock set completed, clock is  320000000 Mhz
[   16.150000] Mali: Mali device driver  loaded
[   16.260000] [CSI]Welcome to CSI driver
[   16.270000] [CSI]registered sub device,input_num = 0
[   16.270000] [CSI]power on and power off camera!
[   16.320000] [CSI]V4L2 device registered as video0
[   16.340000] Bosch Sensortec Device detected!
[   16.340000] BMA250 registered I2C driver!
[   16.350000] input: bma250 as /devices/virtual/input/input3
[   16.460000] usbcore: registered new interface driver asix
[   16.510000] rtl8150: v0.6.2 (2004/08/27):rtl8150 based usb-ethernet driver
[   16.520000] usbcore: registered new interface driver rtl8150
[   16.570000] usbcore: registered new interface driver sr9700_android
[   16.620000] usbcore: registered new interface driver MOSCHIP usb-ethernet driver
[   16.650000] enabling adb
[   16.650000] adb_open
[   22.350000] warning: `zygote' uses 32-bit capabilities (legacy support in use)
[   65.800000] request_suspend_state: wakeup (3-&gt;0) at 65803651553 (2010-01-01 00:02:49.215197497 UTC)
[   65.990000] sw_usb_enable_hcd: usbc_num = 2
[   65.990000] [sw-ehci2]: sw_usb_enable_ehci
[   65.990000] [sw-ehci2]: probe, pdev-&gt;name: sw-ehci, pdev-&gt;id: 2, sw_ehci: 0xc07f3648
[   66.000000] [sw-ehci2]: open clock
[   66.030000] [sw-ehci2]: Set USB Power ON
[   66.040000] sw-ehci sw-ehci.2: SW USB2.0 'Enhanced' Host Controller (EHCI) Driver
[   66.050000] sw-ehci sw-ehci.2: new USB bus registered, assigned bus number 4
[   66.050000] sw-ehci sw-ehci.2: irq 40, io mem 0xf1c1c000
[   66.080000] sw-ehci sw-ehci.2: USB 0.0 started, EHCI 1.00
[   66.080000] ehci_irq: port change detect
[   66.090000] hub 4-0:1.0: USB hub found
[   66.100000] hub 4-0:1.0: 1 port detected
[   66.100000] [sw-ohci2]: sw_usb_enable_ohci
[   66.110000] [sw-ohci2]: probe, pdev-&gt;name: sw-ohci, pdev-&gt;id: 2, sw_ohci: 0xc07f3758
[   66.120000] [sw-ohci2]: open clock
[   66.140000] sw-ohci sw-ohci.2: SW USB2.0 'Open' Host Controller (OHCI) Driver
[   66.150000] sw-ohci sw-ohci.2: new USB bus registered, assigned bus number 5
[   66.160000] sw-ohci sw-ohci.2: irq 65, io mem 0xf1c1c400
[   66.220000] hub 5-0:1.0: USB hub found
[   66.220000] hub 5-0:1.0: 1 port detected
[   66.230000] 
[   66.230000] rtw driver version=v3.3.2_3192.20120103
[   66.240000] ##########rtw_suspend_lock_init ###########
[   66.250000] usbcore: registered new interface driver rtl8192cu
[   66.420000] usb 4-1: new high speed USB device using sw-ehci and address 2
[   66.570000] register rtw_netdev_ops to netdev_ops
[   66.570000] CHIP TYPE: RTL8188C_8192C
[   66.660000] 
[   66.660000] usb_endpoint_descriptor(0):
[   66.670000] bLength=7
[   66.670000] bDescriptorType=5
[   66.670000] bEndpointAddress=81
[   66.780000] wMaxPacketSize=200
[   66.790000] bInterval=0
[   66.790000] RT_usb_endpoint_is_bulk_in = 1
[   66.790000] 
[   66.790000] usb_endpoint_descriptor(1):
[   66.890000] bLength=7
[   66.890000] bDescriptorType=5
[   66.890000] bEndpointAddress=2
[   67.020000] wMaxPacketSize=200
[   67.020000] bInterval=0
[   67.020000] RT_usb_endpoint_is_bulk_out = 2
[   67.110000] 
[   67.110000] usb_endpoint_descriptor(2):
[   67.110000] bLength=7
[   67.200000] bDescriptorType=5
[   67.290000] bEndpointAddress=3
[   67.290000] wMaxPacketSize=200
[   67.290000] bInterval=0
[   67.390000] RT_usb_endpoint_is_bulk_out = 3
[   67.390000] 
[   67.390000] usb_endpoint_descriptor(3):
[   67.490000] bLength=7
[   67.490000] bDescriptorType=5
[   67.490000] bEndpointAddress=84
[   67.490000] wMaxPacketSize=40
[   67.600000] bInterval=1
[   67.600000] RT_usb_endpoint_is_int_in = 4, Interval = 1
[   67.740000] nr_endpoint=4, in_num=2, out_num=2
[   67.740000] 
[   67.740000] USB_SPEED_HIGH
[   67.750000] Chip Version ID: VERSION_NORMAL_TSMC_CHIP_88C.
[   67.750000] RF_Type is 3!!
[   67.760000] EEPROM type is E-FUSE
[   67.760000] ====&gt; ReadAdapterInfo8192C
[   67.760000] Boot from EFUSE, Autoload OK !
[   68.100000] EEPROMVID = 0x0bda
[   68.100000] EEPROMPID = 0x8176
[   68.120000] EEPROMCustomerID : 0x00
[   68.120000] EEPROMSubCustomerID: 0x00
[   68.120000] RT_CustomerID: 0x00
  </pre>
  <p>
  The 'BOOT0' stuff is the initial hardware boot loader (more information <a href="http://jas-hacks.blogspot.co.uk/2012/08/hackberry-a10-bootloader.html">here</a>) which has a button test mode; I couldn't exit from this and had to cut the battery wires to be able to reset the device!
  </p>
  <p>
  The mainboard is marked as "iNet-97F Rev 02" - more information <a href="http://linux-sunxi.org/INet-97F_Rev_02">here</a>.
  </p>
</post><post>
  <title>zoneminder export to directory</title>
  <date>31 Mar 2013</date>
  <p>
  Slightly modified version of zmvideo.pl that comes with <a href="http://www.zoneminder.com/">Zoneminder</a>. It exports both an event's images/stills and the video to a user specified directory.
  </p>
  <pre>
#!/usr/bin/perl -w
#!/usr/bin/perl -wT
#
# ==========================================================================
#
# ZoneMinder Video Creation Script, $Date: 2011-08-25 21:45:32 +0100 (Thu, 25 Aug 2011) $, $Revision: 3504 $
# Copyright (C) 2001-2008 Philip Coombes
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
#
# ==========================================================================
#
# This script is used to create MPEG videos of events for the web pages
# or as email attachments.
#
# Modified by lee@sodnpoo.com to output to directory
#
use strict;
use bytes;

# ==========================================================================
#
# You shouldn't need to change anything from here downwards
#
# ==========================================================================

# Include from system perl paths only
use ZoneMinder;
use DBI;
use Data::Dumper;
use POSIX qw(strftime);
use Getopt::Long qw(:config no_ignore_case );
use File::Copy

$| = 1;

$ENV{PATH}  = '/bin:/usr/bin';
$ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL};
delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};

logInit();

my $event_id;
my $format = 'mpg';
my $rate = '';
my $scale = '';
my $fps = '';
my $size = '';
my $overwrite = 0;
my $dest = '';

my @formats = split( /\s+/, ZM_FFMPEG_FORMATS );
for ( my $i = 0; $i &lt; @formats; $i++ )
{
	if ( $i =~ /^(.+)\*$/ )
	{
		$format = $formats[$i] = $1;
	}
}

sub Usage
{
	print( "
Usage: zmvideo.pl -e &lt;event_id&gt;,--event=&lt;event_id&gt; --dest &lt;directory&gt; [--format &lt;format&gt;] [--rate=&lt;rate&gt;] [--scale=&lt;scale&gt;] 
  [--fps=&lt;fps&gt;] [--size=&lt;size&gt;] [--overwrite]
Parameters are :-
-e&lt;event_id&gt;, --event=&lt;event_id&gt;  - What event to create the video for
-f&lt;format&gt;, --format=&lt;format&gt;     - What format to create the video in, default is mpg. For ffmpeg only.
-r&lt;rate&gt;, --rate=&lt;rate&gt;           - Relative rate , 1 = realtime, 2 = double speed , 0.5 = half speed etc
-s&lt;scale&gt;, --scale=&lt;scale&gt;        - Scale, 1 = normal, 2 = double size, 0.5 = half size etc
-F&lt;fps&gt;, --fps=&lt;fps&gt;              - Absolute frame rate, in frames per second
-S&lt;size&gt;, --size=&lt;size&gt;           - Absolute video size, WxH or other specification supported by ffmpeg
-o, --overwrite                   - Whether to overwrite an existing file, off by default.
-d, --dest                        - Directory to export to
");
	exit( -1 );
}

if ( !GetOptions( 'event=i'=&gt;\$event_id, 'format|f=s'=&gt;\$format, 'rate|r=f'=&gt;\$rate, 'scale|s=f'=&gt;\$scale, 'fps|F=f'=&gt;\$fps, 
  'size|S=s'=&gt;\$size, 'overwrite'=&gt;\$overwrite, 'dest|d=s'=&gt;\$dest ) )
{
	Usage();
}

if ( !$event_id || $event_id &lt; 0 )
{
	print( STDERR "Please give a valid event id\n" );
	Usage();
}

if ( !$dest  )
{
	print( STDERR "Please give a valid dest\n" );
	Usage();
}

if ( !ZM_OPT_FFMPEG )
{
	print( STDERR "Mpeg encoding is not currently enabled\n" );
	exit(-1);
}

if ( !$rate &amp;&amp; !$fps )
{
	$rate = 1;
}

if ( !$scale &amp;&amp; !$size )
{
	$scale = 1;
}

if ( $rate &amp;&amp; ($rate &lt; 0.25 || $rate &gt; 100) )
{
	print( STDERR "Rate is out of range, 0.25 &gt;= rate &lt;= 100\n" );
	Usage();
}

if ( $scale &amp;&amp; ($scale &lt; 0.25 || $scale &gt; 4) )
{
	print( STDERR "Scale is out of range, 0.25 &gt;= scale &lt;= 4\n" );
	Usage();
}

if ( $fps &amp;&amp; ($fps &gt; 30) )
{
	print( STDERR "FPS is out of range, &lt;= 30\n" );
	Usage();
}

my ( $detaint_format ) = $format =~ /^(\w+)$/;
my ( $detaint_rate ) = $rate =~ /^(-?\d+(?:\.\d+)?)$/;
my ( $detaint_scale ) = $scale =~ /^(-?\d+(?:\.\d+)?)$/;
my ( $detaint_fps ) = $fps =~ /^(-?\d+(?:\.\d+)?)$/;
my ( $detaint_size ) = $size =~ /^(\w+)$/;

$format = $detaint_format;
$rate = $detaint_rate;
$scale = $detaint_scale;
$fps = $detaint_fps;
$size = $detaint_size;

my $dbh = zmDbConnect();

my @filters;
my $sql = "select max(F.Delta)-min(F.Delta) as FullLength, E.*, unix_timestamp(E.StartTime) as Time, E.StartTime as Timestamp, 
  M.Name as MonitorName, M.Width as MonitorWidth, M.Height as MonitorHeight, M.Palette from Frames as F inner join Events as E 
  on F.EventId = E.Id inner join Monitors as M on E.MonitorId = M.Id where EventId = '$event_id' group by F.EventId";
my $sth = $dbh-&gt;prepare_cached( $sql ) or Fatal( "Can't prepare '$sql': ".$dbh-&gt;errstr() );
my $res = $sth-&gt;execute() or Fatal( "Can't execute: ".$sth-&gt;errstr() );
my $event = $sth-&gt;fetchrow_hashref();
$sth-&gt;finish();
my $event_path = getEventPath( $event );
chdir( $event_path );
( my $video_name = $event-&gt;{Name} ) =~ s/\s/_/g; 
( my $monitor_name = $event-&gt;{MonitorName} ) =~ s/\s/_/g; 
( my $timestamp_name = $event-&gt;{Timestamp} ) =~ s/\s/_/g; 
$timestamp_name =~ s/:/-/g; 

my @file_parts;
if ( $rate )
{
	my $file_rate = $rate;
	$file_rate =~ s/\./_/;
	$file_rate =~ s/_00//;
	$file_rate =~ s/(_\d+)0+$/$1/;
	$file_rate = 'r'.$file_rate;
	push( @file_parts, $file_rate );
}
elsif ( $fps )
{
	my $file_fps = $fps;
	$file_fps =~ s/\./_/;
	$file_fps =~ s/_00//;
	$file_fps =~ s/(_\d+)0+$/$1/;
	$file_fps = 'R'.$file_fps;
	push( @file_parts, $file_fps );
}

if ( $scale )
{
	my $file_scale = $scale;
	$file_scale =~ s/\./_/;
	$file_scale =~ s/_00//;
	$file_scale =~ s/(_\d+)0+$/$1/;
	$file_scale = 's'.$file_scale;
	push( @file_parts, $file_scale );
}
elsif ( $size )
{
	my $file_size = 'S'.$size;
	push( @file_parts, $file_size );
}

my $base_file = "$event-&gt;{Id}-$monitor_name-$video_name-$timestamp_name";
#my $video_file = $base_file."-".$file_parts[0]."-".$file_parts[1].".$format";

my $basedir = "$dest/$base_file/";

my $video_file = $basedir."video-".$file_parts[0]."-".$file_parts[1].".$format";

print "basedir: $basedir\n";
mkdir($basedir);

print "event_path: $event_path\n";

print "video_file: $video_file\n";

for my $imgfile (glob "$event_path/*.jpg") {
  copy($imgfile,$basedir);
}

if ( $overwrite || !-s $video_file )
#if(0)
{
	Info( "Creating video file $video_file for event $event-&gt;{Id}\n" );

    my $frame_rate = sprintf( "%.2f", $event-&gt;{Frames}/$event-&gt;{FullLength} );
    if ( $rate )
    {
        if ( $rate != 1.0 )
        {
            $frame_rate *= $rate;
        }
    }
    elsif ( $fps )
    {
        $frame_rate = $fps;
    }

    my $width = $event-&gt;{MonitorWidth};
    my $height = $event-&gt;{MonitorHeight};
    my $video_size = " ${width}x${height}";

    if ( $scale )
    {
        if ( $scale != 1.0 )
        {
            $width = int($width*$scale);
            $height = int($height*$scale);
            $video_size = " ${width}x${height}";
        }
    }
    elsif ( $size )
    {
        $video_size = $size;
    }

    my $command = ZM_PATH_FFMPEG." -y -r $frame_rate ".ZM_FFMPEG_INPUT_OPTIONS." -i %0".ZM_EVENT_IMAGE_DIGITS."d-capture.jpg 
      -s $video_size ".ZM_FFMPEG_OUTPUT_OPTIONS." '$video_file' &gt; ffmpeg.log 2&gt;&amp;1";
    print $command."\n" ;
    Debug( $command."\n" );
    Info( $command."\n" );
    my $output = qx($command);

    my $status = $? &gt;&gt; 8;
    if ( $status )
    {
        Error( "Unable to generate video, check ".$event_path."/ffmpeg.log for details" );
        exit( -1 );
    }
	
	Info( "Finished $video_file\n" );
}
else
{
	Info( "Video file $video_file already exists for event $event-&gt;{Id}\n" );
}
#print( STDOUT $event-&gt;{MonitorId}.'/'.$event-&gt;{Id}.'/'.$video_file."\n" );
print( STDOUT $video_file."\n" );
exit( 0 );
  </pre>
</post><post>
  <title>arduino with bmp085 gas pressure sensor</title>
  <date>4 Mar 2013</date>
  <p>
  Just a breadboard arduino and a <a href="https://www.sparkfun.com/products/9694">bmp085 pressure sensor</a> - nothing spectacular just connected via a level shifter to the I2C pins but it did work first time :)
  </p>
  <image src="/posts.assets/arduino_bmp085_1.jpg"/>
  <p>
  And here's a screen grab of the output from the test code I found <a href="http://ilabbali.com/code/Arduino_BMP085.cpp">here</a>.
  </p>
  <image src="/posts.assets/arduino_bmp085_2.jpg"/>
  <p>
  </p>
</post><post>
  <title>real time birdcam</title>
  <date>3 Mar 2013</date>
  <p>
  <a href="/birdcam/">Live images</a> taken from the cameras I recently installed watching our bird feeders. Jpegs are pulled via a cron'd script from the <a href="http://www.zoneminder.com">zoneminder</a> server and dropped onto the public web server. A tiny bit of jquery updates the images in the browser - both run once a minute.
  </p>
  <p>
  See <a href="/posts.xml/guerrilla_bird_cam.xml">here</a>, <a href="http://www.talesoftheinnermonkey.co.uk/2013/02/bird-cam.html">here</a> and <a href="http://www.talesoftheinnermonkey.co.uk/2013/03/more-birdies.html">here</a> for more information. Live images can be found <a href="/birdcam/">here</a>.
  </p>
</post><post>
  <title>guerrilla bird cam</title>
  <date>17 Feb 2013</date>
  <image src="/posts.assets/guerrilla_bird_cam1a.jpg"/>
  <p>
  Very quick and dirty outdoor bird cam. Pin hole camera/transmitter and a 9v battery in freezer bag and some gaffer tape. Lets see how long the battery lasts. 
  </p>
  <image src="/posts.assets/guerrilla_bird_cam1b.jpg"/>
  <p>
  Here's the image displayed on the bedroom TV.
  </p>
  <p>
  Update: battery only lasted a couple of hours so I've run a cable carrying 8v from a wall wart in the shed.
  </p>
</post><post>
  <title>variable sample rate stellaris logic analyser</title>
  <date>10 Feb 2013</date>
  <p>
  Yet more changes to the stellaris logic analyser (<a href="http://www.fischl.de/arm/sllogiclogger_logic_analyser_for_stellaris_launchpad/">here</a>, <a href="/posts.xml/longer_buffer_for_stellaris_logic_analyser.xml">here</a> and <a href="">here</a>). This version returns to using the internal RAM buffer but sampling is now SysTick interrupt driven.
  </p>
  <p>
  This allows the sample rate to be variable so that a lower sample rate can be used to gain a longer capture time. Sample rates up to 2MHz seem usable, anything above that gave me incorrectly detected baud rates in ols's UART analyser.
  </p>
  <p>
  Updated firmware, binary file and OLS-Profile: <a href="/posts.assets/sllogiclogger.2013-02-10.tar.gz">sllogiclogger.2013-02-10.tar.gz</a>.
  </p>
</post><post>
  <title>stellaris logic analyser moved to github</title>
  <date>10 Feb 2013</date>
  <p>
  Sample rates have been changed to more closely match bus pirate's; code has been pushed to <a href="https://github.com/sodnpoo/sllogiclogger">github</a>.
  </p>
</post><post>
  <title>bufferless stellaris logic analyser</title>
  <date>9 Feb 2013</date>
  <p>
  Another modification to the stellaris logic analyser (<a href="http://www.fischl.de/arm/sllogiclogger_logic_analyser_for_stellaris_launchpad/">here</a> and <a href="/posts.xml/longer_buffer_for_stellaris_logic_analyser.xml">here</a>) code, this time removing the RAM buffer altogether and writing the data out to the UART immediately. The advantage of removing it that we can then do continuous capture - well we could if ols v0.9.6.1 supported it, so instead we capture 1MB as that's the most it'll will deal with. The downside is that the sample rate is limited by the speed of the UART and even with it set to 460800bps the sample rate is only 45.605kHz - at this rate we can capture 8 channels for 22.99 seconds.
  </p>
  <p>
  To keep the capture loop as tight as possible it will continue to capture/send data even after ols has finished, to capture again you'll need to reset the stellaris. Don't forget to set the port speed to 460800bps in ols.
  </p>
  <p>
  Reading though the docs - it looks like it might be possible to use DMA between the PORT and the UART on the stellaris to increase the sample rate; I'm also working on RLE encoding to pack more into the RAM buffer used on the previous code.
  </p>
  <p>
  Updated firmware, binary file and OLS-Profile: <a href="/posts.assets/sllogiclogger.2013-02-09.tar.gz">sllogiclogger.2013-02-09.tar.gz</a>.
  </p>
</post><post>
  <title>longer buffer for stellaris logic analyser</title>
  <date>3 Feb 2013</date>
  <p>
  This is a trivial modification to <a href="http://www.fischl.de/arm/sllogiclogger_logic_analyser_for_stellaris_launchpad/">Fischl.de's</a> TI Stellaris Launchpad logic analyser. I've simply increased the buffer length from 16KB to 31KB increasing the capture length from 1.64ms to 3.17ms.
  </p>
  <p>
  Updated firmware, binary file and OLS-Profile: <a href="/posts.assets/sllogiclogger.2013-02-03.tar.gz">sllogiclogger.2013-02-03.tar.gz</a>
  </p>
</post></xml>
