jefby的小窝

  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

路由器wndr3800 OpenWrt刷写记录

发表于 2014-05-21 | 更新于 2018-11-25 | 分类于 Linux |

对OpenWrt慕名已久,最近有一个想法:实现一个简单的透明翻墙路由器,将校园网共享出来,然后在路由器上运行翻墙代理,实现手机等无线设备的零配置翻墙。网上搜了很多资料,最终决定购买网件的WNDR3800,这台路由器当时配置还可以,但现在看来有点弱,不过相信大品牌的做工和质量。主要的参数如下:

CPU : AR7161,680MHZ
RAM: 128M DDR
FLASH: 16M

支持双频段:2.4G+5GHZ

首先是内存大,运行大程序应该无压力,另外是出厂FLASH就是16M,比国内某些路由厂商做的地道多了,可以放置更多的应用程序,同时openwrt系统也支持,适合新手使用。当然,如果老鸟的话可能真的是有点看不上。目前360,小米等鼓吹的AC频段,但似乎很少有设备能支持吧?大部分都是802.11n.

在淘宝上选了一家价格和评分都不错的店家买了,入手价是269,再加上我用的顺丰快递(+10),总共下来是279,感觉还可以!等熟悉了openwrt后再买一些比较高端的货玩玩哈!^_^。刚开始还想要店家一些技术问题,发现店家似乎也不是很了解,就只好自己先上网搜搜了,幸好对Linux内核和驱动还算有点了解,下载源码,可以使用git或者svn版本控制管理工具,本文使用trunk版本,git的命令如下:

1
$git clone git://git.openwrt.org/openwrt.git

barrier breaker版本命令如下:

1
$git clone git://git.openwrt.org/14.07/openwrt.git

SVN的命令如下:

1
$svn co svn://svn.openwrt.org/openwrt/trunk/

barrier breaker版本命令如下:

1
$git clone svn://svn.openwrt.org/openwrt/branches/barrier_breaker

============================2014/12/3update========================

然后make menuconfig,选择了CPU和路由器WNDR3800,如果需要界面的话进入到LuCI配置下,选择bootstrap风格(个人比较喜欢,很清新),然后选上develop configure模式(不用每次都从零编译),最后保存并退出。配置界面如下图所示:
PhJarD.png

接着编译,运行命令:

make -j8 V=s

-j8表示启动多少个job(主要参考电脑配置,我电脑是4核的,就设置为8,一般是两倍),顺利的话应该会生成一个bin文件夹,在子目录ar71xx/中会看到openwrt-xxxx-wndr3800.squash.img文件,使用网线连接路由器和电脑,进入管理界面中,刷机,完成后重启,再次打开就是OpenWrt的系统啦!!如下图所示:
PhJ0VH.md.png

XILINX学习笔记之七---VGA显示原理

发表于 2012-12-07 | 更新于 2018-11-25 | 分类于 FPGA |

VGA(Video Graphic Array),视频图像阵列,是在20世纪80年代末由IBM PC中引入的视频显示标准,现在已经在PC显示器中得到了推广。图1所示为Spartan-3E上的VGA 显示接口。

PTagYT.md.png

图1

PTackV.png

图2

