Difference between revisions of "PcDuino9"

From LinkSprite Playgound
Jump to: navigation, search
(介绍)
(介绍)
Line 1: Line 1:
 
== 介绍 ==
 
== 介绍 ==
  
[[File:pcduino9 a.png|640px]]
+
[[File:pcduino9 b.png]]
 
 
[[File:pcduino9 b.png|640px]]
 
  
 
[[File:pcduino9 c.png|640px]]
 
[[File:pcduino9 c.png|640px]]

Revision as of 01:28, 13 January 2017

介绍

File:Pcduino9 b.png

640px

640px

pcDuino9是一个高性能平台,拥有强大的多线程运算能力、图形处理能力以及硬件解码能力,而且它支持 Android和 Ubuntu 双系统,所以它也是一台强大的小型电脑, 我们希望你的创意和灵感能让它变得不平凡。

规格

  • CPU : Rockchip RK3288 ARM Corte-A17 Quad-Core up to 1.8GHz
  • GPU : ARM Mali-T760 MP4 Support OpenGL ES 1.1/2.0 /3.0, OpenVG1.1, OpenCL1.1, Directx11
  • Memory : 1GB-4GB Dual-channel 32-bit LPDDR3
  • Storage : 8GB-16GB eMMC (Opt.), Micro SD slot support SDXC
  • Ethernet : 10/100/1000Mbps Ethernet (RTL8211)
  • USB : USB 2.0 Host x 2 (Opt.), USB OTG x 1
  • Video : HDMI2.0 support maximum 4K@60Hz display (Micro HDMI), LVDS/MIPI-DSI display interface
  • Audio : 3.5mm audio In/Out
  • Camera : MIPI-CSI camera interface
  • WiFi/BT : AP6212 WiFi + BT module
  • GPIO Extension : Raspberry Pi compatible GPIO, support UART, SPI, I2C BMC extension GPIO (Opt.), support ADC, PWM, UART, I2C
  • Board Size : 96 x 76 mm

产品参数

  • CPU: Rockchip RK3288 ARM Corte-A17 Quad-Core up to 1.8GHz
  • GPU: ARM Mali-T760 MP4 Support OpenGL ES 1.1/2.0 /3.0, OpenVG1.1, OpenCL1.1, Directx11
  • 内存: 2GB DDR3 双通道
  • 存储器 : 16GB eMMC Flash, Micro SD
  • 网络 :以太网 -10/100/1000M以太网,无线网 -2.4GHz/5GHz双频WiFi,支持802.11a/b/g/n/ac协议,蓝牙 -Bluetooth 4.0
  • 视频输入输出:HDMI2.0 up to 3840x2160@60O ,VGA up to 1080P
  • USB : USB2.0 x 1
  • IR : 支持红外遥控功能
  • 电源 : DC -5V/2.5A

GPIOs 映射

Pcduino 9 d.png

pcDuino9

Pcduino 9 e.png

BMC STM32F411

Pcduino9 f.png

快速入门

1.在Windows烧写系统到eMMC

a.安装 RK USB 驱动

  • 为了使所有设备都是用更新的驱动,请选择“驱动卸载”,然后在选择“驱动安装”。

Pcduino 9 g.png

连接设备

  • 1.确保设备连接好电源适配器并处于通电状态。
  • 2.用 Micro USB OTG 线连接好设备和主机。
  • 3.按住设备上的 RECOVERY (恢复)键并保持。
  • 4.短按一下 RRESET(复位)键。
  • 5.大约两秒钟后,松开 RECOVERY 键。
  • 6.注意:如果发现按了 RESET 键后还是没有发现设备,请在保持 RECOVERY 键按下的同时,长按一下 PWRKEY 键,然后才松开 RECOVERY 键。

主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备"Rockusb Device" 出现,如下图。如果没有,则需要返回上一步重新安装驱动。

Pcduino 9 h.png

b.烧写固件

下载AndroidTool,解压,运行里面的AndroidTool.exe(注意,如果是Windows7/8,需要按鼠标右键,选择以管理员身份运行),如下图:

Pcduino 9 i.png

烧写统一固件 xxxx.img 的步骤如下

  • 1.切换至"升级固件"页。
  • 2.按"固件"按钮,打开要升级的固件文件。升级工具会显示详细的固件信息。
  • 3.按"升级"按钮开始升级。
  • 如果升级失败,可以尝试先按"擦除Flash"按钮来擦除 Flash,然后再升级。

注意:如果你烧写的固件laoder版本与原来的机器的不一致,请在升级固件前先执行"擦除Flash"。

Pcduino 9 j.png

烧写分区映像

