├── ConfigFiles ├── A13-Lichee_defconfig ├── Makefile ├── a13_linux_defconfig └── sun5i-a13-lichee.dts ├── LICENSE ├── README.md ├── 教程文档 ├── .gitignore ├── Makefile ├── README.md ├── _static │ ├── web │ │ ├── contact.css │ │ └── contact.js │ ├── 图标 │ │ ├── icon.png │ │ └── icon2.png │ ├── 概览 │ │ ├── 1.contents.jpg │ │ ├── 2.list.png │ │ ├── 3.list.png │ │ ├── 4.list.png │ │ ├── 5.guide.png │ │ ├── 6.guide.png │ │ └── 7.guide.jpg │ └── 硬件 │ │ ├── 1.1.1_1.png │ │ ├── 1.1.1_2.png │ │ ├── 1.1.1_3.png │ │ ├── 1.1.1_4.jpg │ │ ├── 1.1.2_1.jpg │ │ ├── 1.1.2_2.jpg │ │ ├── 1.1.2_3.jpg │ │ ├── 1.1.2_4.jpg │ │ ├── 1.power.jpg │ │ ├── 10.power.jpg │ │ ├── 2.power.jpg │ │ ├── 3.power.jpg │ │ ├── 4.power.jpg │ │ ├── 5.power.jpg │ │ ├── 6.power.jpg │ │ ├── 7.power.jpg │ │ ├── 8.power.jpg │ │ └── 9.power.jpg ├── _templates │ └── footer.html ├── camdroid │ ├── camdroid_build.rst │ └── contents.rst ├── conf.py ├── index.rst ├── linux适配 │ ├── 2.1.0 使用git进行项目管理.md │ ├── 2.1.1 开发环境搭建.md │ ├── 2.1.2 u-boot-sunxi走读.md │ ├── 2.1.3 tf镜像烧录解读.md │ ├── LCD参数适配.rst │ ├── contents.rst │ └── tmp_简明linux-sunxi编译指南.md ├── make.bat ├── 产测 │ ├── 1.3.1 样板焊接备料.md │ ├── 1.3.2 样板元件焊接.md │ └── contents.rst ├── 安卓适配 │ ├── android_build.md │ ├── codec&Audio.md │ ├── contents.rst │ ├── uart_module.md │ ├── usb_module.md │ └── wifi_module.md ├── 概览 │ ├── contents.rst │ ├── debian.md │ ├── go_through.rst │ ├── guide.rst │ ├── list.rst │ └── resource.rst └── 硬件 │ ├── 1.1.1 主控芯片概览.md │ ├── 1.1.3 内存存储部分设计.md │ ├── 1.1.4 多媒体类接口设计.md │ ├── 1.1.5 其它接口引出.md │ ├── 1.2.1 PCB参数确认及布局.md │ ├── 1.2.2 DDR部分Layout.md │ ├── 1.2.3 电源层分割.md │ ├── 1.2.4 TF卡及其余接口layout.md │ ├── contents.rst │ └── power.rst ├── 资源文件 ├── 20150601_RTL8723BU_WiFi_linux_v4.3.16_14189_BT_android5.0_V3.0_P11_FW_svn14422-BTCOEX20150119-5844.zip ├── A13 Datasheet V1.30.pdf ├── A13 User Manual V1.30.pdf ├── A13启动整体流程.vsdx ├── A13引脚整理.xlsx ├── A20_系统配置手册_v2.0_20130716.pdf ├── Lichee原理图.pdf ├── SDK 下载.md ├── Visio-A13启动整体流程.pdf ├── Visio-uboot-sunxi spl部分流程.pdf ├── Visio-uboot-sunxi uboot部分流程.pdf ├── a13-lichee.fex ├── lichee SDK编译说明.md ├── uboot-sunxi spl部分流程.vsdx ├── uboot-sunxi uboot部分流程.vsdx └── 镜像烧写 │ ├── a13-lichee.fex │ ├── boot.cmd │ ├── clear_partion.sh │ ├── u-boot-sunxi-with-spl.bin │ ├── uImage │ ├── update_bootscr.sh │ ├── update_fex.sh │ ├── update_kernel.sh │ ├── update_mod.sh │ ├── update_uImage.sh │ ├── write_all.sh │ ├── write_boot.sh │ ├── write_fs.sh │ ├── write_mkfs.sh │ ├── write_p1.sh │ ├── write_p2.sh │ ├── write_partion.sh │ └── 根文件系统下载链接.md ├── 连载帖 ├── 1.1.1 主控芯片概览.md ├── 1.1.2 电源部分设计.md ├── 1.1.3 内存存储部分设计.md ├── 1.1.4 多媒体类接口设计.md ├── 1.1.5 其它接口引出.md ├── 1.2.1 PCB参数确认及布局.md ├── 1.2.2 DDR部分Layout.md ├── 1.2.3 电源层分割.md ├── 1.2.4 TF卡及其余接口layout.md ├── 1.3.1 样板焊接备料.md ├── 1.3.2 样板元件焊接.md ├── 1.3.3 电源晶振等初步确认.md ├── 2.1.0 使用git进行项目管理.md ├── 2.1.1 开发环境搭建.md ├── 2.1.2 u-boot-sunxi走读.md ├── 2.1.3 tf镜像烧录解读.md ├── 2.1.x lichee sdk 构建走读.md ├── 2.1.y 自制镜像启动尝试_未整理.md ├── pic │ ├── 1.1.1_1.png │ ├── 1.1.1_2.png │ ├── 1.1.1_3.png │ ├── 1.1.1_4.jpg │ ├── 1.1.2_1.jpg │ ├── 1.1.2_2.jpg │ ├── 1.1.2_3.jpg │ ├── 1.1.2_4.jpg │ └── README.md ├── tmp_todo.md └── tmp_简明linux-sunxi编译指南.md └── 那些年我们踩的坑 ├── README.md ├── boot坑_TF卡不响应块读取命令.md ├── 编译坑_Ubuntu 16.04编译过程踩坑记录.md └── 编译坑_Ubuntu16.04编译过程踩坑记录二.md /ConfigFiles/A13-Lichee_defconfig: -------------------------------------------------------------------------------- 1 | CONFIG_ARM=y 2 | CONFIG_ARCH_SUNXI=y 3 | CONFIG_MACH_SUN5I=y 4 | CONFIG_DRAM_CLK=408 5 | CONFIG_DRAM_MBUS_CLK=204 6 | CONFIG_DRAM_ZQ=121 7 | CONFIG_DRAM_ODT_EN=y 8 | CONFIG_DRAM_EMR1=4 9 | CONFIG_DRAM_TPR3=0 10 | 11 | 12 | CONFIG_SYS_CLK_FREQ=1008000000 13 | 14 | CONFIG_MMC=y 15 | 16 | CONFIG_MMC_SUNXI_SLOT_EXTRA=2 17 | 18 | CONFIG_USB0_VBUS_PIN="PG0" 19 | CONFIG_USB0_VBUS_DET="PG1" 20 | CONFIG_AXP_GPIO=y 21 | # CONFIG_VIDEO_HDMI is not set 22 | CONFIG_VIDEO_VGA_VIA_LCD=y 23 | CONFIG_VIDEO_VGA_VIA_LCD_FORCE_SYNC_ACTIVE_HIGH=y 24 | CONFIG_VIDEO_LCD_POWER="AXP0-0" 25 | CONFIG_VIDEO_LCD_BL_EN="PB10" 26 | CONFIG_VIDEO_LCD_BL_PWM="PB2" 27 | CONFIG_DEFAULT_DEVICE_TREE="sun5i-a13-lichee" 28 | # CONFIG_SYS_MALLOC_CLEAR_ON_INIT is not set 29 | CONFIG_SPL=y 30 | CONFIG_SYS_EXTRA_OPTIONS="CONS_INDEX=2" 31 | # CONFIG_CMD_IMLS is not set 32 | # CONFIG_CMD_FLASH is not set 33 | CONFIG_CMD_DFU=y 34 | CONFIG_CMD_USB_MASS_STORAGE=y 35 | # CONFIG_CMD_FPGA is not set 36 | CONFIG_AXP_ALDO2_VOLT=3000 37 | CONFIG_AXP_ALDO3_VOLT=1800 38 | CONFIG_AXP_ALDO4_VOLT=2800 39 | CONFIG_USB_EHCI_HCD=y 40 | CONFIG_USB_MUSB_GADGET=y 41 | CONFIG_USB_GADGET=y 42 | CONFIG_USB_GADGET_DOWNLOAD=y 43 | CONFIG_G_DNL_MANUFACTURER="Allwinner Technology" 44 | CONFIG_G_DNL_VENDOR_NUM=0x1f3a 45 | CONFIG_G_DNL_PRODUCT_NUM=0x1010 46 | CONFIG_LIB_RAND=y 47 | CONFIG_SPL_I2C_SUPPORT=y 48 | -------------------------------------------------------------------------------- /ConfigFiles/Makefile: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-License-Identifier: GPL-2.0+ 3 | # 4 | 5 | dtb-$(CONFIG_AT91FAMILY) += at91sam9260-smartweb.dtb \ 6 | at91sam9g20-taurus.dtb \ 7 | at91sam9g45-corvus.dtb \ 8 | at91sam9g45-gurnard.dtb 9 | 10 | dtb-$(CONFIG_S5PC100) += s5pc1xx-smdkc100.dtb 11 | dtb-$(CONFIG_S5PC110) += s5pc1xx-goni.dtb 12 | dtb-$(CONFIG_EXYNOS4) += exynos4210-origen.dtb \ 13 | exynos4210-smdkv310.dtb \ 14 | exynos4210-universal_c210.dtb \ 15 | exynos4210-trats.dtb \ 16 | exynos4412-trats2.dtb \ 17 | exynos4412-odroid.dtb 18 | 19 | dtb-$(CONFIG_TARGET_HIKEY) += hi6220-hikey.dtb 20 | 21 | dtb-$(CONFIG_EXYNOS5) += exynos5250-arndale.dtb \ 22 | exynos5250-snow.dtb \ 23 | exynos5250-spring.dtb \ 24 | exynos5250-smdk5250.dtb \ 25 | exynos5420-smdk5420.dtb \ 26 | exynos5420-peach-pit.dtb \ 27 | exynos5800-peach-pi.dtb \ 28 | exynos5422-odroidxu3.dtb 29 | dtb-$(CONFIG_EXYNOS7420) += exynos7420-espresso7420.dtb 30 | dtb-$(CONFIG_ARCH_ROCKCHIP) += \ 31 | rk3288-firefly.dtb \ 32 | rk3288-jerry.dtb \ 33 | rk3288-rock2-square.dtb \ 34 | rk3288-evb.dtb \ 35 | rk3036-sdk.dtb \ 36 | rk3399-evb.dtb 37 | dtb-$(CONFIG_ARCH_MESON) += \ 38 | meson-gxbb-odroidc2.dtb 39 | dtb-$(CONFIG_TEGRA) += tegra20-harmony.dtb \ 40 | tegra20-medcom-wide.dtb \ 41 | tegra20-paz00.dtb \ 42 | tegra20-plutux.dtb \ 43 | tegra20-seaboard.dtb \ 44 | tegra20-tec.dtb \ 45 | tegra20-trimslice.dtb \ 46 | tegra20-ventana.dtb \ 47 | tegra20-whistler.dtb \ 48 | tegra20-colibri.dtb \ 49 | tegra30-apalis.dtb \ 50 | tegra30-beaver.dtb \ 51 | tegra30-cardhu.dtb \ 52 | tegra30-colibri.dtb \ 53 | tegra30-tec-ng.dtb \ 54 | tegra114-dalmore.dtb \ 55 | tegra124-jetson-tk1.dtb \ 56 | tegra124-nyan-big.dtb \ 57 | tegra124-venice2.dtb \ 58 | tegra186-p2771-0000-a02.dtb \ 59 | tegra186-p2771-0000-b00.dtb \ 60 | tegra210-e2220-1170.dtb \ 61 | tegra210-p2371-0000.dtb \ 62 | tegra210-p2371-2180.dtb \ 63 | tegra210-p2571.dtb 64 | 65 | dtb-$(CONFIG_ARCH_MVEBU) += \ 66 | armada-375-db.dtb \ 67 | armada-388-clearfog.dtb \ 68 | armada-388-gp.dtb \ 69 | armada-xp-gp.dtb \ 70 | armada-xp-maxbcm.dtb \ 71 | armada-xp-synology-ds414.dtb \ 72 | armada-xp-theadorable.dtb 73 | 74 | dtb-$(CONFIG_ARCH_UNIPHIER) += \ 75 | uniphier-ph1-ld11-ref.dtb \ 76 | uniphier-ph1-ld20-ref.dtb \ 77 | uniphier-ph1-ld4-ref.dtb \ 78 | uniphier-ph1-ld6b-ref.dtb \ 79 | uniphier-ph1-pro4-ace.dtb \ 80 | uniphier-ph1-pro4-ref.dtb \ 81 | uniphier-ph1-pro4-sanji.dtb \ 82 | uniphier-ph1-pro5-4kbox.dtb \ 83 | uniphier-ph1-sld3-ref.dtb \ 84 | uniphier-ph1-sld8-ref.dtb \ 85 | uniphier-proxstream2-gentil.dtb \ 86 | uniphier-proxstream2-vodka.dtb 87 | dtb-$(CONFIG_ARCH_ZYNQ) += zynq-zc702.dtb \ 88 | zynq-zc706.dtb \ 89 | zynq-zed.dtb \ 90 | zynq-zybo.dtb \ 91 | zynq-microzed.dtb \ 92 | zynq-picozed.dtb \ 93 | zynq-zc770-xm010.dtb \ 94 | zynq-zc770-xm011.dtb \ 95 | zynq-zc770-xm012.dtb \ 96 | zynq-zc770-xm013.dtb 97 | dtb-$(CONFIG_ARCH_ZYNQMP) += \ 98 | zynqmp-ep108.dtb \ 99 | zynqmp-zcu102.dtb \ 100 | zynqmp-zcu102-revB.dtb \ 101 | zynqmp-zc1751-xm015-dc1.dtb \ 102 | zynqmp-zc1751-xm016-dc2.dtb \ 103 | zynqmp-zc1751-xm018-dc4.dtb \ 104 | zynqmp-zc1751-xm019-dc5.dtb 105 | dtb-$(CONFIG_AM33XX) += am335x-boneblack.dtb am335x-bone.dtb \ 106 | am335x-draco.dtb \ 107 | am335x-evm.dtb \ 108 | am335x-evmsk.dtb \ 109 | am335x-bonegreen.dtb \ 110 | am335x-icev2.dtb \ 111 | am335x-pxm50.dtb \ 112 | am335x-rut.dtb 113 | dtb-$(CONFIG_AM43XX) += am437x-gp-evm.dtb am437x-sk-evm.dtb \ 114 | am43x-epos-evm.dtb \ 115 | am437x-idk-evm.dtb 116 | dtb-$(CONFIG_THUNDERX) += thunderx-88xx.dtb 117 | 118 | dtb-$(CONFIG_ARCH_SOCFPGA) += \ 119 | socfpga_arria5_socdk.dtb \ 120 | socfpga_cyclone5_is1.dtb \ 121 | socfpga_cyclone5_mcvevk.dtb \ 122 | socfpga_cyclone5_socdk.dtb \ 123 | socfpga_cyclone5_de0_nano_soc.dtb \ 124 | socfpga_cyclone5_sockit.dtb \ 125 | socfpga_cyclone5_socrates.dtb \ 126 | socfpga_cyclone5_sr1500.dtb \ 127 | socfpga_cyclone5_vining_fpga.dtb 128 | 129 | dtb-$(CONFIG_TARGET_DRA7XX_EVM) += dra72-evm.dtb dra7-evm.dtb 130 | dtb-$(CONFIG_TARGET_AM57XX_EVM) += am57xx-beagle-x15.dtb \ 131 | am572x-idk.dtb 132 | dtb-$(CONFIG_TARGET_STV0991) += stv0991.dtb 133 | 134 | dtb-$(CONFIG_LS102XA) += ls1021a-qds-duart.dtb \ 135 | ls1021a-qds-lpuart.dtb \ 136 | ls1021a-twr-duart.dtb ls1021a-twr-lpuart.dtb 137 | dtb-$(CONFIG_FSL_LSCH3) += fsl-ls2080a-qds.dtb \ 138 | fsl-ls2080a-rdb.dtb 139 | dtb-$(CONFIG_FSL_LSCH2) += fsl-ls1043a-qds-duart.dtb \ 140 | fsl-ls1043a-qds-lpuart.dtb \ 141 | fsl-ls1043a-rdb.dtb \ 142 | fsl-ls1012a-qds.dtb \ 143 | fsl-ls1012a-rdb.dtb \ 144 | fsl-ls1012a-frdm.dtb 145 | 146 | dtb-$(CONFIG_ARCH_SNAPDRAGON) += dragonboard410c.dtb 147 | 148 | dtb-$(CONFIG_MACH_SUN4I) += \ 149 | sun4i-a10-a1000.dtb \ 150 | sun4i-a10-ba10-tvbox.dtb \ 151 | sun4i-a10-chuwi-v7-cw0825.dtb \ 152 | sun4i-a10-cubieboard.dtb \ 153 | sun4i-a10-dserve-dsrv9703c.dtb \ 154 | sun4i-a10-gemei-g9.dtb \ 155 | sun4i-a10-hackberry.dtb \ 156 | sun4i-a10-hyundai-a7hd.dtb \ 157 | sun4i-a10-inet1.dtb \ 158 | sun4i-a10-inet-3f.dtb \ 159 | sun4i-a10-inet-3w.dtb \ 160 | sun4i-a10-inet97fv2.dtb \ 161 | sun4i-a10-inet9f-rev03.dtb \ 162 | sun4i-a10-itead-iteaduino-plus.dtb \ 163 | sun4i-a10-jesurun-q5.dtb \ 164 | sun4i-a10-marsboard.dtb \ 165 | sun4i-a10-mini-xplus.dtb \ 166 | sun4i-a10-mk802.dtb \ 167 | sun4i-a10-mk802ii.dtb \ 168 | sun4i-a10-olinuxino-lime.dtb \ 169 | sun4i-a10-pcduino.dtb \ 170 | sun4i-a10-pcduino2.dtb \ 171 | sun4i-a10-pov-protab2-ips9.dtb 172 | dtb-$(CONFIG_MACH_SUN5I) += \ 173 | sun5i-a10s-auxtek-t003.dtb \ 174 | sun5i-a10s-auxtek-t004.dtb \ 175 | sun5i-a10s-mk802.dtb \ 176 | sun5i-a10s-olinuxino-micro.dtb \ 177 | sun5i-a10s-r7-tv-dongle.dtb \ 178 | sun5i-a10s-wobo-i5.dtb \ 179 | sun5i-a13-ampe-a76.dtb \ 180 | sun5i-a13-difrnce-dit4350.dtb \ 181 | sun5i-a13-empire-electronix-d709.dtb \ 182 | sun5i-a13-hsg-h702.dtb \ 183 | sun5i-a13-inet-86vs.dtb \ 184 | sun5i-a13-inet-98v-rev2.dtb \ 185 | sun5i-a13-lichee.dtb\ 186 | sun5i-a13-olinuxino.dtb \ 187 | sun5i-a13-olinuxino-micro.dtb \ 188 | sun5i-a13-q8-tablet.dtb \ 189 | sun5i-a13-utoo-p66.dtb \ 190 | sun5i-r8-chip.dtb 191 | dtb-$(CONFIG_MACH_SUN6I) += \ 192 | sun6i-a31-app4-evb1.dtb \ 193 | sun6i-a31-colombus.dtb \ 194 | sun6i-a31-hummingbird.dtb \ 195 | sun6i-a31-i7.dtb \ 196 | sun6i-a31-m9.dtb \ 197 | sun6i-a31-mele-a1000g-quad.dtb \ 198 | sun6i-a31-mixtile-loftq.dtb \ 199 | sun6i-a31s-colorfly-e708-q1.dtb \ 200 | sun6i-a31s-cs908.dtb \ 201 | sun6i-a31s-primo81.dtb \ 202 | sun6i-a31s-sina31s.dtb \ 203 | sun6i-a31s-sinovoip-bpi-m2.dtb \ 204 | sun6i-a31s-yones-toptech-bs1078-v2.dtb 205 | dtb-$(CONFIG_MACH_SUN7I) += \ 206 | sun7i-a20-ainol-aw1.dtb \ 207 | sun7i-a20-bananapi.dtb \ 208 | sun7i-a20-bananapro.dtb \ 209 | sun7i-a20-cubieboard2.dtb \ 210 | sun7i-a20-cubietruck.dtb \ 211 | sun7i-a20-hummingbird.dtb \ 212 | sun7i-a20-i12-tvbox.dtb \ 213 | sun7i-a20-icnova-swac.dtb \ 214 | sun7i-a20-itead-ibox.dtb \ 215 | sun7i-a20-lamobo-r1.dtb \ 216 | sun7i-a20-m3.dtb \ 217 | sun7i-a20-m5.dtb \ 218 | sun7i-a20-mk808c.dtb \ 219 | sun7i-a20-olimex-som-evb.dtb \ 220 | sun7i-a20-olinuxino-lime.dtb \ 221 | sun7i-a20-olinuxino-lime2.dtb \ 222 | sun7i-a20-olinuxino-micro.dtb \ 223 | sun7i-a20-orangepi.dtb \ 224 | sun7i-a20-orangepi-mini.dtb \ 225 | sun7i-a20-pcduino3.dtb \ 226 | sun7i-a20-pcduino3-nano.dtb \ 227 | sun7i-a20-primo73.dtb \ 228 | sun7i-a20-wexler-tab7200.dtb \ 229 | sun7i-a20-wits-pro-a20-dkt.dtb \ 230 | sun7i-a20-yones-toptech-bd1078.dtb 231 | dtb-$(CONFIG_MACH_SUN8I_A23) += \ 232 | sun8i-a23-evb.dtb \ 233 | sun8i-a23-gt90h-v4.dtb \ 234 | sun8i-a23-inet86dz.dtb \ 235 | sun8i-a23-polaroid-mid2407pxe03.dtb \ 236 | sun8i-a23-polaroid-mid2809pxe04.dtb \ 237 | sun8i-a23-q8-tablet.dtb 238 | dtb-$(CONFIG_MACH_SUN8I_A33) += \ 239 | sun8i-a33-ga10h-v1.1.dtb \ 240 | sun8i-a33-q8-tablet.dtb \ 241 | sun8i-a33-sinlinx-sina33.dtb \ 242 | sun8i-r16-parrot.dtb 243 | dtb-$(CONFIG_MACH_SUN8I_A83T) += \ 244 | sun8i-a83t-allwinner-h8homlet-v2.dtb \ 245 | sun8i-a83t-cubietruck-plus.dtb \ 246 | sun8i-a83t-sinovoip-bpi-m3.dtb 247 | dtb-$(CONFIG_MACH_SUN8I_H3) += \ 248 | sun8i-h3-orangepi-2.dtb \ 249 | sun8i-h3-orangepi-lite.dtb \ 250 | sun8i-h3-orangepi-one.dtb \ 251 | sun8i-h3-orangepi-pc.dtb \ 252 | sun8i-h3-orangepi-pc-plus.dtb \ 253 | sun8i-h3-orangepi-plus.dtb 254 | dtb-$(CONFIG_MACH_SUN50I) += \ 255 | sun50i-a64-pine64-plus.dtb \ 256 | sun50i-a64-pine64.dtb 257 | dtb-$(CONFIG_MACH_SUN9I) += \ 258 | sun9i-a80-optimus.dtb \ 259 | sun9i-a80-cubieboard4.dtb 260 | 261 | dtb-$(CONFIG_VF610) += vf500-colibri.dtb \ 262 | vf610-colibri.dtb \ 263 | vf610-twr.dtb \ 264 | pcm052.dtb 265 | 266 | dtb-$(CONFIG_SOC_KEYSTONE) += k2hk-evm.dtb \ 267 | k2l-evm.dtb \ 268 | k2e-evm.dtb \ 269 | k2g-evm.dtb 270 | 271 | targets += $(dtb-y) 272 | 273 | # Add any required device tree compiler flags here 274 | DTC_FLAGS += 275 | 276 | PHONY += dtbs 277 | dtbs: $(addprefix $(obj)/, $(dtb-y)) 278 | @: 279 | 280 | clean-files := *.dtb 281 | -------------------------------------------------------------------------------- /ConfigFiles/sun5i-a13-lichee.dts: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012 Maxime Ripard 3 | * 4 | * Maxime Ripard 5 | * 6 | * This file is dual-licensed: you can use it either under the terms 7 | * of the GPL or the X11 license, at your option. Note that this dual 8 | * licensing only applies to this file, and not this project as a 9 | * whole. 10 | * 11 | * a) This file is free software; you can redistribute it and/or 12 | * modify it under the terms of the GNU General Public License as 13 | * published by the Free Software Foundation; either version 2 of the 14 | * License, or (at your option) any later version. 15 | * 16 | * This file is distributed in the hope that it will be useful, 17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 | * GNU General Public License for more details. 20 | * 21 | * Or, alternatively, 22 | * 23 | * b) Permission is hereby granted, free of charge, to any person 24 | * obtaining a copy of this software and associated documentation 25 | * files (the "Software"), to deal in the Software without 26 | * restriction, including without limitation the rights to use, 27 | * copy, modify, merge, publish, distribute, sublicense, and/or 28 | * sell copies of the Software, and to permit persons to whom the 29 | * Software is furnished to do so, subject to the following 30 | * conditions: 31 | * 32 | * The above copyright notice and this permission notice shall be 33 | * included in all copies or substantial portions of the Software. 34 | * 35 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 36 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 37 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 38 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 39 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 40 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 41 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 42 | * OTHER DEALINGS IN THE SOFTWARE. 43 | */ 44 | 45 | /dts-v1/; 46 | #include "sun5i-a13.dtsi" 47 | #include "sunxi-common-regulators.dtsi" 48 | 49 | #include 50 | #include 51 | #include 52 | 53 | / { 54 | model = "Lichee A13"; 55 | compatible = "lichee,a13-lichee", "allwinner,sun5i-a13"; 56 | 57 | aliases { 58 | serial0 = &uart1; 59 | }; 60 | 61 | chosen { 62 | stdout-path = "serial0:115200n8"; 63 | }; 64 | 65 | leds { 66 | compatible = "gpio-leds"; 67 | pinctrl-names = "default"; 68 | pinctrl-0 = <&led_pins_lichee>; 69 | 70 | red { 71 | label ="lichee:red:usr"; 72 | gpios = <&pio 2 5 GPIO_ACTIVE_LOW>; 73 | default-state = "off"; 74 | }; 75 | green { 76 | label ="lichee:green:usr"; 77 | gpios = <&pio 2 4 GPIO_ACTIVE_LOW>; 78 | default-state = "off"; 79 | }; 80 | blue { 81 | label ="lichee:blue:usr"; 82 | gpios = <&pio 2 19 GPIO_ACTIVE_LOW>; 83 | default-state = "off"; 84 | }; 85 | }; 86 | }; 87 | 88 | &ehci0 { 89 | status = "okay"; 90 | }; 91 | 92 | &i2c0 { 93 | pinctrl-names = "default"; 94 | pinctrl-0 = <&i2c0_pins_a>; 95 | status = "okay"; 96 | 97 | axp209: pmic@34 { 98 | compatible = "x-powers,axp209"; 99 | reg = <0x34>; 100 | interrupts = <0>; 101 | 102 | interrupt-controller; 103 | #interrupt-cells = <1>; 104 | }; 105 | }; 106 | 107 | &i2c1 { 108 | pinctrl-names = "default"; 109 | pinctrl-0 = <&i2c1_pins_a>; 110 | status = "okay"; 111 | }; 112 | 113 | &i2c2 { 114 | pinctrl-names = "default"; 115 | pinctrl-0 = <&i2c2_pins_a>; 116 | status = "okay"; 117 | }; 118 | 119 | &lradc { 120 | vref-supply = <®_vcc3v0>; 121 | status = "okay"; 122 | 123 | button@987 { 124 | label = "Home"; 125 | linux,code = ; 126 | channel = <0>; 127 | voltage = <987387>; 128 | }; 129 | }; 130 | 131 | &mmc0 { 132 | pinctrl-names = "default"; 133 | pinctrl-0 = <&mmc0_pins_a>; 134 | vmmc-supply = <®_vcc3v3>; 135 | bus-width = <4>; 136 | status = "okay"; 137 | }; 138 | 139 | &ohci0 { 140 | status = "okay"; 141 | }; 142 | 143 | &otg_sram { 144 | status = "okay"; 145 | }; 146 | 147 | &pio { 148 | led_pins_lichee: led_pins@0 { 149 | allwinner,pins = "PC4","PC5","PC19"; 150 | allwinner,function = "gpio_out"; 151 | allwinner,drive = ; 152 | allwinner,pull = ; 153 | }; 154 | 155 | usb0_id_detect_pin: usb0_id_detect_pin@0 { 156 | allwinner,pins = "PG2"; 157 | allwinner,function = "gpio_in"; 158 | allwinner,drive = ; 159 | allwinner,pull = ; 160 | }; 161 | 162 | usb0_vbus_detect_pin: usb0_vbus_detect_pin@0 { 163 | allwinner,pins = "PG1"; 164 | allwinner,function = "gpio_in"; 165 | allwinner,drive = ; 166 | allwinner,pull = ; 167 | }; 168 | 169 | }; 170 | 171 | ®_usb0_vbus { 172 | status = "okay"; 173 | gpio = <&pio 6 0 GPIO_ACTIVE_HIGH>; /* PG12 */ 174 | }; 175 | 176 | &uart1 { 177 | pinctrl-names = "default"; 178 | pinctrl-0 = <&uart1_pins_b>; 179 | status = "okay"; 180 | }; 181 | 182 | &usb_otg { 183 | dr_mode = "otg"; 184 | status = "okay"; 185 | }; 186 | 187 | &usb0_vbus_pin_a { 188 | allwinner,pins = "PG0"; 189 | }; 190 | 191 | &usbphy { 192 | pinctrl-names = "default"; 193 | pinctrl-0 = <&usb0_id_detect_pin>, <&usb0_vbus_detect_pin>; 194 | usb0_id_det-gpio = <&pio 6 2 GPIO_ACTIVE_HIGH>; /* PG2 */ 195 | usb0_vbus_det-gpio = <&pio 6 1 GPIO_ACTIVE_HIGH>; /* PG1 */ 196 | usb0_vbus-supply = <®_usb0_vbus>; 197 | usb1_vbus-supply = <®_usb1_vbus>; 198 | status = "okay"; 199 | }; 200 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 荔枝板 DIY活动 2 | 3 |   荔枝板 是一款 从零开始DIY的 简易、低价、实用的 linux/android 开发板, 4 | 5 |   DIY过程会 把底层的硬件设计直到上层的应用设计按照实际开发过程串联起来, 6 | 7 |   整个连载帖是类似一个路线图意义的文档,可以让开发者了解自己所处的位置。 8 | 9 |   最终的荔枝板性能会略强于树莓派1代,也足够应用于一些简单的消费电子产品 或者 读者朋友 自己的DIY作品中。 10 |    11 |   希望参与到github文档编辑的朋友可以先阅读**“连载帖”目录下的2.1.0,github使用指南**。 12 | 13 | 14 | 在整个连载过程中,为了让大家更好地参与到设计过程来学习交流,会在以下平台进行交流和资源共享,大家可以把它们加入收藏夹 15 | 16 |   阿莫电子论坛www.amobbs.com 连载帖形式,标题格式为:39元 荔枝板 DIY连载 x.x.x_xxxx 17 | 18 |   ilichee.cc 爱荔枝,wiki形式(万网刚买的域名,要过两天才能通过生效) 19 | 20 |   github https://github.com/Zepan/ilichee 21 | 22 |    **荔枝板DIY交流群:573832310** (上车口令:爱荔枝) 23 |   荔枝派于2016/8/11晚19:30正式上线聚丰众筹啦!请猛击: **http://z.elecfans.com/70.html** 24 | 25 | 26 | 欢迎大家积极参与到DIY过程,可以对设计提出建议,或者在自己擅长的地方补充文档,贡献较大的可以有优惠。 27 | 28 | 29 | 本活动作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 30 | -------------------------------------------------------------------------------- /教程文档/.gitignore: -------------------------------------------------------------------------------- 1 | # JetBrains Webstorm Config Files 2 | .idea/ 3 | 4 | # Byte-compiled / optimized / DLL files 5 | __pycache__/ 6 | *.py[cod] 7 | *$py.class 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | env/ 15 | build/ 16 | _build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | *.egg-info/ 28 | .installed.cfg 29 | *.egg 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *,cover 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | 58 | # Sphinx documentation 59 | _build/ 60 | build/ 61 | 62 | # PyBuilder 63 | target/ 64 | 65 | # vscode 66 | .vscode/ 67 | 68 | # OS X 69 | .DS_Store 70 | -------------------------------------------------------------------------------- /教程文档/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SPHINXPROJ = licheePi 8 | SOURCEDIR = . 9 | BUILDDIR = _build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /教程文档/README.md: -------------------------------------------------------------------------------- 1 | 请前往 http://licheeone.readthedocs.io 阅读详细内容。 2 | -------------------------------------------------------------------------------- /教程文档/_static/web/contact.css: -------------------------------------------------------------------------------- 1 | .keyreply-brand, 2 | .keyreply-chat-icon, 3 | .keyreply-button, 4 | .keyreply-label { 5 | font-family: 'Avenir Next', Avenir, 'Helvetica Neue', Lato, 'Segoe UI', Helvetica, Arial, sans-serif; 6 | } 7 | 8 | #keyreply-container { 9 | position: fixed; 10 | z-index: 10000; 11 | right: 0; 12 | bottom: 0; 13 | } 14 | 15 | .keyreply-launcher, 16 | .keyreply-chat-icon { 17 | float: left; 18 | cursor: pointer; 19 | position: absolute; 20 | width: 60px; 21 | height: 60px; 22 | right: 100px; 23 | bottom: 20px; 24 | border-radius: 25px; 25 | box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05), 0 15px 30px -10px rgba(0, 0, 0, 0.3); 26 | } 27 | 28 | .keyreply-chat-icon { 29 | -webkit-transition: width 0.25s, height 0.25s; 30 | transition: width 0.25s, height 0.25s; 31 | display: none; 32 | opacity: 0; 33 | filter: alpha(opacity=0); 34 | } 35 | 36 | .keyreply-button { 37 | color: white; 38 | border: 2px solid white; 39 | text-decoration: none; 40 | font-weight: 500; 41 | cursor: pointer; 42 | display: block; 43 | padding: 3px 6px; 44 | padding: 0.2rem 0.4rem; 45 | text-align: center; 46 | } 47 | 48 | .keyreply-chat-icon img { 49 | height: 60px; 50 | width: 60px; 51 | display: inline-block; 52 | } 53 | 54 | .keyreply-chat-icon.keyreply-panel { 55 | position: fixed; 56 | width: 280px; 57 | height: 280px; 58 | right: 50% !important; 59 | top: 50% !important; 60 | margin-right: -140px; 61 | margin-top: -140px; 62 | z-index: 11; 63 | } 64 | 65 | #keyreply-container.left .keyreply-chat-icon.keyreply-panel { 66 | left: auto; 67 | } 68 | 69 | .keyreply-chat-icon:not(.keyreply-panel):hover { 70 | width: 165px; 71 | z-index: 12; 72 | } 73 | 74 | .keyreply-qr { 75 | height: 200px; 76 | width: 200px; 77 | position: absolute; 78 | top: 0; 79 | left: 0; 80 | opacity: 1; 81 | filter: alpha(opacity=100); 82 | margin: 40px; 83 | border-radius: 5px; 84 | visibility: visible; 85 | background-size: contain; 86 | -webkit-transition: visibility 0s linear 0.2s, opacity 0.2s linear 0.2s; 87 | transition: visibility 0s linear 0.2s, opacity 0.2s linear 0.2s; 88 | } 89 | 90 | .keyreply-chat-icon:not(.keyreply-panel) .keyreply-qr { 91 | visibility: hidden; 92 | opacity: 0; 93 | filter: alpha(opacity=0); 94 | } 95 | 96 | .keyreply-launcher.keyreply-launcher-active .keyreply-brand { 97 | visibility: visible; 98 | opacity: 1; 99 | filter: alpha(opacity=100); 100 | } 101 | 102 | .keyreply-brand { 103 | text-decoration: none; 104 | position: absolute; 105 | visibility: hidden; 106 | font-weight: 500; 107 | font-size: 11px; 108 | bottom: -24px; 109 | opacity: 0; 110 | filter: alpha(opacity=0); 111 | border: 0; 112 | right: 0px; 113 | width: 90px; 114 | text-align: right; 115 | -webkit-transition: visibility 0s, opacity 0.5s linear 3s; 116 | transition: visibility 0s, opacity 0.5s linear 3s; 117 | } 118 | 119 | .keyreply-label { 120 | opacity: 0; 121 | filter: alpha(opacity=0); 122 | color: white; 123 | margin-top: 10px; 124 | /*margin-left: -4px;*/ 125 | left: 60px; 126 | line-height: 38px; 127 | font-size: 22px; 128 | font-weight: 400; 129 | position: absolute; 130 | display: inline-block; 131 | -webkit-touch-callout: none; 132 | -webkit-user-select: none; 133 | -khtml-user-select: none; 134 | -moz-user-select: none; 135 | -ms-user-select: none; 136 | user-select: none; 137 | -webkit-transition: opacity 0.4s; 138 | transition: opacity 0.4s; 139 | } 140 | 141 | .keyreply-chat-icon:hover>.keyreply-label { 142 | opacity: 1; 143 | filter: alpha(opacity=100); 144 | } 145 | 146 | .keyreply-chat-icon.keyreply-panel>.keyreply-label { 147 | opacity: 1; 148 | filter: alpha(opacity=100); 149 | } 150 | 151 | .keyreply-overlay-chat-icon { 152 | display: inline-block; 153 | width: 100px; 154 | height: 100px; 155 | margin: 24px; 156 | border-radius: 16px; 157 | } 158 | 159 | 160 | /* Media Query */ 161 | 162 | 163 | /* Click Effects */ 164 | 165 | .keyreply-launcher { 166 | transition: color 0.7s; 167 | -webkit-transition: color 0.7s; 168 | -webkit-tap-highlight-color: rgba(0, 0, 0, 0); 169 | background-size: contain; 170 | } 171 | 172 | .keyreply-effect:before { 173 | position: absolute; 174 | top: 50%; 175 | left: 50%; 176 | margin: -50px 0 0 -50px; 177 | width: 100px; 178 | height: 100px; 179 | border-radius: 50%; 180 | content: ''; 181 | opacity: 0; 182 | filter: alpha(opacity=0); 183 | pointer-events: none; 184 | } 185 | 186 | .keyreply-effect:before, 187 | .keyreply-effect:after { 188 | box-shadow: 0 0 0 2px rgba(111, 148, 182, 0.6); 189 | } 190 | 191 | .keyreply-effect.keyreply-show-effect:before { 192 | -webkit-animation: keyreply-effect-1 0.5s forwards; 193 | animation: keyreply-effect-1 0.5s forwards; 194 | } 195 | 196 | .keyreply-effect.keyreply-show-effect:after { 197 | -webkit-animation: keyreply-effect-2 0.5s forwards; 198 | animation: keyreply-effect-2 0.5s forwards; 199 | } 200 | 201 | @-webkit-keyframes keyreply-effect-1 { 202 | 0% { 203 | opacity: 1; 204 | filter: alpha(opacity=100); 205 | -webkit-transform: scale3d(0.5, 0.5, 1); 206 | transform: scale3d(0.5, 0.5, 1); 207 | } 208 | 100% { 209 | opacity: 0; 210 | filter: alpha(opacity=0); 211 | -webkit-transform: scale3d(1.1, 1.1, 1); 212 | transform: scale3d(1.1, 1.1, 1); 213 | } 214 | } 215 | 216 | @keyframes keyreply-effect-1 { 217 | 0% { 218 | opacity: 1; 219 | filter: alpha(opacity=100); 220 | -webkit-transform: scale3d(0.5, 0.5, 1); 221 | transform: scale3d(0.5, 0.5, 1); 222 | } 223 | 100% { 224 | opacity: 0; 225 | filter: alpha(opacity=0); 226 | -webkit-transform: scale3d(1.1, 1.1, 1); 227 | transform: scale3d(1.1, 1.1, 1); 228 | } 229 | } 230 | 231 | @-webkit-keyframes keyreply-effect-2 { 232 | 0% { 233 | opacity: 1; 234 | filter: alpha(opacity=100); 235 | -webkit-transform: scale3d(0.5, 0.5, 1); 236 | transform: scale3d(0.5, 0.5, 1); 237 | } 238 | 50%, 239 | 100% { 240 | opacity: 0; 241 | filter: alpha(opacity=0); 242 | -webkit-transform: scale3d(1.2, 1.2, 1); 243 | transform: scale3d(1.2, 1.2, 1); 244 | } 245 | } 246 | 247 | @keyframes keyreply-effect-2 { 248 | 0% { 249 | opacity: 1; 250 | filter: alpha(opacity=100); 251 | -webkit-transform: scale3d(0.5, 0.5, 1); 252 | transform: scale3d(0.5, 0.5, 1); 253 | } 254 | 50%, 255 | 100% { 256 | opacity: 0; 257 | filter: alpha(opacity=0); 258 | -webkit-transform: scale3d(1.2, 1.2, 1); 259 | transform: scale3d(1.2, 1.2, 1); 260 | } 261 | } -------------------------------------------------------------------------------- /教程文档/_static/图标/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/图标/icon.png -------------------------------------------------------------------------------- /教程文档/_static/图标/icon2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/图标/icon2.png -------------------------------------------------------------------------------- /教程文档/_static/概览/1.contents.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/1.contents.jpg -------------------------------------------------------------------------------- /教程文档/_static/概览/2.list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/2.list.png -------------------------------------------------------------------------------- /教程文档/_static/概览/3.list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/3.list.png -------------------------------------------------------------------------------- /教程文档/_static/概览/4.list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/4.list.png -------------------------------------------------------------------------------- /教程文档/_static/概览/5.guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/5.guide.png -------------------------------------------------------------------------------- /教程文档/_static/概览/6.guide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/6.guide.png -------------------------------------------------------------------------------- /教程文档/_static/概览/7.guide.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/概览/7.guide.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.1_1.png -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.1_2.png -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.1_3.png -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.1_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.1_4.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.2_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.2_1.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.2_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.2_2.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.2_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.2_3.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.1.2_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.1.2_4.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/1.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/1.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/10.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/10.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/2.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/2.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/3.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/3.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/4.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/4.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/5.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/5.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/6.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/6.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/7.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/7.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/8.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/8.power.jpg -------------------------------------------------------------------------------- /教程文档/_static/硬件/9.power.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/教程文档/_static/硬件/9.power.jpg -------------------------------------------------------------------------------- /教程文档/_templates/footer.html: -------------------------------------------------------------------------------- 1 | {% extends "!footer.html" %} {% block extrafooter %} 2 | 3 | 4 | 5 | 12 | 13 | 42 | 43 | 44 |
45 | 57 | 58 |
59 | 60 | 61 | {{ super() }} {% endblock %} -------------------------------------------------------------------------------- /教程文档/camdroid/contents.rst: -------------------------------------------------------------------------------- 1 | Zero Linux系统适配过程记录 2 | ============================ 3 | 4 | .. toctree:: 5 | 6 | camdriod 编译过程走读 -------------------------------------------------------------------------------- /教程文档/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # lichee Pi 荔枝派全流程解读 documentation build configuration file, created by 4 | # sphinx-quickstart on Sun Feb 4 23:06:11 2018. 5 | # 6 | # This file is execfile()d with the current directory set to its 7 | # containing dir. 8 | # 9 | # Note that not all possible configuration values are present in this 10 | # autogenerated file. 11 | # 12 | # All configuration values have a default; values that are commented out 13 | # serve to show the default. 14 | 15 | # If extensions (or modules to document with autodoc) are in another directory, 16 | # add these directories to sys.path here. If the directory is relative to the 17 | # documentation root, use os.path.abspath to make it absolute, like shown here. 18 | # 19 | import os 20 | import sys 21 | sys.path.insert(0, os.path.abspath('.')) 22 | 23 | 24 | # -- General configuration ------------------------------------------------ 25 | 26 | # If your documentation needs a minimal Sphinx version, state it here. 27 | # 28 | # needs_sphinx = '1.0' 29 | 30 | # Add any Sphinx extension module names here, as strings. They can be 31 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 32 | # ones. 33 | extensions = [ 34 | 'sphinx.ext.autodoc', 35 | 'sphinx.ext.napoleon', 36 | 'sphinx.ext.mathjax', 37 | ] 38 | 39 | # Add any paths that contain templates here, relative to this directory. 40 | templates_path = ['_templates'] 41 | 42 | # The suffix(es) of source filenames. 43 | # You can specify multiple suffix as a list of string: 44 | # 45 | source_suffix = ['.rst', '.md'] 46 | # source_suffix = '.rst' 47 | 48 | # The master toctree document. 49 | master_doc = 'index' 50 | 51 | # General information about the project. 52 | project = u'lichee Pi 荔枝派全流程解读' 53 | copyright = u'2018, Lichee' 54 | author = u'Lichee' 55 | 56 | # The version info for the project you're documenting, acts as replacement for 57 | # |version| and |release|, also used in various other places throughout the 58 | # built documents. 59 | # 60 | # The short X.Y version. 61 | version = u'1.0' 62 | # The full version, including alpha/beta/rc tags. 63 | release = u'1.0' 64 | 65 | # The language for content autogenerated by Sphinx. Refer to documentation 66 | # for a list of supported languages. 67 | # 68 | # This is also used if you do content translation via gettext catalogs. 69 | # Usually you set "language" from the command line for these cases. 70 | language = None 71 | 72 | # List of patterns, relative to source directory, that match files and 73 | # directories to ignore when looking for source files. 74 | # This patterns also effect to html_static_path and html_extra_path 75 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store', '.vscode'] 76 | 77 | # The name of the Pygments (syntax highlighting) style to use. 78 | pygments_style = 'sphinx' 79 | 80 | # If true, `todo` and `todoList` produce output, else they produce nothing. 81 | todo_include_todos = False 82 | 83 | 84 | # -- Options for HTML output ---------------------------------------------- 85 | 86 | # The theme to use for HTML and HTML Help pages. See the documentation for 87 | # a list of builtin themes. 88 | # 89 | import sphinx_rtd_theme 90 | html_theme = 'sphinx_rtd_theme' 91 | html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] 92 | 93 | # Theme options are theme-specific and customize the look and feel of a theme 94 | # further. For a list of options available for each theme, see the 95 | # documentation. 96 | # 97 | # html_theme_options = {} 98 | 99 | # Add any paths that contain custom static files (such as style sheets) here, 100 | # relative to this directory. They are copied after the builtin static files, 101 | # so a file named "default.css" will overwrite the builtin "default.css". 102 | html_static_path = ['_static'] 103 | 104 | # Custom sidebar templates, must be a dictionary that maps document names 105 | # to template names. 106 | # 107 | # This is required for the alabaster theme 108 | # refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars 109 | html_sidebars = { 110 | '**': [ 111 | 'relations.html', # needs 'show_related': True theme option to display 112 | 'searchbox.html', 113 | ] 114 | } 115 | 116 | # show the link to 'view page source' 117 | html_show_sourcelink = False 118 | 119 | # web favicon 120 | html_favicon = u'_static/图标/icon.png' 121 | 122 | # The name of an image file (relative to this directory) to place at the top 123 | # of the sidebar. 124 | html_logo = u'_static/图标/icon2.png' 125 | 126 | # -- Options for HTMLHelp output ------------------------------------------ 127 | 128 | # Output file base name for HTML help builder. 129 | htmlhelp_basename = 'licheePidoc' 130 | 131 | 132 | # -- Options for LaTeX output --------------------------------------------- 133 | 134 | latex_elements = { 135 | # The paper size ('letterpaper' or 'a4paper'). 136 | # 137 | # 'papersize': 'letterpaper', 138 | 139 | # The font size ('10pt', '11pt' or '12pt'). 140 | # 141 | # 'pointsize': '10pt', 142 | 143 | # Additional stuff for the LaTeX preamble. 144 | # 145 | # 'preamble': '', 146 | 147 | # Latex figure (float) alignment 148 | # 149 | # 'figure_align': 'htbp', 150 | 'preamble': r''' 151 | \hypersetup{unicode=true} 152 | \usepackage{CJKutf8} 153 | \DeclareUnicodeCharacter{00A0}{\nobreakspace} 154 | \DeclareUnicodeCharacter{2203}{\ensuremath{\exists}} 155 | \DeclareUnicodeCharacter{2200}{\ensuremath{\forall}} 156 | \DeclareUnicodeCharacter{2286}{\ensuremath{\subseteq}} 157 | \DeclareUnicodeCharacter{2713}{x} 158 | \DeclareUnicodeCharacter{27FA}{\ensuremath{\Longleftrightarrow}} 159 | \DeclareUnicodeCharacter{221A}{\ensuremath{\sqrt{}}} 160 | \DeclareUnicodeCharacter{221B}{\ensuremath{\sqrt[3]{}}} 161 | \DeclareUnicodeCharacter{2295}{\ensuremath{\oplus}} 162 | \DeclareUnicodeCharacter{2297}{\ensuremath{\otimes}} 163 | \begin{CJK}{UTF8}{gbsn} 164 | \AtEndDocument{\end{CJK}} ''', 165 | } 166 | 167 | # Grouping the document tree into LaTeX files. List of tuples 168 | # (source start file, target name, title, 169 | # author, documentclass [howto, manual, or own class]). 170 | latex_documents = [ 171 | (master_doc, 'licheePi.tex', u'lichee Pi 荔枝派全流程解读 Documentation', 172 | u'Lichee', 'manual'), 173 | ] 174 | 175 | 176 | # -- Options for manual page output --------------------------------------- 177 | 178 | # One entry per manual page. List of tuples 179 | # (source start file, name, description, authors, manual section). 180 | man_pages = [ 181 | (master_doc, 'licheepi', u'lichee Pi 荔枝派全流程解读 Documentation', 182 | [author], 1) 183 | ] 184 | 185 | 186 | # -- Options for Texinfo output ------------------------------------------- 187 | 188 | # Grouping the document tree into Texinfo files. List of tuples 189 | # (source start file, target name, title, author, 190 | # dir menu entry, description, category) 191 | texinfo_documents = [ 192 | (master_doc, 'licheePi', u'lichee Pi 荔枝派全流程解读 Documentation', 193 | author, 'licheePi', 'One line description of project.', 194 | 'Miscellaneous'), 195 | ] 196 | 197 | 198 | # added support for .md doc 199 | import recommonmark 200 | from recommonmark.parser import CommonMarkParser 201 | from recommonmark.transform import AutoStructify 202 | source_parsers = { 203 | '.md': 'recommonmark.parser.CommonMarkParser', 204 | } 205 | github_doc_root = 'https://github.com/rtfd/recommonmark/tree/master/doc/' 206 | 207 | 208 | def setup(app): 209 | app.add_config_value('recommonmark_config', { 210 | 'url_resolver': lambda url: github_doc_root + url, 211 | 'auto_toc_tree_section': 'Contents', 212 | 'enable_eval_rst': True, 213 | 'enable_auto_doc_ref': True, 214 | }, True) 215 | app.add_transform(AutoStructify) 216 | app.add_javascript('contact.js') 217 | app.add_stylesheet('contact.css') 218 | -------------------------------------------------------------------------------- /教程文档/index.rst: -------------------------------------------------------------------------------- 1 | Lichee Document 2 | =================== 3 | 4 | 荔枝派是一款开源的低成本Coretex-A8 评估板,可以供嵌入式工程师学习较为复杂的Cortex-A系列内核处理器的硬件设计,linux移植与开发,安卓移植与开发。 5 | 6 | 荔枝派一代软硬件及产测由作者一人在业余时间完成,本电子书将由作者与荔枝派众筹支持者公共编辑。 7 | 想加入荔枝派合作编辑的朋友请在合作编辑留言墙下留言,我会将你加入编辑队伍。 8 | 荔枝派二代计划由爱好者合作完成软硬件设计。 9 | 10 | **联系我们:** `Q群 `_ | 11 | `github `_ | 12 | `论坛 `_ | 13 | `淘宝 `_ | 14 | `邮箱 `_ | _____ **文档来源:** `看云 `_ 15 | 16 | .. image:: https://box.kancloud.cn/488a185c2d50f3f7447efb621d4d836e_2976x3968.jpg 17 | 18 | .. toctree:: 19 | :maxdepth: 2 20 | :caption: Lichee One: 21 | 22 | 荔枝派概览 <概览/contents> 23 | 硬件设计全解析 <硬件/contents> 24 | 生产测试全解析 <产测/contents> 25 | Linux系统适配全解析 26 | 安卓系统适配全解析 <安卓适配/contents> 27 | Zero Linux系统适配过程记录 28 | -------------------------------------------------------------------------------- /教程文档/linux适配/2.1.0 使用git进行项目管理.md: -------------------------------------------------------------------------------- 1 | # 使用git进行项目管理 2 | 3 | ------ 4 | 5 | - 一、git与github简介 6 | - 二、环境配置 7 | - 三、Git入门准备(以荔枝派库为例) 8 | - 四、git工作流程简介 9 | - 五、具体操作 10 | - 六、更多 11 | 12 | ------ 13 | 14 | ## **一、Git与Github简介** 15 | 16 | > \* Git是一种版本控制系统,是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。Git诞生于2005年,由Linux开源社区(特别是Linux的缔造者Linus Torvalds)开发。 17 | 18 | Git 的特点: 19 | - 支持离线开发,离线仓库(Repository) 20 | - 强大的分支功能,适合多个独立开发者协作 21 | - 速度块 22 | 23 | > \* Github是一个网站,给用户提供git服务。 这样你就不用自己部署git系统,直接用注册个账号,用他们提供的git服务就可以。所以只要到[www.github.com](https://www.github.com)申请一个github帐号,就可以免费使用git服务。 24 | 25 | Github将每一个项目称作一个`“仓库”(repository)`,在仓库里,你可以自由地添加、同步、删除文件,而且可以多人协作对一个仓库中的文件进行修改。横向上,github采用`工作流`的方式,你的本地仓库由git维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;最后是HEAD,它指向你最后一次提交的结果;纵向上,github采用主干-分支的流程控制方式,采用多分支实现单人多作和多人协作,可以方便地找回任何一个修改节点的记录。 26 | 本文主要介绍如何使用git进行合作项目管理,希望之前没有接触过`git`和`github`的朋友可以通过这篇介绍对如何使用git有一定的了解。 27 | 另外,我们使用命令行的git操作方式,所以没接触过的朋友需要先学会使用简单的命令行操作;如果需要像本文一样进行`Markdown`文本格式编辑,需要使用相应的Markdown格式;涉及到在`vim`编辑器中进行代码或文本的修改,需要了解一些vim相关的使用命令。这些我就不再一一叙述,如果还不会的可以自行查阅网上相关资料进行学习。下面正式发车: 28 | 29 | ## **二、环境配置** 30 | 31 | + 第一次接触git和github的朋友,需要先配置环境。首先,到[https://git-scm.com/download](https://git-scm.com/download),根据自己的操作系统选择下载对应的客户端(一般linux已经预安装)。下载后安装、打开,进入git(命令行界面)。 32 | ![图例2.1](http://i2.buimg.com/567571/5a9b2093b6256416.png) 33 | 34 | + 然后,我在自己电脑的E盘建立了一个专门用于git操作文件的文件夹,这个文件夹就相当于github的本地站点,比如我建了e盘的github/my_site文件夹。在命令行中,去到对应的文件夹: 35 | 36 | ```shell 37 | 姜朝峰@DESKTOP-J5JHQ29 MINGW64 ~ 38 | $ cd e:/github/my_site 39 | ``` 40 | 41 | 于是打开了根目录,输入ls命令,该目录下还没有文件: 42 | 43 | ```python 44 | 姜朝峰@DESKTOP-J5JHQ29 MINGW64 /e/github/my_site 45 | $ ls 46 | ``` 47 | 48 | ![图例2.2](http://i2.buimg.com/567571/cfd9b12487742ecf.jpg) 49 | 图例2.2 50 | 51 | + 接着,我们要建立本地库和github上对应代码库的连接,对应到群主的github代码库中,就需要进行下面的设置。在本地创建ssh key,建立和github服务器的连接: 52 | 53 | 54 | ```python 55 | $ ssh-keygen -t rsa -C "your_email@youremail.com" 56 | ``` 57 | 58 | 后面的your_email@youremail.com改为在github上注册的邮箱(如图),之后会要求确认路径和输入密码,我们默认一路回车就行。 59 |
![图例2.3](http://i2.buimg.com/567571/7f105b32fb6d597a.jpg) 60 | 图例2.3
61 | 62 | 成功的话会在“C:\Users\XXX”下生成.ssh文件夹,进去并打开id_rsa.pub,复制里面的key。 63 |
![图例2.4](http://i2.buimg.com/567571/9bb3fbf88a3d27e4.jpg) 64 | 图例2.4
65 | 66 | 回到浏览器打开github,进入Settings(配置),左边选择“SSH and GPG Keys”,点击“New SSH Key”,随便填一下title,粘贴生成的key。 67 | 68 |
![图例2.5](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/46401981.jpg) 69 | 图例2.5
70 | 71 | + 为了验证是否成功,在git bash下输入: 72 | + 73 | ```python 74 | $ ssh -T git@github.com 75 | ``` 76 | 77 | 如果出现下图所示的情况,这就表示已成功连上github。如果要多人协作对这个库进行修改,就需要把合作者的SSH KEY都添加到账户列表中。 78 |
![图例2.6](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/6612013.jpg) 79 | 图例2.6
80 | 81 | + 在我们能用git工作之前,我们需要还做个一次性的用户配置。为了git能跟踪到谁做了修改,我们需要设置用户名和账户。发送下面的命令,相应地替换掉其中的“your_username”和“your_email@server.com”,改成自己的信息: 82 | 83 | ```python 84 | git config --global user.name "your_username" 85 | git config --global user.email your_email@server.com 86 | ``` 87 | 88 | + 设置好之后,再输入初始化命令,就把当前目录作为git根目录,创建了一个本地仓库: 89 | 90 | ```shell 91 | git init 92 | ``` 93 | 94 |
![图例2.7](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/49964901.jpg) 95 | 图例2.7
96 | 97 | 最后出现“Initialized empty Git repository in E:/github/my_site/.git/”的指令,说明git的初始化配置成功。Git会在my_site文件夹内创建一个名为.git的隐藏文件夹,那就是你的本地代码仓库。 98 | 如果不进行初始设置,你就无法提交任何东西。设置好之后,下一次打开可以直接工作,不用再设置一次。不过要是换了电脑,那就需要再设置一遍。 99 | 100 | 我们希望为荔枝Pi的github项目库增加或修改内容,这就涉及到多人一起在github上的开发。一般有三种方法: 101 | 102 | > \* 第一种:把各位的公钥加到该项目的公钥列表里; 103 | > \* 第二种:在github建一个**orgnization**,然后建一个**team**,把大家加到team并把项目放到team下; 104 | > \* 第三种:就是你要修改的人**fork**,然后给群主发**pull request**,等群主通过。 105 | 106 | 第一种上面的环境配置中已经谈到,第二种可以自行到github了解,这里推荐第三种方式。 107 | 108 | + 到此,就完成了git的环境配置,可以开始具体的工作流程。 109 | 110 | ## **三、Git入门准备(以荔枝派为例)** 111 | 112 | **提醒**:下面有的操作要在命令行界面,有的要在浏览器中到github主页鼠标操作,注意切换。 113 | 114 | ### 1. 复制别人的代码库(fork) 115 | 116 | 如果想参与到对别人代码库内容的增加或修改中,可以先fork再pull request。**fork**就是**复制**别人这个项目代码库到自己帐号下;**pull request**后面会谈到。 117 | 比如群主A有一個代码库a(也就是荔枝派的github主页),用浏览器打开: 118 |
![图例3.1](http://i2.buimg.com/567571/f6116ed69b70d8eb.png) 119 | 图例3.1
120 | 121 | 你叫做B,看到这个觉得不错,所以就**fork**(点击图中右上角的fork图标)一個到自己的代码库中,现在暂且称为代码库b。这时,你查看自己的profile下面的就会多出了一个illichee的代码库。a和b的修改互不干预,大家可以随意修改自己的代码库b,群主的a不会受影响。另外,旁边的“Star”表示持续关注别人项目更新,“Watch”则是设置接收邮件提醒。 122 |
![图例3.2](https://raw.github.com/RubyLouvre/mass-Framework/master/course/4.jpg) 123 | 图例3.2
124 | 125 | ### 2. 复制远程代码库到本地(clone) 126 | 127 | 但现在,代码库b还是存放在github服务器上,你只能在浏览器中修改,不能本地修改。所以你想把这个远程代码库整个下载到自己的电脑上再修改的话,你需要**拷贝(clone)**它。发送(注意,此时要在根目录下): 128 | 129 | ```python 130 | git clone git@github.com:your_username/name_of_remote_repository.git 131 | ``` 132 | 133 | 得到如图: 134 | 135 |
![图例3.3](http://i2.buimg.com/567571/131e603c24c742ae.png) 136 | 图例3.3
137 | 138 | 果然在这台电脑本地库目录下多了一个“ilichee”的文件夹: 139 |
![图例3.4](http://i2.buimg.com/567571/440b2243df752932.png) 140 | 图例3.4
141 | 142 | 这样你就把代码库b都下载到本地了。以后,可以用相同的方法在不同的电脑上、由不同的人一起完成一个代码库。 143 | 另外,如果已经在本地的项目上工作了,只是想从远程代码库上取得它最新的版本,那我移动到项目的根目录下(注意,不在根目录下无法获取),并发送: 144 | 145 | ```python 146 | git pull first master 147 | ``` 148 | 149 | ### 3. 推送到远程代码库(push) 150 | 151 | 在第一次你想推送一个本地代码库到远程代码库时,你需要把它添加到你的项目配置里。像这样做: 152 | 153 | ```python 154 | git remote add origin https://your_username@bitbucket.org/your_username/name_of_remote_repository.git 155 | ``` 156 | 157 |
![图例3.5](http://i2.buimg.com/567571/7278dadf2225764f.png) 158 | 图例3.5
159 | 160 | 注意这里的“origin”只是一个习惯。它是你的远程代码库的别名,但是你可以用其他任何你喜欢的词。你甚至可以有多个远程代码库,你只需要给它们起不同的别名。 161 | 之后,推送你的本地代码库的主干分支到你的远程代码库: 162 | 163 | ```python 164 | git push origin master 165 | ``` 166 | 167 | 下图是对该库文件修改后提交并推送的示例: 168 |
![图例3.6](http://i2.buimg.com/567571/ae42b03c927abfa2.png) 169 | 图例3.6
170 | 171 | ### 4.同步代码库 172 | 173 | 假设按照上述的流程复制别人的代码库到自己的GitHub(fork),别人的代码库已经更新,自己复制的代码库有没有新代码可以提交,这时候就需要同步复制别人的源代码库。 174 | 进入clone到本地的代码库文件夹中,然后增加源分支地址到你项目远程分支列表中; 175 | 176 | ```python 177 | git remote add source https://github.com/originalL_owner/original_repo.git 178 | ``` 179 | 180 | 这里的source是自己给源仓库起的名字,可以起自己喜欢的。 181 | 182 | fetch源分支到本地 183 | 184 | ```python 185 | git fetch source 186 | ``` 187 | 188 | 然后,切换到本地 master 分支: 189 | 190 | ```python 191 | git checkout master 192 | ``` 193 | 194 | 合并两个版本的代码 195 | 196 | ```python 197 | git merge source/master 198 | ``` 199 | 200 | 把合并后的代码push到你的Github项目上去 201 | 202 | ```python 203 | git push origin master 204 | ``` 205 | 206 |
![图例4.1](http://i2.buimg.com/573139/d965b743e4217a3f.png) 207 | 图例4.1
208 | 这样 fork 源仓库、fork 仓库副本 和 local 仓库实现了同步更新 209 | 210 | ### 5. 推送请求(pull request) 211 | 212 | 假设就按照上述流程,初始clone代码库到本地主机上,B就可以尽情修改code(branch、commit、merge、push),每次 B push 更新,都只会更新自己的代码库b,并不会影响到到A的代码库a。 213 | 如果哪天B觉得自己新增加的内容很不錯,可以帮助到群主A,想跟A分享,那就可以发一个**pull request**,问问A要不要这一份。 214 | 下面我用两个帐号模拟fork和pull request: 215 | 我用帐号B fork了A的一个代码库a,成为了自己的代码库b,修改提交之后,然后想把改动增加到库a里,于是点击“Create pull request”: 216 |
![图例3.7](http://i1.buimg.com/567571/602794dc1adce90b.png) 217 | 图例2.7
218 | 219 | A帐号马上收到了邮件通知,当然github主页也有timeline消息通知。 220 |
![图例3.8](http://i1.buimg.com/567571/950f871ec606979b.png) 221 | 图例3.8
222 | 223 | A收到这则pull request之后,如果覺得ok,用线上merge,就會將代码库b合并到代码库a上。 224 |
![图例3.9](http://i4.buimg.com/567571/78f4a14665338bef.png) 225 | 图例3.9
226 | 227 | ## **四、Git工作流程简介** 228 | 229 | - [x] 建立目录 230 | - [x] 加载文件(stage) 231 | - [x] 提交文件(commit) 232 | - [x] 创建分支(branch) 233 | - [x] 合并分支(merge) 234 | - [x] 丢弃分支 235 | - [x] 删除分支(delete) 236 | - [x] 回滚到之前的提交状态(back) 237 | - [x] 复制和推送请求(fork/pull request) 238 | - [x] 推送到远程代码库(push) 239 | - [x] 取得远程代码库的拷贝(pull) 240 | - [x] 更多······ 241 | 242 | 首先,你需要去github上将别人的代码库**`复制`**到自己的库中,也可以先在自己的电脑上**`建立目录`**,相当于自己的个人站点,对应着github服务器上的站点。接下来,你可以在这个目录下进行创建新文件、修改文件等等操作,修改完之后,就需要**`加载文件`**,也就是把修改过的文件正式放进自己的项目里。而**`提交文件`**则是把文件上传到github服务器,进行文件同步。接着,我想加入新的代码进行测试,那么就可以**`创建分支`**。建立分支是你创建代码的独立版本的动作,独立于你的主干分支,相当于进入了另外一条“时间河流”。默认情况下,每次你提交到Git的文件都会被储存到主干分支。满意的话将新分支和主干**`合并分支`**,不满意的话“时光倒流”回到主干,并**`删除分支`**。如果发现新增的改动有问题,可以**`回滚到之前的提交状态`**。终于,本地的修改结束,想要上传到github,就可以**`推送到远程代码库`**;相反,如果想把github仓库里的文件下载到本地,可以**`取得远程代码库的拷贝`**。 243 | 244 | ## **五、具体操作** 245 | 246 | 下面,我们以windows上的操作步骤为例进行示范(linux类似)。 247 | 248 | ### 1. 加载文件 249 | 250 | 我用vim指令创建并保存了text1.txt和markd.md两个文本文件,但它们还没有放入中。现在加载(stage)所有项目文件仓库(repository),输入: 251 | 252 | ```python 253 | git add . 254 | ``` 255 | 256 | 最后的“.”符号的意思是“所有文件、文件夹和子文件夹”。 257 |
![图例2.1](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/38985471.jpg) 258 | 图例2.1
259 | 260 | 假如我们只想要把特定文件添加到源代码控制中去,我们可以指定要添加的文件。比如,我用vim创建了两个markdown文件------README1.md、README2.md,发送: 261 | 262 | ```python 263 | git add README1.md, README2.md 264 | ``` 265 | 266 |
![图例2.2](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/42005549.jpg) 267 | 图例2.2
268 | 269 | ### 2. 提交文件 270 | 271 | 现在,我们想要提交已加载(staged)的文件。提交文件时,我们需要给这个状态一个备注,所以我们提交我们的文件时,总是附带着有意义的注释,描述了它们现在的状态。比如用“first commit”来作为第一个提交的注释,如下: 272 | 273 | ```python 274 | git commit -m "first commit" 275 | ``` 276 | 277 |
![图例2.3](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/37236592.jpg) 278 | 图例2.3
279 | 280 | 但发现至提交了3个文件,检查可知我把其中一个文件README2.md打成了README2.MD,修改后重复上面的操作即可。 281 | 这样我们就用“first commit”代表这个时间点提交的修改,后面还可以再回滚到这个提交状态。 282 | 提交之后,如果你想查看现在已加载、未加载的文件及状态,可以用以下命令: 283 | 284 | ```python 285 | git status 286 | ``` 287 | 288 |
![图例2.4](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/10794292.jpg) 289 | 图例2.4
290 | 291 | ### 3. 创建分支 292 | 293 | 如果要写或者测试新的部分,还不想直接加入到程序中时,就可以创建分支,就像暂时踏入另一条时间的河流一样。建立分支是你创建代码的独立版本,独立于你的主干分支。默认情况下,每次你提交到Git的文件都会被储存到“master(主干)”分支。 294 | 创建并同时切换到你新建的分支,发送: 295 | 296 | ```python 297 | git checkout -b new_feature 298 | ``` 299 | 300 |
![图例2.5](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/37239574.jpg) 301 | 图例2.5
302 | 303 | 或者,你可以先创建一个分支然后手动切换,输入命令: 304 | 305 | ```python 306 | git branch new_featuregit checkout new_feature 307 | ``` 308 | 309 | 要看你现在项目下所有的分支,输入如下指令: 310 | 311 | ```python 312 | git branch 313 | ``` 314 | 315 |
![图例2.6](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/54073796.jpg) 316 | 图例2.6
317 | 318 | 现在你可以在你的项目上无所顾忌地做任何你想做的:任何时候,你都可以回到你创建分支前的状态。你同时可以有多个分支,甚至可以从一个分支上再创建一个分支。 319 | 320 | ### 4. 合并分支 321 | 322 | 现在我在新的分支new_feature做一些修改,比如删除了README2.md。 323 |
![图例2.7](http://ww3.sinaimg.cn/large/74311666jw1f732uvb6o4j20cg06fwgj.jpg) 324 | 图例2.7
325 | 326 | 在这个分支上修改得差不多的时候,如果想要把这个分支加回到主干(master)上,首先需要加载(stage)并且提交(commit)你的文件: 327 | 328 | ```python 329 | git add .git commit -m "third commit" 330 | ``` 331 | 332 | 然后你移到主干分支: 333 | 334 | ```python 335 | git checkout master 336 | ``` 337 | 338 | 最后像这样合并: 339 | 340 | ```python 341 | git merge new_feature 342 | ``` 343 | 344 |
![图例2.8](http://ww3.sinaimg.cn/large/74311666jw1f732uvb6o4j20cg06fwgj.jpg) 345 | 图例2.8
346 | 347 | 此时,主干分支就和新功能分支会变成一样的了。 348 | 349 | ### 5. 丢弃分支 350 | 351 | 相反,如果你打算丢弃你在分支里做的修改,你首先需要加载你的文件并且在分支里提交: 352 | 353 | ```python 354 | git add .git commit -m "feature to be discarded" 355 | ``` 356 | 357 | 然后,你移到主干分支: 358 | 359 | ```python 360 | git checkout master 361 | ``` 362 | 363 |
![图例2.9](http://i4.buimg.com/567571/44f97ee4131ae283.png) 364 | 图例2.9
365 | 366 | 现在,你的代码处于你创建分支之前的状态了。 367 | 368 | ### 6. 删除分支 369 | 370 | 如果你要把你的分支合并到主干分支,从主干(master)分支上发送: 371 | 372 | ```python 373 | git branch -d new_feature 374 | ``` 375 | 376 |
![图例2.10](http://i4.buimg.com/567571/c5d13b847ae0bd22.png) 377 | 图例2.10
378 | 379 | 发现"new_feature"这个分支确实被删除了。 380 | 假如修改已经合并了,它只会删除分支。假如分支没有合并,你会得到一个错误信息。删除一个未合并的分支(通常你不想保留的修改),你需要发送一样的命令附带一个大写D。意思是“强制删除分支,无论如何我不想要它了”。 381 | 382 | ```python 383 | git branch -D new_feature 384 | ``` 385 | 386 | ### 7. 回滚到之前的提交状态 387 | 388 | 在某些时候,你可能想要回到之前的代码版本。首先,你需要找到你想回到哪个版本。要看所有的完成了的提交,发送: 389 | 390 | ```python 391 | git log 392 | ``` 393 | 394 |
![图例2.11](http://i2.buimg.com/567571/61f7c94d879a7f89.png) 395 | 图例2.11
396 | 397 | 这会输出你的提交的历史记录。 398 | 399 | 如果你想回到“second commit”这个提交,简单地用提交的ID做签出(checkout)(可以只用到ID开头的9个字符) 400 | 401 | ```python 402 | git checkout cc87a2d42 403 | ``` 404 | 405 |
![图例2.12](http://i2.buimg.com/567571/d94a33cde2ab47dc.png) 406 | 图例2.12
407 | 408 | 你也可以签出到一个新的分支,像这样: 409 | 410 | ```python 411 | git checkout -b my_previous_version cc87a2d42 412 | ``` 413 | 414 | 但是,要注意保持分支的清晰,太多的分支会导致整个仓库的混乱,让整个项目失去控制。 415 | 416 | ## **六、更多** 417 | 418 | + 如果对命令行的git使用方式很不适应,还可以下载git的**GUI版本**,比如GitHub Desktop和Gitbox(见网站https://git-scm.com/downloads/guis),GUI版本的git确实要比命令行更直观更容易入门。 419 | + 当然,还有比这些更多的**Git**的相关知识,本文也是我参考网上的资料进行整理、修改和实践得到的。如果有疑惑或者需要更进一步了解的地方,可以自己搜索“**Git**”相关资料或者和我联系,推荐[廖雪峰的官方网站/Git教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000),相信你会有更多收获。 420 | -------------------------------------------------------------------------------- /教程文档/linux适配/2.1.1 开发环境搭建.md: -------------------------------------------------------------------------------- 1 | # 开发环境搭建 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 2.系统移植 9 | -> 1.基于linux-sunxi SDK的系统移植 10 | -> 1.开发环境搭建 11 | ``` 12 | 13 | 主要介绍linux-sunxi SDK的开发环境搭建 14 | 本系列教程使用启发式编写,在写明操作步骤后会附加一些思考题供读者思考,以\*号标记思考题的程度 15 | 一星:刚接触linux,纯新手需要思考、搜索解决的问题 16 | 二星:熟悉linux使用的朋友可以了解的一些问题,如底层问题,或者sdk相关问题 17 | 三星:非常熟悉linux,可以一起探讨的问题 18 | 19 | ## 一.准备开发机 20 | 21 | 与普通单片机开发使用Windows下的可视化IDE,如 MDK,IAR等不同,Linux下开发嵌入式程序多使用一套工具链开发,如arm-linux-gnueabihf-,arm-linux-gnueabi-,arm-none-linux-gnueabi-等 22 | 23 | ```eval_rst 24 | .. note:: \* 工具链的具体定义?前面列出的工具链名字的含义?‘-’分割的各字段的含义? 25 | ``` 26 | 27 | 所以我们需要使用有个Linux开发机来进行开发。具体到全志这颗芯片的SDK,其适合的开发环境是64位linux系统,推荐Ubuntu 1404 64bit系统(桌面版,服务器版均可),预留足够大的硬盘(如果要编译安卓的话,有100G以上最好,单linux的话20G至少) 28 | 29 | ```eval_rst 30 | .. note:: \*\* 为什么全志的SDK需要64位系统开发?为什么推荐Ubuntu 1404 64bit系统? 31 | ``` 32 | 33 | 首先我们下载Ubuntu 1404 64bit系统的镜像安装包,对于没有多余实体机的用户可以再下载VMWare等虚拟机软件 34 | 35 | ```eval_rst 36 | .. note:: \* 在哪里可以下载? 37 | ``` 38 | 39 | 然后在实体机或者虚拟机上安装好Ubuntu系统,这样开发机就准备完成了 40 | 41 | ```eval_rst 42 | .. note:: \* 如何安装Ubuntu系统? 43 | ``` 44 | 45 | 实体机上开发可以直接打开终端,虚拟机的话可以在桌面里开终端,或者使用Xshell等终端软件ssh连接。 46 | 47 | ```eval_rst 48 | .. note:: \* 什么叫ssh连接? 49 | 50 | .. note:: \* 如何设置虚拟机才能让本机在终端里连接上虚拟机? 51 | ``` 52 | 53 | ## 二.准备SDK及相关软件 54 | 55 | 开源的linux-sunxi比较适合初学者学习,所以我们先开始试用linux-sunxi这个sdk 56 | 开发主要用到下面几个工程,请先下载到本地(网速慢的话可以从百度网盘下:) 57 | 58 | ```shell 59 | git clone https://github.com/linux-sunxi/linux-sunxi.git 60 | git clone https://github.com/linux-sunxi/u-boot-sunxi.git 61 | git clone https://github.com/linux-sunxi/sunxi-tools.git 62 | ``` 63 | 64 | 下的工程有兴趣也都可以浏览下 65 | 66 | ```eval_rst 67 | .. note:: \* git的基本操作? 尝试自己建立编辑一个github项目 68 | 69 | .. note:: \*\* linux-sunxi下的工程大致都是什么功能? 70 | ``` 71 | 72 | 简单说下前面三个工程包含的内容,linux-sunxi是linux内核的工程,u-boot-sunxi就是uboot的工程,sunxi-tools是sunxi芯片相关的的一些工具,如fex2bin,bin2fex 73 | 74 | ```eval_rst 75 | .. note:: \* linux内核是什么?uboot是什么? 76 | ``` 77 | 78 | 因为我们要从头开始移植,所以先从u-boot-sunxi这个工程开始 79 | 80 | ```eval_rst 81 | .. tip:: \*\* 可以先浏览下目录,看下应该用什么参数编译 82 | ``` 83 | 84 | 首先我们安装一些依赖包 85 | 86 | ```shell 87 | sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev \ 88 | lib32ncurses5-dev gcc-multilib x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \ 89 | g++-multilib mingw32 tofrodos python-markdown libxml2-utils 90 | ``` 91 | 92 | ```shell 93 | sudo apt-get install gcc-arm-linux-gnueabihf 94 | ``` 95 | 96 | ```eval_rst 97 | .. note:: \* 什么叫安装依赖?前面安装的这都是啥? 98 | 99 | .. note:: \* 安装的时候是不是有个别依赖没装上?怎么解决? 100 | ``` 101 | 102 | 再到本教程所在github工程下的Config_Files里下载荔枝板的配置文件A13-Lichee_defconfig,sun5i-a13-lichee.dts(因为是直播移植,这两个配置文件目前尚未完善,会在以后直播过程中完善),以及修改后的dts的Makefile 103 | 104 | 拷贝这三个文件到uboot工程的对应位置 105 | 106 | ```shell 107 | cp A13-Lichee_defconfig configs/ 108 | cp sun5i-a13-lichee.dts arch/arm/dts/ 109 | cp Makefile arch/arm/dts/ 110 | ``` 111 | 112 | ```eval_rst 113 | .. note:: \*\* 看下这两个文件都是啥配置? 114 | ``` 115 | 116 | ## 三.初次编译尝试 117 | 118 | 然后先配置成荔枝派的默认配置 119 | 120 | ```shell 121 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- A13-Lichee_config 122 | ``` 123 | 124 | ```eval_rst 125 | .. note:: \* 这个命令的各部分是什么意思? 126 | 127 | .. tip:: \*\* 可以浏览下uboot的Make流程 128 | ``` 129 | 130 | 现在可以打开menuconfig配置菜单来看看uboot的一些选项,如果知道那些参数的意思的话也可以试着修改下 131 | 132 | ```shell 133 | make ARCH=arm menuconfig 134 | ``` 135 | 136 | ```eval_rst 137 | .. tip:: \* 熟悉下配置菜单的使用,比如查找选项,查看帮助是按什么键? 138 | ``` 139 | 140 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-8-12/9844767.jpg) 141 | 142 | 浏览好后,先退出配置菜单,使用下面的命令来编译一次试试,注意编译前后目录下多了什么文件(如果提示dtc版本低请自行更新): 143 | 144 | ```shell 145 | time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log 146 | ``` 147 | 148 | ```eval_rst 149 | .. note:: \* 上面的编译命令是什么意思? 150 | ``` 151 | 152 | 可以看到目录下多了一堆u-boot开头的文件 153 | 154 | ```shell 155 | u-boot.cfg u-boot-dtb.bin u-boot.img u-boot.map u-boot.srec u-boot.sym 156 | u-boot.bin u-boot.dtb u-boot-dtb.img u-boot.lds u-boot-nodtb.bin u-boot-sunxi-with-spl.bin 157 | ``` 158 | 159 | ```eval_rst 160 | .. note:: \*\* 这堆文件各是什么用途的文件? 161 | ``` 162 | 163 | 我们这里需要的文件是u-boot-sunxi-with-spl.bin,如果你手上有荔枝派的话,可以使用下面的命令(sdX是对应的tf卡读卡器的设备)往tf卡里烧入u-boot-sunxi-with-spl.bin: 164 | 165 | ```shell 166 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 167 | ``` 168 | 169 | ```eval_rst 170 | .. note:: \* 上面的命令是什么意思? 171 | 172 | .. note:: \*\* 为什么seek=8? 173 | ``` 174 | 175 | 然后插卡到荔枝派的tf口,上电看看UART1的启动输出 176 | 177 | ## 四.结语 178 | 179 | 开发环境就此搭建好了,也初次尝试编译了下,对于linux熟悉的朋友来说这一节很短 180 | 对于linux新手来说,这一节内容 还是挺多的,完全消化还是得多多搜索才行。 181 | 下节会讲述uboot是怎样一步步启动CPU的。 182 | -------------------------------------------------------------------------------- /教程文档/linux适配/2.1.2 u-boot-sunxi走读.md: -------------------------------------------------------------------------------- 1 | # u-boot-sunxi走读 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 2.系统移植 9 | -> 1.基于linux-sunxi SDK的系统移植 10 | -> 2. u-boot-sunxi走读 11 | ``` 12 | 13 | 经过前面一节的开发环境搭建,大家应该能够初次编译uboot了,但是如果没有思考过2星问题的朋友还是对uboot没有什么印象,本节就带大家走读uboot,了解其工程结构和工作原理。 14 | 15 | ## 一.u-boot-sunxi目录走读 16 | 17 | 大致查看下u-boot-sunxi每个目录的文件(仅列出了在调试DDR时比较重要的文件,其它目录请自行打开浏览) 18 | 19 | ```shell 20 | . 21 | ├── api //封装一些平台无关的操作,如字符串打印,显示,网络,内存 22 | ├── arch // 23 | │   ├──arm 24 | │   │   └──cpu 25 | │   │   │   └──armv7 26 | │   │   │   │   └──sunxi //cpu相关的一些操作,如定时器读取 27 | │   │   │   │   │   └──u-boot-spl.lds //spl的放置方法 28 | │   │   └──dts 29 | │   │   │   └──sun5i-a13.dtsi //sun5i系列芯片的一些配置 30 | │   │   │   └──sun5i-a13-lichee.dts 31 | │   │   │   └──sun5i-r8-chip.dts 32 | │   │   │   └──sun5i-r8.dtsi 33 | │   │   │   └──sun5i.dtsi 34 | │   │   └──lib //一些库文件 35 | │   │   └──mach-sunxi 36 | │   │   │   └──board.c //board_init_f 37 | │   │   │   └──dram_sun4i.c //ddr的操作,复位,时钟,延时,odt,etc. 38 | │   │   │   └──dram_helpers.c //ddr的设置及读写测试 39 | ├── board 40 | │   ├──sunxi 41 | │   │   └──board.c //sunxi_board_init 入口 42 | │   │   └──dram_sun5i_auto.c //DRAM的一些默认参数 43 | │   │   └──dram_timings_sun4i.h //根据时钟生成的DRAM参数 44 | ├── cmd //Uboot命令行的一些命令 45 | ├── common //含spl 46 | ├── configs //menuconfig里的默认配置,比如dcdc的各路电压 47 | │   ├──A13-Lichee_defconfig 48 | ├── disk //硬盘分区的驱动 49 | ├── doc 50 | ├── drivers //外设驱动 51 | ├── dts 52 | ├── examples 53 | ├── fs //多种文件系统 54 | ├── include 55 | │   ├──configs 56 | │   │   └──sunxi_common.h //预配置的参数,如串口号等 57 | │   │   └──sun5i.h 58 | ├── lib //加密压缩等算法 59 | ├── net //nfs,tftp等网络协议 60 | ├── post 61 | ├── scripts 62 | 63 | ``` 64 | 65 | 如果需要移植新的版型,如上文所示,主要修改的就是dts文件和configs目录下的默认配置文件。 66 | 具体dts文件的语法请搜索相关资料。 67 | 68 | ## 二.u-boot-sunxi启动流程走读 69 | 70 | 要让芯片跑起系统,对其bootloader必须非常了解,不然移植初期出现的问题将无从下手。 71 | 笔者调试荔枝板的时候犯了个错误,在没有确认DDR正常运行的时候就贸然进行调试,结果出现的问题是如同 堆栈溢出,或者指针指飞后的诡异情形,每次出错的位置总是不同,导致多次跟踪徒劳无返。 72 | 73 | 不过也正是因为犯了前面这个错误,导致笔者翻遍了u-boot-sunxi的代码,特别是SPL部分代码,使得调试稳定DDR后,移植中出现的问题马上就能找到原因,很快完成了bootloader的适配。 74 | 75 | 由于启动部分内容较多,现将A13的bootloader启动流程分成三个流程图将以展示,可以在github的资源文件目录下找到。 76 | 77 | ``` 78 | A13整体启动流程:简明介绍A13启动的几个过程 79 | uboot-sunxi spl部分流程:详细介绍spl部分启动流程 80 | uboot-sunxi uboot部分流程:详细介绍uboot部分启动流程 81 | ``` 82 | 83 | 流程图只是起到一个路线图的作用,当你不太熟悉启动流程,而启动失败的时候,可以根据流程查看目前的启动进度,以及是在哪里卡住,可以快速定位出错的大致位置。 84 | 85 | ## 三.关于A13的裸机用法 86 | 87 | 群里有朋友问A13的裸机用法,其实在SPL或Uboot下就是A13的裸机使用。 88 | SPL下未初始化DDR,只能使用片内48KB SRAM,就完全是普通单片机用法,只是程序是需要从tf卡载入到内存里运行而已。这样使用可以不加DDR,只是内部SRAM较小。 89 | Uboot下已经初始化了DDR,而且对多数外设已经有了驱动,使用起来会更方便,内存也可以充分利用。(像RTT之类的小型RTOS应该可以直接编译进Uboot了吧。。) 90 | 91 | 感兴趣的朋友可以尝试下在SPL或者Uboot下编程,可以对启动过程更有了解。 92 | 93 | ## 四.小结 94 | 95 | 对于多数linux开发者来说,此部分内容只作了解即可。 96 | 此部分内容主要是BSP工程师的工作。 97 | 下节打算讲下移植中遇到的最大的坑,也就是DDR的调试问题,这是关系到系统能否跑起来的关键问题,也是软硬件结合最紧密的问题,所以单独写一节来 总结。 98 | -------------------------------------------------------------------------------- /教程文档/linux适配/2.1.3 tf镜像烧录解读.md: -------------------------------------------------------------------------------- 1 | # tf镜像烧录解读 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 2.系统移植 9 | -> 1.基于linux-sunxi SDK的系统移植 10 | -> 3. tf镜像烧录解读 11 | ``` 12 | 13 | 这里对荔枝派的镜像烧录进行解读 14 | 15 | ## 一.系统镜像组成 16 | 17 | TF卡或者其他存储介质中的系统镜像组成如下: 18 | 19 | 1. boot部分,含boot0和boot1/uboot 20 | 2. linux内核部分,含启动参数和fex配置 21 | 3. linux根文件系统 22 | 23 | ```eval_rst 24 | .. note:: \*\* 回想下在启动过程中这三个部分是如何串联起来的? 25 | ``` 26 | 27 | ## 二.烧录boot部分镜像 28 | 29 | 将前面编译出的u-boot-sunxi-with-spl.bin烧录到tf 8KB偏移处 30 | (sdb换成你自己的tf卡读卡器设备名) 31 | 32 | ```shell 33 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 34 | sudo sync 35 | ``` 36 | 37 | ```eval_rst 38 | .. tip:: \*\* 学习下dd命令的详细用法 39 | ``` 40 | 41 | ## 三.烧录linux内核镜像 42 | 43 | 需要准备uImage,script.bin,boot.scr三个文件 44 | 45 | ```eval_rst 46 | .. note:: \*\* 回想下这三个文件的作用? 47 | ``` 48 | 49 | 1. uImage 50 | 1. 使用linux-sunxi编译后可得到uImage 51 | 2. script.bin 52 | 1. 使用下面命令将fex转为bin 53 | 2. `fex2bin a13-lichee.fex script.bin` 54 | 3. 需要根据使用的摄像头型号修改对应的fex字段 55 | 3. boot.scr 56 | 1. 使用下面命令将boot.cmd转为boot.scr 57 | 2. `mkimage -C none -A arm -T script -d boot.cmd boot.scr` 58 | 59 | ```eval_rst 60 | .. tip:: \*\* 查看fex文件和boot.cmd文件,理解各字段含义 61 | ``` 62 | 63 | 这三个文件在uboot启动时会在第一分区搜索,所以需要新建一个TF卡分区(FAT格式),需要使用fdisk命令。 64 | 65 | ```eval_rst 66 | .. tip:: \*请自行学习fdisk命令 67 | ``` 68 | 69 | 如果原来tf卡已经有分区表,请先清除分区。 70 | 71 | 烧录相关的脚本已上传至“**资源文件**”目录,可以查看其中的脚本命令。 72 | 73 | 一般来说,第一分区设为16MB大小就足够了。 74 | 75 | 然后格式化为FAT格式: 76 | `sudo mkfs.vfat /dev/sdb1` 77 | 78 | 最后放入前面提到的三个文件即可。 79 | 80 | ## 四.烧录linux根文件系统 81 | 82 | linux内核在启动时候会根据启动参数中的root参数来获得根文件系统分区号,然后加载之。 83 | 84 | 一般就按顺序把根文件系统设为第二分区,使用EXT3或者EXT4文件系统。 85 | 86 | 整个根文件系统有两种打包方式,dd方式和tar方式。 87 | 88 | dd方式是直接备份整个分区信息,tar方式是直接打包整个分区。 89 | 90 | dd出来的分区镜像可以直接使用mount命令在本机上加载查看,烧写速度也稍快些,所以荔枝派使用dd出来的镜像发布。 91 | 92 | 不过由于dd是备份了整个分区信息,所以连分区大小都是一致的,如果tf较大,可以自行扩容分区和文件系统 93 | 94 | ```eval_rst 95 | .. tip:: \* 自学linux下扩容分区和文件系统的方法 96 | ``` 97 | 98 | ``` 99 | dd if=fs2.img of=/dev/sdb2 bs=64K 100 | sync 101 | ``` 102 | 103 | ## 五.启动尝试 104 | 105 | 按上述方法准备好tf卡后,就可以尝试启动了! 106 | 把tf卡插入背面卡槽,有屏幕的插入屏幕(注意方向),有摄像头的插入摄像头(注意方向),再连上UART1(默认系统串口),上电。 107 | 正常情况就可以启动到debian系统了~ 108 | 109 | ```eval_rst 110 | .. tip:: \*\* 给出的镜像是出厂测试镜像,屏蔽了桌面系统,想开机启动桌面系统的可以尝试修改下 111 | ``` 112 | 113 | 提供的镜像有两个用户lichee和root,密码均为lichee。 114 | 在github “**资源文件**”目录下,有烧写相关的文件和脚本(脚本还未整理,比较乱,不过也可以参考使用) 115 | -------------------------------------------------------------------------------- /教程文档/linux适配/LCD参数适配.rst: -------------------------------------------------------------------------------- 1 | LCD的参数适配 2 | ===================== 3 | 4 | LCD的参数和其他外设一样在fex文件里修改 5 | 6 | 像分辨率和画布偏移之类的,都在以下字段: 7 | 8 | .. code-block:: c 9 | 10 | lcd_x = 800 11 | lcd_y = 480 12 | lcd_dclk_freq = 33 13 | lcd_hv_hspw = 23 14 | lcd_hbp = 46 15 | lcd_ht = 1055 16 | lcd_hv_vspw = 1 17 | lcd_vbp = 10 18 | lcd_vt = 1050 19 | 20 | 例如改成1024*768 21 | 22 | .. code-block:: c 23 | 24 | lcd_x = 1024 25 | lcd_y = 768 26 | lcd_dclk_freq = 65 27 | lcd_hv_vspw = 6 28 | lcd_hv_hspw = 136 29 | lcd_hbp = 180 30 | lcd_ht = 1344 31 | lcd_vbp = 29 32 | lcd_vt = 1612 33 | 34 | 在超分辨率使用时,注意以下代码(具体查看源码)的限制 35 | 36 | .. code-block:: c 37 | 38 | /* hv panel, CPU panel and ttl panel */ 39 | if (info->lcd_if == 0 || info->lcd_if == 1 || info->lcd_if == 2) { 40 | /* MHz */ 41 | if (lcd_dclk_freq > 2000000 && lcd_dclk_freq <= 297000000) { 42 | /* divider for dclk in tcon0 */ 43 | *divider = 297000000 / (lcd_dclk_freq); 44 | pll_freq = lcd_dclk_freq * (*divider); 45 | } else { 46 | return -1; 47 | } 48 | } 49 | 50 | 以下是未整理的移植时的手记,可以参考: 51 | 52 | drivers/video/sunxi_display.c 53 | ``video_hw_init`` 54 | 55 | drivers/video/videomodes.c 56 | 57 | .. code-block:: c 58 | 59 | int video_get_params (struct ctfb_res_modes *pPar, char *penv) 60 | mode: 0~9 640*480~1920*1200,默认0 61 | x: 62 | y: 63 | refresh: 64 | le:left_margin 65 | ri:right_margin 66 | up:upper_margin 67 | lo:lower_margin 68 | hs:hsync_len 69 | vs:vsync_len 70 | sync:sync 71 | #define FB_SYNC_HOR_HIGH_ACT 1 /* horizontal sync high active */ 72 | #define FB_SYNC_VERT_HIGH_ACT 2 /* vertical sync high active */ 73 | #define FB_SYNC_EXT 4 /* external sync */ 74 | #define FB_SYNC_COMP_HIGH_ACT 8 /* composite sync high active */ 75 | #define FB_SYNC_BROADCAST 16 /* broadcast video timings */ 76 | /* vtotal = 144d/288n/576i => PAL */ 77 | /* vtotal = 121d/242n/484i => NTSC */ 78 | #define FB_SYNC_ON_GREEN 32 /* sync on green */ 79 | vmode:vmode 80 | #define FB_VMODE_NONINTERLACED 0 /* non interlaced */ 81 | #define FB_VMODE_INTERLACED 1 /* interlaced */ 82 | #define FB_VMODE_DOUBLE 2 /* double scan */ 83 | #define FB_VMODE_ODD_FLD_FIRST 4 /* interlaced: top line first */ 84 | pclk:pixclock 85 | pclk_khz:pixclock_khz 86 | depth: 色深 87 | 88 | bp = mode->hsync_len + mode->left_margin; 89 | 10 (43-10)=33 90 | total = mode->xres + mode->right_margin + bp; 91 | 480 8 43 92 | 93 | bp = mode->vsync_len + mode->upper_margin; 94 | 10 (12-10)=2 95 | total = mode->yres + mode->lower_margin + bp; 96 | 272 4 12 97 | x:480,y:272,depth:18,pclk_khz:9000,le:33,ri:8,up:2,lo:4,hs:10,vs:10,sync:0,vmode:0 98 | x:800,y:480,depth:18,pclk_khz:33000,le:100,ri:170,up:35,lo:2,hs:10,vs:10,sync:0,vmode:0 99 | 100 | Setting up a 480x272 lcd console (overscan 0x0) 背光闪了下 101 | drivers/video/sunxi_display.c 102 | video_hw_init 103 | sunxi_mode_set(mode, fb_dma_addr); 104 | static void sunxi_lcdc_backlight_enable(void) 105 | hsync + hbp(back porch) + X len + hfp(front porch) 106 | hb(H blanking) 107 | 108 | hbp相当于画面在画布中的偏移, 109 | 110 | 屏幕在左边和上边都有一部分不能显示的等待区域,要调整hbp移出这部分, 111 | 112 | 否则会有一部分在屏幕外不显示 113 | 114 | hsync值只要大于1即可 -------------------------------------------------------------------------------- /教程文档/linux适配/contents.rst: -------------------------------------------------------------------------------- 1 | Linux系统适配全解析 2 | ====================== 3 | 4 | .. toctree:: 5 | 6 | 基础知识-git <2.1.0 使用git进行项目管理> 7 | 开发环境搭建 <2.1.1 开发环境搭建> 8 | u-boot-sunxi走读 <2.1.2 u-boot-sunxi走读> 9 | tf镜像烧录解读 <2.1.3 tf镜像烧录解读> 10 | 简明linux-sunxi编译指南 11 | LCD参数适配 12 | -------------------------------------------------------------------------------- /教程文档/linux适配/tmp_简明linux-sunxi编译指南.md: -------------------------------------------------------------------------------- 1 | # linux-sunxi简明编译指南 2 | 3 | 1. 从本项目的ConfigFiles里下载a13_linux_defconfig配置文件,该文件是a13的默认配置文件 4 | 2. 将上面的配置文件拷贝到arch/arm/configs/目录下,写入默认配置: 5 | `make ARCH=arm a13_linux_defconfig` 6 | 3. 可以视情况修改一下menuconfig配置: 7 | `make ARCH=arm menuconfig` 8 | 4. 编译linux内核镜像(注意下面的j24是你的开发机有多少线程就写多少) 9 | `make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 uImage` 10 | 5. 编译安装内核模块 11 | 12 | ```shell 13 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 INSTALL_MOD_PATH=out modules 14 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 INSTALL_MOD_PATH=out modules_install 15 | ``` 16 | 17 | 可以在linux-sunxi/out/lib/modules/3.4.104下找到编译好的内核模块 18 | -------------------------------------------------------------------------------- /教程文档/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | set SPHINXPROJ=licheePi 13 | 14 | if "%1" == "" goto help 15 | 16 | %SPHINXBUILD% >NUL 2>NUL 17 | if errorlevel 9009 ( 18 | echo. 19 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 20 | echo.installed, then set the SPHINXBUILD environment variable to point 21 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 22 | echo.may add the Sphinx directory to PATH. 23 | echo. 24 | echo.If you don't have Sphinx installed, grab it from 25 | echo.http://sphinx-doc.org/ 26 | exit /b 1 27 | ) 28 | 29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 30 | goto end 31 | 32 | :help 33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 34 | 35 | :end 36 | popd 37 | -------------------------------------------------------------------------------- /教程文档/产测/1.3.1 样板焊接备料.md: -------------------------------------------------------------------------------- 1 | # 样板焊接备料 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 3.样板焊接 10 | -> 1.样板焊接备料 11 | ``` 12 | 13 | 主要介绍荔枝板的样板焊接之前的准备工作,PCB打样,bom生成备料,钢网准备。 14 | 15 | ## 一.PCB打样 16 | 17 | 在 之前的PCB参数确认 一节中就选用了华强PCB,在华强PCB的官网直接下单即可 18 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/79764304.jpg) 19 | 20 | 326.5 = 200样板费 + 50过孔费 + 50BGA费 + 税费 21 | 周五下的单,周一就收到了,速度还是挺快的~ 22 | 23 | ## 二.钢网准备 24 | 25 | 华强PCB上貌似没有钢网选项,就直接在嘉立创上下单了钢网 26 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/55641158.jpg) 27 | 28 | 嘉立创的钢网还是比较贴心的,之前PCB打样回来就发现有个小问题,PMU的底部焊盘忘开窗了,钢网回来却发现嘉立创发现了这个问题并自动修正了。 29 | 30 | ## 三.bom生成及采购 31 | 32 | 使用AD的BOM生成工具导出bom到xlsx,然后就可以按照BOM列表采购。 33 | 电子料样品我一般在[优信](https://youxin-electronic.taobao.com/)买,比较全,价格也可以。 34 | 35 | 在采购的时候发现有些E24的阻值买样品不好买,可以稍微调整下阻值到E12,方便采购。 36 | 还有一点就是,10uF的贴片电容,特别是小封装,大电压 的贴片电容会很贵,所以在之前PCB布板时就应该尽量选择大封装的。 37 | 38 | 在采购中也发现0.03欧的精密采样电阻比较难买,特别是0805小封装的,大多都是1206,2010的,这也给我们一个提醒,就是在设计PCB的时候一定要确认物料的采购情况。 39 | -------------------------------------------------------------------------------- /教程文档/产测/1.3.2 样板元件焊接.md: -------------------------------------------------------------------------------- 1 | # 样板元件焊接 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 3.样板焊接 10 | -> 2.样板元件焊接 11 | ``` 12 | 13 | 主要介绍荔枝板的样板元件焊接 14 | 15 | ## 一. 外发PCB焊接 16 | 17 | 外发样板焊接是最轻松的方式,目前一款PCB样板焊接费用是300起步,价格是比较合理的,只是来回快递会花费不少时间。 18 | 最近嘉立创还提供了SMT服务,可以贴常用的阻容元件,工程费只要100,在嘉立创打样的PCB可以试试,不过只能单面贴片。 19 | 小批量生产时,只要提供好产测设备,SMT厂也会帮你做好PCB的检测(当然是要加钱的),这个在后面的小批量生产一节中再详述。 20 | 如果有样板焊接或者SMT小批量生产需求的也可以联系我 O(∩_∩)O~ 21 | 22 | ## 二. 手工样板焊接 23 | 24 | 有时候由于时间关系,或者个人DIY兴趣,可以进行手工样板焊接,下面介绍常用元器件的手工焊接方法 25 | 26 | ### 分立元件及大引脚间距芯片 27 | 28 | 少量的此类元件可以直接使用镊子夹持摆放,手工使用烙铁焊接 29 | 焊小封装元件如0402时,利用放大镜台灯就会轻松很多 30 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/50457058.jpg) 31 | 32 | 但是如果需要焊接很多分立元件的话,手焊就很痛苦了,这时候推荐使用手工贴片焊接 33 | 钢网目前大概是40~50元每款,在嘉立创打样的话可以一同购买方便焊接 34 | 锡膏建议使用针筒式的,易于保存 35 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/27436433.jpg) 36 | 37 | 加热焊接 可以使用小型的回流焊机,或者直接用热风枪吹。 38 | 如果是单面元件,强烈推荐使用PTC恒温加热板焊接,比热风枪快很多,价格也在10元以内 39 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/34765938.jpg) 40 | 41 | ### 密引脚芯片 42 | 43 | 像A13这样的eLQFP封装芯片,引脚间距特别密(不到0.5mm),那么使用拖焊是最合适的 44 | 45 | ```eval_rst 46 | http://blog.sina.com.cn/s/blog_6566538d0100qjei.html 47 | ``` 48 | 49 | ### BGA 芯片焊接 50 | 51 | 对于像DDR之类的BGA芯片,其实只要涂好助焊膏,摆放齐位置,使用热风枪或者PTC都能 很好地焊接上。 52 | 53 | ```eval_rst 54 | http://blog.163.com/mcu_expert/blog/static/1312451532010921112128366/ 55 | ``` 56 | 如果有个数字摄像头观察焊接,那会更直观: 57 | ```eval_rst 58 | http://v.youku.com/v_show/id_XMTYyNTI5MjQyNA==.html 59 | ``` 60 | -------------------------------------------------------------------------------- /教程文档/产测/contents.rst: -------------------------------------------------------------------------------- 1 | 生产测试全解析 2 | ====================== 3 | 4 | .. toctree:: 5 | 6 | 样板焊接备料 <1.3.1 样板焊接备料> 7 | 样板元件焊接 <1.3.2 样板元件焊接> -------------------------------------------------------------------------------- /教程文档/安卓适配/android_build.md: -------------------------------------------------------------------------------- 1 | # 安卓编译简记 2 | 3 | qq群里 @随风破浪 编译安卓一星期未果,我之前的开发机上的lichee目录又不小心被覆盖了,所以抽空简单记录下如何在原始sdk的基础上 修改适配,成功编译出可以跑在荔枝派上的安卓系统。 4 | 5 | ## 1. 编译环境准备 6 | 7 | ### 开发机系统要求 8 | 9 | 编译安卓需要64位linux系统,推荐**ubuntu 1404或者1604**, 10 | 开发机至少需要**4GB内存,40GB硬盘**;推荐**8GB内存,100GB硬盘**以上。 11 | 以下是开发过程中目录大小示意: 12 | 13 | ```shell 14 | zp@ubuntu:~/develop$ du -lh --max-depth=1 v1.5.0/ 15 | 26G v1.5.0/android 16 | 6.8G v1.5.0/lichee 17 | 33G v1.5.0/ 18 | 19 | zp@ubuntu:~/develop$ du -lh --max-depth=1 a13_android4.1_v1.2/ 20 | 5.2G a13_android4.1_v1.2/lichee 21 | 23G a13_android4.1_v1.2/android4.1 22 | 28G a13_android4.1_v1.2/ 23 | ``` 24 | 25 | 开发机的CPU配置尽量高,笔者12线程并行编译,配以ssd,首次编译需要45分钟 26 | 27 | 网友双线程编译,耗时4小时左右。 28 | 29 | ### 开发机软件环境 30 | 31 | 首先安装开发所需要的软件包和一些库。 32 | 下面的一些安装包可能有些过时的,遇到版本问题请自行解决。 33 | 34 | #### 在线安装 JDK6.0 35 | 36 | ```shell 37 | sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" 38 | sudo add-apt-repository ppa:ferramroberto/java 39 | sudo apt-get update 40 | sudo apt-get install sun-java6-jdk 41 | sudo update-alternatives --c onfig java 42 | ``` 43 | 44 | #### 在线安装编译库 45 | 46 | ```shell 47 | sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev 48 | lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev 49 | g++-multilib mingw32 tofrodos python-markdown libxml2-utils 50 | ``` 51 | 52 | #### SDK下载 53 | 54 | 链接: http://pan.baidu.com/s/1c4gztvE 55 | 56 | 在SDK目录下 下载以下两个文件 57 | 58 | ```shell 59 | lichee-4.1-v1.2.tar.gz 60 | android4.1-v1.2.tar.gz 61 | ``` 62 | 63 | 这是安卓4.1的SDK,前面的是4.2的SDK, 64 | > 我手上的4.2 SDK的mali驱动ko和应用层库so版本对不上,换了从4.1里抠出的对应版本的so后,可以勉强启动系统,但是会不定时地出现缓冲队列满的问题导致ANR,所以暂时无法使用 65 | 66 | 在开发机上新建目录,如a13_android4.1 67 | 然后把两个sdk拷入,解压 68 | 69 | 把lichee对应的目录名改成lichee(即去掉版本号),目录如下所示 70 | 71 | ```shell 72 | zp@ubuntu:~/develop/a13_android4.1_v1.2$ ls 73 | android4.1 lichee 74 | ``` 75 | 76 | ## 2. lichee编译 77 | 78 | lichee是安卓系统的linux内核部分,需要首先编译,进入lichee目录执行: 79 | 80 | ```shell 81 | ./build.sh -p a13_nuclear -k 3.0 82 | ./build.sh pack 83 | ``` 84 | 85 | 编译错误解析 86 | 编译过程中会出错,每个人由于其开发环境以及执行步骤的不同,错误都可能不同,下面以我编译时遇到的错误为例进行解析 87 | 88 | - mali驱动编译出错 89 | 90 | ```shell 91 | make: Entering directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali' 92 | /home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0 93 | make -C DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump CONFIG=ca8-virtex820-m400-1 BUILD=release KDIR=/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0 94 | make[1]: Entering directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump' 95 | make -C /home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0 M=/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump modules 96 | make[2]: Entering directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0' 97 | CC [M] /home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump/common/ump_kernel_common.o 98 | arm-none-linux-gnueabi-gcc: directory: No such file or directory 99 | arm-none-linux-gnueabi-gcc: directory": No such file or directory 100 | :0:16: warning: missing terminating " character 101 | make[3]: *** [/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump/common/ump_kernel_common.o] Error 1 102 | make[2]: *** [_module_/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump] Error 2 103 | make[2]: Leaving directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0' 104 | make[1]: *** [all] Error 2 105 | make[1]: Leaving directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump' 106 | make: *** [build] Error 2 107 | make: Leaving directory `/home/zp/develop/a13_android4.1_v1.2/lichee/linux-3.0/modules/mali' 108 | 109 | real 2m35.400s 110 | user 15m36.416s 111 | sys 0m35.740s 112 | ``` 113 | 114 | 进入排除可知是脚本里检查了SVN版本的问题,我们直接忽略SVN版本,将`linux-3.0/modules/mali/DX910-SW-99002-r3p1-01rel0/driver/src/devicedrv/ump` 目录下的SVN_REV直接赋值为0(在Kbuild和Makefile.common中) 115 | 116 | 重新编译,仍然是类似的错误,只是换了个目录,于是直接在mali驱动目录下全局搜索SVN_REV,将赋值的地方直接改为0 117 | 118 | 再重新编译成功 119 | 120 | ```shell 121 | mkdir: created directory ‘/home/zp/develop/a13_android4.1_v1.2/lichee/out’ 122 | ‘/home/zp/develop/a13_android4.1_v1.2/lichee/u-boot/u-boot.bin’ -> ‘/home/zp/develop/a13_android4.1_v1.2/lichee/out/android/u-boot.bin’ 123 | ############################### 124 | # compile success # 125 | ############################### 126 | 127 | real 0m51.177s 128 | user 1m1.324s 129 | sys 0m4.736s 130 | ``` 131 | 132 | ## 3. 安卓编译 133 | 134 | ```shell 135 | 进入安卓目录,执行以下命令序列: 136 | source build/envsetup.sh #导入一些环境变量 137 | lunch #选择板型,直接选择10. nuclear_evb-eng,以后也直接在上面改 138 | extract-bsp #将lichee中编译得到的内核镜像和模块拷贝过来 139 | time make -j12 2>&1 | tee log.txt #编译system.img,这里-j12换成你电脑的线程数(核数*2)。12线程耗时约 140 | pack #打包成刷机镜像 141 | ``` 142 | 143 | 编译system.img成功的提示: 144 | 145 | ```shell 146 | Creating filesystem with parameters: 147 | Size: 536870912 148 | Block size: 4096 149 | Blocks per group: 32768 150 | Inodes per group: 8192 151 | Inode size: 256 152 | Journal blocks: 2048 153 | Label: 154 | Blocks: 131072 155 | Block groups: 4 156 | Reserved block group size: 31 157 | Created filesystem with 1443/32768 inodes and 102168/131072 blocks 158 | + '[' 0 -ne 0 ']' 159 | Running: mkuserimg.sh -s out/target/product/nuclear-evb/system out/target/product/nuclear-evb/obj/PACKAGING/systemimage_intermediates/system.img ext4 system 536870912 160 | Install system fs image: out/target/product/nuclear-evb/system.img 161 | out/target/product/nuclear-evb/system.img+out/target/product/nuclear-evb/obj/PACKAGING/recovery_patch_intermediates/recovery_from_boot.p maxsize=548110464 blocksize=4224 total=412271984 reserve=5537664 162 | 163 | real 36m1.948s 164 | user 350m4.772s 165 | sys 14m16.936s 166 | ``` 167 | 168 | pack打包成功的提示: 169 | 170 | ```shell 171 | /home/zp/develop/a13_android4.1_v1.2/lichee/tools/pack/pctools/linux/eDragonEx//home/zp/develop/a13_android4.1_v1.2/lichee/tools/pack/outBuildImg 0 172 | Dragon execute image.cfg SUCCESS ! 173 | CPlugin Free lib 174 | CPlugin Free lib 175 | ---------image is at------------- 176 | 177 | /home/zp/develop/a13_android4.1_v1.2/lichee/tools/pack/sun5i_android_a13-evb.img 178 | ``` 179 | 180 | ### 编译错误解析 181 | 182 | 1. 注意如果编译时突然中断,则可能出现文件截断的情况,需要先清空out 下子目录中的的obj目录,才好继续编译 183 | 184 | 例如下面错误就是: 185 | 186 | ```shell 187 | target thumb C++: camera. <= device/softwinner/common/hardware/camera/HALCameraFactory.cpp 188 | In file included from device/softwinner/common/hardware/camera/CameraHardwareDevice.h:26:0, 189 | from device/softwinner/common/hardware/camera/HALCameraFactory.cpp:30: 190 | device/softwinner/common/hardware/camera/CameraHardware.h:29:23: fatal error: videodev2.h: No such file or directory 191 | compilation terminated. 192 | make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/camera._intermediates/HALCameraFactory.o] Error 1 193 | make: *** Waiting for unfinished jobs.... 194 | ``` 195 | 196 | 2. 在pack时遇到以下错误(虽然不导致编译失败,但是启动时会造成错误) 197 | 198 | ```shell 199 | fail:/home/zp/develop/a13_android4.1_v1.2/lichee/tools/pack/out/bootfs/sprite 0 200 | disk : c 201 | CopyRootToFS(/home/zp/develop/a13_android4.1_v1.2/lichee/tools/pack/out/bootfs) 202 | ``` 203 | 204 | 检查可以发现是lichee/tools/pack/pack中的打包脚本的这句出错: 205 | `fsbuild bootfs.ini split_xxxx.fex` 206 | 207 | 这个fsbuild在运行时貌似无法打包bootfs的二级目录,不知为何。。有些人却没有反馈有这个问题,应该是个人的环境不同。 208 | 209 | 由于fsbuild是二进制提供的,只能通过其作用揣测实际功能,经过试验,上面那句可以用以下脚本代替, 210 | 211 | 基本作用就是构造一个fat文件系统镜像。 212 | 213 | ```shell 214 | dd if=/dev/zero of=bootfs.fex bs=1M count=12 215 | mkfs.vfat bootfs.fex 216 | sudo mount bootfs.fex /mnt 217 | sudo cp -r bootfs/* /mnt 218 | sync 219 | sudo umount /mnt 220 | cat split_xxxx.fex >> bootfs.fex 221 | ``` 222 | 223 | 3. 分区大小的问题(虽然不导致编译失败,但是启动时会造成错误) 224 | 如果往system.img里加入了太多东西,可能导致超出了默认的分区大小(512M),则需要修改默认分区规划 225 | 226 | 验证system.img的实际大小: 227 | `simg2img system.img system.bin` 228 | 229 | 如果生成的system.bin大小刚好是512M,并且可以挂载,那就是正常的。 230 | 如果大小超过了512M,或者挂载时出错,那么就需要修正分区配置。 231 | 232 | 配置文件在`lichee/tools/pack/chips/sun5i/configs/android/a13-evb/sys_config.fex` 233 | 234 | 修改大小即可。 235 | 236 | ```shell 237 | ;------------------------------>nandd, android real rootfs 238 | [partition3] 239 | class_name = DISK 240 | name = system 241 | size_hi = 0 242 | size_lo = 524288 243 | user_type = 1 244 | ro = 0 245 | ``` 246 | 247 | ## 4. 镜像下载 248 | 249 | 前面pack打包完成后,会生成`sun5i_android_a13-evb.img`,这就是刷机镜像 250 | 251 | 镜像烧录工具是网盘中的PhoenixCard,打开后选择tf卡对应盘符,以及待烧录镜像,选择**卡启动**,进行烧录 252 | 253 | ![](https://box.kancloud.cn/77805d12cdca7a2c82220dc65501c9dc_762x500.png) 254 | 255 | ### 常见烧录错误 256 | 257 | 偶尔会出现'处理出错'的提示,这时候一般只要重新烧录即可 258 | 259 | ## 5. 启动系统的适配过程 260 | 261 | 通过以上步骤编译的img还是不能在荔枝派上启动的,前面只能算是编译过一遍evb的安卓,需要在荔枝派上启动,还得进行一系列适配工作。 262 | 263 | ### 第一次启动(boot1跳转失败) 264 | 265 | 系统默认串口为UART1,接串口查看信息: 266 | 267 | ```shell 268 | dram size =512 269 | 0xffffffff,0xffffffff 270 | super_standby_flag = 0 271 | HELLO! BOOT0 is starting! 272 | boot0 version : 1.5.2 273 | The size of Boot1 is 0x00036000. 274 | Fail in checking boot1. 275 | Ready to disable icache. 276 | Fail in loading Boot1. 277 | Jump to Fel. 278 | ``` 279 | 280 | 可见DDR已被识别,但是加载boot1失败。 281 | 282 | 这其中的原因是DDR虽然被识别,但是参数配置错误,导致运行出错,所以我们需要先配置正确的DDR参数。 283 | 284 | DDR参数记录在`sys_config1.fex`中,这里不过多解释`sys_config1.fex`的字段,直接使用之前在debian中适配好的fex文件覆盖 285 | 286 | `lichee/tools/pack/chips/sun5i/configs/android/a13-evb/sys_config1.fex` 287 | 288 | 然后重新进行安卓编译过程。 289 | 290 | 编译完成后,可以直接重新烧写完整镜像,也可以只更新uboot和bootfs,后者需要对编译系统比较了解,在此不详细展开。 291 | 292 | 重新烧录后,可以看到闪过了两个开机画面,说明已经可以启动到linux内核了。 293 | 294 | ### 第二次启动(启动介质错误) 295 | 296 | 按前面修改后,启动会卡在第二张开机画面,查看串口信息: 297 | 298 | ```sh 299 | [ 16.009615] init: buffer : /dev/block/nande 300 | [ 16.014564] init: do_umount: /data 301 | [ 16.018071] init: do_umount error = Invalid argument 302 | [ 17.390045] usb 2-1: device not accepting address 2, error -110 303 | [ 17.450200] ehci_irq: port change detect 304 | [ 17.454145] ehci_irq: port change detect 305 | [ 21.007468] init: buffer : /dev/block/nandh 306 | [ 21.012161] init: do_umount: /cache 307 | [ 21.015755] init: do_umount error = Invalid argument 308 | [ 21.022007] init: open device error :No such file or directory 309 | [ 31.008863] init: buffer : /dev/block/nandi 310 | [ 31.013556] init: do_umount: /databk 311 | [ 31.017237] init: do_umount error = Invalid argument 312 | [ 31.029268] init: cannot find '/system/bin/sh', disabling 'console' 313 | [ 31.035766] init: cannot find '/system/bin/servicemanager', disabling 'servicemanager' 314 | [ 31.043742] init: cannot find '/system/bin/vold', disabling 'vold' 315 | [ 31.049968] init: cannot find '/system/bin/netd', disabling 'netd' 316 | [ 31.056192] init: cannot find '/system/bin/debuggerd', disabling 'debuggerd' 317 | [ 31.063282] init: cannot find '/system/bin/rild', disabling 'ril-daemon' 318 | [ 31.069987] init: cannot find '/system/bin/surfaceflinger', disabling 'surfaceflinger' 319 | [ 31.077943] init: cannot find '/system/bin/app_process', disabling 'zygote' 320 | [ 31.084939] init: cannot find '/system/bin/drmserver', disabling 'drm' 321 | [ 31.091502] init: cannot find '/system/bin/mediaserver', disabling 'media' 322 | [ 31.098387] init: cannot find '/system/bin/dbus-daemon', disabling 'dbus' 323 | [ 31.105211] init: cannot find '/system/bin/installd', disabling 'installd' 324 | [ 31.112125] init: cannot find '/system/etc/install-recovery.sh', disabling 'flash_recovery' 325 | [ 31.120541] init: cannot find '/system/bin/keystore', disabling 'keystore' 326 | [ 31.127432] init: cannot find '/system/bin/u3gmonitor', disabling 'u3gmonitor' 327 | [ 31.135780] init: cannot find '/system/bin/sh', disabling 'console' 328 | ``` 329 | 330 | 可见是tf卡启动与nand启动的不同造成linux内核挂载根文件系统出错,所以需要修改开机启动脚本,即 *.rc文件 331 | 332 | device/softwinner/nuclear-evb/init.sun5i.rc 333 | device/softwinner/nuclear-evb/ueventd.sun5i.rc 334 | 335 | 将其中的nandX按下面对应关系修改 336 | 337 | nanda —— mmcblk0p2 338 | nandb —— mmcblk0p5 339 | nandc —— mmcblk0p6 340 | nandd —— mmcblk0p7 341 | nande —— mmcblk0p8 342 | nandf —— mmcblk0p9 343 | nandg —— mmcblk0p10 344 | nandh —— mmcblk0p11 345 | nandi —— mmcblk0p12 346 | 347 | 其中有一句挂载剩余空间的替换也对应替换: 348 | 349 | ```shell 350 | #format_userdata /dev/block/nandj NUCLEAR 351 | exec /system/bin/busybox mount -t vfat /dev/block/mmcblk0p1 /mnt/sdcard 352 | ``` 353 | 354 | 再修改vold.fstab,开机挂载方式,前面两行改成以下,即sd卡0作为sdcard,sd卡2作为外置sd卡 355 | 356 | ```shell 357 | dev_mount sdcard /mnt/sdcard auto /devices/platform/sunxi-mmc.0/mmc_host 358 | dev_mount extsd /mnt/extsd auto /devices/platform/sunxi-mmc.2/mmc_host 359 | ``` 360 | 361 | 如果需要修改成sd卡2启动,则还需要修改uboot代码 362 | lichee\u-boot\include\configs中sun5i.a13.h文件中的卡启动定义 363 | #define CONFIG_MMC_SUNXI_SLOT 2 364 | 365 | 最后修改uboot的环境变量`env.cfg`(lichee/tools/pack/chips/sun5i/configs/android/default/env.cfg) 366 | 367 | 将mmc作为启动介质 368 | 369 | ```shell 370 | bootdelay=1 371 | #default bootcmd, will change at runtime according to key press 372 | bootcmd=run setargs_mmc boot_normal#default nand boot 373 | #kernel command arguments 374 | console=ttyS0,115200 375 | nand_root=/dev/system 376 | mmc_root=/dev/mmcblk0p7 377 | init=/init 378 | loglevel=6 379 | #set kernel cmdline if boot.img or recovery.img has no cmdline we will use this 380 | setargs_nand=setenv bootargs console=${console} root=${nand_root} init=${init} loglevel=${loglevel} partitions=${partitions} 381 | setargs_mmc=setenv bootargs console=${console} root=${mmc_root} init=${init} loglevel=${loglevel} partitions=${partitions} 382 | #nand command syntax: sunxi_flash read address partition_name read_bytes 383 | #0x40007800 = 0x40008000(kernel entry) - 0x800(boot.img header 2k) 384 | boot_normal=sunxi_flash read 40007800 boot;boota 40007800 385 | boot_recovery=sunxi_flash read 40007800 recovery;boota 40007800 386 | boot_fastboot=fastboot 387 | #recovery key 388 | recovery_key_value_max=0x13 389 | recovery_key_value_min=0x10 390 | #fastboot key 391 | fastboot_key_value_max=0x8 392 | fastboot_key_value_min=0x2 393 | ``` 394 | 395 | 修改完成后重新编译下安卓 396 | 397 | 为了省事,可以不下载整个镜像,只更新boot.fex和env.fex(lichee/tools/pack/out下) 398 | 399 | 在linux下,使用fdisk -l查看tf卡分区: 400 | 401 | ```c 402 | Device Boot Start End Blocks Id System 403 | /dev/sdb1 3448832 15595518 6073343+ b W95 FAT32 //剩余空间作为u盘 404 | /dev/sdb2 * 73728 106495 16384 6 FAT16 //bootfs,含uboot 405 | /dev/sdb3 1 3448832 1724416 85 Linux extended 406 | /dev/sdb5 106496 139263 16384 83 Linux //env.fex 407 | /dev/sdb6 139264 204799 32768 83 Linux //boot.fex,含linux内核及ramdisk 408 | /dev/sdb7 204800 1253375 524288 83 Linux //system分区 409 | /dev/sdb8 1253376 2301951 524288 83 Linux //data分区 410 | /dev/sdb9 2301952 2334719 16384 83 Linux //misc分区 411 | /dev/sdb10 2334720 2400255 32768 83 Linux //recovery分区 412 | /dev/sdb11 2400256 2924543 262144 83 Linux //cache分区 413 | /dev/sdb12 2924544 3448831 262144 83 Linux //databk分区 414 | ``` 415 | 416 | 所以只需更新两个分区: 417 | 418 | ```shell 419 | root@ubuntu64:/home/zp# dd if=env.fex of=/dev/sdb5 420 | 256+0 records in 421 | 256+0 records out 422 | 131072 bytes (131 kB) copied, 0.097856 s, 1.3 MB/s 423 | root@ubuntu64:/home/zp# dd if=boot.fex of=/dev/sdb6 424 | 19916+0 records in 425 | 19916+0 records out 426 | 10196992 bytes (10 MB) copied, 8.54376 s, 1.2 MB/s 427 | root@ubuntu64:/home/zp# sync 428 | ``` 429 | 430 | 更新之后即可成功进入到安卓系统~ 431 | 432 | ![](https://box.kancloud.cn/488a185c2d50f3f7447efb621d4d836e_2976x3968.jpg) 433 | 434 | 虽然此时可以进入系统,但是很多外设不能运行,这些外设的驱动适配见后面的外设适配解析。 435 | -------------------------------------------------------------------------------- /教程文档/安卓适配/codec&Audio.md: -------------------------------------------------------------------------------- 1 | # codec适配及Audio系统解析 2 | 3 | ## codec适配 4 | 5 | 启动后耳机及mic无反应,开始绕了个大圈看了遍安卓的Audio系统,结果从最上层查到最底层,发现原因不过是fex没写全而已: 6 | 7 | [audio_para] 8 | audio_used = 1 9 | audio_playback_used = 1 10 | capture_used = 1 11 | audio_lr_change = 0 12 | audio_pa_ctrl = port:PG0<1><0> 13 | 14 | 加上audio_pa_ctrl的配置即可,这里使用了空闲引脚PG0,实际上没有接PA,也可以直接改驱动源码来支持不接PA,不过比较麻烦,就直接拿个空闲引脚凑数了。 15 | 16 | ## Audio系统解析 17 | 18 | 暂待更新 19 | -------------------------------------------------------------------------------- /教程文档/安卓适配/contents.rst: -------------------------------------------------------------------------------- 1 | 安卓系统适配全解析 2 | ====================== 3 | 4 | .. toctree:: 5 | 6 | 安卓编译系统解析 7 | codec适配及Audio系统解析 8 | wifi模块适配 9 | usb适配简记 10 | UART适配 11 | -------------------------------------------------------------------------------- /教程文档/安卓适配/uart_module.md: -------------------------------------------------------------------------------- 1 | # UART适配 2 | 3 | ## linux 下适配 4 | 5 | 使用默认编译的安卓系统,ls /dev可以看到 ttyS0~3 6 | 7 | 尝试`echo 'test' > /dev/ttyS0`可以在串口终端看到test字符,说明uart1就是ttyS0 8 | 9 | 荔枝派上除了默认的uart1是系统log输出口外,uart0与sdc0复用,不方便使用,就剩uart3可以使用。 10 | 11 | linux下使用stty设置串口参数: 12 | 13 | stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 14 | 15 | 但是发现对ttyS0之外的串口操作会返回:`stty: /dev/ttyS1: Input/output error` 16 | 17 | 在linux的驱动目录下找到相关文件:`tty/serial/8250_sunxi.c` 18 | 19 | ```c 20 | struct platform_device sw_uart_dev[] = { 21 | [0] = {.name = "sunxi-uart", .id = 0, .num_resources = ARRAY_SIZE(sw_uart_res[0]), .resource = &sw_uart_res[0][0], .dev = {}}, 22 | ...... 23 | }; 24 | 25 | static int __init sw_serial_init(void) 26 | { 27 | int ret; 28 | int i; 29 | int used = 0; 30 | char uart_para[16]; 31 | 32 | memset(sw_serial, 0, sizeof(sw_serial)); 33 | uart_used = 0; 34 | for (i=0; iport_no = dev->id; 64 | sport->pdev = dev; 65 | 66 | ret = sw_serial_get_config(sport, dev->id); 67 | if (ret) { 68 | UART_MSG(KERN_ERR "Failed to get config information\n"); 69 | goto free_dev; 70 | } 71 | 72 | ret = sw_serial_get_resource(sport); 73 | if (ret) { 74 | UART_MSG(KERN_ERR "Failed to get resource\n"); 75 | goto free_dev; 76 | } 77 | platform_set_drvdata(dev, sport); 78 | 79 | sport->port.irq = sport->irq; 80 | sport->port.fifosize= 64; 81 | sport->port.regshift= 2; 82 | sport->port.iotype = UPIO_DWAPB32; 83 | sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF; 84 | sport->port.uartclk = sport->sclk; 85 | sport->port.pm = sw_serial_pm; 86 | sport->port.dev = &dev->dev; 87 | 88 | sport->port.mapbase = sport->mmres->start; 89 | sw_serial[sport->port_no] = serial8250_register_port(&sport->port); //注册端口 90 | UART_MSG("serial probe %d, membase %p irq %d mapbase 0x%08x\n", 91 | dev->id, sport->port.membase, sport->port.irq, sport->port.mapbase); 92 | UART_MSG("sport->pdev is %x \n &sport->pdev is %x",sport->pdev,&sport->pdev); 93 | UART_MSG("pdev.dev is %x \n &pdev.dev is %x",sport->pdev->dev,&sport->pdev->dev); 94 | UART_MSG("dev.dev is %x \n &dev.dev is %x",dev->dev,&dev->dev); 95 | return 0; 96 | free_dev: 97 | kfree(sport); 98 | sport = NULL; 99 | return ret; 100 | } 101 | ``` 102 | 103 | .config 104 | 105 | ```shell 106 | CONFIG_SERIAL_8250=y 107 | CONFIG_SERIAL_8250_CONSOLE=y 108 | CONFIG_SERIAL_8250_SUNXI=y 109 | CONFIG_SERIAL_8250_NR_UARTS=4 110 | CONFIG_SERIAL_8250_RUNTIME_UARTS=4 111 | ``` 112 | 113 | 8250.c 114 | 115 | ```c 116 | #define UART_NR CONFIG_SERIAL_8250_NR_UA RTS 117 | static unsigned int nr_uarts = CONFIG_SERIAL_8250_RUNTIME_UARTS; 118 | 119 | int serial8250_register_port(struct uart_port *port) 120 | { 121 | struct uart_8250_port *uart; 122 | int ret = -ENOSPC; 123 | 124 | if (port->uartclk == 0) 125 | return -EINVAL; 126 | 127 | mutex_lock(&serial_mutex); 128 | 129 | uart = serial8250_find_match_or_unused(port); 130 | if (uart) { 131 | uart_remove_one_port(&serial8250_reg, &uart->port); 132 | uart->port.iobase = port->iobase; 133 | uart->port.membase = port->membase; 134 | uart->port.irq = port->irq; 135 | uart->port.irqflags = port->irqflags; 136 | uart->port.uartclk = port->uartclk; 137 | uart->port.fifosize = port->fifosize; 138 | uart->port.regshift = port->regshift; 139 | uart->port.iotype = port->iotype; 140 | uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; 141 | uart->port.mapbase = port->mapbase; 142 | uart->port.private_data = port->private_data; 143 | if (port->dev) 144 | uart->port.dev = port->dev; 145 | 146 | if (port->flags & UPF_FIXED_TYPE) 147 | serial8250_init_fixed_type_port(uart, port->type); 148 | 149 | set_io_from_upio(&uart->port); 150 | /* Possibly override default I/O functions. */ 151 | uart->port.flags = port->flags | UPF_BOOT_AUTOCONF; 152 | uart->port.mapbase = port->mapbase; 153 | uart->port.private_data = port->private_data; 154 | if (port->dev) 155 | uart->port.dev = port->dev; 156 | 157 | if (port->flags & UPF_FIXED_TYPE) 158 | serial8250_init_fixed_type_port(uart, port->type); 159 | 160 | set_io_from_upio(&uart->port); 161 | /* Possibly override default I/O functions. */ 162 | if (port->serial_in) 163 | uart->port.serial_in = port->serial_in; 164 | if (port->serial_out) 165 | uart->port.serial_out = port->serial_out; 166 | /* Possibly override set_termios call */ 167 | if (port->set_termios) 168 | uart->port.set_termios = port->set_termios; 169 | if (port->pm) 170 | uart->port.pm = port->pm; 171 | 172 | if (serial8250_isa_config != NULL) 173 | serial8250_isa_config(0, &uart->port, 174 | &uart->capabilities); 175 | 176 | ret = uart_add_one_port(&serial8250_reg, &uart->port); 177 | if (ret == 0) 178 | ret = uart->port.line; 179 | } 180 | mutex_unlock(&serial_mutex); 181 | 182 | return ret; 183 | } 184 | ``` 185 | 186 | serial_core.c 187 | 188 | ```c 189 | /** 190 | * uart_add_one_port - attach a driver-defined port structure 191 | * @drv: pointer to the uart low level driver structure for this port 192 | * @uport: uart port structure to use for this port. 193 | * 194 | * This allows the driver to register its own uart_port structure 195 | * with the core driver. The main purpose is to allow the low 196 | * level uart drivers to expand uart_port, rather than having yet 197 | * more levels of structures. 198 | */ 199 | int uart_add_one_port(struct uart_driver *drv, struct uart_port *uport) 200 | { 201 | struct uart_state *state; 202 | struct tty_port *port; 203 | int ret = 0; 204 | struct device *tty_dev; 205 | 206 | BUG_ON(in_interrupt()); 207 | 208 | if (uport->line >= drv->nr) 209 | return -EINVAL; 210 | 211 | state = drv->state + uport->line; 212 | port = &state->port; 213 | 214 | mutex_lock(&port_mutex); 215 | mutex_lock(&port->mutex); 216 | if (state->uart_port) { 217 | ret = -EINVAL; 218 | goto out; 219 | } 220 | state->uart_port = uport; 221 | state->pm_state = -1; 222 | 223 | uport->cons = drv->cons; 224 | uport->state = state; 225 | 226 | /* 227 | * If this port is a console, then the spinlock is already 228 | * initialised. 229 | */ 230 | if (!(uart_console(uport) && (uport->cons->flags & CON_ENABLED))) { 231 | spin_lock_init(&uport->lock); 232 | lockdep_set_class(&uport->lock, &port_lock_key); 233 | } 234 | 235 | uart_configure_port(drv, state, uport); 236 | 237 | /* 238 | * Register the port whether it's detected or not. This allows 239 | * setserial to be used to alter this ports parameters. 240 | */ 241 | tty_dev = tty_register_device(drv->tty_driver, uport->line, uport->dev); //最终注册设备 242 | if (likely(!IS_ERR(tty_dev))) { 243 | device_init_wakeup(tty_dev, 1); 244 | device_set_wakeup_enable(tty_dev, 0); 245 | } else 246 | printk(KERN_ERR "Cannot register tty device on line %d\n", 247 | uport->line); 248 | /* 249 | * Ensure UPF_DEAD is not set. 250 | */ 251 | uport->flags &= ~UPF_DEAD; 252 | 253 | out: 254 | mutex_unlock(&port->mutex); 255 | mutex_unlock(&port_mutex); 256 | 257 | return ret; 258 | } 259 | 260 | tty_io.c 261 | 262 | ```c 263 | struct device *tty_register_device(struct tty_driver *driver, unsigned index, 264 | struct device *device) 265 | { 266 | char name[64]; 267 | dev_t dev = MKDEV(driver->major, driver->minor_start) + index; 268 | 269 | if (index >= driver->num) { 270 | printk(KERN_ERR "Attempt to register invalid tty line number " 271 | " (%d).\n", index); 272 | return ERR_PTR(-EINVAL); 273 | } 274 | 275 | if (driver->type == TTY_DRIVER_TYPE_PTY) 276 | pty_line_name(driver, index, name); 277 | else 278 | tty_line_name(driver, index, name); 279 | 280 | return device_create(tty_class, device, dev, NULL, name); 281 | } 282 | EXPORT_SYMBOL(tty_register_device); 283 | 284 | static void tty_line_name(struct tty_driver *driver, int index, char *p) 285 | { 286 | sprintf(p, "%s%d", driver->name, index + driver->name_base); //最终的ttySx 287 | } 288 | ``` 289 | 290 | 大致的驱动加载过程就是上面这样 291 | 292 | 下面看下log信息: 293 | [ 0.158533] [uart]: used uart info.: 0x06 294 | [ 0.158563] [uart]: this coming sw_serial_probe 295 | [ 0.288179] [uart]: serial probe 1, membase (null) irq 2 mapbase 0x01c28400 296 | [ 0.295378] [uart]: sport->pdev is c08c4a08 297 | [ 0.295383] &sport->pdev is df04c2c8[uart]: pdev.dev is c08c4ad0 298 | [ 0.303155] &pdev.dev is c08c5680[uart]: dev.dev is c08c4ad0 299 | [ 0.309079] &dev.dev is c08c5680[uart]: this coming sw_serial_probe 300 | [ 0.318097] [uart]: <3>Failed to get config information 301 | [ 0.323344] sunxi-uart: probe of sunxi-uart.2 failed with error -1 302 | 303 | 可见uart1和uart3在获取fex时都被识别出来了,uart1成功probe,但是uart3 *“Failed to get config information”* 304 | 305 | uart3对应sw_uart_dev[2],即 306 | 307 | ```c 308 | ret = sw_serial_get_config(sport, dev->id); 309 | if (ret) { 310 | UART_MSG(KERN_ERR "Failed to get config information\n"); 311 | goto free_dev; 312 | } 313 | 314 | static int sw_serial_get_config(struct sw_serial_port *sport, u32 uart_id) 315 | { 316 | char uart_para[16] = {0}; 317 | int ret; 318 | 319 | sprintf(uart_para, "uart_para%d", uart_id); 320 | ret = script_parser_fetch(uart_para, "uart_port", &sport->port_no, sizeof(int)); 321 | if (ret) 322 | return -1; 323 | if (sport->port_no != uart_id) 324 | return -1; 325 | ret = script_parser_fetch(uart_para, "uart_type", &sport->pin_num, sizeof(int)); 326 | if (ret) 327 | return -1; 328 | 329 | return 0; 330 | } 331 | ``` 332 | 333 | 查看可知fex里的uart_port和uart_parax必须一一对应,所以就是fex里之前写错了,改正回来 334 | 335 | 这时查看ttyS1参数就有了: 336 | 337 | ```shell 338 | busybox stty -F /dev/ttyS1 339 | speed 9600 baud; 340 | intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = ; 341 | eol2 = ; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; 342 | lnext = ^V; flush = ^O; min = 1; time = 0; 343 | -brkint -imaxbel 344 | ``` 345 | 346 | 设置下波特率,并测试 347 | 348 | ```shell 349 | busybox stty -F /dev/ttyS1 ispeed 115200 ospeed 115200 350 | echo 'test' > /dev/ttyS1 351 | ``` 352 | 353 | 成功在uart3上收到数据~ 354 | -------------------------------------------------------------------------------- /教程文档/安卓适配/usb_module.md: -------------------------------------------------------------------------------- 1 | # usb适配简记 2 | 3 | ## usb调试信息太多,删减之 4 | 5 | ```shell 6 | [ 232.061924] [sw_hcd]: sw_hcd_urb_dequeue, sw_hcd(df8a28ec, 0x0, 0x3f),urb(dbd34f00, 1514, 0), dev = 3, ep = 2, dir = in 7 | [ 232.071179] sw_hcd_cleanup_urb: qh(0xd0df6e40,0x2,0x2), urb(0xdbd34f00,1514,0), ep(0xdf8a2a00,3,0xd0df6e40,0x (null)) 8 | ``` 9 | 10 | 出处在 11 | 12 | ```shell 13 | ./linux-3.0/drivers/usb/sun5i_usb/hcd/core/sw_hcd_host.c: DMSG_INFO("[sw_hcd]: sw_hcd_urb_dequeue, sw_hcd(%p, 0x%d, 0x%x)," 14 | ./linux-3.0/drivers/usb/sun5i_usb/hcd/core/sw_hcd_host.c: DMSG_INFO("sw_hcd_cleanup_urb: qh(0x%p,0x%x,0x%x), urb(0x%p,%d,%d), ep(0x%p,%d,0x%p,0x%p)\n", 15 | ``` 16 | 17 | 修改linux-3.0/drivers/usb/sun5i_usb/include/sw_usb_debug.h 18 | 19 | ```shell 20 | /* 普通信息打印 */ 21 | #if 0 22 | #define DMSG_INFO DMSG_PRINT 23 | #else 24 | #define DMSG_INFO(...) 25 | #endif 26 | ``` 27 | 28 | ## 3g网卡适配 29 | 30 | 安卓下开启3g网卡主要步骤是 31 | 32 | 1. 在驱动中勾选usb串口,pppd等 33 | 2. 调试通过usb_modeswitch, 模式切换后自动或者手动出现3个ttyUSBx设备 34 | 3. evdo脚本拨号 35 | 36 | ## 在内核配置里开启串口驱动,pppd驱动等 37 | 38 | `Device Drivers -> USB support -> USB Serial Converter support USB driver for GSM and CDMA modems` 39 | 40 | <*> PPP (point-to-point protocol) support 41 | [*] PPP multilink support (EXPERIMENTAL) 42 | [*] PPP filtering 43 | <*> PPP support for async serial ports 44 | <*> PPP support for sync tty ports 45 | <*> PPP Deflate compression 46 | <*> PPP BSD-Compress compression 47 | <*> PPP MPPE compression (encryption) (EXPERIMENTAL) 48 | <*> PPP over Ethernet (EXPERIMENTAL) 49 | <*> PPP over IPv4 (PPTP) (EXPERIMENTAL) 50 | <*> PPP over L2TP (EXPERIMENTAL) 51 | <*> PPP on L2TP Access Concentrator 52 | <*> PPP on PPTP Network Server 53 | 54 | 先在电脑上试着驱动3g网卡; 55 | 56 | 插上后查看内核信息: 57 | 58 | [ 8497.458906] usb 2-2.1: new full-speed USB device number 12 using uhci_hcd 59 | [ 8497.726318] usb 2-2.1: New USB device found, idVendor=1d09, idProduct=1000 60 | [ 8497.726323] usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 61 | [ 8497.726325] usb 2-2.1: Product: USB MMC Storage 62 | [ 8497.726327] usb 2-2.1: Manufacturer: Qualcomm, Incorporated 63 | [ 8497.726329] usb 2-2.1: SerialNumber: 000000000002 64 | [ 8497.729026] usb-storage 2-2.1:1.0: USB Mass Storage device detected 65 | [ 8497.729192] scsi host43: usb-storage 2-2.1:1.0 66 | [ 8498.732291] scsi 43:0:0:0: Direct-Access Qualcomm MMC Storage 2.31 PQ: 0 ANSI: 2 67 | [ 8498.738204] scsi 43:0:0:1: CD-ROM Qualcomm MMC Storage 2.31 PQ: 0 ANSI: 2 68 | [ 8498.741198] sd 43:0:0:0: Attached scsi generic sg3 type 0 69 | [ 8498.835612] sd 43:0:0:0: [sdb] Attached SCSI removable disk 70 | [ 8500.089041] sr 43:0:0:1: [sr2] scsi3-mmc drive: 357x/308x writer cdda 71 | [ 8500.089184] sr 43:0:0:1: Attached scsi CD-ROM sr2 72 | [ 8500.089287] sr 43:0:0:1: Attached scsi generic sg4 type 5 73 | [ 8500.361385] sr 43:0:0:1: [sr2] CDROM (ioctl) error, command: 74 | [ 8500.361391] Xpwrite, Read disk info 51 00 00 00 00 00 00 00 02 00 75 | [ 8500.361395] sr 43:0:0:1: [sr2] Sense Key : Hardware Error [current] 76 | [ 8500.361397] sr 43:0:0:1: [sr2] Add. Sense: No additional sense information 77 | 78 | lsusb看网卡型号: 79 | 80 | > Bus 002 Device 007: ID 1d09:1000 TechFaith Wireless Technology Limited 81 | 82 | 可以看到被识别成了安装光盘,sr2,手动弹出光盘后就变为正常的设备: `eject sr2` 83 | 84 | //有些网卡需要发送特别的指令,需要使用usb_modeswitch切换模式 85 | 86 | > Bus 002 Device 013: ID 1d09:e003 TechFaith Wireless Technology Limited 87 | 88 | 这就和usb_modeswitch的效果一样 89 | 90 | [ 8662.455084] usb 2-2.1: USB disconnect, device number 12 91 | [ 8666.948103] usb 2-2.1: new full-speed USB device number 13 using uhci_hcd 92 | [ 8667.220302] usb 2-2.1: New USB device found, idVendor=1d09, idProduct=e003 93 | [ 8667.220305] usb 2-2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4 94 | [ 8667.220307] usb 2-2.1: Product: CDMA 1x/EVDO Rev.A Device 95 | [ 8667.220309] usb 2-2.1: Manufacturer: Co.,Ltd 96 | [ 8667.220310] usb 2-2.1: SerialNumber: 000000000002 97 | [ 8667.240512] usb-storage 2-2.1:1.3: USB Mass Storage device detected 98 | [ 8667.246943] scsi host44: usb-storage 2-2.1:1.3 99 | [ 8668.253167] scsi 44:0:0:0: Direct-Access Qualcomm MMC Storage 2.31 PQ: 0 ANSI: 2 100 | [ 8668.255704] sd 44:0:0:0: Attached scsi generic sg3 type 0 101 | [ 8668.271240] sd 44:0:0:0: [sdb] Attached SCSI removable disk 102 | 103 | ```eval_rst 104 | .. tip:: PID=0x1D09, VID=0xe0003 105 | ``` 106 | 107 | 在`drivers/usb/serial/option.c`里加入PID,VID(转换后的) 108 | 109 | ```c 110 | //发现华为一个型号的PID一样。。 111 | #define HUAWEI_PRODUCT_ET128 0x1D09 112 | #define HUAWEI_VENDOR_ID 0x12D1 113 | //自己加一个吧 114 | 595 static const struct usb_device_id option_ids[] = { 115 | 596 { USB_DEVICE(0xe0003, 0x1d09) }, //ID 1d09:1000 TechFaith Wireless Technology Limited 116 | ``` 117 | 118 | Device Monitoring Studio抓取3G网卡MessageContent 119 | 120 | http://blog.chinaunix.net/uid-29764914-id-5181529.html 121 | 122 | usb_modeswitch的使用(新版下的规则文件下载) 123 | 124 | http://blog.csdn.net/yang1982_0907/article/details/45969179 125 | 126 | 但是切换后仍然没有ttyUSBx, 需要手工增加: 127 | 128 | ```shell 129 | modprobe usb_wwan 130 | modprobe option 131 | echo "1d09 e003" > /sys/bus/usb-serial/drivers/option1/new_id 132 | ``` 133 | 134 | 运行后出现了ttyUSB0~2 135 | 可以将它加入到udev规则中,在/lib/udev/rules.d/50-udev-default.rules(也可能再etc目录中)后面添加 136 | 137 | ACTION=="add", SUBSYSTEM=="usb",SYSFS{idVendor}=="1d09", SYSFS{idProduct}=="1000", 138 | RUN+="/usr/sbin/usb_modeswitch -c /etc/usb_modeswitch.conf" 139 | RUN+="echo '1d09 e003' > /sys/bus/usb-serial/drivers/option1/new_id" 140 | 141 | //安卓下已经自带 142 | 143 | ```shell 144 | vim /etc/usb_modeswitch.d/1d09_1000 145 | DefaultVendor= 0x1d09 146 | DefaultProduct= 0x1000 147 | 148 | TargetVendor= 0x1d09 149 | TargetProduct= 0xe003 150 | 151 | StandardEject=1 152 | CheckSuccess= 10 #wait 10s 153 | ``` 154 | 155 | 然后进行拨号,在`/etc/ppp/peers`目录下创建新文件evdo: 156 | 157 | ```shell 158 | mkdir /etc/ppp/peers/ 159 | busybox vi /etc/ppp/peers/evdo 160 | /dev/ttyUSB0 161 | 115200 162 | nodetach 163 | lock 164 | user "ctnet@mycdma.cn" 165 | password "vnet.mobi" 166 | crtscts 167 | show-password 168 | usepeerdns 169 | noauth 170 | noipdefault 171 | novj 172 | novjccomp 173 | noccp 174 | defaultroute 175 | ipcp-accept-local 176 | ipcp-accept-remote 177 | connect '/usr/sbin/chat -s -v -f /etc/ppp/peers/evdo-connect-chat' 178 | #connect '/system/bin/chat -s -v -f /etc/ppp/peers/evdo-connect-chat' #android 179 | ``` 180 | 181 | 再创建**evdo-connect-chat** 182 | 183 | `busybox vi /etc/ppp/peers/evdo-connect-chat` 184 | 185 | ```shell 186 | TIMEOUT 2 187 | ABORT 'NO CARRIER' 188 | ABORT 'ERROR' 189 | ABORT 'NO DIALTONE' 190 | ABORT 'BUSY' 191 | ABORT 'NO ANSWER' 192 | "" ATE1 193 | "" "AT+CFUN=1" 194 | OK-AT-OK ATD#777 195 | CONNECT '' 196 | ``` 197 | 198 | 输入命令**pppd call evdo&**就可以上网了,断开网络就输入poff。 199 | 200 | 输出的拨号信息: 201 | 202 | ```shell 203 | pppd call evdo 204 | timeout set to 2 seconds 205 | abort on (NO CARRIER) 206 | abort on (ERROR) 207 | abort on (NO DIALTONE) 208 | abort on (BUSY) 209 | abort on (NO ANSWER) 210 | send (ATE1^M) 211 | send (AT+CFUN=1^M) 212 | expect (OK) 213 | ^M 214 | OK 215 | -- got it 216 | 217 | send (ATD#777^M) 218 | expect (CONNECT) 219 | ^M 220 | AT+CFUN=1^M^M 221 | OK^M 222 | ATD#777^M^M 223 | CONNECT 224 | -- got it 225 | 226 | send (^M) 227 | Serial connection established. 228 | Using interface ppp0 229 | Connect: ppp0 <--> /dev/ttyUSB0 230 | CHAP authentication succeeded: OK 231 | CHAP authentication succeeded 232 | local IP address 10.100.35.16 233 | remote IP address 125.88.103.85 234 | primary DNS address 114.114.114.114 235 | secondary DNS address 223.5.5.5 236 | 237 | 238 | ^CTerminating on signal 2 239 | Connect time 0.2 minutes. 240 | Sent 355 bytes, received 126 bytes. 241 | Connection terminated. 242 | ``` 243 | 244 | ### 安卓上驱动 245 | 246 | 安卓上串口和dmesg的信息有限,主要看logcat 247 | 248 | 首次尝试pppd call evdo,log信息如下: 249 | 250 | `pppd ( 1230): Can't create lock file /var/lock/LCK..ttyUSB0` 251 | 252 | 排查发现根本没有/var/lock目录,于是新建/var/run和/var/lock目录 253 | 254 | mkdir /var 255 | mkdir /var/run 256 | mkdir /var/lock 257 | 258 | 重新拨号,dmesg提示: 259 | 260 | timeout set to 2 seconds 261 | abort on (NO CARRIER) 262 | abort on (ERROR) 263 | abort on (NO DIALTONE) 264 | abort on (BUSY) 265 | abort on (NO ANSWER) 266 | send (ATE1^M) 267 | send (AT+CFUN=1^M) 268 | expect (OK) 269 | ATE1^M^M 270 | OK 271 | -- got it 272 | 273 | send (ATD#777^M) 274 | expect (CONNECT) 275 | ^M 276 | AT+CFUN=1^M^M 277 | OK^M 278 | ATD#777^M^M 279 | CONNECT 280 | -- got it 281 | 282 | send (^M) 283 | 284 | logcat -v time提示 285 | 286 | 01-02 08:01:51.419 I/pppd ( 1195): Serial connection established. 287 | 01-02 08:01:51.429 D/pppd ( 1195): using channel 1 288 | 01-02 08:01:51.479 I/pppd ( 1195): Using interface ppp0 289 | 01-02 08:01:51.479 I/pppd ( 1195): Connect: ppp0 <--> /dev/ttyUSB0 290 | 01-02 08:01:52.179 I/pppd ( 1195): CHAP authentication succeeded: OK 291 | 01-02 08:01:52.299 I/pppd ( 1195): local IP address 10.100.34.51 292 | 01-02 08:01:52.299 I/pppd ( 1195): remote IP address 125.88.103.85 293 | 01-02 08:01:52.299 I/pppd ( 1195): primary DNS address 114.114.114.114 294 | 01-02 08:01:52.299 I/pppd ( 1195): secondary DNS address 223.5.5.5 295 | 296 | ifconfig可见ppp0设备: 297 | 298 | ppp0 Link encap:Point-to-Point Protocol 299 | inet addr:10.100.46.132 P-t-P:125.88.103.85 Mask:255.255.255.255 300 | UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1430 Metric:1 301 | RX packets:3 errors:0 dropped:0 overruns:0 frame:0 302 | TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 303 | collisions:0 txqueuelen:3 304 | RX bytes:54 (54.0 B) TX bytes:54 (54.0 B) 305 | 306 | 此时已经可以ping 通`114.114.114.114`,但无法解析域名 307 | 308 | ```shell 309 | busybox vi init.sun5i.rc 310 | setprop "net.dns1" "8.8.8.8" 311 | setprop "net.dns2" "8.8.4.4" 312 | ``` 313 | 314 | ### 安卓上3g网卡自动加载总结 315 | 316 | 0. 切换上网卡状态(/etc/usb_modeswitch.d/1d09_1000自动完成) 317 | 318 | 创建ttyUSB0等串口 319 | 320 | `echo "1d09 e003" > /sys/bus/usb-serial/drivers/option1/new_id` 321 | 322 | `/etc/ppp/peers/evdo /etc/ppp/peers/evdo-connect-chat` 拨号脚本(创建一次即可) 323 | 324 | `mkdir /var /var/run /var/lock` 创建临时目录 325 | 326 | `pppd call evdo&` 拨号上网,并设置dns 327 | 328 | 0已经自动完成 329 | 330 | 1. 需要在init.sun5i.rc里加上初始化 331 | 332 | on boot 333 | #echo "1d09 e003" > /sys/bus/usb-serial/drivers/option1/new_id //太早执行无效 334 | exec /system/bin/sh /system/etc/ppp.sh //这里延时到开机执行 335 | 336 | 2. 在sdk里加上对应的脚本 337 | 相关文件在`device/softwinner/common/rild`里,需要修改上层的`sw-common.mk`来拷贝文件到system分区 338 | 339 | ```shell 340 | PRODUCT_COPY_FILES += \ 341 | device/softwinner/common/rild/ip-down:system/etc/ppp/ip-down \ 342 | device/softwinner/common/rild/ip-up:system/etc/ppp/ip-up \ 343 | device/softwinner/common/rild/call-pppd:system/etc/ppp/call-pppd \ 344 | device/softwinner/common/rild/peers/evdo:system/etc/ppp/peers/evdo\ 345 | device/softwinner/common/rild/peers/evdo-connect-chat:system/etc/ppp/peers/evdo-connect-chat\ 346 | ``` 347 | 348 | 3. 需要在init.sun5i.rc里加上初始化 349 | 350 | ```shell 351 | mkdir /var 0770 root system 352 | mount tmpfs none /var mode=0770,uid=0,gid=1000 353 | mkdir /var/run 0750 root system 354 | mkdir /var/lock 0750 root system 355 | ``` 356 | 357 | 4. 需要在init.sun5i.rc里加上初始化 358 | 359 | ```shell 360 | service ppp /system/bin/pppd call evdo 361 | user root 362 | group system radio 363 | disabled 364 | oneshot 365 | setprop "net.dns1" "8.8.8.8" 366 | setprop "net.dns2" "8.8.4.4" 367 | ``` 368 | -------------------------------------------------------------------------------- /教程文档/安卓适配/wifi_module.md: -------------------------------------------------------------------------------- 1 | # RTL8723BU wifi模块适配 2 | 3 | ## linux驱动添加 4 | 5 | 安卓下使能外设驱动都需要先适配好linux下驱动,所以首先来编译linux驱动模块 6 | 7 | 1. 拷贝官方驱动(github的资源文件目录下下载)到lichee的linux驱动目录下 8 | 9 | ```shell 10 | zp@ubuntu:~/develop/a13_android4.1_v1.2/lichee$ ls linux-3.0/drivers/net/wireless/rtl8723bu/ 11 | clean core hal ifcfg-wlan0 include Kconfig Makefile os_dep platform runwpa wlan0dhcp 12 | ``` 13 | 14 | 2. 配置驱动Makefile以及Kconfig,然后在menuconfig里选中刚加入的驱动 15 | 16 | ```shell 17 | CONFIG_PLATFORM_ARM_SUNxI = y 18 | obj-$(CONFIG_RTL8723BU) += rtl8723bu/ 19 | source "drivers/net/wireless/rtl8723bu/Kconfig" 20 | Realtek 8723B USB WiFi 21 | ``` 22 | 23 | 3. 重新编译lichee,获得内核模块 24 | 25 | ```shell 26 | ./build.sh -p a13_nuclear -k 3.0 27 | zp@ubuntu:~/develop/a13_android4.1_v1.2/lichee$ ls out/android/lib/modules/3.0.8+/87* 28 | out/android/lib/modules/3.0.8+/8723bu.ko 29 | ``` 30 | 31 | 4. 修改wifi驱动,隐藏过多调试信息 32 | 33 | 前面这样生成的ko带有很多调试信息输出,以至于开启wifi模块时太慢,导致打开wifi超时,所以需要隐藏多余的信息。 34 | 编辑`linux-3.0/drivers/net/wireless/rtl8723bu/include/autoconf.h`,去掉DEBUG的相关宏定义。 35 | 36 | ## 安卓配置文件 37 | 38 | 1. 修改板级配置文件`device/softwinner/nuclear-evb/BoardConfig.mk` 39 | 40 | ```shell 41 | BOARD_WIFI_VENDOR := realtek 42 | ifeq ($(BOARD_WIFI_VENDOR), realtek) 43 | WPA_SUPPLICANT_VERSION := VER_0_8_X 44 | BOARD_WPA_SUPPLICANT_DRIVER := NL80211 45 | BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_rtl 46 | BOARD_HOSTAPD_DRIVER := NL80211 47 | BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_rtl 48 | 49 | SW_BOARD_USR_WIFI := rtl8723bu 50 | BOARD_WLAN_DEVICE := rtl8723bu 51 | endif 52 | ``` 53 | 54 | 2. 修改init启动脚本init.sun5i.rc 55 | 56 | ```shell 57 | # 1.1 realtek wifi sta service 58 | service wpa_supplicant /system/bin/wpa_supplicant -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -e/data/misc/wifi/entropy.bin 59 | class main 60 | socket wpa_wlan0 dgram 660 wifi wifi 61 | disabled 62 | oneshot 63 | 64 | # 1.2 realtek wifi sta p2p concurrent service 65 | service p2p_supplicant /system/bin/wpa_supplicant \ 66 | -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf -e/data/misc/wifi/entropy.bin -N \ 67 | -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf 68 | class main 69 | socket wpa_wlan0 dgram 660 wifi wifi 70 | disabled 71 | oneshot 72 | ``` 73 | 74 | 3. 修改安卓板级mk文件nuclear_evb.mk(蓝牙需要,wifi不用改) 75 | 76 | 4. 修改安卓hardware相关代码hardware/libhardware_legacy/wifi/wifi.c 77 | 78 | ```c 79 | #elif defined RTL_8723BU_WIFI_USED 80 | /* rtl8723bu usb wifi */ 81 | #ifndef WIFI_DRIVER_MODULE_PATH 82 | #define WIFI_DRIVER_MODULE_PATH "/system/vendor/modules/8723bu.ko" 83 | #endif 84 | #ifndef WIFI_DRIVER_MODULE_NAME 85 | #define WIFI_DRIVER_MODULE_NAME "8723bu" 86 | #endif 87 | 88 | #ifndef WIFI_DRIVER_MODULE_ARG 89 | #define WIFI_DRIVER_MODULE_ARG "ifname=wlan0 if2name=p2p0" 90 | ``` 91 | 92 | 5. wifi的安卓mk修改 93 | 94 | ```shell 95 | hardware/libhardware_legacy/wifi/Android.mk 96 | ifeq ($(SW_BOARD_USR_WIFI), rtl8723bu) 97 | LOCAL_CFLAGS += -DRTL_8723BU_WIFI_USED 98 | LOCAL_CFLAGS += -DRTL_WIFI_VENDOR 99 | endif 100 | ``` 101 | 102 | 6. wpa的安卓mk修改 103 | 104 | ```shell 105 | external/wpa_supplicant_8/wpa_supplicant/Android.mk 106 | ifeq ($(SW_BOARD_USR_WIFI), rtl8188eu) 107 | L_CFLAGS += -DCONFIG_WFD 108 | endif 109 | ``` 110 | 111 | 7. 重新编译安卓 112 | 113 | 实际需要更新的就只有libhardware_legacy.so和8723bu.ko,当然也可以打包整个镜像重新烧写。 114 | 115 | 以局部更新为例,挂载tf卡的QQA,拷贝so到`lib/libhardware_legacy.so` 116 | 117 | 拷贝ko到`vendor/modules` 118 | 119 | sync后启动即可 120 | -------------------------------------------------------------------------------- /教程文档/概览/contents.rst: -------------------------------------------------------------------------------- 1 | 荔枝派概览 2 | ======================== 3 | 4 | .. toctree:: 5 | :maxdepth: 2 6 | 7 | 荔枝派one资源汇总 8 | 开箱清单 9 | 开箱指南 10 | 开箱经历 11 | -------------------------------------------------------------------------------- /教程文档/概览/debian.md: -------------------------------------------------------------------------------- 1 | # tf镜像烧录解读 2 | 3 | ## 〇.背景 4 | 本文所属目录层次为: 5 | 6 | -> 2.系统移植 7 | -> 1.基于linux-sunxi SDK的系统移植 8 | -> 3. tf镜像烧录解读 9 | 10 | 时隔多日,连载帖重新开更了~ 11 | 现在部分朋友已经收到了荔枝派,这里先对荔枝派的镜像烧录进行解读 12 | (交流QQ群:573832310) 13 | 14 | ## 一.系统镜像组成 15 | 16 | TF卡或者其他存储介质中的系统镜像组成如下: 17 | 18 | 1. boot部分,含boot0和boot1/uboot 19 | 2. linux内核部分,含启动参数和fex配置 20 | 3. linux根文件系统 21 | > \**回想下在启动过程中这三个部分是如何串联起来的? 22 | 23 | ## 二.烧录boot部分镜像 24 | 将前面编译出的u-boot-sunxi-with-spl.bin烧录到tf 8KB偏移处 25 | 26 | (sdb换成你自己的tf卡读卡器设备名) 27 | 28 | ```shell 29 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 30 | sudo sync 31 | ``` 32 | 33 | > \*学习下dd命令的详细用法 34 | 35 | ## 三.烧录linux内核镜像 36 | 需要准备uImage,script.bin,boot.scr三个文件 37 | > \**回想下这三个文件的作用? 38 | 39 | 1. uImage 40 | 1. 使用linux-sunxi编译后可得到uImage 41 | 2. script.bin 42 | 1. 使用下面命令将fex转为bin 43 | 2. `fex2bin a13-lichee.fex script.bin` 44 | 3. 需要根据使用的摄像头型号修改对应的fex字段 45 | 3. boot.scr 46 | 1. 使用下面命令将boot.cmd转为boot.scr 47 | 2. `mkimage -C none -A arm -T script -d boot.cmd boot.scr` 48 | > \**查看fex文件和boot.cmd文件,理解各字段含义 49 | 50 | 这三个文件在uboot启动时会在第一分区搜索,所以需要新建一个TF卡分区(FAT格式),需要使用fdisk命令。 51 | > \*请自行学习fdisk命令 52 | 如果原来tf卡已经有分区表,请先清除分区。 53 | 烧录相关的脚本已上传至“**资源文件**”目录,可以查看其中的脚本命令。 54 | 一般来说,第一分区设为16MB大小就足够了。 55 | 然后格式化为FAT格式: 56 | `sudo mkfs.vfat /dev/sdb1` 57 | 最后放入前面提到的三个文件即可。 58 | 59 | ## 四.烧录linux根文件系统 60 | 61 | linux内核在启动时候会根据启动参数中的root参数来获得根文件系统分区号,然后加载之。 62 | 一般就按顺序把根文件系统设为第二分区,使用EXT3或者EXT4文件系统。 63 | 整个根文件系统有两种打包方式,dd方式和tar方式。 64 | dd方式是直接备份整个分区信息,tar方式是直接打包整个分区。 65 | dd出来的分区镜像可以直接使用mount命令在本机上加载查看,烧写速度也稍快些,所以荔枝派使用dd出来的镜像发布。 66 | 不过由于dd是备份了整个分区信息,所以连分区大小都是一致的,如果tf较大,可以自行扩容分区和文件系统 67 | > \* 自学linux下扩容分区和文件系统的方法 68 | 69 | ```shell 70 | dd if=fs2.img of=/dev/sdb2 bs=64K 71 | sync 72 | ``` 73 | 74 | ## 五.启动尝试 75 | 76 | 按上述方法准备好tf卡后,就可以尝试启动了! 77 | 把tf卡插入背面卡槽,有屏幕的插入屏幕(注意方向),有摄像头的插入摄像头(注意方向),再连上UART1(默认系统串口),上电。 78 | 正常情况就可以启动到debian系统了~ 79 | 80 | > \** 给出的镜像是出厂测试镜像,屏蔽了桌面系统,想开机启动桌面系统的可以尝试修改下 81 | 82 | 提供的镜像有两个用户lichee和root,密码均为lichee。 83 | 在“**资源文件**”目录下,有烧写相关的文件和脚本(脚本还未整理,比较乱,不过也可以参考使用) 84 | -------------------------------------------------------------------------------- /教程文档/概览/go_through.rst: -------------------------------------------------------------------------------- 1 | 开箱经历 2 | ============= 3 | 4 | 谁都会有个第一次 5 | -------------------- 6 | 7 | wifi/显示屏/摄像头版到货,怀着激动地心情打开,最快速的插上屏幕,插上摄像头,找了个手机充电器电源上电,RGBLED一闪,我还以为会有什么其他的呢,然而并没有。 8 | 9 | 安卓镜像烧写 10 | -------------------- 11 | 12 | 首先进行的是安卓镜像的傻瓜是烧写,目的检测收到的荔枝皮一切都正常。烧写群主提供的镜像文件安4.1版本,启动成功,然而wifi打不开。以为是wifi有问题呢,群里一问,原来wifi驱动不对头,群里还有共享wifi驱动补丁,所幸下载写来,突然感觉我等之菜竟然不会装驱动。好吧!群主的话把所有的坑都自己经历一遍这就是在进步,怀揣这句话,打开百度。。。经过各种搜索,,,一切的线索都指向了adb调试。给电脑装好adb驱动,荔枝派开机连上数据线,电脑设备管理器应该有adb设备了,好吧 有点啰嗦,进入cmd调试查找设备(自行百度),然后链接adb shell寻找驱动所在地,,这么多文件夹,,,皇天不负,,笨办法也能找到。替换文件,wifi就这么打开了。好累一晚上就干了点这个。装上哔哩哔哩看了一集海贼王睡觉。 13 | 14 | Linux镜像烧录 15 | -------------------- 16 | 17 | 打开群主debian烧录指南,自行学习dd命令,其实就看了群主提供命令那句话的意思。 18 | 19 | sunxi boot镜像烧写 20 | ~~~~~~~~~~~~~~~~~~~~ 21 | 22 | .. code-block:: shell 23 | 24 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 25 | sudo sync 26 | 27 | bs代表一次写入多大的块,(blocksize的缩写),if参数为下载的镜像的路径(应该是input file缩写),of后参数为设备地址(应该是output file的缩写),sync是同步数据的意思,加了sync,那么dd写的东西会直接写入你的/dev/sdb设备中,不加的话可能会先缓存一下。加了sync保障数据完整性 28 | 命令准备好了,然而还不知道sd卡挂载名 好吧 继续命令:``ls /dev/sd×`` 插不插sd卡可以看出有什么新设备,``df -h`` 命令也可以,可以看看有什么不同。找到设备写入上面的 ``u-boot-sunxi-with-spl.bin`` 29 | 30 | SD卡分区 31 | ~~~~~~~~~~~~~~~~~~~~ 32 | 33 | 下一步就是linux内核镜像了,需要给sd分区,自行学习linux分区命令 fdisk,另外参考了群主的shell命令脚本,虽然没有备注,帮助还是很大的,首先是clear_partion.sh,清除sd卡分区。然后是 ``write_partion.sh``,新建两个分区 第一分区16M,第二分区系统默认。``write_mkfs.sh``,格式化第一分区为fat,格式化地二分区为ext4。 34 | 35 | 内核镜像 36 | ~~~~~~~~~~~~~~~~~~~~ 37 | 38 | 分区准备好了就要往里写文件啦,,,文件也需要自行转化下,呃,fex2bin ,怎么找不到呢,怎么找不到呢,,,继续百度,,原来还得编译sunxi-tools,幸好之前把这些文件都准备好了,,直接make得到fex2bin,用命令 ``./fex2bin a13-lichee.fex script.bin`` 39 | 得到script.bin二进制配置文件。摄像头字段先不改了,主要还不知道改哪里。 40 | 按群主提示: ``mkimage -C none -A arm -T script -d boot.cmd boot.scr`` 得到boot.scr 41 | 好吧这三个文件终于全了,还是根据群主的shell命令脚本提示把这三个文件搞进去。 42 | 43 | 根文件系统烧写 44 | ~~~~~~~~~~~~~~~~~~~~ 45 | 46 | .. code-block:: shell 47 | 48 | dd if=fs2.img of=/dev/sdb2 bs=64K 49 | sync 50 | 51 | 这个命令敲完回车后可能要等五六分钟,,不要以为死机了啊,我差点就等不及关了。 52 | 53 | 启动啦 54 | ~~~~~~~~~~~~~~~~~~~~ 55 | 56 | sd卡现在准备好了,插卡准备启动吧,插卡上电,,,屏幕出现一大堆信息,看不过来,不过最后貌似启动成功了,,wifi OK !后边还有两个错误USBA ERR!/OTG detect ERR!好吧 linux下的串口我还不会用,,,度了后知道有个minicom的东西。 57 | 好吧继续学习怎么配置minicom,这东东竟然需要root权限,我的是usb转串口 58 | 59 | .. code-block:: irc 60 | 61 | Welcome to minicom 2.7 62 | OPTI+-----------------------------------------------------------------------+ 63 | Comp| A - Serial Device : /dev/ttyUSB0 | 64 | Port| B - Lockfile Location : /var/lock | 65 | | C - Callin Program : | 66 | Pres| D - Callout Program : | 67 | | E - Bps/Par/Bits : 115200 8N1 | 68 | | F - Hardware Flow Control : No | 69 | | G - Software Flow Control : No | 70 | | | 71 | | Change which setting? | 72 | 73 | 也就这样了。重启系统打印了好长一串东西,,,群文件有正常启动的log信息。 74 | 启动完了,启动完了,还能干啥??? 75 | 启动完成后,按一下键盘回车,荔枝派串口打印: ``root@Lichee:~#`` 76 | 到此成功了。。。下一步就是进入桌面系统了。。。我也没进去呢,哈哈哈 -------------------------------------------------------------------------------- /教程文档/概览/guide.rst: -------------------------------------------------------------------------------- 1 | 开箱指南 2 | ============ 3 | 4 | 供电接口 5 | ------------ 6 | 7 | 荔枝派有多种供电方式,如下图所示 8 | 9 | - J10:供电micro usb 口(调试时推荐使用此口供电) 10 | - J7: 锂电池供电接口 11 | - J5:otg 供电口 12 | - J10右边:2.54插针的5V供电口 13 | 14 | .. image:: ../_static/概览/5.guide.png 15 | 16 | 上电测试步骤 17 | ------------------ 18 | 19 | 1. 准备一张2G以上容量的tf卡 20 | #. 焊接双排针,其中调试串口为UART1 21 | #. 不接串口,不插卡,使用左侧J10上电,观察全彩LED 22 | 23 | .. note:: 如果LED上电后闪烁一次则表示CPU正常复位,否则请跳转到文末的故障处理 24 | 25 | #. 到网盘下载测试用安卓镜像:链接: http://pan.baidu.com/s/1c4gztvE 26 | 27 | PhoenixCard为烧录工具,在其中选择卡启动,然后指定下面的镜像文件即可。 28 | 29 | .. image:: ../_static/概览/6.guide.png 30 | 31 | #. 烧录好镜像后,将tf卡插入背面卡槽,有液晶屏或者VGA转接板的可以接上,没有的可以接上串口 32 | #. 同样使用J10上电,观察屏幕或者串口输出 33 | 34 | .. note:: 正常来说可以进入到安卓界面,串口里可以进入到安卓终端,如果出现问题则查看文末故障处理 35 | 36 | .. image:: ../_static/概览/7.guide.jpg 37 | :height: 800px 38 | 39 | debian烧录指南 40 | --------------------- 41 | 42 | 搬运自 tf镜像烧录解读_。 43 | 44 | .. _tf镜像烧录解读: https://github.com/Zepan/ilichee/blob/master/%E8%BF%9E%E8%BD%BD%E5%B8%96/2.1.3%20tf%E9%95%9C%E5%83%8F%E7%83%A7%E5%BD%95%E8%A7%A3%E8%AF%BB.md 45 | 46 | .. literalinclude:: debian.md 47 | :linenos: 48 | 49 | 常见故障处理 50 | --------------- 51 | 52 | 1. 不插卡上电,LED不闪烁 53 | 54 | - 表明CPU未正常复位,主要原因可能是CPU虚焊 或者 PMU虚焊 55 | - 尝试用手指用力按压CPU或PMU,上电,若LED可以闪烁 则是相应元件虚焊,给予补焊即可 56 | 57 | - 可以用手指按压CPU不同角落来判断虚焊点 58 | 59 | - 若仍然不闪烁 ,测量下板上DC2和Vcc测试点的电压,正常应该为1.2V及3.4V,若不正常,则补焊PMU 60 | - 主要手段是补焊CPU和PMU,如果尝试后都不行,则联系群主更换。 61 | 62 | #. 待反馈添加 -------------------------------------------------------------------------------- /教程文档/概览/list.rst: -------------------------------------------------------------------------------- 1 | 开箱清单 2 | ========= 3 | 4 | 荔枝派主板及相关配件如下,请对照自己的购买清单清点: 5 | 6 | - 荔枝派主板 7 | + 分为板载wifi版和板载USB版,二者互斥,所以选择wifi版的板子上是没有焊USB母座的,请知悉。 8 | + 主板上默认没有焊接双排插针,请自己动手焊接 9 | 10 | - *此处应有对比图片,请好心人补充。。* 11 | 12 | - 板载wifi 13 | + 默认板载wifi模块是RTL8723BU模块,支持WIFI+BT4.0双模 14 | + 天线接口是IPEX座子,配有一根PCB软天线或者铜棒天线 15 | + 天线座前面的pi型匹配电路有一个电容是NC的,不是掉了,请知悉。 16 | + *此处应有图片,请好心人补充。。* 17 | 18 | - 摄像头模组 19 | + 摄像头模组有OV7670(30W)和OV2640(200W)两种,外型上来说,OV7670摄像头更薄,OV2640摄像头更厚 20 | + .. image:: ../_static/概览/2.list.png 21 | :width: 400px 22 | + .. image:: ../_static/概览/3.list.png 23 | :width: 400px 24 | + 两种摄像头的供电电源不同(2640的一路电源是1.3V,而7670的一路是1.8V),虽然实测并不会对摄像头造成永久性损伤,但还是建议在没有配置好正确的电源前不要插上摄像头 25 | + **摄像头模组很小,请收货时注意不要乱丢包装,可能会被卡在包装盒中** 26 | + .. image:: ../_static/概览/4.list.png 27 | :width: 400px 28 | + 摄像头插入方向 : FPC座为下接,摄像头朝正面插入 29 | 30 | - LCD屏 31 | + 目前配件中的屏幕是5寸和6寸的40P RGB屏,分辨率800*480 32 | + 由于近期屏幕价格飞涨,配备的是拆机屏,屏幕边框及排线上可能附着屏蔽用铝箔纸,请知悉。<发货的是品相较好无锈痕的,群主还剩下一堆战斗橙色的屏幕,价格好商量> 33 | + 屏幕插入方向:FPC座同样是下接的,屏幕朝正面插入 34 | 35 | - VGA转接板 36 | + vga转接板与荔枝派主板使用FPC软排线连接,FPC座子都是下接的。 37 | + 连接完成后,使用VGA线接到显示器即可显示,注意屏幕分辨率等参数需要在fex中设置 38 | 39 | - 亚克力外壳 40 | + 亚克力外壳使用4组螺柱螺母固定板子 41 | - > 此处应有图片 42 | 43 | - OTG转接头 44 | + 用于将OTG口转为 USB-A母口 45 | 46 | - USB HUB+网口模块 47 | + 可以拓展3个USB口和一个以太网口,免驱 48 | 49 | **需要另配的配件** 50 | 51 | - tf卡 52 | + 系统是存储在tf中的,不插卡是不能启动系统的 53 | - 耳机 54 | + 荔枝派使用的耳机是美式耳机标准,不同标准的耳机可能mic不会工作,详见荔枝派 原理图_。 55 | 56 | .. _原理图: https://github.com/Zepan/ilichee/blob/master/%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6/Lichee%E5%8E%9F%E7%90%86%E5%9B%BE.pdf -------------------------------------------------------------------------------- /教程文档/概览/resource.rst: -------------------------------------------------------------------------------- 1 | 荔枝派资源汇总 2 | ============================== 3 | 4 | github项目主页:https://github.com/Zepan/ilichee 5 | 6 | - 包含前期连载帖及相关资源下载链接 7 | 8 | sdk及镜像文件下载链接: 9 | 10 | - 链接: http://pan.baidu.com/s/1c4gztvE 11 | 12 | 相关github项目主页: 13 | 14 | - https://github.com/linux-sunxi/linux-sunxi.git 15 | - https://github.com/linux-sunxi/u-boot-sunxi.git 16 | - https://github.com/linux-sunxi/sunxi-tools.git 17 | 18 | linux-sunxi 百科: 19 | 20 | - http://linux-sunxi.org 21 | 22 | 需要购买荔枝派及其配件的可以到淘宝店选购: 23 | 24 | - https://shop152705481.taobao.com/category-1266972912.htm -------------------------------------------------------------------------------- /教程文档/硬件/1.1.1 主控芯片概览.md: -------------------------------------------------------------------------------- 1 | # 主控芯片概览 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 1.原理图设计 10 | -> 1.主控芯片概览 11 | ``` 12 | 13 | 主要介绍A13主控芯片的基本特性,引脚分布情况,并进行初步的引脚复用功能选择。 14 | 15 | ## 一.A13基本特性 16 | 17 | A13是全志在2012年推出的Cortex-A8内核的微处理器,采用55nm工艺,主要是面向平板电脑的解决方案,目前最高支持到安卓4.2。 18 | 19 | 下面简要摘抄翻译datasheet记录的特性,欢迎对下面特性的补充说明或吐槽~ 20 | 21 | ### 1.CPU 22 | 23 |   ARM **Cortex-A8**内核,32KB ICache,32KB DCache, 256KB L2 Cache 24 | 25 |   无聊地和一些常用芯片做对比(~ ̄▽ ̄)~ 26 | 27 | ```eval_rst 28 | ====================== ============================ ======================= ========================= ======================== ======================== 29 | 芯片 内核 核心数 主频 L1(KB) L2(KB) 30 | ====================== ============================ ======================= ========================= ======================== ======================== 31 | STM32F779 Cortex-M7 1 0.2GHz 16+16 n/a 32 | S3C2440 ARM920T 1 0.4GHz 32+32 n/a 33 | MT7620 MIPS24KEc 1 0.6GHz 64+32 n/a 34 | BCM2835 ARM1176JZ 1 0.7GHz 16+16 128 35 | 全志A13 Cortex-A8 1 1GHz 32+32 256 36 | 全志H3 Cortex-A7 4 1.5GHz (32+32)*4 512 37 | RK3288 Cortex-A17 4 1.8GHz (32+32)*4 1024 38 | ====================== ============================ ======================= ========================= ======================== ======================== 39 | ``` 40 | 41 | ### 2.GPU 42 | 43 |   **Mali400**, 支持Open GL ES 1.1/2.0 和open VG1.1 44 | 45 | ### 3.VPU 46 | 47 |   解码:支持 VP6/8,AVS,H.264,H.263, MPEG-1/2/4等,**1920x1080@30fps** 48 | 49 |   编码:支持H.264编码,**1920x1080@30fps** 50 | 51 | ### 4.图像输入输出 52 | 53 |   **并行RGB**接口,最大1024x600貌似?待后期测试。 54 | 55 | //R8还有一个CVBS(AV)输出,A13疑似也有(Pin99,可疑的NC) 56 | 57 |   摄像头接口**CSI** 58 | 59 | ### 5.存储 60 | 61 |   **16位 DDR2/DDR3**控制器,最高533MHz,最大**512MB** 62 |   8位Nand Flash控制器 63 | 64 | ### 6.外设 65 | 66 |   //注意以下有很多被复用的。。 67 | 68 |   USB2.0 OTGx1, USB2.0 Hostx1 69 | 70 |   SD3.0控制器x3,支持UHS-1,eMMC 4.3 71 | 72 |   UARTx4 73 | 74 |   SPIx3 75 | 76 |   I2Cx3 77 | 78 |   红外发射接收(CIR) 79 | 80 |   6bit LRADC (键盘) 81 | 82 |   电阻屏控制器,支持两点触摸 83 | 84 |   内置24bit音频编码器,支持双通道耳机和单通道mic 85 | 86 |   PWM控制器(屏幕背光) 87 | 88 | ### 7.系统 89 | 90 |   8通道普通DMA,8通道专用DMA 91 | 92 |   片上**48KB SRAM**(可以当单片机玩了,科科) 93 | 94 |   6个异步计数器,2个同步计数器,1个看门狗,1个AVS计数器 95 | 96 |   支持一些硬件加密算法DES/3DES/AES,摘要算法SHA-1,MD5 97 | 98 |   128-bit芯片ID 99 | 100 | ### 8.封装 101 | 102 |   **eLQFP176**, 喜闻乐见少数可以手焊的cortex-a芯片 103 |   但是尺寸达到了22mm见方。。 104 | 105 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/10940713.jpg) 106 | 107 | ### 9.系统功能框图 108 | 109 |   如下是典型应用框图 110 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/74561632.jpg) 111 | 112 | ## 二.A13引脚分布 113 | 114 | 为方便查找引脚,我将A13的引脚整理到xls里,可以从下面链接里下载查阅 115 | [引脚查找](https://github.com/Zepan/ilichee/raw/master/%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6/A13%E5%BC%95%E8%84%9A%E6%95%B4%E7%90%86.xlsx) 116 | 117 | 直观起见,我直接在原理图上标出了引脚功能分布图(其中'/'表示复用) 118 | 119 | 这样看起来是不是感觉很清晰了呢? 120 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/39652130.jpg) 121 | 122 | 在这里主要确定下启动存储接口: 123 | 124 |   虽然A13芯片硬件支持从SDC0/2,Nand,SPI0,USB启动,但实际上在SDK里支持得比较好的启动方式是SDC0和Nand,其它方式启动将需要修改大量文件,所以选定SDC0作为启动存储接口。 125 | 126 | 确认了启动接口后,初步的功能引脚分配就出来了: 127 | 128 | ### 荔枝板初步功能引脚分配 129 | 130 | ```eval_rst 131 | ====================== ====================== ======================= 132 | 功能 端口引脚 备注 133 | ====================== ====================== ======================= 134 | SDC0 PF0~5 系统启动接口,SD卡启动 135 | SDC2 PC6~11 第二SD卡(四线)接口 136 | USB0 \- USB OTG,可USB升级固件 137 | USB1 \- USB Host,拟接wifi/BT模块 138 | RGB LCD PD2~27 接RGB LCD显示屏 139 | CSI/SPI2 PE0~11 主功能摄像头接口,不接时可使用SPI2 140 | SPI0 PC0~3 \- 141 | SPI1/UART3 PG9~12 带CTS/RTS的UART3和SPI1复用 142 | UART1 PG3~4 默认的系统调试信息输出口 143 | I2C0 PB0~1 默认接PMU 144 | I2C1 PB15~16 \- 145 | I2C2 PB17~18 \- 146 | IR_TX/RX PB3~4 红外发射、接收口 147 | PWM PB2 默认LCD背光控制 148 | HeadPhone,Mic \- 耳机,麦克音频接口 149 | TPX/Y \- 触摸屏接口 150 | LRADC \- 低精度ADC,用于键盘输入 151 | TV_OUT Pin99 疑似CVBS输出 152 | GPIO PC4~5,PC12~15,PG0~2 约9个剩余IO 153 | ====================== ====================== ======================= 154 | ``` 155 | 156 | 现在已经对A13功能引脚有了初步的认识,下面就可以逐个按照功能模块画原理图啦! 157 | 158 | 我使用的画板工具是比较简单易上手的altium designer 2016(试用版),虽然在高速电路设计时AD可能不太严谨,但对于1GHz以内的简单板子,AD还是绰绰有余的。 159 | 160 | 另外,AD16新增的一些特性对于DDR等高速布线很有帮助。 161 | 162 | 这里首先对整个板子的上层结构进行一下规划: 163 | 164 | ### 荔枝板上层原理图规划 165 | 166 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-24/57728630.jpg) 167 | 168 | 如上图所示,整个板子将大致分为4张原理图,CPU,电源,存储,多媒体。 169 | 170 | 下节将先从电源部分开始画原理图,介绍A13专用PMU芯片AXP209的使用。 171 | -------------------------------------------------------------------------------- /教程文档/硬件/1.1.3 内存存储部分设计.md: -------------------------------------------------------------------------------- 1 | # 内存存储部分设计 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 1.原理图设计 10 | -> 3.内存存储部分设计 11 | ``` 12 | 13 | 主要介绍A13的DRAM设计和存储设计 14 | 15 | ## 一.A13 DRAM控制器介绍 16 | 17 | A13的DRAM控制器支持**DDR2和DDR3**内存,最高支持到512MB地址空间,最高时钟频率**533MHz**(也即DDR1066)。 18 | 支持到**16bit**的DDR2和DDR3,然而实际在支持列表里只有8bit 256MB 的DDR3支持: 19 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-24/34594099.jpg) 20 | 21 | 如果使用8bit 256MB的DDR3内存,那么需要两片DDR来组512MB内存,需要使用T型或fly-by拓扑layout,增加了PCB的复杂度, 22 | 所以在这里冒一点软件上的技术风险,设计使用一片 256M*16bit的DDR3作为内存,这样就可能需要修改boot0的DDR初始化部分代码了。 23 | 24 | ## 二.DDR3介绍 及 原理图 25 | 26 | DDR3内存颗粒在高性能的Cortex-A系列芯片里比较常用,常用速率有800,1066,1333,1600等。 27 | DDR3同DDR2一样,可以在时钟的上下沿传递数据,所以实际的时钟频率是400/533/666/800等。 28 | DDR3相对DDR2加入了很多新特性,这里就不赘述,可以参见: 29 | 30 | ```eval_rst 31 | http://blog.csdn.net/shanghaiqianlun/article/details/6976804 32 | ``` 33 | 34 | DDR3的连接如下图,引脚主要可分为电源引脚和信号引脚 35 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/16305319.jpg) 36 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/8738300.jpg) 37 | 38 | ### DDR3电源引脚 39 | 40 | 1. **VDDQ,VSSQ** 数据线的电源供应,1.35/1.5V兼容 41 | 2. **VDD,VSS** 芯片电源供应,1.35/1.5V兼容 42 | 3. **VREFCA,VREFDQ** 分别是CA和DQ的参考电压,为VDD/2,单片DDR芯片可以直接由精密电阻分压获得参考电压,多片DDR则需要专用参考电压生成芯片。 43 | 4. **ZQ** DDR3新增的脚,在这个引脚上接有240欧姆的精密参考电阻,可以通过片上校准引擎(On-Die Calibration Engine,ODCE)来自动校验数据输出驱动器导通电阻与ODT的终端电阻值。 44 | 45 | ### DDR3信号引脚 46 | 47 | 1. **数据线组** 每组数据线间控制等长,以DQS,DQSN为参照 48 | 1. DQ0~7,DQS0,DQS0N,DM0; 49 | 2. DQ8~15,DQS1,DQS1N,DM1; 50 | 2. **地址线组** 51 | 1. A0~A15 52 | 2. BA0~BA2 bank地址 53 | 3. **时钟线组** 54 | 1. CLK和CLKN ,建议外部串接20~30欧电阻 55 | 3. **控制线组** 56 | 1. CS#,片选,低有效 57 | 2. ODT,On Die Termination,可以省去外接终端电阻 58 | 3. RAS#,CAS#,WE#,命令输入 59 | 60 | ## 三.A13 SD 控制器介绍 61 | 62 | A13的SD控制器 支持SD1.0~3.0,MMC3.3~4.3,最高可以支持到**UHS-1**(带宽104MB/s,即时钟速率208MHZ) 63 | A13有两个SD接口,**SDC0 和SDC2** 64 | 其中SDC0是boot流程中的首选接口,与UART0复用 65 | SDC2也是boot接口之一,与Nand接口复用,SDC2是8bit的SD接口,可以连接EMMC。 66 | 67 | 不过由于eMMc芯片的封装较为精密,所以本次DIY不会使用。 68 | 而Nand封装虽然常用,但是Nand的价格仍然较tf卡贵很多,所以也不使用。 69 | 而TF卡既便宜,烧写方式也比nand什么的简单,还可以说是家中常备的,所以本次DIY使用的系统存储介质就选用TF卡。 70 | 71 | ## 四.SD卡引脚介绍 及 原理图 72 | 73 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/92785299.jpg) 74 | TF卡的原理图比较简单,如上图所示,主要是4线数据线,时钟线和命令线。 75 | 除了时钟线之外的信号线需要加上上拉电阻保证信号稳定。 76 | 这里使用的自弹式tf卡槽还有个tf检测引脚,这里暂不连接。 77 | -------------------------------------------------------------------------------- /教程文档/硬件/1.1.4 多媒体类接口设计.md: -------------------------------------------------------------------------------- 1 | # 多媒体类接口设计 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 1.原理图设计 10 | -> 4.多媒体类接口设计 11 | ``` 12 | 13 | 主要介绍A13的LCD接口,摄像头接口,音频接口,TV,以及USB Host,OTG接口。 14 | 15 | ## 一.A13 LCD/TV 控制器 及 原理图设计 16 | 17 | ### TCON框图 18 | 19 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/8882894.jpg) 20 | 上图是A13的LCD/TV控制器框图,可见在其内部是支持LCD,LVDS,和CVBS的 21 | 然而实际的引脚中只有LCD接口被明确标识,还有一个疑似CVBS输出引脚的NC引脚Pin99(该引脚在R8芯片中为TV输出)。 22 | 所以在设计中引出LCD接口,TV接口也预留引出,待测试是否可用。 23 | 24 | ### LCD接口设计 25 | 26 | A13支持多种LCD接口: 27 | 28 | 1. **RGB接口** 29 | 1. 并行 30 | 2. 串行 31 | 3. CCIR656 32 | 2. **CPU/I80接口** 33 | 1. 并行RGB666 34 | 2. 并行RGB565 35 | 3. 串行RGB666 36 | 4. 串行RGB565 37 | 38 | 在设计时考虑到LCD屏幕购买的便捷性,选用最通用的**40P 并行RGB LCD**屏幕。 39 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/96509119.jpg) 40 | 41 | 如上图所示,通用40P LCD自带 **led背光** 和 **四线电阻触摸**,非常适合显示及交互。 42 | A13也是支持四线电阻触摸功能的,可以进行两点触摸检测。 43 | 44 | **4.3寸 RGB屏幕和 OV7670摄像头模组** 45 | 46 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/601811.jpg) 47 | 48 | ### LCD转VGA设计 49 | 50 | 考虑到有些应用需要使用显示器,所以额外设计了LCD转VGA的转接小板: 51 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/24736301.jpg) 52 | **GM7123** 是一款频率 330MHz 的 3 通道 10 位高速视频 DAC 芯片, 53 | 兼容 RS-343A/RS-170标准差分输出,输出电流范围是 2mA~26mA。 54 | 输入兼容 TTL 电平,内部基准 1.23V,单电源 3.3V 供电,采用 LQFP48 封装。 55 | 该芯片可应用于:数字视频系统( **1600×1200@100Hz**);高分辨率彩色图像;数字射频调制;图像处理;仪器和视频信号重建等。 56 | 57 | 简单来说,GM7123就是把数字化的RGB数据转成了VGA信号里模拟的RGB信号,是一个高速DAC转换器。 58 | 对于分辨率不高,色深较浅的应用,甚至可以使用电阻分压来完成RGB LCD转VGA信号。 59 | 60 | ## 二.摄像头接口设计 61 | 62 | A13的CMOS Sensor Interface(**CSI**)支持 63 | 64 | 1. 8位输入数据 65 | 2. NTSC/PAL的CCIR656 66 | 3. 解析数据到RGB或YCbCr平面 67 | 4. etc. 68 | 69 | 这里选择了常用的 **OV7670**摄像头模组 (30W像素)的引脚定义, 70 | 该引脚定义也 适用于高分辨率的**OV2640**模组(200W像素)等,只是核心电压有差别,可以通过调整PMU的LDO输出电压来适配。 71 | 72 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/30763879.jpg) 73 | 74 | ## 三.音频,TV接口设计 75 | 76 | A13自带立体声音频编码解码器 以及 耳机功放,具有以下特性: 77 | 78 | 1. 内置24位DAC 79 | 2. 内置24位ADC录音 80 | 3. 支持48K,44.1K采样 81 | 4. 支持192K,96K解码 82 | 5. 立体声耳机功放支持无电容的耳机模式 83 | 84 | A13的疑似存在的TV接口部分,直接照搬A20的设计,就是一个简易的CVBS视频信号滤波器。 85 | 麦克信号与TV信号通过一个选择电阻来选通。 86 | 耳机座的连线使用常用的4段耳机插头的线序。 87 | 88 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/1978974.jpg) 89 | 90 | ## 四.USB接口设计 91 | 92 | ### USB OTG接口 93 | 94 | USB OTG接口既可以连接到电脑来取电,又可以连接一些外设来扩展功能。 95 | 为了防止作为主机使用时外部取电过大,造成电源损坏,所以在USB_VBUS和5V电源间加SY6280来限流保护 96 | 97 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/70159266.jpg) 98 | 99 | ### USB HOST接口 100 | 101 | 为了方便荔枝板的网络通信,这里占用USB HOST口来连接wifi/BT模块;需要接usb外设的可以考虑使用otg口来接外设。 102 | 同时也留下了USB母口的封装复用,需要外接hub的可以选择焊接USB母口。 103 | 104 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/72144360.jpg) 105 | 106 | ## 五.其它 107 | 108 | **LRADC**的按键接口,A13的LRADC为6bit精度,可以如下图级联扩展多个按键。 109 | 下图的按键兼具开机BOOT选择(开机按下进入FEL更新程序),和安卓HOME键功能。 110 | 111 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/65894295.jpg) 112 | 113 | 应网友要求,增加了RGB LED方便指示工作状态。 114 | 115 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/50848599.jpg) 116 | -------------------------------------------------------------------------------- /教程文档/硬件/1.1.5 其它接口引出.md: -------------------------------------------------------------------------------- 1 | # 其它接口引出 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 1.原理图设计 10 | -> 5.其它接口引出 11 | ``` 12 | 13 | 主要介绍A13的一些低速外设脚的引出 14 | 15 | ## 一.A13的低速外设接口 16 | 17 | 连接了前面的那些主要接口后,还剩余以下这些接口,通过2.54双排针引出 18 | 19 | ```eval_rst 20 | ============= ======================== ===================================== 21 | 功能 端口引脚 备注 22 | ============= ======================== ===================================== 23 | SPI1/UART3 PG9~12 带CTS/RTS的UART3和SPI1复用 24 | SPI0 PC0~3 \- 25 | CSI/SPI2 PE0~11 主功能是摄像头接口,不接时可使用SPI2 26 | UART1 PG3~4 默认的系统调试信息输出口 27 | I2C0 PB0~1 默认接PMU 28 | I2C1 PB15~16 \- 29 | I2C2 PB17~18 \- 30 | IR_TX/RX PB3~4 红外发射、接收口 31 | PWM PB2 默认LCD背光控制 32 | GPIO PC4~5,PC12~15,PC19 约7个剩余IO 33 | ============= ======================== ===================================== 34 | ``` 35 | 36 | 1. I2C: 支持10bit地址,400Kbps 37 | 2. SPI: 8*64 Byte FIFO, 主从可设置 38 | 3. UART:64 Byte FIFO,支持5~8数据位,可选校验位,1,1.5,2停止位 39 | 4. CIR: 双向8*16bit FIFO,支持常用红外遥控协议 40 | 41 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/5579458.jpg) 42 | -------------------------------------------------------------------------------- /教程文档/硬件/1.2.1 PCB参数确认及布局.md: -------------------------------------------------------------------------------- 1 | # PCB参数确认及布局 2 | 3 | ## 〇.背景 4 | 本文所属目录层次为: 5 | 6 | ``` 7 | -> 1.硬件设计 8 | -> 2.PCB设计 9 | -> 1.PCB参数确认及布局 10 | ``` 11 | 12 | 主要介绍荔枝板的PCB参数,以及初步布局 13 | (交流QQ群:573832310,上车口令:爱荔枝) 14 | 15 | ## 一.PCB参数确认 16 | 17 | ### PCB板厂选择 18 | 19 | 由于是个人DIY项目,资金不是很充裕,所以只能选择一些默认的工艺,和低价便捷的板厂,兴森快捷什么的就不用考虑了哈。 20 | 21 | ---------- 22 | 23 | 个人最常用的打样板厂是 **[嘉立创](http://www.sz-jlc.com/home/index.html)**, 24 | **优点** 25 | 26 | - 速度快,价格低,广东省内包邮 27 | - 可在线下单,甚至有配套APP 28 | - 可同时购买钢网,元件 29 | - 今年(2016)上线了低价样板贴片服务 30 | **缺点** 31 | - 工艺精度不高,最小6/6mil线宽线距,12/24mil过孔,基本做不了BGA 32 | 33 | 嘉立创的生产工艺不高,所以也就是平常打些简单的样板比较合适,相对来说包邮挺划算O(∩_∩)O~ 34 | 35 | ---------- 36 | 37 | 由于荔枝板里使用了FBGA96的DDR3芯片,*焊盘大小0.4mm*(16mil),*焊盘间距0.8mm*, 所以嘉立创的工艺是无法走通的,这时候就用到备选的PCB板厂**[华强PCB](http://www.hqpcb.com/)** 38 | **优点** 39 | - 速度快,价格低 40 | - 可在线下单 41 | - 工艺精度高,最高可达3/3mil线宽线距,8/16mil过孔 42 | 43 | **缺点** 44 | - 在订单高峰期 交货速度可能比较慢 45 | - 不包邮 46 | 47 | ### PCB参数选择 48 | 49 | 虽然华强PCB的制程精度高,但是额外的精度也是要钱的,所以这里来确定我们所需的最低的PCB精度要求。 50 | 主要是FBGA96的焊盘对过孔的要求比较高,实测后发现,使用10/18mil的过孔 搭配 5mil的走线可以扇出FBGA96. 51 | 52 | 然后就是PCB层叠结构。层叠结构主要影响到走线阻抗,但是由于做阻抗的收费太高(500起),所以就选用了默认的层叠结构: 53 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/36831848.jpg) 54 | 55 | 最终确认的PCB参数如下: 56 | 57 | ```eval_rst 58 | =============== ========================== 59 | 项目 参数 60 | =============== ========================== 61 | 板厚 1.6mm 62 | 层数 4 63 | 外层铜厚 1oz(0.35mm) 64 | 内层铜厚 0.5oz(0.17mm) 65 | PP胶厚 0.2mm 66 | 芯板厚 1.1mm 67 | 最小线宽线距 4mil 68 | 最小过孔 10/18mil 69 | =============== ========================== 70 | ``` 71 | 72 | ## 二.PCB 布局 73 | 74 | 以下是大致的PCB布局设计,但实际上布局是很难一开始就确定的(特别是走线层数少的时候),布局往往是边布线边修改的,和一开始设想的布局相差很大,它是比较方便走线的一个布局。 75 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/80730041.jpg) 76 | 77 | 最终的3d效果图如下: 78 | **正面** 79 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/34549630.jpg) 80 | 81 | **反面** 82 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/805059.jpg) 83 | -------------------------------------------------------------------------------- /教程文档/硬件/1.2.2 DDR部分Layout.md: -------------------------------------------------------------------------------- 1 | # DDR部分Layout 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 2.PCB设计 10 | -> 2.DDR部分Layout 11 | ``` 12 | 13 | 主要介绍荔枝板的DDR布线 14 | 15 | ## 一.DDR布线一般规则 16 | 17 | ### 阻抗匹配 18 | 19 | - DQn/DM/DQS, CLK,传输线阻抗50欧,差分阻抗100欧 20 | - 线距3W,或者至少4mil 21 | 22 | ### 等长约束 23 | 24 | - CKP/N严格等长(<5mil),长度小于4inch 25 | - DQS以CLK为基准,误差+-250mil,P/N间严格等长,<5mil 26 | - DQ八根一组与对应DQ严格等长,误差50mil 27 | - DM与对应DQ严格等长,误差50mil 28 | - ADDR[0:14]以CLK为基准,误差100mil。 29 | - 剩余控制信号以CLK为基准,误差100mil。 30 | 31 | ### 差分线约束 32 | 33 | - 差分线和其他线距离12mil以上,长度差<5mil,线间距>4mil 34 | - 蛇形线的平行长度不宜过长,宜45度走线 35 | 36 | ### 电源滤波 37 | 38 | - 每个电源管脚放104,至少有一个10uf 39 | - 每2厘米电源线放一个10uf 40 | 41 | ## 二.DDR布线实用规则 42 | 43 | ### 阻抗匹配规则 44 | 45 | - 阻抗匹配适用于**“长”线传输**,一般来说信号线长超过十分之一的波长才需要考虑阻抗匹配。 46 | 47 | > PP胶介电常数约4.7,电磁场传播速度约(1/sqrt(4.7))=1/2.1, 即传播速度为 150mm/ns~6inch/ns 48 | DDR3-1066时钟频率533MHz~0.5GHz,周期约2ns, 所以波长约300mm,波长/10约30mm 49 | 所以当DDR信号线走线长度小于30mm~1200mil时,可以不考虑阻抗匹配 50 | 51 | 荔枝板在实际布线时可以目测到走线长度在1000mil以内,所以无需特别进行阻抗匹配。 52 | - 另一方面,可以计算阻抗失配后的波峰波谷电压,看是否在合理范围 53 | > 荔枝板prepreg为0.2mm(7628),走线为5mil,计算得阻抗约75~80欧,归一化阻抗约1.5 54 | > 反射系数=(1.5-1)/(1.5+1)=0.2 55 | VH波峰电压=1.5x1.2=1.8V <= Vmax 1.8V 56 | VH波谷电压=1.5x0.8=1.2V > 0.75+0.1 = 0.85V 57 | 所以这种程度的阻抗失配还不会直接造成信号传输错误 58 | 59 | 通过以上规则的取舍,实际应用中可以省下几百块阻抗费 O(∩_∩)O~ 60 | (阻抗计算器si9000) 61 | 62 | ### 等长约束规则 63 | 64 | - 等长约束通常是芯片相关的,最好翻阅对应芯片的手册 65 | - 有时候蛇形走线造成的串扰影响甚至会超过不等长的影响,这里也需要取舍 66 | 67 | ## 三.DDR布线小技巧 68 | 69 | - 放DDR之前先 大致确认下连线最长和最短的信号线,合理摆放使得两个最值之间的差距尽量小 70 | - 放置好DDR后,先打好电源引脚的过孔,放上滤波电容,防止布好线后找不到地方打孔。。 71 | - 走线时先走最长的线和差分线,确定长度基准 72 | - 需要绕等长时,外部的线直接往外扩,让内部线有空间绕等长 73 | - 顶层和底层的走线数目大致相同,可以使得布线面积较小 74 | 75 | ## 四.Altium Designer 布DDR指南 76 | 77 | - AD15之后的版本具有x-signal功能,类似x-net,可以利用该功能控制等长 78 | - 首先选中CPU和DDR,然后右键->xsignals->create xsignals between component,即可添加需要的信号线到xsignal 79 | - 然后可以在rule里设置规则,在右下角的PCB里点开查看信号线长度 80 | - ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/23590492.jpg) 81 | - 调整差分线等长,T->I, 交互式差分线长度调整; 82 | - tab键,输入要调整到的长度,以及幅度,间距(建议更大于3W)等 83 | - 通过1234来微调蛇形形状,逗号,句号 调整幅度 84 | - 空间有限时,可以手动来调整线长。 85 | - 调整差分线接近最长的其他走线 86 | - 调整其它线长T->R (交互式线长调整), 87 | - 按tab设置等长选项(会自动以原理图里的差分线为基准),可以设置蛇形幅度,间距(最好3W以上) 88 | - 然后按1234等按键微调蛇形形状,调整至等长;按逗号和句号调整幅度; 89 | - 最终效果 90 | - ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/32807697.jpg) 91 | -------------------------------------------------------------------------------- /教程文档/硬件/1.2.3 电源层分割.md: -------------------------------------------------------------------------------- 1 | # 电源层分割 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 2.PCB设计 10 | -> 3.电源层分割 11 | ``` 12 | 13 | 主要介绍荔枝板的电源层分割 14 | 15 | ## 一.多层板的电源层设置 16 | 17 | 在4层及以上PCB中,通常有两层作为电源层和地层,而不是像双面板那样大面积敷地。 18 | 这样设计的好处是: 19 | 20 | - 方便走线 21 | - 只要在需要接地或者接电源的地方打过孔即能联通,再也不用绕线连接了~ 22 | - 方便控制阻抗 23 | - 对于需要控制阻抗的电路来说,两层板的厚度是很难做到对应的阻抗的,4层板一般0.2mm的PP胶就较容易做到对应阻抗 24 | - 底下有完整的地参考层容易控制阻抗 25 | - 较大的电源平面保证电压的一致性 26 | 27 | ## Altium Designer下的电源层设置 28 | 29 | AD中的层叠管理器设置如下: 30 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/570660.jpg) 31 | 电源层和地层都是 **Internal Plane**,即**负片层**,画线的地方是无铜的,所以又被称为电源层分割。 32 | 33 | 注意打的过孔在负片层会有一段“清空”距离,有时候太密的过孔会截断电源层或地层的回流, 34 | 这时就需要调整过孔的分布,或者在规则里减小些这个“清空”距离 35 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/1530652.jpg) 36 | 37 | 最后完成的电源层分割如下,可以看到A13由于有众多电源,整个电源平面被分割得很厉害 38 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/99989785.jpg) 39 | -------------------------------------------------------------------------------- /教程文档/硬件/1.2.4 TF卡及其余接口layout.md: -------------------------------------------------------------------------------- 1 | # TF卡及其余接口Layout 2 | 3 | ## 〇.背景 4 | 5 | 本文所属目录层次为: 6 | 7 | ``` 8 | -> 1.硬件设计 9 | -> 2.PCB设计 10 | -> 4.TF卡及其余接口Layout 11 | ``` 12 | 13 | 主要介绍荔枝板的TF卡及剩余的布线 14 | 15 | ## 一.TF卡布线 16 | 17 | A13支持的UHS-1的SD接口带宽是104MB/s,由于SD接口是4线的,所以时钟频率是208MHz。 18 | 所以时钟周期约5ns,波长150x5=750mm,波长的1/10=75mm 19 | 而从荔枝板的大致布局上看,走线不会超过40mm,所以TF卡的布线可以不用考虑阻抗匹配。 20 | 21 | > 如果长度过长,则需要控制单端阻抗到50欧姆 22 | 23 | > 所有走线尽量同一层,参考GND平面 24 | 25 | SD信号线的等长控制,相对于DDR3宽松很多,数据线参考时钟线尽量等长,误差在+-300mil 26 | 时钟线和其它线之间距离要满足3W原则 27 | 28 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/48615677.jpg) 29 | 30 | 如果需要满足ESD要求,则 需要在TF卡接口处信号线加多个ESD二极管 31 | 32 | ## 二.USB布线 33 | 34 | usb是差分信号线,USB2.0 的带宽**480Mbps**,比较高速, 需要严格控制等长和阻抗。 35 | USB信号的时钟周期约2ns,波长约150x2=300mm,波长的1/10=30mm 36 | 从荔枝板的布局来看,usb0的长度会达到50mm左右,所以对于USB的布线需要考虑阻抗匹配。 37 | 使用si9000计算可得,差分100欧阻抗时,需要**8mil走线,5mil线距**。 38 | USB走线的等长也需要在10mil以内。 39 | 40 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/43532268.jpg) 41 | 如果需要满足ESD要求,则 需要在usb接口处信号线加多个ESD二极管 42 | 43 | ## 三.WIFI模块的天线布线 44 | 45 | 本来想直接在板上直接画上PCB天线,但由于两边有定位孔在,估计效果会不太好,所以就放了个IPEX座子的封装上去。 46 | 47 | WIFI是2.4G射频信号,周期约0.4ns,波长150x0.4=60mm,波长的1/10=6mm 48 | 从wifi模块的布局上看,模块到IPEX座距离差不多超过了6mm,所以需要考虑下阻抗匹配 49 | 使用si9000计算阻抗得,单端50欧姆阻抗时,需要**13mil走线** 50 | 51 | 在天线引脚和IPEX座之间还需要加上一个pi型匹配电路,用于额外的阻抗微调。 52 | 53 | ## 四.其余走线布线 54 | 55 | 其余走线,如摄像头,RGB LCD接口等,时钟速率都在100MHZ以下,属于较低速的信号,基本上布通就行。 56 | 布线时可以适当调整元件布局使得整体更方便布线。 57 | 58 | ## 五.最终布线 59 | 60 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/28679899.jpg) 61 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/4100876.jpg) 62 | -------------------------------------------------------------------------------- /教程文档/硬件/contents.rst: -------------------------------------------------------------------------------- 1 | 硬件设计全解析 2 | ====================== 3 | 4 | .. toctree:: 5 | 6 | 主控芯片概览 <1.1.1 主控芯片概览> 7 | 电源电路设计 8 | 内存存储部分设计 <1.1.3 内存存储部分设计> 9 | 多媒体类接口设计 <1.1.4 多媒体类接口设计> 10 | 其它接口引出 <1.1.5 其它接口引出> 11 | PCB参数确认及布局 <1.2.1 PCB参数确认及布局> 12 | DDR部分Layout <1.2.2 DDR部分Layout> 13 | 电源层分割 <1.2.3 电源层分割> 14 | TF卡及其余接口layout <1.2.4 TF卡及其余接口layout> -------------------------------------------------------------------------------- /教程文档/硬件/power.rst: -------------------------------------------------------------------------------- 1 | 电源电路设计 2 | ============== 3 | 4 | 一. A13电源引脚介绍 5 | ------------------------------- 6 | 7 | 这里我们先找A13的主要电源引脚,也就是datasheet中标识为Power的引脚,用excel筛选下可得: 8 | 9 | .. image:: ../_static/硬件/1.power.jpg 10 | 11 | 简单说下各电源的用处 12 | 13 | ======== ========= 14 | 电源 用途 15 | ======== ========= 16 | VCC IO口电源 17 | AVCC 模拟电路电源 18 | VDD_CPU CPU内核电压 19 | VDD_INT Interrupt Power 20 | 中断电源? 21 | VCC_DRAM 内存电源 22 | V33_HP 耳机电源 23 | V33_USB USB电源 24 | ======== ========= 25 | 26 | 查阅手册可知它们的参考范围: 27 | 28 | .. image:: ../_static/硬件/2.power.jpg 29 | 30 | 把板子上所有的电源按电压分类: 31 | 32 | ======== ======================= ======================= 33 | 电压(V) 电源名 备注 34 | ======== ======================= ======================= 35 | 5 DC输入电压 \- 36 | 4.2 锂电池供电 \- 37 | 3.3 VCC,V33_HP,V33_USB \- 38 | 2.7~3.3 AVCC 为模拟键盘等供电 39 | 2.8 摄像头电源 工作电流约20mA 40 | 1.3/1.8 摄像头内核电压 \- 41 | 1.5 VCC_DRAM 最大工作电流IDD5B=200mA 42 | 1.1~1.4 VDD_CPU 不同电压对应不同主频 43 | 1.2 VDD_INT \- 44 | ======== ======================= ======================= 45 | 46 | 可见板子上需要的电压种类比较多,如何生成、管理这些电源是个问题。 47 | 48 | 二. AXP209介绍及电源树设计 49 | ------------------------------- 50 | 51 | AXP209 是专为全志A10/13/20等主控配备的电源管理芯片(PMU),管脚如下图所示: 52 | 53 | .. image:: ../_static/硬件/3.power.jpg 54 | 55 | 具体功能可以查看它的datasheet,简而言之,它提供以下功能: 56 | 57 | =========== ================== 58 | 功能 参数 59 | =========== ================== 60 | DC-DC2 0.7~2.275V可调,1.6A max 61 | DC-DC3 0.7~3.5V可调,1.2A max 62 | LDO1 3.3V,30mA 63 | LDO2 1.8~3.3V可调,200mA max 64 | LDO3 0.7~3.3V可调,200mA max 65 | LDO4 1.8~3.3V可调, 200mA max 66 | LDO5 1.8~3.3V可调, 50mA max(不常用) 67 | 锂电池充电 1.8A max,可指示,内建库仑计 68 | 系统管理 支持软硬复位/关机等 69 | 管理接口 I2C 70 | =========== ================== 71 | 72 | 充分利用AXP209的电源接口,设计电源树如下: 73 | 74 | .. image:: ../_static/硬件/4.power.jpg 75 | 76 | 最终还是基本按照官方设计来的,使用了很多外置DCDC。:: 77 | 78 | 因为之前将VDD_CPU和VDD_INT合并,DCDC3作为DRAM电源的设定,需要将设置PMU电压调整到 **boot0中进行** , 79 | 而 **原boot0并没有进行PMU操作就直接进行DRAM的初始化,将会导致boot失败** 。 80 | 81 | 三. 电源部分原理图设计 82 | ------------------------------- 83 | 84 | AXP209 部分设计 85 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | 87 | .. image:: ../_static/硬件/5.power.jpg 88 | 89 | 从原理图上按顺序(U字形)分析各个引脚: 90 | 91 | 1. **TS**:温度传感引脚,可以接热敏电阻,不用时接普通100欧电阻 92 | #. **PS,ACIN,VBUS** 分别是IPSOUT输出,DC输入,usb otg的电源输入,如果没有DC输入,则直接短接它和USB_VBUS 93 | #. **EP** 就是底部散热焊盘 94 | #. **CHGLED** 是充电指示,BACKUP可以接后备电池 95 | #. **VINT** 是内部2.5V逻辑电压,可以用来设置LDO,DCDC的开机默认电压 96 | #. 中间一堆稳压滤波电容保证内部参考电压稳定 97 | #. **EXTEN** 用来管理外部DCDC芯片的使能 98 | #. **POWERON** 开机键,动作逻辑见datasheet 99 | #. **SCK/SDA**,AXP209通过TWI0来被A13管理 100 | #. A13的NMI接AXP209的中断引脚 **IRQ** (电源中断优先级相对最高的),A13的RST引脚接 **PWROK**,即AXP209完成电源系统的启动后 启动A13 101 | #. 往上就是一堆LDO的稳压电容 102 | #. 再往上是3路DCDC的外部电路,都是BUCK降压型DCDC ,参数使用datasheet推荐的参数。 103 | #. DCDC1是锂电池管理部分,其中采样电阻 **30毫欧**,一般封装在0805以上。 104 | 105 | 外部DCDC设计 106 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 107 | 108 | .. image:: ../_static/硬件/6.power.jpg 109 | 110 | 3.3V输出和1.5V输出均是buck降压电路,5V输出为boost升压电路,按典型应用电路设计即可。 111 | 112 | .. image:: ../_static/硬件/7.power.jpg 113 | 114 | 背光电路使用PT4101,可支持2~8颗 LED串联,典型20mA恒流驱动。 115 | 116 | 这里使用PB10作为使能,PB2的PWM作为调光。 -------------------------------------------------------------------------------- /资源文件/20150601_RTL8723BU_WiFi_linux_v4.3.16_14189_BT_android5.0_V3.0_P11_FW_svn14422-BTCOEX20150119-5844.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/20150601_RTL8723BU_WiFi_linux_v4.3.16_14189_BT_android5.0_V3.0_P11_FW_svn14422-BTCOEX20150119-5844.zip -------------------------------------------------------------------------------- /资源文件/A13 Datasheet V1.30.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/A13 Datasheet V1.30.pdf -------------------------------------------------------------------------------- /资源文件/A13 User Manual V1.30.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/A13 User Manual V1.30.pdf -------------------------------------------------------------------------------- /资源文件/A13启动整体流程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/A13启动整体流程.vsdx -------------------------------------------------------------------------------- /资源文件/A13引脚整理.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/A13引脚整理.xlsx -------------------------------------------------------------------------------- /资源文件/A20_系统配置手册_v2.0_20130716.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/A20_系统配置手册_v2.0_20130716.pdf -------------------------------------------------------------------------------- /资源文件/Lichee原理图.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/Lichee原理图.pdf -------------------------------------------------------------------------------- /资源文件/SDK 下载.md: -------------------------------------------------------------------------------- 1 | 注意SDK仅支持64位开发环境,32位机可以开64位虚拟机开发。 2 | 3 | linux SDK lichee.tar.gz 4 | 链接:http://pan.baidu.com/s/1i5hPz6l 密码:d7fa 5 | 6 | a13_android4.2_v1.5.0 SDK 7 | 链接:http://pan.baidu.com/s/1hrDzpfI 密码:ilwz 8 | 9 | -------------------------------------------------------------------------------- /资源文件/Visio-A13启动整体流程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/Visio-A13启动整体流程.pdf -------------------------------------------------------------------------------- /资源文件/Visio-uboot-sunxi spl部分流程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/Visio-uboot-sunxi spl部分流程.pdf -------------------------------------------------------------------------------- /资源文件/Visio-uboot-sunxi uboot部分流程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/Visio-uboot-sunxi uboot部分流程.pdf -------------------------------------------------------------------------------- /资源文件/lichee SDK编译说明.md: -------------------------------------------------------------------------------- 1 | # linux镜像编译 # 2 | 在lichee目录下: 3 | ``` 4 | ./build.sh -p a13_nuclear -k 3.0 //编译安卓的linux内核 5 | ./build.sh -p a13_dragonboard -k 3.0//编译龙板 6 | ./build.sh pack //打包 7 | ``` 8 | 9 | # 编译安卓镜像 # 10 | 首先要安装jdk,该版本安卓只支持到jdk1.6,请设置当前jdk版本到1.6 11 | ``` 12 | update-alternatives --config java //设置Java版本 13 | source build/envsetup.sh 14 | lunch //选择板子 15 | extract-bsp 16 | time make -j12 2>&1 | tee log.txt //这里-j12设置成你电脑的线程数 17 | pack //打包整个固件 18 | ``` 19 | 20 | 如果报非法参数的错,可能是linux内核和andriod两边没对上,可以在 21 | lichee\tools\pack\chips\sun5i\configs\android 里修改下对应配置文件的名字再重新pack 22 | -------------------------------------------------------------------------------- /资源文件/uboot-sunxi spl部分流程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/uboot-sunxi spl部分流程.vsdx -------------------------------------------------------------------------------- /资源文件/uboot-sunxi uboot部分流程.vsdx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/资源文件/uboot-sunxi uboot部分流程.vsdx -------------------------------------------------------------------------------- /资源文件/镜像烧写/boot.cmd: -------------------------------------------------------------------------------- 1 | setenv bootm_boot_mode sec 2 | setenv bootargs console=tty1,115200 root=/dev/mmcblk0p2 rootwait panic=10 3 | load mmc 0:1 0x43000000 script.bin || load mmc 0:1 0x43000000 boot/script.bin 4 | load mmc 0:1 0x42000000 uImage || load mmc 0:1 0x42000000 boot/uImage 5 | bootm 0x42000000 6 | -------------------------------------------------------------------------------- /资源文件/镜像烧写/clear_partion.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | sudo fdisk /dev/sdb< 1.硬件设计 7 | -> 1.原理图设计 8 | -> 1.主控芯片概览 9 | ``` 10 | 主要介绍A13主控芯片的基本特性,引脚分布情况,并进行初步的引脚复用功能选择。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.A13基本特性 ## 14 | A13是全志在2012年推出的Cortex-A8内核的微处理器,采用55nm工艺,主要是面向平板电脑的解决方案,目前最高支持到安卓4.2。 15 | 下面简要摘抄翻译datasheet记录的特性,欢迎对下面特性的补充说明或吐槽~ 16 | ###1.CPU### 17 |   ARM **Cortex-A8**内核,32KB ICache,32KB DCache, 256KB L2 Cache 18 |   无聊地和一些常用芯片做对比(~ ̄▽ ̄)~ 19 | 20 | | 芯片 | 内核 |核心数| 主频 |L1(KB)|L2(KB)| 21 | | ----- |-----------|-----|------|------|------| 22 | |STM32F779| Cortex-M7| 1 | 0.2GHz|16+16|n/a| 23 | | S3C2440 | ARM920T | 1 | 0.4GHz|32+32|n/a| 24 | | MT7620 | MIPS24KEc | 1 | 0.6GHz|64+32|n/a| 25 | | BCM2835 | ARM1176JZ| 1 | 0.7GHz|16+16|128| 26 | | 全志A13 | Cortex-A8 | 1 | 1GHz|32+32|256| 27 | | 全志H3 | Cortex-A7 | 4 | 1.5GHz|(32+32)*4|512| 28 | | RK3288| Cortex-A17 | 4 | 1.8GHz|(32+32)*4|1024| 29 | 30 | ### 2.GPU ### 31 |   **Mali400**, 支持Open GL ES 1.1/2.0 和open VG1.1 32 | 33 | ### 3.VPU ### 34 |   解码:支持 VP6/8,AVS,H.264,H.263, MPEG-1/2/4等,**1920x1080@30fps** 35 |   编码:支持H.264编码,**1920x1080@30fps** 36 | 37 | ### 4.图像输入输出 ### 38 |   **并行RGB**接口,最大1024x600貌似?待后期测试。 39 |    //R8还有一个CVBS(AV)输出,A13疑似也有(Pin99,可疑的NC) 40 |   摄像头接口**CSI** 41 | 42 | ### 5.存储 ### 43 |   **16位 DDR2/DDR3**控制器,最高533MHz,最大**512MB** 44 |   8位Nand Flash控制器 45 | 46 | ### 6.外设 ### 47 |   //注意以下有很多被复用的。。 48 |   USB2.0 OTGx1, USB2.0 Hostx1 49 |   SD3.0控制器x3,支持UHS-1,eMMC 4.3 50 |   UARTx4 51 |   SPIx3 52 |   I2Cx3 53 |   红外发射接收(CIR) 54 |   6bit LRADC (键盘) 55 |   电阻屏控制器,支持两点触摸 56 |   内置24bit音频编码器,支持双通道耳机和单通道mic 57 |   PWM控制器(屏幕背光) 58 | 59 | ### 7.系统 ### 60 |   8通道普通DMA,8通道专用DMA 61 |   片上**48KB SRAM**(可以当单片机玩了,科科) 62 |   6个异步计数器,2个同步计数器,1个看门狗,1个AVS计数器 63 |   支持一些硬件加密算法DES/3DES/AES,摘要算法SHA-1,MD5 64 |   128-bit芯片ID 65 | 66 | ### 8.封装 ### 67 |   **eLQFP176**, 喜闻乐见少数可以手焊的cortex-a芯片 68 |   但是尺寸达到了22mm见方。。 69 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/10940713.jpg) 70 | 71 | 72 | ### 9.系统功能框图 ### 73 |   如下是典型应用框图 74 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/74561632.jpg) 75 | 76 | ## 二.A13引脚分布 ## 77 | 为方便查找引脚,我将A13的引脚整理到xls里,可以从下面链接里下载查阅。 78 | https://github.com/Zepan/ilichee/raw/master/%E8%B5%84%E6%BA%90%E6%96%87%E4%BB%B6/A13%E5%BC%95%E8%84%9A%E6%95%B4%E7%90%86.xlsx 79 | 80 | 直观起见,我直接在原理图上标出了引脚功能分布图(其中'/'表示复用) 81 | 这样看起来是不是感觉很清晰了呢? 82 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-2/39652130.jpg) 83 | 84 | 在这里主要确定下启动存储接口: 85 |   虽然A13芯片硬件支持从SDC0/2,Nand,SPI0,USB启动,但实际上在SDK里支持得比较好的启动方式是SDC0和Nand,其它方式启动将需要修改大量文件,所以选定SDC0作为启动存储接口。 86 | 87 | 确认了启动接口后,初步的功能引脚分配就出来了: 88 | ###
荔枝板初步功能引脚分配
### 89 | | 功能 | 端口引脚 |备注| 90 | | ----- |-----------|-----| 91 | |SDC0| PF0~5|系统启动接口,SD卡启动| 92 | |SDC2|PC6~11|第二SD卡(四线)接口| 93 | |USB0|- |USB OTG,可USB升级固件| 94 | |USB1|- |USB Host,拟接wifi/BT模块| 95 | |RGB LCD|PD2~27|接RGB LCD显示屏| 96 | |CSI/SPI2| PE0~11|主功能摄像头接口,不接时可使用SPI2| 97 | |SPI0|PC0~3|-| 98 | |SPI1/UART3| PG9~12|带CTS/RTS的UART3和SPI1复用| 99 | |UART1| PG3~4|默认的系统调试信息输出口| 100 | |I2C0| PB0~1|默认接PMU| 101 | |I2C1| PB15~16|-| 102 | |I2C2| PB17~18|-| 103 | |IR_TX/RX| PB3~4|红外发射、接收口| 104 | |PWM| PB2|默认LCD背光控制| 105 | |HeadPhone,Mic| -|耳机,麦克音频接口| 106 | |TPX/Y|-|触摸屏接口| 107 | |LRADC|-|低精度ADC,用于键盘输入| 108 | |TV_OUT| Pin99|疑似CVBS输出| 109 | |GPIO| PC4~5,PC12~15,PG0~2|约9个剩余IO| 110 | 111 | 现在已经对A13功能引脚有了初步的认识,下面就可以逐个按照功能模块画原理图啦! 112 | 113 | 我使用的画板工具是比较简单易上手的altium designer 2016(试用版),虽然在高速电路设计时AD可能不太严谨,但对于1GHz以内的简单板子,AD还是绰绰有余的。 114 | 另外,AD16新增的一些特性对于DDR等高速布线很有帮助。 115 | 116 | 这里首先对整个板子的上层结构进行一下规划: 117 | ### 荔枝板上层原理图规划 ### 118 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-24/57728630.jpg) 119 | 如上图所示,整个板子将大致分为4张原理图,CPU,电源,存储,多媒体。 120 | 121 | 下节将先从电源部分开始画原理图,介绍A13专用PMU芯片AXP209的使用。 122 | 123 | -------------------------------------------------------------------------------- /连载帖/1.1.2 电源部分设计.md: -------------------------------------------------------------------------------- 1 | #电源部分设计 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 1.原理图设计 8 | -> 2.电源部分设计 9 | ``` 10 | 主要介绍A13的电源引脚,及配套的电源芯片AXP209的使用。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.A13电源引脚介绍 ## 14 | 这里我们先找A13的主要电源引脚,也就是datasheet中标识为Power的引脚,用excel筛选下可得: 15 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-4/36316023.jpg) 16 | 17 | 简单说下各电源的用处 18 | 19 | | 电源 | 用途 | 20 | | ----- |-----------| 21 | | VCC | IO口电源| 22 | |AVCC| 模拟电路电源| 23 | |VDD_CPU|CPU内核电压| 24 | |VDD_INT|Interrupt Power,中断电源?| 25 | |VCC_DRAM|内存电源| 26 | | V33_HP |耳机电源| 27 | |V33_USB|USB电源| 28 | 29 | 查阅手册可知它们的参考范围: 30 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-4/17484878.jpg) 31 | 32 | 把板子上所有的电源按电压分类: 33 | 34 | | 电压(V) | 电源名 | 备注| 35 | | ----- |-----------|---| 36 | | 5 | DC输入电压|-| 37 | | 4.2 |锂电池供电|-| 38 | | 3.3 |VCC,V33_HP,V33_USB|-| 39 | | 2.7~3.3 |AVCC|为模拟键盘等供电| 40 | | 2.8 |摄像头电源|工作电流约20mA| 41 | |1.3/1.8|摄像头内核电压|-| 42 | |1.5|VCC_DRAM|最大工作电流IDD5B=200mA| 43 | |1.1~1.4|VDD_CPU|不同电压对应不同主频| 44 | |1.2|VDD_INT|-| 45 | 46 | 可见板子上需要的电压种类比较多,如何生成、管理这些电源是个问题。 47 | 48 | ## 二.AXP209介绍及电源树设计 ## 49 | AXP209 是专为全志A10/13/20等主控配备的电源管理芯片(PMU),管脚如下图所示: 50 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-4/50236130.jpg) 51 | 52 | 具体功能可以查看它的datasheet,简而言之,它提供以下功能: 53 | 54 | | 功能 | 参数 | 55 | | ----- |-----------| 56 | | DC-DC2 | 0.7~2.275V可调,1.6A max| 57 | | DC-DC3 | 0.7~3.5V可调,1.2A max| 58 | | LDO1 | 3.3V,30mA| 59 | | LDO2 | 1.8~3.3V可调,200mA max| 60 | | LDO3 | 0.7~3.3V可调,200mA max| 61 | | LDO4 | 1.8~3.3V可调, 200mA max| 62 | | LDO5 | 1.8~3.3V可调, 50mA max(不常用)| 63 | |锂电池充电|1.8A max,可指示,内建库仑计| 64 | |系统管理|支持软硬复位/关机等| 65 | |管理接口|I2C| 66 | 67 | 充分利用AXP209的电源接口,设计电源树如下: 68 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-24/1871435.jpg) 69 | 70 | 最终还是基本按照官方设计来的,使用了很多外置DCDC。 71 | ``` 72 | 因为之前将VDD_CPU和VDD_INT合并,DCDC3作为DRAM电源的设定,需要将设置PMU电压调整到boot0中进行, 73 | 而原boot0并没有进行PMU操作就直接进行DRAM的初始化,将会导致boot失败。 74 | ``` 75 | 76 | ## 三. 电源部分原理图设计 ## 77 | ### AXP209 部分设计 ### 78 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/5347569.jpg) 79 | 从原理图上按顺序(U字形)分析各个引脚: 80 | 1. **TS**:温度传感引脚,可以接热敏电阻,不用时接普通100欧电阻 81 | 2. **PS,ACIN,VBUS** 分别是IPSOUT输出,DC输入,usb otg的电源输入,如果没有DC输入,则直接短接它和USB_VBUS 82 | 3. **EP**就是底部散热焊盘 83 | 4. **CHGLED**是充电指示,BACKUP可以接后备电池 84 | 5. **VINT**是内部2.5V逻辑电压,可以用来设置LDO,DCDC的开机默认电压 85 | 6. 中间一堆稳压滤波电容保证内部参考电压稳定 86 | 7. **EXTEN**用来管理外部DCDC芯片的使能 87 | 8. **POWERON** 开机键,动作逻辑见datasheet 88 | 9. **SCK/SDA**,AXP209通过TWI0来被A13管理 89 | 10. A13的NMI接AXP209的中断引脚**IRQ**(电源中断优先级相对最高的),A13的RST引脚接**PWROK**,即AXP209完成电源系统的启动后 启动A13 90 | 11. 往上就是一堆LDO的稳压电容 91 | 12. 再往上是3路DCDC的外部电路,都是BUCK降压型DCDC ,参数使用datasheet推荐的参数。 92 | 13. DCDC1是锂电池管理部分,其中采样电阻**30毫欧**,一般封装在0805以上。 93 | 94 | ### 外部DCDC设计 ### 95 | 96 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/76005973.jpg) 97 | 98 | 3.3V输出和1.5V输出均是buck降压电路,5V输出为boost升压电路,按典型应用电路设计即可。 99 | 100 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/94713879.jpg) 101 | 背光电路使用PT4101,可支持2~8颗 LED串联,典型20mA恒流驱动。 102 | 这里使用PB10作为使能,PB2的PWM作为调光。 103 | 104 | 105 | 106 | 107 | -------------------------------------------------------------------------------- /连载帖/1.1.3 内存存储部分设计.md: -------------------------------------------------------------------------------- 1 | #内存存储部分设计 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 1.原理图设计 8 | -> 3.内存存储部分设计 9 | ``` 10 | 主要介绍A13的DRAM设计和存储设计 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.A13 DRAM控制器介绍 ## 14 | A13的DRAM控制器支持**DDR2和DDR3**内存,最高支持到512MB地址空间,最高时钟频率**533MHz**(也即DDR1066)。 15 | 支持到**16bit**的DDR2和DDR3,然而实际在支持列表里只有8bit 256MB 的DDR3支持: 16 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-24/34594099.jpg) 17 | 18 | 如果使用8bit 256MB的DDR3内存,那么需要两片DDR来组512MB内存,需要使用T型或fly-by拓扑layout,增加了PCB的复杂度, 19 | 所以在这里冒一点软件上的技术风险,设计使用一片 256M*16bit的DDR3作为内存,这样就可能需要修改boot0的DDR初始化部分代码了。 20 | 21 | ## 二.DDR3介绍 及 原理图 ## 22 | DDR3内存颗粒在高性能的Cortex-A系列芯片里比较常用,常用速率有800,1066,1333,1600等。 23 | DDR3同DDR2一样,可以在时钟的上下沿传递数据,所以实际的时钟频率是400/533/666/800等。 24 | DDR3相对DDR2加入了很多新特性,这里就不赘述,可以参见: 25 | http://blog.csdn.net/shanghaiqianlun/article/details/6976804 26 | 27 | DDR3的连接如下图,引脚主要可分为电源引脚和信号引脚 28 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/16305319.jpg) 29 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/8738300.jpg) 30 | 31 | ###DDR3电源引脚### 32 | 1. **VDDQ,VSSQ** 数据线的电源供应,1.35/1.5V兼容 33 | 2. **VDD,VSS** 芯片电源供应,1.35/1.5V兼容 34 | 3. **VREFCA,VREFDQ** 分别是CA和DQ的参考电压,为VDD/2,单片DDR芯片可以直接由精密电阻分压获得参考电压,多片DDR则需要专用参考电压生成芯片。 35 | 4. **ZQ** DDR3新增的脚,在这个引脚上接有240欧姆的精密参考电阻,可以通过片上校准引擎(On-Die Calibration Engine,ODCE)来自动校验数据输出驱动器导通电阻与ODT的终端电阻值。 36 | 37 | ###DDR3信号引脚### 38 | 1. **数据线组** 每组数据线间控制等长,以DQS,DQSN为参照 39 | 1. DQ0~7,DQS0,DQS0N,DM0; 40 | 2. DQ8~15,DQS1,DQS1N,DM1; 41 | 2. **地址线组** 42 | 1. A0~A15 43 | 2. BA0~BA2 bank地址 44 | 3. **时钟线组** 45 | 1. CLK和CLKN ,建议外部串接20~30欧电阻 46 | 3. **控制线组** 47 | 1. CS#,片选,低有效 48 | 2. ODT,On Die Termination,可以省去外接终端电阻 49 | 3. RAS#,CAS#,WE#,命令输入 50 | 51 | 52 | ## 三.A13 SD 控制器介绍 ## 53 | A13的SD控制器 支持SD1.0~3.0,MMC3.3~4.3,最高可以支持到**UHS-1**(带宽104MB/s,即时钟速率208MHZ) 54 | A13有两个SD接口,**SDC0 和SDC2** 55 | 其中SDC0是boot流程中的首选接口,与UART0复用 56 | SDC2也是boot接口之一,与Nand接口复用,SDC2是8bit的SD接口,可以连接EMMC。 57 | 58 | 不过由于eMMc芯片的封装较为精密,所以本次DIY不会使用。 59 | 而Nand封装虽然常用,但是Nand的价格仍然较tf卡贵很多,所以也不使用。 60 | 而TF卡既便宜,烧写方式也比nand什么的简单,还可以说是家中常备的,所以本次DIY使用的系统存储介质就选用TF卡。 61 | 62 | ## 四.SD卡引脚介绍 及 原理图 ## 63 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/92785299.jpg) 64 | TF卡的原理图比较简单,如上图所示,主要是4线数据线,时钟线和命令线。 65 | 除了时钟线之外的信号线需要加上上拉电阻保证信号稳定。 66 | 这里使用的自弹式tf卡槽还有个tf检测引脚,这里暂不连接。 -------------------------------------------------------------------------------- /连载帖/1.1.4 多媒体类接口设计.md: -------------------------------------------------------------------------------- 1 | #多媒体类接口设计 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 1.原理图设计 8 | -> 4.多媒体类接口设计 9 | ``` 10 | 主要介绍A13的LCD接口,摄像头接口,音频接口,TV,以及USB Host,OTG接口。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.A13 LCD/TV 控制器 及 原理图设计## 14 | ###TCON框图### 15 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/8882894.jpg) 16 | 上图是A13的LCD/TV控制器框图,可见在其内部是支持LCD,LVDS,和CVBS的 17 | 然而实际的引脚中只有LCD接口被明确标识,还有一个疑似CVBS输出引脚的NC引脚Pin99(该引脚在R8芯片中为TV输出)。 18 | 所以在设计中引出LCD接口,TV接口也预留引出,待测试是否可用。 19 | 20 | ###LCD接口设计### 21 | A13支持多种LCD接口: 22 | 1. **RGB接口** 23 | 1. 并行 24 | 2. 串行 25 | 3. CCIR656 26 | 2. **CPU/I80接口** 27 | 1. 并行RGB666 28 | 2. 并行RGB565 29 | 3. 串行RGB666 30 | 4. 串行RGB565 31 | 32 | 在设计时考虑到LCD屏幕购买的便捷性,选用最通用的**40P 并行RGB LCD**屏幕。 33 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/96509119.jpg) 34 | 35 | 如上图所示,通用40P LCD自带 **led背光** 和 **四线电阻触摸**,非常适合显示及交互。 36 | A13也是支持四线电阻触摸功能的,可以进行两点触摸检测。 37 | 38 | **4.3寸 RGB屏幕和 OV7670摄像头模组** 39 | 40 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/601811.jpg) 41 | 42 | ###LCD转VGA设计### 43 | 考虑到有些应用需要使用显示器,所以额外设计了LCD转VGA的转接小板: 44 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/24736301.jpg) 45 | **GM7123** 是一款频率 330MHz 的 3 通道 10 位高速视频 DAC 芯片, 46 | 兼容 RS-343A/RS-170标准差分输出,输出电流范围是 2mA~26mA。 47 | 输入兼容 TTL 电平,内部基准 1.23V,单电源 3.3V 供电,采用 LQFP48 封装。 48 | 该芯片可应用于:数字视频系统( **1600×1200@100Hz**);高分辨率彩色图像;数字射频调制;图像处理;仪器和视频信号重建等。 49 | 50 | 51 | 简单来说,GM7123就是把数字化的RGB数据转成了VGA信号里模拟的RGB信号,是一个高速DAC转换器。   52 | 对于分辨率不高,色深较浅的应用,甚至可以使用电阻分压来完成RGB LCD转VGA信号。 53 | 54 | 55 | ## 二.摄像头接口设计 ## 56 | A13的CMOS Sensor Interface(**CSI**)支持 57 | 1. 8位输入数据 58 | 2. NTSC/PAL的CCIR656 59 | 3. 解析数据到RGB或YCbCr平面 60 | 4. etc. 61 | 62 | 这里选择了常用的 **OV7670**摄像头模组 (30W像素)的引脚定义, 63 | 该引脚定义也 适用于高分辨率的**OV2640**模组(200W像素)等,只是核心电压有差别,可以通过调整PMU的LDO输出电压来适配。 64 | 65 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/30763879.jpg) 66 | 67 | ## 三.音频,TV接口设计 ## 68 | A13自带立体声音频编码解码器 以及 耳机功放,具有以下特性: 69 | 1. 内置24位DAC 70 | 2. 内置24位ADC录音 71 | 3. 支持48K,44.1K采样 72 | 4. 支持192K,96K解码 73 | 5. 立体声耳机功放支持无电容的耳机模式 74 | 75 | A13的疑似存在的TV接口部分,直接照搬A20的设计,就是一个简易的CVBS视频信号滤波器。 76 | 麦克信号与TV信号通过一个选择电阻来选通。 77 | 耳机座的连线使用常用的4段耳机插头的线序。 78 | 79 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/1978974.jpg) 80 | 81 | ## 四.USB接口设计 ## 82 | ###USB OTG接口### 83 | USB OTG接口既可以连接到电脑来取电,又可以连接一些外设来扩展功能。 84 | 为了防止作为主机使用时外部取电过大,造成电源损坏,所以在USB_VBUS和5V电源间加SY6280来限流保护 85 | 86 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/70159266.jpg) 87 | 88 | ###USB HOST接口### 89 | 为了方便荔枝板的网络通信,这里占用USB HOST口来连接wifi/BT模块;需要接usb外设的可以考虑使用otg口来接外设。 90 | 同时也留下了USB母口的封装复用,需要外接hub的可以选择焊接USB母口。 91 | 92 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/72144360.jpg) 93 | 94 | ## 五.其它 ## 95 | **LRADC**的按键接口,A13的LRADC为6bit精度,可以如下图级联扩展多个按键。 96 | 下图的按键兼具开机BOOT选择(开机按下进入FEL更新程序),和安卓HOME键功能。 97 | 98 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/65894295.jpg) 99 | 100 | 应网友要求,增加了RGB LED方便指示工作状态。 101 | 102 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/50848599.jpg) 103 | -------------------------------------------------------------------------------- /连载帖/1.1.5 其它接口引出.md: -------------------------------------------------------------------------------- 1 | #其它接口引出 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 1.原理图设计 8 | -> 5.其它接口引出 9 | ``` 10 | 主要介绍A13的一些低速外设脚的引出 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.A13的低速外设接口## 14 | 连接了前面的那些主要接口后,还剩余以下这些接口,通过2.54双排针引出 15 | 16 | | 功能 | 端口引脚 |备注| 17 | | ----- |-----------|-----| 18 | |SPI1/UART3| PG9~12|带CTS/RTS的UART3和SPI1复用| 19 | |SPI0|PC0~3|-| 20 | |CSI/SPI2| PE0~11|主功能是摄像头接口,不接时可使用SPI2| 21 | |UART1| PG3~4|默认的系统调试信息输出口| 22 | |I2C0| PB0~1|默认接PMU| 23 | |I2C1| PB15~16|-| 24 | |I2C2| PB17~18|-| 25 | |IR_TX/RX| PB3~4|红外发射、接收口| 26 | |PWM| PB2|默认LCD背光控制| 27 | |GPIO|PC4~5,PC12~15,PC19|约7个剩余IO| 28 | 29 | 1. I2C: 支持10bit地址,400Kbps 30 | 2. SPI: 8*64 Byte FIFO, 主从可设置 31 | 3. UART:64 Byte FIFO,支持5~8数据位,可选校验位,1,1.5,2停止位 32 | 4. CIR: 双向8*16bit FIFO,支持常用红外遥控协议 33 | 34 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/5579458.jpg) -------------------------------------------------------------------------------- /连载帖/1.2.1 PCB参数确认及布局.md: -------------------------------------------------------------------------------- 1 | #PCB参数确认及布局 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 2.PCB设计 8 | -> 1.PCB参数确认及布局 9 | ``` 10 | 主要介绍荔枝板的PCB参数,以及初步布局 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.PCB参数确认## 14 | ###PCB板厂选择### 15 | 由于是个人DIY项目,资金不是很充裕,所以只能选择一些默认的工艺,和低价便捷的板厂,兴森快捷什么的就不用考虑了哈。 16 | 17 | ---------- 18 | 19 | 个人最常用的打样板厂是 **[嘉立创](http://www.sz-jlc.com/home/index.html)**, 20 | **优点** 21 | - 速度快,价格低,广东省内包邮 22 | - 可在线下单,甚至有配套APP 23 | - 可同时购买钢网,元件 24 | - 今年(2016)上线了低价样板贴片服务 25 | 26 | **缺点** 27 | - 工艺精度不高,最小6/6mil线宽线距,12/24mil过孔,基本做不了BGA 28 | 29 | 嘉立创的生产工艺不高,所以也就是平常打些简单的样板比较合适,相对来说包邮挺划算O(∩_∩)O~ 30 | 31 | ---------- 32 | 33 | 由于荔枝板里使用了FBGA96的DDR3芯片,*焊盘大小0.4mm*(16mil),*焊盘间距0.8mm*, 所以嘉立创的工艺是无法走通的,这时候就用到备选的PCB板厂**[华强PCB](http://www.hqpcb.com/)** 34 | **优点** 35 | - 速度快,价格低 36 | - 可在线下单 37 | - 工艺精度高,最高可达3/3mil线宽线距,8/16mil过孔 38 | 39 | **缺点** 40 | - 在订单高峰期 交货速度可能比较慢 41 | - 不包邮 42 | 43 | ###PCB参数选择### 44 | 45 | 虽然华强PCB的制程精度高,但是额外的精度也是要钱的,所以这里来确定我们所需的最低的PCB精度要求。 46 | 主要是FBGA96的焊盘对过孔的要求比较高,实测后发现,使用10/18mil的过孔 搭配 5mil的走线可以扇出FBGA96. 47 | 48 | 然后就是PCB层叠结构。层叠结构主要影响到走线阻抗,但是由于做阻抗的收费太高(500起),所以就选用了默认的层叠结构: 49 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/36831848.jpg) 50 | 51 | 最终确认的PCB参数如下: 52 | 53 | | 项目 | 参数 | 54 | | -----|----| 55 | | 板厚 | 1.6mm | 56 | |层数|4| 57 | |外层铜厚| 1oz(0.35mm)| 58 | |内层铜厚|0.5oz(0.17mm)| 59 | |PP胶厚| 0.2mm| 60 | |芯板厚|1.1mm| 61 | |最小线宽线距|4mil| 62 | |最小过孔|10/18mil| 63 | 64 | ## 二.PCB 布局## 65 | 以下是大致的PCB布局设计,但实际上布局是很难一开始就确定的(特别是走线层数少的时候),布局往往是边布线边修改的,和一开始设想的布局相差很大,它是比较方便走线的一个布局。 66 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/80730041.jpg) 67 | 68 | 最终的3d效果图如下: 69 | **正面** 70 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/34549630.jpg) 71 | 72 | **反面** 73 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/805059.jpg) 74 | -------------------------------------------------------------------------------- /连载帖/1.2.2 DDR部分Layout.md: -------------------------------------------------------------------------------- 1 | #DDR部分Layout # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 2.PCB设计 8 | -> 2.DDR部分Layout 9 | ``` 10 | 主要介绍荔枝板的DDR布线 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.DDR布线一般规则## 14 | ###阻抗匹配### 15 | - DQn/DM/DQS, CLK,传输线阻抗50欧,差分阻抗100欧 16 | - 线距3W,或者至少4mil 17 | 18 | ###等长约束### 19 | - CKP/N严格等长(<5mil),长度小于4inch 20 | - DQS以CLK为基准,误差+-250mil,P/N间严格等长,<5mil 21 | - DQ八根一组与对应DQ严格等长,误差50mil 22 | - DM与对应DQ严格等长,误差50mil 23 | - ADDR[0:14]以CLK为基准,误差100mil。 24 | - 剩余控制信号以CLK为基准,误差100mil。 25 | 26 | ###差分线约束### 27 | - 差分线和其他线距离12mil以上,长度差<5mil,线间距>4mil 28 | - 蛇形线的平行长度不宜过长,宜45度走线 29 | 30 | ###电源滤波### 31 | - 每个电源管脚放104,至少有一个10uf 32 | - 每2厘米电源线放一个10uf 33 | 34 | ## 二.DDR布线实用规则## 35 | ###阻抗匹配### 36 | - 阻抗匹配适用于**“长”线传输**,一般来说信号线长超过十分之一的波长才需要考虑阻抗匹配。 37 | 38 | > PP胶介电常数约4.7,电磁场传播速度约(1/sqrt(4.7))=1/2.1, 即传播速度为 150mm/ns~6inch/ns 39 | DDR3-1066时钟频率533MHz~0.5GHz,周期约2ns, 所以波长约300mm,波长/10约30mm 40 | 所以当DDR信号线走线长度小于30mm~1200mil时,可以不考虑阻抗匹配 41 | 42 | 荔枝板在实际布线时可以目测到走线长度在1000mil以内,所以无需特别进行阻抗匹配。 43 | - 另一方面,可以计算阻抗失配后的波峰波谷电压,看是否在合理范围 44 | > 荔枝板prepreg为0.2mm(7628),走线为5mil,计算得阻抗约75~80欧,归一化阻抗约1.5 45 | > 反射系数=(1.5-1)/(1.5+1)=0.2 46 | VH波峰电压=1.5x1.2=1.8V <= Vmax 1.8V 47 | VH波谷电压=1.5x0.8=1.2V > 0.75+0.1 = 0.85V 48 | 所以这种程度的阻抗失配还不会直接造成信号传输错误 49 | 50 | 通过以上规则的取舍,实际应用中可以省下几百块阻抗费 O(∩_∩)O~ 51 | (阻抗计算器si9000) 52 | 53 | ###等长约束### 54 | - 等长约束通常是芯片相关的,最好翻阅对应芯片的手册 55 | - 有时候蛇形走线造成的串扰影响甚至会超过不等长的影响,这里也需要取舍 56 | 57 | ## 三.DDR布线小技巧## 58 | - 放DDR之前先 大致确认下连线最长和最短的信号线,合理摆放使得两个最值之间的差距尽量小 59 | - 放置好DDR后,先打好电源引脚的过孔,放上滤波电容,防止布好线后找不到地方打孔。。 60 | - 走线时先走最长的线和差分线,确定长度基准 61 | - 需要绕等长时,外部的线直接往外扩,让内部线有空间绕等长 62 | - 顶层和底层的走线数目大致相同,可以使得布线面积较小 63 | 64 | ## 四.Altium Designer 布DDR指南## 65 | - AD15之后的版本具有x-signal功能,类似x-net,可以利用该功能控制等长 66 | - 首先选中CPU和DDR,然后右键->xsignals->create xsignals between component,即可添加需要的信号线到xsignal 67 | - 然后可以在rule里设置规则,在右下角的PCB里点开查看信号线长度 68 | - ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/23590492.jpg) 69 | - 调整差分线等长,T->I, 交互式差分线长度调整; 70 | - tab键,输入要调整到的长度,以及幅度,间距(建议更大于3W)等 71 | - 通过1234来微调蛇形形状,逗号,句号 调整幅度 72 | - 空间有限时,可以手动来调整线长。 73 | - 调整差分线接近最长的其他走线 74 | - 调整其它线长T->R (交互式线长调整), 75 | - 按tab设置等长选项(会自动以原理图里的差分线为基准),可以设置蛇形幅度,间距(最好3W以上) 76 | - 然后按1234等按键微调蛇形形状,调整至等长;按逗号和句号调整幅度; 77 | - 最终效果 78 | - ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-26/32807697.jpg) 79 | 80 | 81 | -------------------------------------------------------------------------------- /连载帖/1.2.3 电源层分割.md: -------------------------------------------------------------------------------- 1 | #电源层分割 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 2.PCB设计 8 | -> 3.电源层分割 9 | ``` 10 | 主要介绍荔枝板的电源层分割 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.多层板的电源层设置## 14 | 在4层及以上PCB中,通常有两层作为电源层和地层,而不是像双面板那样大面积敷地。 15 | 这样设计的好处是: 16 | - 方便走线 17 | - 只要在需要接地或者接电源的地方打过孔即能联通,再也不用绕线连接了~ 18 | - 方便控制阻抗 19 | - 对于需要控制阻抗的电路来说,两层板的厚度是很难做到对应的阻抗的,4层板一般0.2mm的PP胶就较容易做到对应阻抗 20 | - 底下有完整的地参考层容易控制阻抗 21 | - 较大的电源平面保证电压的一致性 22 | 23 | ## Altium Designer下的电源层设置 ## 24 | AD中的层叠管理器设置如下: 25 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/570660.jpg) 26 | 电源层和地层都是 **Internal Plane**,即**负片层**,画线的地方是无铜的,所以又被称为电源层分割。 27 | 28 | 注意打的过孔在负片层会有一段“清空”距离,有时候太密的过孔会截断电源层或地层的回流, 29 | 这时就需要调整过孔的分布,或者在规则里减小些这个“清空”距离 30 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/1530652.jpg) 31 | 32 | 最后完成的电源层分割如下,可以看到A13由于有众多电源,整个电源平面被分割得很厉害 33 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/99989785.jpg) 34 | 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /连载帖/1.2.4 TF卡及其余接口layout.md: -------------------------------------------------------------------------------- 1 | #TF卡及其余接口Layout # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 2.PCB设计 8 | -> 4.TF卡及其余接口Layout 9 | ``` 10 | 主要介绍荔枝板的TF卡及剩余的布线 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.TF卡布线## 14 | A13支持的UHS-1的SD接口带宽是104MB/s,由于SD接口是4线的,所以时钟频率是208MHz。 15 | 所以时钟周期约5ns,波长150x5=750mm,波长的1/10=75mm 16 | 而从荔枝板的大致布局上看,走线不会超过40mm,所以TF卡的布线可以不用考虑阻抗匹配。 17 | 18 | > 如果长度过长,则需要控制单端阻抗到50欧姆 19 | > 所有走线尽量同一层,参考GND平面 20 | 21 | SD信号线的等长控制,相对于DDR3宽松很多,数据线参考时钟线尽量等长,误差在+-300mil 22 | 时钟线和其它线之间距离要满足3W原则 23 | 24 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/48615677.jpg) 25 | 26 | 如果需要满足ESD要求,则 需要在TF卡接口处信号线加多个ESD二极管 27 | 28 | 29 | ## 二.USB布线## 30 | usb是差分信号线,USB2.0 的带宽**480Mbps**,比较高速, 需要严格控制等长和阻抗。 31 | USB信号的时钟周期约2ns,波长约150x2=300mm,波长的1/10=30mm 32 | 从荔枝板的布局来看,usb0的长度会达到50mm左右,所以对于USB的布线需要考虑阻抗匹配。 33 | 使用si9000计算可得,差分100欧阻抗时,需要**8mil走线,5mil线距**。 34 | USB走线的等长也需要在10mil以内。 35 | 36 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/43532268.jpg) 37 | 如果需要满足ESD要求,则 需要在usb接口处信号线加多个ESD二极管 38 | 39 | ## 三.WIFI模块的天线布线## 40 | 本来想直接在板上直接画上PCB天线,但由于两边有定位孔在,估计效果会不太好,所以就放了个IPEX座子的封装上去。 41 | 42 | WIFI是2.4G射频信号,周期约0.4ns,波长150x0.4=60mm,波长的1/10=6mm 43 | 从wifi模块的布局上看,模块到IPEX座距离差不多超过了6mm,所以需要考虑下阻抗匹配 44 | 使用si9000计算阻抗得,单端50欧姆阻抗时,需要**13mil走线** 45 | 46 | 在天线引脚和IPEX座之间还需要加上一个pi型匹配电路,用于额外的阻抗微调。 47 | 48 | ## 四.其余走线布线## 49 | 其余走线,如摄像头,RGB LCD接口等,时钟速率都在100MHZ以下,属于较低速的信号,基本上布通就行。 50 | 布线时可以适当调整元件布局使得整体更方便布线。 51 | 52 | ## 五.最终布线## 53 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/28679899.jpg) 54 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/4100876.jpg) 55 | -------------------------------------------------------------------------------- /连载帖/1.3.1 样板焊接备料.md: -------------------------------------------------------------------------------- 1 | #样板焊接备料 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 3.样板焊接 8 | -> 1.样板焊接备料 9 | ``` 10 | 主要介绍荔枝板的样板焊接之前的准备工作,PCB打样,bom生成备料,钢网准备。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一.PCB打样 ## 14 | 在 之前的PCB参数确认 一节中就选用了华强PCB,在华强PCB的官网直接下单即可 15 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/79764304.jpg) 16 | 17 | 326.5 = 200样板费 + 50过孔费 + 50BGA费 + 税费 18 | 周五下的单,周一就收到了,速度还是挺快的~ 19 | 20 | ## 二.钢网准备 ## 21 | 华强PCB上貌似没有钢网选项,就直接在嘉立创上下单了钢网 22 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/55641158.jpg) 23 | 24 | 嘉立创的钢网还是比较贴心的,之前PCB打样回来就发现有个小问题,PMU的底部焊盘忘开窗了,钢网回来却发现嘉立创发现了这个问题并自动修正了。 25 | 26 | ## 三.bom生成及采购 ## 27 | 使用AD的BOM生成工具导出bom到xlsx,然后就可以按照BOM列表采购。 28 | 电子料样品我一般在[优信](https://youxin-electronic.taobao.com/)买,比较全,价格也可以。 29 | 30 | 在采购的时候发现有些E24的阻值买样品不好买,可以稍微调整下阻值到E12,方便采购。 31 | 还有一点就是,10uF的贴片电容,特别是小封装,大电压 的贴片电容会很贵,所以在之前PCB布板时就应该尽量选择大封装的。 32 | 33 | 在采购中也发现0.03欧的精密采样电阻比较难买,特别是0805小封装的,大多都是1206,2010的,这也给我们一个提醒,就是在设计PCB的时候一定要确认物料的采购情况。 34 | 35 | -------------------------------------------------------------------------------- /连载帖/1.3.2 样板元件焊接.md: -------------------------------------------------------------------------------- 1 | #样板元件焊接 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 3.样板焊接 8 | -> 2.样板元件焊接 9 | ``` 10 | 主要介绍荔枝板的样板元件焊接 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 一. 外发PCB焊接 ## 14 | 外发样板焊接是最轻松的方式,目前一款PCB样板焊接费用是300起步,价格是比较合理的,只是来回快递会花费不少时间。 15 | 最近嘉立创还提供了SMT服务,可以贴常用的阻容元件,工程费只要100,在嘉立创打样的PCB可以试试,不过只能单面贴片。 16 | 小批量生产时,只要提供好产测设备,SMT厂也会帮你做好PCB的检测(当然是要加钱的),这个在后面的小批量生产一节中再详述。 17 | 如果有样板焊接或者SMT小批量生产需求的也可以联系我 O(∩_∩)O~ 18 | 19 | ## 二. 手工样板焊接 ## 20 | 有时候由于时间关系,或者个人DIY兴趣,可以进行手工样板焊接,下面介绍常用元器件的手工焊接方法 21 | ###分立元件及大引脚间距芯片 ### 22 | 少量的此类元件可以直接使用镊子夹持摆放,手工使用烙铁焊接 23 | 焊小封装元件如0402时,利用放大镜台灯就会轻松很多 24 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/50457058.jpg) 25 | 26 | 27 | 但是如果需要焊接很多分立元件的话,手焊就很痛苦了,这时候推荐使用手工贴片焊接 28 | 钢网目前大概是40~50元每款,在嘉立创打样的话可以一同购买方便焊接 29 | 锡膏建议使用针筒式的,易于保存 30 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/27436433.jpg) 31 | 32 | 加热焊接 可以使用小型的回流焊机,或者直接用热风枪吹。 33 | 如果是单面元件,强烈推荐使用PTC恒温加热板焊接,比热风枪快很多,价格也在10元以内 34 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-27/34765938.jpg) 35 | 36 | ### 密引脚芯片 ### 37 | 像A13这样的eLQFP封装芯片,引脚间距特别密(不到0.5mm),那么使用拖焊是最合适的 38 | http://blog.sina.com.cn/s/blog_6566538d0100qjei.html 39 | 40 | ### BGA 芯片焊接 ### 41 | 对于像DDR之类的BGA芯片,其实只要涂好助焊膏,摆放齐位置,使用热风枪或者PTC都能 很好地焊接上。 42 | http://blog.163.com/mcu_expert/blog/static/1312451532010921112128366/ 43 | 44 | 如果有个数字摄像头观察焊接,那会更直观: 45 | http://v.youku.com/v_show/id_XMTYyNTI5MjQyNA==.html 46 | -------------------------------------------------------------------------------- /连载帖/1.3.3 电源晶振等初步确认.md: -------------------------------------------------------------------------------- 1 | #样板电源晶振初步确认 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 3.样板焊接 8 | -> 3.电源晶振初步确认 9 | ``` 10 | 主要介绍荔枝板样板焊接完成后,电源晶振初步确认 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | -------------------------------------------------------------------------------- /连载帖/2.1.0 使用git进行项目管理.md: -------------------------------------------------------------------------------- 1 | # 使用git进行项目管理 2 | 3 | ------ 4 | 5 | - 一、git与github简介 6 | - 二、环境配置 7 | - 三、Git入门准备(以荔枝派库为例) 8 | - 四、git工作流程简介 9 | - 五、具体操作 10 | - 六、更多 11 | 12 | ------ 13 | ##**一、Git与Github简介** 14 | >* Git是一种版本控制系统,是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问。Git诞生于2005年,由Linux开源社区(特别是Linux的缔造者Linus Torvalds)开发。 15 | Git 的特点: 16 | - 支持离线开发,离线仓库(Repository) 17 | - 强大的分支功能,适合多个独立开发者协作 18 | - 速度块 19 | 20 | >* Github是一个网站,给用户提供git服务。 这样你就不用自己部署git系统,直接用注册个账号,用他们提供的git服务就可以。所以只要到[www.github.com](https://www.github.com)申请一个github帐号,就可以免费使用git服务。 21 | 22 | Github将每一个项目称作一个`“仓库”(repository)`,在仓库里,你可以自由地添加、同步、删除文件,而且可以多人协作对一个仓库中的文件进行修改。横向上,github采用`工作流`的方式,你的本地仓库由git维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;最后是HEAD,它指向你最后一次提交的结果;纵向上,github采用主干-分支的流程控制方式,采用多分支实现单人多作和多人协作,可以方便地找回任何一个修改节点的记录。 23 | 本文主要介绍如何使用git进行合作项目管理,希望之前没有接触过`git`和`github`的朋友可以通过这篇介绍对如何使用git有一定的了解。 24 | 另外,我们使用命令行的git操作方式,所以没接触过的朋友需要先学会使用简单的命令行操作;如果需要像本文一样进行`Markdown`文本格式编辑,需要使用相应的Markdown格式;涉及到在`vim`编辑器中进行代码或文本的修改,需要了解一些vim相关的使用命令。这些我就不再一一叙述,如果还不会的可以自行查阅网上相关资料进行学习。下面正式发车: 25 | *** 26 | 27 | ##**二、环境配置** 28 | + 第一次接触git和github的朋友,需要先配置环境。首先,到[https://git-scm.com/download](https://git-scm.com/download),根据自己的操作系统选择下载对应的客户端(一般linux已经预安装)。下载后安装、打开,进入git(命令行界面)。 29 | ![图例2.1](http://i2.buimg.com/567571/5a9b2093b6256416.png) 30 | 31 | + 然后,我在自己电脑的E盘建立了一个专门用于git操作文件的文件夹,这个文件夹就相当于github的本地站点,比如我建了e盘的github/my_site文件夹。在命令行中,去到对应的文件夹: 32 | ```python 33 | 姜朝峰@DESKTOP-J5JHQ29 MINGW64 ~ 34 | $ cd e:/github/my_site 35 | ``` 36 | 于是打开了根目录,输入ls命令,该目录下还没有文件: 37 | ```pyhton 38 | 姜朝峰@DESKTOP-J5JHQ29 MINGW64 /e/github/my_site 39 | $ ls 40 | ``` 41 |
![图例2.2](http://i2.buimg.com/567571/cfd9b12487742ecf.jpg) 42 | 图例2.2
43 | 44 | + 接着,我们要建立本地库和github上对应代码库的连接,对应到群主的github代码库中,就需要进行下面的设置。在本地创建ssh key,建立和github服务器的连接: 45 | ```python 46 | $ ssh-keygen -t rsa -C "your_email@youremail.com" 47 | ``` 48 | 后面的your_email@youremail.com改为在github上注册的邮箱(如图),之后会要求确认路径和输入密码,我们默认一路回车就行。 49 |
![图例2.3](http://i2.buimg.com/567571/7f105b32fb6d597a.jpg) 50 | 图例2.3
51 | 52 | 成功的话会在“C:\Users\XXX”下生成.ssh文件夹,进去并打开id_rsa.pub,复制里面的key。 53 |
![图例2.4](http://i2.buimg.com/567571/9bb3fbf88a3d27e4.jpg) 54 | 图例2.4
55 | 56 | 回到浏览器打开github,进入Settings(配置),左边选择“SSH and GPG Keys”,点击“New SSH Key”,随便填一下title,粘贴生成的key。 57 | 58 | 59 |
![图例2.5](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/46401981.jpg) 60 | 图例2.5
61 | 62 | + 为了验证是否成功,在git bash下输入: 63 | ```python 64 | $ ssh -T git@github.com 65 | ``` 66 | 如果出现下图所示的情况,这就表示已成功连上github。如果要多人协作对这个库进行修改,就需要把合作者的SSH KEY都添加到账户列表中。 67 |
![图例2.6](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/6612013.jpg) 68 | 图例2.6
69 | 70 | + 在我们能用git工作之前,我们需要还做个一次性的用户配置。为了git能跟踪到谁做了修改,我们需要设置用户名和账户。发送下面的命令,相应地替换掉其中的“your_username”和“your_email@server.com”,改成自己的信息: 71 | ```python 72 | git config --global user.name "your_username" 73 | git config --global user.email your_email@server.com 74 | ``` 75 | + 设置好之后,再输入初始化命令,就把当前目录作为git根目录,创建了一个本地仓库: 76 | ```python 77 | git init 78 | ``` 79 |
![图例2.7](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-22/49964901.jpg) 80 | 图例2.7
81 | 82 | 最后出现“Initialized empty Git repository in E:/github/my_site/.git/”的指令,说明git的初始化配置成功。Git会在my_site文件夹内创建一个名为.git的隐藏文件夹,那就是你的本地代码仓库。 83 | 如果不进行初始设置,你就无法提交任何东西。设置好之后,下一次打开可以直接工作,不用再设置一次。不过要是换了电脑,那就需要再设置一遍。 84 | 85 | 我们希望为荔枝Pi的github项目库增加或修改内容,这就涉及到多人一起在github上的开发。一般有三种方法: 86 | >* 第一种:把各位的公钥加到该项目的公钥列表里; 87 | >* 第二种:在github建一个**orgnization**,然后建一个**team**,把大家加到team并把项目放到team下; 88 | >* 第三种:就是你要修改的人**fork**,然后给群主发**pull request**,等群主通过。 89 | 第一种上面的环境配置中已经谈到,第二种可以自行到github了解,这里推荐第三种方式。 90 | 91 | + 到此,就完成了git的环境配置,可以开始具体的工作流程。 92 | *** 93 | 94 | ##**三、Git入门准备(以荔枝派为例)** 95 | 96 | **提醒**:下面有的操作要在命令行界面,有的要在浏览器中到github主页鼠标操作,注意切换。 97 | 98 | ###1. 复制别人的代码库(fork) 99 | 如果想参与到对别人代码库内容的增加或修改中,可以先fork再pull request。**fork**就是**复制**别人这个项目代码库到自己帐号下;**pull request**后面会谈到。 100 | 比如群主A有一個代码库a(也就是荔枝派的github主页),用浏览器打开: 101 |
![图例3.1](http://i2.buimg.com/567571/f6116ed69b70d8eb.png) 102 | 图例3.1
103 | 104 | 你叫做B,看到这个觉得不错,所以就**fork**(点击图中右上角的fork图标)一個到自己的代码库中,现在暂且称为代码库b。这时,你查看自己的profile下面的就会多出了一个illichee的代码库。a和b的修改互不干预,大家可以随意修改自己的代码库b,群主的a不会受影响。另外,旁边的“Star”表示持续关注别人项目更新,“Watch”则是设置接收邮件提醒。 105 |
![图例3.2](https://raw.github.com/RubyLouvre/mass-Framework/master/course/4.jpg) 106 | 图例3.2
107 | 108 | ###2. 复制远程代码库到本地(clone) 109 | 110 | 但现在,代码库b还是存放在github服务器上,你只能在浏览器中修改,不能本地修改。所以你想把这个远程代码库整个下载到自己的电脑上再修改的话,你需要**拷贝(clone)**它。发送(注意,此时要在根目录下): 111 | ```python 112 | git clone git@github.com:your_username/name_of_remote_repository.git 113 | ``` 114 | 得到如图: 115 | 116 |
![图例3.3](http://i2.buimg.com/567571/131e603c24c742ae.png) 117 | 图例3.3
118 | 119 | 果然在这台电脑本地库目录下多了一个“ilichee”的文件夹: 120 |
![图例3.4](http://i2.buimg.com/567571/440b2243df752932.png) 121 | 图例3.4
122 | 123 | 这样你就把代码库b都下载到本地了。以后,可以用相同的方法在不同的电脑上、由不同的人一起完成一个代码库。 124 | 另外,如果已经在本地的项目上工作了,只是想从远程代码库上取得它最新的版本,那我移动到项目的根目录下(注意,不在根目录下无法获取),并发送: 125 | ```python 126 | git pull first master 127 | ``` 128 | ###3. 推送到远程代码库(push) 129 | 130 | 在第一次你想推送一个本地代码库到远程代码库时,你需要把它添加到你的项目配置里。像这样做: 131 | ```python 132 | git remote add origin https://your_username@bitbucket.org/your_username/name_of_remote_repository.git 133 | ``` 134 |
![图例3.5](http://i2.buimg.com/567571/7278dadf2225764f.png) 135 | 图例3.5
136 | 137 | 注意这里的“origin”只是一个习惯。它是你的远程代码库的别名,但是你可以用其他任何你喜欢的词。你甚至可以有多个远程代码库,你只需要给它们起不同的别名。 138 | 之后,推送你的本地代码库的主干分支到你的远程代码库: 139 | ```python 140 | git push origin master 141 | ``` 142 | 下图是对该库文件修改后提交并推送的示例: 143 |
![图例3.6](http://i2.buimg.com/567571/ae42b03c927abfa2.png) 144 | 图例3.6
145 | ###4.同步代码库 146 | 假设按照上述的流程复制别人的代码库到自己的GitHub(fork),别人的代码库已经更新,自己复制的代码库有没有新代码可以提交,这时候就需要同步复制别人的源代码库。 147 | 进入clone到本地的代码库文件夹中,然后增加源分支地址到你项目远程分支列表中; 148 | ```python 149 | git remote add source https://github.com/originalL_owner/original_repo.git 150 | ``` 151 | 这里的source是自己给源仓库起的名字,可以起自己喜欢的。 152 | 153 | fetch源分支到本地 154 | ```python 155 | git fetch source 156 | ``` 157 | 然后,切换到本地 master 分支: 158 | ```python 159 | git checkout master 160 | ``` 161 | 合并两个版本的代码 162 | ```python 163 | git merge source/master 164 | ``` 165 | 把合并后的代码push到你的Github项目上去 166 | ```python 167 | git push origin master 168 | ``` 169 |
![图例4.1](http://i2.buimg.com/573139/d965b743e4217a3f.png) 170 | 图例4.1
171 | 这样 fork 源仓库、fork 仓库副本 和 local 仓库实现了同步更新 172 | ###5. 推送请求(pull request) 173 | 假设就按照上述流程,初始clone代码库到本地主机上,B就可以尽情修改code(branch、commit、merge、push),每次 B push 更新,都只会更新自己的代码库b,并不会影响到到A的代码库a。 174 | 如果哪天B觉得自己新增加的内容很不錯,可以帮助到群主A,想跟A分享,那就可以发一个**pull request**,问问A要不要这一份。 175 | 下面我用两个帐号模拟fork和pull request: 176 | 我用帐号B fork了A的一个代码库a,成为了自己的代码库b,修改提交之后,然后想把改动增加到库a里,于是点击“Create pull request”: 177 |
![图例3.7](http://i1.buimg.com/567571/602794dc1adce90b.png) 178 | 图例2.7
179 | 180 | A帐号马上收到了邮件通知,当然github主页也有timeline消息通知。 181 |
![图例3.8](http://i1.buimg.com/567571/950f871ec606979b.png) 182 | 图例3.8
183 | 184 | A收到这则pull request之后,如果覺得ok,用线上merge,就會將代码库b合并到代码库a上。 185 |
![图例3.9](http://i4.buimg.com/567571/78f4a14665338bef.png) 186 | 图例3.9
187 | 188 | 189 | 190 | 191 | 192 | *** 193 | ##**四、Git工作流程简介** 194 | - [x] 建立目录 195 | - [x] 加载文件(stage) 196 | - [x] 提交文件(commit) 197 | - [x] 创建分支(branch) 198 | - [x] 合并分支(merge) 199 | - [x] 丢弃分支 200 | - [x] 删除分支(delete) 201 | - [x] 回滚到之前的提交状态(back) 202 | - [x] 复制和推送请求(fork/pull request) 203 | - [x] 推送到远程代码库(push) 204 | - [x] 取得远程代码库的拷贝(pull) 205 | - [x] 更多······ 206 | 207 | 首先,你需要去github上将别人的代码库**`复制`**到自己的库中,也可以先在自己的电脑上**`建立目录`**,相当于自己的个人站点,对应着github服务器上的站点。接下来,你可以在这个目录下进行创建新文件、修改文件等等操作,修改完之后,就需要**`加载文件`**,也就是把修改过的文件正式放进自己的项目里。而**`提交文件`**则是把文件上传到github服务器,进行文件同步。接着,我想加入新的代码进行测试,那么就可以**`创建分支`**。建立分支是你创建代码的独立版本的动作,独立于你的主干分支,相当于进入了另外一条“时间河流”。默认情况下,每次你提交到Git的文件都会被储存到主干分支。满意的话将新分支和主干**`合并分支`**,不满意的话“时光倒流”回到主干,并**`删除分支`**。如果发现新增的改动有问题,可以**`回滚到之前的提交状态`**。终于,本地的修改结束,想要上传到github,就可以**`推送到远程代码库`**;相反,如果想把github仓库里的文件下载到本地,可以**`取得远程代码库的拷贝`**。 208 | 209 | *** 210 | 211 | 212 | 213 | ##**五、具体操作** 214 | 下面,我们以windows上的操作步骤为例进行示范(linux类似)。 215 | 216 | ###1. 加载文件 217 | 我用vim指令创建并保存了text1.txt和markd.md两个文本文件,但它们还没有放入中。现在加载(stage)所有项目文件仓库(repository),输入: 218 | ```python 219 | git add . 220 | ``` 221 | 最后的“.”符号的意思是“所有文件、文件夹和子文件夹”。 222 |
![图例2.1](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/38985471.jpg) 223 | 图例2.1
224 | 225 | 假如我们只想要把特定文件添加到源代码控制中去,我们可以指定要添加的文件。比如,我用vim创建了两个markdown文件------README1.md、README2.md,发送: 226 | ```python 227 | git add README1.md, README2.md 228 | ``` 229 |
![图例2.2](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/42005549.jpg) 230 | 图例2.2
231 | 232 | ###2. 提交文件 233 | 234 | 现在,我们想要提交已加载(staged)的文件。提交文件时,我们需要给这个状态一个备注,所以我们提交我们的文件时,总是附带着有意义的注释,描述了它们现在的状态。比如用“first commit”来作为第一个提交的注释,如下: 235 | ```python 236 | git commit -m "first commit" 237 | ``` 238 |
![图例2.3](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/37236592.jpg) 239 | 图例2.3
240 | 241 | 但发现至提交了3个文件,检查可知我把其中一个文件README2.md打成了README2.MD,修改后重复上面的操作即可。 242 | 这样我们就用“first commit”代表这个时间点提交的修改,后面还可以再回滚到这个提交状态。 243 | 提交之后,如果你想查看现在已加载、未加载的文件及状态,可以用以下命令: 244 | ```python 245 | git status 246 | ``` 247 |
![图例2.4](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/10794292.jpg) 248 | 图例2.4
249 | 250 | ###3. 创建分支 251 | 252 | 如果要写或者测试新的部分,还不想直接加入到程序中时,就可以创建分支,就像暂时踏入另一条时间的河流一样。建立分支是你创建代码的独立版本,独立于你的主干分支。默认情况下,每次你提交到Git的文件都会被储存到“master(主干)”分支。 253 | 创建并同时切换到你新建的分支,发送: 254 | ```python 255 | git checkout -b new_feature 256 | ``` 257 |
![图例2.5](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/37239574.jpg) 258 | 图例2.5
259 | 260 | 或者,你可以先创建一个分支然后手动切换,输入命令: 261 | ```python 262 | git branch new_featuregit checkout new_feature 263 | ``` 264 | 要看你现在项目下所有的分支,输入如下指令: 265 | ```python 266 | git branch 267 | ``` 268 |
![图例2.6](http://7xrn7f.com1.z0.glb.clouddn.com/16-8-23/54073796.jpg) 269 | 图例2.6
270 | 271 | 现在你可以在你的项目上无所顾忌地做任何你想做的:任何时候,你都可以回到你创建分支前的状态。你同时可以有多个分支,甚至可以从一个分支上再创建一个分支。 272 | 273 | ###4. 合并分支 274 | 275 | 现在我在新的分支new_feature做一些修改,比如删除了README2.md。 276 |
![图例2.7](http://ww3.sinaimg.cn/large/74311666jw1f732uvb6o4j20cg06fwgj.jpg) 277 | 图例2.7
278 | 279 | 在这个分支上修改得差不多的时候,如果想要把这个分支加回到主干(master)上,首先需要加载(stage)并且提交(commit)你的文件: 280 | ```python 281 | git add .git commit -m "third commit" 282 | ``` 283 | 然后你移到主干分支: 284 | ```python 285 | git checkout master 286 | ``` 287 | 288 | 最后像这样合并: 289 | ```python 290 | git merge new_feature 291 | ``` 292 |
![图例2.8](http://ww3.sinaimg.cn/large/74311666jw1f732uvb6o4j20cg06fwgj.jpg) 293 | 图例2.8
294 | 295 | 此时,主干分支就和新功能分支会变成一样的了。 296 | 297 | ###5. 丢弃分支 298 | 299 | 相反,如果你打算丢弃你在分支里做的修改,你首先需要加载你的文件并且在分支里提交: 300 | ```python 301 | git add .git commit -m "feature to be discarded" 302 | ``` 303 | 然后,你移到主干分支: 304 | ```python 305 | git checkout master 306 | ``` 307 |
![图例2.9](http://i4.buimg.com/567571/44f97ee4131ae283.png) 308 | 图例2.9
309 | 310 | 现在,你的代码处于你创建分支之前的状态了。 311 | 312 | ###6. 删除分支 313 | 314 | 如果你要把你的分支合并到主干分支,从主干(master)分支上发送: 315 | ```python 316 | git branch -d new_feature 317 | ``` 318 |
![图例2.10](http://i4.buimg.com/567571/c5d13b847ae0bd22.png) 319 | 图例2.10
320 | 321 | 发现"new_feature"这个分支确实被删除了。 322 | 假如修改已经合并了,它只会删除分支。假如分支没有合并,你会得到一个错误信息。删除一个未合并的分支(通常你不想保留的修改),你需要发送一样的命令附带一个大写D。意思是“强制删除分支,无论如何我不想要它了”。 323 | ```python 324 | git branch -D new_feature 325 | ``` 326 | ###7. 回滚到之前的提交状态 327 | 328 | 在某些时候,你可能想要回到之前的代码版本。首先,你需要找到你想回到哪个版本。要看所有的完成了的提交,发送: 329 | ```python 330 | git log 331 | ``` 332 |
![图例2.11](http://i2.buimg.com/567571/61f7c94d879a7f89.png) 333 | 图例2.11
334 | 335 | 336 | 这会输出你的提交的历史记录。 337 | 338 | 如果你想回到“second commit”这个提交,简单地用提交的ID做签出(checkout)(可以只用到ID开头的9个字符) 339 | ```python 340 | git checkout cc87a2d42 341 | ``` 342 |
![图例2.12](http://i2.buimg.com/567571/d94a33cde2ab47dc.png) 343 | 图例2.12
344 | 345 | 你也可以签出到一个新的分支,像这样: 346 | ```python 347 | git checkout -b my_previous_version cc87a2d42 348 | ``` 349 | 但是,要注意保持分支的清晰,太多的分支会导致整个仓库的混乱,让整个项目失去控制。 350 | 351 | 352 | 353 | ###**六、更多** 354 | 355 | + 如果对命令行的git使用方式很不适应,还可以下载git的**GUI版本**,比如GitHub Desktop和Gitbox(见网站https://git-scm.com/downloads/guis),GUI版本的git确实要比命令行更直观更容易入门。 356 | + 当然,还有比这些更多的**Git**的相关知识,本文也是我参考网上的资料进行整理、修改和实践得到的。如果有疑惑或者需要更进一步了解的地方,可以自己搜索“**Git**”相关资料或者和我联系,推荐[廖雪峰的官方网站/Git教程](http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000),相信你会有更多收获。 357 | -------------------------------------------------------------------------------- /连载帖/2.1.1 开发环境搭建.md: -------------------------------------------------------------------------------- 1 | #开发环境搭建 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 2.系统移植 7 | -> 1.基于linux-sunxi SDK的系统移植 8 | -> 1.开发环境搭建 9 | ``` 10 | 主要介绍linux-sunxi SDK的开发环境搭建 11 | 本系列教程使用启发式编写,在写明操作步骤后会附加一些思考题供读者思考,以\*号标记思考题的程度 12 | 一星:刚接触linux,纯新手需要思考、搜索解决的问题 13 | 二星:熟悉linux使用的朋友可以了解的一些问题,如底层问题,或者sdk相关问题 14 | 三星:非常熟悉linux,可以一起探讨的问题 15 | 16 | (交流QQ群:573832310,上车口令:爱荔枝) 17 | 18 | ## 一.准备开发机 ## 19 | 与普通单片机开发使用Windows下的可视化IDE,如 MDK,IAR等不同,Linux下开发嵌入式程序多使用一套工具链开发,如arm-linux-gnueabihf-,arm-linux-gnueabi-,arm-none-linux-gnueabi-等 20 | > \* 工具链的具体定义?前面列出的工具链名字的含义?‘-’分割的各字段的含义? 21 | 22 | 所以我们需要使用有个Linux开发机来进行开发。具体到全志这颗芯片的SDK,其适合的开发环境是64位linux系统,推荐Ubuntu 1404 64bit系统(桌面版,服务器版均可),预留足够大的硬盘(如果要编译安卓的话,有100G以上最好,单linux的话20G至少) 23 | > \*\* 为什么全志的SDK需要64位系统开发?为什么推荐Ubuntu 1404 64bit系统? 24 | 25 | 首先我们下载Ubuntu 1404 64bit系统的镜像安装包,对于没有多余实体机的用户可以再下载VMWare等虚拟机软件 26 | > \* 在哪里可以下载? 27 | 28 | 然后在实体机或者虚拟机上安装好Ubuntu系统,这样开发机就准备完成了 29 | > \* 如何安装Ubuntu系统? 30 | 31 | 实体机上开发可以直接打开终端,虚拟机的话可以在桌面里开终端,或者使用Xshell等终端软件ssh连接。 32 | > \* 什么叫ssh连接? 33 | > \* 如何设置虚拟机才能让本机在终端里连接上虚拟机? 34 | 35 | ## 二.准备SDK及相关软件 ## 36 | 开源的linux-sunxi比较适合初学者学习,所以我们先开始试用linux-sunxi这个sdk 37 | 开发主要用到下面几个工程,请先下载到本地(网速慢的话可以从百度网盘下:) 38 | ``` 39 | git clone https://github.com/linux-sunxi/linux-sunxi.git 40 | git clone https://github.com/linux-sunxi/u-boot-sunxi.git 41 | git clone https://github.com/linux-sunxi/sunxi-tools.git 42 | ``` 43 | 下的工程有兴趣也都可以浏览下 44 | > \* git的基本操作? 尝试自己建立编辑一个github项目 45 | > \*\* linux-sunxi下的工程大致都是什么功能? 46 | 47 | 48 | 简单说下前面三个工程包含的内容,linux-sunxi是linux内核的工程,u-boot-sunxi就是uboot的工程,sunxi-tools是sunxi芯片相关的的一些工具,如fex2bin,bin2fex 49 | > \* linux内核是什么?uboot是什么? 50 | 51 | 因为我们要从头开始移植,所以先从u-boot-sunxi这个工程开始 52 | > ** 可以先浏览下目录,看下应该用什么参数编译 53 | 54 | 首先我们安装一些依赖包 55 | ``` 56 | sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev \ 57 | lib32ncurses5-dev gcc-multilib x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev \ 58 | g++-multilib mingw32 tofrodos python-markdown libxml2-utils 59 | ``` 60 | ``` 61 | sudo apt-get install gcc-arm-linux-gnueabihf 62 | ``` 63 | > \* 什么叫安装依赖?前面安装的这都是啥? 64 | > \* 安装的时候是不是有个别依赖没装上?怎么解决? 65 | 66 | 再到本教程所在github工程下的Config_Files里下载荔枝板的配置文件A13-Lichee_defconfig,sun5i-a13-lichee.dts(因为是直播移植,这两个配置文件目前尚未完善,会在以后直播过程中完善),以及修改后的dts的Makefile 67 | 68 | 拷贝这三个文件到uboot工程的对应位置 69 | ``` 70 | cp A13-Lichee_defconfig configs/ 71 | cp sun5i-a13-lichee.dts arch/arm/dts/ 72 | cp Makefile arch/arm/dts/ 73 | ``` 74 | > \*\* 看下这两个文件都是啥配置? 75 | 76 | 77 | ## 三.初次编译尝试 ## 78 | 然后先配置成荔枝派的默认配置 79 | ``` 80 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- A13-Lichee_config 81 | ``` 82 | > \* 这个命令的各部分是什么意思? 83 | > \*\* 可以浏览下uboot的Make流程 84 | 85 | 现在可以打开menuconfig配置菜单来看看uboot的一些选项,如果知道那些参数的意思的话也可以试着修改下 86 | ``` 87 | make ARCH=arm menuconfig 88 | ``` 89 | > \* 熟悉下配置菜单的使用,比如查找选项,查看帮助是按什么键? 90 | 91 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-8-12/9844767.jpg) 92 | 93 | 浏览好后,先退出配置菜单,使用下面的命令来编译一次试试,注意编译前后目录下多了什么文件(如果提示dtc版本低请自行更新): 94 | ``` 95 | time make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- 2>&1 | tee build.log 96 | ``` 97 | > \* 上面的编译命令是什么意思? 98 | 99 | 可以看到目录下多了一堆u-boot开头的文件 100 | ``` 101 | u-boot.cfg u-boot-dtb.bin u-boot.img u-boot.map u-boot.srec u-boot.sym 102 | u-boot.bin u-boot.dtb u-boot-dtb.img u-boot.lds u-boot-nodtb.bin u-boot-sunxi-with-spl.bin 103 | ``` 104 | > \*\* 这堆文件各是什么用途的文件? 105 | 106 | 我们这里需要的文件是u-boot-sunxi-with-spl.bin,如果你手上有荔枝派的话,可以使用下面的命令(sdX是对应的tf卡读卡器的设备)往tf卡里烧入u-boot-sunxi-with-spl.bin: 107 | ``` 108 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8 109 | ``` 110 | > \* 上面的命令是什么意思? 111 | > \*\* 为什么seek=8? 112 | 113 | 然后插卡到荔枝派的tf口,上电看看UART1的启动输出 114 | 115 | ## 四.结语 ## 116 | 开发环境就此搭建好了,也初次尝试编译了下,对于linux熟悉的朋友来说这一节很短 117 | 对于linux新手来说,这一节内容 还是挺多的,完全消化还是得多多搜索才行。 118 | 下节会讲述uboot是怎样一步步启动CPU的。 119 | -------------------------------------------------------------------------------- /连载帖/2.1.2 u-boot-sunxi走读.md: -------------------------------------------------------------------------------- 1 | #u-boot-sunxi走读 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 2.系统移植 7 | -> 1.基于linux-sunxi SDK的系统移植 8 | -> 2. u-boot-sunxi走读 9 | ``` 10 | 经过前面一节的开发环境搭建,大家应该能够初次编译uboot了,但是如果没有思考过2星问题的朋友还是对uboot没有什么印象,本节就带大家走读uboot,了解其工程结构和工作原理。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | 14 | ## 一.u-boot-sunxi目录走读 ## 15 | 大致查看下u-boot-sunxi每个目录的文件(仅列出了在调试DDR时比较重要的文件,其它目录请自行打开浏览) 16 | ``` 17 | . 18 | ├── api //封装一些平台无关的操作,如字符串打印,显示,网络,内存 19 | ├── arch // 20 | │   ├──arm 21 | │   │   └──cpu 22 | │   │   │   └──armv7 23 | │   │   │   │   └──sunxi //cpu相关的一些操作,如定时器读取 24 | │   │   │   │   │   └──u-boot-spl.lds //spl的放置方法 25 | │   │   └──dts 26 | │   │   │   └──sun5i-a13.dtsi //sun5i系列芯片的一些配置 27 | │   │   │   └──sun5i-a13-lichee.dts 28 | │   │   │   └──sun5i-r8-chip.dts 29 | │   │   │   └──sun5i-r8.dtsi 30 | │   │   │   └──sun5i.dtsi 31 | │   │   └──lib //一些库文件 32 | │   │   └──mach-sunxi 33 | │   │   │   └──board.c //board_init_f 34 | │   │   │   └──dram_sun4i.c //ddr的操作,复位,时钟,延时,odt,etc. 35 | │   │   │   └──dram_helpers.c //ddr的设置及读写测试 36 | ├── board 37 | │   ├──sunxi 38 | │   │   └──board.c //sunxi_board_init 入口 39 | │   │   └──dram_sun5i_auto.c //DRAM的一些默认参数 40 | │   │   └──dram_timings_sun4i.h //根据时钟生成的DRAM参数 41 | ├── cmd //Uboot命令行的一些命令 42 | ├── common //含spl 43 | ├── configs //menuconfig里的默认配置,比如dcdc的各路电压 44 | │   ├──A13-Lichee_defconfig 45 | ├── disk //硬盘分区的驱动 46 | ├── doc 47 | ├── drivers //外设驱动 48 | ├── dts 49 | ├── examples 50 | ├── fs //多种文件系统 51 | ├── include 52 | │   ├──configs 53 | │   │   └──sunxi_common.h //预配置的参数,如串口号等 54 | │   │   └──sun5i.h 55 | ├── lib //加密压缩等算法 56 | ├── net //nfs,tftp等网络协议 57 | ├── post 58 | ├── scripts 59 | 60 | ``` 61 | 如果需要移植新的版型,如上文所示,主要修改的就是dts文件和configs目录下的默认配置文件。 62 | 具体dts文件的语法请搜索相关资料。 63 | 64 | 65 | ## 二.u-boot-sunxi启动流程走读 ## 66 | 要让芯片跑起系统,对其bootloader必须非常了解,不然移植初期出现的问题将无从下手。 67 | 笔者调试荔枝板的时候犯了个错误,在没有确认DDR正常运行的时候就贸然进行调试,结果出现的问题是如同 堆栈溢出,或者指针指飞后的诡异情形,每次出错的位置总是不同,导致多次跟踪徒劳无返。 68 | 69 | 不过也正是因为犯了前面这个错误,导致笔者翻遍了u-boot-sunxi的代码,特别是SPL部分代码,使得调试稳定DDR后,移植中出现的问题马上就能找到原因,很快完成了bootloader的适配。 70 | 71 | 由于启动部分内容较多,现将A13的bootloader启动流程分成三个流程图将以展示,可以在github的资源文件目录下找到。 72 | ``` 73 | A13整体启动流程:简明介绍A13启动的几个过程 74 | uboot-sunxi spl部分流程:详细介绍spl部分启动流程 75 | uboot-sunxi uboot部分流程:详细介绍uboot部分启动流程 76 | ``` 77 | 78 | 流程图只是起到一个路线图的作用,当你不太熟悉启动流程,而启动失败的时候,可以根据流程查看目前的启动进度,以及是在哪里卡住,可以快速定位出错的大致位置。 79 | 80 | ## 三.关于A13的裸机用法 ## 81 | 群里有朋友问A13的裸机用法,其实在SPL或Uboot下就是A13的裸机使用。 82 | SPL下未初始化DDR,只能使用片内48KB SRAM,就完全是普通单片机用法,只是程序是需要从tf卡载入到内存里运行而已。这样使用可以不加DDR,只是内部SRAM较小。 83 | Uboot下已经初始化了DDR,而且对多数外设已经有了驱动,使用起来会更方便,内存也可以充分利用。(像RTT之类的小型RTOS应该可以直接编译进Uboot了吧。。) 84 | 85 | 感兴趣的朋友可以尝试下在SPL或者Uboot下编程,可以对启动过程更有了解。 86 | 87 | ## 四.小结 ## 88 | 对于多数linux开发者来说,此部分内容只作了解即可。 89 | 此部分内容主要是BSP工程师的工作。 90 | 下节打算讲下移植中遇到的最大的坑,也就是DDR的调试问题,这是关系到系统能否跑起来的关键问题,也是软硬件结合最紧密的问题,所以单独写一节来 总结。 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /连载帖/2.1.3 tf镜像烧录解读.md: -------------------------------------------------------------------------------- 1 | #tf镜像烧录解读 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 2.系统移植 7 | -> 1.基于linux-sunxi SDK的系统移植 8 | -> 3. tf镜像烧录解读 9 | ``` 10 | 时隔多日,连载帖重新开更了~ 11 | 现在部分朋友已经收到了荔枝派,这里先对荔枝派的镜像烧录进行解读 12 | (交流QQ群:573832310) 13 | 14 | 15 | ## 一.系统镜像组成 ## 16 | TF卡或者其他存储介质中的系统镜像组成如下: 17 | 1. boot部分,含boot0和boot1/uboot 18 | 2. linux内核部分,含启动参数和fex配置 19 | 3. linux根文件系统 20 | > \**回想下在启动过程中这三个部分是如何串联起来的? 21 | 22 | ## 二.烧录boot部分镜像 ## 23 | 将前面编译出的u-boot-sunxi-with-spl.bin烧录到tf 8KB偏移处 24 | (sdb换成你自己的tf卡读卡器设备名) 25 | ``` 26 | sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdb bs=1024 seek=8 27 | sudo sync 28 | ``` 29 | > \*学习下dd命令的详细用法 30 | 31 | ## 三.烧录linux内核镜像 ## 32 | 需要准备uImage,script.bin,boot.scr三个文件 33 | > \**回想下这三个文件的作用? 34 | 35 | 1. uImage 36 | 1. 使用linux-sunxi编译后可得到uImage 37 | 2. script.bin 38 | 1. 使用下面命令将fex转为bin 39 | 2. `fex2bin a13-lichee.fex script.bin` 40 | 3. 需要根据使用的摄像头型号修改对应的fex字段 41 | 3. boot.scr 42 | 1. 使用下面命令将boot.cmd转为boot.scr 43 | 2. `mkimage -C none -A arm -T script -d boot.cmd boot.scr` 44 | > \**查看fex文件和boot.cmd文件,理解各字段含义 45 | 46 | 这三个文件在uboot启动时会在第一分区搜索,所以需要新建一个TF卡分区(FAT格式),需要使用fdisk命令。 47 | > \*请自行学习fdisk命令 48 | 如果原来tf卡已经有分区表,请先清除分区。 49 | 烧录相关的脚本已上传至“**资源文件**”目录,可以查看其中的脚本命令。 50 | 一般来说,第一分区设为16MB大小就足够了。 51 | 然后格式化为FAT格式: 52 | `sudo mkfs.vfat /dev/sdb1` 53 | 最后放入前面提到的三个文件即可。 54 | 55 | ## 四.烧录linux根文件系统 ## 56 | linux内核在启动时候会根据启动参数中的root参数来获得根文件系统分区号,然后加载之。 57 | 一般就按顺序把根文件系统设为第二分区,使用EXT3或者EXT4文件系统。 58 | 整个根文件系统有两种打包方式,dd方式和tar方式。 59 | dd方式是直接备份整个分区信息,tar方式是直接打包整个分区。 60 | dd出来的分区镜像可以直接使用mount命令在本机上加载查看,烧写速度也稍快些,所以荔枝派使用dd出来的镜像发布。 61 | 不过由于dd是备份了整个分区信息,所以连分区大小都是一致的,如果tf较大,可以自行扩容分区和文件系统 62 | > \* 自学linux下扩容分区和文件系统的方法 63 | 64 | ``` 65 | dd if=fs2.img of=/dev/sdb2 bs=64K 66 | sync 67 | ``` 68 | 69 | ## 五.启动尝试 ## 70 | 按上述方法准备好tf卡后,就可以尝试启动了! 71 | 把tf卡插入背面卡槽,有屏幕的插入屏幕(注意方向),有摄像头的插入摄像头(注意方向),再连上UART1(默认系统串口),上电。 72 | 正常情况就可以启动到debian系统了~ 73 | 74 | > \** 给出的镜像是出厂测试镜像,屏蔽了桌面系统,想开机启动桌面系统的可以尝试修改下 75 | 76 | 提供的镜像有两个用户lichee和root,密码均为lichee。 77 | 在“**资源文件**”目录下,有烧写相关的文件和脚本(脚本还未整理,比较乱,不过也可以参考使用) 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /连载帖/2.1.x lichee sdk 构建走读.md: -------------------------------------------------------------------------------- 1 | #样板电源晶振初步确认 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 1.硬件设计 7 | -> 3.样板焊接 8 | -> 3.电源晶振初步确认 9 | ``` 10 | 主要介绍荔枝板样板焊接完成后,电源晶振初步确认 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | -------------------------------------------------------------------------------- /连载帖/2.1.y 自制镜像启动尝试_未整理.md: -------------------------------------------------------------------------------- 1 | #启动流程分析及自制启动镜像 # 2 | ## 〇.背景 ## 3 | 本文所属目录层次为: 4 | 5 | ``` 6 | -> 2.系统移植 7 | -> 1.lichee sdk 8 | -> 3. 启动流程分析及自制启动镜像 9 | ``` 10 | 主要介绍逆向分析lichee sdk生成镜像的方式,自制镜像以尝试启动系统。 11 | (交流QQ群:573832310,上车口令:爱荔枝) 12 | 13 | ## 自制镜像起因 ## 14 | lichee sdk生成的是img文件,是进入FEL后USB下载用的,应该是经过了某种压缩处理。 15 | 而前面的构建流程分析里也看到,关键的固件打包部分的程序是二进制可执行文件形式提供的,所以无法或者固件下载到实际存储介质里后的分布情况。 16 | 理论上是可以先用FEL下载固件到TF卡,再dump出TF卡内容来分析镜像的组成情况,但是实际操作的时候发现FEL下载总是不明原因失败,所以这种方式暂时不行。 17 | 所以为了获得可以运行的系统原始镜像,本节就边分析启动流程,边逆向固件的拼接方式,最后尝试自己构建出原始的系统镜像。 18 | 19 | ## 启动BOOT0 ## 20 | user manual展示的BROM启动流程图: 21 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-29/97575738.jpg) 22 | A13上电启动最先从内部固化的BROM启动,如上图所示,首先会从SD卡的8KB偏移处读取4KB数据到内部SRAM,检验是否是有效的BOOT0,若有效则运行,否则尝试从下一个存储介质读取BOOT0. 23 | 24 | 所以在打包文件夹下找到card_boot0.fex,使用dd(linux)或者winhex(windows),把它写入到tf卡的8KB偏移处 25 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-29/46117872.jpg) 26 | 上图中就可以看到BOOT0的magic字符串:eGON.BT0 27 | 然后使用 Win32 Disk Imager将做好的包含boot0的镜像写入TF卡 28 | 29 | 板子插上TF卡,接上UART1的串口,上电,查看启动信息: 30 | ``` 31 | dram size =512 32 | 0xffff0000,0xffff0000 33 | super_standby_flag = 0 34 | HELLO! BOOT0 is starting! 35 | boot0 version : 1.5.2 36 | The size of Boot1 is 0x00038000. 37 | Succeed in loading boot1 from sdmmc flash. 38 | Ready to disable icache. 39 | ERROR! NOT find the head of Boot1. 40 | Fail in loading Boot1. 41 | Jump to Fel. 42 | ``` 43 | 44 | 可见BOOT0已经成功启动了,只是BOOT未被找到。 45 | 46 | ## 启动BOOT1 ## 47 | 根据上面的启动信息,在boot0代码中反查出错位置,发现 48 | ``` 49 | SDMMC_PhyRead( BOOT1_START_SECTOR_IN_SDMMC, length/512, (void *)BOOT1_BASE, card_no ) 50 | 51 | #define BOOT1_START_SECTOR_IN_SDMMC 38192 52 | ``` 53 | 所以BOOT1在TF卡中的偏移是固定的38192扇区,即0x12A6000处,约18多MB的偏移。 54 | 55 | 于是将card_boot1.fex写入0x12A6000偏移处,烧入TF卡中 56 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-29/14651724.jpg) 57 | 上图可见BOOT1的magic字符串:eGON.BT1 58 | 59 | 板子插上TF卡,接上UART1的串口,上电,查看启动信息: 60 | ``` 61 | dram size =512 62 | 0xffff0000,0xffff0000 63 | super_standby_flag = 0 64 | HELLO! BOOT0 is starting! 65 | boot0 version : 1.5.2 66 | The size of Boot1 is 0x00038000. 67 | Succeed in loading boot1 from sdmmc flash. 68 | Ready to disable icache. 69 | Succeed in loading Boot1. 70 | Jump to Boot1. 71 | [ 0.165] boot1 version : 1.7.0 72 | [ 0.165] pmu type = 3 73 | [ 0.167] bat vol = 311 74 | [ 0.199] axi:ahb:apb=3:2:2 75 | [ 0.199] set dcdc2=1400, clock=1008 successed 76 | [ 0.201] key 77 | [ 0.213] no key found 78 | [ 0.213] flash init start 79 | [ 0.231] flash init finish 80 | [ 0.232] fs init fail 81 | [ 0.232] fs init fail, jump to fel 82 | 83 | ``` 84 | 可见BOOT0已经成功引导起来了BOOT1,BOOT1已经简单设置了电压,时钟频率,初始化了tf卡 85 | 只是还没有找到bootfs的文件系统,无法引导uboot 86 | 87 | ## MBR及BOOTFS挂载 ## 88 | 由前面的构建流程分析可知bootfs的打包文件即**bootloader.fex**,现在要确认该文件所处的tf卡偏移。 89 | eFG_printf; 90 | 为了获取出错信息,需要在boot1中的代码里加打印信息来追踪。 91 | > 这里注意,在boot目录下编译后,还需要运行一次pack命令才能将原始的bin文件加入fex文件中的配置信息,才能运行起来,最后烧录的应该是card_boot1.fex。 92 | 93 | 追踪fs init fail的原因,发现是读取MBR的magic字符串softw311出错 94 | 查找out文件夹,**mbr.fex**文件应该就是。 95 | 按之前的常识MBR应该是放在硬盘的0偏移处?但实际试了却发现仍然读不到。 96 | (MBR是Master Boot Record的简称,又叫主引导记录.它是硬盘上最重要的一个数据结构。当用分区软件创建分区的时候,分区软件会自动创建MBR.MBR处于硬盘的第一个扇区.即0柱面,0磁头,1扇区.在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两个字节"55 AA"(偏移1FEH~偏移1FFH)是分区有效结束标志。) 97 | 98 | 追踪读取函数,发现这里使用的是SDMMC_LogicalRead,逻辑读相对物理读会有个偏移, 99 | ``` 100 | start_sector += bootcard_offset; 101 | ``` 102 | 而这个bootcard_offset信息就包含在BOOT1的头部信息里,直接打印出来发现是0xa000,那么就是0x5000 KB = 20MB偏移处 103 | 于是将mbr.fex写入该偏移: 104 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-29/32673288.jpg) 105 | 上图可见mbr的magic字符串:softw311 106 | 107 | 然后根据sys_config.fex和image.cfg里的四个分区的说明,在相对MBR的16MB偏移处写入**bootloader.fex** 108 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-29/39618955.jpg) 109 | 上图可见bootfs是FAT16文件系统 110 | 111 | 更新tf卡内容,板子插上TF卡,接上UART1的串口,上电,查看启动信息: 112 | ``` 113 | [ 0.163] boot1 version : 1.7.0 114 | [ 0.163] pmu type = 3 115 | [ 0.164] bat vol = 2 116 | [ 0.196] axi:ahb:apb=3:2:2 117 | [ 0.196] set dcdc2=1400, clock=1008 successed 118 | [ 0.198] key 119 | [ 0.211] no key found 120 | [ 0.211] flash init start 121 | [ 0.281] flash init finish //tf卡初始化成功 122 | [ 0.281] begin init! 123 | [ 0.282] magic is softw311 //mbr识别成功 124 | [ 0.284] fs init ok 125 | [ 0.287] fattype FAT16 126 | [ 0.289] fs mount ok //文件系统挂载成功 127 | [ 0.296] script finish //script.bin解析成功 128 | [ 0.297] power finish //按fex中的设置调整电压成功 129 | [ 0.297] storage_type=1 //获取存储类型,card0启动(0nand,1sdc0,2sdc2) 130 | [ 0.307] BootMain start //进入Boot_Andriod分支,apps/Boot_Android/BootMain.c 131 | [ 0.307] 0 //从串口读键值,2fel,-dbg,1usb,3lradc 132 | [ 0.340] init to usb pc 133 | [ 0.364] power_start=0x00000002 134 | [ 0.364] power trigger 135 | [ 0.364] startup status = 0 136 | [ 0.384] parser bmp file c:\os_show\bat0.bmp failed //wboot_fopen失败? 137 | [ 1.885] no battery exist 138 | [ 1.885] key value = 1 139 | [ 1.885] recovery key high 6, low 4 140 | [ 1.889] unable to find fastboot_key key_max value 141 | [ 1.910] unable to open script file c:\linux\linux.ini 142 | [ 1.910] NO OS to Boot 143 | [ 1.917] try to fel in 1 secend 144 | ``` 145 | 可见BOOT1已经成功挂载了BOOTFS,并从其文件系统中的script.bin获取到了系统配置信息,进一步配置了PMU,并执行eGon2_run_app,运行了**boot.axf**(Boot_Andriod),试图启动uboot。 146 | 只是在Boot_Andriod里,不知为何又读取文件系统出错了? 147 | 148 | ## 启动UBOOT ## 149 | 注意到boot.axf虽然是boot1目录下的源码生成的,但是实际是存放在bootfs中的可执行文件,所以下面需要查找bootloader.fex这个分区镜像的问题。 150 | 151 | 仔细追查发现,在bootfs的根目录下文件可以被访问到,但是二级目录下的文件却总是读取失败。 152 | 不由得怀疑是不是二级目录根本没打包进去。 153 | ``` 154 | sudo mount bootloader.fex mnt/ 155 | ls mnt/ 156 | ``` 157 | 挂载该分区查看,果然实际上二级目录就是没有被打包进去 158 | 仔细查看编译时的输出发现: 159 | ``` 160 | fail:/home/zp/develop/a13_android4.2_v1.5.0/v1.5.0/lichee/tools/pack/out/bootfs/linux 0 161 | ``` 162 | 以上是执行`fsbuild bootfs.ini split_xxxx.fex`时的错误信息,只是该错误不会使整个编译过程退出。 163 | 由于fsbuild是可执行文件,没有源代码,错误提示也语焉不详,所以暂时无法知道到底是什么原因导致二级目录没有被打包进去(如果以后查出原因再更新解决方法)。 164 | 所以现在先尝试手工打包bootfs。 165 | ``` 166 | dd if=/dev/zero of=bootloader.fex count=20480 //10MB 分区 167 | mkdir mnt 168 | sudo mount bootloader.fex mnt 169 | sudo cp -r bootfs/* mnt/ 170 | sudo umount mnt 171 | ``` 172 | 将上面手工打包的bootfs镜像烧录到sd卡36MB偏移(0x2400000)处: 173 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-30/23000767.jpg) 174 | 175 | 176 | 更新tf卡内容,板子插上TF卡,接上UART1的串口,上电,查看启动信息: 177 | ``` 178 | [ 0.163] boot1 version : 1.7.0 179 | [ 0.163] pmu type = 3 180 | [ 0.164] bat vol = 2 181 | [ 0.196] axi:ahb:apb=3:2:2 182 | [ 0.196] set dcdc2=1400, clock=1008 successed 183 | [ 0.198] key 184 | [ 0.211] no key found 185 | [ 0.211] flash init start 186 | [ 0.229] flash init finish 187 | [ 0.229] begin init! 188 | [ 0.230] magic is softw311 189 | [ 0.232] fs init ok 190 | [ 0.235] fattype FAT16 191 | [ 0.237] fs mount ok 192 | [ 0.243] script finish 193 | [ 0.244] power finish 194 | [ 0.244] storage_type=1 195 | [ 0.256] BootMain start 196 | [ 0.256] 0 197 | [ 0.288] init to usb pc 198 | [ 0.310] power_start=0x00000002 199 | [ 0.311] power trigger 200 | [ 0.311] startup status = 0 201 | [ 2.387] no battery exist 202 | [ 2.387] key value = 1 203 | [ 2.387] recovery key high 6, low 4 204 | [ 2.391] unable to find fastboot_key key_max value 205 | [ 2.399] test for multi os boot with display 206 | [ 2.461] show pic finish 207 | [ 2.461] load kernel start 208 | [ 2.479] load kernel successed 209 | [ 2.479] star 210 | 211 | U-Boot 2011.09-rc1 (Jul 29 2016 - 20:20:40) Allwinner Technology 212 | 213 | CPU: SUNXI Family 214 | Board: A1X-EVB 215 | DRAM: 512 MiB 216 | MMC: SUNXI SD/MMC: 0 217 | In: serial 218 | Out: serial 219 | Err: serial 220 | --------fastboot partitions-------- 221 | -total partitions:5- 222 | -name- -start- -size- 223 | bootloader : 1000000 1000000 224 | env : 2000000 1000000 225 | boot : 3000000 1000000 226 | rootfs : 4000000 10000000 227 | UDISK : 14000000 90c00000 228 | ----------------------------------- 229 | no misc partition is found 230 | Hit any key to stop autoboot: 0 231 | read boot or recovery all 232 | sunxi flash read :offset 3000000, 12824208 bytes OK 233 | 234 | Starting kernel ... 235 | 236 | [ 0.000000] ram_console: buffer (null), invalid size 0, datasize 4294967284 237 | 238 | ``` 239 | 由上可见,成功读取了系统信息,加载了Uboot 240 | 甚至Uboot也成功走完,进入了linux kernel的启动阶段 241 | 只是kernel启动开始时就出现了console初始化的错误,看上去像是参数传递错误。 242 | 243 | 此时若接上屏幕,可以看到电池图标和andriod图标(屏幕参数尚未调整,显示不完全): 244 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-30/67586590.jpg) 245 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-30/9526815.jpg) 246 | 247 | ## 启动linux内核 ## 248 | 由于前面的出错提示信息比较少,所以先修改linux的内核调试等级到最详细看看,在linux-3.0目录下执行`make menuconfig ARCH=arm`进行配置。把内核调试等级调整到7后,重新烧录boot.fex到0x4400000偏移处 249 | 但是发现调试信息并没有增多,仔细查看发现uboot启动内核的env.cfg中也有调试等级的设置,还有一些其它板级设置,一并修改看看(tools\pack\chips\sun5i\configs\dragonboard\default\env.cfg) 250 | ,修改后会重新生成env.fex,需要烧录到0x34000000处 251 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-30/52347420.jpg) 252 | ![](http://7xvwj0.com1.z0.glb.clouddn.com/16-7-30/98006458.jpg) 253 | 254 | 修改后可以查看到内核实际收到的启动参数 255 | ``` 256 | [ 0.000000] Linux version 3.0.8+ (zp@ubuntu) (gcc version 4.5.1 (Sourcery G++ Lite 2010.09-50) ) #19 PREEMPT Sat Jul 30 19:05:01 CST 2016 257 | [ 0.000000] Kernel command line: console=ttyS0,115200 root=/dev/mmcblk0p7 init=/init loglevel=6 partitions=bootloader@mmcblk0p2:env@mmcblk0p5:boot@mmcblk0p6:rootfs@mmcblk0p7:UDISK@mmcblk0p1 258 | ``` 259 | 其中partitions参数是在u-boot/Board/Allwinner/A1x-evb/A1x-evb.c里生成,是没有问题的。 260 | 261 | 继续查看下面,有问题的是: 262 | ``` 263 | [ 1.434633] mmc0: new high speed SDHC card at address 1234 264 | [ 1.440523] mmcblk0: mmc0:1234 SA16G 14.5 GiB 265 | [ 1.447031] mmcblk0: unknown partition table 266 | ``` 267 | 这说明是分区表错误使得启动失败。 268 | 想想之前对tf卡的操作的确没有写入分区表,所以会挂载失败。 269 | MBR是Master Boot Record的简称,又叫主引导记录.它是硬盘上最重要的一个数据结构。当用分区软件创建分区的时候,分区软件会自动创建MBR.MBR处于硬盘的第一个扇区.即0柱面,0磁头,1扇区.在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两个字节"55 AA"(偏移1FEH~偏移1FFH)是分区有效结束标志。 270 | 271 | 分区表由4项组成,每项16个字节.共4×16 = 64个字节.每项描述一个分区的基本信息.每个字节的含义如下: 272 | 分区表项含义 273 | 274 | |字节|含义| 275 | |--|--| 276 | |0|Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区| 277 | |1,2,3|该分区的起始磁头号,扇区号,柱面号磁头号 -- 1字节, 扇区号 -- 2字节低6位,柱面号-- 2字节高2位 + 3字节| 278 | |4|分区文件系统标志:分区未用: 0x00H. 扩展分区: 0x05H, 0x0FH. FAT16分区: 0x06H. FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH. NTFS分区: 0x07H.| 279 | |5,6,7|该分区的结束磁头号,扇区号,柱面号,含义同上.| 280 | |8,9,10,11|逻辑起始扇区号。表示分区起点之前已用了的扇区数| 281 | |12,13,14,15|该分区所占用的扇区数| 282 | 283 | 284 | 285 | 286 | 287 | -------------------------------------------------------------------------------- /连载帖/pic/1.1.1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.1_1.png -------------------------------------------------------------------------------- /连载帖/pic/1.1.1_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.1_2.png -------------------------------------------------------------------------------- /连载帖/pic/1.1.1_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.1_3.png -------------------------------------------------------------------------------- /连载帖/pic/1.1.1_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.1_4.jpg -------------------------------------------------------------------------------- /连载帖/pic/1.1.2_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.2_1.jpg -------------------------------------------------------------------------------- /连载帖/pic/1.1.2_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.2_2.jpg -------------------------------------------------------------------------------- /连载帖/pic/1.1.2_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.2_3.jpg -------------------------------------------------------------------------------- /连载帖/pic/1.1.2_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/1.1.2_4.jpg -------------------------------------------------------------------------------- /连载帖/pic/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/pic/README.md -------------------------------------------------------------------------------- /连载帖/tmp_todo.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/连载帖/tmp_todo.md -------------------------------------------------------------------------------- /连载帖/tmp_简明linux-sunxi编译指南.md: -------------------------------------------------------------------------------- 1 | linux-sunxi简明编译指南 2 | 1. 从本项目的ConfigFiles里下载a13_linux_defconfig配置文件,该文件是a13的默认配置文件 3 | 2. 将上面的配置文件拷贝到arch/arm/configs/目录下,写入默认配置: 4 | `make ARCH=arm a13_linux_defconfig` 5 | 3. 可以视情况修改一下menuconfig配置: 6 | `make ARCH=arm menuconfig` 7 | 4. 编译linux内核镜像(注意下面的j24是你的开发机有多少线程就写多少) 8 | `make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 uImage` 9 | 5. 编译安装内核模块 10 | ``` 11 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 INSTALL_MOD_PATH=out modules 12 | make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j24 INSTALL_MOD_PATH=out modules_install 13 | ``` 14 | 可以在linux-sunxi/out/lib/modules/3.4.104下找到编译好的内核模块 15 | -------------------------------------------------------------------------------- /那些年我们踩的坑/README.md: -------------------------------------------------------------------------------- 1 | 本目录下供网友记录分享自己的踩坑记录,不限于荔枝派,甚至不限于技术,分享人生经验啥的也是可以的~ 2 | 文件名格式:分类名_标题 -------------------------------------------------------------------------------- /那些年我们踩的坑/boot坑_TF卡不响应块读取命令.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Zepan/ilichee/90501539c27493fe5c3767fead8dc2b8713d24db/那些年我们踩的坑/boot坑_TF卡不响应块读取命令.md -------------------------------------------------------------------------------- /那些年我们踩的坑/编译坑_Ubuntu 16.04编译过程踩坑记录.md: -------------------------------------------------------------------------------- 1 | # Ubuntu 16.04编译过程踩坑记录 2 | 3 | ## 前言 4 | 5 | 虽然ilichee推荐的环境为Ubuntu 14.04,但是由于Ubuntu官方发布了新版LTS,即16.04。冒着踩坑的风险采用了新发型版。16.04默认的GCC版本为GCC-5,接下来会分别说一下采用GCC-4.7编译和GCC-5编译的过程。 6 | 7 | --- 8 | 9 | ## 采用GCC-4.7 10 | 11 | **推荐采用GCC-4.7版本,因为ilichee作者即采用的此版本,以后利于协作和排错,出现的问题可能因为采用不同版本的GCC而有差异** 12 | 13 | 由于系统默认为GCC-5,所以首先下载GCC-4.7相关依赖包 14 | 15 | ```shell 16 | 17 | sudo apt install gcc-4.7 g++-4.7 \ 18 | gcc-4.7-multilib gcc g++-4.7-multilib \ 19 | gcc-4.7-arm-linux-gnueabihf g++-4.7-arm-linux-gnueabihf 20 | 21 | ``` 22 | 23 | 然后配置系统默认GCC版本 24 | 25 | ```shell 26 | 27 | sudo update-alternatives \ 28 | --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-5 10 \ 29 | --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-5 \ 30 | --slave /usr/bin/arm-linux-gnueabihf-gcov arm-linux-gnueabihf-gcov /usr/bin/arm-linux-gnueabihf-gcov-5 31 | 32 | sudo update-alternatives \ 33 | --install /usr/bin/arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc /usr/bin/arm-linux-gnueabihf-gcc-4.7 20 \ 34 | --slave /usr/bin/arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++ /usr/bin/arm-linux-gnueabihf-g++-4.7 \ 35 | --slave /usr/bin/arm-linux-gnueabihf-gcov arm-linux-gnueabihf-gcov /usr/bin/arm-linux-gnueabihf-gcov-4.7 36 | 37 | sudo update-alternatives \ 38 | --install /usr/bin/gcc gcc /usr/bin/gcc-5 10 \ 39 | --slave /usr/bin/g++ g++ /usr/bin/g++-5 40 | 41 | sudo update-alternatives \ 42 | --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 20 \ 43 | --slave /usr/bin/g++ g++ /usr/bin/g++-4.7 44 | 45 | ``` 46 | 47 | 查看默认版本,查看是否指向了`/usr/bin/gcc-4.7`和`arm-linux-gnueabihf-gcc-4.7` 48 | 49 | ```shell 50 | 51 | sudo update-alternatives --display gcc 52 | sudo update-alternatives --display arm-linux-gnueabihf-gcc 53 | 54 | ``` 55 | 56 | 确认无误后按官方教程操作即可。 57 | 58 | --- 59 | 60 | ##采用GCC-5 61 | 62 | 首先将GCC版本切换回GCC-5 63 | 64 | ```shell 65 | 66 | sudo update-alternatives --config gcc 67 | 68 | sudo update-alternatives --config arm-linux-gnueabihf-gcc 69 | 70 | ``` 71 | 72 | 然后下载用GCC-5编译的补丁 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | *注:第三个补丁没有采用 因为不知原因我的打不上* 81 | 82 | 最后应用补丁 83 | 84 | ```shell 85 | 86 | git apply 0001-compiler-gcc5.patch 87 | 88 | git apply 0001-gcc5-fixes.patch 89 | 90 | git apply 0002-ARM-8158-1-LLVMLinux-use-static-inline-in-ARM-ftrace.patch 91 | 92 | ``` 93 | 94 | 确认无误后按官方教程操作即可。*注:编译过程中会出现很多警告,因为板子没到手,不知实际运行时是否会出现问题* -------------------------------------------------------------------------------- /那些年我们踩的坑/编译坑_Ubuntu16.04编译过程踩坑记录二.md: -------------------------------------------------------------------------------- 1 | 2 | ##前言 3 | ilichee作者推荐采用环境为14.04,但是为了尝鲜,跟ming42网友一样采用了最新的16.04,编译过程中自然会少不了掉进坑里,在参考ming42的文章和google的帮助下终于编译uboot成功,遇到的问题不难,但是对于新手来说还是要费一番功夫查,这里简单说一下。(PS:第一次采用MD,这里“照抄”了不少ming42兄的排版,希望不要介意) 4 | 5 | --- 6 | ##无法安装mingw32问题 7 | 按照ilichee作者的教程构建编译开发环境,安装依赖包时会出现下面的问题 8 | > E:无法定位软件包mingw32 9 | 10 | 出现此问题是因为在Ubuntu16.04和Ubuntu14.04的依赖不同,这里需要采用mingw-w64 11 | ```shell 12 | sudo apt-get install mingw-w64 13 | ``` 14 | ##提示GCC编译器问题 15 | 此问题是因为作者使用的Ubuntu14.04采用GCC-4.7,Ubuntu16.04默认采用GCC-5,建议采用GCC-4.7,具体解决方法请参考ming42网友的文章——编译坑_Ubuntu 16.04编译过程踩坑记录 16 | 17 | 18 | ##提示dtc更新 19 | 最后一步编译过程中可能提示 20 | > Your dtc is too old, please upgrade to dtc 1.4 or newer 21 | 22 | dtc是device-tree-compiler的缩写,即设备树编译器,当其版本太老时便无法继续编译,更新即可 23 | ``` 24 | sudo apt-get install device-tree-compiler 25 | ``` 26 | --------------------------------------------------------------------------------