页次: 1
直接gdb命令行呢
https://whycan.cn/t_1210.html#p5614
表示对你写的那个看不懂,gdbserver不是应该在pc端运行的吗?怎么跑到开发板上运行了?
开发板不能工作的情况下如何运行gdbserver?
不知道xboot在eclipse中如何用jlink进行硬件调试,搜到下面的帖子:
JLink + GDBServer + gdb 调试 全志Allwinner V3s 的 u-boot-spl程序
挖坑网/填坑网 JLink + GDBServer + gdb 调试 全志Allwinner V3s 的 u-boot-spl程序
unbutu16下添加jlink驱动,不确定是否成功。
所里转到win7下面来调试
打开J-link GDB Server:
这样貌似已经连接了F1C100S
eclipse里面的设置如下:
然后开始debug,顺利的卡在这里:
请问,上面的过程要修改哪里?
775624981 说:是这样的,我用imx283开发板,由于还没有移植好tslib,所以就用mouse_hid.c改了一下,在获取坐标的函数里直接赋坐标值模拟按键触摸,但是屏幕没有反应?
界面是自带的demo例程
bool mouse_hid_read(lv_indev_data_t * data)
{
static lv_indev_state_t st;
static unsigned char b;
//ts_read(touch_pad,&sample,1);
data->point.x = 240;
data->point.y = 25;
if(st == LV_INDEV_STATE_PR)
{
b ++;
if(b > 20)
{
b = 0;
st = LV_INDEV_STATE_REL;
}
}
else
{
b ++;
if(b > 20)
{
b = 0;
st = LV_INDEV_STATE_PR;
}
}
data->state = st;
printf("x = %d y = %d state = %d\r\n",data->point.x,data->point.y,data->state);return false;
}感觉这段就干了一件事:
data->point.x = 240;
data->point.y = 25;
data->state = LV_INDEV_STATE_PR;
littlevgl官网的范例里面已经有了一个自带滑动的宏定义(define LV_DEMO_SLIDE_SHOW)了,开了之后就可以自动左右滑动了
src/external/lvgl-v5.1/lv_ex_conf.h 查看文件 @ 5c41db8
@@ -36,6 +36,7 @@
#define USE_LV_DEMO 1
#if USE_LV_DEMO
#define LV_DEMO_WALLPAPER 1 /*Create a wallpaper too*/
+#define LV_DEMO_SLIDE_SHOW 0 /*Automatically switch between tabs*/
是这样的,我用imx283开发板,由于还没有移植好tslib,所以就用mouse_hid.c改了一下,在获取坐标的函数里直接赋坐标值模拟按键触摸,但是屏幕没有反应?
界面是自带的demo例程
bool mouse_hid_read(lv_indev_data_t * data)
{
static lv_indev_state_t st;
static unsigned char b;
//ts_read(touch_pad,&sample,1);
data->point.x = 240;
data->point.y = 25;
if(st == LV_INDEV_STATE_PR)
{
b ++;
if(b > 20)
{
b = 0;
st = LV_INDEV_STATE_REL;
}
}
else
{
b ++;
if(b > 20)
{
b = 0;
st = LV_INDEV_STATE_PR;
}
}
data->state = st;
printf("x = %d y = %d state = %d\r\n",data->point.x,data->point.y,data->state);return false;
}
感觉这段就干了一件事:
data->point.x = 240;
data->point.y = 25;
data->state = LV_INDEV_STATE_PR;
以下内容是我搬运过来的~
-----------------------------------------------
N种方法使用C++调用C#.NET库
2015年12月08日 17:27:51
阅读数:2139
为了减少篇幅,此文不描述何种场景下需要使用C++调用C#/VB等托管代码,而直接给出三种常规方法和一些变通方法以供参考。
常规方法1:COM
使用C#把托管类注册成COM,用regasm.exe注册output assembly,然后用C++像调用COM一样调用assembly里面的type。
优点:编写代码简单,调用方便
缺点:需要注册output,发布不够简单
参考:http://www.codeproject.com/KB/cs/ManagedCOM.aspx
常规方法2:CLR
C#常规编写类,生产assembly,C++使用CLR编译既可直接引用托管类。
优点:编写代码简单,调用方便
缺点:需要了解C++ CLR语法(既不像C++,又不像C#,总之很奇怪)
参考:http://www.codeproject.com/KB/mcpp/cppcliintro01.aspx ,http://msdn.microsoft.com/en-us/library/k8d11d4s.aspx
常规方法3(推荐):API
C#常规编写类,生产assembly,C++使用SDK提供的CLR非托管接口(CLRCreateInstance)进行调用。
优点:传统C#编程,传统C++编程
缺点:暂时还没发现
参考:http://nport.codeplex.com/SourceControl/changeset/view/45681#903468 ,http://msdn.microsoft.com/en-us/library/dd537633.aspx
变通方法:
1. 使用C#/VB包装现有托管类,注册成Windows服务,暴露SOAP web service。VC2005可以使用非托管代码添加引用Web service。
2. 使用C#/VB包装现有托管类,注册成Windows服务。C++利用Windows message和服务通讯。
3. 使用C#/VB包装现有托管类,注册成Windows服务。C++利用Windows共享内存和服务通讯。
其实利用双进程通讯的方法,可以演变出各种各样调用的思路。聪明的你可以充分发挥想象力,写出自己独有的调用模式。
XBOOT 部分功能小结---2
1,do_init_kobj这个里面一堆超级技巧
整个模块化加载,就靠这个
简单理解了后,会发现超级简单
就是划一片内存,然后管理
就是搞一些链表什么的,链接各种内存片段
2,pump_event
pump_event这个是异步的,xboot的外设,鼠标 键盘 触摸屏 等任何event消息,都是丢进fifo的,用的时候,仅需要取,就行了
3,获取程序耗时
profiler_reset();
//void profiler_snap(const char * name, int event, int data);
profiler_snap("name",0,0); //抓取一次时间,标记为name,多次执行本语句,计算平均耗时
profiler_dump() //显示相应的耗时
//例如:
int n=100;
while (n<1)
{
mdelay(2);
profiler_snap(testmdelay,0,0);
n--;
}
profiler_dump();
4,滤波,filter
在目录xboot\src\lib\libc\filter下有一些通用滤波器代码,可以直接用
5, 链接脚本
MEMORY
{
ram : org = 0x40000000, len = 16M
dma : org = 0x41000000, len = 16M
heap : org = 0x42000000, len = 32M
}
上述三者之和要和DRAM一样大。heap段为malloc用;ram段其实,就是text段,data段;dma段预留,几个frambuffer的大小,其实没啥用(因为F1C100S的FB驱动中其实frambuffer是设定在heap段)。
6,查看时钟频率
查时钟频率,可以去/sys/device/clk/下查看,cat xxx/summary 就可以了,时钟树的配置,以及调试,xboot已经做得很方便了
7,查看内存用量
使用memory相关sysfs,可以查看当前内存用量,dma内存使用情况
cat /sys/class/memory/meminfo
cat /sys/class/memory/dmainfo
我想问一下xboot的设备树在系统哪里读取解析的啊
XBOOT(8192542) 2018-4-11 11:32:36查看前后消息do_init_kobj这个里面一堆超级技巧
XBOOT(8192542) 2018-4-11 11:32:55查看前后消息整个模块化加载,就靠这个
XBOOT(8192542) 2018-4-11 11:33:30查看前后消息简单理解了后,会发现超级简单
XBOOT(8192542) 2018-4-11 11:33:53查看前后消息就是划一片内存,然后管理
XBOOT(8192542) 2018-4-11 11:34:18查看前后消息就是搞一些链表什么的,链接各种内存片段
一开始以为是内核或者boot.scr的问题,后来发现每次插上串口都能一次性成功启动到登录界面
但是一旦拔了串口,就不行了,只停留在uboot的那一步,后面不动了。。
看了这篇博文后https://blog.csdn.net/guet_kite/article/details/78264740,说是串口的引脚受到干扰,以为是有按键输入。。。干扰怎么会有这么大的。。。,将信将疑,我把RX引脚接到地,再上电,有了!
各位坑有有木有谁也遇到过这种问题,你们是怎么解决的?
推测串口rx为浮空输入,可以尝试改为下拉输入(不确定有无此设置)
可能串口的rx和其他信号线太近受到干扰,导致uboot误判
以前也遇到过这个问题 自己做的jlink 上的串口 没有上拉电阻 会一直往外面发0.
加上拉电阻:
1、让电路保持稳定的状态,避免误触发;
2、当有高频干扰信过来时,可以通过上拉对电源泄放掉;
3、很多口线和信号线是开漏输出,因此要加上拉,如IIC;(看全志的uboot源码,好像把gpio配置为上拉给注释了 你可以试试看)
4、为了阻抗匹配,多是信号完整性考虑.
1、让电路保持稳定的状态,避免误触发; -----没用,或心里作用
2、当有高频干扰信过来时,可以通过上拉对电源泄放掉; ---高频干扰不会影响串口收发,因为串口是固定波特率,心里作用
3、很多口线和信号线是开漏输出,因此要加上拉,如IIC;(看全志的uboot源码,好像把gpio配置为上拉给注释了 你可以试试看) -----全志的端口设置包括端口复用和驱动能力,一旦选择了相应的功能,端口的上下拉或者开漏就自动设定 了,能改变的是只能调整上下拉电阻的大小,从而改变驱动能力
4、为了阻抗匹配,多是信号完整性考虑.---这么低速的信号完全不存在阻抗匹配
https://www.ibm.com/developerworks/cn/linux/l-cairo/
#include <gtk/gtk.h> #include <cairo.h> #include <cairo-pdf.h> #include <cairo-ps.h> #include <cairo-svg.h> #include <math.h> #include <gdk/gdkkeysyms.h> #include <string.h> #define WIDTH 800 #define HEIGHT 600 #define STRIDE WIDTH*4 #define MAX_COORDS 1024 /* This path desribes what will be drawn later The bulk of it is doing the IBM letters by connect the dots at the very end, we will get fancy and add a (R) Registered logo. */ static void travel_path (cairo_t *cr) { gint pen_radius = 10; cairo_set_source_rgb (cr, 1,1,1); cairo_paint (cr); cairo_set_line_width (cr, pen_radius*2); /* Use IBM Blue Pen Color with no ALPHA */ cairo_set_source_rgba (cr, .3, .42, .69, 1); /* This Draws the IBM 8 Lines "I" Logo */ cairo_move_to (cr, 10, 10); cairo_line_to (cr, 160, 10); cairo_move_to (cr, 10, 40); cairo_line_to (cr, 160, 40); /* NOTE: Narrower Middle: 1/3 width */ cairo_move_to (cr, 60, 70); cairo_line_to (cr, 110, 70); cairo_move_to (cr, 60, 100); cairo_line_to (cr, 110, 100); cairo_move_to (cr, 60, 130); cairo_line_to (cr, 110, 130); cairo_move_to (cr, 60, 160); cairo_line_to (cr, 110, 160); /* END Narrower Middle */ cairo_move_to (cr, 10, 190); cairo_line_to (cr, 160, 190); cairo_move_to (cr, 10, 220); cairo_line_to (cr, 160, 220); /* END "I" DRAWING */ /* This Draws the IBM 8 Lines "B" Logo */ cairo_move_to (cr, 170, 10); cairo_line_to (cr, 340, 10); cairo_move_to (cr, 170, 40); cairo_line_to (cr, 360, 40); cairo_move_to (cr, 200, 70); cairo_line_to (cr, 250, 70); /*B's have holes in them! */ cairo_move_to (cr, 300, 70); cairo_line_to (cr, 360, 70); cairo_move_to (cr, 210, 100); cairo_line_to (cr, 350, 100); cairo_move_to (cr, 210, 130); cairo_line_to (cr, 350, 130); cairo_move_to (cr, 200, 160); cairo_line_to (cr, 250, 160); /*B's have holes in them! */ cairo_move_to (cr, 300, 160); cairo_line_to (cr, 360, 160); cairo_move_to (cr, 170, 190); cairo_line_to (cr, 360, 190); cairo_move_to (cr, 170, 220); cairo_line_to (cr, 340, 220); /* END "B" DRAWING */ /* THE EVER POINTY "M" */ cairo_move_to (cr, 370, 10); cairo_line_to (cr, 470, 10); cairo_move_to (cr, 560, 10); cairo_line_to (cr, 660, 10); cairo_move_to (cr, 370, 40); cairo_line_to (cr, 490, 40); cairo_move_to (cr, 540, 40); cairo_line_to (cr, 660, 40); cairo_move_to (cr, 400, 70); cairo_line_to (cr, 510, 70); cairo_move_to (cr, 520, 70); cairo_line_to (cr, 630, 70); cairo_move_to (cr, 400, 100); cairo_line_to (cr, 630, 100); cairo_move_to (cr, 400, 130); cairo_line_to (cr, 470, 130); cairo_move_to (cr, 480, 130); cairo_line_to (cr, 550, 130); cairo_move_to (cr, 560, 130); cairo_line_to (cr, 630, 130); cairo_move_to (cr, 400, 160); cairo_line_to (cr, 470, 160); cairo_move_to (cr, 490, 160); cairo_line_to (cr, 540, 160); cairo_move_to (cr, 560, 160); cairo_line_to (cr, 630, 160); cairo_move_to (cr, 370, 190); cairo_line_to (cr, 470, 190); cairo_move_to (cr, 500, 190); cairo_line_to (cr, 530, 190); cairo_move_to (cr, 560, 190); cairo_line_to (cr, 660, 190); cairo_move_to (cr, 370, 220); cairo_line_to (cr, 470, 220); cairo_move_to (cr, 510, 220); cairo_line_to (cr, 520, 220); cairo_move_to (cr, 560, 220); cairo_line_to (cr, 660, 220); /* END POINTY LETTERS */ /* We stroke the path so we see everything we just specified by connecting the dots */ cairo_stroke(cr); /* Let us add a disclaimer and show some fancy cairo: */ /* We are going to want a nice fine lined circle around the R you need to make sure you have stroked existing things that you wanted drawn with the larger pen before continuing. */ cairo_set_line_width (cr, pen_radius*.5); /* Now we will draw the fancy circle around the "R" */ /* NOTE: The angles are in radians */ cairo_move_to (cr, 710, 200); double angle1 = 0 * (M_PI/180.0); double angle2 = 360 * (M_PI/180.0); /* We draw a large black circle */ cairo_set_source_rgba (cr, 0, 0, 0, 1); cairo_arc (cr, 710, 200, 20, angle1, angle2); cairo_stroke (cr); /* We draw a smaller white circle centered on it */ cairo_set_source_rgba (cr, 1, 1, 1, 1); cairo_arc (cr, 710, 200, 20, angle1, angle2); /* We use the fill operator to fill in the circle! */ cairo_fill (cr); /* We are going to draw the letter "R" with black pen*/ cairo_move_to (cr, 695,212); /* Bottom left of text at point */ cairo_set_source_rgba (cr, 0, 0, 0, 1); cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); cairo_set_font_size (cr, 40); cairo_show_text (cr, "R"); /* We stroke everything we have just done to actually draw it... */ cairo_stroke (cr); } /* Apply our path to the surface specified */ static void draw (cairo_surface_t *surface) { cairo_t *cr; cr = cairo_create (surface); /* Try applying the scale and rotate factors here to examine their effects on the output!*/ /* cairo_rotate (cr, -M_PI / 4); */ /* cairo_scale (cr, 2, 1.0); */ travel_path (cr); cairo_destroy (cr); } /* Function needed to draw to gtk window */ static void draw_gtk (GtkWidget *widget, GdkEventExpose *eev, gpointer data) { cairo_t *cr; cr = gdk_cairo_create (widget->window); travel_path (cr); cairo_destroy (cr); } /* We will draw our path on multiple surfaces to demonstrate some of the various cairo backend */ int main (gint argc, gchar **argv) { cairo_surface_t *surface; /* PDF Backend */ surface = cairo_pdf_surface_create ("IBM.pdf", WIDTH, HEIGHT); draw (surface); cairo_surface_destroy (surface); /* Postscript Backend */ surface = cairo_ps_surface_create ("IBM.ps", WIDTH, HEIGHT); draw (surface); cairo_surface_destroy (surface); /* Image backend */ surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); draw (surface); cairo_surface_write_to_png (surface, "IBM.png"); cairo_surface_destroy (surface); /* Scalable Vector Graphics Backend */ surface = cairo_svg_surface_create ("IBM.svg", WIDTH, HEIGHT); draw (surface); cairo_surface_destroy (surface); /* GTK Window using Cairo */ gtk_init (NULL, NULL); /* Fire up GTK! */ GtkWidget *mainwin; /* Make a new windows */ GtkWidget *canvas = NULL; /* Make a new canvas */ mainwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); canvas = gtk_drawing_area_new (); gtk_widget_set_size_request (canvas, WIDTH, HEIGHT); gtk_container_add (GTK_CONTAINER (mainwin), canvas); /* Place the canvas in the window */ g_signal_connect (mainwin, "destroy", G_CALLBACK (gtk_main_quit), NULL); /* Quit graphically */ /* Instead of drawing like usual, we connect the expose event to do the drawing! */ g_signal_connect (G_OBJECT (canvas), "expose-event", G_CALLBACK (draw_gtk), NULL); gtk_widget_show_all (mainwin); /* Show the window on the screen */ gtk_main (); return 0; }
编译指令:
gcc -o e e.c -I/usr/include/gtk-2.0/ -I/usr/include/glib-2.0/ -I/usr/lib/x86_64-linux-gnu/glib-2.0/include/ -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include/ -I/usr/include/gdk-pixbuf-2.0/ -I/usr/include/atk-1.0 -lgtk-x11-2.0 -lgdk-x11-2.0 -lgobject-2.0 -lrt -lglib-2.0 -pthread -lcairo
这段代码我没编译成功,然后我就把其中的cairo部分直接cut至xboot的analogclock里面,然后就可以看到和你一样的效果了
3 ------------------- 最大的坑------------------------
当把spi闪存1-4脚连接后,连usb是可以进入FEL模式。
但是把1-4脚断开后,也还是在EFL模式。
不管是重新上电,还是重新连usb,都回不到正常的状态了。
估计闪存的程序丢了。
所以1-4脚不可靠。因为cS片选一直激活,闪存芯片很容易有误操作。
这里完全说错了
100s上电后就会从spi flash里面读数据,此时100s输出cs信号。短接cs后,spi flash 就不会再响应。此时f1c100s就认为spi flash 不存在,再加上从sd也读不到信息,此时100s就自动进入了fel模式,等待烧录固件进来。
而断开1,4脚后,100s输出正常,spi flash反应正常,那么此时就可以正常启动或再次进入fel模式,不可能出现楼主说的什么cs一直激活这种事,绝对不可能!
之所以出现楼主说的这种事情,很可能此时插sd卡了,或者板子本身焊接不良,或者 短接不可靠
2048目录据此修改:
XBOOT(8192542) 18:19:24
jjj@jjj-desktop:~/xboot/xboot$ git diff src/romdisk/application/examples/main.lua
diff --git a/src/romdisk/application/examples/main.lua b/src/romdisk/application/examples/main.lua
index bdcf5af..9148461 100644
--- a/src/romdisk/application/examples/main.lua
+++ b/src/romdisk/application/examples/main.lua
@@ -19,7 +19,7 @@ local prevbtn = Widget.Button.new({x = 50, y = sh - 100, width = 100, height = 5
stage:addChild(prevbtn)
local nextbtn = Widget.Button.new({x = sw - 150, y = sh - 100, width = 100, height = 50})
- :addEventListener("Click", function(d, e) testcases:next() end)
+ :addEventListener("Click", function(d, e) stage:animate({scalex = 0.5, scaley = 0.5, rotation = stage:getRotation() + 360}, 5, "outBounce") end)
stage:addChild(nextbtn)
stage:addEventListener(Event.KEY_DOWN, function(d, e)
@@ -34,5 +34,8 @@ stage:addEventListener(Event.KEY_DOWN, function(d, e)
e.stop = true
end)
+stage:setPosition(320,240)
+stage:setAnchor(0.5, 0.5)
+stage:animate({rotation = stage:getRotation() + 360}, 5, "outBounce")
stage:showfps(true)
实现旋转效果
晕哥 说:在ROM里面都是这种方式存放的:
spl + u-boot
spl + xboot上电之后, BROM(固化在全志芯片内部) 依次检测 eMMC(SD), spi nand, spi nor 是否存在合法的spl,
如果发现有合法的spl 则把spl 搬到芯片内部 SRAM 里面运行(SRAM无需任何初始化), 并把PC指针指向SRAM,
这样你的spl接管了V3s芯片,接着你当然可以为所欲为了。spl 初始化系统资源,包括调试串口, DDR什么的,初始化DDR之后你就有了更广大的空间,
可以把u-boot(非spl部分)或者xboot(非spl部分)搬到DDR指定地址, 再次把PC指针指过去,
这样u-boot或者xboot正式接管了V3s.这下明白了,非常感谢!spl xboot应该已经有了,缺的是spl加载后实现对SD卡的读取。话说v3s的boot程序已经可以读SD卡了为什么不能直接在spl执行完后加载SD卡指定位置指定长度的代码到DDR呢。
大佬一时对sd卡启动提不起兴趣,所以没动力去做而已
请问各位大佬谁有F1D100的资料?
淘宝有一款高清的唱戏机
https://item.taobao.com/item.htm?spm=a230r.1.14.32.13857d2aR43Vex&id=555694980244&ns=1&abbucket=18#detail
使用的是这一款芯片,不知其性能如何?
kgp0213 说:1,刚翻了一下1306的资料,看起来是支持400k的速度的,楼主先用示波器抓一下现有的iic波形,看系统输出有没有异常(sclk周期,波形),若波形不好添加上拉电阻试试。
2,通常芯片的linux驱动里面默认应该都是400k,具体能不能通过dts来改,还是建议源码里面具体的驱动实现(这里面经常有坑的)
3,另外楼主用的芯片是什么型号?最好翻一下其寄存器看能否支持速度调整我用的芯片是V3S,上拉电阻我使用的是10K。
我也觉得这个芯片应该是支持400Khz的速度,因为我找了些STM32硬件I2c的程序,他们设置的就是400Khz速率,可以正常通信。
但是我相同的接口去连接mpu6050可以直接读写,说明芯片I2c是正常工作的,这就让我摸不着头脑了。
1,不同的芯片对信号的兼容性不同,原来我点过一款屏幕,同样的程序,使用nxp来点总是显示异常,换用st的就一切正常。从那以后就再没用过nxp的东西,信号不好~
2,你把上拉电阻换成4.7k试试,还不行的话就换成2k试试。最好用示波器看一下,很容易确认问题。
1,尝试在eclipse中移植lv的时候,莫名原因被坑的一愣一愣的,各种库不能用,又是修改makefile又是修改eclipse,无论如何都报100+的错误,改了几天之后 心情郁闷、烦躁、无助、伤心 、沮丧、 忧伤,开始 心灰意冷,自暴自弃,暗自流泪,不思进取,自生自灭~
a:把lvgl放在/xboot/src/external/lvgl-v5.1目录下,lv_conf.h(要额外添加几个宏定义)也放到这个目录下。再放一个stdbool.h在这哥目录下
2,突然有一天,想还是把lv删了吧,不玩了,结果删除lv部分之后,xboot编译依然各种报错,心里大喜啊,看来eclipse真的被我搞坏啦~
b:修改xbot/src目录下的makefile文件添加上述lvgl目录的路径(帖子下方有修改好的makefile下载)
3,开心的重解压eclipse,添加xboot,编译正常,加入lv,再次报错,错误和之前差不多~再次的沮丧、 忧伤,开始 心灰意冷,自暴自弃~
c:参照lvg pc_simulator目录下的main.c在 xboot下的cmd-test添加相应的函数(这里https://github.com/littlevgl/lvgl的reamde有个大坑,坑了我一天)
4,转机终于在清明放假来了,记得那天睡觉没关窗帘,窗外阳光明媚晒醒了我,习惯性打开挖坑网,随意浏览的时候发现了晕哥的视频,一直以为晕哥是一个200+KG的宅男,没想到晕哥居然是玉树临风,风流倜傥,英俊潇洒,高大威猛 ,面如冠玉 目如朗星的大帅哥 ,更重要的是晕哥的性感的声音在清晨听来就像黄鹂鸟鸣那样清脆入耳使人欲罢不能~ ,想到这里心里都有点小激动呢!
d:用附件中文件放到相应的位置,在src目录下make一下试试,如果有问题,参加上面3条。开启模拟器, 终端输入 test,人家偶一天~
5,在晕哥声音的诱惑下,无意中看到晕哥的一句警示名言“eclipse对啥的支持不好,还是换用传统的makebalabala”,顿时就像黑夜中的明星“@流光”给我指引了方向~
e:回复“最爱晕哥”获取下载链接~
f:补充,源码包:https://gitee.com/hufz/xboot/tree/master
g:以上内容基于ubuntu16+xboot已经能正常的情形,关于xboot的编译请参考:xboot-system-development-guide-zh-CN.md
------------------------------------------------------------------
以下是 @晕哥 补充
1. 下载 eclipse-mars-for-arm-windows-x86_64.7z , 解压缩, 把 arm-linux-gnueabihf-gcc.exe, cpio.exe 所在的目录加到系统的 PATH
2. eclipse.exe 打开 xboot 工程, 编译, 或者也可以打开命令行用 make 编译.
XBOOT中GPIO操作
XBOOT在gpio.h中提供有c api和lua api ,后面可以写个gpio的通用lua app,这样,以后想测什么功能,直接打开app。
在gpio.h中可以找到:
void gpio_set_cfg(int gpio, int cfg);
另外在l-gpio.c中可以找到:
static const luaL_Reg m_gpio[] = {
{"setCfg", m_gpio_set_cfg},
{"getCfg", m_gpio_get_cfg},
{"setPull", m_gpio_set_pull},
{"getPull", m_gpio_get_pull},
{"setDrv", m_gpio_set_drv},
{"getDrv", m_gpio_get_drv},
{"setRate", m_gpio_set_rate},
{"getRate", m_gpio_get_rate},
{"setDir", m_gpio_set_dir},
{"getDir", m_gpio_get_dir},
{"setValue", m_gpio_set_value},
{"getValue", m_gpio_get_value},
{NULL, NULL}
};
在c中可以这样写:
gpio_set_cfg(F1C100S_GPIOA0,0x01); //初始化端口功能
gpio_set_pull(F1C100S_GPIOA0,GPIO_PULL_NONE);
gpio_set_drv(F1C100S_GPIOA0,GPIO_DRV_WEAKER);
gpio_set_direction(F1C100S_GPIOA0,GPIO_DIRECTION_OUTPUT);
gpio_set_rate(F1C100S_GPIOA0,GPIO_RATE_FAST);
{
gpio_set_value(F1C100S_GPIOA0,1); //PA0=1
gpio_set_value(F1C100S_GPIOA0,0); //PA0=0
}
另外也可以借用下面的LED 操作函数来变通处理 (不一定是led,可以用来测试,还有buzzer/vibrator)
driver/led/led-gpio.c
driver/led/ledtrig-breathing.c
driver/led/ledtrig-heartbeat.c
首先在设备树可以看到
"led-gpio@0": {
"gpio": 0,
"gpio-config": 1,
"active-low": false,
"default-brightness": 0
},
"led-gpio@0": {
"gpio": 1,
"gpio-config": 1,
"active-low": false,
"default-brightness": 0
},
"ledtrig-heartbeat@0": {
"led-name": "led-gpio.1",
"period-ms": 1260
},
上面的“led-gpio”是驱动名,"led-gpio.1"是设备名,删除"led-gpio.1"部分的配置,然后shell进入"sys": /sys/device/led/led-gpio.0/brightness
write 1 /sys/device/led/led-gpio.0/brightness
write 0 /sys/device/led/led-gpio.0/brightness
把led看成一个gpio就可以了,向文件里面写数据。因为,xboot的shell没有开发 echo aaa > xxx ,这个重定向功能,所以需要一个专用命令写文件。
当然也可以下面那样看当前led的亮度
cat /sys/device/led/led-gpio.0/brightness
上面的设备树定义:
"led-gpio@0": { //@后面的数字代表起始索引,如果是0,就是自动分配
//如果非零,就从这个值开始,尝试,直到这个设备名字没有占有
//能注册到系统里面的去的所有资源,名字保证是唯一的
"gpio": 0, //这里的“0”对应GPIO的端口号,可以去xxx-gpio.h里面去查看
"gpio-config": 1, //gpio的端口配置,1:gpio设定为输出。
"active-low": false,
"default-brightness": 0 //初始亮度(如果亮度可调的话)亮度的范围是0 - 1000,1000 最亮
},
"led-gpio@0": { //
"gpio": 1,
"gpio-config": 1,
"active-low": false,
"default-brightness": 0
},
可以自己用c写一个命令,xboot里面有个system函数,通过system可以调用各种命令行,可以加分号,运行多个命令(例如:system("echo aadfg; delay 3000; echo aaaas;"); )。
system("write 0 /sys/device/led/led-gpio.0/brightness"); //PA0=0
2.XBOOT的测试命令
\kernel\command目录下有个cmd_test.c,其中:
static int do_test(int argc, char ** argv)
{
return 0;
}
这个文件,就是专门留出来,试验各种代码的,任何想测试的api,代码,什么的,都往这个文件丢吧,然后,命令行下,敲test 就可以测试的想法了。
查看某个命令的帮助则可以敲 help cmdxxx
3.pwm播放铃声与马达
pwm口,接上个喇叭,一条命令就可以播各种nokia铃声(rtttl格式)
写个设备树
“buzzer-pwm@0":{
"pwm-name":"pwm-xx.x",
"pwm-polarity“:true
},
对应好pwm-name,然后那个pwm口接喇叭,然后
write "aadams:d=4,o=5,b=160:8c,f,8a,f,8c,b4,2g,8f,e,8g,e,8e4,a4,2f,8c,f,8a,f,8c,b4,2g,8f,e,8c,d,8e,1f,8c,8d,8e,8f,1p,8d,8e,8f#,8g,1p,8d,8e,8f#,8g,p,8d,8e,8f#,8g,p,8c,8d,8e,8f
" play
aadams 是歌曲名字,可以随便 。 (play 的路径在 /sys/device/buzzer/buzzer-pwm.0/play)
添加vibrator设备,其实就是振动马达,然后向节点里写:
write "SOS" play
write "i'm hummer" play
write "helo 12313" play
就将字符编码成马达振动了~
4.确认设备树参数
尝试源码目录下
jjj@jjj-desktop:~/xboot/xboot/src$ grep "ledtrig-breathing" . -rn ./driver/led/ledtrig-breathing.c:2: * driver/led/ledtrig-breathing.c ./driver/led/ledtrig-breathing.c:146: .name = "ledtrig-breathing", ./arch/arm32/mach-h3/romdisk/boot/nanopi-m1.json:458: "ledtrig-breathing@0": {
"ledtrig-breathing@0": { "led-name": "led-pwm.0", "interval-ms": 20, "period-ms": 3000 },
或者直接搜索,一般都能在某些平台,找到参考配置,如果实在没有,就看驱动文件。找驱动里面的字符串,基本就可以判断出来,这个设备树可以填充哪些参数了,例如:
static struct device_t * ledtrig_breathing_probe(struct driver_t * drv, struct dtnode_t * n)
{
struct ledtrig_breathing_pdata_t * pdat;
struct ledtrig_t * ledtrig;
struct device_t * dev;
struct led_t * led;
led = search_led(dt_read_string(n, "led-name", NULL)); //此处的"led-name"为设备树参数
if(!led)
return NULL;
pdat = malloc(sizeof(struct ledtrig_breathing_pdata_t));
if(!pdat)
return NULL;
ledtrig = malloc(sizeof(struct ledtrig_t));
if(!ledtrig)
{
free(pdat);
return NULL;
}
timer_init(&pdat->timer, ledtrig_breathing_timer_function, ledtrig);
pdat->led = led;
pdat->interval = dt_read_int(n, "interval-ms", 20); //此处的"interval-ms"为设备树参数
pdat->period = dt_read_int(n, "period-ms", 3000);
pdat->phase = 0;
ledtrig->name = alloc_device_name(dt_read_name(n), dt_read_id(n));
ledtrig->activity = ledtrig_breathing_activity;
ledtrig->priv = pdat;
timer_start_now(&pdat->timer, ms_to_ktime(pdat->interval));
5.XBOOT支持CTP(电容触摸屏)么?
支持,已经有gsl1680,ft5406驱动,其他型号找厂商要linux驱动过来,自己修改一下即可。读i2c这种问题,对xboot而言轻车熟路,在sys目录下里的i2c总线设备目录个,有个设备节点,不要写任何一句代码,就可以探测挂在总线上的设备,类似于i2c_detect这个命令,输出也是很人性化的。
6.关于system函数
system接口,包装太多层次,这个一般是给debug用的,gpio操作最好还不不要经过sysfs接口,直接操作gpio api。system的速度要看是加载什么样的程序,内置程序很快,如果是lua程序,这个稍微慢了点,因为要启动lua虚拟机。具体的说要看system("xxxx"),这个xxxx是什么内容,首先从命令里面找,找不到就到文件系统里找。
MiniGUI 重装上阵!
原创 2018-03-07 魏永明 智能系统百家谈
北京飞漫软件技术有限公司即将正式发布 MiniGUI V3.2.0 版本。
“飞漫软件还活着呢?”很多人看到上面这个消息的第一反应大概如此。飞漫软件当然还活着,毕竟关闭运行了十几年的公司比维持这个公司要麻烦多了。再说,还有很多公司在使用 MiniGUI,没有飞漫软件这样一个公司实体,怎么收费,怎么开发票?!
虽然整个嵌入式行业,甚至 IT 产业发生了巨大的变化,但技术并没有发生太大的变化。尽管这几年一会儿移动互联网,一会儿 O2O,一会儿人工智能,一会儿区块链,你方唱罢我登场,热闹非凡,但 Linux 内核、SSH、GNU 项目等,作为计算机系统的基石仍然在发挥着不可取代的作用。开发者访问服务器,使用的还是 SSH,要做 3D 图形或者游戏,使用的还是 OpenGL(或者 OpenGL ES),而 OpenGL 的发展历程已经超过了三十年!
MiniGUI 本质上也是一种基础软件,是不是持续迭代和演进,取决于市场,取决于开发者。
2018 年元月,飞漫软件和全志科技达成了一项合作,由全志科技支付 MiniGUI 的使用许可费用,而使用全志科技任何一款主控芯片的客户,均可免费使用 MiniGUI,无需向 MiniGUI 的知识产权权利人(即北京飞漫软件技术有限公司)支付商业许可费用。这是一种创新的自由软件许可模式。通过这种模式,飞漫软件可以获得持续发展 MiniGUI 的资金,而 MiniGUI 的用户,则可以以近乎免费的模式获得合法的商业许可。
飞漫软件将继续复制和全志科技的合作模式,首先推广到国内的主控芯片厂商,然后再拓展到海外。
目前,国内还有其他主控芯片厂商的客户在使用 MiniGUI,有的主控芯片厂商还将 MiniGUI 作为其 BSP 的一部分分发给了客户,但并没有取得合法授权。在此,笔者希望这些厂商学习全志科技,参照上述模式,尽快和飞漫软件达成合作,以取得 MiniGUI 的合法商业授权,进而支持 MiniGUI 开源社区的发展。而其他更多偷偷使用 MiniGUI 的厂商,或者没有按照已有的商业许可协议缴纳费用的,或者商用许可已经到期的,也请自重,该主动获取商业许可的,请主动联系飞漫软件,而不是采取打擦边球的手法,漠视权利人的权利要求,进而践踏新时代社会主义的法制精神。
2018 年,飞漫软件将从上市公司和外企入手,打击 MiniGUI 盗版行为以及非法的授权使用行为。也欢迎任何有线索的开发者通过本公众号后台举报未授权使用 MiniGUI 的行为;一旦有所得,必有回馈!
1998 年年底,笔者开始在清华大学开发 MiniGUI,1999 年 5 月在水木清华 BBS 上发布了 MiniGUI 的第一个版本。再过一年,MiniGUI 就二十岁了!随着飞漫软件和全志科技达成合作,MiniGUI 获得了重生的机会,从而可以再度起航。
全志科技之所以和飞漫软件达成这项合作,当然有其市场驱动力。随着物联网和嵌入式设备相关技术的发展,越来越多的嵌入式设备和智能物联网设备配备了屏幕和触摸屏,而因为如下两个原因,这些设备无法采纳类似 Android 这样的智能手机操作系统:
成本因素。由于 Android 系统的复杂性越来越高,对处理器主频,尤其是运行内存、Flash 存储容量的要求也越来越高,而大部分嵌入式设备和智能物联网设备的功能单一,不需要使用一个完整的 Android 环境来支撑其应用的运行。而如果使用 Linux 或者 RTOS 开发这类设备,则可以大大降低运行内存和 Flash 的容量需求,最终降低设备的制造成本。
系统复杂性。Android 系统发展到现在的 8.0 版本,系统复杂性也随之提高。要将最新的 Android 系统裁剪到适应一般的嵌入式系统或者智能物联网设备,工作量巨大,往往得不偿失。现在从主控芯片厂商开始,主控芯片的 BSP 已经从 Android 优先转移到 Linux 优先。
而对以上问题,MiniGUI 却具有先天的优势,MiniGUI 架构上的可伸缩性设计,使之可以支持计算能力很弱的硬件平台,比如运行主频只有 100MHz,运行内存只有 8MB 的功能手机,也可以支持充分发挥高端计算平台的能力,比如使用 GPU 来渲染图形界面,实现动画效果以及界面特效等。
当然,MiniGUI 也有劣势。主要的劣势在于入门门槛较高。飞漫软件在 2010 年左右发布的 miniStudio 工具部分解决了这个问题,但这个工具并没有得到有力的推广和广泛的应用,缺乏长期的维护和演进。
为了建设良性的开源社区发展氛围,抓住智能物联网设备兴起的风口,飞漫软件已经启动了新一轮的 MiniGUI 开发计划,并将于近期发布 MiniGUI 3.2.0 版本。
MiniGUI 3.2.0 基于早期的 MiniGUI 3.0.13 版本开发,主要增强有:
全面支持 64 位架构。
消除了大量编译缺陷,使之兼容最新的 GCC 版本。
将 mGUtils、mGEff、mGPlus、mGNCS 等整合到了一起,并提升了 mGNCS 的地位,使之作为 MiniGUI 应用开发的首选框架。
作为 mGNCS 扩展控件库的实例,飞漫软件还发布了 mGNCS4Touch 组件以及 cell-phone-ux-demo 演示系统,用以展示 MiniGUI 3.2 及其组件的使用以及可以达到的界面效果。
同时,飞漫软件还将以共享软件(任何人可免费下载、安装和使用)的形式发布 miniStudio 1.2.1 版本。为了降低开发者的入门门槛,飞漫软件还准备了可直接安装到 Ubuntu Linux 16.04 LTS 系统上的软件包,使用几个简单的命令,即可在 Ubuntu Linux 上轻松搭建 MiniGUI 开发环境。
在正式发布之前,着急的开发者可以访问本人的 GitHub 账号(原文链接):
来获取 MiniGUI、mGUtils 等组件,以及示例程序的完整源代码。
值得一提的是,当年 mGNCS 和 miniStudio 的架构师和主要开发者董大神,近期还发布了一个项目:MiniGUIScripted,提供了 MiniGUI/mGNCS 的 JavaScript、Python 以及 Lua 脚本语言的绑定支持。有了这个项目,在不久的将来,我们甚至可以使用 JavaScript 等脚本语言来开发 MiniGUI 应用。该项目的 GitHub 仓库如下:
https://github.com/VincentWei/minigui-scripted
飞漫软件围绕 MiniGUI 的开发,近期将围绕如下几个方面进行:
完善使用和开发文档。包括用户手册、编程指南以及 API 参考手册。飞漫软件正在 http://wiki.minigui.com/twiki/bin/view/Products/WebHome TWiki 站点上整理这些文档。
为 OpenGL ES 1.1/2.0 开发 EGL 支持,用以实现 3D 图形渲染以及类似智能手机的界面特效。
尝试开发一款基于 Linux 和 MiniGUI 的 miniLinux,以方便基于 Linux 和 MiniGUI 的嵌入式设备或者智能物联网设备开发。目前,您可以使用 miniLinux 提供的脚本在 Ubuntu 上编译 MiniGUI 3.2 以及 UXDemo 示例程序。
持续演进 miniStudio 工具。
敬请期待!
v3s资料的303页有寄存器说明
7.2.5.7. TCON0_CTL_REG (Default Value: 0x00000000)
Offset: 0x040
Register Name: TCON0_CTL_REG
R/W Default/Hex Description
31 R/W 0 TCON0_En
0: disable
1: enable
Note: It executes at the beginning of the first blank line of TCON0 timing.
30:29 / / /
28 R/W 0 TCON0_Work_Mode
0: normal
1: dynamic freq
27:26 / / /
25:24 R/W 0 TCON0_IF
00: HV(Sync+DE)
01: 8080 I/F
1x:reserved
23 R/W 0 TCON0_RB_Swap
0: default
1: swap RED and BLUE data at FIFO1
22 / / 21 R/W 0 20 / 19:9 / 8:4
柳暗花明又一村,终于找到解决方案了: https://github.com/skeeto/opengl-demo
如果您的GPU不支持OpenGL 3.3并且您使用Mesa 10.0+,则可以使用环境变量强制渲染软件 LIBGL_ALWAYS_SOFTWARE=1。
把环境变量强制加上,终于搞定这个棘手的问题:
yunge@ubuntu:/tmp/nuklear/example/bin$ LIBGL_ALWAYS_SOFTWARE=1 ./extended
piemenu selected: 4
pushed!
piemenu selected: 4
piemenu selected: 4
piemenu selected: 4有图有真相:
https://whycan.cn/files/members/3/QQ20180218185909.png
补充一下顺序,
安装(ubuntu 16环境):
sudo apt install libglew-dev
sudo apt install libglfw3-dev
(很遗憾,这两部没有碰到任何问题,开心脸.jpeg)
下载https://github.com/vurtun/nuklear.git
进入~/nuklear/example 目录
make
进入 ~/nuklear/example/bin$
~/nuklear/example/bin$ ./extended
demo画面应该就出来了
补一个: 先科唱戏机(看戏机)F1C100s方案运行XBOOT大神的XBOOT系统步骤
https://whycan.cn/t_439.html
页次: 1