开机篇 – 树莓派 Raspberry Pi Model B+ 入手折腾记 (1)

目录 Content
[hide]

终于没能忍受住树莓派这个小巧玩意儿的诱惑,LT 入手了一款 B+ 型号的绿板树莓派。这货有GPIO,有USB,有网口,光这三项就能开发出好多应用。在购买之前,也了解到有红版的树莓派,但是觉得红色容易审美疲劳,最终还是选择了绿色版本的。再者,B+型号的树莓派主板布局比较整洁,这个也是入手的原因之一。本文目标解决以下问题:

  • 没有键盘和鼠标以及显示器的情况下,如何连接到树莓派点亮系统
  • 树莓派的TF卡该如何选取,以及测试树莓派读取TF卡速度能有多快

一、产品外观

树莓派 B+ 型号长这个模样,下面的图片取自于网络,点击将会链接到官方大图。(板子外观大图 | GPIO 标识大图)

Raspberry Pi B+

二、入手上电 Arch Linux

LT 只购买了一个裸板 B+ 和一只2A电流的电源,TF卡并没有急着买,计划先使用手里空闲的 2G卡。不过官方的 wheezy-raspbian 系统映像有3G大,所以不得不使用 Arch Linux的映像。网上找到了 ArchLinuxARM-2014.06-rpi.img 这个版本,大小1.8G多,正好可以写入到2G的卡内。

1. Hello, Arch Linux!

使用 USB Image Tool 将 ArchLinuxARM-2014.06-rpi.img 写入 TF 卡,插入树莓派上电开机。这个工具需要管理员权限,LT 的电脑没有管理员权限,只好借了一台电脑才写好镜像。另外, LT 也没有显示器,怎么看系统是否起来了呢?还好有路由器,将树莓派的有线网口用网线接入路由器,然后用电脑登陆路由器的管理界面,找到树莓派的IP地址,然后用Putty使用SSH连接到22号端口,发现系统已经起来了!Hello, Arch Linux ARM!  填入账户 root和密码 root 即可登录。

Raspberry_Pi_arch_ssh而后,LT 又尝试了 UART 串口控制台登录,不过失败了。后来事实证明,是串口连线有误,后面将会介绍正确的串口登录连接。

2. 设置 ls 显示颜色

参见了 http://www.codelast.com/?p=4945 一文,使用 nano 编辑 /etc/profile 文件,在最后一行加入

alias ls='ls --color=auto'

保存后,重新启动树莓派,ls 命令就可以显示彩色了。

三、大容量TF卡再战 Raspbian

初步将树莓派点亮后,LT 就开始琢磨着要加大TF卡容量了。8G容量有点小了,16G或者32G的都可以。

1. 选什么样的 TF 卡

起初看中了 Sandisk 32G Ultra 的TF卡,但是后来思考到TF卡的速度越快越好,不能只考虑性价比,最后选择了 Sandisk 16G Extreme 这个TF 卡。入手后,插入随机配的SD卡套,用笔记本的SD读卡器测试了一下速度。写速度 18M/s 还可以,但是读速度 19M/s 就不怎么样,这样来说这块卡离标称速度距离挺大的啊,Sandisk 你不要不思进取啊!

