20250421在荣品的PRO-RK3566开发板的Android13下使用io命令控制GPIO

20250421在荣品的PRO-RK3566开发板的Android13下使用io命令控制GPIO
2025/4/21 10:44

【本文只打开了io命令。通过io控制GPIO放到下一篇了】
缘起:需要在荣品的PRO-RK3566开发板的Android13的u-boot中来控制GPIO3A1【配置以太网RTL8211F-CG】。
直接使用GPIO库函数 和 寄存器都异常了。
那就通过Android13系统中的io命令先确定寄存器再来搞u-boot了。


本周的问题:
1、uboot下配置GPIO3A1。地面站RK3566+Andorid13。要结案了。
确认以太网初始化的时候必须上电,如果当时不上电就像【MIPI CSI】摄像头一样,不会挂载了。
以后上电没用。
我最近的测试方向。通过io命令读写寄存器。
2、吊舱RK3566+Buildroot。RGA的4GB+内存问题?
3、RK3576前期预研。


1、
Z:\Android13.0\kernel-5.10\drivers\char\mem.c
【感觉不加这里,也已经编译mem.c生成mem.o了】
Z:\Android13.0\kernel-5.10\drivers\char\Makefile

obj-$(CONFIG_XILLYBUS)        += xillybus/
obj-$(CONFIG_POWERNV_OP_PANEL)    += powernv-op-panel.o
obj-$(CONFIG_ADI)        += adi.o
【在最后面加】
obj-$(CONFIG_DEVMEM)           += mem.o


2、
Z:\Android13.0\kernel-5.10\drivers\char\Kconfig

config DEVKMEM
    bool "/dev/kmem virtual device support"
    # On arm64, VMALLOC_START < PAGE_OFFSET, which confuses kmem read/write
    depends on !ARM64
    help
      Say Y here if you want to support the /dev/kmem device. The
      /dev/kmem device is rarely used, but can be used for certain
      kind of kernel debugging operations.
      When in doubt, say "N".


3、
Z:\Android13.0\kernel-5.10\drivers\char\mem.c

static const struct memdev {
    const char *name;
    umode_t mode;
    const struct file_operations *fops;
    fmode_t fmode;
} devlist[] = {
#ifdef CONFIG_DEVMEM
     [DEVMEM_MINOR] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET },
#endif

#ifdef CONFIG_DEVKMEM
     [2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET },
#endif
     [3] = { "null", 0666, &null_fops, 0 },
#ifdef CONFIG_DEVPORT
     [4] = { "port", 0, &port_fops, 0 },
#endif
     [5] = { "zero", 0666, &zero_fops, 0 },
     [7] = { "full", 0666, &full_fops, 0 },
     [8] = { "random", 0666, &random_fops, FMODE_NOWAIT },
     [9] = { "urandom", 0666, &urandom_fops, FMODE_NOWAIT },
#ifdef CONFIG_PRINTK
    [11] = { "kmsg", 0644, &kmsg_fops, 0 },
#endif
};

修改成为:
static const struct memdev {
    const char *name;
    umode_t mode;
    const struct file_operations *fops;
    fmode_t fmode;
} devlist[] = {
//#ifdef CONFIG_DEVMEM
     [DEVMEM_MINOR] = { "mem", 0, &mem_fops, FMODE_UNSIGNED_OFFSET },
//#endif

#ifdef CONFIG_DEVKMEM
     [2] = { "kmem", 0, &kmem_fops, FMODE_UNSIGNED_OFFSET },
#endif
     [3] = { "null", 0666, &null_fops, 0 },
#ifdef CONFIG_DEVPORT
     [4] = { "port", 0, &port_fops, 0 },
#endif
     [5] = { "zero", 0666, &zero_fops, 0 },
     [7] = { "full", 0666, &full_fops, 0 },
     [8] = { "random", 0666, &random_fops, FMODE_NOWAIT },
     [9] = { "urandom", 0666, &urandom_fops, FMODE_NOWAIT },
#ifdef CONFIG_PRINTK
    [11] = { "kmsg", 0644, &kmsg_fops, 0 },
#endif
};