烧写分区映像时,请使用对应SDK下的FFTools/AndroidTool.rar烧写。步骤如下:

  • 1.切换至"下载镜像"页。
  • 2.勾选需要烧录的分区,可以多选。
  • 3.确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。
  • 4.点击"执行"按钮开始升级,升级结束后设备会自动重启。

Pcduino 9 k.png

2.在Linux烧写系统到eMMC

RK 提供了一个 Linux 下的命令行工具 upgrade_tool,支持统一固件 update.img 和分区镜像的烧写。

开源工具则有两个选择:

它们都仅支持分区映像烧写,不支持统一固件。rkflashtool 是命令行工具,rkflashkit 有图形界面,后加了命令行支持,更是好用。以下仅对 rkflashkit 做介绍。 Linux 下无须安装设备驱动,参照 Windows 章节连接设备则可。

upgrade_tool

下载 [Linux_Upgrade_Tool Linux_Upgrade_Tool], 并按以下方法安装到系统中,方便调用:

tar xf Linux_UpgradeTool_v1.2.tar.gz
cd Linux_UpgradeTool_v1.2
sudo mv upgrade_tool /usr/local/bin
sudo chown root:root /usr/local/bin/upgrade_tool

烧写统一固件 uxxxx.img:

sudo upgrade_tool uf update.img

烧写分区镜像:

sudo upgrade_tool di -b /path/to/boot.img
sudo upgrade_tool di -k /path/to/kernel.img
sudo upgrade_tool di -s /path/to/system.img
sudo upgrade_tool di -r /path/to/recovery.img
sudo upgrade_tool di -m /path/to/misc.img
sudo upgrade_tool di resource /path/to/resource.img
sudo upgrade_tool di -p paramater   #烧写 parameter
sudo upgrade_tool ul bootloader.bin # 烧写 bootloader

如果因 flash 问题导致升级时出错,可以尝试低级格式化、擦除 nand flash:

sudo upgrade_tool lf   # 低级格式化
sudo upgrade_tool ef   # 擦除

rkflashkit

安装:

sudo apt-get install build-essential fakeroot 
git clone https://github.com/linuxerwang/rkflashkit
cd rkflashkit
./waf debian
sudo apt-get install python-gtk2
sudo dpkg -i rkflashkit_0.1.2_all.deb

图形界面:

sudo rkflashkit

Pcduino 9 l.png

命令行:

$ rkflashkit --help
Usage: <cmd> [args] [<cmd> [args]...]
part                              List partition
flash @<PARTITION> <IMAGE FILE>   Flash partition with image file
cmp @<PARTITION> <IMAGE FILE>     Compare partition with image file
backup @<PARTITION> <IMAGE FILE>  Backup partition to image file
erase  @<PARTITION>               Erase partition
reboot                            Reboot device
For example, flash device with boot.img and kernel.img, then reboot:
sudo rkflashkit flash @boot boot.img @kernel.img kernel.img reboot

3.SD卡启动系统

  • 下载xxxx.img系统镜像
  • 准备一张内存卡(4GB以上C10)
  • 使用dd命令将系统复制到SD
  • 将卡插在pcDuino9,开机需要按着MASKROM键从TF卡启动

4.pcDuino9硬件操作

硬件操作基于NightWiring 现在它是一个跨平台的C++库控制的硬件接口,包括UART、I2C、SPI和GPIO。大部分的代码是从wiringpi。 GPIO的功能是基于sysfs的现在,这是稍微慢一点,但灵活。


cd nightWiring/
make -j4
sudo make install

GPIO LED控制

#include "nightWiring.h"
#include "nightWiringGPIO.h"
#include "stdio.h"

static int fennecGpioMap[] = {

    /*  GPIO2_A0  */
            56,
    /*  GPIO2_A1,       GPIO2_A2,       GPIO2_A3,       GPIO2_A4    */
            57,             58,             59,             60,
    /*  GPIO2_A5,       GPIO2_A6,       GPIO7_B1,       GPIO2_A7    */
            61,             62,             225,            63,
    /*  GPIO2_B0,        GPIO2_B1,      GPIO2_B2,       GPIO2_B4    */
            64,             65,             66,             68,
    /*  GPIO2_B5,        GPIO7_B0,      GPIO7_A7,       GPIO7_B2    */
            69,             224,            223,            226
}; 

int ledMap[] = {2, 10, 3, 11};

int main(void)
{
    int i, j;
    nightWiringSetup();
    nightWiringGpioSetup(fennecGpioMap, 17);
    for(i=0; i<4; i++)
        pinMode(ledMap[i], OUTPUT);
    while(1)
    {
        for(i=0; i<4; i++)
        {
            for(j=0; j<4; j++)
                digitalWrite(ledMap[j], HIGH);
            digitalWrite(ledMap[i], LOW);
            delay(500);
        }
    }
    return 0;
}

