Author Topic: One Dollar One Minute ARM Development  (Read 135568 times)

0 Members and 1 Guest are viewing this topic.

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #150 on: September 16, 2014, 08:41:51 pm »
Quote
the availability of "go to definition" of your IDE. It is a life saver.
In this case, I'm particularly appreciating having that function available OUTSIDE any IDE.  (That probably means having a separate html (.chm ?) file for each C source module. which tweaks my frugality sense.  But it's still nice...)
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #151 on: September 17, 2014, 09:55:43 am »
Here's the timing table.  I shortened the loop to
Code: [Select]
loop: ldr r1, [r0, #GPIO_ODR] /* read DATA reg */
eor r1, r2          /* complement bit */
str r1, [r0, #GPIO_ODR] /* write */
b.n loop
(NOT the shortest possible loop, BTW.)   And I implemented some symbolic indirection to make it easier to change the values (code attached.)  The no-wait-state code looks like it's taking about 9 clocks for the 4-instruction loop, which is not as good as I thought it would be (although I wouldn't find 6 surprising - 1 extra for the 32bit instruction and one extra for the branch.)  Maybe I've left something out?

Impressive Overclocking success!

Code: [Select]
          ------------(MHz)--------
PLLMULT F(cpu)  F(0WS)  F(1WS)  F(2WS)
  -       8     0.444   0.400   0.364
  3      24     1.330   1.200   1.091
  4      32     1.779
  5      40     2.225*          1.818
  6      48     2.669*
  7      56     3.115*
  8      64     fail    3.200*  2.91
  9      72             3.600*  3.27
 10      80**           4.000*
 11      88**           4.400*
 12      96**           4.800*
 13     104**           5.200*  4.73
 14     112**           5.600*
 15     120**           6.000*
 16     128**           6.400*  5.8

   * exceeds documented memory speed
  ** exceeds documented cpu max freq

Update: using a sequence of stores, I can get "about" 2MHz pin toggle running at 8MHz/0WS, or 18MHz at 72MHz/2WS (that's still slower than I expected (~2cycles per store), but the flash prefetch unit seems to be helping.  The 72MHz version is running 9x the 8MHz version, despite increasing the waitstates to be "legal."):
Code: [Select]
ldr r1,  [r0, #GPIO_ODR] /* read DATA reg */
eor r1, r2, #(1<<mybit)
loop:
str r1, [r0, #GPIO_ODR] /* 1 write */
str r2, [r0, #GPIO_ODR] /* write */
str r1, [r0, #GPIO_ODR] /* 2 write */
str r2, [r0, #GPIO_ODR] /* write */
str r1, [r0, #GPIO_ODR] /* 3 write */
str r2, [r0, #GPIO_ODR] /* write */

« Last Edit: September 17, 2014, 10:54:34 am by westfw »
 

Offline paulieTopic starter

  • Frequent Contributor
  • **
  • !
  • Posts: 849
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #152 on: September 17, 2014, 01:00:13 pm »
Good news that the expected 9x is now demonstrated. I've verified the scope timing on this end too. There are too many differences from the previous version for me to easily follow so I wonder if you can explain what  changed. Did you alter the clk/pll code or was it due to the new fast loop? What actually caused the 4x speedup to become 9x?
 

Offline paulieTopic starter

  • Frequent Contributor
  • **
  • !
  • Posts: 849
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #153 on: September 17, 2014, 02:27:01 pm »
Two weeks later, one of two "experienced programmers" eventually succeeded in blinking an led. The other one is still trying.
Phew! Talk about steep learning curves, :)

All I can suggest Danny is don't give up. More than a few rank beginners managed to get the LED demo posted on first page couple weeks back working and it only took them a minute or two so there is hope. I posted not only source but binary ready to flash in case it's tools that are causing you trouble.

BTW did I forget to mention that the entire development set is attached not just linked so should be quite easy to manage.
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #154 on: September 18, 2014, 03:10:10 am »
Quote
I wonder if you can explain what  changed.
The big change was these additions at the top to options:
Code: [Select]
.equ DODELAY, 0 /* if 0, just toggle at max loop speed. */
/* if 1, blink at human-like speeds */
.equ WAITSTATES, FLASH_ACR_LATENCY_1
.equ PLLMULT, RCC_CFGR_PLLMULL9
@ .equ PLLMULT, 0 /* If 0, don't use the PLL */
/*  Note that xxx PLLMULL2 is 0, so this structure */
/*  doesn't support x2 clock configurations */
then the ClockInit code uses the new symbols (PLLMULT, WAITSTATES) instead of the symbols direct from the .asmh files.
And there is some conditional assembly to leave out the PLL code if the multiplier is zero, and leave out the delay loop when DODELAY is 0.

 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #155 on: September 18, 2014, 03:29:29 am »
Oh yeah:
Quote
What actually caused the 4x speedup to become 9x?
The actual speedup going from 8MHz 0WS code to 72MHz 2WS code is 3.3/.444, or about 7x...
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #156 on: September 18, 2014, 06:30:06 am »
PSoC version, although I payed too much for the board (breakable schmartboard that I still have the other half).

So $3 for the board, $1 for the chip and after I put it together I did the blinky in less than 1 minute without counting wiring it up to my pioneer.

Programming was as simple as getting the blink demo, changing the led pin and that's it.

The code it generated
Code: [Select]
#include <device.h>

int main()
{
    /* Start the Clock and PWM components. Clock can be started automatically
    after reset by enabling “Start on Reset” in the Clocks tab of
    Blinking LED.cydwr. We are doing this manually for instructive purpose. */
    Clock_Start();
    PWM_Start();

    for(;;)
    {

    }
}

Schematic:


Board:


Operating voltage 1.8V to 5.5V unregulated (using internal regulator, therefore the bypass caps). You can short VDDD and VCCD if you supply a regulated (1.8 ±5%)V without the need of the bypass caps).
Edit: but if you use the bypass caps, you get the regulated output out off VCCD as shown in the image is pretty close to 1.8 and well within the operating parameters.

To program it, I'm using my Pioneer dev kit ($25) with a modified KitProg that allows me to program external chips instead of the one within the Pioneer.


Edit: plus this has programmable Analog and Digital logic.

« Last Edit: September 18, 2014, 08:35:06 am by miguelvp »
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #157 on: September 18, 2014, 07:06:33 am »
Code: [Select]
/* [PSOC Blink main loop] */
    for(;;)
    {

    }

Um.  I see no blinking.  Is it setting up the PWM with a 50% duty cycle and human-scale period?
How big is the binary?  For PSoC, you have to include the bits that define the hardware in your executable, don't you?  It's not something you can program on the chip separately and have all of the (rather limited) code space left for software?
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #158 on: September 18, 2014, 07:31:57 am »
The purpose of the OP is One Dollar One Minute ARM Development

Sure I can forsake the PWM but that might take me a couple of weeks to program instead of under one minute ;)

Nah, takes less than a minute as well:

Code: [Select]
#include <project.h>

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
        Pin_Blue_Write(~Pin_Blue_Read());
        CyDelay(500);
    }
}

As for resources, yeah it does uses 1K of flash but that's not the thread subject.


Steps to do this where:

Create New Project
Empty PSoC4 template
Add digital output pin and name it Pin_Blue
Select GPIO p0[3]
Add two lines of code in the for loop
Compile and program.
« Last Edit: September 18, 2014, 07:35:35 am by miguelvp »
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #159 on: September 18, 2014, 08:29:28 am »
BTW I can do my own component with my own support code (even in assembly if so inclined) instead of using the very accommodating built in modules.
Also I can define my own Schematic/Verilog to use the Digital/Analog hardware abstraction on top of the support software.

Oh, and you can just write to the address 0x40040000u and set or clear the bit for the port you want (in my case bit 3) for P0[3].
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #160 on: September 18, 2014, 09:40:44 am »
Thanks for the update.  The original "one minute" referred to tool download/install time, not "time to write your first program."  (obviously, the painful asm programs are getting written rather slowly.)  As a 365+MB download, I don't think PSoC designer meets that specification.  In fact, the download manager they want you to install first is already bigger than the complete toolset we're using here...

I guess PSoC tools have more than the usual lock-in, since you need it to configure the hardware blocks as well compile the C code.  I guess that in theory you can create the hardware configuration with the Cypress tools, and import them into some other compiler?
 

Offline paulieTopic starter

  • Frequent Contributor
  • **
  • !
  • Posts: 849
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #161 on: September 18, 2014, 11:49:29 am »
BTW I can do my own component with my own support code (even in assembly if so inclined)

I'd be impressed if you actually managed that. Even if we did relax the download requirement. Assembly blinky for Cypress chip that can be demonstrated in less than a minute? Quite a challenge.

I ordered one of the $4 boards and a few $1 (soon to be $3) chips but even with help from The Creator I doubt this will ever be as easy as the GNU procedure published here. I'm not sure a couple op amps are worth the extra expense and development complexity. But like I said, it would be very impressive if you managed to strip down the tools to the point a noob can get going in anything close a short time frame.
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #162 on: September 18, 2014, 02:38:46 pm »
How about 32MB? and 3rd party support (at least uVision) plus lattice and xilinx toolchain for the fpga part of things I believe but I haven't read the full paper. (you need to be registered to download it)

http://www.cypress.com/?rID=38050

As for building your own component they have some tutorials somewhere and they are simple to make with their toolchain.

Edit:
the lattice and xilinx support is to program the chip as well.

After all is just another Cortex M0 chip (M3 for the PSoC 5LP)
« Last Edit: September 18, 2014, 03:39:41 pm by miguelvp »
 

Offline dannyf

  • Super Contributor
  • ***
  • Posts: 8221
  • Country: 00
Re: One Dollar One Minute ARM Development
« Reply #163 on: September 18, 2014, 03:42:22 pm »
Quote
(at least uVision

From a library perspective, it is non-existent - RTE doesn't currently cover those chips and unlikely ever. Cypress doesn't provide a library to cover those chips either.

You have to read the datasheet and two trms to get it going.

================================
https://dannyelectronics.wordpress.com/
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #164 on: September 18, 2014, 04:55:06 pm »
Or maybe it's simpler than that:

Quote
Using the CY8C42xx Example Project
1. Install Keil µVision MDK-ARM Standard Version 4.54 (or later).
2. Copy the CY8C42xx.FLM file to C:\Keil\ARM\Flash. This file will be selected during µVision
startup.
3. Connect ULINKPro to the USB port and then connect it to the target board. In the example, the
10-pin ARM connector is used, although only five pins (VCC, GND, XRES, SCLK, and DATA) are
required
...
11 more steps all defined in that document.

Edit:
BTW the default file location will be here (part of the 32MB download):
C:\Program Files (x86)\Cypress\Programmer\3rd_Party_Configuration_Files\CY8C42xx\Prog_Algorithm
And the template project here:
C:\Program Files (x86)\Cypress\Programmer\3rd_Party_Configuration_Files\CY8C42xx\Template_Project

These are the devices included in the 3rd party configuration folder, the Documentation has the same 3rd party pdf you can download individually in that programmer link earlier on.




« Last Edit: September 18, 2014, 05:53:44 pm by miguelvp »
 

Offline paulieTopic starter

  • Frequent Contributor
  • **
  • !
  • Posts: 849
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #165 on: September 18, 2014, 08:05:31 pm »
I might suggest a challenge that is more about being able to simply create a program and flash it than trying to make asm look like C. Recall the program on page one here has no includes or even equates yet does compile and flash the LED.

Anyway I just pulled out my recently arrived 049-4xxx board and couple chips to take the new improved PSOC out for a spin. It's been a few years since my disappointing attempt with the $50 "hockey puck" programmer and $8 chips so the hope was things have improved. $4 is better than $50 and $1 ($3+ by month end) better than $8 but still some disappointments:

NO BOOTLOADER. This is a huge drawback IMO. Serial upload is what made STM32 chips so cheap and easy. "Free" as dannyf calls it. I'm guessing you have to blow another $30-$50 for Pioneer or Miniprog3. Not great at 10x the cost of STM. You can probably buy a few STM ICE setups for that too.

I find out now the chip on the 049-42xx card is not one of the $1 (soon to be $3) dealies. In fact it's very hard to determine just what chip is actually on there. Lots of mentions for their USB/serial device but not for the target in ads and docs. They seem to have actually erased the numbers off the top. WTF. It took a while but finally figured it out. Not too hard to locate the menu entry in Creator but far from minimum having to depend on that and generally annoying.

To download Creator you must register with their exclusive club which involves providing email and personal info. I do not need spam to double like last time so back on the "museum of interesting chips" shelf for now.

If there's anyway around these issues it might be somewhat more attractive and competitive with other options in the ARM world. However because of flashing hardware difficulties don't  look like it's possible for guys like me who just want to poke a stick at new chips without spending more than couple bucks. You know, like we can with  8051, AVR, STM etc..
« Last Edit: September 18, 2014, 08:34:13 pm by paulie »
 

Offline SirNick

  • Frequent Contributor
  • **
  • Posts: 589
Re: One Dollar One Minute ARM Development
« Reply #166 on: September 18, 2014, 08:54:12 pm »
The ROM bootloader is pretty cool.  NXP has that, too.  I'm building a practical device - slash dev board right now with eight LPC812s, and one master LPC4078 on it.  I can take them all directly out of the tube and solder onto the board, upload the 4078 code via the serial interface that I needed anyway, and have it flash the 812s via its dedicated link to each of them.  Makes future firmware updates pretty easy too.  The 4078 will always have the latest image for the 812s, and can itself be loaded via IAP or, if totally bricked, from the UART again.  Only time I ever really need JTAG is for debugging. :-+
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #167 on: September 18, 2014, 09:41:19 pm »
but still some disappointments:

NO BOOTLOADER. This is a huge drawback IMO. Serial upload is what made STM32 chips so cheap and easy. "Free" as dannyf calls it. I'm guessing you have to blow another $30-$50 for Pioneer or Miniprog3. Not great at 10x the cost of STM. You can probably buy a few STM ICE setups for that too.
The 049-41xx and 049-42xx both have bootloaders, they are programmed using the USB-Serial that only can be done in a presence of a bootloader. If you succeed in programming it without including the bootloader then it's pretty much bricked and you'll need a Pioneer or Miniprog to unbrick it and load a bootloader on it.


I find out now the chip on the 049-42xx card is not one of the $1 (soon to be $3) dealies. In fact it's very hard to determine just what chip is actually on there. Lots of mentions for their USB/serial device but not for the target in ads and docs. They seem to have actually erased the numbers off the top. WTF. It took a while but finally figured it out. Not too hard to locate the menu entry in Creator but far from minimum having to depend on that and generally annoying.
It's exactly the same chip, the PSoC 4 on the protoboard and the pioneer is the same CY8C4245AXI-483 of course you have the datasheets, schematics and BOMs available to double check but it's better to assume things. Also it's an angle thing but it's not erased but very faint on the protoboard.

To download Creator you must register with their exclusive club which involves providing email and personal info. I do not need spam to double like last time so back on the "museum of interesting chips" shelf for now.

That sounds just silly in many ways, I haven't receive a single spam from cypress


If there's anyway around these issues it might be somewhat more attractive and competitive with other options in the ARM world. However because of flashing hardware difficulties don't  look like it's possible for guys like me who just want to poke a stick at new chips without spending more than couple bucks. You know, like we can with  8051, AVR, STM etc..

Nah, just stick with what you have then

BTW I did download Keil V 4.74 and was going to set it up as in that paper, but the cypress chips were already installed.
Edit: link of Cypress supported ARM devices
http://www.keil.com/dd/chips/cypress/arm.htm

Oh and Creator can export full projects to Eclipse, uVision and IAR Embedded Workbench for ARM. But I think you are better off by leaving it in your "museum of interesting chips" shelf forever. Obviously is not for you.

Edit: Also need to add that the programmer that allows the 3rd party toolchains if you don't download the "download manager" it still have a direct link to get the 42MB installation file, so it's not required.
And lastly (well for now) C666 has mentioned many times that Cypress will price match even at low quantities with competitor chips, so even when they go up to $2.50 you might be able to get a better deal with some back and forth from their sales dept, but I have no experience with that so it's just word of mouth.
« Last Edit: September 19, 2014, 12:39:30 am by miguelvp »
 

Offline SirNick

  • Frequent Contributor
  • **
  • Posts: 589
Re: One Dollar One Minute ARM Development
« Reply #168 on: September 19, 2014, 12:16:17 am »
32MB?  That's for the IDE?  Pretty good actually.  IAR EW noticed I had 2GB free on my laptop's SSD and decided to take it all.  There was a white-knuckle countdown as I waited to see which would get to 100% first:  The installation progress bar, or the disk utilization bargraph.
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #169 on: September 19, 2014, 12:35:13 am »
No, that's for the programmer with 3rd party toolchain support, you can't develop with just that.

Still, it's just a plain Cortex M0 and can be programmed with 5 wires (VDD, GND, SWDCLK, SWDIO & RESET_n)
The programmer I use is just a PSoC5LP and that's because the 5LP has USB support so it's easier to connect to the PC.

Also they support Boundary-Scan Description Language (BSDL) programming and Serial Vector Format (SVF).

I think just using gcc and converting it to the right format will do the trick, but I'm not about to do all that since I rather use the toolchain supplied.

I'm going to give Kiel a try to see how small an executable I can make (in C), actually I'll just use the default template that they provide:

Code: [Select]
int WriteIO (unsigned int addr, unsigned int data)
{
unsigned int *address = (unsigned int*)addr;
*address = (unsigned int)data;
return (0);
}

int ReadIO (unsigned int addr, unsigned int *data)
{
unsigned int *address = (unsigned int*)addr;
*data = *address;
return (0);
}

//----------------------------------------------------------------------------------
// Custom functions
//----------------------------------------------------------------------------------

void Delay(int ms)
{
int i , j;

for(i = 0; i < ms; i++) {
for(j = 0; j < 3333; j++); //Delay = 1ms, mesured by scope for CY8C41xx (CPU = 48MHz)
}
}

void LED_Write(char value)
{     
WriteIO(0x40040000, value); //GPIO2.GPIO2_PRT.DR
}

//----------------------------------------------------------------------------------
// main() function
//----------------------------------------------------------------------------------
int main (void)
{
char leds = 0x01;     //Initial state of LEDs: P0[0] - On

WriteIO(0x40040008, 0x06); //Set Strong Drive Mode for P0[0] in GPIO2.GPIO2_PRT.PC register

for (;;)
{
LED_Write(leds); //Invert LED state on P[0] in GPIO2.GPIO2_PRT.DR register
Delay(500);
leds ^= 0x01;   
  }
}
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #170 on: September 19, 2014, 01:53:41 am »
So I used that code with uVision and this is the build log:
Code: [Select]
µVision Build Log

Project:

D:\Keil\ARM\Examples\Template_Project\Template_Project.uvproj
Project File Date:  12/14/2013

Output:

Build target 'Template_Project'
creating preprocessor file for main.c...
compiling main.c...
assembling startup_CM0.s...
linking...
Program Size: Code=212 RO-data=208 RW-data=0 ZI-data=512 
FromELF: creating hex file...
After Build - User command #1: .\Hex_Converter\HexConverter.exe .\\Hex_Converter\\Configuration.ini
".\Hex\Template_Project_uVision.axf" - 0 Error(s), 0 Warning(s).

Then since I don't have one of these programmers:


I took the generated cypress.hex file and use the PSoC programmer. My modified KitProg showed up and I was able to program the board blinking on p0[0]



But if I had one of those devices listed above I could just program and debug it using Keil uVision.

Maybe I would need to investigate on the external command line programmer but then I wouldn't be able to debug.

The thing is that the configurable modules are really code, there is no magic behind it at all, so the module designer just helps automate the process but just code can access all the features as far as I can tell.

Note I didn't use the Cypress toolchain at all, just the programmer because I didn't have one compatible with Keil

Edit: I forgot I had to change the device ID from 04_C6_11_93 to 04_A6_11_93 to match the SSOP
« Last Edit: September 19, 2014, 02:42:12 am by miguelvp »
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #171 on: September 19, 2014, 05:13:57 am »
Quote
Empty PSoC4 template
Add digital output pin and name it Pin_Blue
Select GPIO p0[3]
How do you do that last part (selecting the external pin to go with the logic?)?  I can't find it :-(
 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #172 on: September 19, 2014, 05:24:23 am »
The schematic is file TopDesign.cysch that's where you put the pin and rename it.
The pins are on file projectname.cydwr under the pins tab

As in pictured here, i named my project blink1.

 

Offline miguelvp

  • Super Contributor
  • ***
  • Posts: 5550
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #173 on: September 19, 2014, 06:02:48 am »
So I left a minor thing off, and of course it does remember my last chip so you can change the device you want to target. So here are the steps with pictures:

Edit: This requires a MiniProg3 (or a Pioneer Kit with a custom KitProg installed).
A Pioneer kit will work as well but only programming the built in PSoC 4 (CY8C4245AXI-483)

1) Create New Project
   File->New->Project

2) Select Empty PSoC4 Design and name project Blink (Click Ok)


3) Add digital output pin


(optional: if you need to change the chip right click on the project and do "Device Selector" and select your device)

4) Right click on pin, select Configure and name it Pin_Blue (Also Turn Hardware Connection off, and click OK)


5) Select GPIO p0[3]


6) Add two lines of code in the for loop

Code: [Select]
        Pin_Blue_Write(~Pin_Blue_Read());
        CyDelay(500);

7) Compile and program.



« Last Edit: September 19, 2014, 03:59:02 pm by miguelvp »
 

Offline westfw

  • Super Contributor
  • ***
  • Posts: 4196
  • Country: us
Re: One Dollar One Minute ARM Development
« Reply #174 on: September 19, 2014, 06:29:50 am »
Remember the pinout spreadsheet?

Quote
is pin 47-48 marked wrong on the board?
Yep; that was wrong.  Fixed now, and somewhat updated/reformatted.
Most importantly, now shows which pins are 5V tolerant.

https://docs.google.com/spreadsheet/ccc?key=0AqdMB5dovDUZdGR6cVprUnkwTV9CMUNybV9VMjF5a0E&usp=sharing
 


Share me

Digg  Facebook  SlashDot  Delicious  Technorati  Twitter  Google  Yahoo
Smf