WhyCan Forum(哇酷开发者社区)

我们能随心所欲"有问题百度(谷歌)一下", 这得感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn

您尚未登录。

#1 Re: 全志 V3S/F1C100s/X3 » @augyy A33 驱动 ov5640 问题 » 2019-12-06 16:03:27

我记得 V3s 的 camdroid ov5647 驱动, camdroid 和 linux 是一套驱动, 都可以用的。

#4 Re: 全志 V3S/F1C100s/X3 » 荔枝派zero tf卡启动 » 2019-12-06 15:27:43

dml1048147924 说:

晕哥,用您上面的固件,然后报错了


linux 启动界面.pdflinux 启动界面.pdf

Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
SCRIPT FAILED: continuing...
starting USB...

怀疑你的卡有问题, 换张卡。

#5 Re: 全志 V3S/F1C100s/X3 » A64 lvds配置 求助! » 2019-12-06 15:24:49

4.19 是主线 Linux 吧, 不是全志官方的 bsp ?

#7 Re: 全志 V3S/F1C100s/X3 » uboot 编译报错 » 2019-12-04 17:11:25

dml1048147924 说:

谢谢晕哥,

论坛里有没有关于uboot启动过程的分析,求推荐

好像有, 你搜一下。

你现在是要先编译烧录运行成功, 不是分析过程。

#8 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 公司的一款用MFC设计行业辅助设计软件(类似CAD)在画面元素太多的时候问题爆发了 » 2019-12-04 17:10:38

感觉楼主的问题和这个有点类似: https://bbs.csdn.net/topics/50226141

我在OnDraw()中,有大量的图形计算,所以每次当移动窗口,
或者被窗口覆盖的时候就要重新进行这部分的图形计算,
我觉得很是浪费,有什么办法解决啊???

我在VIEW中画的图很大很大,超过了客户区,因此使用了
CScrollView,所以每次我拖动滚动条时都会重新画一遍整个
计算复杂的图,速度暴慢,请DX出出点子啊~~~~~~~~

一个回答:

不要直接写在OnDraw()里,
至少也要加个条件判断一下是否需要重画

这个回答比较靠谱:

用多线程,启动一个线程单独用于计算,
在OnDraw里面向这个线程PostThreadMessage,
传进一些基本的参数,然后在线程里面计算,计算完,
再把需要的结果用PostMessage传递回来,
在消息处理函数中完成绘图。

比如说,如果你是在客户区显示位图,并要对位图进行一些计算操作,
那么就把位图的数据指针传到计算线程里,计算之后,
再把位图数据指针传递回来,然后简单的调用
Bitblt之类的函数就可以画图了,效率应该会有提高的。

#9 Re: 全志 V3S/F1C100s/X3 » 荔枝派Nano使用gcc-linaro-7.2.1进行交叉编译得到的可执行文件,一运行就"segmentation fault" » 2019-12-04 16:25:34

大帅 说:

error: unrecognized command line option ‘--with-arch=armv5te’; did you mean ‘-march=armv5te’?

root@osboxes:/work/Lichee/helloword/emWin/Sample/GUIDemo# make
/work/Lichee/helloword/gcc-linaro-7.4.1-2019.02-x86_64_arm-linux-gnueabi/bin/arm-linux-gnueabi-gcc --with-arch=armv5te -MD -O2 -D__Gui_NumBytes__=512000 -I. -I../../Config -I../../Include -Itslib -c Application/GUIDEMO_Automotive.c -o Application/GUIDEMO_Automotive.o
arm-linux-gnueabi-gcc: error: unrecognized command line option ‘--with-arch=armv5te’; did you mean ‘-march=armv5te’?
Makefile:34: recipe for target 'Application/GUIDEMO_Automotive.o' failed
make: *** [Application/GUIDEMO_Automotive.o] Error 1

‘--with-arch=armv5te’   ====>    ‘-march=armv5te’

#13 Re: 全志 V3S/F1C100s/X3 » F1C100s tf卡中uboot不能启动 求助 » 2019-11-30 08:15:45

后面这个问题是因为 u-boot 对这些卡兼容性不好引起:

spl: mmc init failed with error: -110

u-boot 初始化TF卡的地方需要修改一下, 你跟踪一下代码可以解决这个问题。

因为这卡 BROM(芯片固化引导) 可以读, 没理由在spl(boot0)初始化 TF 卡就挂了嘛, 对吧。

#18 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-11-09 11:50:37

发现连续两次用sendevent 发送x,y绝对坐标, 这样触发才比较精确,否则有可能变成了长按。

./sendevent /dev/input/event1 1 330 1
./sendevent /dev/input/event1 3 0 2558
./sendevent /dev/input/event1 3 1 357
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 3 0 2558
./sendevent /dev/input/event1 3 1 365
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 1 330 0
./sendevent /dev/input/event1 0 0 0 



./sendevent /dev/input/event1 1 330 1
./sendevent /dev/input/event1 3 0 1246
./sendevent /dev/input/event1 3 1 376
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 3 0 1246
./sendevent /dev/input/event1 3 1 376
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 1 330 0
./sendevent /dev/input/event1 0 0 0 

#19 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-11-09 11:48:20

真的是很烦 说:

为了做类似 teamview 之类的东东?

对的, 就是这样,配合FRP内网穿透, 可以在家VNC操作地球上任何一台机器。

#21 Re: 全志 V3S/F1C100s/X3 » 有用过rtl8723bs蓝牙,从手机向开发板上发数据的吗,已经做到l2ping这一步了 » 2019-10-26 08:32:21

bluez 适合量产产品吗? arm debian 就是用 bluez 吧,可是电脑上的 bluez 太难用了。

#22 Re: 全志 V3S/F1C100s/X3 » 试一试把 V3s 当做 无线 wifi 热点 » 2019-10-26 08:30:29

咦, 这个可以有, 再把有线也怼上去, 可以做成无线热点。

#23 Re: 全志 V3S/F1C100s/X3 » f1c100s 一直重启 » 2019-10-26 08:27:47

解决 V3s Linux 显示 starting kernel ... 就没有然后的问题 (earlyprintk): https://whycan.cn/t_2402.html

#24 Re: 全志 V3S/F1C100s/X3 » f1c100s 一直重启 » 2019-10-26 08:25:55

一般是zImage自解压出问题了, 我记得坛里面有一个关于 earlyprintk 的帖子, 可以打印出错误信息, 我找找 ...

#25 Re: 全志 V3S/F1C100s/X3 » 成功移植go编译器到f1c100s » 2019-09-28 14:38:35

请问楼主, 有没有 在目标文件系统生成 gcc on arm 的方法,

我看到 buildroot 里面有 BR2_PACKAGE_GCC_TARGET,

但这个选项早已过期了。

我也想像你玩 go 一样, 在板子上执行 gcc

#27 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 据路边社报导,网络搞笑短剧《陈翔六点半》融资数千万,大家加油,还有大把翻身机会 » 2019-09-26 17:00:34

https://news.newseed.cn/p/1356256

比如《陈翔六点半之铁头无敌》已由短视频走向电影。该片上线8小时会员有效观影人次破96万,票房分账收益336万,56小时票房分账破1000万,打破网大票房分账记录。这透露出,短视频IP与网大的互带存在巨大市场潜力。

#30 Re: ESP32/ESP8266 » 如何基于eclipse搭建ADF下的DuerOS这个例程的开发环境? » 2019-09-24 11:18:39

可能你的电脑有多个 pacman, 而你执行的不是应该执行的那个。

下载一个 everything
https://www.voidtools.com/zh-cn/downloads/
https://www.voidtools.com/Everything-1.4.1.935.x64.zip

查一下电脑是不是真有几个 pacman.exe, 执行对应的那个。

#31 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 吐槽一下, csdn bbs/blog都被广告占领, code 被关闭, 下载动不动就是钱钱钱, 虽然不能用爱发电,但是也不能广告乱飞吧 » 2019-09-24 11:01:12

还能这么玩
回复: 1

那时候还没有积分制度, 我上传了文件,今天打开看了一下,居然也要积分。

账号因为csdn自己的问题, 造成用户泄露, 当年的号无法登陆。

虽然不能用爱发电,但是也不能广告乱飞吧.








https://bbs.csdn.net/topics/392453448

哈喽,社区的各位小伙伴:

感谢各位小伙伴在过去5年里对我们CSDN社区CODE平台的支持以及建议

为了方便各位小伙伴,迁移出相关的代码:

我们将延期至2018年10月31日彻底关闭CODE服务, 迁移过渡时间从今天就可以开始啦。

代码迁移请从git接口,方便大家导出存放在CODE中的完整代码。

对于没有其他代码托管平台账号的用户,建议先将代码克隆到本地(支持SSH和HTTPS),便于以后管理维护。

码云平台一键迁移:https://my.oschina.net/gitosc/blog/1534891

再次感谢大家对此次社区工作的理解和配合。

CSDN
2018.9.26

#35 Re: 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:54:25

找到树莓派的开机自动修复ext4 https://raspberrypi.stackexchange.com/questions/61723/raspberry-pi-3-and-raspbian-jessie-how-to-run-fsck-at-boot

