页次: 1
......
[464]HELLO! BOOT0 is starting!
[467]BOOT0 commit : {f11f8d34}
[473]PMU: AXP8191
[475]pmu_chip_id = 14
[477]set pll start
[479]cpul clk 0xf8802700!
[483]cpub clk 0xf8802700!
[486]dsu clk 0xf8801e00!
[489]set pll end
[491]dram return write ok
[494]board init ok
[495]rtc[3] value = 0xb00f
[498]rtc[7] value = 0x2
[500]enable_jtag
[502]Driver version 0.0.9 2024.11.20 10:19
[522]Cal words efuse addr 0x60 value 0xa8830000, addr 0x64 value 0x4f1f9b62
[579]Device up at:[581][RX, TX]: gear=[4, 4], lane[2, 2], pwr[FAST MODE, FAST MODE], rate = 2
[588]sc st 2
[590]Read blk size 4096,capacity 31240191
[594]DRAM BOOT DRIVE INFO: V0.581_optim_mode1
[600]DRAM_VCC set to 560 mv
[602]DRAM CLK =2400 MHZ
[605]DRAM Type =9 (8:LPDDR4,9:LPDDR5)
[703]Training result is = 7
[705]DRAM Pstate 1 training, frequency is 1200 Mhz
[808]Training result is = 7
[811]DRAM Pstate 2 training, frequency is 800 Mhz
[999]Training result is = 7
[1002]DRAM Pstate 3 training, frequency is 400 Mhz
[1055]Training result is = 7
[1058]DRAM Pstate 0 training, frequency is 2400 Mhz
[1067]Actual DRAM SIZE =4096 M
[1070]DRAM SIZE =4096 MBytes, para1 = a10a, para2 = 10000001, dram_tpr13 = 65
[1085]DRAM simple test OK.
[1088]dram size = 4096
[1126]Loading boot-pkg Succeed(index=0).
[1130]Entry_name = u-boot
[1139]Entry_name = monitor
[1143]Entry_name = scp
[1145]error: dtb not found for scp
[1150]Jump to ATF: monitor_base = 0x48000000, uboot_base = 0x4a000000, optee_base = 0x0
NOTICE: BL31: OP-TEE 32bit detected
NOTICE: BL31: U-BOOT 32bit detected
NOTICE: BL31: v2.5(debug):9f44f15ed
NOTICE: BL31: Built : 21:09:08, Dec 23 2024
NOTICE: hardware check error1
BACKTRACE: START: bl31_platform_setup
0: EL3: 0x48003e1c
1: EL3: 0x480041fc
2: EL3: 0x480040f8
3: EL3: 0x480001f0
BACKTRACE: END: bl31_platform_setup
PANIC in EL3.
x30 = 0x0000000048004208
x0 = 0x0000000002500000
x1 = 0x0000000000000060
x2 = 0x0000000000000060
x3 = 0x00000000ffffffc8
x4 = 0x0000000000000034
x5 = 0x0000000000000034
x6 = 0x0000000000000004
x7 = 0x0000000000000000
x8 = 0x000000023fffffff
x9 = 0x0000000048013000
x10 = 0x0000000000000000
x11 = 0x0000000048000000
x12 = 0x0000000000000000
x13 = 0x0000000000000000
x14 = 0x0000000000000000
x15 = 0x0000000000000000
x16 = 0x0000000000000000
x17 = 0x0000000000048c00
x18 = 0x0000000000000020
x19 = 0x000000004800f4b4
x20 = 0x0000000000000000
x21 = 0x0000000000001903
x22 = 0x0000000000000000
x23 = 0x0000000000000000
x24 = 0x0000000000000000
x25 = 0x0000000000000000
x26 = 0x0000000000000000
x27 = 0x0000000000000000
x28 = 0x0000000000000000
x29 = 0x00000000480142c0
scr_el3 = 0x0000000000000238
sctlr_el3 = 0x0000000030cd183f
cptr_el3 = 0x0000000000000000
tcr_el3 = 0x000000008081351e
daif = 0x00000000000002c0
mair_el3 = 0x00000000004404ff
spsr_el3 = 0x00000000000001cd
elr_el3 = 0x0000000000000000
ttbr0_el3 = 0x0000000048041301
esr_el3 = 0x00000000b21e3e3f
far_el3 = 0x72fefefffbffffbf
spsr_el1 = 0x00000000000001cd
elr_el1 = 0x0000000000000000
spsr_abt = 0x00000000e0067807
spsr_und = 0x00000000e20ef80c
spsr_irq = 0x00000000681478dc
spsr_fiq = 0x00000000c00a7c0e
sctlr_el1 = 0x0000000000c50838
actlr_el1 = 0x0000000000000000
cpacr_el1 = 0x0000000000000000
csselr_el1 = 0x0000000000000000
sp_el1 = 0x0000000000000000
esr_el1 = 0x000000007f7ffffe
ttbr0_el1 = 0x0000fefec4fe7efc
ttbr1_el1 = 0x00007efeff7f7ff8
mair_el1 = 0x44e048e000098aa4
amair_el1 = 0x0000000000000000
tcr_el1 = 0x0000000000000000
tpidr_el1 = 0xfffffe7f7ffefece
tpidr_el0 = 0xdffede76fefff7fe
tpidrro_el0 = 0xf7fefbffdffff6fe
par_el1 = 0xff00000048000980
mpidr_el1 = 0x0000000081000000
afsr0_el1 = 0x0000000000000000
afsr1_el1 = 0x0000000000000000
contextidr_el1 = 0x0000000000000000
vbar_el1 = 0x0000000000000000
cntp_ctl_el0 = 0x0000000000000000
cntp_cval_el0 = 0xfffffffffefefefc
cntv_ctl_el0 = 0x0000000000000000
cntv_cval_el0 = 0xfffeffffffffdeff
cntkctl_el1 = 0x0000000000000000
sp_el0 = 0x00000000480142c0
isr_el1 = 0x0000000000000000
cpuectlr_el1 = 0x000000002808bc00
icc_hppir0_el1 = 0x00000000000003ff
icc_hppir1_el1 = 0x00000000000003ff
icc_ctlr_el3 = 0x0000000000028400
gicd_ispendr regs (Offsets 0x200-0x278)
Offset Value
0x200: 0x0000000000000000
0x208: 0x0000000000000000
0x210: 0x0000000000000000
0x218: 0x0000000000000000
0x220: 0x0000000000000000
0x228: 0x0000000000000000
0x230: 0x0000000000000000
0x238: 0x0000000000000000
0x240: 0x0000000000000000
0x248: 0x0000000000000000
0x250: 0x0000000000000000
0x258: 0x0000000000000000
0x260: 0x0000000000000000
0x268: 0x0000000000000000
0x270: 0x0000000000000000
0x278: 0x0000000000000000
我也出现了这个情况
电路极其简单,引脚使用非常极限。LED驱动电流300mA以上
https://whycan.com/files/members/1798/屏幕截图_20250507_092849-1.png
大佬,请问这个是什么单片机型号呢?
buildroot-tiny200 (F1C100/200s) 开发包近期更新内容 * 已支持DVP摄像头 *,支持SPI NAND
https://whycan.com/t_5221.html
改为 tinyplay 播放:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// 共享数据及同步变量
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static char play_filename[256] = {0};
static int play_request = 0;
extern int tinyplay(int argc, const char **argv);
void* audioplay_thread(void* arg)
{
(void)arg;
while (1)
{
pthread_mutex_lock(&mutex);
while (!play_request) {
printf("now waiting signal ...\n");
pthread_cond_wait(&cond, &mutex);
printf("signal waited!\n");
}
printf("in audio play thread\n");
play_request = 0; // 重置请求标志
pthread_mutex_unlock(&mutex);
printf("now playing: %s\n", play_filename);
const char* argv[] = {"play", play_filename};
int argc = sizeof(argv) / sizeof(argv[0]);
tinyplay(argc, argv);
//usleep(3*1000*1000);
}
}
// 初始化并启动播放线程
void init_playback_thread() {
pthread_t tid;
pthread_create(&tid, NULL, audioplay_thread, NULL);
}
// 触发播放的函数
void request_play(const char* filename) {
pthread_mutex_lock(&mutex);
strncpy(play_filename, filename, sizeof(play_filename)-1);
play_filename[sizeof(play_filename)-1] = '\0';
play_request = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
int main() {
init_playback_thread();
// 模拟其他线程触发播放
request_play("test.wav");
while(1)
{
char ch = getchar();
if((ch == 'a') || (ch == 'A')) {
request_play("/usr/lib/libreoffice/share/gallery/sounds/ok.wav");
}
}
return 0;
}
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
// 共享数据及同步变量
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static char play_filename[256] = {0};
static int play_request = 0;
void* audioplay_thread(void* arg)
{
(void)arg;
while (1)
{
pthread_mutex_lock(&mutex);
while (!play_request) {
printf("now waiting signal ...\n");
pthread_cond_wait(&cond, &mutex);
printf("signal waited!\n");
}
printf("in audio play thread\n");
play_request = 0; // 重置请求标志
pthread_mutex_unlock(&mutex);
printf("now playing: %s\n", play_filename);
usleep(3*1000*1000);
}
}
// 初始化并启动播放线程
void init_playback_thread() {
pthread_t tid;
pthread_create(&tid, NULL, audioplay_thread, NULL);
}
// 触发播放的函数
void request_play(const char* filename) {
pthread_mutex_lock(&mutex);
strncpy(play_filename, filename, sizeof(play_filename)-1);
play_filename[sizeof(play_filename)-1] = '\0';
play_request = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}
int main() {
init_playback_thread();
// 模拟其他线程触发播放
request_play("test.wav");
while(1)
{
char ch = getchar();
if((ch == 'a') || (ch == 'A')) {
request_play("test.wav");
}
}
return 0;
}
大佬,"年月日"这几个字可以用中文吗?时分秒的字体可以更大一些,我打算寒假回去挂家里大厅,给我老妈用,谢谢啦。
#### 使用ALSA
如果你更喜欢使用ALSA,可以使用多个混音器来组合不同的声道。首先,确认你的声卡设备名称,然后创建一个自定义的混音器文件来组合多个声道。
1. **编辑`/etc/asound.conf`**:
创建或编辑`/etc/asound.conf`文件,定义一个新的混音器设备,将多个声卡组合在一起。例如:
pcm.multichannel {
type multi
playback_switch {
slave {
pcm "hw:0,0"
}
slave {
pcm "hw:1,0"
}
slave {
pcm "hw:2,0"
}
}
}
在这里,`hw:0,0`、`hw:1,0` 和 `hw:2,0` 分别代表三张声卡的设备名称。你需要根据实际的设备名称进行替换。
2. **设置默认PCM设备**:
确保你的系统将新创建的混音器设备设置为默认PCM设备。
### 3. 测试和调整
完成配置后,测试音频输出是否正确。你可以播放一段5.1声道的音频文件,并检查每个扬声器是否输出正确的声道声音。
### 4. 自动化脚本
为了简化每次启动时的配置过程,可以编写一个脚本来自动加载所需的PulseAudio模块或ALSA配置,并设置默认音频设备。
### 注意事项
- 确保所有声卡都正确连接并且工作正常。
- 扬声器的布线和设置也非常重要,确保每个扬声器连接到正确的输出端口。
- 由于声道映射需要精确设置,可能需要多次调整才能达到理想的效果。
通过上述步骤,你可以利用三张双声道声卡在Linux系统中实现5.1声道环绕声。
idf5.3开始支持esp32p4,官网上也有这个开发板资料
这是学多年前长城哈佛的玩法吗?一个H6玩到底
# chmod +x /tmp/lvgl_sunxifb && /tmp/lvgl_sunxifb 0
wh=1200x1920, vwh=1200x3840, bpp=32, rotated=0
Turn on double buffering.
Turn on 2d hardware acceleration.
Turn on 2d hardware acceleration rotate.
Error: sunxifb_g2d_blit_to_fb G2D_CMD_BITBLT_H failed: Operation not permitted
sunxifb_g2d_blit_to_fb src[phy=0x1200000 format=0 alpha=255 wh=[1200 1920] clip=[0 0 1200 1920]] dst=[phy=(nil) format=0 wh=[1200 3840] clip=[0 0 1200 1920]]
Error: sunxifb_g2d_blit_to_fb G2D_CMD_BITBLT_H failed: Operation not permitted
sunxifb_g2d_blit_to_fb src[phy=0x1200000 format=0 alpha=255 wh=[1200 1920] clip=[0 0 1200 1920]] dst=[phy=(nil) format=0 wh=[1200 3840] clip=[0 1920 1200 1920]]
Error: sunxifb_g2d_blit_to_fb G2D_CMD_BITBLT_H failed: Operation not permitted
sunxifb_g2d_blit_to_fb src[phy=0x1200000 format=0 alpha=255 wh=[1200 1920] clip=[0 0 1200 1920]] dst=[phy=(nil) format=0 wh=[1200 3840] clip=[0 0 1200 1920]]
Error: sunxifb_g2d_blit_to_fb G2D_CMD_BITBLT_H failed: Operation not permitted
sunxifb_g2d_blit_to_fb src[phy=0x1200000 format=0 alpha=255 wh=[1200 1920] clip=[0 0 1200 1920]] dst=[phy=(nil) format=0 wh=[1200 3840] clip=[0 1920 1200 1920]]
其中用的json解析器: https://github.com/DaveGamble/cJSON
闲鱼捡漏,拆解一台收银机【多图警告,流量党劝退】
https://whycan.com/t_3424.html
fdt set /soc@03000000/lcd0@01c0c000/ lcd_x <1024>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_y <400>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_dclk_freq <35>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_hbp <170>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_ht <1344>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_hspw <20>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vbp <20>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vt <435>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vspw <5>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_x <1024>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_y <600>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_dclk_freq <52>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_hbp <170>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_ht <1364>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_hspw <10>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vbp <20>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vt <635>
fdt set /soc@03000000/lcd0@01c0c000/ lcd_vspw <5>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#define WIDTH 480
#define HEIGHT 480
#define BYTES_PER_PIXEL 4
int main() {
int fb = open("/dev/fb0", O_RDWR);
if (fb == -1) {
perror("Unable to open framebuffer");
return 1;
}
struct fb_var_screeninfo vinfo;
ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);
printf("vinfo.xres=%d, vinfo.yres=%d\n", vinfo.xres, vinfo.yres);
printf("vinfo.xres_virtual=%d, vinfo.yres_virtual=%d\n", vinfo.xres_virtual, vinfo.yres_virtual);
ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);
unsigned char *fbp = mmap(0, vinfo.yres_virtual * vinfo.xres * BYTES_PER_PIXEL, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
// 填充第一个缓冲区
for (int y = 0; y < vinfo.yres; y++)
for (int x = 0; x < vinfo.xres; x++)
*((unsigned long*)(fbp + 4*x + 4*y*vinfo.xres)) = 0xFF00FFFF;
// 填充第二个缓冲区
for (int y = vinfo.yres; y < 2*vinfo.yres; y++)
for (int x = 0; x < vinfo.xres; x++)
*((unsigned long*)(fbp + 4*x + 4*y*vinfo.xres)) = 0xFFFF00FF;
int i = 0;
while(1)
{
// 切换到第二个缓冲区
vinfo.yoffset = (i++%2)*HEIGHT;
printf("vinfo.yoffset = %d\n", vinfo.yoffset);
if(0 != ioctl(fb, FBIOPAN_DISPLAY, &vinfo))
{
printf("fb iopan display error.\n");
}
sleep(1);
}
munmap(fbp, vinfo.yres_virtual * vinfo.xres * BYTES_PER_PIXEL);
close(fb);
return 0;
}
=> fdt list /soc@03000000/pinctrl@02000000/gmac0@0/
gmac0@0 {
allwinner,pins = "PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6", "PE7", "PE8", "PE9", "PE10", "PE11", "PE12", "PE13", "PE14", "PE15";
allwinner,function = "rgmii";
allwinner,drive = "0";
allwinner,muxsel = <0x00000003>;
allwinner,pull = <0x00000000>;
linux,phandle = <0x00000097>;
phandle = <0x00000097>;
};
=>
=>
=>
=> fdt set /soc@03000000/pinctrl@02000000/gmac0@0/ allwinner,drive 3
=>
=>
=> fdt list /soc@03000000/pinctrl@02000000/gmac0@0/
gmac0@0 {
allwinner,pins = "PE0", "PE1", "PE2", "PE3", "PE4", "PE5", "PE6", "PE7", "PE8", "PE9", "PE10", "PE11", "PE12", "PE13", "PE14", "PE15";
allwinner,function = "rgmii";
allwinner,drive = "3";
allwinner,muxsel = <0x00000003>;
allwinner,pull = <0x00000000>;
linux,phandle = <0x00000097>;
phandle = <0x00000097>;
};
=>
https://www.cnblogs.com/hylife/p/17340965.html
全志Uboot fdt修改DTS进行临时调试的方法
https://bbs.16rd.com/thread-587397-1-1.html
全志怎么没出RK这种测试工具呢?
root@OpenWrt:/#
root@OpenWrt:/# reboot
root@OpenWrt:/# [ 131.812780] br-lan: port 1(eth0) entered disabled state
[ 131.825385] device eth0 left promiscuous mode
[ 131.830628] br-lan: port 1(eth0) entered disabled state
[ 131.846463] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 136.189181] sunxi-mmc sdc2: sdc set ios:clk 0Hz bm PP pm OFF vdd 0 width 1 timing LEGACY(SDR12) dt B
[ 136.200895] [alarmtimer] have no shutdown alarm! alarmtimer_shutdown 322
[ 137.161378] reboot: Restarting system
make package/feeds/packages/canutils/compile V=s
make[1]: Entering directory '/opt2/openwrt/openwrt_v3s_can_gateway'
make[2]: Entering directory '/opt2/openwrt/openwrt_v3s_can_gateway/package/libs/toolchain'
echo "libc" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/toolchain.default.install
echo "libgcc" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/toolchain.default.install
echo "libpthread" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/toolchain.default.install
echo "librt" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/toolchain.default.install
make[2]: Leaving directory '/opt2/openwrt/openwrt_v3s_can_gateway/package/libs/toolchain'
time: package/libs/toolchain/compile#0.12#0.04#0.16
make[2]: Entering directory '/opt2/openwrt/openwrt_v3s_can_gateway/feeds/packages/utils/canutils'
mkdir -p /opt2/openwrt/openwrt_v3s_can_gateway/dl
SHELL= flock /opt2/openwrt/openwrt_v3s_can_gateway/tmp/.canutils-2017-02-16-cb33a557.tar.xz.flock -c ' /opt2/openwrt/openwrt_v3s_can_gateway/scripts/download.pl "/opt2/openwrt/openwrt_v3s_can_gateway/dl" "canutils-2017-02-16-cb33a557.tar.xz" "d9c01eeff3d81a28161ca5c3937ec005a1f49ca3eb97bee0164d53cc66365786" "" || ( /opt2/openwrt/openwrt_v3s_can_gateway/scripts/dl_github_archive.py --dl-dir="/opt2/openwrt/openwrt_v3s_can_gateway/dl" --url="https://github.com/linux-can/can-utils" --version="cb33a55720716cbe01e6025a2bda74a1b7e492d3" --subdir="canutils-2017-02-16-cb33a557" --source="canutils-2017-02-16-cb33a557.tar.xz" --hash="d9c01eeff3d81a28161ca5c3937ec005a1f49ca3eb97bee0164d53cc66365786" || ( echo "Checking out files from the git repository..."; mkdir -p /opt2/openwrt/openwrt_v3s_can_gateway/tmp/dl && cd /opt2/openwrt/openwrt_v3s_can_gateway/tmp/dl && rm -rf canutils-2017-02-16-cb33a557 && [ \! -d canutils-2017-02-16-cb33a557 ] && git clone https://github.com/linux-can/can-utils canutils-2017-02-16-cb33a557 && (cd canutils-2017-02-16-cb33a557 && git checkout cb33a55720716cbe01e6025a2bda74a1b7e492d3 && git submodule update --init --recursive) && echo "Packing checkout..." && export TAR_TIMESTAMP=`cd canutils-2017-02-16-cb33a557 && git log -1 --format='\''@%ct'\''` && rm -rf canutils-2017-02-16-cb33a557/.git && tar --numeric-owner --owner=0 --group=0 --mode=a-s --sort=name ${TAR_TIMESTAMP:+--mtime="$TAR_TIMESTAMP"} -c canutils-2017-02-16-cb33a557 | xz -zc -7e > /opt2/openwrt/openwrt_v3s_can_gateway/tmp/dl/canutils-2017-02-16-cb33a557.tar.xz && mv /opt2/openwrt/openwrt_v3s_can_gateway/tmp/dl/canutils-2017-02-16-cb33a557.tar.xz /opt2/openwrt/openwrt_v3s_can_gateway/dl/ && rm -rf canutils-2017-02-16-cb33a557; ); ) '
echo "canutils" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/canutils.default.install
echo "canutils-candump" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/canutils.default.install
echo "canutils-cansend" >> /opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/pkginfo/canutils.default.install
make[2]: Leaving directory '/opt2/openwrt/openwrt_v3s_can_gateway/feeds/packages/utils/canutils'
time: package/feeds/packages/canutils/compile#0.95#0.49#1.42
make[1]: Leaving directory '/opt2/openwrt/openwrt_v3s_can_gateway'
这个正常
Configuring luci.
Configuring luci-i18n-opkg-zh-cn.
Configuring procps-ng-top.
Configuring luci-i18n-opkg-en.
Configuring luci-i18n-base-en.
Configuring procps-ng-pmap.
Configuring kmod-ipt-offload.
Configuring urngd.
Configuring procps-ng-pgrep.
Configuring luci-i18n-firewall-zh-cn.
Configuring ppp-mod-pppoe.
Configuring canutils-candump.
Collected errors:
* satisfy_dependencies_for: Cannot satisfy the following dependencies for ip-full:
* libcap
* opkg_install_cmd: Cannot install package ip-full.
package/Makefile:65: recipe for target 'package/install' failed
make[2]: *** [package/install] Error 255
make[2]: Leaving directory '/opt2/openwrt/openwrt_v3s_can_gateway'
package/Makefile:108: recipe for target '/opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/stamp/.package_install' failed
make[1]: *** [/opt2/openwrt/openwrt_v3s_can_gateway/staging_dir/target-arm_cortex-a7+neon-vfpv4_musl_eabi/stamp/.package_install] Error 2
make[1]: Leaving directory '/opt2/openwrt/openwrt_v3s_can_gateway'
/opt2/openwrt/openwrt_v3s_can_gateway/include/toplevel.mk:225: recipe for target 'world' failed
make: *** [world] Error 2[/b]
[b]real 6m44.278s
user 5m32.328s
sys 1m35.930s
#
咦,编译错误了
这个aic8800 的wlan0 没法加入br0
# brctl addif br0 wlan0
can't add wlan0 to bridge br0: Operation not supported
查了一下
这个错误可能是由于你尝试将一个无线接口(wlan0)添加到网桥,但是许多无线设备并不支持这种操作。这是由于802.11 WiFi规定的限制和驱动程序实现的问题。
一种可能的解决方案是将无线接口设置为四层(IP层)而非二层(以太网层)的转发模式。你可以使用Linux的网络地址转换(NAT)功能或者IP路由来实现这个目标。例如,你可以使用iptables和netfilter来配置NAT和防火墙规则,从而允许通过wlan0接收到的数据包在eth0和其他接口之间转发。
另外一个方法是使用第三方工具,如hostapd,它可以将无线网卡设置为AP模式(如果硬件支持),然后创建一个虚拟的有线接口,并将该接口加入到网桥。
需要注意的是,具体的解决方案取决于你的具体需求和环境,包括你的硬件、驱动程序、网络环境和安全需求等因素。
感觉可能是驱动问题。
之前是电子工程师,现在失业送外卖,不过送外卖也没单。没外挂只能吃西北风了
楼主是搞笑的吗?
试一试这个方案:
投屏软件scrcpy在Linux上的移植(porting scrcpy to linux)
https://whycan.com/t_2736.html#p22190
哇酷小二 说:都不是的话,试一试这个:
成功了,还可以鼠标控制,太牛了https://whycan.com/files/members/5129/微信截图_20230917192134.png
6666
分享一下怎么弄出来的
#include "lvgl/lvgl.h"
#define DOUBLE_CLICK_TIME_MS 300 // 双击事件的最大时间间隔(毫秒)
static uint32_t last_click_time = 0;
static void btn_event_cb(lv_obj_t * obj, lv_event_t event)
{
if (event == LV_EVENT_SHORT_CLICKED) {
uint32_t now = lv_tick_get();
if ((now - last_click_time) < DOUBLE_CLICK_TIME_MS) {
printf("Double click!\n");
last_click_time = 0;
}
else {
printf("Single click.\n");
last_click_time = now;
}
}
}
int main(void)
{
lv_init();
// 创建一个按钮控件
lv_obj_t * btn = lv_btn_create(lv_scr_act(), NULL);
// 设置按钮的单击事件回调函数
lv_obj_set_event_cb(btn, btn_event_cb);
while(1) {
lv_task_handler(); // 处理 LVGL 任务
}
return 0;
}
在上面的示例中,当按钮被单击时,btn_event_cb() 回调函数会被触发,并检查两次事件之间的时间间隔。如果小于固定时间间隔,则输出 "Double click!",否则输出 "Single click."。
请注意,本示例代码使用了 lv_tick_get() 函数来获取当前系统时间,该函数需要您配置并启用 LVGL 的计时器(在 lv_conf.h 中进行配置)。另外,您可以通过修改 DOUBLE_CLICK_TIME_MS 宏来自定义双击事件的时间间隔。
static void drag_event_handler(lv_event_t * e)
{
lv_obj_t * obj = lv_event_get_target(e);
lv_indev_t * indev = lv_indev_get_act();
lv_point_t vect;
lv_indev_get_vect(indev, &vect);
lv_coord_t x = lv_obj_get_x(obj) + vect.x;
lv_coord_t y = lv_obj_get_y(obj) + vect.y;
lv_obj_set_pos(obj, x, y);
}
/**
* Make an object dragable.
*/
void lv_example_obj_2(void)
{
lv_obj_t * obj;
obj = lv_obj_create(lv_scr_act());
lv_obj_set_size(obj, 150, 100);
lv_obj_add_event_cb(obj, drag_event_handler, LV_EVENT_PRESSING, NULL);
lv_obj_t * label = lv_label_create(obj);
lv_label_set_text(label, "Drag me");
lv_obj_center(label);
}
拖拽屏幕上面的控件
Download new driver file m25p80.c
diff the origin m25p80.c and my m25p80.c
64,66d63
< /* Used for Winbond flashes only. */
< #define OPCODE_WINBOND_ID 0x4b /* Get flash unique id */
<
1001,1016d997
< /* flash unique id probe */
< static int unique_id_prob(struct spi_device *spi, u8 *id)
< {
< int tmp;
< u8 code[5];
<
< code[0] = OPCODE_WINBOND_ID;
< tmp = spi_write_then_read(spi, &code, 5, id, 8);
< if (tmp < 0) {
< pr_debug("%s: error %d reading UNIQUE ID\n",
< dev_name(&spi->dev), tmp);
< return tmp;
< }
< return 0;
< }
<
1125,1136d1105
< /* show unique id in kernel debug log for w25q64 or w25q128. */
< if(info->jedec_id == 0xef4017 || info->jedec_id == 0xef4018) {
< u8 unique_id[8];
< if(!unique_id_prob(spi, unique_id)) {
< dev_warn(&spi->dev, "flash id: %02x%02x%02x%02x%02x%02x%02x%02x\n",
< unique_id[7], unique_id[6], unique_id[5], unique_id[4],
< unique_id[3], unique_id[2], unique_id[1], unique_id[0]);
< } else {
< dev_warn(&spi->dev, "failed to get flash unique id.\n");
< }
< }
<
else if(code == LV_EVENT_PRESSED) {
colorwheel->last_change_time = lv_tick_get();
lv_indev_get_point(lv_indev_get_act(), &colorwheel->last_press_point);
res = double_click_reset(obj);
if(res != LV_RES_OK) return;
}
else if(code == LV_EVENT_PRESSING) {
lv_indev_t * indev = lv_indev_get_act();
if(indev == NULL) return;
lv_indev_type_t indev_type = lv_indev_get_type(indev);
lv_point_t p;
if(indev_type == LV_INDEV_TYPE_ENCODER || indev_type == LV_INDEV_TYPE_KEYPAD) {
p.x = obj->coords.x1 + lv_obj_get_width(obj) / 2;
p.y = obj->coords.y1 + lv_obj_get_height(obj) / 2;
}
else {
lv_indev_get_point(indev, &p);
}
lv_coord_t drag_limit = indev->driver->scroll_limit;
if((LV_ABS(p.x - colorwheel->last_press_point.x) > drag_limit) ||
(LV_ABS(p.y - colorwheel->last_press_point.y) > drag_limit)) {
colorwheel->last_change_time = lv_tick_get();
colorwheel->last_press_point.x = p.x;
colorwheel->last_press_point.y = p.y;
}
p.x -= obj->coords.x1;
p.y -= obj->coords.y1;
/*Ignore pressing in the inner area*/
uint16_t w = lv_obj_get_width(obj);
int16_t angle = 0;
lv_coord_t cir_w = lv_obj_get_style_arc_width(obj, LV_PART_MAIN);
LVGL双击实现 double click
lv_obj_t* slider1;
lv_obj_t *label1, *label2;
void button_event_cb(lv_event_t* e)
{
lv_slider_set_value(slider1, 100, LV_ANIM_OFF);
}
void slider_event_cb(lv_event_t* e)
{
int32_t value = lv_slider_get_value(slider1);
char valueStr[32];
value = lv_slider_get_left_value(slider1);
snprintf(valueStr, sizeof(valueStr), "%d", value);
lv_label_set_text(label1, (valueStr));
value = lv_slider_get_value(slider1);
snprintf(valueStr, sizeof(valueStr), "%d", value);
lv_label_set_text(label2, (valueStr));
}
void lv_demo_test2()
{
slider1 = lv_slider_create(lv_scr_act());
lv_obj_center(slider1);
lv_slider_set_range(slider1, -255, 255);
lv_slider_set_mode(slider1, LV_SLIDER_MODE_RANGE);
lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
label1 = lv_label_create(lv_scr_act());
label2 = lv_label_create(lv_scr_act());
lv_obj_align_to(label1, slider1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
lv_obj_align_to(label2, slider1, LV_ALIGN_OUT_BOTTOM_RIGHT, 0, 10);
lv_slider_set_left_value(slider1, -100, LV_ANIM_OFF);
lv_slider_set_value(slider1, 100, LV_ANIM_OFF);
lv_obj_set_size(slider1, 20, 200);
lv_obj_t* button1 = lv_btn_create(lv_scr_act());
lv_obj_t* label3 = lv_label_create(button1);
lv_label_set_text(label3, "Test");
lv_obj_add_event_cb(button1, button_event_cb, LV_EVENT_CLICKED, NULL);
lv_obj_align_to(button1, slider1, LV_ALIGN_OUT_BOTTOM_MID, 0, 30);
}
lv_obj_t* slider1;
lv_obj_t *label1, *label2;
void slider_event_cb(lv_event_t* e)
{
int32_t value = lv_slider_get_value(slider1);
char valueStr[32];
value = lv_slider_get_left_value(slider1);
snprintf(valueStr, sizeof(valueStr), "%d", value);
lv_label_set_text(label1, (valueStr));
value = lv_slider_get_value(slider1);
snprintf(valueStr, sizeof(valueStr), "%d", value);
lv_label_set_text(label2, (valueStr));
}
void lv_demo_test2()
{
slider1 = lv_slider_create(lv_scr_act());
lv_obj_center(slider1);
lv_slider_set_range(slider1, -255, 255);
lv_slider_set_mode(slider1, LV_SLIDER_MODE_RANGE);
lv_obj_add_event_cb(slider1, slider_event_cb, LV_EVENT_VALUE_CHANGED, NULL);
label1 = lv_label_create(lv_scr_act());
label2 = lv_label_create(lv_scr_act());
lv_obj_align_to(label1, slider1, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 10);
lv_obj_align_to(label2, slider1, LV_ALIGN_OUT_BOTTOM_RIGHT, 0, 10);
}
static lv_indev_drv_t pointer_driver;
lv_indev_drv_init(&pointer_driver);
pointer_driver.type = LV_INDEV_TYPE_POINTER;
pointer_driver.read_cb = lv_win32_pointer_driver_read_callback;
pointer_driver.feedback_cb = btn_feedback_event_cb;
lv_win32_pointer_device_object = lv_indev_drv_register(&pointer_driver);
void btn_feedback_event_cb(lv_indev_drv_t* indev_drv, lv_event_code_t event)
{
printf("btn_feedback_event_cb\n");
switch (event)
{
case LV_EVENT_PRESSED:
printf("Pressed\n");
break;
case LV_EVENT_SHORT_CLICKED:
printf("Short clicked\n");
break;
case LV_EVENT_CLICKED:
printf("Clicked\n");
break;
case LV_EVENT_LONG_PRESSED:
printf("Long press\n");
break;
case LV_EVENT_LONG_PRESSED_REPEAT:
printf("Long press repeat\n");
break;
case LV_EVENT_RELEASED:
printf("Released\n");
break;
default:
printf("nothing\n");
break;
}
}
1个G的片上内存!也是人才啊,,,话说这个芯片在网上怎么找不到相关的资料?是最新出的吗?
SW106 手册: SW106_Datasheet V1.0.pdf
#define CAN0 0x02504000
#define CAN1 0x02504400
#define CAN_OFFSET(can_base,offset) (*((volatile uint32_t *)(can_base + (offset))))
#define CAN_MSEL(can_base) CAN_OFFSET(can_base,0x0000) //CAN mode select register
#define CAN_CMD(can_base) CAN_OFFSET(can_base,0x0004) //CAN command register
#define CAN_STA(can_base) CAN_OFFSET(can_base,0x0008) //CAN status register
#define CAN_INT(can_base) CAN_OFFSET(can_base,0x000C) //CAN interrupt register
#define CAN_INTEN(can_base) CAN_OFFSET(can_base,0x0010) //CAN interrupt enable register
#define CAN_BUSTIME(can_base) CAN_OFFSET(can_base,0x0014) //CAN bus timing register
#define CAN_TEWL(can_base) CAN_OFFSET(can_base,0x0018) //CAN TX error warning limit register
#define CAN_ERRC(can_base) CAN_OFFSET(can_base,0x001c) //CAN error counter register
#define CAN_RMCNT(can_base) CAN_OFFSET(can_base,0x0020) //CAN receive message counter register
#define CAN_RBUF_SADDR(can_base) CAN_OFFSET(can_base,0x0024) //CAN receive buffer start address register
#define CAN_TRBUF0(can_base) CAN_OFFSET(can_base,0x0040) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF1(can_base) CAN_OFFSET(can_base,0x0044) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF2(can_base) CAN_OFFSET(can_base,0x0048) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF3(can_base) CAN_OFFSET(can_base,0x004c) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF4(can_base) CAN_OFFSET(can_base,0x0050) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF5(can_base) CAN_OFFSET(can_base,0x0054) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF6(can_base) CAN_OFFSET(can_base,0x0058) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF7(can_base) CAN_OFFSET(can_base,0x005c) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF8(can_base) CAN_OFFSET(can_base,0x0060) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF9(can_base) CAN_OFFSET(can_base,0x0064) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF10(can_base) CAN_OFFSET(can_base,0x0068) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF11(can_base) CAN_OFFSET(can_base,0x006c) //CAN TX/RX message buffer 0 register
#define CAN_TRBUF12(can_base) CAN_OFFSET(can_base,0x0070) //CAN TX/RX message buffer 0 register
#define CAN_ACPC(can_base) CAN_OFFSET(can_base,0x0028) //CAN acceptance code 0 register(reset mode)
#define CAN_ACPM(can_base) CAN_OFFSET(can_base,0x002C) //CAN acceptance mask 0 register(reset mode)
#define CAN_RBUF_RBACK(can_base) CAN_OFFSET(can_base,0x0180) //~0x1b0 //CAN transmit buffer for read back register
#define CAN_VERSION(can_base) CAN_OFFSET(can_base,0x0300) //CAN Version Register
typedef struct _t113_can_control_t_
{
volatile uint32_t * can_clk_gate;
uint32_t can_base;
uint32_t int_id;
}t113_can_control_t;
t113_can_control_t t113_can[2] =
{
{
(volatile uint32_t *)0x0200192C,
0x02504000,
53
},
{
(volatile uint32_t *)0x0200192C,
0x02504400,
54
}
};
uint32_t rxd_buf[13];
void t113_can_irq_handle(void* p)
{
uint32_t can_base = (uint32_t) p;
uint32_t int_sta = CAN_INT(can_base);
if(int_sta & 1)
{
/* 接收中断 */
can_read_data(can_base,rxd_buf);
/* 后续处理 */
}
if(int_sta & 2 )
{
/*发送中断*/
}
if(int_sta & 0xFC )
{
/* 错 误 中断 */
}
CAN_INT(can_base) = int_sta;
}
void ini_can(int can_id)
{
if(can_id > 1) return;
GPIOB->CFG0 &= ~(0xff00 << (can_id * 8));
GPIOB->CFG0 |= (0x8800 << (can_id * 8));
GPIOB->DRV0 |= (0x3300 << (can_id * 8));
t113_can_control_t * can_info = &t113_can[can_id];
uint32_t can_base = can_info->can_base;
int can_int_id = can_info->int_id;
*can_info->can_clk_gate |= (1 << (16 + can_id)) | (1 << can_id);/* CCU_CAN_BGR */
CAN_MSEL(can_base) |= 1; /* Reset mode selected*/
/* 500KHz CAN速率 */
CAN_BUSTIME(can_base) = (9 /* apb_clk = 100Mz , 100/10 = 10MHz*/
| (1 << 14) /* Synchronization Jump Width :2 Tq clock cycles */
| (13 << 16) /*Phase Segment 1 : 14 Tq clock cycles */
| ( 3 << 20) /*Phase Segment 2 : 4 Tq clock cycles */
| ( 0 << 23)); /* Bus line is sampled three times at the sample point */
CAN_ACPC(can_base) = 0xffffffff; /*实际使用时根据需要设置滤波*/
CAN_ACPM(can_base) = 0xffffffff; /*实际使用时根据需要设置滤波*/
CAN_MSEL(can_base) &= (~1);
// CAN_MSEL(can_base) |= (1 << 2); /* Loopback Mode */
CAN_MSEL(can_base) |= (1 << 3);/* Single Filter */
bsp_int_vect_set(can_int_id, /* Assign ISR handler. */
1u, /* 中断的优先级 */
1u, /* 中断的目标CPU */
(void *)can_base, /* 参数 */
t113_can_irq_handle);
irq_enable(can_int_id);//
/* 使能中断 */
CAN_INTEN(can_base) = 0x0FF;
}
void can_send_data(uint32_t can_base,uint8_t * buf,int len)
{
CAN_CMD(can_base) |= (1 << 2);
CAN_MSEL(can_base) &= (~1);
int retry = 1000;
do{
if(--retry == 0) break;
}while(!(CAN_STA(can_base) & (1 << 2)));
if(retry == 0) return;//
uint32_t * des = &CAN_TRBUF0(can_base);
for(int i = 0; i < len; i++)
des[i] = buf[i];
//CAN_CMD(can_base) = (1 << 4);
CAN_CMD(can_base) |= (1 << 0);
}
void can_read_data(uint32_t can_base,uint8_t * buf)
{
uint32_t * src = &CAN_TRBUF0(can_base);
for(int i = 0; i < 13; i++)
buf[i] = (char)src[i];
CAN_CMD(can_base) |= (1 << 2);
}
uint8_t can_teat_data[13] =
{
8,
0,
0x80,
0x55, /* SFF - TX data byte 1 / EFF- ID[12:5] */
0x55, /* SFF-TX data byte2[7:3] / EFF-ID[4:0]
SFF-TX data byte2[2:0] */
0x55, /* SFF-TX data byte 3 / EFF-TX data byte 1 */
0x55, /* SDATA4_EDATA2 SFF-TX data byte 4 / EFF-TX data byte 2 */
0x55, /* SDATA5_EDATA3 SFF-TX data byte 5 / EFF-TX data byte 3 */
0x55,/* SDATA5_EDATA4 SFF-TX data byte 6 / EFF-TX data byte 4 */
0x55,/* SDATA5_EDATA5 SFF-TX data byte 7 / EFF-TX data byte 5 */
0x55,/* SDATA5_EDATA6 SFF-TX data byte 8 / EFF-TX data byte 6 */
0x55, /* SDATA5_EDATA7 */
0x55 /* SDATA5_EDATA8 */
};
/* can_id: is 0 or 1 */
void t113_can_test(void)
{
ini_can(0);
ini_can(1);
while(1)
{
can_send_data(CAN0,can_data);
ms_delay(500);
can_send_data(CAN1,can_data);
ms_delay(500);
}
}
转载地址:
T113-S3 CAN模块使用的全部信息
https://bbs.aw-ol.com/topic/1383
cube 说:楼主优秀,可以直接用 V3x的PWM驱动电机吗?可以不用RP2040单片机吗?
可以驱动,但是2040是跑klipper固件的,开源3d打印机固件。
用上位机跑不太好,毕竟不是实时
瞄了一下代码,貌似可以直驱: https://github.com/Klipper3d/klipper/tree/master/src/linux
root@TinaLinux:/# rtk_hciattach -n -s 115200 ttyS1 rtk_h5
Realtek Bluetooth :Realtek Bluetooth init uart with init speed:115200, type:HCI UART H5
Realtek Bluetooth :Realtek hciattach version 3.1
Realtek Bluetooth :Use epoll
Realtek Bluetooth :[SYNC] Get SYNC Resp Pkt
Realtek Bluetooth :[CONFIG] Get SYNC pkt
Realtek Bluetooth :[CONFIG] Get CONFG pkt
Realtek Bluetooth :[CONFIG] Get CONFG resp pkt
Realtek Bluetooth :dic is 1, cfg field 0x14
Realtek Bluetooth :H5 init finished
Realtek Bluetooth :Realtek H5 IC
Realtek Bluetooth :Receive cmd complete event of command: 1001
Realtek Bluetooth :HCI Version 0x08
Realtek Bluetooth :HCI Revision 0x000d
Realtek Bluetooth :LMP Subversion 0x8723
Realtek Bluetooth :Receive cmd complete event of command: fc6d
Realtek Bluetooth :Read ROM version 02
Realtek Bluetooth :LMP Subversion 0x8723
Realtek Bluetooth :EVersion 2
Realtek Bluetooth :IC: RTL8723DS
Realtek Bluetooth :Firmware/config: rtl8723d_fw, rtl8723d_config
Realtek Bluetooth :Couldnt open extra config /opt/rtk_btconfig.txt, No such file or directory
Realtek Bluetooth :Couldnt access customer BT MAC file /opt/bdaddr
Realtek Bluetooth :Origin cfg len 48
Realtek Bluetooth :55 ab 23 87 2a 00 0c 00 10 02 80 92 04 50 c5 ea
Realtek Bluetooth :19 e1 1b fd af 5f 01 a4 0b d9 00 01 0f e4 00 01
Realtek Bluetooth :08 f3 00 01 0c f4 00 08 01 00 01 90 00 00 09 04
Realtek Bluetooth :Config baudrate: 04928002
Realtek Bluetooth :uart flow ctrl: 1
Realtek Bluetooth :Vendor baud from Config file: 04928002
Realtek Bluetooth :New cfg len 48
Realtek Bluetooth :55 ab 23 87 2a 00 0c 00 10 02 80 92 04 50 c5 ea
Realtek Bluetooth :19 e1 1b fd af 5f 01 a4 0b d9 00 01 0f e4 00 01
Realtek Bluetooth :08 f3 00 01 0c f4 00 08 01 00 01 90 00 00 09 04
Realtek Bluetooth :Load FW /lib/firmware/rtlbt/rtl8723d_fw OK, size 52096
Realtek Bluetooth :rtb_get_fw_project_id: opcode 0, len 1, data 9
Realtek Bluetooth :FW version 0xaa7add92, Patch num 3
Realtek Bluetooth :Chip id 0x0001
Realtek Bluetooth :Chip id 0x0002
Realtek Bluetooth :Chip id 0x0003
Realtek Bluetooth :Patch length 0x81b8
Realtek Bluetooth :Start offset 0x00004980
Realtek Bluetooth :Svn version: 20318
Realtek Bluetooth :Coexistence: BTCOEX_20180125-2323
Realtek Bluetooth :FW exists, Config file exists
Realtek Bluetooth :Total len 33256 for fwc
Realtek Bluetooth :baudrate in change speed command: 0x02 0x80 0x92 0x04
Realtek Bluetooth :Receive cmd complete event of command: fc17
Realtek Bluetooth :Received cc of vendor change baud
Realtek Bluetooth :Final speed 1500000
Realtek Bluetooth :end_idx: 131, lp_len: 244, additional pkts: 0
Realtek Bluetooth :Start downloading...
Realtek Bluetooth :Send last pkt
Realtek Bluetooth :Enable host hw flow control
Realtek Bluetooth :h5_hci_reset: Issue hci reset cmd
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth WARN: OP_HCI_RESET Transmission timeout
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth ERROR: Out-of-order packet arrived, got(6)expected(7)
Realtek Bluetooth WARN: OP_HCI_RESET Transmission timeout
Realtek Bluetooth ERROR: Retransmission exhausts
root@TinaLinux:/#
奇怪,我的 H5 勾上了 CONFIG_BT_HCIUART_3WIRE=y 也一样的。
全志D1/D1s RISC-V(基于平头哥C906) 哪吒开发板超全资料合集
https://whycan.com/t_6440.html
开发板原理图: D1哪吒开发板原理图20210224.pdf
开发板元器件标号图: D1开发板哪吒位号图20210224.pdf
$ npm install
loadDep:zxcvbn → get ▄ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
WARN engine @socket.io/redis-adapter@7.1.0: wanted: {"node":">=10.0.0"} (current: {"node":"8.10.0","npm":"3.5.2"})
WARN engine spider-detector@2.0.0: wanted: {"node":">=8.15.0","npm":">=6.9.0","yarn":">=1.17.3"} (current: {"node":"8.10.0loadDep:zxcvbn → cache ad ▄ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
WARN engine ipaddr.js@2.0.1: wanted: {"node":">= 10"} (current: {"node":"8.10.0","npm":"3.5.2"})
loadDep:zxcvbn → mapToReg ▀ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
WARN engine connect-pg-simple@7.0.0: wanted: {"node":">=12.0.0"} (current: {"node":"8.10.0","npm":"3.5.2"})
loadDep:zxcvbn → resolveW ▀ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
WARN engine connect-redis@6.0.0: wanted: {"node":">=12"} (current: {"node":"8.10.0","npm":"3.5.2"})
WARN engine html-to-text@8.1.0: wanted: {"node":">=10.23.2"} (current: {"node":"8.10.0","npm":"3.5.2"})
npm WARN deprecated request-promise-native@1.0.9: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
loadDep:zxcvbn ▐ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
WARN engine archiver@5.3.0: wanted: {"node":">= 10"} (current: {"node":"8.10.0","npm":"3.5.2"})
loadDep:zxcvbn → mapToReg ▌ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
loadDep:zxcvbn → addRemot ▐ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
npm WARN deprecated uglify-es@3.3.9: support for ECMAScript is superseded by `uglify-js` as of v3.13.0
loadDep:zxcvbn → addRemot ▐ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
loadDep:zxcvbn → mapToReg ▌ ╢███████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
npm ERR! Linux 5.4.0-90-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! node v8.10.0
npm ERR! npm v3.5.2
npm ERR! code EMISSINGARG
npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12)
npm ERR! typeerror at /usr/share/npm/lib/install/deps.js:457:7
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror at /usr/share/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror at addRequestedAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror at returnAndAddMetadata (/usr/share/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror at pickVersionFromRegistryDocument (/usr/share/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror <http://github.com/npm/npm/issues>
npm ERR! Linux 5.4.0-90-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! node v8.10.0
npm ERR! npm v3.5.2
npm ERR! code EMISSINGARG
npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12)
npm ERR! typeerror at /usr/share/npm/lib/install/deps.js:457:7
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror at /usr/share/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror at addRequestedAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror at returnAndAddMetadata (/usr/share/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror at pickVersionFromRegistryDocument (/usr/share/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror <http://github.com/npm/npm/issues>
WARN engine helmet@4.6.0: wanted: {"node":">=10.0.0"} (current: {"node":"8.10.0","npm":"3.5.2"})
npm WARN deprecated request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
WARN engine postcss@8.4.4: wanted: {"node":"^10 || ^12 || >=14"} (current: {"node":"8.10.0","npm":"3.5.2"})
WARN engine sharp@0.29.3: wanted: {"node":">=12.13.0"} (current: {"node":"8.10.0","npm":"3.5.2"})
npm ERR! Linux 5.4.0-90-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! node v8.10.0
npm ERR! npm v3.5.2
npm ERR! code EMISSINGARG
npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12)
npm ERR! typeerror at /usr/share/npm/lib/install/deps.js:457:7
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror at /usr/share/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror at addRequestedAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror at returnAndAddMetadata (/usr/share/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror at pickVersionFromRegistryDocument (/usr/share/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror <http://github.com/npm/npm/issues>
WARN engine autoprefixer@10.4.0: wanted: {"node":"^10 || ^12 || >=14"} (current: {"node":"8.10.0","npm":"3.5.2"})
WARN engine mongodb@4.2.1: wanted: {"node":">=12.9.0"} (current: {"node":"8.10.0","npm":"3.5.2"})
npm ERR! Linux 5.4.0-90-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install"
npm ERR! node v8.10.0
npm ERR! npm v3.5.2
npm ERR! code EMISSINGARG
npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12)
npm ERR! typeerror at /usr/share/npm/lib/install/deps.js:457:7
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror at /usr/share/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror at addRequestedAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror at returnAndAddMetadata (/usr/share/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror at pickVersionFromRegistryDocument (/usr/share/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror <http://github.com/npm/npm/issues>
确实值得学习,那些网络设备 br-lan, mon0 什么的以前都没见过,
[ 1021.395647] dhd_stop: Enter c31ef800
[ 1021.400934] dhd_set_mcast_list_handler: interface info not available/down
[ 1021.409582] dhdcdc_set_ioctl: SET PM to 0
[ 1021.418839] CFGP2P-ERROR) wl_cfgp2p_disable_discovery :
[ 1021.418852] do nothing, not initialized
[ 1021.428259] CFGP2P-ERROR) wl_cfgp2p_deinit_priv :
[ 1021.428264] In
[ 1021.439386] dhd_stop: Exit
[ 1021.525007] dhd_open: Enter c31ef800
[ 1021.562579] dhd_open: Exit ret=0
[ 1021.593042] dhd_set_monitor: if 0 val 1851876211,cur (null)
[ 1021.692969] dhdcdc_set_ioctl: SET PM to 0
[ 1021.785666] dhd_set_monitor: if 0 val 3,cur c248e000
[ 1021.790644] dhd_set_monitor: Mismatched params, return
[ 1198.921753] device mon0 entered promiscuous mode
[ 1618.888547] sys_check.sh (16292): drop_caches: 3
[ 2218.911067] sys_check.sh (19352): drop_caches: 3
[ 2818.921089] sys_check.sh (22296): drop_caches: 3
[ 3418.947203] sys_check.sh (25270): drop_caches: 3
[ 4019.001705] sys_check.sh (28157): drop_caches: 3
[ 4618.970054] sys_check.sh (31190): drop_caches: 3
shell 信息可以出现在 kmsg 里面是什么原理?
还有他的WIFI网卡,既可以自己做热点,又可以同时连接别的热点,不知道怎么做到的。
目前还不能通过WIFI桥接上网, 虽然在串口终端ping qq.com 正常。
U-Boot SPL 2021.07 (Nov 13 2021 - 11:49:14 +0800)
DRAM: 64 MiB
Trying to boot from MMC1
U-Boot 2021.07 (Nov 13 2021 - 11:49:14 +0800) Allwinner Technology
CPU: Allwinner V3s (SUN8I 1681)
Model: Smallwit Pi Lite
DRAM: 64 MiB
MMC: mmc@1c0f000: 0
Loading Environment from nowhere... OK
In: serial@1c28000
Out: serial@1c28000
Err: serial@1c28000
Net: No ethernet found.
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
MMC Device 1 not found
no mmc device at slot 1
SF: Detected n25q128a13 with page size 256 Bytes, erase size 4 KiB, total 16 MiB
=========================
Boot Device: mmc0
Boot Slot 0: mmc0
Boot Slot 1: spi-nor
=========================
switch to partitions #0, OK
mmc0 is current device
Booting from MMC0...
4661328 bytes read in 261 ms (17 MiB/s)
14142 bytes read in 5 ms (2.7 MiB/s)
Kernel image @ 0x40000000 [ 0x000000 - 0x472050 ]
## Flattened Device Tree blob at 40700000
Booting using the fdt blob at 0x40700000
Loading Device Tree to 416f9000, end 416ff73d ... OK
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
注意看信息,第一次是SPL,第二次才是真正的UBOOT
@cloudxxcloud
https://www.allwinnertech.com/uploads/pdf/20210803142431e6.pdfA133 / T509 的马甲
好像还有一个马甲叫 MR813 ?
objdump -T 查看动态链接库导出的函数。
$ riscv64-linux-gnu-objdump -T ./out/d1-nezha/compile_dir/target/rootfs/usr/lib/libuapi.so
./out/d1-nezha/compile_dir/target/rootfs/usr/lib/libuapi.so: file format elf64-littleriscv
DYNAMIC SYMBOL TABLE:
0000000000001970 l d .text 0000000000000000 .text
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 fprintf
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 getenv
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 munmap
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 malloc
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 fputs
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 usleep
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 mmap64
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 __errno_location
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 pthread_mutex_unlock
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 memcpy
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 strerror
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 close
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 puts
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 ioctl
0000000000000000 DO *UND* 0000000000000000 GLIBC_2.27 stderr
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 pthread_mutex_lock
0000000000000000 w DF *UND* 0000000000000000 GLIBC_2.27 __cxa_finalize
0000000000000000 w D *UND* 0000000000000000 _ITM_registerTMCloneTable
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 open64
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 strcmp
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 memset
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.27 free
0000000000005258 g DO .bss 0000000000000028 Base g_ion_mutex_alloc
0000000000001aae g DF .text 0000000000000066 Base sunxi_ion_alloc_get_viraddr_byFd
0000000000002120 g DF .text 000000000000009e Base sunxi_ion_alloc_get_total_size
00000000000023ca g DF .text 0000000000000014 Base sunxi_ion_flush_cache_all
0000000000002b0e g DF .text 00000000000000ee Base DispQueueToDisplay
0000000000002e26 g DF .text 00000000000000fa Base DispInit
00000000000021ce g DF .text 0000000000000096 Base sunxi_ion_alloc_phy2vir_cpu
0000000000001b14 g DF .text 000000000000011e Base sunxi_ion_alloc_open
00000000000023e8 g DF .text 000000000000009c Base nv_rotage90
0000000000002768 g DF .text 0000000000000074 Base DispSetRect
00000000000030d6 g DF .text 0000000000000016 Base DestroyVideoOutport
0000000000005288 g DO .bss 0000000000000030 Base mLayerStatus
000000000000232c g DF .text 0000000000000004 Base sunxi_ion_alloc_shutdown
0000000000002484 g DF .text 00000000000000a2 Base nv_rotage270
0000000000002bfc g DF .text 00000000000001ce Base DispWriteData
0000000000002350 g DF .text 000000000000007a Base sunxi_ion_alloc_close
0000000000002612 g DF .text 00000000000000d6 Base DispAllocateVideoMem
0000000000002552 g DF .text 000000000000001c Base DispGetScreenHeight
0000000000002ff6 g DF .text 000000000000002c Base disp_layer_off
000000000000252e g DF .text 0000000000000008 Base DispSetRoute
0000000000001a1e g DF .text 0000000000000004 Base sunxi_ion_alloc_setup
0000000000002330 g DF .text 0000000000000010 Base sunxi_ion_alloc_read
0000000000002f20 g DF .text 000000000000004a Base LayerClose
0000000000001a22 g DF .text 0000000000000010 Base sunxi_ion_alloc_memset
0000000000002f96 g DF .text 0000000000000034 Base DispDeinit
0000000000001e40 g DF .text 000000000000010e Base sunxi_ion_alloc_pfree
0000000000001f4e g DF .text 00000000000001d2 Base sunxi_ion_alloc_alloc_drm
0000000000002736 g DF .text 0000000000000032 Base DispSetIoctl
00000000000025da g DF .text 0000000000000038 Base DispFreeVideoMem
000000000000284c g DF .text 0000000000000090 Base DispSetEnable
0000000000002340 g DF .text 0000000000000010 Base sunxi_ion_alloc_write
00000000000021be g DF .text 0000000000000010 Base sunxi_ion_alloc_copy
0000000000002f6a g DF .text 000000000000002c Base LayerRelease
0000000000002526 g DF .text 0000000000000008 Base DispSetRotateAngel
0000000000002fca g DF .text 000000000000002c Base disp_layer_on
0000000000002dca g DF .text 000000000000005c Base LayerRequest
0000000000002536 g DF .text 000000000000001c Base DispGetScreenWidth
0000000000002264 g DF .text 000000000000008a Base sunxi_ion_alloc_get_bufferFd
0000000000003022 g DF .text 00000000000000b4 Base CreateVideoOutport
00000000000028dc g DF .text 000000000000006a Base DispSetSrcRect
0000000000005008 g DO .data 0000000000000090 Base _allocionMemOpsS
0000000000005280 g DO .bss 0000000000000008 Base g_ion_alloc_context
00000000000026e8 g DF .text 000000000000004e Base DispDequeue
00000000000023de g DF .text 000000000000000a Base GetMemAdapterOpsS
0000000000005248 g DO .bss 000000000000000c Base binfo
00000000000022ee g DF .text 000000000000003e Base sunxi_ion_alloc_flush_cache
0000000000001a32 g DF .text 000000000000007c Base sunxi_ion_alloc_vir2phy_cpu
00000000000027dc g DF .text 0000000000000070 Base DispSetZorder
0000000000001c32 g DF .text 000000000000020e Base sunxi_ion_alloc_palloc
https://blog.csdn.net/alifrank/article/details/48753105
行前肩(thp) + 行后肩(thb) = 1056
场前肩(tvp) + 场后肩(tvb) = 525
33300000/(1056*525)= 60.06fps
qianniao29 说:sblpp 说:芯片哪搞啊,万能宝木有啊
晕哥在小黄鱼有卖,买了两片还送了我一块F1C600的板子:D
太好了,求链接,我也搞个玩玩
TSC2007 I2C触摸驱动有个地方没搞明白,
为什么IRQ引脚和GPIO检测PEN引脚状态可以是同一个,
这样在 IRQ/GPIO 两种复用之间要来回切换吗?
可是驱动代码里面并没有出现这种切换。
https://github.com/torvalds/linux/blob/master/drivers/input/touchscreen/tsc2007_core.c
// SPDX-License-Identifier: GPL-2.0-only
/*
* drivers/input/touchscreen/tsc2007.c
*
* Copyright (c) 2008 MtekVision Co., Ltd.
* Kwangwoo Lee <kwlee@mtekvision.com>
*
* Using code from:
* - ads7846.c
* Copyright (c) 2005 David Brownell
* Copyright (c) 2006 Nokia Corporation
* - corgi_ts.c
* Copyright (C) 2004-2005 Richard Purdie
* - omap_ts.[hc], ads7846.h, ts_osk.c
* Copyright (C) 2002 MontaVista Software
* Copyright (C) 2004 Texas Instruments
* Copyright (C) 2005 Dirk Behme
*/
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/gpio/consumer.h>
#include <linux/input.h>
#include <linux/interrupt.h>
#include <linux/i2c.h>
#include <linux/mod_devicetable.h>
#include <linux/property.h>
#include <linux/platform_data/tsc2007.h>
#include "tsc2007.h"
int tsc2007_xfer(struct tsc2007 *tsc, u8 cmd)
{
s32 data;
u16 val;
data = i2c_smbus_read_word_data(tsc->client, cmd);
if (data < 0) {
dev_err(&tsc->client->dev, "i2c io error: %d\n", data);
return data;
}
/* The protocol and raw data format from i2c interface:
* S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
* Where DataLow has [D11-D4], DataHigh has [D3-D0 << 4 | Dummy 4bit].
*/
val = swab16(data) >> 4;
dev_dbg(&tsc->client->dev, "data: 0x%x, val: 0x%x\n", data, val);
return val;
}
static void tsc2007_read_values(struct tsc2007 *tsc, struct ts_event *tc)
{
/* y- still on; turn on only y+ (and ADC) */
tc->y = tsc2007_xfer(tsc, READ_Y);
/* turn y- off, x+ on, then leave in lowpower */
tc->x = tsc2007_xfer(tsc, READ_X);
/* turn y+ off, x- on; we'll use formula #1 */
tc->z1 = tsc2007_xfer(tsc, READ_Z1);
tc->z2 = tsc2007_xfer(tsc, READ_Z2);
/* Prepare for next touch reading - power down ADC, enable PENIRQ */
tsc2007_xfer(tsc, PWRDOWN);
}
u32 tsc2007_calculate_resistance(struct tsc2007 *tsc, struct ts_event *tc)
{
u32 rt = 0;
/* range filtering */
if (tc->x == MAX_12BIT)
tc->x = 0;
if (likely(tc->x && tc->z1)) {
/* compute touch resistance using equation #1 */
rt = tc->z2 - tc->z1;
rt *= tc->x;
rt *= tsc->x_plate_ohms;
rt /= tc->z1;
rt = (rt + 2047) >> 12;
}
return rt;
}
bool tsc2007_is_pen_down(struct tsc2007 *ts)
{
/*
* NOTE: We can't rely on the pressure to determine the pen down
* state, even though this controller has a pressure sensor.
* The pressure value can fluctuate for quite a while after
* lifting the pen and in some cases may not even settle at the
* expected value.
*
* The only safe way to check for the pen up condition is in the
* work function by reading the pen signal state (it's a GPIO
* and IRQ). Unfortunately such callback is not always available,
* in that case we assume that the pen is down and expect caller
* to fall back on the pressure reading.
*/
if (!ts->get_pendown_state)
return true;
return ts->get_pendown_state(&ts->client->dev);
}
static irqreturn_t tsc2007_soft_irq(int irq, void *handle)
{
struct tsc2007 *ts = handle;
struct input_dev *input = ts->input;
struct ts_event tc;
u32 rt;
while (!ts->stopped && tsc2007_is_pen_down(ts)) {
/* pen is down, continue with the measurement */
mutex_lock(&ts->mlock);
tsc2007_read_values(ts, &tc);
mutex_unlock(&ts->mlock);
rt = tsc2007_calculate_resistance(ts, &tc);
if (!rt && !ts->get_pendown_state) {
/*
* If pressure reported is 0 and we don't have
* callback to check pendown state, we have to
* assume that pen was lifted up.
*/
break;
}
if (rt <= ts->max_rt) {
dev_dbg(&ts->client->dev,
"DOWN point(%4d,%4d), resistance (%4u)\n",
tc.x, tc.y, rt);
rt = ts->max_rt - rt;
input_report_key(input, BTN_TOUCH, 1);
input_report_abs(input, ABS_X, tc.x);
input_report_abs(input, ABS_Y, tc.y);
input_report_abs(input, ABS_PRESSURE, rt);
input_sync(input);
} else {
/*
* Sample found inconsistent by debouncing or pressure is
* beyond the maximum. Don't report it to user space,
* repeat at least once more the measurement.
*/
dev_dbg(&ts->client->dev, "ignored pressure %d\n", rt);
}
wait_event_timeout(ts->wait, ts->stopped, ts->poll_period);
}
dev_dbg(&ts->client->dev, "UP\n");
input_report_key(input, BTN_TOUCH, 0);
input_report_abs(input, ABS_PRESSURE, 0);
input_sync(input);
if (ts->clear_penirq)
ts->clear_penirq();
return IRQ_HANDLED;
}
static irqreturn_t tsc2007_hard_irq(int irq, void *handle)
{
struct tsc2007 *ts = handle;
if (tsc2007_is_pen_down(ts))
return IRQ_WAKE_THREAD;
if (ts->clear_penirq)
ts->clear_penirq();
return IRQ_HANDLED;
}
static void tsc2007_stop(struct tsc2007 *ts)
{
ts->stopped = true;
mb();
wake_up(&ts->wait);
disable_irq(ts->irq);
}
static int tsc2007_open(struct input_dev *input_dev)
{
struct tsc2007 *ts = input_get_drvdata(input_dev);
int err;
ts->stopped = false;
mb();
enable_irq(ts->irq);
/* Prepare for touch readings - power down ADC and enable PENIRQ */
err = tsc2007_xfer(ts, PWRDOWN);
if (err < 0) {
tsc2007_stop(ts);
return err;
}
return 0;
}
static void tsc2007_close(struct input_dev *input_dev)
{
struct tsc2007 *ts = input_get_drvdata(input_dev);
tsc2007_stop(ts);
}
static int tsc2007_get_pendown_state_gpio(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
struct tsc2007 *ts = i2c_get_clientdata(client);
return gpiod_get_value(ts->gpiod);
}
static int tsc2007_probe_properties(struct device *dev, struct tsc2007 *ts)
{
u32 val32;
u64 val64;
if (!device_property_read_u32(dev, "ti,max-rt", &val32))
ts->max_rt = val32;
else
ts->max_rt = MAX_12BIT;
if (!device_property_read_u32(dev, "ti,fuzzx", &val32))
ts->fuzzx = val32;
if (!device_property_read_u32(dev, "ti,fuzzy", &val32))
ts->fuzzy = val32;
if (!device_property_read_u32(dev, "ti,fuzzz", &val32))
ts->fuzzz = val32;
if (!device_property_read_u64(dev, "ti,poll-period", &val64))
ts->poll_period = msecs_to_jiffies(val64);
else
ts->poll_period = msecs_to_jiffies(1);
if (!device_property_read_u32(dev, "ti,x-plate-ohms", &val32)) {
ts->x_plate_ohms = val32;
} else {
dev_err(dev, "Missing ti,x-plate-ohms device property\n");
return -EINVAL;
}
ts->gpiod = devm_gpiod_get_optional(dev, NULL, GPIOD_IN);
if (IS_ERR(ts->gpiod))
return PTR_ERR(ts->gpiod);
if (ts->gpiod)
ts->get_pendown_state = tsc2007_get_pendown_state_gpio;
else
dev_warn(dev, "Pen down GPIO is not specified in properties\n");
return 0;
}
static int tsc2007_probe_pdev(struct device *dev, struct tsc2007 *ts,
const struct tsc2007_platform_data *pdata,
const struct i2c_device_id *id)
{
ts->model = pdata->model;
ts->x_plate_ohms = pdata->x_plate_ohms;
ts->max_rt = pdata->max_rt ? : MAX_12BIT;
ts->poll_period = msecs_to_jiffies(pdata->poll_period ? : 1);
ts->get_pendown_state = pdata->get_pendown_state;
ts->clear_penirq = pdata->clear_penirq;
ts->fuzzx = pdata->fuzzx;
ts->fuzzy = pdata->fuzzy;
ts->fuzzz = pdata->fuzzz;
if (pdata->x_plate_ohms == 0) {
dev_err(dev, "x_plate_ohms is not set up in platform data\n");
return -EINVAL;
}
return 0;
}
static void tsc2007_call_exit_platform_hw(void *data)
{
struct device *dev = data;
const struct tsc2007_platform_data *pdata = dev_get_platdata(dev);
pdata->exit_platform_hw();
}
static int tsc2007_probe(struct i2c_client *client,
const struct i2c_device_id *id)
{
const struct tsc2007_platform_data *pdata =
dev_get_platdata(&client->dev);
struct tsc2007 *ts;
struct input_dev *input_dev;
int err;
if (!i2c_check_functionality(client->adapter,
I2C_FUNC_SMBUS_READ_WORD_DATA))
return -EIO;
ts = devm_kzalloc(&client->dev, sizeof(struct tsc2007), GFP_KERNEL);
if (!ts)
return -ENOMEM;
if (pdata)
err = tsc2007_probe_pdev(&client->dev, ts, pdata, id);
else
err = tsc2007_probe_properties(&client->dev, ts);
if (err)
return err;
input_dev = devm_input_allocate_device(&client->dev);
if (!input_dev)
return -ENOMEM;
i2c_set_clientdata(client, ts);
ts->client = client;
ts->irq = client->irq;
ts->input = input_dev;
init_waitqueue_head(&ts->wait);
mutex_init(&ts->mlock);
snprintf(ts->phys, sizeof(ts->phys),
"%s/input0", dev_name(&client->dev));
input_dev->name = "TSC2007 Touchscreen";
input_dev->phys = ts->phys;
input_dev->id.bustype = BUS_I2C;
input_dev->open = tsc2007_open;
input_dev->close = tsc2007_close;
input_set_drvdata(input_dev, ts);
input_set_capability(input_dev, EV_KEY, BTN_TOUCH);
input_set_abs_params(input_dev, ABS_X, 0, MAX_12BIT, ts->fuzzx, 0);
input_set_abs_params(input_dev, ABS_Y, 0, MAX_12BIT, ts->fuzzy, 0);
input_set_abs_params(input_dev, ABS_PRESSURE, 0, MAX_12BIT,
ts->fuzzz, 0);
if (pdata) {
if (pdata->exit_platform_hw) {
err = devm_add_action(&client->dev,
tsc2007_call_exit_platform_hw,
&client->dev);
if (err) {
dev_err(&client->dev,
"Failed to register exit_platform_hw action, %d\n",
err);
return err;
}
}
if (pdata->init_platform_hw)
pdata->init_platform_hw();
}
err = devm_request_threaded_irq(&client->dev, ts->irq,
tsc2007_hard_irq, tsc2007_soft_irq,
IRQF_ONESHOT,
client->dev.driver->name, ts);
if (err) {
dev_err(&client->dev, "Failed to request irq %d: %d\n",
ts->irq, err);
return err;
}
tsc2007_stop(ts);
/* power down the chip (TSC2007_SETUP does not ACK on I2C) */
err = tsc2007_xfer(ts, PWRDOWN);
if (err < 0) {
dev_err(&client->dev,
"Failed to setup chip: %d\n", err);
return err; /* chip does not respond */
}
err = input_register_device(input_dev);
if (err) {
dev_err(&client->dev,
"Failed to register input device: %d\n", err);
return err;
}
err = tsc2007_iio_configure(ts);
if (err) {
dev_err(&client->dev,
"Failed to register with IIO: %d\n", err);
return err;
}
return 0;
}
static const struct i2c_device_id tsc2007_idtable[] = {
{ "tsc2007", 0 },
{ }
};
MODULE_DEVICE_TABLE(i2c, tsc2007_idtable);
static const struct of_device_id tsc2007_of_match[] = {
{ .compatible = "ti,tsc2007" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, tsc2007_of_match);
static struct i2c_driver tsc2007_driver = {
.driver = {
.name = "tsc2007",
.of_match_table = tsc2007_of_match,
},
.id_table = tsc2007_idtable,
.probe = tsc2007_probe,
};
module_i2c_driver(tsc2007_driver);
MODULE_AUTHOR("Kwangwoo Lee <kwlee@mtekvision.com>");
MODULE_DESCRIPTION("TSC2007 TouchScreen Driver");
MODULE_LICENSE("GPL");
buildroot-tiny200 (F1C100/200s) 开发包近期更新内容 * 已支持DVP摄像头 *
https://whycan.com/t_5221.html#p54779
rtp@48 {
compatible = "ti,tsc2007";
reg = <0x48>;
interrupt-parent = <&pio>;
interrupts = <4 12 IRQ_TYPE_EDGE_FALLING>;
gpios = <&pio 4 12 GPIO_ACTIVE_LOW>;
pendown-gpio = <&pio 4 12 GPIO_ACTIVE_LOW>;
ti,x-plate-ohms = <660>;
wakeup-source;
status = "okay";
};
diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 5e640ae..c0b36cc 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -12,17 +12,17 @@ menuconfig INPUT_TOUCHSCREEN
if INPUT_TOUCHSCREEN
config TOUCHSCREEN_ADS7846
- tristate "ADS 7846/7843 based touchscreens"
+ tristate "ADS7846/TSC2046 and ADS7843 based touchscreens"
depends on SPI_MASTER
depends on HWMON = n || HWMON
help
Say Y here if you have a touchscreen interface using the
- ADS7846 or ADS7843 controller, and your board-specific setup
- code includes that in its table of SPI devices.
+ ADS7846/TSC2046 or ADS7843 controller, and your board-specific
+ setup code includes that in its table of SPI devices.
If HWMON is selected, and the driver is told the reference voltage
on your board, you will also get hwmon interfaces for the voltage
- (and on ads7846, temperature) sensors of this chip.
+ (and on ads7846/tsc2046, temperature) sensors of this chip.
If unsure, say N (but it's safe to say "Y").
diff --git a/drivers/input/touchscreen/ads7846.c b/drivers/input/touchscreen/ads7846.c
index 693e3b2..b0110fe 100644
--- a/drivers/input/touchscreen/ads7846.c
+++ b/drivers/input/touchscreen/ads7846.c
@@ -39,6 +39,7 @@
/*
* This code has been heavily tested on a Nokia 770, and lightly
* tested on other ads7846 devices (OSK/Mistral, Lubbock).
+ * TSC2046 is just newer ads7846 silicon.
* Support for ads7843 tested on Atmel at91sam926x-EK.
* Support for ads7845 has only been stubbed in.
*
软件上面貌似是同一个物种:
../src/mesa/tnl/t_vb_lighttmp.h:508:16: warning: 'base[0][3]' may be used uninitialized in this function [-Wmaybe-uninitialized]
Fcolor[j][3] = base[0][3];
^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:264:13: warning: 'base[0][2]' may be used uninitialized in this function [-Wmaybe-uninitialized]
(DST)[2] = (SRC)[2]; \
^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][2]' was declared here
GLfloat base[2][4];
^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:263:13: warning: 'base[0][1]' may be used uninitialized in this function [-Wmaybe-uninitialized]
(DST)[1] = (SRC)[1]; \
^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][1]' was declared here
GLfloat base[2][4];
^
In file included from ../src/mesa/tnl/t_vb_light.c:29:0:
../src/mesa/main/macros.h:262:13: warning: 'base[0][0]' may be used uninitialized in this function [-Wmaybe-uninitialized]
(DST)[0] = (SRC)[0]; \
^
In file included from ../src/mesa/tnl/t_vb_light.c:303:0:
../src/mesa/tnl/t_vb_lighttmp.h:429:12: note: 'base[0][0]' was declared here
GLfloat base[2][4];
^
[598/690] Compiling C object 'src/mesa/bbe4a73@@mesa_classic@sta/drivers_common_meta.c.o'.
In file included from ../src/mesa/drivers/common/meta.c:91:0:
../src/compiler/nir/nir.h:2463:1: warning: '__returns_nonnull__' attribute directive ignored [-Wattributes]
{
^
../src/compiler/nir/nir.h:2469:1: warning: '__returns_nonnull__' attribute directive ignored [-Wattributes]
{
^
[670/690] Linking target src/mesa/drivers/dri/libmesa_dri_drivers.so.
FAILED: src/mesa/drivers/dri/libmesa_dri_drivers.so
/opt/buildroot-2020.02.3/output/host/bin/arm-none-linux-gnueabi-g++ -o src/mesa/drivers/dri/libmesa_dri_drivers.so -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -shared -fPIC -Wl,--start-group -Wl,-soname,libmesa_dri_drivers.so -Wl,--whole-archive src/mesa/drivers/dri/swrast/libswrast_dri.a src/mesa/drivers/dri/radeon/libr100.a src/mesa/drivers/dri/nouveau/libnouveau_vieux.a -Wl,--no-whole-archive src/mesa/drivers/dri/common/libmegadriver_stub.a src/mesa/drivers/dri/common/libdricommon.a src/mapi/shared-glapi/libglapi.so.0.0.0 src/mesa/libmesa_classic.a src/compiler/glsl/libglsl.a src/compiler/glsl/glcpp/libglcpp.a src/util/libmesa_util.a src/compiler/nir/libnir.a src/compiler/libcompiler.a src/util/libxmlconfig.a -Wl,--build-id=sha1 -Wl,-Bsymbolic -Wl,--gc-sections /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm.so -lm -pthread -ldl /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libexpat.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libz.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm_radeon.so /opt/buildroot-2020.02.3/output/host/arm-buildroot-linux-gnueabi/sysroot/usr/lib/libdrm_nouveau.so -Wl,--end-group '-Wl,-rpath,$ORIGIN/common:$ORIGIN/../../../mapi/shared-glapi:$ORIGIN/../..:$ORIGIN/../../../compiler/glsl:$ORIGIN/../../../compiler/glsl/glcpp:$ORIGIN/../../../util:$ORIGIN/../../../compiler/nir:$ORIGIN/../../../compiler' -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mesa/drivers/dri/common -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mapi/shared-glapi -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/mesa -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/glsl -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/glsl/glcpp -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/util -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler/nir -Wl,-rpath-link,/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/build/src/compiler
src/mesa/drivers/dri/common/libmegadriver_stub.a(megadriver_stub.c.o): In function `megadriver_stub_init':
megadriver_stub.c:(.text.startup+0x20): undefined reference to `dladdr'
megadriver_stub.c:(.text.startup+0xb8): undefined reference to `dlsym'
collect2: error: ld returned 1 exit status
[674/690] Compiling C object 'src/egl/cb1d4f8@@EGL@sha/main_eglapi.c.o'.
ninja: build stopped: subcommand failed.
package/pkg-generic.mk:266: recipe for target '/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/.stamp_built' failed
make[1]: *** [/opt/buildroot-2020.02.3/output/build/mesa3d-19.3.4/.stamp_built] Error 1
Makefile:84: recipe for target '_all' failed
make: *** [_all] Error 2
$
$
弄了一下午,终于解决这个编译错误了
https://git.busybox.net/buildroot/commit/?id=d3f576d2f37a05275c0d25f855dc24935ff5de5c
修改: ./output/build/mesa3d-19.3.4/src/mesa/drivers/dri/meson.build
libmegadriver_stub, libdricommon, libglapi,
改为:
libdricommon, libmegadriver_stub, libglapi,
即交换编译顺序.
试一试 Ubuntu 下编译第一个 Hello World 驱动并运行
https://www.geeksforgeeks.org/linux-kernel-module-programming-hello-world-program/
hello.c:
/**
* @file hello.c
* @author Akshat Sinha
* @date 10 Sept 2016
* @version 0.1
* @brief An introductory "Hello World!" loadable kernel
* module (LKM) that can display a message in the /var/log/kern.log
* file when the module is loaded and removed. The module can accept
* an argument when it is loaded -- the name, which appears in the
* kernel log files.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
#include <linux/init.h> /* Needed for the macros */
///< The license type -- this affects runtime behavior
MODULE_LICENSE("GPL");
///< The author -- visible when you use modinfo
MODULE_AUTHOR("Akshat Sinha");
///< The description -- see modinfo
MODULE_DESCRIPTION("A simple Hello world LKM!");
///< The version of the module
MODULE_VERSION("0.1");
static int __init hello_start(void)
{
printk(KERN_INFO "Loading hello module...\n");
printk(KERN_INFO "Hello world\n");
return 0;
}
static void __exit hello_end(void)
{
printk(KERN_INFO "Goodbye Mr.\n");
}
Makefile:
obj-m = hello.o
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
编译,安装驱动,查看log:
ubuntu@ubuntu:/opt/test3$ make
make -C /lib/modules/5.4.0-42-generic/build/ M=/opt/test3 modules
make[1]: Entering directory '/usr/src/linux-headers-5.4.0-42-generic'
CC [M] /opt/test3/hello.o
Building modules, stage 2.
MODPOST 1 modules
CC [M] /opt/test3/hello.mod.o
LD [M] /opt/test3/hello.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.4.0-42-generic'
ubuntu@ubuntu:/opt/test3$
ubuntu@ubuntu:/opt/test3$ sudo insmod hello.ko
ubuntu@ubuntu:/opt/test3$
ubuntu@ubuntu:/opt/test3$ dmesg |tail -n 1
[256200.240481] Hello world
ubuntu@ubuntu:/opt/test3$
板子:ZERO V3S Linux系统
目标,linux入门,先从串口接发送开始,UBOOT等按教程已做好了,在ZERO V3S 已正常跑起来了
https://whycan.cn/t_3313.html
https://whycan.cn/t_2537.html#p19936
https://whycan.cn/t_2428.html#p19336
https://whycan.cn/t_2809.html#p22915
# insmod /mnt/udisk/hello.ko
[ 31.697182] hello: loading out-of-tree module taints kernel.
[ 31.703544] <1>Hello World
[ 31.706404] Mapped int 57
#
#
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
18: 0 0 0 0 GICv2 29 Level arch_timer
19: 370 294 146 209 GICv2 30 Level arch_timer
22: 0 0 0 0 GICv2 50 Level timer@1c20c00
23: 0 0 0 0 GICv2 82 Level 1c02000.dma-controller
24: 1175 0 0 0 GICv2 92 Level sunxi-mmc
26: 0 0 0 0 GICv2 103 Level musb-hdrc.1.auto
27: 0 0 0 0 GICv2 104 Level ehci_hcd:usb1
28: 0 0 0 0 GICv2 105 Level ohci_hcd:usb2
34: 166 0 0 0 GICv2 32 Level ttyS0
42: 0 0 0 0 GICv2 72 Level 1f00000.rtc
57: 0 0 0 0 sunxi_pio_edge 4 Edge pb4_int
62: 0 0 0 0 sunxi_pio_edge 9 Edge 1c0f000.mmc cd
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 710 836 99 271 Rescheduling interrupts
IPI3: 4 23 44 41 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Err: 0
# [ 52.420296] interrupt received (irq: 57)
[ 52.424250] gpio pin is low
[ 52.427083] interrupt received (irq: 57)
[ 52.431010] gpio pin is low
[ 52.854042] interrupt received (irq: 57)
[ 52.857980] gpio pin is low
[ 52.860807] interrupt received (irq: 57)
[ 52.864733] gpio pin is low
[ 52.886404] interrupt received (irq: 57)
[ 52.890338] gpio pin is low
[ 52.897023] interrupt received (irq: 57)
[ 52.900955] gpio pin is low
[ 52.927779] interrupt received (irq: 57)
[ 52.931710] gpio pin is low
[ 53.154994] interrupt received (irq: 57)
[ 53.158927] gpio pin is high
[ 53.161838] interrupt received (irq: 57)
[ 53.165764] gpio pin is low
[ 53.168574] interrupt received (irq: 57)
[ 53.172500] gpio pin is low
[ 53.577491] interrupt received (irq: 57)
[ 53.581424] gpio pin is high
[ 53.584343] interrupt received (irq: 57)
[ 53.588270] gpio pin is high
#
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
18: 0 0 0 0 GICv2 29 Level arch_timer
19: 512 351 156 209 GICv2 30 Level arch_timer
22: 0 0 0 0 GICv2 50 Level timer@1c20c00
23: 0 0 0 0 GICv2 82 Level 1c02000.dma-controller
24: 1579 0 0 0 GICv2 92 Level sunxi-mmc
26: 0 0 0 0 GICv2 103 Level musb-hdrc.1.auto
27: 0 0 0 0 GICv2 104 Level ehci_hcd:usb1
28: 0 0 0 0 GICv2 105 Level ohci_hcd:usb2
34: 207 0 0 0 GICv2 32 Level ttyS0
42: 0 0 0 0 GICv2 72 Level 1f00000.rtc
57: 12 0 0 0 sunxi_pio_edge 4 Edge pb4_int
62: 0 0 0 0 sunxi_pio_edge 9 Edge 1c0f000.mmc cd
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 710 897 100 271 Rescheduling interrupts
IPI3: 5 26 44 41 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 4 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Err: 0
#
试了一下 linux4.20 居然可以触发中断, 估计后面被改出问题了吧.
执行之后出现这个
zhang@ubuntu:~$ /home/zhang/buildroot-2018.08.2/output/host/bin/arm-linux-gnueabihf-g++
/home/zhang/buildroot-2018.08.2/output/host/bin/arm-linux-gnueabihf-g++.br_real: No such file or directory
zhang@ubuntu:~$
/home/zhang/buildroot-2018.08.2/output/host/bin/arm-linux-gcc
/home/zhang/buildroot-2018.08.2/output/host/bin/arm-linux-g++
再试一试这两个。
用 devmem 去读 PB_CFG0 寄存器
看是否处于中断复用?
查了一下, PB_CFG0 地址应该是 0x01C20824
insmod hello.ko 之前:
devmem 0x01C20824: 0x77477733
insmod hello.ko 之后:
devmem 0x01C20824: 0x77447733
看来这个PB4的复用应该没有错误, 只能检查别的问题了。
看来还是去 Icenowy 的仓库围观一下:
https://github.com/Icenowy/linux/commits/a33-cedrus-pr
https://github.com/torvalds/linux/blob/master/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
SUNXI_FUNCTION_IRQ_BANK(0x4, 0, 4)), /* PB_EINT4 */
改为:
SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)), /* PB_EINT4 */
也没有什么用, 向各路江湖豪杰求救!
https://github.com/torvalds/linux/blob/master/drivers/pinctrl/sunxi/pinctrl-sunxi.h#L32
#define SUNXI_PINCTRL_PIN(bank, pin) \
PINCTRL_PIN(P ## bank ## _BASE + (pin), "P" #bank #pin)
所以这个宏函数:
SUNXI_PINCTRL_PIN(B, 4)
展开应该是:
PINCTRL_PIN(PB_BASE + 4, PB4)
那么问题来了, 请教 一个#, 和两个#有什么区别呢?
PB4 用 sysfs 控制输出高低电平正常:
#PB4 = 32 + 4 = 36
echo 36 > /sys/class/gpio/export
#设置为输出
echo "out" > /sys/class/gpio/gpio36/direction
#PB4输出高电平
echo 1 > /sys/class/gpio/gpio36/value
#PB4输出低电平
echo 0 > /sys/class/gpio/gpio36/value
hello.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/input.h>
#include <linux/input-polldev.h>
#include <linux/input/touchscreen.h>
#include <linux/i2c.h>
#include <linux/gpio.h>
#include <linux/interrupt.h>
#define GPIO 36 //PG0
#define GPIO_INT_NAME "pb4_int"
#define GPIO_HIGH gpio_get_value(GPIO)
#define GPIO_LOW (gpio_get_value(GPIO) == 0)
MODULE_LICENSE("Dual BSD/GPL");
short int irq_any_gpio = 0;
int count =0;
enum { falling, rising } type;
static irqreturn_t r_irq_handler(int irq, void *dev_id)
{
count++;
printk("interrupt received (irq: %d)\n", irq);
if (irq == gpio_to_irq(GPIO))
{
type = GPIO_LOW ? falling : rising;
if(type == falling)
{
printk("gpio pin is low\n");
}
else
printk("gpio pin is high\n");
}
return IRQ_HANDLED;
}
void r_int_config(void) {
if (gpio_request(GPIO, GPIO_INT_NAME ))
{
printk("GPIO request failure: %s\n", GPIO_INT_NAME );
return;
}
if ( (irq_any_gpio = gpio_to_irq(GPIO)) < 0 ) {
printk("GPIO to IRQ mapping failure %s\n",GPIO_INT_NAME );
return;
}
printk(KERN_NOTICE "Mapped int %d\n", irq_any_gpio);
if (request_irq(irq_any_gpio,(irq_handler_t ) r_irq_handler, IRQF_TRIGGER_FALLING , GPIO_INT_NAME, NULL))
{
printk("Irq Request failure\n");
return;
}
return;
}
static void release_hello(void) {
free_irq(gpio_to_irq(GPIO), NULL);
gpio_free(GPIO);;
return;
}
static int init_hello(void)
{
printk("<1>Hello World\n");
r_int_config();
return 0;
}
module_init(init_hello); // Do some better naming
module_exit(release_hello);
Makefile
Makefile
#
# Makefile for kernel test
#
PWD := $(shell pwd)
KVERSION := $(shell uname -r)
KERNEL_DIR = /usr/src/linux-headers-$(KVERSION)/
MODULE_NAME = hello
obj-m := $(MODULE_NAME).o
all:
make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
make -C $(KERNEL_DIR) M=$(PWD) clean
编译指令:
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -C /home/ren/A33/mainline/linux/ M=${PWD} modules
安装模块:
insmod hello.ko
然后短路 PB4 & GND, 然而还是纹丝不动.
https://lore.kernel.org/patchwork/patch/934382/
这里貌似有icenowy 关于 A33/V3s 外部IO中断的 patch
https://github.com/torvalds/linux/blob/master/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
https://patchwork.kernel.org/patch/8572141/
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
index 00265f0..8b381d6 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
@@ -485,6 +485,7 @@ static const struct sunxi_pinctrl_desc sun8i_a33_pinctrl_data = {
.pins = sun8i_a33_pins,
.npins = ARRAY_SIZE(sun8i_a33_pins),
.irq_banks = 2,
+ .irq_bank_base = 1,
};
2016 的bug patch 也没有并入?
可以,我买了这个,直接可以用在荔枝派的mipi接口上,还能对焦。 https://item.taobao.com/item.htm?id=566547808242
这个貌似就是荔枝派zero 开发板用的那个封装, 这个数据线是 D0/D1/D2/D3, 上面树莓派只有 D0/D1
https://lore.kernel.org/patchwork/patch/934382/
这里貌似有icenowy 关于 A33/V3s 外部IO中断的 patch
https://github.com/torvalds/linux/blob/master/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
https://patchwork.kernel.org/patch/8572141/
diff --git a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
index 00265f0..8b381d6 100644
--- a/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
+++ b/drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c
@@ -485,6 +485,7 @@ static const struct sunxi_pinctrl_desc sun8i_a33_pinctrl_data = {
.pins = sun8i_a33_pins,
.npins = ARRAY_SIZE(sun8i_a33_pins),
.irq_banks = 2,
+ .irq_bank_base = 1,
};
2016 的bug patch 也没有并入?
原帖: https://whycan.cn/t_2393.html#p37627
我的A33 linux5.x 按 4# 的操作步奏,中断申请到了, 但是根本不触发。
arch/arm/boot/dts/sun8i-a23-a33.dtsi
pio: pinctrl@1c20800 {
/* compatible gets set in SoC specific dtsi file */
reg = <0x01c20800 0x400>;
....
key_pins: key_pins@0 {
pins = "PB5";
function = "gpio_in";
allwinner,drive = <0>;
allwinner,pull = <1>;
};
arch/arm/boot/dts/sun8i-a33.dtsi
keys{
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&key_pins>;
#address-cells = <1>;
#size-cells = <0>;
autorepeat;
g-keys_up {
label = "GPIO KEY_UP";
linux,code = <103>; /* KEY_UP, see /usr/include/linux/input-event-codes.h */
// gpios = <&pio 1 5 1>; /* PA7 GPIO_ACTIVE_LOW */
interrupt-parent = <&pio>;
interrupts = <1 5 IRQ_TYPE_EDGE_FALLING>;//PB0
};
/*status = "okay";*/
};
iio-hwmon {
compatible = "iio-hwmon";
io-channels = <&ths>;
};
根本不触发:
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
18: 0 0 0 0 GICv2 29 Level arch_timer
19: 401 1735 205 225 GICv2 30 Level arch_timer
22: 0 0 0 0 GICv2 50 Level timer@1c20c00
23: 0 0 0 0 GICv2 82 Level 1c02000.dma-controller
25: 4072 0 0 0 GICv2 92 Level sunxi-mmc
26: 0 0 0 0 GICv2 103 Level musb-hdrc.1.auto
27: 0 0 0 0 GICv2 104 Level ehci_hcd:usb1
28: 0 0 0 0 GICv2 105 Level ohci_hcd:usb2
34: 1705 0 0 0 GICv2 32 Level ttyS0
56: 0 0 0 0 sunxi_pio_edge 5 Edge GPIO KEY_UP
60: 0 0 0 0 sunxi_pio_edge 9 Edge 1c0f000.mmc cd
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 749 723 125 1223 Rescheduling interrupts
IPI3: 1 12 22 43 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Err: 0
我的A33 linux5.x 按 4# 的操作步奏,中断申请到了, 但是根本不触发。
arch/arm/boot/dts/sun8i-a23-a33.dtsi
pio: pinctrl@1c20800 {
/* compatible gets set in SoC specific dtsi file */
reg = <0x01c20800 0x400>;
....
key_pins: key_pins@0 {
pins = "PB5";
function = "gpio_in";
allwinner,drive = <0>;
allwinner,pull = <1>;
};
arch/arm/boot/dts/sun8i-a33.dtsi
keys{
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&key_pins>;
#address-cells = <1>;
#size-cells = <0>;
autorepeat;
g-keys_up {
label = "GPIO KEY_UP";
linux,code = <103>; /* KEY_UP, see /usr/include/linux/input-event-codes.h */
// gpios = <&pio 1 5 1>; /* PA7 GPIO_ACTIVE_LOW */
interrupt-parent = <&pio>;
interrupts = <1 5 IRQ_TYPE_EDGE_FALLING>;//PB0
};
/*status = "okay";*/
};
iio-hwmon {
compatible = "iio-hwmon";
io-channels = <&ths>;
};
根本不触发:
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
18: 0 0 0 0 GICv2 29 Level arch_timer
19: 401 1735 205 225 GICv2 30 Level arch_timer
22: 0 0 0 0 GICv2 50 Level timer@1c20c00
23: 0 0 0 0 GICv2 82 Level 1c02000.dma-controller
25: 4072 0 0 0 GICv2 92 Level sunxi-mmc
26: 0 0 0 0 GICv2 103 Level musb-hdrc.1.auto
27: 0 0 0 0 GICv2 104 Level ehci_hcd:usb1
28: 0 0 0 0 GICv2 105 Level ohci_hcd:usb2
34: 1705 0 0 0 GICv2 32 Level ttyS0
56: 0 0 0 0 sunxi_pio_edge 5 Edge GPIO KEY_UP
60: 0 0 0 0 sunxi_pio_edge 9 Edge 1c0f000.mmc cd
IPI0: 0 0 0 0 CPU wakeup interrupts
IPI1: 0 0 0 0 Timer broadcast interrupts
IPI2: 749 723 125 1223 Rescheduling interrupts
IPI3: 1 12 22 43 Function call interrupts
IPI4: 0 0 0 0 CPU stop interrupts
IPI5: 0 0 0 0 IRQ work interrupts
IPI6: 0 0 0 0 completion interrupts
Err: 0
https://blog.csdn.net/RUN32875094/article/details/79306256
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<openssl/rsa.h>
#include<openssl/pem.h>
#include<openssl/err.h>
#define PRIKEY "prikey.pem"
#define PUBKEY "pubkey.pem"
#define BUFFSIZE 4096
/************************************************************************
* RSA加密解密函数
*
* file: test_rsa_encdec.c
* gcc -Wall -O2 -o test_rsa_encdec test_rsa_encdec.c -lcrypto -lssl
*
* author: tonglulin@gmail.com by www.qmailer.net
************************************************************************/
char *my_encrypt(char *str, char *pubkey_path)
{
RSA *rsa = NULL;
FILE *fp = NULL;
char *en = NULL;
int len = 0;
int rsa_len = 0;
if ((fp = fopen(pubkey_path, "r")) == NULL) {
return NULL;
}
/* 读取公钥PEM,PUBKEY格式PEM使用PEM_read_RSA_PUBKEY函数 */
if ((rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL)) == NULL) {
return NULL;
}
RSA_print_fp(stdout, rsa, 0);
len = strlen(str);
rsa_len = RSA_size(rsa);
en = (char *)malloc(rsa_len + 1);
memset(en, 0, rsa_len + 1);
if (RSA_public_encrypt(rsa_len, (unsigned char *)str, (unsigned char*)en, rsa, RSA_NO_PADDING) < 0) {
return NULL;
}
RSA_free(rsa);
fclose(fp);
return en;
}
char *my_decrypt(char *str, char *prikey_path)
{
RSA *rsa = NULL;
FILE *fp = NULL;
char *de = NULL;
int rsa_len = 0;
if ((fp = fopen(prikey_path, "r")) == NULL) {
return NULL;
}
if ((rsa = PEM_read_RSAPrivateKey(fp, NULL, NULL, NULL)) == NULL) {
return NULL;
}
RSA_print_fp(stdout, rsa, 0);
rsa_len = RSA_size(rsa);
de = (char *)malloc(rsa_len + 1);
memset(de, 0, rsa_len + 1);
if (RSA_private_decrypt(rsa_len, (unsigned char *)str, (unsigned char*)de, rsa, RSA_NO_PADDING) < 0) {
return NULL;
}
RSA_free(rsa);
fclose(fp);
return de;
}
int main(int argc, char *argv[])
{
char *src = "hello, world!";
char *en = NULL;
char *de = NULL;
printf("src is: %s\n", src);
en = my_encrypt(src, PUBKEY);
printf("enc is: %s\n", en);
de= my_decrypt(en, PRIKEY);
printf("dec is: %s\n", de);
if (en != NULL) {
free(en);
}
if (de != NULL) {
free(de);
}
return 0;
}
#define CONFIG_CONS_INDEX 1 //UART0
#define CONFIG_CONS_INDEX 2 //UART1
#define CONFIG_CONS_INDEX 3 //UART2
改这个只能影响u-boot 的 spl 串口输出, 如果u-boot输出还得改 dts 文件:
diff --git a/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts b/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts
index 9c111e6228..45658d2b1d 100644
--- a/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts
+++ b/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts
@@ -15,11 +15,12 @@
aliases {
serial0 = &uart0;
+ serial2 = &uart2;
spi0 = &spi0;
};
chosen {
- stdout-path = "serial0:115200n8";
+ stdout-path = "serial2:115200n8";
};
};
@@ -47,6 +48,18 @@
status = "okay";
};
+&uart1 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart1_pins_a>;
+ status = "okay";
+};
+
+&uart2 {
+ pinctrl-names = "default";
+ pinctrl-0 = <&uart2_pins_e>;
+ status = "okay";
+};
+
&usb_otg {
dr_mode = "otg";
status = "okay";
diff --git a/arch/arm/dts/suniv.dtsi b/arch/arm/dts/suniv.dtsi
index 10da83b53a..d3b937a16d 100644
--- a/arch/arm/dts/suniv.dtsi
+++ b/arch/arm/dts/suniv.dtsi
@@ -125,6 +125,16 @@
pins = "PE0", "PE1";
function = "uart0";
};
+
+ uart1_pins_a: uart-pins-pa {
+ pins = "PA2", "PA3";
+ function = "uart1";
+ };
+
+ uart2_pins_e: uart-pins-pe-uart2 {
+ pins = "PE7", "PE8";
+ function = "uart2";
+ };
};
timer@1c20c00 {
diff --git a/arch/arm/include/asm/arch-sunxi/gpio.h b/arch/arm/include/asm/arch-sunxi/gpio.h
index b0a946d3b7..09c1a78adc 100644
--- a/arch/arm/include/asm/arch-sunxi/gpio.h
+++ b/arch/arm/include/asm/arch-sunxi/gpio.h
@@ -176,6 +176,9 @@ enum sunxi_gpio_number {
#define SUNXI_GPD_LVDS0 3
#define SUNIV_GPE_UART0 5
+#define SUNIV_GPA_UART1 5
+#define SUNIV_GPE_UART2 3
+
#define SUN5I_GPE_SDC2 3
#define SUN8I_GPE_TWI2 3
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
index 6afbb7affa..7a44996505 100644
--- a/arch/arm/mach-sunxi/board.c
+++ b/arch/arm/mach-sunxi/board.c
@@ -87,6 +87,14 @@ static int gpio_init(void)
sunxi_gpio_set_cfgpin(SUNXI_GPE(0), SUNIV_GPE_UART0);
sunxi_gpio_set_cfgpin(SUNXI_GPE(1), SUNIV_GPE_UART0);
sunxi_gpio_set_pull(SUNXI_GPE(1), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUNIV)
+ sunxi_gpio_set_cfgpin(SUNXI_GPA(2), SUNIV_GPA_UART1);
+ sunxi_gpio_set_cfgpin(SUNXI_GPA(3), SUNIV_GPA_UART1);
+ sunxi_gpio_set_pull(SUNXI_GPA(3), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUNIV)
+ sunxi_gpio_set_cfgpin(SUNXI_GPE(7), SUNIV_GPE_UART2);
+ sunxi_gpio_set_cfgpin(SUNXI_GPE(8), SUNIV_GPE_UART2);
+ sunxi_gpio_set_pull(SUNXI_GPA(8), SUNXI_GPIO_PULL_UP);
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || \
defined(CONFIG_MACH_SUN7I) || \
defined(CONFIG_MACH_SUN8I_R40))
diff --git a/include/configs/suniv.h b/include/configs/suniv.h
index cadb003f02..b1448f49d4 100644
--- a/include/configs/suniv.h
+++ b/include/configs/suniv.h
@@ -29,4 +29,7 @@
#define CONFIG_HIDE_LOGO_VERSION
+#undef CONFIG_CONS_INDEX
+#define CONFIG_CONS_INDEX 3
+
从 UART2(PE7/PE8)输出搞定!
diff --git a/arch/arm/dts/suniv.dtsi b/arch/arm/dts/suniv.dtsi
index 10da83b53a..9dd95f38e1 100644
--- a/arch/arm/dts/suniv.dtsi
+++ b/arch/arm/dts/suniv.dtsi
@@ -125,6 +125,16 @@
pins = "PE0", "PE1";
function = "uart0";
};
+
+ uart1_pins_a: uart-pins-pa {
+ pins = "PA2", "PA3";
+ function = "uart1";
+ };
+
+ uart2_pins_a: uart-pins-pe-uart2 {
+ pins = "PE7", "PE8";
+ function = "uart2";
+ };
};
timer@1c20c00 {
diff --git a/arch/arm/include/asm/arch-sunxi/gpio.h b/arch/arm/include/asm/arch-sunxi/gpio.h
index b0a946d3b7..09c1a78adc 100644
--- a/arch/arm/include/asm/arch-sunxi/gpio.h
+++ b/arch/arm/include/asm/arch-sunxi/gpio.h
@@ -176,6 +176,9 @@ enum sunxi_gpio_number {
#define SUNXI_GPD_LVDS0 3
#define SUNIV_GPE_UART0 5
+#define SUNIV_GPA_UART1 5
+#define SUNIV_GPE_UART2 3
+
#define SUN5I_GPE_SDC2 3
#define SUN8I_GPE_TWI2 3
diff --git a/arch/arm/mach-sunxi/board.c b/arch/arm/mach-sunxi/board.c
index 6afbb7affa..7a44996505 100644
--- a/arch/arm/mach-sunxi/board.c
+++ b/arch/arm/mach-sunxi/board.c
@@ -87,6 +87,14 @@ static int gpio_init(void)
sunxi_gpio_set_cfgpin(SUNXI_GPE(0), SUNIV_GPE_UART0);
sunxi_gpio_set_cfgpin(SUNXI_GPE(1), SUNIV_GPE_UART0);
sunxi_gpio_set_pull(SUNXI_GPE(1), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 2 && defined(CONFIG_MACH_SUNIV)
+ sunxi_gpio_set_cfgpin(SUNXI_GPA(2), SUNIV_GPA_UART1);
+ sunxi_gpio_set_cfgpin(SUNXI_GPA(3), SUNIV_GPA_UART1);
+ sunxi_gpio_set_pull(SUNXI_GPA(3), SUNXI_GPIO_PULL_UP);
+#elif CONFIG_CONS_INDEX == 3 && defined(CONFIG_MACH_SUNIV)
+ sunxi_gpio_set_cfgpin(SUNXI_GPE(7), SUNIV_GPE_UART2);
+ sunxi_gpio_set_cfgpin(SUNXI_GPE(8), SUNIV_GPE_UART2);
+ sunxi_gpio_set_pull(SUNXI_GPA(8), SUNXI_GPIO_PULL_UP);
#elif CONFIG_CONS_INDEX == 1 && (defined(CONFIG_MACH_SUN4I) || \
defined(CONFIG_MACH_SUN7I) || \
defined(CONFIG_MACH_SUN8I_R40))
diff --git a/include/configs/suniv.h b/include/configs/suniv.h
index cadb003f02..b1448f49d4 100644
--- a/include/configs/suniv.h
+++ b/include/configs/suniv.h
@@ -29,4 +29,7 @@
#define CONFIG_HIDE_LOGO_VERSION
+#undef CONFIG_CONS_INDEX
+#define CONFIG_CONS_INDEX 3
+
#endif /* __CONFIG_H */
从 UART2(PE7/PE8)输出, 刚刚改完, 还没测试呢, 可能有坑。
这个文件 include/configs/suniv.h 还得加上:
#define CONFIG_CONS_INDEX 1 //UART0
#define CONFIG_CONS_INDEX 2 //UART1
#define CONFIG_CONS_INDEX 3 //UART2
好帖,写的非常详细!
随手记录一下过程, 怕过几天又什么都记不起了, 在晕哥这里留点足迹。
克隆u-boot并恢复到 v2017.11 的 tag:
git clone https://github.com/u-boot/u-boot
git reset --hard v2017.11
上面 github 在国内太慢了, 试一试gitee的镜像:
git clone https://gitee.com/mirrors/u-boot
git reset --hard v2017.11
还是没解决, 用 widora 的加速器下载了 linux:
然后接着:
sudo apt-get update;sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip u-boot-tools gawk samba gcc-arm-linux-gnueabihf -y
装个软件包试一试: sudo apt-get install libcurl4-openssl-dev
ubuntu:/home/ren/A33$ sudo apt-get install libcurl4-openssl-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
libcurl4-doc libidn11-dev libkrb5-dev libldap2-dev librtmp-dev libssh2-1-dev
The following NEW packages will be installed:
libcurl4-openssl-dev
0 upgraded, 1 newly installed, 0 to remove and 218 not upgraded.
Need to get 294 kB of archives.
After this operation, 1,399 kB of additional disk space will be used.
Get:1 http://mirrors.tencentyun.com/ubuntu bionic-security/main amd64 libcurl4-openssl-dev amd64 7.58.0-2ubuntu3.8 [294 kB]
Fetched 294 kB in 0s (890 kB/s)
Selecting previously unselected package libcurl4-openssl-dev:amd64.
(Reading database ... 168100 files and directories currently installed.)
Preparing to unpack .../libcurl4-openssl-dev_7.58.0-2ubuntu3.8_amd64.deb ...
Unpacking libcurl4-openssl-dev:amd64 (7.58.0-2ubuntu3.8) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
Setting up libcurl4-openssl-dev:amd64 (7.58.0-2ubuntu3.8) ...
克隆几次都报一个错误:
$sudo git clone https://gitee.com/mirrors/linux
Cloning into 'linux'...
remote: Enumerating objects: 9149, done.
remote: Counting objects: 100% (9149/9149), done.
remote: Compressing objects: 100% (5116/5116), done.
error: RPC failed; curl 56 GnuTLS recv error (-110): The TLS connection was non-properly terminated.
fatal: The remote end hung up unexpectedly
fatal: early EOF
fatal: index-pack failed
看看这些能不能解决吧
https://zhuanlan.zhihu.com/p/53961303
https://www.cnblogs.com/sddai/p/10209121.html
8. mobaxterm 登陆进去, 克隆一个Linux:
mkdir ~/A33/
cd ~/A33
git clone https://gitee.com/mirrors/linux
9. 编译A33, 参考 https://whycan.cn/t_3643.html#p33345
#克隆
git clone https://gitee.com/mirrors/linuxcd linux
#默认配置
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make sunxi_defconfig#手动配置
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make menuconfig#编译
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make -j3
下面这两个就是你需要的文件了:
arch/arm/boot/zImage
arch/arm/boot/dts/sun8i-a33-sinlinx-sina33.dtb
在 mobaxterm 左边的文件树里面可以下载.
69元阿里云服务器购买参考这里: https://whycan.cn/t_3969.html
1. 添加用户: sudo useradd ren
2. 重设ren密码: sudo passwd ren
3. 建立用户目录:
sudo mkdir /home/ren/ -p
sudo mkdir /home/ren/.ssh -p
sudo chown -R ren:ren /home/ren/
4. 生成秘钥: ssh-keygen -t rsa -b 4096 -C "10000@vip.qq.com"
私钥: id_rsa
公钥: id_rsa.pub
5. 公钥拷贝到目录: sudo cp /home/ren/.ssh/id_rsa.pub /home/ren/.ssh/authorized_keys
6. 用私钥 ssh 连接服务器, 推荐 mobaxterm:
7. 现在新用户可以为所欲为了。
页次: 1