4、修改配置文件:
Z:\Android13.0\kernel-5.10\.config
CONFIG_SERIAL_MCTRL_GPIO=y
# CONFIG_SERIAL_NONSTANDARD is not set
# CONFIG_N_GSM is not set
# CONFIG_NOZOMI is not set
# CONFIG_NULL_TTY is not set
# CONFIG_TRACE_SINK is not set
# CONFIG_HVC_DCC is not set
# CONFIG_SERIAL_DEV_BUS is not set
# CONFIG_TTY_PRINTK is not set
# CONFIG_VIRTIO_CONSOLE is not set
# CONFIG_IPMI_HANDLER is not set
CONFIG_HW_RANDOM=y
# CONFIG_HW_RANDOM_TIMERIOMEM is not set
# CONFIG_HW_RANDOM_BA431 is not set
CONFIG_HW_RANDOM_CAVIUM=y
CONFIG_HW_RANDOM_OPTEE=y
# CONFIG_HW_RANDOM_CCTRNG is not set
# CONFIG_HW_RANDOM_XIPHERA is not set
CONFIG_HW_RANDOM_ROCKCHIP=y
# CONFIG_APPLICOM is not set
# CONFIG_DEVMEM is not set
# CONFIG_RAW_DRIVER is not set
# CONFIG_DEVPORT is not set
# CONFIG_TCG_TPM is not set
# CONFIG_XILLYBUS is not set
CONFIG_RANDOM_TRUST_BOOTLOADER=y
# end of Character devices


Z:\Android13.0\kernel-5.10\arch\arm64\configs\rockchip_defconfig

CONFIG_SERIAL_8250=y
# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_USB_SERIAL_CP210X=y
# CONFIG_SERIAL_8250_PCI is not set
CONFIG_SERIAL_8250_NR_UARTS=10
CONFIG_SERIAL_8250_RUNTIME_UARTS=10
CONFIG_SERIAL_8250_DW=y
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_ROCKCHIP=y
CONFIG_DEVMEM=y
# CONFIG_DEVPORT is not set
CONFIG_I2C_CHARDEV=y
CONFIG_I2C_GPIO=y
CONFIG_I2C_RK3X=y
CONFIG_SPI=y
CONFIG_SPI_ROCKCHIP=y
CONFIG_SPI_SPIDEV=y


5、效果:
console:/ $ 
console:/ $ su
console:/ # 
console:/ # 
console:/ # cd /dev
console:/dev # 
console:/dev # ll mem
crw------- 1 media media 1,   1 2025-04-21 11:43 mem

console:/dev # 


参考资料:
https://blog.csdn.net/weiqifa0/article/details/104243443
GPIO 使用 — Rockchip


RK3568
https://blog.csdn.net/sty01z/article/details/134421350
rk3566-安卓11-千兆网卡 rtl8211f 移植

https://blog.csdn.net/weixin_43564241/article/details/125668278
Linux内核(十)WIFI BT电路解析 对应设备树配置解析

https://wiki.t-firefly.com/zh_CN/ROC-RK3568-PC/driver_lcd.html
4. LCD使用
https://wiki.t-firefly.com/zh_CN/ROC-RK3566-PC/driver_lcd.html#config-pei-zhi
5. LCD使用  ROC-RK3566-PC

https://blog.csdn.net/sunqinglin4826/article/details/104848529
RK3399 Linux-SDK mipi屏幕驱动及调试


完整的LOG:
console:/ # 
console:/ # 
console:/ # io
Raw memory i/o utility - $Revision: 1.5 $

io -v -1|2|4 -r|w [-l <len>] [-f <file>] <addr> [<value>]

    -v         Verbose, asks for confirmation
    -1|2|4     Sets memory access size in bytes (default byte)
    -l <len>   Length in bytes of area to access (defaults to
               one access, or whole file length)
    -r|w       Read from or Write to memory (default read)
    -f <file>  File to write on memory read, or
               to read on memory write
    <addr>     The memory address to access
    <val>      The value to write (implies -w)

Examples:
    io 0x1000                  Reads one byte from 0x1000
    io 0x1000 0x12             Writes 0x12 to location 0x1000
    io -2 -l 8 0x1000          Reads 8 words from 0x1000
    io -r -f dmp -l 100 200    Reads 100 bytes from addr 200 to file
    io -w -f img 0x10000       Writes the whole of file to memory

Note access size (-1|2|4) does not apply to file based accesses.

