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