但是有一个问题, 根文件系统都挂载不上, 怎么调用命令修复了, 又是一个鸡生蛋,蛋生鸡的问题了。

#37 Re: 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:48:02

刚刚VMWware Ubuntu18.04 挂了, 开机提示硬盘出错, 吓傻我了: https://whycan.cn/t_2909.html

无意中找到一个同样问题的朋友

#38 Re: 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:46:55

2019-09-21_084607.png

重启成功进入,怎么用才能像 Windows 一样开机自动修复文件系统错误呢?

嵌入式折腾不起啊

#39 Re: 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:44:42

2019-09-21_084225.png

sudo fsck /dev/sdg2 修复了一堆错误, 用gparted看是正常了,插入S3重启试一试。

#40 Re: 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:38:30

Unable to detect file system! Possible reasons are:
- The file system is damaged
- The file system is unknown to GParted
- There is no file system available (unformatted)
- The device entry /dev/sdg2 is missing

2019-09-21_083814.png

gparted 提示的错误信息。

#41 全志 V3S/F1C100s/X3 » S3 ext4 根文件系统, 用着用着就挂了, 请问应该如何修复? » 2019-09-21 08:30:35

还能这么玩
回复: 7
[    1.562498] sun6i-rtc 1c20400.rtc: setting system clock to 1970-01-01 00:02:34 UTC (154)
[    1.570912] vcc3v0: disabling
[    1.573892] vcc5v0: disabling
[    1.576917] ALSA device list:
[    1.579885]   No soundcards found.
[    1.591285] List of all partitions:
[    1.594832] b300          122880 mmcblk0
[    1.594838]  driver: mmcblk
[    1.601736]   b301           16384 mmcblk0p1 ad68a8dc-01
[    1.601739]
[    1.608561]   b302          105472 mmcblk0p2 ad68a8dc-02
[    1.608563]
[    1.615369] No filesystem could mount root, tried:
[    1.615373]  ext3
[    1.620242]  ext2
[    1.622163]  ext4
[    1.624084]  vfat
[    1.626019]
[    1.629435] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
[    1.637863] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.13.16-licheepi-zero+ #26
[    1.645245] Hardware name: Allwinner sun8i Family
[    1.649982] [<c010e514>] (unwind_backtrace) from [<c010b1b8>] (show_stack+0x10/0x14)
[    1.657731] [<c010b1b8>] (show_stack) from [<c065bb04>] (dump_stack+0x88/0x9c)
[    1.664958] [<c065bb04>] (dump_stack) from [<c011b48c>] (panic+0xdc/0x248)
[    1.671835] [<c011b48c>] (panic) from [<c0901250>] (mount_block_root+0x220/0x268)
[    1.679313] [<c0901250>] (mount_block_root) from [<c09013b8>] (mount_root+0x120/0x128)
[    1.687224] [<c09013b8>] (mount_root) from [<c0901510>] (prepare_namespace+0x150/0x198)
[    1.695222] [<c0901510>] (prepare_namespace) from [<c0900e08>] (kernel_init_freeable+0x1c0/0x1d0)
[    1.704090] [<c0900e08>] (kernel_init_freeable) from [<c066d554>] (kernel_init+0x8/0x110)
[    1.712265] [<c066d554>] (kernel_init) from [<c0107538>] (ret_from_fork+0x14/0x3c)
[    1.719837] Rebooting in 5 seconds..

#42 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-16 10:20:53

终于搞定在局域网下用 VNC 控制 君正X1000E soc 了, 挺流畅的, 接着整合一个 frp 进去, 可以远程随时控制了, 舒服舒服。

#43 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-15 10:35:52

VNC 操作 Framebuffer, 基本OK, 但是vnc 客户端的刷新有点不正常,但是不影响使用。

如果有强制刷新的vnc客户端, 按下强制刷新显示就正常了。

#44 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-06 11:07:36

好麻烦哦,终于搞定了Ubuntu 下面 VNC 操作 littlevgl@Framebuffer, 我用的是鼠标的 ABS_X/ABS_Y/BTN_LEFT组合,想着去君正X1000下面把BTN_LEFT改为 BTN_TOUCH就可以了,结果根本不触发,最后使用 evtest才发现,还得还原成原始 ADC 值,今晚还得加班。

#47 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-05 11:49:08

再来一个, 比如evtest 采集到的按下按键是以下数据:

Input driver version is 1.0.1
Input device ID: bus 0x19 vendor 0x1 product 0x1 version 0x100
Input device name: "1c22800.lradc"
Supported events:
  Event type 0 (Sync)
  Event type 1 (Key)
    Event code 114 (VolumeDown)
    Event code 115 (VolumeUp)
    Event code 352 (Ok)
    Event code 353 (Select)
Testing ... (interrupt to exit)
Event: time 228.055444, type 1 (Key), code 352 (Ok), value 1
Event: time 228.055444, -------------- Report Sync ------------
Event: time 228.251432, type 1 (Key), code 352 (Ok), value 0
Event: time 228.251432, -------------- Report Sync ------------

那么sendevent模拟事件注入:

./sendevent /dev/input/event0 1 352 1;./sendevent /dev/input/event0 0 0 0
./sendevent /dev/input/event0 1 352 0;./sendevent /dev/input/event0 0 0 0

仍然妥妥的

#48 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-05 11:44:32

终于搞定, 原来并没有问题, 而是命令没有发全:

正确的姿势是, 先用 evtest 记录按键或者触摸屏的触发记录

比如这个是按下电阻屏某个点:

Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 330 (BTN_TOUCH)
  Event type 3 (EV_ABS)
    Event code 0 (ABS_X)
      Value      0
      Min        0
      Max     4095
      Fuzz      32
    Event code 1 (ABS_Y)
      Value      0
      Min        0
      Max     4095
      Fuzz      16
Properties:
Testing ... (interrupt to exit)
Event: time 13499.431064, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 13499.431064, type 3 (EV_ABS), code 0 (ABS_X), value 2558
Event: time 13499.431064, type 3 (EV_ABS), code 1 (ABS_Y), value 357
Event: time 13499.431064, -------------- SYN_REPORT ------------
Event: time 13499.483417, type 3 (EV_ABS), code 1 (ABS_Y), value 365
Event: time 13499.483417, -------------- SYN_REPORT ------------
Event: time 13499.524761, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 0
Event: time 13499.524761, -------------- SYN_REPORT ------------

这样模拟发送就妥妥的了:

./sendevent /dev/input/event1 1 330 1
./sendevent /dev/input/event1 3 0 2558
./sendevent /dev/input/event1 3 1 357
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 3 1 365
./sendevent /dev/input/event1 0 0 0 
./sendevent /dev/input/event1 1 330 0
./sendevent /dev/input/event1 0 0 0 

#49 Re: 全志 V3S/F1C100s/X3 » 新人求助:nano板子 根文件系统编译问题 » 2019-09-04 17:39:15

在 buildroot 的 make menuconfig 里面把 不要的配置都取消, 特别是 Qt, MPlayer, ffmpeg, python 这些巨无霸, 然后就很小了。

#51 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-04 17:27:24

pc ubuntu 用得好好的, 居然在嵌入式Linux下面不能用,悲剧.

无论 sendevent 怎么发送数据, getevent / evtest 都纹丝不动。

#52 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-04 17:06:08

sendevent.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
//#include <linux/input.h> // this does not compile
#include <errno.h>

extern char *optarg;
extern int optind, optopt, opterr;

// from <linux/input.h>

struct input_event {
	struct timeval time;
	uint16_t type;
	uint16_t code;
	int32_t value;
};

#define EVIOCGVERSION		_IOR('E', 0x01, int)			/* get driver version */
#define EVIOCGID		_IOR('E', 0x02, struct input_id)	/* get device ID */
#define EVIOCGKEYCODE		_IOR('E', 0x04, int[2])			/* get keycode */
#define EVIOCSKEYCODE		_IOW('E', 0x04, int[2])			/* set keycode */

#define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		/* get device name */
#define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		/* get physical location */
#define EVIOCGUNIQ(len)		_IOC(_IOC_READ, 'E', 0x08, len)		/* get unique identifier */

#define EVIOCGKEY(len)		_IOC(_IOC_READ, 'E', 0x18, len)		/* get global keystate */
#define EVIOCGLED(len)		_IOC(_IOC_READ, 'E', 0x19, len)		/* get all LEDs */
#define EVIOCGSND(len)		_IOC(_IOC_READ, 'E', 0x1a, len)		/* get all sounds status */
#define EVIOCGSW(len)		_IOC(_IOC_READ, 'E', 0x1b, len)		/* get all switch states */

#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + ev, len)	/* get event bits */
#define EVIOCGABS(abs)		_IOR('E', 0x40 + abs, struct input_absinfo)		/* get abs value/limits */
#define EVIOCSABS(abs)		_IOW('E', 0xc0 + abs, struct input_absinfo)		/* set abs value/limits */

#define EVIOCSFF		_IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))	/* send a force effect to a force feedback device */
#define EVIOCRMFF		_IOW('E', 0x81, int)			/* Erase a force effect */
#define EVIOCGEFFECTS		_IOR('E', 0x84, int)			/* Report number of effects playable at the same time */