1|console:/ # 
1|console:/ # 
1|console:/ # io 0x1000
00001000:  fd
console:/ # 
console:/ # io 0x1000 0x12
console:/ # 
console:/ # io 0x1000                                                          
00001000:  12
console:/ # 
console:/ # io -2 -l 8 0x1000
00001000:  7b12 a9bf 00e3 9400
console:/ # 

console:/ # io -r -f dmp -l 100 200
Failed to open destination file 'dmp': Read-only file system
1|console:/ # 

【根目录不可写】

【在adb总配置】

adb root

adb remount


1|console:/ # io -r -f dmp -l 100 200                                          
Failed to open destination file 'dmp': Read-only file system
1|console:/ # cat dmp
cat: dmp: No such file or directory
1|console:/ # touch dmp
touch: 'dmp': Read-only file system
1|console:/ # 
1|console:/ # ll
total 76
drwxr-xr-x   2 root   root       4096 2025-04-19 18:22 acct
drwxr-xr-x  27 root   root        560 2025-04-21 10:41 apex
lrw-r--r--   1 root   root         11 2025-04-19 18:22 bin -> /system/bin
lrw-r--r--   1 root   root         50 2025-04-19 18:22 bugreports -> /data/user_de/0/com.android.shell/files/bugreports
drwxrwx---   6 system cache      4096 2025-04-19 18:31 cache
drwxr-xr-x   3 root   root          0 1970-01-01 08:00 config
lrw-r--r--   1 root   root         17 2025-04-19 18:22 d -> /sys/kernel/debug
drwxrwx--x  50 system system     4096 2025-04-21 10:42 data
drwx------   8 root   system      160 2025-04-21 10:41 data_mirror
drwxr-xr-x   2 root   root       4096 2025-04-19 18:22 debug_ramdisk
drwxr-xr-x  26 root   root       3160 2025-04-21 10:42 dev
lrw-r--r--   1 root   root         11 2025-04-19 18:22 etc -> /system/etc
lrwxr-x---   1 root   shell        16 2025-04-19 18:22 init -> /system/bin/init
-rwxr-x---   1 root   shell       463 2025-04-19 18:22 init.environ.rc
drwxr-xr-x  11 root   root        260 2025-04-21 10:41 linkerconfig
drwx------   2 root   root      16384 2025-04-19 18:22 lost+found
drwxr-xr-x  13 root   root       4096 2025-04-19 18:31 metadata
drwxr-xr-x  17 root   system      360 2025-04-21 10:53 mnt
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 odm
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 odm_dlkm
drwxr-xr-x   2 root   root       4096 2025-04-19 18:22 oem
drwxr-xr-x   2 root   root       4096 2025-04-19 18:22 postinstall
dr-xr-xr-x 344 root   root          0 2025-04-21 10:41 proc
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 product
lrw-r--r--   1 root   root         21 2025-04-19 18:22 sdcard -> /storage/self/primary
drwxr-xr-x   2 root   root       4096 2025-04-19 18:22 second_stage_resources
drwx--x---   4 shell  everybody   100 2025-04-21 10:42 storage
dr-xr-xr-x  15 root   root          0 2025-04-21 10:41 sys
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 system
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 system_dlkm
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 system_ext
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 vendor
drwxr-xr-x   1 root   root       3488 2025-04-21 10:53 vendor_dlkm
console:/ # cd data
console:/data # 
console:/data # 
console:/data # io -r -f dmp -l 100 200                                        
console:/data # cat dmp
    ??_?yAB8?0?? ???????????_???6n@????console:/data # 
console:/data # 
console:/data # ll

total 224
drwx------   2 root     root      4096 2025-04-19 18:31 adb
drwxrwxr-x   2 system   system    4096 2025-04-19 18:31 anr


console:/data # ll dmp
-rw------- 1 root root 100 2025-04-21 10:53 dmp
console:/data # 

console:/data # io -w -f img 0x10000
Failed to open source file 'img': No such file or directory
1|console:/data # 
1|console:/data # io -w -f dmp 0x10000                                         
console:/data # ll

百度:RK3566 android io命令
BING:rk356x 在uboot下设置gpio引脚默认电平
RK3566 uboot GPIO 寄存器控制
rk3566 devmem
RK3566 uboot GPIO 寄存器控制