图2所示为DB15接口图,主要有5个信号比较重要,即水平、垂直两大同步信号,3基色信号(红、绿、蓝),spartan-3e中用3bit来表示每一个像素,故显示效果不好。最古老的显示器要属CRT显示器,它的全称为((cathode ray tube)阴极射线管.图3所示为640×480的CRT显示时序图。

PTayT0.md.png

图3

如图3所示,VGA控制器生成水平和垂直同步时序信号,并且协调每一像素周期的视频数据传输。像素周期定义了能够显示一个像素信息的时间。vs信号定义了显示器的刷新频率,或者显示设备中的所有信息需要重画的频率。一般刷新频率范围是60HZ~120HZ。

如果需要在显示设备上显示一幅图片,则可以根据图3设置相应的计数器,产生出水平和垂直扫描信号,并将图片信息保存在ROM中,然后从ROM中读入缓冲区,不停的刷新即可。

XILINX学习笔记之六---PS2键盘接口设计之二(实现了从键盘输入并显示在LCD液晶屏上)

发表于 2012-11-30 | 更新于 2018-11-25 | 分类于 FPGA |

在熟悉了PS2键盘接口设计之后,我想大家都希望将输入的数据在显示屏中实时的显示出来或者看看我们到底输入的是什么样的东西,基于这个原因,结合Spartan-3E开发板上的资源,我利用了液晶1602将输入的字符显示出来。最终结果是可以从键盘上输入任意ASCII字符,可以通过1602显示出来。

具体实现方法是基于我的上一篇博文PS2键盘设计和修改后的1602液晶接口,顶层文件定义如下图所示:

PTUWqI.png

CapsLock为大写锁定或者Shift输入端,高有效,clk_50m是系统时钟信号,ps2c,ps2d为ps2的时钟和数据端口定义,rst_n为复位输入,低有效,disp_value为输入字符的ASCII值,sf_d为LCD数据端口,lcd_e,lcd_rs,lcd_rs为1602控制信号。

具体包含两个模块:一个是键盘接口模块,一个是显示模块,键盘接口模块主要负责获取按键的ASCII值,显示模块主要负责在LCD上将该ASCII值所代表的字符显示出来,具体定义如下所示:
PTURsA.png

ps2keyboard为键盘接口模块,lcd_port为液晶显示模块设计,实现方法是ps2keyboard将按键的ASCII字符传递给data_i(lcd_port模块的数据输入),然后由lcd_port将数据写入到LCD上。如果按键ASCII字符有变化,因为在LCD_PORT中监视了数据data_i,如果变化就会及时更新显示。源码及使用说明如下:
http://pan.baidu.com/share/link?shareid=134819&uk=438936279

XILINX学习笔记之五---PS2键盘接口设计

发表于 2012-11-29 | 更新于 2018-11-25 | 分类于 FPGA |

花了好几天时间学习PS2键盘IP核,看PS2协议,看别人写的代码,由于基础不是很好,所以中间犯了低级错误而不知道,只是不停的在编译下载,一次又一次的调试,第一次的时候,没有任何反应,然后检查代码,该各种参数,就是没有想到reset数据会有问题,

Always @(posedge clk or posedge reset)//我想要复位信号高有效。结果调试了大半天,原来这样是行不通的。还有各种小错误,都是敲代码的时候不注意,也没有仔细检查,然后就直接编译运行,结果肯定出不来正确结果,所以以后写代码的时候千万要仔细,写完代码也不要急着编译下载,先检查代码的正确性,确认无误了再编译下载,这样会大大的提高效率。

PTUarR.png

好了,废话不多说,说怎么写吧。PS2键盘驱动是比较简单的,当然(不考虑从主机向键盘发命令),只是考虑从键盘中发送数据给PC(主机),然后主机能够及时接收数据,这样就可以了。

PTUUM9.png

上图所示是PS2端口的数据线定义,PS2_DATA是串行数据线,PS2_CLK是时钟信号,min = 60us,max = 100us,

下图所示为读取数据时序图,可以看出跟串行通讯很像,有个起始位,然后是8个数据位,1个奇偶校验位,一个停止位,在下降沿时读取,那么我们所做的东西就很少了,只需要找出它的下降沿,然后读取11个数据就可以了,然后将数据存储起来,比较其扫描码,然后进行转换,最终输出ASCII值。

PTUY24.png

下降沿有效信号,我是通过最普通的方法来实现的,即利用两级D寄存器,然后就可以求其下降沿。具体代码如下:

PTUdq1.png

数据读写也非常简单,定义8位的缓冲器,然后按序将数据存储在缓冲区中就可以了,具体实现如下:

PTUJGF.png

以下代码类似,只是在case10的时候需要,将计数器清零。那么怎么检测什么时候按键弹起呢?当弹起时,PS2键盘会向主机发送0XF0的数据,如果接收到该数据,说明了按键被弹起了,那么此时需要released信号为高,信号不会写入ascii端口。具体如下

PTUtxJ.png

红线所示为关键部分,当released信号为高,rx_output_strobe信号为低,rx_ascii值不变仍然为上次按键按下时的值。

XILINX学习笔记之四---1602液晶IP核设计

发表于 2012-11-12 | 更新于 2018-11-25 | 分类于 FPGA |

1602为常见的液晶显示设备,本实验所用的规格为16x2字符型驱动,直观图如下所示。
PTNMtO.png

上图为本人已完成的LCD液晶驱动显示效果(可以显示任意字符串),由两行组成,可以显示英文字符,部分日语,也可以显示自定义的图像,Spartan-3E所用的1602 (Sitronix ST7066U graphics controller)与FPGA的接口如下所示:

信号说明:
其中SF_D为4位的数据接口位,LCD_E为液晶显示或者不显示控制位,LCD_RS为区分控制或数据信号标志位,当LCD_RS = ‘0’时,表示SF_D为控制信号,LCD_RS=’1’此时SF_D为数据位,LCD_RW为读写控制位,因为不需要从LCD液晶屏中读取数据所以可以简单的再复位操作时,将其清零即可。

可以看出,此1602的数据位为4位,故要写入8位命令时需要进行两次写入操作,写入数据的时序图如下所示,
PTNn76.png
PTNKAK.png

红线所画为两个字节数据写入所需的最小时差(这个需要特别注意)

根据Spartan-3E的GUIDE,可以知道1602工作的基本流程主要分为上电初始化、写命令、设置读写地址、传递数据三大过程,笔者统计了下这三大步骤中的等待时间最小值和最大值,其中最小值为40us,最大值为15ms,故笔者采取了将50MHZ的时钟分频为10KHZ,即时钟周期为100us的方法来简化设计。

在Spartan-3E的用户手册上详细讲解了如何对此液晶进行操作,笔者做了简单的摘要:

一)上电初始化(目的是建立宽度为4 bit的数据接口)

  • 等待15ms或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期(时钟频率为50MHZ时)
  • 等待4.1ms或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期
  • 等待100us或者更长时间
  • 写命令字0x3,保持LCD_E高电平12个周期
  • 等待40us或者更长时间
  • 写命令字0x2,保持LCD_E高电平12个周期
  • 等待40us或者更长时间