sandisk_16G_extreme_TF现在还有个问题需要考虑,如果TF卡速度能跟的上,那么树莓派本身读写TF卡的IO速度最高能是多少呢? (2014-11-27 更新:早有人有同样的问题,参见这个链接 UHS/CL10 SD speed on Pi ,说 “The fastest speed reported was reading at about 23.3 MBps, and writing at about 21.5 MBps using a SanDisk Extreme III 2GB Class 10 (BE07054050838) with RaspBMC on a 512 MB Model B”。更详细的参数参见:http://elinux.org/RPi_SD_cards#SD_card_performance ,要买 TF卡 的一定要仔细看看!)

2. 将映像写入TF卡的方案

现在有了大容量TF卡,那么就可以重新测试 raspbian 系统了,重新下载了 2014-09-09-wheezy-raspbian.img文件 ,可是仍然没有权限使用 USB Image Tool,那么就利用前面已经装好的 Arch 系统来做这个事情。思路是这样的,将 2014-09-09-wheezy-raspbian.img 文件拷入到 U盘,将新的 16G的TF卡插入USB读卡器,然后将两者都接入树莓派的USB口,使用 dd 这个工具来写映像!

3. UART 串口登录

再次尝试了串口终端登录,这次成功了!LT 采用的是Arduino板上的串口,将Atmel芯片取下,Arduino板就变成了一块专用 USB转TTL的转接器了。当然你也可以使用其他串口线,LT 只不过充分利用手里的Arduino而已。连接需要连3根线,将树 莓派的 5V 地线和 Arduino板地线连接,树莓派的 Tx 和 Arduino板上的 Tx 相连(注意不是Rx,LT在第一次尝试时连的Rx所以没成功,因为Arduino上标的Tx 是相对于 Atmel CPU 来说的,那么相对于USB转出来的串口就是 Rx),树莓派的 Rx 和 Arduino 的 Rx (相对于USB转出来的串口就是 Rx)相连。

尝试了一下用 Frizing 来画连接图,发现很方便。

Fritzing_Raspi_Arduino可能有的读者在此有个疑问: Arduino 的电压是 5V,树莓派的电压是 3.3V,两者连接会有问题么? 注意到 arduino 的USB转出的串口到Atmel的串口之间各串了1个1K的电阻,应该问题不大,反正 LT 这样连接了,而且也通讯成功了。(2014-11-27 更新:如果你确实不放心,参考 http://elinux.org/RPi_GPIO_Interface_Circuits 的连接方式)

Raspberry_Pi_Rx_Tx如果不外接U盘,树莓派可以使用USB转串口提供的5V电压,但接上U盘和读卡器后,为了保险起见,使用2A的外接电源。上图中,白色的读卡器插入的是16G的新TF卡,U盘内拷入的是映像文件。右边的 Arduino 板采用的是 LT 在2009年购买的白色版 Duemilanove

在PC上打开串口终端软件,如Putty,波特率设为 115200,然后打开 串口,将树莓派上电,一切正常的话,会有信息滚屏!使用 root 账号密码即可登录。Raspberry_Pi_Rx_Tx_console

4. 使用 dd 写映像

使用 fdisk -l 命令查看磁盘,找到U盘分区以及TF卡。如下图

fdisk_l红色部分就是3个盘,1.9G就是当前的系统盘 /dev/mmcblk0,3.9G的是U盘 /dev/sdb,14.9G的就是16G的TF卡 /dev/sda 。绿色部分是U盘的分区 /dev/sdb4 。TF卡的分区是 /dev/sda1,不过我们用不到。

然后将U盘分区挂载到 /mnt 目录下新建的文件夹 udisk

[root@alarmpi ~]# mkdir /mnt/udisk
[root@alarmpi ~]# mount /dev/sdb4 /mnt/udisk
[root@alarmpi ~]# ls /mnt/udisk/
2014-09-09-wheezy-raspbian.img

再使用dd命令将U盘内的映像文件写入TF卡

[root@alarmpi ~]# dd bs=4M if=/mnt/udisk/2014-09-09-wheezy-raspbian.img of=/dev/sda

dd 这个命令没有回显,整个过程比较慢,需要耐心等待,直到返回完成信息。

781+1 records in
781+1 records out
3276800000 bytes (3.3 GB) copied, 301.014 s, 10.9 MB/s

LT的这个写入过程花了约5分钟时间。这样,映像就写入了TF卡。可以使用 fdisk -l 命令再查看一下,会发现 TF卡被分了两个区。

Disk /dev/sda: 14.9 GiB, 15931539456 bytes, 31116288 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00090806

Device    Boot     Start       End  Blocks  Id System
/dev/sda1           8192    122879   57344   c W95 FAT32 (LBA)
/dev/sda2         122880   6399999 3138560  83 Linux

将树莓派关掉,移除读卡器和U盘以及旧的TF卡,插入新写入的TF卡,上电,一切正常的话,就会有串口信息发出。

Uncompressing Linux... done, booting the kernel.
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 3.12.28+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) (crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #709 PREEMPT Mon Sep 8 15:28:00 BST 2014
[    0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache
[    0.000000] Machine: BCM2708
[    0.000000] cma: CMA: reserved 8 MiB at 1b800000
[    0.000000] Memory policy: ECC disabled, Data cache writeback
[    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 113792
[    0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708.boardrev=0x10 bcm2708.serial=0x71bb3ba smsc95xx.macaddr=B8:27:EB:1B:B3:BA bcm2708.disk_led_gpio=47 bcm2708.disk_led_active_low=0 sdhci-bcm2708.emmc_clock_freq=250000000 vc_mem.mem_base=0x1ec00000 vc_mem.mem_size=0x20000000  dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
[    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: 439532K/458752K available (4498K kernel code, 242K rwdata, 1344K rodata, 143K init, 701K bss, 19220K reserved)
[    0.000000] Virtual kernel memory layout:
[    0.000000]     vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[    0.000000]     fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[    0.000000]     vmalloc : 0xdc800000 - 0xff000000   ( 552 MB)
[    0.000000]     lowmem  : 0xc0000000 - 0xdc000000   ( 448 MB)
[    0.000000]     modules : 0xbf000000 - 0xc0000000   (  16 MB)
[    0.000000]       .text : 0xc0008000 - 0xc05bca24   (5843 kB)
[    0.000000]       .init : 0xc05bd000 - 0xc05e0eac   ( 144 kB)
[    0.000000]       .data : 0xc05e2000 - 0xc061e8a0   ( 243 kB)
[    0.000000]        .bss : 0xc061e8ac - 0xc06ce080   ( 702 kB)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] Preemptible hierarchical RCU implementation.
[    0.000000] NR_IRQS:394
[    0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4294967ms
[    0.000000] Switching to timer-based delay loop
[    0.000000] Console: colour dummy device 80x30
[    0.000000] console [tty1] enabled
[    0.001184] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=10000)
[    0.001244] pid_max: default: 32768 minimum: 301
[    0.001762] Mount-cache hash table entries: 512
[    0.002580] Initializing cgroup subsys memory
[    0.002691] Initializing cgroup subsys devices
[    0.002730] Initializing cgroup subsys freezer
[    0.002762] Initializing cgroup subsys blkio
[    0.002912] CPU: Testing write buffer coherency: ok
[    0.003380] Setting up static identity map for 0xc04487f8 - 0xc0448854
[    0.005314] devtmpfs: initialized
[    0.021242] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[    0.022827] NET: Registered protocol family 16
[    0.028166] DMA: preallocated 4096 KiB pool for atomic coherent allocations
[    0.028853] cpuidle: using governor ladder
[    0.028901] cpuidle: using governor menu
[    0.029312] bcm2708.uart_clock = 0
[    0.031400] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[    0.031461] hw-breakpoint: maximum watchpoint size is 4 bytes.
[    0.031497] mailbox: Broadcom VideoCore Mailbox driver
[    0.031596] bcm2708_vcio: mailbox at f200b880
[    0.031700] bcm_power: Broadcom power driver
[    0.031736] bcm_power_open() -> 0
[    0.031761] bcm_power_request(0, 8)
[    0.532479] bcm_mailbox_read -> 00000080, 0
[    0.532519] bcm_power_request -> 0
[    0.532775] Serial: AMBA PL011 UART driver
[    0.532946] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83, base_baud = 0) is a PL011 rev3
[    0.896181] console [ttyAMA0] enabled
[    0.923317] bio: create slab <bio-0> at 0
[    0.928838] SCSI subsystem initialized
[    0.932839] usbcore: registered new interface driver usbfs
[    0.938540] usbcore: registered new interface driver hub
[    0.944098] usbcore: registered new device driver usb
[    0.950674] Switched to clocksource stc
[    0.954947] FS-Cache: Loaded
[    0.958115] CacheFiles: Loaded
[    0.973982] NET: Registered protocol family 2
[    0.979784] TCP established hash table entries: 4096 (order: 3, 32768 bytes)
[    0.987198] TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
[    0.993790] TCP: Hash tables configured (established 4096 bind 4096)
[    1.000238] TCP: reno registered
[    1.003534] UDP hash table entries: 256 (order: 0, 4096 bytes)
[    1.009404] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[    1.016176] NET: Registered protocol family 1
[    1.021170] RPC: Registered named UNIX socket transport module.
[    1.027130] RPC: Registered udp transport module.
[    1.031937] RPC: Registered tcp transport module.
[    1.036659] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    1.044002] bcm2708_dma: DMA manager at f2007000
[    1.048745] bcm2708_gpio: bcm2708_gpio_probe c05efef0
[    1.054314] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000000(512 MiB)
[    1.063895] audit: initializing netlink socket (disabled)
[    1.069402] type=2000 audit(0.910:1): initialized
[    1.239621] VFS: Disk quotas dquot_6.5.2
[    1.243983] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[    1.252975] FS-Cache: Netfs 'nfs' registered for caching
[    1.259887] NFS: Registering the id_resolver key type
[    1.265172] Key type id_resolver registered
[    1.269379] Key type id_legacy registered
[    1.274182] msgmni has been set to 874
[    1.279914] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
[    1.287776] io scheduler noop registered
[    1.291855] io scheduler deadline registered (default)
[    1.297333] io scheduler cfq registered
[    1.302548] BCM2708FB: allocated DMA memory 5bc00000
[    1.307592] BCM2708FB: allocated DMA channel 0 @ f2007000
[    1.315406] bcm2708_fb_pan_display(0,0) returns=0
[    1.317711] Console: switching to colour frame buffer device 82x26
[    1.318258] bcm2708_fb_pan_display(0,0) returns=0
[    1.341172] bcm2708-dmaengine bcm2708-dmaengine: Load BCM2835 DMA engine driver
[    1.350204] uart-pl011 dev:f1: no DMA platform data
[    1.357199] vc-cma: Videocore CMA driver
[    1.362572] vc-cma: vc_cma_base      = 0x00000000
[    1.368608] vc-cma: vc_cma_size      = 0x00000000 (0 MiB)
[    1.375359] vc-cma: vc_cma_initial   = 0x00000000 (0 MiB)
[    1.391620] brd: module loaded
[    1.401332] loop: module loaded
[    1.406043] vchiq: vchiq_init_state: slot_zero = 0xdb800000, is_master = 0
[    1.415354] Loading iSCSI transport class v2.0-870.
[    1.422903] usbcore: registered new interface driver smsc95xx
[    1.430451] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[    1.637926] Core Release: 2.80a
[    1.642449] Setting default values for core params
[    1.648515] Finished setting default values for core params
[    1.855455] Using Buffer DMA mode
[    1.860071] Periodic Transfer Interrupt Enhancement - disabled
[    1.867239] Multiprocessor Interrupt Enhancement - disabled
[    1.874173] OTG VER PARAM: 0, OTG VER FLAG: 0
[    1.879829] Dedicated Tx FIFOs mode
[    1.884957] WARN::dwc_otg_hcd_init:1042: FIQ DMA bounce buffers: virt = 0xdbc14000 dma = 0x5bc14000 len=9024
[    1.897453] FIQ FSM acceleration enabled for :
[    1.897453] Non-periodic Split Transactions
[    1.897453] Periodic Split Transactions
[    1.897453] High-Speed Isochronous Endpoints
[    1.919456] WARN::hcd_init:473: FIQ at 0xc0321550
[    1.925564] WARN::hcd_init:474: FIQ ASM at 0xc0321800 length 36
[    1.932882] WARN::hcd_init:500: MPHI regs_base at 0xdc806000
[    1.939881] dwc_otg bcm2708_usb: DWC OTG Controller
[    1.946133] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
[    1.954787] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
[    1.961656] Init: Port Power? op_state=1
[    1.966849] Init: Power Port (0)
[    1.971691] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[    1.979817] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    1.988383] usb usb1: Product: DWC OTG Controller
[    1.994410] usb usb1: Manufacturer: Linux 3.12.28+ dwc_otg_hcd
[    2.001558] usb usb1: SerialNumber: bcm2708_usb
[    2.008202] hub 1-0:1.0: USB hub found
[    2.013421] hub 1-0:1.0: 1 port detected
[    2.019593] usbcore: registered new interface driver usb-storage
[    2.027349] mousedev: PS/2 mouse device common for all mice
[    2.034919] bcm2835-cpufreq: min=700000 max=700000 cur=700000
[    2.042142] bcm2835-cpufreq: switching to governor powersave
[    2.049048] bcm2835-cpufreq: switching to governor powersave
[    2.056054] sdhci: Secure Digital Host Controller Interface driver
[    2.063530] sdhci: Copyright(c) Pierre Ossman
[    2.069200] sdhci: Enable low-latency mode
[    2.110923] mmc0: SDHCI controller on BCM2708_Arasan [platform] using platform's DMA
[    2.121460] mmc0: BCM2708 SDHC host at 0x20300000 DMA 2 IRQ 77
[    2.128785] sdhci-pltfm: SDHCI platform and OF driver helper
[    2.135956] ledtrig-cpu: registered to indicate activity on CPUs
[    2.145596] hidraw: raw HID events driver (C) Jiri Kosina
[    2.159951] usbcore: registered new interface driver usbhid
[    2.167032] usbhid: USB HID core driver
[    2.176899] TCP: cubic registered
[    2.183675] Initializing XFRM netlink socket
[    2.191411] NET: Registered protocol family 17
[    2.197414] Key type dns_resolver registered
[    2.210918] Indeed it is in host mode hprt0 = 00021501
[    2.220753] registered taskstats version 1
[    2.231432] Waiting for root device /dev/mmcblk0p2...
[    2.252057] mmc0: new high speed SDHC card at address e624
[    2.270970] mmcblk0: mmc0:e624 SE16G 14.8 GiB
[    2.281836]  mmcblk0: p1 p2
[    2.356059] EXT4-fs (mmcblk0p2): recovery complete
[    2.362632] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
[    2.373598] VFS: Mounted root (ext4 filesystem) on device 179:2.
[    2.382168] devtmpfs: mounted
[    2.387058] Freeing unused kernel memory: 140K (c05bd000 - c05e0000)
[    2.420868] usb 1-1: new high-speed USB device number 2 using dwc_otg
[    2.429289] Indeed it is in host mode hprt0 = 00001101
[    2.641324] usb 1-1: New USB device found, idVendor=0424, idProduct=9514
[    2.649559] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    2.663435] hub 1-1:1.0: USB hub found
[    2.668865] hub 1-1:1.0: 5 ports detected
[    2.960972] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
[    3.071254] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[    3.087543] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[    3.110926] smsc95xx v1.0.4
[    3.181107] smsc95xx 1-1.1:1.0 eth0: register 'smsc95xx' at usb-bcm2708_usb-1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:1b:b3:ba
[    3.858841] udevd[156]: starting version 175
[    5.849572] bcm2708-i2s bcm2708-i2s.0: Failed to create debugfs directory
[    9.289995] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[    9.762444] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
øà
Raspbian GNU/Linux 7 raspberrypi ttyAMA0

raspberrypi login:

使用账号 pi 密码 raspberry 即可登录!

raspbian列表看看内容,raspbian 的显示会自动采用彩色。

raspbian_console

三、测试树莓派读写TF卡的速度

前面提过一个问题,怎么知道树莓派的读写速度呢,参见 http://www.linuxidc.com/Linux/2012-11/74040.htm 一文,测试结果如下,这个结果是树莓派本身和TF卡综合的结果:这个系统在8K数据块的情况下综合写速度为 15M/s(因为空间不够,所以过程被打断了,实际结果要高于这个数值) ,读速度为 18M/s 。似乎和前面用电脑读卡器测试的结果相符。(2014-11-27 更新:原来已经有更详细的指导和测试数据:http://elinux.org/RPi_SD_cards#SD_card_performance

sandisk_extreme_rasp_tf_speedhttp://elinux.org/RPi_SD_cards#SD_card_performance 测试的数据看,树莓派的最高速度约为 21M/s,这个可以作为选购指南,所以可以在 Class 10 系列的卡里挑选一下,选购一个读写性能接近的TF卡即可。

四、配置 raspi-config

可使用 sudo raspi-config 进行raspbian的设定,可选第一项将磁盘分区扩展到整个TF卡。

raspi-config

五、正确的TF卡取出方式

因为有2个TF卡,LT 居然有好几次换卡时直接就把TF卡拔出来!由此看来TF卡槽锁定机能有问题! 正确的取法是将TF卡按下后弹出,待自行伸出较长后再取出,切忌不要直接拔!难道我这个淘宝买来的是次品?谁能告诉我真相? 搜了下,这里有个视频 http://my.tv.sohu.com/us/124617652/73854210.shtml,这里也有人反映 http://www.raspberrypi.org/forums/viewtopic.php?t=83259 。不知道会不会日后影响到树莓派的运行稳定性?拭目以待。

rasp_tf_tray至此,整个树莓派的开机篇就结束了。

扩展阅读:

关键字:树莓派, B+, 串口

4 thoughts on “开机篇 – 树莓派 Raspberry Pi Model B+ 入手折腾记 (1)

  1. 今天突然发现我的树莓派B+上电,led指示灯不亮开不了机,应是开始微亮后不亮了,且过一会整个板都会发热,内存散热片相对比较热。是不是报废了?

  2. 我的摄像头总是驱动不起来,我已经在raspi-config里将camera 弄成enable了,可是还是没办法驱动摄像头,谁能告诉我是怎么回事

Leave a Reply

Your email address will not be published. Required fields are marked *