2015年6月19日 星期五

[開箱不敗家] raspberry pi 2 Model B

20150614 收到, Raspberry Pi 台灣樹莓派 sosorry 提供
感謝 Raspberry Pi 台灣樹莓派 sosorry 的大方, 提供了一套 raspberry pi 2 Model B, 讓我有機會玩到 cortex a7, 這是一個比較新的平台 (201502 發表), 不是舊的 ARM1176JZF, 讓我比較有動力想折磨自己, 不過目前找到的開發資料似乎都是針對 rpi 1, 這是新玩具的宿命。

Hardkernel ODROID C1 和 rpi2 b 很像的一塊開發板, 小心別買錯了, 不過其實也沒差, 如果你要跑 linux 的話。

rpi2 的 soc 從 bcm2835 換成 bcm2836, 產品編號只加了一, 應該沒怎麼變化吧! 不過實際上變化並不小, 看你是開發人員還是單純的使用者, 而這些改變會影響寫 bare-metal 程式的開發人員, 然後你發現找不到 bcm2836 的 datasheet 對吧!

疑! raspberry pi 不是也號稱 opensource 嗎? 什麼線路圖也都 open 嗎? 但 soc 是 Broadcom 的, 也許有什麼困難吧! 但應該還是有辦法的, 例如公開某些和寫程式相關的部份, 這才不會造成開發人員的困擾, 我相信以 pi 的影響力, 是可以和 Broadcom 談的。

boot 的 code, 幾乎都沒有 source code, 這也讓想寫 bare-metal 程式的人遇到類似 pc biso/uefi 的黑盒子, 有點不過癮。

從以下 url 得知:
[U-Boot] [PATCH 2/3] bcm2836 SoC support (used in Raspberry Pi 2 model B)
The bcm2835 and bcm2836 are essentially identical, except:
- The CPU is an ARM1176 v.s. a quad-core Cortex-A7.
- The physical address of many IO controllers has moved.

cpu 從單核心的 arm1176 換成了 4 核心的 cortex-a7, 這改變不大嗎? 但是把 physical address 換掉了這個改變更大, 更 ..., 找不到 datasheet 更更 ...

rpi2 記憶體也來到了 1 GB, 有個大噱頭是可以安裝 windows 10, 科科。

還得從這個 u-boot patch 去找出 physical address (L59), 這些人真是厲害, 去哪裡挖到的資料。

