一个被linux支持的USB烧录方案——VOTI

内核编译和嵌入式产品的设计与开发
回复
头像
lovekid
帖子: 556
注册时间: 2007-03-05 11:43
联系:

一个被linux支持的USB烧录方案——VOTI

#1

帖子 lovekid »

一直以为Linux下不能烧录单片机,其实不是这样的。

我毕业之前为了做论文,买了一块avr m8515/S51兼容开发板,使用USB下载线烧录芯片。当时买的时候驱动软件全都是win版的,用完了就扔那里去了

昨天在网上飘,看到一篇文章:http://apt-blog.net/developing_avr_under_linux

主要内容如下:
此前接触过AVR单片机,发现无论是书店里面的教材,还是网上一大堆的中文资料,无一例外都是说windows下使用WinAVR、ICCAVR之类的,Linux方面的简直只字不提,难道这就是传说中的中国国情?外国情况可很不一样,玩单片机的Geek一般都很哈Linux,做单片机开发的软件一应俱全,当然还是开源的。
昨天从淘宝重新买了条USB的下载线,回来一看是USBasp的设计,附送的光盘当然也是win下的驱动和说明了,忽略。
插上下载器,lsusb,认倒是认出来了,叫做VOIT,那怎么用呢?上网一搜,原来USBasp是德国人的设计http://www.fischl.de/usbasp/,GPL的,其中提到AVRDUDE支持USBasp,当然也有源码下载。不过我用的是Ubuntu,发挥超级牛力的时候到了:sudo apt-get install avrdude,恩,几秒钟搞定,让他们去编译吧!
Linux下做单片机开发当然首选GCC,就如这些英文教程说的,下载源码?No,No,APT has Super Cow Powers,继续sudo apt-get install gcc-avr binutils-avr avr-libc
几分钟装完,很好,估计那些下载源码回来编译的同学要去喝两个小时茶才能用了。
万事俱全,先写个单片机的HelloWorld,借用micahcarrick的源码:

#define F_CPU 1000000UL /* 1 MHz CPU clock */

#include <util/delay.h>
#include <avr/io.h>

int
main (void)
{
DDRC = _BV (PC0); /* PC0 is digital output */

while (1) /* loop forever */
{
/* set PC0 on PORTC (digital high) and delay for 500mS */
PORTC &= ~_BV(PC0);
_delay_ms(500);

/* PC0 on PORTC (digital 0) and delay for 500mS */
PORTC |= _BV(PC0);
_delay_ms(500);
}

return (0);
}
....保存为toggle_led.c
命令时间:
avr-gcc -mmcu=atmega48 -Wall -Os -o toggle_led.o toggle_led.c
是不是似曾相识?平时用gcc就这么用的,这里除了把gcc改成avr-gcc,没多大区别。-mmcu定义了目标CPU的类型,我用的是atmega48;-Os是优化选项,减少程序的大小。这就是传说中的交叉编译。
接着把目标代码翻译成可以烧录到芯片上的hex文件:
avr-objcopy -j .text -j .data -O ihex toggle_led.o toggle_led.hex
avr-objcopy的-j参数限定转换的程序段,-O设定hex的输出格式,ihex即Intel Hex file
[Update: 本例子中,-j .data这个选项没作用,因为.data区根本没有数据;.data是存放初始化数组、字符串等数据的段,如果程序用到了,记得加上]
搞定,开烧:
sudo avrdude -p m48 -c usbasp -e -U flash:w:toggle_led.hex
因为直接读写USB接口,所以不给权限的话会提示找不到编程器,当然配置USB权限最好,这里暂时用sudo。avrdude的-p指定目标CPU,-c指定下载器,如果不知道所用的下载器是什么型号,敲avrdude -c会列出所有支持的下载器型号及其描述。-e即烧录前清空,-U参数指定刷写类型以及刷写文件。
[Update:可参考virtualbox使用usb的配置,把当前用户加入usbfs组,就可以直接使用avrdude了]
回车后下载器的指示灯闪了下,跟着单片机上的小灯开始闪烁,Hi, Hello World.
当然问题不是完全没有,我用avrdude下载完后默认的校验老是无法通过,说读取错误,只好加个-V来跳过校验。可能跟个别机器有关。
当然实际开发很少这样敲一大堆命令来编译程序,一般都用Make搞定。
对比起Win下满是GUI的程序,我第一次接触WinAVR都搞了半天,如何如何配置一个Project,哇那个属性窗口真让人眼花缭乱,使用gcc来开发,则可以循序渐进,未了解到的参数就不用,简洁,明了,但不失其功能强大。
于是就试了一下lsusb,倒是认出来了
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 16c0:05dc VOTI
Bus 002 Device 002: ID 062a:0000 Creative Labs Optical mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
不过是VOTI,猜测可能是作者写错了,不管他,按照作者的方法,装上avrdude(sudo apt-get install avrdude),我没来的及编译程序,直接用以前编译好的,准备烧录
作者的烧录命令
sudo avrdude -p m48 -c usbasp -e -U flash:w:toggle_led.hex