#define EVIOCGRAB		_IOW('E', 0x90, int)			/* Grab/Release device */

// end <linux/input.h>



int main(int argc, char *argv[])
{
    int i;
    int fd;
    int ret;
    int version;
    struct input_event event;

    if(argc != 5) {
        fprintf(stderr, "use: %s device type code value\n", argv[0]);
        return 1;
    }

    fd = open(argv[1], O_RDWR);
    if(fd < 0) {
        fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
        return 1;
    }
    if (ioctl(fd, EVIOCGVERSION, &version)) {
        fprintf(stderr, "could not get driver version for %s, %s\n", argv[optind], strerror(errno));
        return 1;
    }
    memset(&event, 0, sizeof(event));
    event.type = atoi(argv[2]);
    event.code = atoi(argv[3]);
    event.value = atoi(argv[4]);
    ret = write(fd, &event, sizeof(event));
    if(ret < sizeof(event)) {
        fprintf(stderr, "write event failed, %s\n", strerror(errno));
        return -1;
    }
    return 0;
}

getevent.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <dirent.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/inotify.h>
#include <limits.h>
#include <sys/poll.h>
#include <linux/input.h> // this does not compile
#include <errno.h>

extern char *optarg;
extern int optind, optopt, opterr;


static struct pollfd *ufds;
static char **device_names;
static int nfds;

enum {
    PRINT_DEVICE_ERRORS     = 1U << 0,
    PRINT_DEVICE            = 1U << 1,
    PRINT_DEVICE_NAME       = 1U << 2,
    PRINT_DEVICE_INFO       = 1U << 3,
    PRINT_VERSION           = 1U << 4,
    PRINT_POSSIBLE_EVENTS   = 1U << 5,
};

static int print_possible_events(int fd)
{
    uint8_t *bits = NULL;
    ssize_t bits_size = 0;
    const char* label;
    int i, j, k;
    int res, res2;
    
    printf("  events:\n");
    for(i = 0; i <= EV_MAX; i++) {
        int count = 0;
        while(1) {
            res = ioctl(fd, EVIOCGBIT(i, bits_size), bits);
            if(res < bits_size)
                break;
            bits_size = res + 16;
            bits = realloc(bits, bits_size * 2);
            if(bits == NULL) {
                fprintf(stderr, "failed to allocate buffer of size %d\n", bits_size);
                return 1;
            }
        }
        res2 = 0;
        switch(i) {
            case EV_SYN:
                label = "SYN";
                break;
            case EV_KEY:
                res2 = ioctl(fd, EVIOCGKEY(res), bits + bits_size);
                label = "KEY";
                break;
            case EV_REL:
                label = "REL";
                break;
            case EV_ABS:
                label = "ABS";
                break;
            case EV_MSC:
                label = "MSC";
                break;
            case EV_LED:
                res2 = ioctl(fd, EVIOCGLED(res), bits + bits_size);
                label = "LED";
                break;
            case EV_SND:
                res2 = ioctl(fd, EVIOCGSND(res), bits + bits_size);
                label = "SND";
                break;
            case EV_SW:
                res2 = ioctl(fd, EVIOCGSW(bits_size), bits + bits_size);
                label = "SW ";
                break;
            case EV_REP:
                label = "REP";
                break;
            case EV_FF:
                label = "FF ";
                break;
            case EV_PWR:
                label = "PWR";
                break;
            default:
                res2 = 0;
                label = "???";
        }
        for(j = 0; j < res; j++) {
            for(k = 0; k < 8; k++)
                if(bits[j] & 1 << k) {
                    char down;
                    if(j < res2 && (bits[j + bits_size] & 1 << k))
                        down = '*';
                    else
                        down = ' ';
                    if(count == 0)
                        printf("    %s (%04x):", label, i);
                    else if((count & 0x7) == 0 || i == EV_ABS)
                        printf("\n               ");
                    printf(" %04x%c", j * 8 + k, down);
                    if(i == EV_ABS) {
                        struct input_absinfo abs;
                        if(ioctl(fd, EVIOCGABS(j * 8 + k), &abs) == 0) {
                            printf(" value %d, min %d, max %d, fuzz %d flat %d", abs.value, abs.minimum, abs.maximum, abs.fuzz, abs.flat);
                        }
                    }
                    count++;
                }
        }
        if(count)
            printf("\n");
    }
    free(bits);
    return 0;
}

static int open_device(const char *device, int print_flags)
{
    int version;
    int fd;
    struct pollfd *new_ufds;
    char **new_device_names;
    char name[80];
    char location[80];
    char idstr[80];
    struct input_id id;

    fd = open(device, O_RDWR);
    if(fd < 0) {
        if(print_flags & PRINT_DEVICE_ERRORS)
            fprintf(stderr, "could not open %s, %s\n", device, strerror(errno));
        return -1;
    }
    
    if(ioctl(fd, EVIOCGVERSION, &version)) {
        if(print_flags & PRINT_DEVICE_ERRORS)
            fprintf(stderr, "could not get driver version for %s, %s\n", device, strerror(errno));
        return -1;
    }
    if(ioctl(fd, EVIOCGID, &id)) {
        if(print_flags & PRINT_DEVICE_ERRORS)
            fprintf(stderr, "could not get driver id for %s, %s\n", device, strerror(errno));
        return -1;
    }
    name[sizeof(name) - 1] = '\0';
    location[sizeof(location) - 1] = '\0';
    idstr[sizeof(idstr) - 1] = '\0';
    if(ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) < 1) {
        //fprintf(stderr, "could not get device name for %s, %s\n", device, strerror(errno));
        name[0] = '\0';
    }
    if(ioctl(fd, EVIOCGPHYS(sizeof(location) - 1), &location) < 1) {
        //fprintf(stderr, "could not get location for %s, %s\n", device, strerror(errno));
        location[0] = '\0';
    }
    if(ioctl(fd, EVIOCGUNIQ(sizeof(idstr) - 1), &idstr) < 1) {
        //fprintf(stderr, "could not get idstring for %s, %s\n", device, strerror(errno));
        idstr[0] = '\0';
    }

    new_ufds = realloc(ufds, sizeof(ufds[0]) * (nfds + 1));
    if(new_ufds == NULL) {
        fprintf(stderr, "out of memory\n");
        return -1;
    }
    ufds = new_ufds;
    new_device_names = realloc(device_names, sizeof(device_names[0]) * (nfds + 1));
    if(new_device_names == NULL) {
        fprintf(stderr, "out of memory\n");
        return -1;
    }
    device_names = new_device_names;

    if(print_flags & PRINT_DEVICE)
        printf("add device %d: %s\n", nfds, device);
    if(print_flags & PRINT_DEVICE_INFO)
        printf("  bus:      %04x\n"
               "  vendor    %04x\n"
               "  product   %04x\n"
               "  version   %04x\n",
               id.bustype, id.vendor, id.product, id.version);
    if(print_flags & PRINT_DEVICE_NAME)
        printf("  name:     \"%s\"\n", name);
    if(print_flags & PRINT_DEVICE_INFO)
        printf("  location: \"%s\"\n"
               "  id:       \"%s\"\n", location, idstr);
    if(print_flags & PRINT_VERSION)
        printf("  version:  %d.%d.%d\n",
               version >> 16, (version >> 8) & 0xff, version & 0xff);

    if(print_flags & PRINT_POSSIBLE_EVENTS) {
        print_possible_events(fd);
    }

    ufds[nfds].fd = fd;
    ufds[nfds].events = POLLIN;
    device_names[nfds] = strdup(device);
    nfds++;

    return 0;
}

int close_device(const char *device, int print_flags)
{
    int i;
    for(i = 1; i < nfds; i++) {
        if(strcmp(device_names[i], device) == 0) {
            int count = nfds - i - 1;
            if(print_flags & PRINT_DEVICE)
                printf("remove device %d: %s\n", i, device);
            free(device_names[i]);
            memmove(device_names + i, device_names + i + 1, sizeof(device_names[0]) * count);
            memmove(ufds + i, ufds + i + 1, sizeof(ufds[0]) * count);
            nfds--;
            return 0;
        }
    }
    if(print_flags & PRINT_DEVICE_ERRORS)
        fprintf(stderr, "remote device: %s not found\n", device);
    return -1;
}

static int read_notify(const char *dirname, int nfd, int print_flags)
{
    int res;
    char devname[PATH_MAX];
    char *filename;
    char event_buf[512];
    int event_size;
    int event_pos = 0;
    struct inotify_event *event;

    res = read(nfd, event_buf, sizeof(event_buf));
    if(res < (int)sizeof(*event)) {
        if(errno == EINTR)
            return 0;
        fprintf(stderr, "could not get event, %s\n", strerror(errno));
        return 1;
    }
    //printf("got %d bytes of event information\n", res);

    strcpy(devname, dirname);
    filename = devname + strlen(devname);
    *filename++ = '/';

    while(res >= (int)sizeof(*event)) {
        event = (struct inotify_event *)(event_buf + event_pos);
        //printf("%d: %08x \"%s\"\n", event->wd, event->mask, event->len ? event->name : "");
        if(event->len) {
            strcpy(filename, event->name);
            if(event->mask & IN_CREATE) {
                open_device(devname, print_flags);
            }
            else {
                close_device(devname, print_flags);
            }
        }
        event_size = sizeof(*event) + event->len;
        res -= event_size;
        event_pos += event_size;
    }
    return 0;
}

