PCB貼片時,需要出一份坐標文件給貼片廠。相信很多人都會出這份坐標文件,但是你們可能沒有發現這些坐標文件有一些缺點陷,就是坐標文件里有些不需要貼的元器件和測試點都出現在里面,這樣的坐標文件看起來很混亂。如下圖所示。
經過一番摸索,我找到了一個方法,從PCB里導出來的坐標文件,里面只有pcb需要貼的元器件,沒有多余的測試點和NC器件,看起來就很簡潔明了。下面具體講解一下這個方法。
第一步,先從導出PCB的BOM,并整理好。
第二步,打開腳本編輯器,編寫以下代碼。
Sub Main
tempFile = DefaultFilePath & "\temp.txt"
Open tempFile For Output As #1
'Output table header
For i = 0 To UBound(Columns)
OutCell Columns(i)
Next
Print #1
Dim xl As Object
Dim S_Components As String
Dim LastRow1 As Long
Set xl= GetObject(,"Excel.Application")
x1="D:\DL020-MAIN-PCB-BOM V01_20200514.xlsx"
'CreateObject("Wscript.Shell").Run ("D:\DL020-MAIN-PCB-BOM V01_20200514.xlsx")
'LastRow1 = xl.ActiveSheet.Range("A65536").End(xlUp).Row
'On Error Resume Next
'MsgBox LastRow1
For i= 4 To 200
If xl.ActiveSheet.cells(i,5)<>"" Then
S_Components =xl.ActiveSheet.cells(i,5)
On Error Resume Next
ActiveDocument.SelectObjects(plogObjectTypeAll, "", False)
S_Components = Replace$(S_Components, Chr$(9), " ")
ActiveDocument.SelectObjects(plogObjectTypeComponent, S_Components, True)
Set parts = ActiveDocument.GetObjects(plogObjectTypeComponent,"",True)
For Each part In parts
OutCell part.PartType
OutCell part.Name
OutCell part.Decal
OutCell part.Pins.Count
OutCell ActiveDocument.LayerName(part.layer)
OutCell part.Orientation
OutCell Format(part.PositionX, "0.000")
OutCell Format(part.PositionY, "0.000")
OutCell Format(part.IsSMD, "Yes/No")
OutCell Format(part.Glued, "Yes/No")
Print #1
Next part
End If
Next i
Close #1
ExportToExcel
End Sub
第三步,運行腳本,就可以導出我們想要的坐標文件,里面只有PCB需要貼的元器件的坐標信息。
平臺:jz2440
作者:莊澤彬
說明:linux系統移植
交叉編譯工具:arm-linux-gcc (GCC)4.3.2
linux:linu3.4.2
PC環境:ubuntu18.04
一、kernel的編譯和燒錄:
下載linux-3.4.2版本進行移植,下載鏈接:https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/
修改頂層Makefile,設置為arm架構,以及設置交叉工具鏈
zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .
diff --git a/Makefile b/Makefile
index 901a9557..9cc1639a 100644
--- a/Makefile
+++ b/Makefile
@@ -192,8 +192,8 @@ SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
-ARCH ?= $(SUBARCH)
-CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH ?= arm
+CROSS_COMPILE ?= arm-linux-
# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)
編譯:
make s3c2410_defconfig
make uImage -j4
哎呀,竟然報了下面這個錯誤:
應該是高版本的make導致這個錯誤出現的,按照錯誤的log修改文件。
修改如下:
diff --git a/kernel/timeconst.pl b/kernel/timeconst.pl
index eb51d76e..04612394 100644
--- a/kernel/timeconst.pl
+++ b/kernel/timeconst.pl
@@ -370,7 +370,7 @@ if ($hz eq '--can') {
}
@val = @{$canned_values{$hz}};
- if (!defined(@val)) {
+ if (!@val) {
@val = compute_values($hz);
}
output($hz, @val);
生成對應的uImage :
上述編譯出來的內核燒錄到板子加載內核卻出現亂碼,出現亂碼,有可能是我們的機器ID沒有設置好,導致調用的初始化錯誤導致的。:
二 、內核的啟動
uboot啟動內核主要的操作如下,從nandflash里把內核讀入內存,設置TAG參數(內存的起始地址大小,命令行參數等等),R1存放機器ID,R2存放參數的存放地址,內核在啟動的時候會解析TAG參數,根據uboot傳遞過來的機器ID,判斷是否能夠支持該機器,從而調用對應板子的初始化函數.
uboot設置機器ID的代碼主要流程如下:
Smdk2410.c (board\samsung\smdk2440) board_init gd->bd->bi_arch_number = MACH_TYPE_SMDK2410; //設置機器ID的默認值
Bootm.c (arch\arm\lib)
boot_jump_linux
unsigned long machid = gd->bd->bi_arch_number;
s = getenv("machid"); //可根據環境變量設置機器ID
我在cmdline隨便設置一個machid,看看內核支持那些板子
set machid 33333
啟動過程打印的log,根據log可以看出有匹配對應的開發板子的一個過程,最后由于匹配失敗,卡在這里。
OK
Using machid 0x33333 from environment
Starting kernel ...
Uncompressing Linux... done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x00033333).
Available machine support:
ID (hex) NAME
00000400 AML_M5900
0000014b Simtec-BAST
0000015b IPAQ-H1940
0000039f Acer-N35
00000290 Acer-N30
000002a8 Nex Vision - Otom 1.1
00000454 QT2410
000000c1 SMDK2410
000005b4 TCT_HAMMER
000001db Thorcom-VR1000
000005d2 JIVE
000003fe SMDK2413
000003f1 SMDK2412
00000377 S3C2413
00000474 VSTMS
00000695 SMDK2416
000002de Simtec-Anubis
00000707 AT2440EVB
000007cf MINI2440
000002a9 NexVision - Nexcoder 2440
0000034a Simtec-OSIRIS
00000250 IPAQ-RX3715
0000016a SMDK2440
00000518 GTA02
000003b8 HP iPAQ RX1950
0000043c SMDK2443
2.1 支持mini2440開發板的machid 7cf
設置cmdline波特率為115200
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3
nfs 32000000 192.168.1.100:/work/nfs_root/uImage //燒錄內核命令
設置machid為mini2440的開發板7cf,啟動,串口不會有亂碼.
2.2支持smdk2440開發板的machid 16a
設置machid為smdk2440開發板16a,串口卻出現亂碼:
我們來看看內核smd2440開發板初始化代碼,是不是跟jz2440有差異:
Mach-smdk2440.c (arch\arm\mach-s3c24xx)
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
.atag_offset = 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io, //這個函數的初始化化有點問題,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
.restart = s3c244x_restart,
MACHINE_END
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400); //jz2440開發板是12M的晶振,使用使用smdk2440的machid,這里要修改為12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
代碼修改如下,支持smdk2440開發板,串口輸出不會有亂碼:
zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$ git diff .
diff --git a/arch/arm/mach-s3c24xx/mach-smdk2440.c b/arch/arm/mach-s3c24xx/mach-smdk2440.c
index 83a1036d..b92c2bd5 100644
--- a/arch/arm/mach-s3c24xx/mach-smdk2440.c
+++ b/arch/arm/mach-s3c24xx/mach-smdk2440.c
@@ -162,7 +162,7 @@ static struct platform_device *smdk2440_devices[] __initdata = {
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
- s3c24xx_init_clocks(16934400);
+ s3c24xx_init_clocks(12000000); //jz2440開發板是12M的晶振,使用使用smdk2440的machid,這里要修改為12000000
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
設置為smdk2440開發板的machid 16a,啟動系統串口沒有輸出亂碼見下圖:
三、修改內核分區
內核將nandflash分區劃分如下:
0x00000000-0x00040000 : "bootloader"
0x00040000-0x00060000 : "params"
0x00060000-0x00260000 : "kernel"
0x00260000-0x10000000 : "root"
代碼修改如下:
diff --git a/arch/arm/mach-s3c24xx/common-smdk.c b/arch/arm/mach-s3c24xx/common-smdk.c
index 084604be..f7dce9b9 100644
--- a/arch/arm/mach-s3c24xx/common-smdk.c
+++ b/arch/arm/mach-s3c24xx/common-smdk.c
@@ -110,43 +110,23 @@ static struct platform_device smdk_led7 = {
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
- .name = "Boot Agent",
- .size = SZ_16K,
+ .name = "bootloader",
+ .size = SZ_256K,
.offset = 0,
},
[1] = {
- .name = "S3C2410 flash partition 1",
- .offset = 0,
- .size = SZ_2M,
+ .name = "params",
+ .offset = MTDPART_OFS_APPEND,
+ .size = SZ_128K,
},
[2] = {
- .name = "S3C2410 flash partition 2",
- .offset = SZ_4M,
- .size = SZ_4M,
- },
- [3] = {
- .name = "S3C2410 flash partition 3",
- .offset = SZ_8M,
+ .name = "kernel",
+ .offset = MTDPART_OFS_APPEND,
.size = SZ_2M,
},
- [4] = {
- .name = "S3C2410 flash partition 4",
- .offset = SZ_1M * 10,
- .size = SZ_4M,
- },
- [5] = {
- .name = "S3C2410 flash partition 5",
- .offset = SZ_1M * 14,
- .size = SZ_1M * 10,
- },
- [6] = {
- .name = "S3C2410 flash partition 6",
- .offset = SZ_1M * 24,
- .size = SZ_1M * 24,
- },
- [7] = {
- .name = "S3C2410 flash partition 7",
- .offset = SZ_1M * 48,
+ [3] = {
+ .name = "rootfs",
+ .offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
}
};
zhuang@zhuang:~/project/3-jz2440/systems/linux-3.4.2$
內核啟動將會把nandflash劃分為上述四個分區
四、制作新的文件系統
3.1編譯busybox1.20.0
解壓busybox
tar -xvf busybox-1.20.0.tar.bz2
設置交叉工具鏈make menuconfig
編譯:make
安裝:make install CONFIG_PREFIX=/work/nfs_root/fs_mini_mdev_new
從交叉工具鏈安裝glibc
cd /work/nfs_root/fs_mini_mdev_new
mkdir lib usr/lib
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/*so* usr/lib/ -d
創建etc目錄
mkdir etc
在etc目錄下創建inittab文件
vim inittab //內容從2-6行
# /etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
在etc目錄下穿件init.d/rcS文件
mkdir init.d
vim init.d/rcS chmod a+x init.d/rcS //設置為可執行文件
rcS文件內容如下:
#!/bin/sh
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
在etc目錄下創建fstab文件:內容如下:
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
創建dev目錄:
mkdir dev
sudo mknod console c 5 1
sudo mknod null c 1 3
創建其他目錄
mkdir proc tmp mnt sys root
編譯制作jffs2映像文件的工具
tar -xvf mtd-utils-05.07.23.tar.bz2
cd mtd-utils-05.07.23/util
make
sudo make install
//根據需要有可能要先編譯zlib庫
將fs_mini_mdev_new目錄制作成文件系統鏡像命令:
mkfs.jffs2 -n -s 2048 -e 128KiB -d fs_mini_mdev_new -o fs_mini_mdev_new.jffs2
在uboot中將文件系統和內核燒錄進系統命令
nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 260000 $filesize
set bootargs console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=jffs2
//燒錄內核
nfs 32000000 192.168.1.100:/work/nfs_root/uImage7 bootm 32000000
啟動系統,卻報了如下的錯誤,這是由于我們的交叉工具鏈接在編譯的時候是使用eabi接口的,內核也要使用這種接口才行
進入內核make menuconfig,加上EABI接口
重新燒錄系統,成功進入系統沒有問題。
五、移植yaffs文件系統
下載yaffs文件系統的鏈接:https://yaffs.net/get-yaffs
或者使用git下載命令:
git clone git://www.aleph1.co.uk/yaffs2
將yaffs文件系統源碼安裝到內核:
./patch-ker.sh c m /home/zhuang/project/3-jz2440/systems/linux-3.4.2
make menuconfig選中yaffs文件系統
編譯卻報了如下的錯誤:
查看內核struct mtd_info的定義,并沒有sync成員而是_sync,把報錯的地方都加上_即可。
將文件系統制作成yaffs2文件系統鏡像
mkyaffs2image fs_mini_mdev_new fs_mini_mdev_new.yaffs2
燒錄啟動:
nfs 30000000 192.168.1.100:/work/nfs_root/fs_mini_mdev_new.yaffs2
nand erase.part rootfs
nand write.yaffs 30000000 260000 $filesize
覺得不錯,就給我點小支持吧,蟹蟹