我们进行mini2440的linux开发,如果能只在linux下工作,工作效率会提高不少,也少了很多麻烦,省得来回切换,另外,linux下的工具可能比windows下还好用些。
我们为什么离不开windows呢?因为我们要用超级终端,和dnw工具。
友善之臂的手册上把linux下的串口工具描述得很难用的似的。实际上并非如此,而具简单得很。
一、串口工具。
windows下的是超级终端,那个东西,我说,太不好用了,一屏的东西只能看见几行,想看见多的东西还得要记入一个记事本文件里,可以说,这更像是linux下的工作风格,不知windows为什么不改善,实在是不好用。
Linux下有minicom,这个的配置也不难,网上有很多讲的,几步搞定,主要要注意的问题是----回车的时候好像我的只有大键盘区的回车好用,数字区的不好用。不知为什么。
而实际上,在linux下用minicom只是一般做法而己,并非唯一,也绝非最好。我们还有更好用的工具----kermit.这个比windows下的超级终端好用啊,最起码显示的文字有滚动条,可以查看多屏。
我的red hat上直接就有,不用安装的,大家可以试试,在终端输入kermit回车,有反应的话就恭喜你,你也不用安装了。
没有的话安装一个,网上找教程吧,也不难的,我不讲了。
只讲kermit的配置方法。很简单。kermit回车,进入后。
输入c回车,进入串口模式。
把下面代码放在终端里一一执行就行了。 set line /dev/ttyS0
set speed 115200
set carrier-watch off
set handshake none
set flow-control none
robust
set file type bin
set file name lit
set rec pack 1000
set send pack 1000
set window 5
复制代码打开开发板,OK!显示出来了吧?
uboot里有个loadb命令是要用kermit传输的哦,这就方便了。
loadb 0x330000000
然后按ctrl+/,在按c.进入kermit模式,
send ./image.bin
go 0x33000000
是不是就可以直接运行了?
现在还不行,因为我们可能有些操作还依赖于dnw,linux下有吗?有!
前不久一直因为mini2440提供的usb下载驱动有毛病老是导致我的机死机或是重启,有时候还关不了机。一气之下决定到linux下去做,反正编译也是要在linux下做再拿到windows做下载的。找了很久终于让我找了个。跟大家分享一下。
(谢谢[url=space-uid-123.html]peimichael[/url]提醒,已经上传了附件,可直接下载用了.)
首先要安装libusb-dev这个库。我是在ubuntu下做的。
那么就:sudo apt-get install libusb-dev
这里帖子上讲的,网址在这里:http://www.usr.cc/bbs/thread-1531-1-1.html
我的red hat里libusb-dev也幸运的存在。所有只在编译一下就OK了。一个gcc命令解决。再来一个cp dnw2 /usr/bin这样就可以直接用了。
本文来自: USR组织官方网站(www.usr.cc) 详细出处参考:http://www.usr.cc/bbs/viewthread.php?tid=1625
前不久一直因为mini2440提供的usb下载驱动有毛病老是导致我的机死机或是重启,有时候还关不了机。一气之下决定到linux下去做,反正编译也是要在linux下做再拿到windows做下载的。找了很久终于让我找了个。跟大家分享一下。
(谢谢peimichael提醒,已经上传了附件,可直接下载用了.)
首先要安装libusb-dev这个库。我是在ubuntu下做的。
那么就:sudo apt-get install libusb-dev
装完之后就编译一个下载工具,网上有个牛人提供了一个。代码如下: /* dnw2 linux main file. This depends on libusb.
*
* Author: Fox <hulifox008@163.com>
* License: GPL
*
*/
#include <stdio.h>
#include <usb.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define QQ2440_SECBULK_IDVENDOR 0x5345
#define QQ2440_SECBULK_IDPRODUCT 0x1234
struct usb_dev_handle * open_port()
{
struct usb_bus *busses, *bus;
usb_init();
usb_find_busses();
usb_find_devices();
busses = usb_get_busses();
for(bus=busses;bus;bus=bus->next)
{
struct usb_device *dev;
for(dev=bus->devices;dev;dev=dev->next)
{
printf("idVendor:0x%x/t,ipProduct:0x%x/n",dev->descriptor.idVendor,dev->descriptor.idProduct);
if( QQ2440_SECBULK_IDVENDOR==dev->descriptor.idVendor
&& QQ2440_SECBULK_IDPRODUCT==dev->descriptor.idProduct)
{
printf("Target usb device found!/n");
struct usb_dev_handle *hdev = usb_open(dev);
if(!hdev)
{
perror("Cannot open device");
}
else
{
if(0!=usb_claim_interface(hdev, 0))
{
perror("Cannot claim interface");
usb_close(hdev);
hdev = NULL;
}
}
return hdev;
}
}
}
printf("Target usb device not found!/n");
return NULL;
}
void usage()
{
printf("Usage: dnw2 <file>/n/n");
}
unsigned char* prepare_write_buf(char *filename, unsigned int *len)
{
unsigned char *write_buf = NULL;
struct stat fs;
int fd = open(filename, O_RDONLY);
if(-1==fd)
{
perror("Cannot open file");
return NULL;
}
if(-1==fstat(fd, &fs))
{
perror("Cannot get file size");
goto error;
}
write_buf = (unsigned char*)malloc(fs.st_size+10);
if(NULL==write_buf)
{
perror("malloc failed");
goto error;
}
if(fs.st_size != read(fd, write_buf+8, fs.st_size))
{
perror("Reading file failed");
goto error;
}
printf("Filename : %s/n", filename);
printf("Filesize : %d bytes/n", fs.st_size);
*((u_int32_t*)write_buf) = 0x30000000; //download address
*((u_int32_t*)write_buf+1) = fs.st_size + 10; //download size;
*len = fs.st_size + 10;
return write_buf;
error:
if(fd!=-1) close(fd);
if(NULL!=write_buf) free(write_buf);
fs.st_size = 0;
return NULL;
}
int main(int argc, char *argv[])
{
if(2!=argc)
{
usage();
return 1;
}
struct usb_dev_handle *hdev = open_port();
if(!hdev)
{
return 1;
}
unsigned int len = 0;
unsigned char* write_buf = prepare_write_buf(argv[1], &len);
if(NULL==write_buf) return 1;
unsigned int remain = len;
unsigned int towrite;
printf("Writing data .../n");
while(remain)
{
towrite = remain>512 ? 512 : remain;
if(towrite != usb_bulk_write(hdev, 0x03, write_buf+(len-remain), towrite, 3000))
{
perror("usb_bulk_write failed");
break;
}
remain-=towrite;
printf("/r%d%/t %d bytes ", (len-remain)*100/len, len-remain);
fflush(stdout);
}
if(0==remain) printf("Done!/n");
return 0;
}
复制代码把它保存为文件如:dnw2.c
接着编译: gcc dnw2.c -o dnw2 -lusb
编译完得到的dnw2就是usb下载的PC端了。
下载时用:dnw2 <filename>下载你的文件到板上。速度还不错哦。
干脆再生成的链接文件sudo ln -s ./dnw2 /usr/sbin/dnw2
这样在我们每编译完要下载的文件就可以直接下载了。
本文来自: USR组织官方网站(www.usr.cc) 详细出处参考:http://www.usr.cc/bbs/thread-1531-1-1.html