static int scan_dir(const char *dirname, int print_flags)
{
    char devname[PATH_MAX];
    char *filename;
    DIR *dir;
    struct dirent *de;
    dir = opendir(dirname);
    if(dir == NULL)
        return -1;
    strcpy(devname, dirname);
    filename = devname + strlen(devname);
    *filename++ = '/';
    while((de = readdir(dir))) {
        if(de->d_name[0] == '.' &&
           (de->d_name[1] == '\0' ||
            (de->d_name[1] == '.' && de->d_name[2] == '\0')))
            continue;
        strcpy(filename, de->d_name);
        open_device(devname, print_flags);
    }
    closedir(dir);
    return 0;
}

static void usage(int argc, char *argv[])
{
    fprintf(stderr, "Usage: %s [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]\n", argv[0]);
    fprintf(stderr, "    -t: show time stamps\n");
    fprintf(stderr, "    -n: don't print newlines\n");
    fprintf(stderr, "    -s: print switch states for given bits\n");
    fprintf(stderr, "    -S: print all switch states\n");
    fprintf(stderr, "    -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)\n");
    fprintf(stderr, "    -p: show possible events (errs, dev, name, pos. events)\n");
    fprintf(stderr, "    -q: quiet (clear verbosity mask)\n");
    fprintf(stderr, "    -c: print given number of events then exit\n");
    fprintf(stderr, "    -r: print rate events are received\n");
}

int main(int argc, char *argv[])
{
    int c;
    int i;
    int res;
    int pollres;
    int get_time = 0;
    int print_device = 0;
    char *newline = "\n";
    uint16_t get_switch = 0;
    struct input_event event;
    int version;
    int print_flags = PRINT_DEVICE_ERRORS | PRINT_DEVICE | PRINT_DEVICE_NAME;
    int print_flags_set = 0;
    int dont_block = -1;
    int event_count = 0;
    int sync_rate = 0;
    int64_t last_sync_time = 0;
    const char *device = NULL;
    const char *device_path = "/dev/input";

    opterr = 0;
    do {
        c = getopt(argc, argv, "tns:Sv::pqc:rh");
        if (c == EOF)
            break;
        switch (c) {
        case 't':
            get_time = 1;
            break;
        case 'n':
            newline = "";
            break;
        case 's':
            get_switch = strtoul(optarg, NULL, 0);
            if(dont_block == -1)
                dont_block = 1;
            break;
        case 'S':
            get_switch = ~0;
            if(dont_block == -1)
                dont_block = 1;
            break;
        case 'v':
            if(optarg)
                print_flags =  strtoul(optarg, NULL, 0);
            else
                print_flags |= PRINT_DEVICE | PRINT_DEVICE_NAME | PRINT_DEVICE_INFO | PRINT_VERSION;
            print_flags_set = 1;
            break;
        case 'p':
            print_flags = PRINT_DEVICE_ERRORS | PRINT_DEVICE | PRINT_DEVICE_NAME | PRINT_POSSIBLE_EVENTS;
            print_flags_set = 1;
            if(dont_block == -1)
                dont_block = 1;
            break;
        case 'q':
            print_flags = 0;
            print_flags_set = 1;
            break;
        case 'c':
            event_count = atoi(optarg);
            dont_block = 0;
            break;
        case 'r':
            sync_rate = 1;
            break;
        case '?':
            fprintf(stderr, "%s: invalid option -%c\n",
                argv[0], optopt);
        case 'h':
            usage(argc, argv);
            exit(1);
        }
    } while (1);
    if(dont_block == -1)
        dont_block = 0;

    if (optind + 1 == argc) {
        device = argv[optind];
        optind++;
    }
    if (optind != argc) {
        usage(argc, argv);
        exit(1);
    }
    nfds = 1;
    ufds = calloc(1, sizeof(ufds[0]));
    ufds[0].fd = inotify_init();
    ufds[0].events = POLLIN;
    if(device) {
        if(!print_flags_set)
            print_flags = PRINT_DEVICE_ERRORS;
        res = open_device(device, print_flags);
        if(res < 0) {
            return 1;
        }
    }
    else {
        print_device = 1;
		res = inotify_add_watch(ufds[0].fd, device_path, IN_DELETE | IN_CREATE);
        if(res < 0) {
            fprintf(stderr, "could not add watch for %s, %s\n", device_path, strerror(errno));
            return 1;
        }
        res = scan_dir(device_path, print_flags);
        if(res < 0) {
            fprintf(stderr, "scan dir failed for %s\n", device_path);
            return 1;
        }
    }

    if(get_switch) {
        for(i = 1; i < nfds; i++) {
            uint16_t sw;
            res = ioctl(ufds[i].fd, EVIOCGSW(1), &sw);
            if(res < 0) {
                fprintf(stderr, "could not get switch state, %s\n", strerror(errno));
                return 1;
            }
            sw &= get_switch;
            printf("%04x%s", sw, newline);
        }
    }

    if(dont_block)
        return 0;

    while(1) {
        pollres = poll(ufds, nfds, -1);
        //printf("poll %d, returned %d\n", nfds, pollres);
        if(ufds[0].revents & POLLIN) {
            read_notify(device_path, ufds[0].fd, print_flags);
        }
        for(i = 1; i < nfds; i++) {
            if(ufds[i].revents) {
                if(ufds[i].revents & POLLIN) {
                    res = read(ufds[i].fd, &event, sizeof(event));
                    if(res < (int)sizeof(event)) {
                        fprintf(stderr, "could not get event\n");
                        return 1;
                    }
                    if(get_time) {
                        printf("%ld-%ld: ", event.time.tv_sec, event.time.tv_usec);
                    }
                    if(print_device)
                        printf("%s: ", device_names[i]);
                    printf("%04x %04x %08x", event.type, event.code, event.value);
                    if(sync_rate && event.type == 0 && event.code == 0) {
                        int64_t now = event.time.tv_sec * 1000000LL + event.time.tv_usec;
                        if(last_sync_time)
                            printf(" rate %lld", 1000000LL / (now - last_sync_time));
                        last_sync_time = now;
                    }
                    printf("%s", newline);
                    if(event_count && --event_count == 0)
                        return 0;
                }
            }
        }
    }

    return 0;
}

改了几行代码, 通过编译, 试了一下, 居然可以了.

Ubuntu 模拟鼠标中键上下滚动:

sudo ./sendevent /dev/input/event3 2 8 -1
sudo ./sendevent /dev/input/event3 2 8  1
@ubuntu:/disk2/licheepi/linux$ sudo ./getevent /dev/input/event3
0002 0008 ffffffff
0000 0000 00000000
0002 0008 00000001
0000 0000 00000000

居然可以用了

#53 VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 请教Linux下面如何才能对 /dev/input/event* 在应用程序注入数据,用 evtest 可以读出?内核要不要配置什么 » 2019-09-04 16:15:19

还能这么玩
回复: 16
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/ioctl.h>
//#include <linux/input.h> // this does not compile
#include <errno.h>


// from <linux/input.h>

struct input_event {
	struct timeval time;
	__u16 type;
	__u16 code;
	__s32 value;
};

#define EVIOCGVERSION		_IOR('E', 0x01, int)			/* get driver version */
#define EVIOCGID		_IOR('E', 0x02, struct input_id)	/* get device ID */
#define EVIOCGKEYCODE		_IOR('E', 0x04, int[2])			/* get keycode */
#define EVIOCSKEYCODE		_IOW('E', 0x04, int[2])			/* set keycode */

#define EVIOCGNAME(len)		_IOC(_IOC_READ, 'E', 0x06, len)		/* get device name */
#define EVIOCGPHYS(len)		_IOC(_IOC_READ, 'E', 0x07, len)		/* get physical location */
#define EVIOCGUNIQ(len)		_IOC(_IOC_READ, 'E', 0x08, len)		/* get unique identifier */

#define EVIOCGKEY(len)		_IOC(_IOC_READ, 'E', 0x18, len)		/* get global keystate */
#define EVIOCGLED(len)		_IOC(_IOC_READ, 'E', 0x19, len)		/* get all LEDs */
#define EVIOCGSND(len)		_IOC(_IOC_READ, 'E', 0x1a, len)		/* get all sounds status */
#define EVIOCGSW(len)		_IOC(_IOC_READ, 'E', 0x1b, len)		/* get all switch states */

#define EVIOCGBIT(ev,len)	_IOC(_IOC_READ, 'E', 0x20 + ev, len)	/* get event bits */
#define EVIOCGABS(abs)		_IOR('E', 0x40 + abs, struct input_absinfo)		/* get abs value/limits */
#define EVIOCSABS(abs)		_IOW('E', 0xc0 + abs, struct input_absinfo)		/* set abs value/limits */