https://redmine.rpdzkj.cn/issues/234
gpio上电初始化-----uboot阶段gpio配置


https://blog.csdn.net/u011774634/article/details/136898819?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-136898819-blog-129007286.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.1&utm_relevant_index=3
RK3399 Android7.1在uboot中设置GPIO的上下拉模式


https://www.cnblogs.com/xu-long/p/16805994.html
怎么在uboot下使用通用GPIO接口
一:在uboot下的defconfig 打开如下配置

CONFIG_DM=y
CONFIG_DM_GPIO=y
CONFIG_DWAPB_GPIO=y
CONFIG_CMD_GPIO=y

https://blog.csdn.net/weixin_45639314/article/details/138217098
RK平台 支持io命令


https://blog.csdn.net/daocaokafei/article/details/128336398?spm=1001.2101.3001.6650.17&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-128336398-blog-138217098.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-17-128336398-blog-138217098.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=20
rk3568 | rk平台GPIO冲突检测小技巧

https://blog.csdn.net/jianfeng_520/article/details/144867968
瑞芯微(RK)IO操作寄存器

IO命令使用环境
IO命令需要依赖DEVMEM,而DEVMEM默认是关闭的,所以导致IO默认无法使用,需要在config中将DEVMEM打开,如下:

kernel/configs/rockchip/android-11.config
CONFIG_DEVMEM=y

https://blog.csdn.net/weiqifa0/article/details/104243443
GPIO 使用 — Rockchip

https://blog.csdn.net/u011774634/article/details/124988946?spm=1001.2101.3001.6650.18&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-18-124988946-blog-129007286.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-18-124988946-blog-129007286.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=24
RK3399 Android7.1在uboot中设置GPIO的电平无效
uboot-set = <(RK3399_BT656_VDD_1V8 | RK3399_AUDIO_VDD_1V8 | RK3399_GPIO1833_VDD_3V3)>;


https://blog.csdn.net/dreamliweiming/article/details/134703414?spm=1001.2101.3001.6650.11&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-11-134703414-blog-131769320.235%5Ev43%5Epc_blog_bottom_relevance_base5&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-11-134703414-blog-131769320.235%5Ev43%5Epc_blog_bottom_relevance_base5&utm_relevant_index=15
RK3588 在uboot 和kernel下对GPIO的配置

static void func_gpio_init(void)
{
    gpio_request(FUNC_GPIO_BANK2|FUNC_PA3,"FUNC_GPIO2_PA3");
    gpio_direction_output(FUNC_GPIO_BANK2|FUNC_PA3,0);
 
    gpio_request(FUNC_GPIO_BANK3|FUNC_PA3,"FUNC_GPIO3_PA3");
    gpio_direction_output(FUNC_GPIO_BANK3|FUNC_PA3,0);
}


https://blog.csdn.net/weixin_43772810/article/details/129394668?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-4-129394668-blog-131769320.235^v43^pc_blog_bottom_relevance_base5&spm=1001.2101.3001.4242.3&utm_relevant_index=6
itop-3568开发板驱动学习笔记(5) 点灯实验(两种方法)

文章目录
ioremap 物理地址映射
调用 API
ioremap 物理地址映射
通过开发板原理图得知 LED 控制引脚为 GPIO0_B7,IO 高电平时,三极管导通,LED 点亮,IO 低电平时,三极管截止,LED 熄灭,


https://blog.csdn.net/kyling007/article/details/124862669
rk3288 _7.1_在U-boot上电时设置GPIO的电平值
夏日柠檬茶丶

        一般在U-boot上就设置电平值,适用于电源的复位,MIPI、LVDS、GVI之类的屏幕控制上电时序,当然,也适用任何模块以及任何引脚。
        注意:如果该区域的引脚存在电源域的保护机制,需要先解除保护。

        通常情况下, 在 u-boot/common/board_f.c 文件上,都能设置GPIO引脚的电平值。今天讲一下不一样的设置方式。在rk3288_7.1/u-boot/board/rockchip/rk32xx/rk32xx.c的文件中,这个文件是板子初始化的文件,其中 board_late_init 函数是进行一些硬件初始化。代码如下