二)写命令

  • 发送功能设置命令(Function Set),0x28
  • 发送端口模式设置命令(Entry Mode Set),0x06,自动增加地址指针
  • 发送Display ON/OFF命令,0x0C,打开显示开关并禁止光标闪烁
  • 发送Clear Display命令,等待1.64ms或者更长时间

三)设置读写地址和传递数据

指定起始地址,并给出一个或者多个数据,这一步是显示的关键,必须仔细设置控制位,笔者就是因为这个错误,白白花费了大半天的时间,具体方法是在写任何数据之前,发送Set DD RAM Address 命令,(写入7位的DD RAM地址,注意最高位为1)然后再写入数据。

简单介绍我所设计的LCD液晶IP核的思路,首先生成100us的时钟,然后根据初始化顺序,编写状态机。最终设计效果是在1602液晶屏上可以静态显示16*2的任意字符串—而这只需修改两个参数即可轻松实现。下面是部分代码展示。下图为为写16个字符的代码实现
PTNm0x.png

下面两图分别为将普通的字符串转换为1602可显示的编码值的模块和生成clk_100us的代码,
PTNen1.png
PTNQhD.png

最终效果图是在屏幕上显示两行字符串:
PTNMtO.png

XILINX学习笔记之三---RS232串口通讯设计

发表于 2012-11-11 | 更新于 2018-11-25 | 分类于 FPGA |

串口设备广泛应用于计算机数据传输中,所以研究其原理是非常有必要的一件事情。下面是我从XILINX官方设计出发,并作了一些修改之后实现了PC和FPGA的通讯,现在把整个过程总结下,以便后面使用,同时加深理解。

结果展示:

P4EIfJ.png

上图是从FPGA发送数据给PC机,PC机接收到的数据。

串口通讯由两个模块组成,一个是数据接收模块;另一个是数据发送模块。那么到底它们是如何工作的呢?

总的来说,它们是首先约定好数据传输的格式,然后,接收模块按照约定的数据格式取有效数据,发送模块按照约定的格式发送数据。

先从发送模块出发,首先,检测rxd位是否为’0’,若为’1’,则保持在空闲状态,否则,进入等待8个周期阶段,若等待期间,rxd变为’1’,则回到空闲状态,否则进入数据接收模块,每隔16个周期采样一次数据,并作移位处理,移位的次数取决于约定发送数据的宽度、是否有校验位、停止位的宽度,最后是停止状态,然后回到空闲状态。发送模块比较麻烦,首先是数据拼接,将需要发送的数据拼接为约定的数据格式,然后是数据发送,先检测发送总线是否空闲,然后进入发送数据阶段,移位,完成后进入空闲状态。

源码和相关附件在此链接下,可自由下载。不过若使用请注明出处!

源码+附件

邮件地址是`jef199006@gmail.com`

XILINX学习笔记之二---数码管的动态显示

发表于 2012-10-23 | 更新于 2018-11-25 | 分类于 FPGA |

下图左为笔者所用的数码管的原理图,为8段共阴极数码管,4位位选信号,
P4VPXt.md.png

一般而言,数码管显示方式有两种:静态显示,动态显示。

静态显示原理比较简单,送数据,送片选信号即可,而动态显示则比较复杂,需要不停的刷新,同时需要特别强调的一点的是刷新频率, 这个真的非常重要。