#define EVIOCSFF		_IOC(_IOC_WRITE, 'E', 0x80, sizeof(struct ff_effect))	/* send a force effect to a force feedback device */
#define EVIOCRMFF		_IOW('E', 0x81, int)			/* Erase a force effect */
#define EVIOCGEFFECTS		_IOR('E', 0x84, int)			/* Report number of effects playable at the same time */

#define EVIOCGRAB		_IOW('E', 0x90, int)			/* Grab/Release device */

// end <linux/input.h>



int sendevent_main(int argc, char *argv[])
{
    int i;
    int fd;
    int ret;
    int version;
    struct input_event event;

    if(argc != 5) {
        fprintf(stderr, "use: %s device type code value\n", argv[0]);
        return 1;
    }

    fd = open(argv[1], O_RDWR);
    if(fd < 0) {
        fprintf(stderr, "could not open %s, %s\n", argv[optind], strerror(errno));
        return 1;
    }
    if (ioctl(fd, EVIOCGVERSION, &version)) {
        fprintf(stderr, "could not get driver version for %s, %s\n", argv[optind], strerror(errno));
        return 1;
    }
    memset(&event, 0, sizeof(event));
    event.type = atoi(argv[2]);
    event.code = atoi(argv[3]);
    event.value = atoi(argv[4]);
    ret = write(fd, &event, sizeof(event));
    if(ret < sizeof(event)) {
        fprintf(stderr, "write event failed, %s\n", strerror(errno));
        return -1;
    }
    return 0;
}

https://github.com/joneschrisg/android-system-core/blob/master/toolbox/sendevent.c

网上复制的代码怎么都没搞定

#56 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 终于把 VS2017 【 LNK1101: MSPDB140.DLL 的版本不正确;请重新检查此产品的安装】的编译问题搞定了 » 2019-09-02 09:49:51

后来发现一个更简单的方法,

删除 "C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\mspdb140.dll"

就可以了。

#57 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 终于把 VS2017 【 LNK1101: MSPDB140.DLL 的版本不正确;请重新检查此产品的安装】的编译问题搞定了 » 2019-09-02 09:48:40

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\msobj140.dll"
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\mspdb140.dll"
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\mspdbcore.dll"
"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\mspdbsrv.exe"

上面四个文件复制到:

"C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\"

即可以解决问题。

#58 Re: Qt/MSVC/MINGW/C++/MFC/GTK+/Delphi/BCB » 终于把 VS2017 【 LNK1101: MSPDB140.DLL 的版本不正确;请重新检查此产品的安装】的编译问题搞定了 » 2019-09-02 09:47:11

1>------ 已启动全部重新生成: 项目: ConsoleApplication1, 配置: Debug Win32 ------
1>pch.cpp
1>ConsoleApplication1.cpp
1>LINK : fatal error LNK1101: MSPDB140.DLL 的版本不正确;请重新检查此产品的安装
1>已完成生成项目“ConsoleApplication1.vcxproj”的操作 - 失败。
========== 全部重新生成: 成功 0 个,失败 1 个,跳过 0 个 ==========

一开始试了各种方法, google 全英文搜索, 各种英文网站上面的方案都没有解决

直到后来看到这个帖子:

https://my.oschina.net/shou1156226/blog/809847

【错误】

Link1171:无法加载mspdb140.dll
【解决】

1. 找到VS2015 IDE的安装目录,以本人电脑上的目录为例:

D:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE

2.将IDE目录中的msobj140.dll, mspdb140.dll, mspdbcore.dll, mspdbsrv.exe四个文件复制到VC的bin目录下覆盖原有文件,以本人电脑为例:

D:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin

3.打开VS2015 新建一个C++的win32 控制台程序试一下是否还出现Link1171错误

4.如果还出现这个错误,请将VC/bin目录加入到系统环境变量Path中用分号隔开,重启计算机。

按照一步一步终于搞定。

#60 Re: 技术人生/软件使用技巧/破解经验/技术吐槽/灌水 » 第一次见到这种夹具, 可以用于SOP8 SOIC8 封装的 flash 在线烧录, 免拆芯片,转载QQ群 » 2019-08-20 10:27:20

3.因为是简易的编程器,我电脑的USB已经烧了两组了.现在是加的PCI扩展的USB使用。。

这操作让我的表情有点不稳定啊,
我是受过训练的人, 一般都能忍住不笑, 哈哈哈哈哈哈哈哈
加个USB HUB 是不是能保护主板?

#62 Re: ESP32/ESP8266 » 编译esp-iot-solution的例程出现错误 » 2019-08-17 13:53:53

是这个吗:

https://github.com/espressif/esp-iot-solution


你试一试这样:

export IOT_SOLUTION_PATH="D:/lin_work/esp32_work/esp32_prj/esp/esp-iot-solution/"

虽然 bash 识别 /d/lin_work 这种格式, 但是其他软件未必识别, 个人猜测。

#63 Re: 全志 V3S/F1C100s/X3 » 分享一个 5寸的 800x480 的 f1c100s 固件, 感谢 @xm1994 » 2019-08-17 13:49:37

mango 说:

15楼图有问题,兼容性不够。
FP6xxxx系列,可以这样用。
如果是GT系列,RST必须是IO口,由于存在两组IIC通讯地址,上电需要靠这RST和INT两条线的时序确定。

2019-08-17_112407.png

怪不得, 还以为我的 GT911 触摸屏 精神分裂了,
i2c_detect 检测, 有时候启动是 0x14, 有时候是 0x5d,

然后再看 @xm1994 的 dts 代码,
https://github.com/summershrimp/opendeck-linux/commit/eb7a274d02b52a02198e3b2726df822eed0f36c8

发现 rst 引脚也接上了

#64 Re: 全志 V3S/F1C100s/X3 » 分享一个 5寸的 800x480 的 f1c100s 固件, 感谢 @xm1994 » 2019-08-17 09:09:42

firstman 说:
晕哥 说:

感谢楼主热心分享!






参考链接1: http://nano.lichee.pro/build_sys/build_flash.html
参考链接2: 核心板原理图 Lichee_nano.pdf (第一版)
参考链接3: 核心板原理图 lichee_nano_new.pdf (第二版 ns2009)
参考链接4: 底板原理图    lpi-nano-dock.pdf


https://whycan.cn/files/members/1574/2019-08-17_090528.png

请问这种接口的 GT911 电容触摸屏哪里可以买到?

就是这种:

https://detail.tmall.com/item.htm?id=561493224626

优屏旗舰店 选 stc 5099

我当时买得早, 现在荔枝派好像不卖这种电容屏了。

#65 Re: 全志 V3S/F1C100s/X3 » 荔枝派nano(f1c100s)的SPI-Flash系统编译创建全过程 » 2019-08-13 17:38:06

1. CONFIG_MTD_BLOCK 这个有没有勾选?
2. bootargs 加 root=/linuxrc
3. jffs2 文件系统有问题:

[    3.840645] jffs2: Cowardly refusing to erase blocks on filesystem with no valid JFFS2 nodes
[    3.849120] jffs2: empty_blocks 0, bad_blocks 0, c->nr_blocks 175
[    3.855382] VFS: Cannot open root device "31:03" or unknown-block(31,3): error -5


参考这个吧 https://whycan.cn/t_2689.html

#66 Re: 全志 V3S/F1C100s/X3 » f1c100s 触摸屏(TP)驱动程序部分代码 (裸奔) 已验证,可以进【按压】和【抬起】中断,可以读按压坐标. » 2019-08-13 16:02:54

wubingqing 说:

Administrator  我电脑老是提示要安装vid1f3apidefe8这个驱动,有这个驱动 发一下

没听说过

#68 Re: 全志 V3S/F1C100s/X3 » 求教,晕哥入坑教程中,编译出来的固件没有tar 解压gz和cat mtd没输出问题? » 2019-08-13 13:48:29

danile 说:
晕哥 说:

1. 你的tar命令不支持压缩, 可能是 busybox 里面的 tar 本来就不支持压缩, 或者是编译的时候某些选项未勾

2. 没有生成分区


1. busybox 确实没有z这个选项可以选
2. 怎么能生成呢?

1. 试一试 buildroot 里面的 tar, 应该有带压缩的全功能选项

2. 生成 mtd:
https://whycan.cn/t_2179.html
https://whycan.cn/t_2170.html

#72 Re: Nuvoton N32905/N32926/NUC972/N9H20/N9H26/N9H30 » 有没有办法能动态修改 u-boot 的启动画面, 可以在进入Linux应用程序操作。 » 2019-08-13 09:21:02

谢谢楼上的大神, 我最后确实按这个思路解决的,

fatload 0x82000000 splash.bmp;bmp show 0x82000000

但是现在问题来了, 进入Linux 之后, 启动画面一半没了。

#73 Re: 全志 V3S/F1C100s/X3 » F1C100s如何在uboot触发芯片进入usb otg烧录模式 » 2019-08-08 14:07:35

unknow_device.png

我也测试了一下, 不行啊.

unknow device 不能识别的USB设备。

#77 Re: 君正Ingenic/X1000/X2000/T10/T20/T30 » 分享一个 君正 X1000 自动挂载 TF卡/U盘 分区 » 2019-08-07 17:20:58