u-boot.bcm2836.patch
  1  arch/arm/cpu/armv7/Makefile               |  1 +
  2  arch/arm/cpu/armv7/bcm2835/Makefile       | 13 +++++++++++++
  3  arch/arm/include/asm/arch-bcm2835/gpio.h  |  5 +++++
  4  arch/arm/include/asm/arch-bcm2835/mbox.h  |  6 +++++-
  5  arch/arm/include/asm/arch-bcm2835/sdhci.h |  6 +++++-
  6  arch/arm/include/asm/arch-bcm2835/timer.h |  6 +++++-
  7  arch/arm/include/asm/arch-bcm2835/wdog.h  |  6 +++++-
  8  7 files changed, 39 insertions(+), 4 deletions(-)
  9  create mode 100644 arch/arm/cpu/armv7/bcm2835/Makefile
 10 
 11 diff --git a/arch/arm/cpu/armv7/Makefile b/arch/arm/cpu/armv7/Makefile
 12 index 409e6f5651b6..7f77c729a191 100644
 13 --- a/arch/arm/cpu/armv7/Makefile
 14 +++ b/arch/arm/cpu/armv7/Makefile
 15 @@ -41,6 +41,7 @@ endif
 16  obj-$(if $(filter am33xx,$(SOC)),y) += am33xx/
 17  obj-$(if $(filter armada-xp,$(SOC)),y) += armada-xp/
 18  obj-$(CONFIG_AT91FAMILY) += at91/
 19 +obj-$(CONFIG_BCM2835) += bcm2835/
 20  obj-$(if $(filter bcm281xx,$(SOC)),y) += bcm281xx/
 21  obj-$(if $(filter bcmcygnus,$(SOC)),y) += bcmcygnus/
 22  obj-$(if $(filter bcmnsp,$(SOC)),y) += bcmnsp/
 23 diff --git a/arch/arm/cpu/armv7/bcm2835/Makefile b/arch/arm/cpu/armv7/bcm2835/Makefile
 24 new file mode 100644
 25 index 000000000000..ed1ee4753d49
 26 --- /dev/null
 27 +++ b/arch/arm/cpu/armv7/bcm2835/Makefile
 28 @@ -0,0 +1,13 @@
 29 +#
 30 +# (C) Copyright 2012 Stephen Warren
 31 +#
 32 +# SPDX-License-Identifier: GPL-2.0+
 33 +#
 34 +
 35 +src_dir := ../../arm1176/bcm2835/
 36 +
 37 +obj-y :=
 38 +obj-y += $(src_dir)/init.o
 39 +obj-y += $(src_dir)/reset.o
 40 +obj-y += $(src_dir)/timer.o
 41 +obj-y += $(src_dir)/mbox.o
 42 diff --git a/arch/arm/include/asm/arch-bcm2835/gpio.h b/arch/arm/include/asm/arch-bcm2835/gpio.h
 43 index db42896201b3..c8ef8f528a21 100644
 44 --- a/arch/arm/include/asm/arch-bcm2835/gpio.h
 45 +++ b/arch/arm/include/asm/arch-bcm2835/gpio.h
 46 @@ -1,6 +1,7 @@
 47  /*
 48   * Copyright (C) 2012 Vikram Narayananan
 49   * <vikram186 at gmail.com>
 50 + * (C) Copyright 2012,2015 Stephen Warren
 51   *
 52   * SPDX-License-Identifier: GPL-2.0+
 53   */
 54 @@ -8,7 +9,11 @@
 55  #ifndef _BCM2835_GPIO_H_
 56  #define _BCM2835_GPIO_H_
 57  
 58 +#ifdef CONFIG_BCM2836
 59 +#define BCM2835_GPIO_BASE  0x3f200000
 60 +#else
 61  #define BCM2835_GPIO_BASE  0x20200000
 62 +#endif
 63  #define BCM2835_GPIO_COUNT  54
 64  
 65  #define BCM2835_GPIO_FSEL_MASK  0x7
 66 diff --git a/arch/arm/include/asm/arch-bcm2835/mbox.h b/arch/arm/include/asm/arch-bcm2835/mbox.h
 67 index 88d2ec11a7c2..c4bbacaf3c3f 100644
 68 --- a/arch/arm/include/asm/arch-bcm2835/mbox.h
 69 +++ b/arch/arm/include/asm/arch-bcm2835/mbox.h
 70 @@ -1,5 +1,5 @@
 71  /*
 72 - * (C) Copyright 2012 Stephen Warren
 73 + * (C) Copyright 2012,2015 Stephen Warren
 74   *
 75   * SPDX-License-Identifier: GPL-2.0+
 76   */
 77 @@ -38,7 +38,11 @@
 78  
 79  /* Raw mailbox HW */
 80  
 81 +#ifdef CONFIG_BCM2836
 82 +#define BCM2835_MBOX_PHYSADDR 0x3f00b880
 83 +#else
 84  #define BCM2835_MBOX_PHYSADDR 0x2000b880
 85 +#endif
 86  
 87  struct bcm2835_mbox_regs {
 88   u32 read;
 89 diff --git a/arch/arm/include/asm/arch-bcm2835/sdhci.h b/arch/arm/include/asm/arch-bcm2835/sdhci.h
 90 index da4d5cd5a88f..2a21ccbf66ba 100644
 91 --- a/arch/arm/include/asm/arch-bcm2835/sdhci.h
 92 +++ b/arch/arm/include/asm/arch-bcm2835/sdhci.h
 93 @@ -1,5 +1,5 @@
 94  /*
 95 - * (C) Copyright 2012 Stephen Warren
 96 + * (C) Copyright 2012,2015 Stephen Warren
 97   *
 98   * SPDX-License-Identifier: GPL-2.0
 99   */
100 @@ -7,7 +7,11 @@
101  #ifndef _BCM2835_SDHCI_H_
102  #define _BCM2835_SDHCI_H_
103  
104 +#ifdef CONFIG_BCM2836
105 +#define BCM2835_SDHCI_BASE 0x3f300000
106 +#else
107  #define BCM2835_SDHCI_BASE 0x20300000
108 +#endif
109  
110  int bcm2835_sdhci_init(u32 regbase, u32 emmc_freq);
111  
112 diff --git a/arch/arm/include/asm/arch-bcm2835/timer.h b/arch/arm/include/asm/arch-bcm2835/timer.h
113 index 2d7cfe5c56f8..fc7aec7b7c59 100644
114 --- a/arch/arm/include/asm/arch-bcm2835/timer.h
115 +++ b/arch/arm/include/asm/arch-bcm2835/timer.h
116 @@ -1,5 +1,5 @@
117  /*
118 - * (C) Copyright 2012 Stephen Warren
119 + * (C) Copyright 2012,2015 Stephen Warren
120   *
121   * SPDX-License-Identifier: GPL-2.0
122   */
123 @@ -7,7 +7,11 @@
124  #ifndef _BCM2835_TIMER_H
125  #define _BCM2835_TIMER_H
126  
127 +#ifdef CONFIG_BCM2836
128 +#define BCM2835_TIMER_PHYSADDR 0x3f003000
129 +#else
130  #define BCM2835_TIMER_PHYSADDR 0x20003000
131 +#endif
132  
133  struct bcm2835_timer_regs {
134   u32 cs;
135 diff --git a/arch/arm/include/asm/arch-bcm2835/wdog.h b/arch/arm/include/asm/arch-bcm2835/wdog.h
136 index f369ab589c9a..beb6a0820601 100644
137 --- a/arch/arm/include/asm/arch-bcm2835/wdog.h
138 +++ b/arch/arm/include/asm/arch-bcm2835/wdog.h
139 @@ -1,5 +1,5 @@
140  /*
141 - * (C) Copyright 2012 Stephen Warren
142 + * (C) Copyright 2012,2015 Stephen Warren
143   *
144   * SPDX-License-Identifier: GPL-2.0
145   */
146 @@ -7,7 +7,11 @@
147  #ifndef _BCM2835_TIMER_H
148  #define _BCM2835_TIMER_H
149  
150 +#ifdef CONFIG_BCM2836
151 +#define BCM2835_WDOG_PHYSADDR   0x3f100000
152 +#else
153  #define BCM2835_WDOG_PHYSADDR   0x20100000
154 +#endif
155  
156  struct bcm2835_wdog_regs {
157   u32 unknown0[7];

這是 ODROID C1 和 rpi2 的比較:
Raspberry Pi 2/ODROID C1 Development Boards Comparison

arm cortex a 系列有好幾款, 搞得我頭昏眼花:
  • Cortex-A72 Processor
  • Cortex-A57 Processor
  • Cortex-A53 Processor
  • Cortex-A17 Processor
  • Cortex-A15 Processor
  • Cortex-A9 Processor
  • Cortex-A8 Processor (Single core only)
  • Cortex-A7 Processor
  • Cortex-A5 Processor
你認為是數字愈大愈厲害嗎? 感覺是這樣, 不過 a7 可以看成是精簡過後的 a15, 是新架構的便宜精簡版本, 可以看看 Relative Performance of ARM Cortex-A 32-bit and 64-bit Cores 的比較。

http://www.cnx-software.com/2015/04/09/relative-performance-of-arm-cortex-a-32-bit-and-64-bit-cores/

講了老半天應該來談談怎麼裝個 os 來用, 本著對 linux 的愛好, 當然是裝 Raspbian, sd card 插上 pc, dd 一下後搞定。

假如 sda 是你的 sd card, sda1 是第一個 partition, 以下指令是針對 sda, 結束後會產生 sda1, sda2, 這就是為什麼是使用 sda, 而不是 sda1, mmc 也是一樣的道理, 是 /dev/mmcblk0 而不是 /dev/mmcblk0p1。

disk
 1 dd bs=4M if=2015-05-05-raspbian-wheezy.img of=/dev/mmcblk0
 2 root@NB-debian:/home/descent/download/rpi/2# mount /dev/mmcblk0p2  /media/2/
 3 root@NB-debian:/home/descent/download/rpi/2# ls /media/1/
 4 bcm2708-rpi-b.dtb COPYING.linux  kernel7.img  start_db.elf
 5 bcm2708-rpi-b-plus.dtb fixup_cd.dat   kernel.img  start.elf
 6 bcm2709-rpi-2-b.dtb fixup.dat      LICENCE.broadcom  start_x.elf
 7 bootcode.bin  fixup_db.dat   LICENSE.oracle
 8 cmdline.txt  fixup_x.dat    overlays
 9 config.txt  issue.txt      start_cd.elf
10 root@NB-debian:/home/descent/download/rpi/2# ls /media/2/
11 bin   dev  home  lost+found  mnt  proc run   selinux  sys  usr
12 boot  etc  lib  media      opt  root sbin  srv      tmp  var

disk L3 ~ 9 就是第一個 partition 的內容, 可以把他想成是 pc 的 bios/uefi, 那些東西的學問可不小; disk L10 ~ 12 就是熟悉的 linux 目錄。

插上 hdmi 接到電視後就是下面的樣子, 還特地去買了 usb keyboard/mouse 要不然一直卡在這邊也不是辦法。



設定完之後, 就是一般的 linux 畫面, 我是選擇進入 X。



以 Serial Port 操作 Raspberry Pi A+】這篇提到怎麼使用 serial, 我們可是軟體開發人員耶, 當然是用 serial port, 看著大電視多不方便。



我沒有接黑色的 ground pin, 這不是好的行為。最後還是接了黑色的 ground, 要不然有時候會怪怪的。

minicom 的設定值:
A -    Serial Device      : /dev/ttyUSB0
 B - Lockfile Location     : /var/lock  
 C -   Callin Program      :           
 D -  Callout Program      :           
 E -    Bps/Par/Bits       : 115200 8N1
 F - Hardware Flow Control : No       
 G - Software Flow Control : No  

# set toolchain path
export PATH=$PATH:/home/descent/git/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
export CROSS_COMPILE=arm-linux-gnueabihf-
make rpi_2_defconfig
make

ref:

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。