我那是老单片机,m8515,也不知还支持不,就改成下面这个样子
sudo avrdude -p m8515 -c usbasp -e -U flash:w:todo.hex

todo.hex是开发板自带的程序,输入密码,然后板子上的小灯闪了起来,很快烧录完毕,程序正常运行

没想到这么简单就把程序烧进了单片机,这下能彻底脱离windows了,虽然我已经不再搞单片机,但还是很高兴

关于程序的编译,引文说的很清楚,并且坛子里还有很多这样的帖子,我就不说了。

最后来看一下这个VOTI是怎么回事,个人认为这是一个软件,基于ATMEGA8L 8AU单片机实现,如果你的下载器或者单片机开发版上的下载电路里含有这个单片机(呵呵,有点绕口,注意这个不是你用来写程序的单片机,是专门负责下载的单片机,用单片机烧录单片机,其实很多方案都是这么办的),那很可能这篇文章就适合你。
firefoxmmx
帖子: 407
注册时间: 2006-07-28 8:51

Re: 一个被linux支持的USB烧录方案——VOTI

#2

帖子 firefoxmmx »

楼主是传说中的大神?
头像
lovekid
帖子: 556
注册时间: 2007-03-05 11:43
联系:

Re: 一个被linux支持的USB烧录方案——VOTI

#3

帖子 lovekid »

可别这么说,我是一只老菜鸟,飞呀飞呀总是飞不高~~~~ :em03
星仔阿凡提
帖子: 3
注册时间: 2011-08-15 10:36

Re: 一个被linux支持的USB烧录方案——VOTI

#4

帖子 星仔阿凡提 »

为什么我的出现了这么个东西啊avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
头像
wwkwkj
帖子: 318
注册时间: 2010-12-19 17:00
系统: opensuse12.2*kde4.9

Re: 一个被linux支持的USB烧录方案——VOTI

#5

帖子 wwkwkj »

还是在win下方便啊~
国内linux大环境还是不行啊
每个论坛里面,都会有几个默默的不为我知的大牛,于是每次,我都心存敬畏

openSUSE12.2+KDE4.9+XP
头像
lovekid
帖子: 556
注册时间: 2007-03-05 11:43
联系:

Re: 一个被linux支持的USB烧录方案——VOTI

#6

帖子 lovekid »

wwkwkj 写了:还是在win下方便啊~
国内linux大环境还是不行啊
是啊,我想完全在linux下弄,结果所有的东西基本都重新弄了一遍
头像
lovekid
帖子: 556
注册时间: 2007-03-05 11:43
联系:

Re: 一个被linux支持的USB烧录方案——VOTI

#7

帖子 lovekid »

星仔阿凡提 写了:为什么我的出现了这么个东西啊avrdude: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc
因为你的USBasp是国内改版的固件,刷官方原版固件就好了(要是支持的话)
头像
rgwan
帖子: 264
注册时间: 2009-08-24 19:30
联系:

Re: 一个被linux支持的USB烧录方案——VOTI

#8

帖子 rgwan »

VOTI是代表VOTI.nl的USB VID。
CPU Intel Pentium E6500K(倍频超到13)
主板 MSI G41M-P21
内存 金邦2G DDR3 1333 金士顿 2G DDR3 1333 (降到1066)
硬盘 老三星60G(系统盘) 日立1T 数据盘
显卡 蓝宝石 HD5550 二代 256M GD5
电源 联想航嘉 228W “大”功率电源(汗)
键盘鼠标 联想
机箱 联想
显示器 联想!
操作系统 ubuntu maverick.
欢迎大家到我的小站:http://www.rwzy.co.cc
回复