挂载成功:

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root                11776      4524      7252  38% /
devtmpfs                 19268         0     19268   0% /dev
tmpfs                    27972         0     27972   0% /dev/shm
tmpfs                    27972       324     27648   1% /tmp
tmpfs                    27972        12     27960   0% /run
/dev/mmcblk0p1         1920672        32   1920640   0% /mnt/sdcard
/dev/sda1                16334      9108      7226  56% /mnt/usb

2019-08-07_mdev.png

#78 君正Ingenic/X1000/X2000/T10/T20/T30 » 分享一个 君正 X1000 自动挂载 TF卡/U盘 分区 » 2019-08-07 17:20:06

还能这么玩
回复: 5

借花献佛参考这个: https://emlinuxwork.blogspot.com/2016/06/made-sd-card-usb-mass-storage-automount.html (可能要番蔷)

buildroot 生成根文件系统之后,

修改 /etc/mdev.conf, 末尾添加:

sd[a-z][0-9] 0:0 660  */etc/init.d/automount.sh
mmcblk[0-9]p[0-9] 0:0 660 */etc/init.d/automount.sh

新建文件 /etc/init.d/automount.sh

#!/bin/sh

/bin/touch /var/plog

if [ "$MDEV" == "" ]; then
   echo "automount unknow error!" >> /var/plog
   exit 1
elif [ "$MDEV" == "mmcblk0p1" ]; then
    mmtype=sdcard
elif [ "$MDEV" == "sda1" ]; then
    mmtype=usb
else
   echo "automount unknow dev:" >> /var/plog
   echo $MDEV >> /var/plog
   exit 1
fi

echo $mmtype >> /var/plog

case "$ACTION" in 
    add|"")
       echo “Add device $MDEV” >> /var/plog
       mkdir -p /mnt/$mmtype
       mount -t vfat /dev/$MDEV /mnt/$mmtype
        ;; 
    remove)
       echo “remove device $MDEV” >> /var/plog
       umount /mnt/$mmtype
       rm /mnt/$mmtype -rf
       ;; 
esac

#79 Re: 全志 V3S/F1C100s/X3 » 为什么它始终报找不到头文件,明明我有说明搜索路径,变量有定义。 » 2019-07-20 11:23:01

/opt/arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ -c -O2 -march=armv7-a -lts  -I../../../mkspecs/arm-linux-gnueabihf -I. -o tslib.o tslib.cpp


很明显, 这一行并没有 -I/opt/tslib/include, 所以找不到头文件了。

还是配置问题.

#80 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 【转】GIT常用命令整理 » 2019-07-20 10:38:20

比较 Linux 两个版本的差异:

###同步tags
git pull origin  --tags

###比较 4.14, 4.19  的  drivers/gpu/drm/ 目录差异:
git diff  v4.14 v4.19 drivers/gpu/drm/

#83 Re: 全志 V3S/F1C100s/X3 » Debian 9.9 (stretch) 文件系统制作 » 2019-07-18 08:28:41

请教各位, 这样制作的 debian 只是一个根文件系统吗? 比起其他的系统有什么优势?

#84 Re: VMWare/Linux/Ubuntu/Fedora/CentOS/U-BOOT » 【转】GIT常用命令整理 » 2019-07-18 08:27:29

我也来两个

列出远程仓库origin所有的tags标签:

git ls-remote  --tags origin


列出远程仓库origin所有的branchs分支:

git ls-remote  --heads origin

#86 Re: Cortex M0/M3/M4/M7 » TKM32F499 M4核心,内置8MB SRAM的单片机来啦,批量20块钱1片 » 2019-07-16 10:03:39

和 f1c100s 价格确实没得比, 这也是 STC 还活得风生水起的原因。

#87 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/ » 9.9元包邮血糖仪 (STM8) 要撸的快点 » 2019-07-16 09:46:28

倍稳II型血糖仪家用免调码2型仪器配桶装试纸条针头糖尿病人检测
【在售价】29.90 元
【券后价】9.90元
-----------------
【立即领券】复制¥gvAOYhHEQnn¥打开手机淘宝领券并下单
【立即下单】复制¥Cul8YhHEnnp¥打开手机淘宝立即下单

#88 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/ » 9.9元包邮血糖仪 (STM8) 要撸的快点 » 2019-07-16 09:45:51

还能这么玩
回复: 7

倍稳II型血糖仪家用免调码2型仪器配桶装试纸条针头糖尿病人检测
【在售价】29.90 元
【券后价】9.90元
-----------------
【立即领券】点击链接即可领券购买: https://s.click.taobao.com/8v4oW5w
【立即下单】点击链接立即下单: https://s.click.taobao.com/js2oW5w

#89 Re: 8051/STC8/AT89C51/N76E003 » N76E003 如何从 LDROM 跳转到 APROM, 我用来在线升级. » 2019-06-14 21:40:34

根据手册, 写了一个简单的 LDROM/APROM 切换的程序:

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Function_define.h"
#include "Common.h"
#include "Delay.h"

#if LDROM
#define LED_FLASH_MS    30
#elif APROM
#define LED_FLASH_MS   500
#endif


void main (void) 
{
   UINT16 t;

	Set_All_GPIO_Quasi_Mode;
	

   while(1)
   {
      t++;
#if LDROM
      if(t > 10) break;
#elif APROM
      if(t > 5) break;
#endif
      
      clr_GPIO1;
      P0 = 0x00;
      P2 = 0x00;
      P1 = 0x00;
      Timer0_Delay1ms(LED_FLASH_MS);
      P0 = 0xff;
      P2 = 0xff;
      P1 = 0xff;
      set_GPIO1;	
      Timer0_Delay1ms(LED_FLASH_MS);
   }

#if LDROM
   clr_BS;
#elif APROM
   set_BS;
#endif
   
   set_SWRST;
   while(1);
}

NULINK 烧录软件下载: https://whycan.cn/t_2569.html

工程配置和烧录:
QQ20190614213950.png

#91 8051/STC8/AT89C51/N76E003 » N76E003 如何从 LDROM 跳转到 APROM, 我用来在线升级. » 2019-06-14 17:41:19

还能这么玩
回复: 2

网上搜了一下, 几乎没什么资料, 新唐的SDK里面只有 LD 编程 AP, AP 编程 LD 的例程。

#92 Re: 8051/STC8/AT89C51/N76E003 » N76E003 熔丝位(CONFIG) 总是不能设置成自己想要的 » 2019-06-14 16:10:25

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp. 
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 CONFIG program demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

/*
	Since the DATAFLASH is in the APROM. Program command is same as program APROM
*/

#define     PAGE_ERASE_CF       0xE2
#define     BYTE_READ_CF        0xC0
#define     BYTE_PROGRAM_CF     0xE1
#define     ERASE_ALL_CF        0xE2

#define     ERASE_FAIL          0x70
#define     PROGRAM_FAIL        0x71
#define     IAPFF_FAIL          0x72
#define     IAP_PASS            0x00

		

/********************************************************************************************
 Following IAP command register is also define in SFR_Macro.h
 
	#define set_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP
	#define clr_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP
	#define set_CFUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN|=SET_BIT2;EA=BIT_TMP
	#define clr_CFUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN&=~SET_BIT2;EA=BIT_TMP
**********************************************************************************************/
void IAP_ERROR_LED(void)
{
	while (1)
	{
		clr_P03;
		Timer0_Delay1ms(100);
		set_P03;
		Timer0_Delay1ms(100);
	}

}

//-----------------------------------------------------------------------------------------------------------/
void Trigger_IAP(void)
{   
    set_IAPGO;																	//trigger IAP
    if((CHPCON&SET_BIT6)==SET_BIT6)             // if fail flag is set, toggle error LED and IAP stop
		{
			clr_IAPFF;
			IAP_ERROR_LED();
		}
}
/*
		WARNING:
	No matter read or writer, when IAPFF is set 1, 
	this step process is fail. DATA should be ignore.
*/
//-----------------------------------------------------------------------------------------------------------/

