ARM-LINUX学习笔记-(虚拟机linux串口终端以及USB程序下载,基于TQ2440)
昨天安装了ssh服务之后今天在windows上用xshell登陆发现登录不上,原因是使用了virtualbox的NAT模式,在NAT模式下,客户机可以很方便地上网,但是想要链接宿主机就需要打开网络地址映射
首先要知道ssh服务使用的是22端口,然后打开windows主机上的适配器,virtualbox安装了一张虚拟网卡,如下
虚拟地址为192.168.56.1,接下来在虚拟机的设置界面设置网络地址映射,首先还要知道虚拟机的IP地址,如下
地址为10.0.2.15,就可以去做端口转发了,位置如下
按照步骤来,设置名称随意,主机IP设置为虚拟机网卡的IP,端口可以写一个未被占用的任意端口,子系统IP为linux宿主机ip,端口为ssh服务端口,相当于说我们连接ssh的时候连接192.168.56.1的2222端口的时候,wirtualbox将数据转发到宿主机的22端口上,经过这一次中转就可以登录ssh了,接下来新建ssh连接如下
注意主机和端口号的设置,和我之前说的一样,这样就可在输入用户名密码之后连接上了,如下
共享文件夹的设置
virtualbox提供共享文件夹的功能,虽然写着自动挂载,但是通常ubuntu是不会自动挂载的,如下
这个时候就需要我们手动在系统中挂在共享文件夹了,首先你需要安装增强功能包,一般都会安装,安装了之后虚拟机用着才爽嘛
然后建立一个文件夹用于挂载共享文件夹
mkdir /mnt/linuxshare
可以建立在别的位置,但是我习惯在这里,建立之后就可以挂载了
mount -t vboxsf linuxshare /mnt/linuxshare
第一个linuxshare是你创建共享文件夹的时候自己制定的名称
第二个/mnt/linuxshare是你创建的挂载文件夹的目录
命令执行完没有错误信息挂载就成功了,然后关闭终端,重新打开终端
vim /mnt/linuxshare/text.c保存之后查看,应该在windows下的共享文件夹出现text.c文件了
有时候命令不太记得,看英文文档比较麻烦的时候我们可以选择安装中文的帮助包使用命令
sudo apt-get update 更新源
sudo apt-get install manpages-zh 安装中文manual
安装完成之后man ls应该就是中文提示了
接下来是串口的共享问题,我使用的是usb转串口的芯片ft232,这个芯片ubuntu14.02自带了驱动,不需要额外安装,但是我们要将这个物理usb转串口切换到虚拟机里面,首先要安装一个包,是wirtualbox的usb2.0增强包,名字叫做Oracle_VM_VirtualBox_Extension_Pack-4.3.26-98988.vbox-extpack,百度搜索一下在oracle的官方网站下载,下载之后安装就能启动usb2.0的支持了,接下来如下设置
按照设置添加这个usb,然后重启系统,重启完成之后应该就能看到usb转串口设备,这样查看
如果没有这个设备看看是不是自己弹出了,可以在这里弹出
串口设备安装好了之后打开设备,我们知道设备在linux上对应的都是文件,串口设备对应文件在这里
/dev/ttyUSB0
接下来是串口通讯,我们安装两个串口通讯软件,一个命令行一个图形化的,使用命令
sudo apt-get install minicom //命令行调试助手
sudo apt-get install cutecom //图形化调试助手
安装好minicom之后需要进行设置,命令为
sudo minicom -s
设置截图如下
设置完成之后保存为默认配置文件,退出界面,再次输入
minicom,自动打开串口(要是打开失败,屏幕右下角显示offline的)
然后将我手上的TQ2440开发板打到norflash启动(nor中已经有了bootloader),显示界面如下
好,到这里串口通讯完成,接下里为了摆脱windows我们还需要把usb完成
首先第一步是下载安装libusb-dev,如下
sudo apt-get install libusb-dev
安装完成之后,记得将TQ2440的USB端口导入linux,如下
到这里快成功啦,下载程序我们需要一个工具,windows有一个dnw,有人做了dnw2,源代码如下
/* 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)
{
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(!=usb_claim_interface(hdev, ))
{
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(-==fd)
{
perror("Cannot open file");
return NULL;
}
if(-==fstat(fd, &fs))
{
perror("Cannot get file size");
goto error;
}
write_buf = (unsigned char*)malloc(fs.st_size+);
if(NULL==write_buf)
{
perror("malloc failed");
goto error;
} if(fs.st_size != read(fd, write_buf+, 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+) = fs.st_size + ; //download size; *len = fs.st_size + ;
return write_buf; error:
if(fd!=-) close(fd);
if(NULL!=write_buf) free(write_buf);
fs.st_size = ;
return NULL; } int main(int argc, char *argv[])
{
if(!=argc)
{
usage();
return ;
} struct usb_dev_handle *hdev = open_port();
if(!hdev)
{
return ;
} unsigned int len = ;
unsigned char* write_buf = prepare_write_buf(argv[], &len);
if(NULL==write_buf) return ; unsigned int remain = len;
unsigned int towrite;
printf("Writing data ...\n");
while(remain)
{
towrite = remain> ? : remain;
if(towrite != usb_bulk_write(hdev, 0x03, write_buf+(len-remain), towrite, ))
{
perror("usb_bulk_write failed");
break;
}
remain-=towrite;
printf("\r%d%\t %d bytes ", (len-remain)*/len, len-remain);
fflush(stdout);
}
if(==remain) printf("Done!\n");
return ;
}
拷贝到linux中并建立文件dnw2.c,然后进入其目录,编译该文件
gcc dnw2.c -o dnw2 -lusb
编译的的时候有两个小警告,不要紧,查看目录下,生成了dnw文件如下
将该文件的路径加入到环境变量中,路径取决于你放在哪里,比如我放在/home/work/dnw2里面,那么我修改/etc/environment文件为这个样子
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/work/gcc-arm-none-eabi-4_9-2015q1/bin:/home/work/dnw2"
最后一个就是我的路径
做完之后记得
source /etc/environment
此时环境变量就加载成功了,接下来可以直接下载,找一个以前做好的bin文件,烧写命令如下
dnw2 文件名
如果说dnw2找不到看看是不是环境变量没有加进去,这个命令必须在root模式运行
sudo -i
source /etc/environment
dnw2 文件名
这样应该没问题了,还有问题,看
echo $PATH 看看环境变量对不对
到这里我们就可以快乐的在linux下烧写内核,镜像,裸机程序了
另外,每次烧写的时候都需要在USB中手动的插入tq2440USB设备,也可以直接设置过滤器,主要原因是烧写完成之后2440就把USB设备拔出了
前面说了cutecom,使用起来是这样的
恩,今天的笔记基本结束,开发环境基本OK了
ARM-LINUX学习笔记-(虚拟机linux串口终端以及USB程序下载,基于TQ2440)的更多相关文章
- linux学习笔记2 - linux常用命令
转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...
- Linux学习笔记之Linux相关知识
[想成为某一方面的大神,没有捷径可走,只能不断的记录.练习.总结.coding……] notes:主要从网上摘录了一些关于Linux的历史以及一些相关内容,以便对Linux系统有一定的了解.这不但可以 ...
- linux/linux学习笔记-初识linux(mooc)
一.linux简介 linux版本:内核版本和发行版本 linux企业应用: 1.基于linux的企业服务器 2.linux在嵌入式领域应用 android底层Linux : ios底层unix li ...
- Linux学习笔记之Linux启动引导过程
早期时,启动一台计算机意味着要给计算机喂一条包含引导程序的纸带,或者手工使用前端面板地址/数据/控制开关来加载引导程序.尽管目前的计算机已经装备了很多工具来简化引导过程,但是这一切并没有对整个过程进行 ...
- Linux学习笔记之Linux第一课-基本介绍
Linux简介 Linux内核最初只是由芬兰人李纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的. Linux是一套免费使用和自由传播的类Unix操作系统,是一个基 ...
- Linux学习笔记之Linux启动级别
对于绝大多数Linux程序员来说,进入Linux系统后一般看到的是黑乎乎的界面(开发模式),因为系统如果启动选择开发模式,会减少启动时间,优化内存等.但是通常我们刚安装完Linux系统,然后进去以后是 ...
- Linux学习笔记(22) Linux启动管理
1. 系统运行级别 运行级别 含义 关机 1 单用户模式,可想象为windows的安全模式,主要用于系统修复 2 不完全的命令行模式,不含NFS服务 完全的命令行模式,就是标准字符界面 4 系统保留 ...
- Linux学习笔记(21) Linux日志管理
1. 简介 (1) 日志服务 在CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务.rsyslogd日志服务更加先进,功能更多.但是不论该服务的使用,还是日志文件的格式 ...
- Linux学习笔记(20) Linux系统管理
1.进程管理 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源. 进程管理的作用有判断服务器健康状态.查看系统中所有进程及杀死进程.一般都可以采用 ...
随机推荐
- perfect-scrollbar示例
<!DOCTYPE html> <html> <head> <title>perfect-scrollbar - www.97zzw.com -97站长 ...
- zend frameword 基本语法
#resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"#resources.frontCo ...
- linux的学习系列 1---简介
Linux简介 严格的来讲,Linux 不算是一个操作系统,只是一个 Linux 系统中的内核,即计算机软件与硬件通讯之间的平台:Linux的全称是GNU/Linux,这才算是一个真正意义上的Linu ...
- 命令行调试smali
am start -D -n com.agilebits.onepassword/.activity.LoginActivity ps | grep passu0_a126 1107 217 5107 ...
- IDL 实现PCA算法
在多元统计分析中,主成分分析(Principal components analysis,PCA)是一种分析.简化数据集的技术.主成分分析经常用于减少数据集的维数,同时保持数据集中的对方差贡献最大的特 ...
- Json.net对数据的解析
在官网下载Json.net文件后,解压完将Net20下面的DLL复制到Assets目录下. using UnityEngine; using System.Collections; using New ...
- The Accumulation of Capital
The Accumulation of Capital ---- by *Adam Smith Capitals are increased by parsimony, and diminished ...
- LISTVIEW嵌套GRIDVIEW的一些处理(点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置)(对这篇文章的优化处理,不每次都new onItemClickListener)
前几天写了点击GRIDVIEW的条目,能够显示他在LISTVIEW中的位置,当时的处理是在ListView的适配器里的GetView方法里每次都new GridView的onItemClickList ...
- SGU_390_Tickets(另类数位DP)
Tickets Time Limit : 1000/500ms (Java/Other) Memory Limit : 524288/262144K (Java/Other) Total Subm ...
- hdu_5145_NPY and girls(莫队算法+组合)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5145 题意:给你n,m,共有n个女孩,标号为1—n,n个数xi表示第ith个女孩在第xi个教室,然后下 ...