笔者就因为这个问题纠结了快一天,因为笔者所用的时钟频率比较高,当时也没有想到频率问题上来,结果各种调试,各种方法都试了一遍,可是老是有问题,最后,上网查资料,看到别人写的代码中有时钟分频,猛然间想起来,是不是时钟太快了,然后,再上网查资料,发现原来刷新频率最好为1ms,即1KHZ,后面就简单了,分频出一个1KHZ的时钟信号,然后,使用计数器进行位选,并在相应的位有效时,传入相应的数据,最终完成了设计。

设计结构图如上所示,
P4E6ln.png

下面所示为资源使用情况:
P4Ecyq.md.png

源码有需要的请留下邮箱,会及时发给你,就不再上传了。谢谢大家!!

XILINX学习笔记之一---流水灯(有工程文件VHDL&Verilog_可直接使用)

发表于 2012-10-18 | 更新于 2018-11-25 | 分类于 FPGA |

因为笔者是软件出身,专业是计算机,所以硬件方面的基础相比电子、通信等专业出身的来说非常差,很多时候都会用串行的方法来思考问题,而硬件的主要思想却是并行,另外,刚开始对FPGA设计流程不熟悉,对于很多参考书上所说的逻辑设计、行为仿真、综合、后仿真、下载、测试并运行等等这些环节并没有很深的体悟,相信刚开始很多人也如我一般,一直很迷茫,不知道自己该如何下手,其实,要想学好FPGA最迅速的办法就是自己买块开发板或者借块板子,然后,开始编写代码,仿真,下载,查看结果。结果不对,然后分析问题,一个个排除,一遍遍下载调试,最终你一定可以成功的!废话不多说,从最简单的流水灯实验入手,让我们走进FPGA的世界,相信这将是一个纪念性的时刻,想想,真真实实的看到你自己写的代码来控制硬件,不调用任何函数,没有别人的插手,你自己来打造你自己的电子王国。。。

流水灯的思想很简单,需要依次点亮特定位置的LED灯,当然,对于新手来说这可不是一件容易的事情,首先你得学会VHDL或者Verilog语言之中的一种,然后熟悉设计方法,最后编写代码实现。

下面是部分代码展示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
process(clk_50MHZ,reset)
begin
if(reset = '1')then//异步复位
count <= (others => '0');//将计数器清零
elsif(clk_50MHZ'event and clk_50MHZ = '1') then//时钟上升沿到来
if(count = half_50MHZ)then//检测是否计数器到达50MHZ/2-1,若到达,计数器清零
count <= (others => '0');
else
count <= count + 1;
end if;
end if;
end process;

//生成1HZ的时钟信号rclk
process(clk_50MHZ,reset)
begin
if(reset = '1')then
rclk <= '0';
elsif(clk_50MHZ'event and clk_50MHZ = '1') then
if(count = half_50MHZ)then
rclk <= not rclk;
else
rclk <= rclk;
end if;
end if;
end process;

首先需要知道在Spartan-3E上主时钟为50MHZ,而这个50MHZ速度是非常快的,如果只是利用50MHZ时钟来直接做为流水灯转换的间隔,那么是不可行的,那么就必须对其进行分频,笔者考虑到通用性,将其分频为1HZ,即一秒钟变化一次,这样,就可以方便观看效果,下面是流水灯的核心代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
process(rclk,reset,en,dir,q)//注意这儿需要将所有的敏感信号都加进来
begin
if(reset = '1')then
q <= x"01";
elsif(rclk'event and rclk = '1') then
if(en = '1') then
if(dir = '0') then--左移
q <= q(6 downto 0) & q(7);
elsif(dir = '1') then--右移
q <= q(0) & q(7 downto 1);
end if;
end if;
end if;
end process;

当允许时,才进行左移(q <= q(6 downto 0) & q(7);)或者右移操作(q <= q(0) & q(7 downto 1);),否则啥也不做,然后综合,下载即可。

到这里,完整的流水灯就OK了!!

附件里面是我自己写的代码,开发板为SPARTAN-3E starter kit board,ISE 13.3 ,语言为VHDL和Verilog。需要的人下载,同时由于笔者水平有限,希望大家多多批评指正。

附件led-flow.rar为VHDL实现,led-flow-v.rar为Verilog语言实现。

led-flow-v.rar

led-flow.rar

123

jefby

记录点点滴滴

28 日志
5 分类
12 标签
GitHub Twitter
© 2018 jefby
由 Hexo 强力驱动 v3.7.1
|
主题 – NexT.Muse v6.4.0