/*****************************************************************************************************************
Write CONFIG subroutine:
******************************************************************************************************************/		
void Erase_All_Config(void)
{
    set_IAPEN;																	// Enable IAP function
    IAPAL = 0x00;
    IAPAH = 0x00;
    IAPFD = 0xFF;
    IAPCN = ERASE_ALL_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

UINT8 Read_Config(UINT8 cfg)
{
    UINT8 value = 0;
    set_IAPEN;																	// Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;    
    IAPCN = BYTE_READ_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    
    value = IAPFD;
    
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
    
    return value;
}

void Write_Config(UINT8 cfg, UINT8 value)
{
    set_IAPEN;																	// Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;
    IAPFD = value;
    IAPCN = BYTE_PROGRAM_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

//-----------------------------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------------
void main (void) 
{
    UINT8 cfg0, cfg1, cfg2, cfg4;
    
    //读熔丝位
    cfg0 = Read_Config(0);
    cfg1 = Read_Config(1);
    cfg2 = Read_Config(2);
    cfg4 = Read_Config(4);
    
	//擦除熔丝位
    Erase_All_Config();
    
    //编程熔丝位
    Write_Config(0, cfg0);
    Write_Config(1, cfg1);
    Write_Config(2, cfg2);
    Write_Config(4, 0x0F);
    
    
    while(1);
}
//-----------------------------------------------------------------------------------------------------------

void Erase_All_Config(void)
{
    set_IAPEN;                                                                    // Enable IAP function
    IAPAL = 0x00;
    IAPAH = 0x00;
    IAPFD = 0xFF;
    IAPCN = ERASE_ALL_CF;
    set_CFUEN;                                                                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
   
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

UINT8 Read_Config(UINT8 cfg)
{
    UINT8 value = 0;
    set_IAPEN;                                                                    // Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;   
    IAPCN = BYTE_READ_CF;
    set_CFUEN;                                                                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
   
    value = IAPFD;
   
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
   
    return value;
}

void Write_Config(UINT8 cfg, UINT8 value)
{
    set_IAPEN;                                                                    // Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;
    IAPFD = value;
    IAPCN = BYTE_PROGRAM_CF;
    set_CFUEN;                                                                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}


void main (void)
{
    UINT8 cfg0, cfg1, cfg2, cfg4;
   
    //读熔丝位
    cfg0 = Read_Config(0);
    cfg1 = Read_Config(1);
    cfg2 = Read_Config(2);
    cfg4 = Read_Config(4);
   
    //擦除熔丝位
    Erase_All_Config();
   
    //编程熔丝位
    Write_Config(0, cfg0);
    Write_Config(1, cfg1);
    Write_Config(2, cfg2);
    Write_Config(4, 0x0F);
   
   
    while(1);
}

终于把狗屎一样的 SDK 改好看一点了

#93 Re: 8051/STC8/AT89C51/N76E003 » N76E003 熔丝位(CONFIG) 总是不能设置成自己想要的 » 2019-06-14 15:52:24

UINT8 Read_Config(UINT8 cfg)
{
    UINT8 value = 0;
    set_IAPEN;                                                                    // Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;   
    IAPCN = BYTE_READ_CF;
    set_CFUEN;                                                                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
   
    value = IAPFD;
   
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
   
    return value;
}

void main (void)
{
    UINT8 cfg0, cfg1, cfg2, cfg4;
   
    cfg0 = Read_Config(0);
    cfg1 = Read_Config(1);
    cfg2 = Read_Config(2);
    cfg4 = Read_Config(4); 
}

这样可以把各熔丝位读出来了。



全部代码:

/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

//***********************************************************************************************************
//  Nuvoton Technoledge Corp. 
//  Website: http://www.nuvoton.com
//  E-Mail : MicroC-8bit@nuvoton.com
//  Date   : Apr/21/2017
//***********************************************************************************************************

//***********************************************************************************************************
//  File Function: N76E003 CONFIG program demo code
//***********************************************************************************************************

#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"

/*
	Since the DATAFLASH is in the APROM. Program command is same as program APROM
*/

#define     PAGE_ERASE_CF       0xE2
#define     BYTE_READ_CF        0xC0
#define     BYTE_PROGRAM_CF     0xE1
#define     ERASE_ALL_CF        0xE2

#define     ERASE_FAIL          0x70
#define     PROGRAM_FAIL        0x71
#define     IAPFF_FAIL          0x72
#define     IAP_PASS            0x00

		

/********************************************************************************************
 Following IAP command register is also define in SFR_Macro.h
 
	#define set_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON |= SET_BIT0 ;EA=BIT_TMP
	#define clr_IAPEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;CHPCON &= ~SET_BIT0;EA=BIT_TMP
	#define set_CFUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN|=SET_BIT2;EA=BIT_TMP
	#define clr_CFUEN   BIT_TMP=EA;EA=0;TA=0xAA;TA=0x55;IAPUEN&=~SET_BIT2;EA=BIT_TMP
**********************************************************************************************/
void IAP_ERROR_LED(void)
{
	while (1)
	{
		clr_P03;
		Timer0_Delay1ms(100);
		set_P03;
		Timer0_Delay1ms(100);
	}

}

//-----------------------------------------------------------------------------------------------------------/
void Trigger_IAP(void)
{   
    set_IAPGO;																	//trigger IAP
    if((CHPCON&SET_BIT6)==SET_BIT6)             // if fail flag is set, toggle error LED and IAP stop
		{
			clr_IAPFF;
			IAP_ERROR_LED();
		}
}
/*
		WARNING:
	No matter read or writer, when IAPFF is set 1, 
	this step process is fail. DATA should be ignore.
*/
//-----------------------------------------------------------------------------------------------------------/

/*****************************************************************************************************************
Write CONFIG subroutine:
******************************************************************************************************************/		
void Erase_All_Config(void)
{
    set_IAPEN;																	// Enable IAP function
    IAPAL = 0x00;
    IAPAH = 0x00;
    IAPFD = 0xFF;
    IAPCN = ERASE_ALL_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

UINT8 Read_Config(UINT8 cfg)
{
    UINT8 value = 0;
    set_IAPEN;																	// Enable IAP function
    IAPAL = cfg;
    IAPAH = 0x00;    
    IAPCN = BYTE_READ_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    
    value = IAPFD;
    
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
    
    return value;
}

void Enable_WDT_Reset_Config(void)
{
    set_IAPEN;																	// Enable IAP function
    IAPAL = 0x04;
    IAPAH = 0x00;
    IAPFD = 0x5F;
    IAPCN = BYTE_PROGRAM_CF;
    set_CFUEN;																	// Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

//-----------------------------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------------
void main (void) 
{
    UINT8 cfg0, cfg1, cfg2, cfg4;
    
    cfg0 = Read_Config(0);
    cfg1 = Read_Config(1);
    cfg2 = Read_Config(2);
    cfg4 = Read_Config(4);
    
    Set_All_GPIO_Quasi_Mode;
//---------toggle GPIO1---------	
	clr_GPIO1;
	Timer0_Delay1ms(100);
	set_GPIO1;
	Timer0_Delay1ms(100);
	clr_GPIO1;
	Timer0_Delay1ms(100);
	set_GPIO1;
	Timer0_Delay1ms(100);
//---------end toggle GPIO1---------
	
    Erase_All_Config();
    Enable_WDT_Reset_Config();
    while(1);
}
//-----------------------------------------------------------------------------------------------------------

#94 Re: 全志 V3S/F1C100s/X3 » F1C100S PE11 CLK_OUT输出时钟问题 » 2019-06-14 15:05:51

联系上下文看, 这个应该是 Camera 的 MCLK 引脚? 让摄像头省掉有源晶体的。

如果是的话, 是否需要使能 Camera ?

#95 Re: 8051/STC8/AT89C51/N76E003 » N76E003 熔丝位(CONFIG) 总是不能设置成自己想要的 » 2019-06-14 14:58:54

//擦除 CONFIG0/1/2/4
void Erase_All_Config(void)
{
    set_IAPEN;// Enable IAP function
    IAPAL = 0x00;
    IAPAH = 0x00;
    IAPFD = 0xFF;
    IAPCN = ERASE_ALL_CF;
    set_CFUEN;    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
   
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

//编程 CONFIG4
void Enable_WDT_Reset_Config(void)
{
    set_IAPEN;                // Enable IAP function
    IAPAL = 0x04;
    IAPAH = 0x00;
    IAPFD = 0x5F;
    IAPCN = BYTE_PROGRAM_CF;
    set_CFUEN;                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
    while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}


main 函数调用:

void main (void)
{   
    Erase_All_Config();
    Enable_WDT_Reset_Config();
    while(1);
}


这样先擦除, 再编程, 就OK, 想写多少就写多少, 编程前, 先把这四个熔丝位保存起来, 擦除后写回去。

#96 Re: 8051/STC8/AT89C51/N76E003 » N76E003 熔丝位(CONFIG) 总是不能设置成自己想要的 » 2019-06-14 14:55:40

发现无论 CONFIG.4 是 0xXF 什么, 都可以编程为 0x0F

如果原来是 0x0F, 就不能编程为 0xFF

看来有可能是需要先擦除, 才能写。

#97 8051/STC8/AT89C51/N76E003 » N76E003 熔丝位(CONFIG) 总是不能设置成自己想要的 » 2019-06-14 14:47:52

还能这么玩
回复: 4

https://github.com/OpenNuvoton/N76E003-BSP/blob/master/Sample_Code/IAP_program_Config/Code/IAP_DATAFLASH.c


void Enable_WDT_Reset_Config(void)
{
    set_IAPEN;                                                                    // Enable IAP function
    IAPAL = 0x04;
    IAPAH = 0x00;
    IAPFD = 0x0F;
    IAPCN = BYTE_PROGRAM_CF;
    set_CFUEN;                                                                    // Enable CONFIG writer bit
    set_IAPGO;                                  //trigger IAP
        while((CHPCON&SET_BIT6)==SET_BIT6);          //check IAPFF (CHPCON.6)
    clr_CFUEN;
    clr_IAPEN;
}

CONFIG.4 熔丝位设置成 0x0F 倒是没什么问题


但是我设置成 0xFF, 就不行了。

#100 Re: 计算机图形/GUI/RTOS/FileSystem » @熊掌 开源的 littlevgl 读取并显示TTF字体的程序,使用 freetype ttf字体库 » 2019-05-27 08:10:11

rf 说:

字体小的时候,有些时候,上对齐或者下对齐都不大好看         
//居中对齐         
copy_bitmap(sbit->buffer, sbit->width, sbit->height, sbit->left,                     (lv_font_ttf.h_px - sbit->height)>>1,                     sbit->xadvance);

这样会好看很多

我测了一下,    (lv_font_ttf.h_px - sbit->height) 结果是 3, 右移之后计算结果是1, 根本没有改变。

#101 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/ » 请问大家液晶的刷新频率都是 60 HZ 吗, 我手上这几块屏的刷新率貌似都是这个数字 » 2019-05-22 09:55:55

还能这么玩
回复: 3

QQ20190522095335.png

这是供应商1 的 ILI9481 LCD








QQ20190522095431.png

这是供应商2 的 AT070TN92 LCD

虽然没有标频率, 但是我算出来是 60HZ

33.3 * 10^6 / (525*1056) = 60.06

#104 全志 V3S/F1C100s/X3 » f1c100s 主线 Linux 的 usb 出现这个 missing 'dr_mode' property 问题, 请问应该怎么解决? » 2019-05-17 17:23:04

还能这么玩
回复: 0

[    1.729441] ALSA device list:
[    1.732429]   #0: Loopback 1
[    1.740730] Freeing unused kernel memory: 1024K
[    1.805151] mmc0: host does not support reading read-only switch, assuming write-enable
[    1.826963] mmc0: new high speed SD card at address 0001
[    1.842553] mmcblk0: mmc0:0001 MS 1.83 GiB
[    1.856988]  mmcblk0: p1
can't open /dev/null: No such file or directory
can't open /dev/null: No such file or directory
can't open /dev/null: No such file or directory
can't open /dev/null: No such file or directory
Starting syslogd: OK
Starting klogd: OK
Starting mdev...
[    5.436642] musb-sunxi 1c13000.usb: Invalid or missing 'dr_mode' property
[    5.443491] musb-sunxi: probe of 1c13000.usb failed with error -22
Initializing random number generator... done.
Starting network: OK

Welcome to Buildroot
buildroot login:
Welcome to Buildroot
buildroot login: root
#
# modprobe g_serial
[   59.417855] udc-core: couldn't find an available UDC - added [g_serial] to list of pending drivers
#

f1c100s 主线 Linux 的 usb 出现这个 missing 'dr_mode' property 问题, 请问应该怎么解决?

#105 Re: 全志 V3S/F1C100s/X3 » 解决 V3s Linux 显示 starting kernel ... 就没有然后的问题 (earlyprintk) » 2019-05-13 17:12:03

2019-05-13_170940.png


2019-05-13_170716.png

CONFIG_DEBUG_UART_PHYS=0x01c25000
CONFIG_DEBUG_UART_VIRT=0xf1c25000

改成:

CONFIG_DEBUG_UART_PHYS=0x01c28000
CONFIG_DEBUG_UART_VIRT=0xf1c28000

握草, 终于搞定f1c100s 这个恼人的 earlyprintk 了,

只是基地址与 V3s 有点不同而已,

其他一模一样

#106 Re: 全志 V3S/F1C100s/X3 » 请教F1C100S的 USB Host的kernel配置 » 2019-05-13 16:46:43

https://github.com/Lichee-Pi/linux/commits/nano-4.14-exp
https://github.com/Lichee-Pi/linux/commit/44874751dbc7e112de0c78cbfb0479574cdb2332


发现 nano-4.14-exp 这个分支已经改好了 ^_^

clk: sunxi-ng: suniv: fix USB PHY gate clock bit offset

Signed-off-by: Icenowy Zheng <icenowy@aosc.io>

2019-05-13_164602.png

#107 Re: 全志 V3S/F1C100s/X3 » 请教F1C100S的 USB Host的kernel配置 » 2019-05-13 16:33:51

阿黄 说:
还能这么玩 说:

好贴火钳留名

请问楼主, 荔枝派 nano 应该如何改?

就是nano啊

好的,谢谢楼主, 一会我也试一试。

#108 Re: 全志 V3S/F1C100s/X3 » 请教F1C100S的 USB Host的kernel配置 » 2019-05-13 16:07:18

好贴火钳留名

请问楼主, 荔枝派 nano 应该如何改?

#109 Re: 全志 V3S/F1C100s/X3 » linux内核启动过程中没有看到分区标信息 » 2019-05-13 16:04:56

果然有坑, 搜来搜去又搜到坑网,


应该是这样:
CONFIG_SPI_SUN6I 


而不是这样:
CONFIG_SUN6I_SPI





笑哭.gif


还好终于把问题解决了, 都差点要卷铺盖了 ....

#111 Re: 计算机图形/GUI/RTOS/FileSystem » TouchGfx在Ubuntu16.04下基于SDL2编译和运行 » 2019-04-23 17:42:33

sy373466062 说:

这个GUI的License是怎么样的? 商用收费吗?

我记得是非 ST 平台收费吧.

#114 Re: DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/ » zynq u-boot 启动会自动读取 uEnv.txt 的跟踪 » 2019-04-23 14:57:40

参考这个帖子: https://whycan.cn/t_2297.html

上面有脚本检测到是 sdboot (sd卡启动) 读 首分区的 uEnv.txt, 然后再把这个文件 env import 到到环境变量中去, 完成了从 uEnv.txt 环境配置。

#115 DIY/综合/Arduino/写字机/3D打印机/智能小车/平衡车/四轴飞行/ » zynq u-boot 启动会自动读取 uEnv.txt 的跟踪 » 2019-04-23 14:54:43

还能这么玩
回复: 2

arch/arm/mach-zynq/slcr.c 通过电阻跳线在寄存器读出启动 bootstrap 状态:

u32 zynq_slcr_get_boot_mode(void)
{
        /* Get the bootmode register value */
        return readl(&slcr_base->boot_mode);
}

board/xilinx/zynq/board.c 根据读到的启动选项设置环境变量 modeboot:

int board_late_init(void)
{
        switch ((zynq_slcr_get_boot_mode()) & ZYNQ_BM_MASK) {
        case ZYNQ_BM_NOR:
                setenv("modeboot", "norboot");
                break;
        case ZYNQ_BM_SD:
                setenv("modeboot", "sdboot");
                break;
        case ZYNQ_BM_JTAG:
                setenv("modeboot", "jtagboot");
                break;
        default:
                setenv("modeboot", "");
                break;
        }

        return 0;
}

include/configs/zynq-common.h 启动环境变量 preboot

/* enable preboot to be loaded before CONFIG_BOOTDELAY */
#define CONFIG_PREBOOT

include/configs/zynq-common.h 设置其他环境变量, 启动入口是 preboot 这个脚本:

/* Default environment */
#ifndef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS       \
        "fit_image=fit.itb\0"           \
        "load_addr=0x2000000\0"         \
        "fit_size=0x800000\0"           \
        "flash_off=0x100000\0"          \
        "nor_flash_off=0xE2100000\0"    \
        "fdt_high=0x20000000\0"         \
        "initrd_high=0x20000000\0"      \
        "loadbootenv_addr=0x2000000\0" \
        "bootenv=uEnv.txt\0" \
        "bootenv_dev=mmc\0" \
        "loadbootenv=load ${bootenv_dev} 0 ${loadbootenv_addr} ${bootenv}\0" \
        "importbootenv=echo Importing environment from ${bootenv_dev} ...; " \
                "env import -t ${loadbootenv_addr} $filesize\0" \
        "bootenv_existence_test=test -e ${bootenv_dev} 0 /${bootenv}\0" \
        "setbootenv=if env run bootenv_existence_test; then " \
                        "if env run loadbootenv; then " \
                                "env run importbootenv; " \
                        "fi; " \
                "fi; \0" \
        "sd_loadbootenv=set bootenv_dev mmc && " \
                        "run setbootenv \0" \
        "usb_loadbootenv=set bootenv_dev usb && usb start && run setbootenv \0" \
        "preboot=if test $modeboot = sdboot; then " \
                        "run sd_loadbootenv; " \
                        "echo Checking if uenvcmd is set ...; " \
                        "if test -n $uenvcmd; then " \
                                "echo Running uenvcmd ...; " \
                                "run uenvcmd; " \
                        "fi; " \
                "fi; \0" \
        "norboot=echo Copying FIT from NOR flash to RAM... && " \
                "cp.b ${nor_flash_off} ${load_addr} ${fit_size} && " \
                "bootm ${load_addr}\0" \
        "sdboot=echo Copying FIT from SD to RAM... && " \
                "load mmc 0 ${load_addr} ${fit_image} && " \
                "bootm ${load_addr}\0" \
        "jtagboot=echo TFTPing FIT to RAM... && " \
                "tftpboot ${load_addr} ${fit_image} && " \
                "bootm ${load_addr}\0" \
        "usbboot=if usb start; then " \
                        "echo Copying FIT from USB to RAM... && " \
                        "load usb 0 ${load_addr} ${fit_image} && " \
                        "bootm ${load_addr}; fi\0" \
                DFU_ALT_INFO
#endif

页脚

工信部备案:粤ICP备20025096号-1 Powered by FluxBB