GPIO 按键输入

#include "nightWiring.h"
#include "nightWiringGPIO.h"
#include "stdio.h"

static int fennecGpioMap[] = {
    /*  GPIO2_A0  */
            56,
    /*  GPIO2_A1,       GPIO2_A2,       GPIO2_A3,       GPIO2_A4    */
            57,             58,             59,             60,
    /*  GPIO2_A5,       GPIO2_A6,       GPIO7_B1,       GPIO2_A7    */
            61,             62,             225,            63,
    /*  GPIO2_B0,        GPIO2_B1,      GPIO2_B2,       GPIO2_B4    */
            64,             65,             66,             68,
    /*  GPIO2_B5,        GPIO7_B0,      GPIO7_A7,       GPIO7_B2    */
            69,             224,            223,            226
};

int keyMap[] = {6, 13, 4, 12, 5};
char keyName[5][7] = {"UP\0", "CENTER\0", "DOWN\0", "LEFT\0", "RIGHT\0"};     

int readKey(int num)
{
    int key = digitalRead(keyMap[num]);
    if(key == LOW)
    {
        // Delay for a while and re-detect the key status
        // Filtering glitches on the signal
        delay(10);
        if(key == LOW)
            return 1;
    } 

    return 0;
} 

int main(void)
{
    int i;
    nightWiringSetup();
    nightWiringGpioSetup(fennecGpioMap, 17);
    for(i=0; i<5; i++)
        pinMode(keyMap[i], INPUT);
    while(1)
    {
        for(i=0; i<5; i++)
        {
            if(readKey(i))
            {
                printf("Key %s is pressed!\n", keyName[i]);
                delay(500);
            }          
        }
    }
    return 0;
}

I2C RTC

#include "nightWiring.h"

#include "nightWiringI2C.h"

#include "stdio.h"

#define DS1307_ADDR 0x68

int i2cFd;
int quitFlag = 0;

unsigned char DEC2BCD(unsigned char val)
{
  return ( (val/10*16) + (val%10) );

}

unsigned char BCD2DEC(unsigned char val)
{
   return ( (val/16*10) + (val%16) );
}


void rtcSetTime(unsigned char year, unsigned char month, unsigned char date, unsigned char dayofWeek, unsigned char hour, unsigned char min ,unsigned   char sec)
{
  unsigned char reg = 0x00;
  i2cWriteReg8(i2cFd, 0x00, DEC2BCD(sec));
  i2cWriteReg8(i2cFd, 0x01, DEC2BCD(min));
  i2cWriteReg8(i2cFd, 0x02, DEC2BCD(hour));
  i2cWriteReg8(i2cFd, 0x03, DEC2BCD(dayofWeek));
  i2cWriteReg8(i2cFd, 0x04, DEC2BCD(date));
  i2cWriteReg8(i2cFd, 0x05, DEC2BCD(month));
  i2cWriteReg8(i2cFd, 0x06, DEC2BCD(year));   
}

void rtcGetTime() 
{
  unsigned char year, month, date, dayofWeek, hour, min ,sec;
  unsigned char reg = 0x00;
  sec       = BCD2DEC(i2cReadReg8(i2cFd, 0x00) & 0x7f);
  min       = BCD2DEC(i2cReadReg8(i2cFd, 0x01));
  hour      = BCD2DEC(i2cReadReg8(i2cFd, 0x02) & 0x3f);
  dayofWeek = BCD2DEC(i2cReadReg8(i2cFd, 0x03));
  date      = BCD2DEC(i2cReadReg8(i2cFd, 0x04));
  month     = BCD2DEC(i2cReadReg8(i2cFd, 0x05));
  year      = BCD2DEC(i2cReadReg8(i2cFd, 0x06));
  printf("Time: %02d-%02d-%02d  %02d:%02d:%02d.\n", year, month, date, hour, min ,sec);
}

int main(void)
{
    int i;
    if((i2cFd=i2cSetup("/dev/i2c-4", DS1307_ADDR)) < 0)
    {
        printf("Error: I2C acess failed! i2cSetup() return %d\n",i2cFd);
        return 0;
    }
    printf("I2C interface init complete.\n");
    printf("Writing time 2016-10-01 Sat 21:10:00 to RTC...\n");
    rtcSetTime(16,10,1,6,21,10,0);
    while(1)
    {
        rtcGetTime();
        delay(1000);
    }
    return 0;
}