//自己写的函数
void set_down_up_GPIO(void)
{
       printf("set_down_up GPIO5C2 GPIO7A3 \n");
       gpio_direction_output(GPIO_BANK5|GPIO_C2, 0);  // 设置GPIO5_C2 引脚的电平值为 0
       gpio_direction_output(GPIO_BANK7|GPIO_A3, 0);  // 设置GPIO7_A3 引脚的电平值为 0
       msleep(500);
       msleep(500);
       gpio_direction_output(GPIO_BANK5|GPIO_C2, 1);  // 设置GPIO5_C2 引脚的电平值为 1
       gpio_direction_output(GPIO_BANK7|GPIO_A3, 1);  // 设置GPIO7_A3 引脚的电平值为 1
}
 

https://blog.csdn.net/bbyjijun/article/details/129432452
RK3568平台入门到精通系列讲解之UBOOT开发篇(GPIO操作)


https://blog.csdn.net/sty01z/article/details/134421350
rk3566-安卓11-千兆网卡 rtl8211f 移植


https://blog.csdn.net/qinglongzhan/article/details/129836675
瑞芯微RK3568开发:GPIO实践篇

二、几种操作方式

1、io tool

io -4 -w 0xFDD6000C 0xffff4000
io -4 -w 0xFDD60004 0xffff4081
io -4 -r 0xFDD6000C
io也可以单字节操作,参考io -h

2、用户态类调用

内核注册了gpio接口操作命令行,

查看以注册gpio端口:cat /sys/kernel/debug/gpio;

申请和释放:echo n > /sys/class/gpio/export,echo n > /sys/class/gpio/unexport;

3、uboot或kernel编程

裸机直接对寄存器物理地址进行读写操作,如writel和readl;

上系统接口的话,有标准的gpio接口,dts和of_xxx那一套;

https://ask.csdn.net/questions/7991409
rk3568 gpio寄存器手册问题
¥15
arm
单片机
问题描述:
1、看下面两个链接,讲的都是uboot下writel对特定寄存器设置输入输出或者高低电平
https://blog.csdn.net/qinglongzhan/article/details/129836675
https://blog.csdn.net/qq_45147279/article/details/129007286
2、问题
不理解下面两句是怎样得到的,请求详细解释(分别对应上面2篇文章)

【1】writel(0xffff4080, 0xFDD6000C);    //设置输出
writel(0xffff4081, 0xFDD60004);    //设置高电平

   【2】writel(0x00400040,0xfe77000C);//set output mode
     writel(0x00400040,0xfe770004);//
3、举一反三
比如要设置GPIO0_C6 GPIO2_B3 GPIO2_B4为输出高电平,应该怎样写?


 

小凌派-RK2206是一款基于Raspberry Pi零或Pi 3等单板电脑的开发板,而360度舵机是一种能够旋转全方位的角度控制设备,通常用于机器人、模型飞机或其他需要精确角度操作的项目中。以下是使用小凌派配合360度舵机的基本步骤: 1. **硬件连接**: - 确保你的RK2206已经按照官方指南安装并配置好操作系统。 - 使用GPIO(General Purpose Input Output,通用输入输出)接口将舵机连接到RK2206上。通常舵机的信号线会包括电源(VCC)、接地(GND)以及信号线(SIG),其中SIG线连接到rk2206的数字IO端口。 2. **软件设置**: - 安装舵机库,如Python的RPi.GPIO或circuitpython中的`servo`模块。 - 编写程序代码,例如: ```python import RPi.GPIO as GPIO servo_pin = 18 # 替换为你实际使用GPIO引脚 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) def set_angle(angle): pulse_width = 2 + angle * (10 / 180) # 舵机范围0-180度,脉冲宽度计算公式 duty_cycle = pulse_width * 65535 / 20000 GPIO.output(servo_pin, True) GPIO.output(servo_pin, False) GPIO.output(servo_pin, True) GPIO.output(servo_pin, False) GPIO.output(servo_pin, True) time.sleep(pulse_width / 1000) GPIO.output(servo_pin, False) # 示例:设置舵机到90度角 set_angle(90) ``` 3. **注意事项**: - 初始化GPIO时要记得处理异常,比如清理GPIO资源。 - 舵机工作时可能会有轻微震动声音,属于正常现象。 - 避免长时间全速旋转,以免损坏舵机。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值