全志A64 设备树开发应用

深入了解全志linux的设备树 一.设备树为何物二.设备树在源码的位置1.设备树的apidrivers/of/base.cdrivers/of/platform.c2.设备树的板载dtsarch/arm64/boot/dts/3.设备树文件编译工具dtclinux-3.10/scripts/dtc/dtc.c4.用户级的fex配置文件需要转换成dtc文件转换的方法是:int dt_update_source(const char... 阅读详情

通过跟踪全志Android系统编译及镜像生成过程和阅读手册”A64 dev tree&sysconfig使用文档.pdf”, 发现全志A64方案不单继续使用传统的script.fex配置脚本, 而且也加入了设备树的应用.

这里写图片描述

上图的sys_config.fex就是全志传统的script.fex。 设备树的dtb文件是由dts文件和sys_config.fex文件组合生成. 而且sys_config.fex里的内容的优先级别比dts要高.

dtc -O dtb -o lichee/out/sun50iw1p1/android/common/sunxi.dtb \
    -b 0 -i lichee/linux-3.10/arch/arm64/boot/dts          \
    -F  lichee/tools/pack/out/sys_config_fix.fex          \    
    -d  lichee/linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.d.dtc.tmp  \
        lichee/linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.dts   
//生成的设备树dtb文件在lichee/out/sun50iw1p1/android/common/sunxi.dtb

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
现bsp里的内核版本是linux-3.10, 设备树的调用函数与linux-4.x版本完全不一样.
设备树所用的头文件:

#include <linux/of.h>
//设备树里的每个设备及每个设备子节点都用此结构体描述
struct device_node {
    const char *name;
    const char *type;
    phandle phandle;
    const char *full_name;

    struct  property *properties; //属性
    struct  property *deadprops;    /* removed properties */
    struct  device_node *parent;  //在设备子节点对象,指向属于的设备对象
    struct  device_node *child;   //在设备对象,指向子节点
    struct  device_node *sibling;  //指向同级的下一个对象.
    struct  device_node *next;  /* next device of same type */  
                    //应是指向device_type是同样的对象 
    struct  device_node *allnext;   /* next in list of all nodes */
    ...
};


//下面函数用于获取设备树里的设备节点及设备子节点
extern struct device_node *of_find_node_by_name(struct device_node *from,
const char *name);  //通过名字查找相应的设备节点
static inline int of_get_child_count(const struct device_node *np); //获取指定设备的子节点个数
extern struct device_node *of_find_node_by_path(const char *path); //通过路径来获取设备节点,可用于获取设备子节点
extern struct device_node *of_find_node_by_type(struct device_node *from,
const char *type);  //通过指定的device_type来获取设备节点


//下面函数用于获取设备节点或设备子节点的属性
static inline int of_property_read_u32(const struct device_node *np,
    const char *propname, u32 *out_value)
extern int of_property_read_u32_index(const struct device_node *np,
                       const char *propname,
                       u32 index, u32 *out_value);
extern int of_property_read_u8_array(const struct device_node *np,
            const char *propname, u8 *out_values, size_t sz);
extern int of_property_read_u16_array(const struct device_node *np,
            const char *propname, u16 *out_values, size_t sz);
extern int of_property_read_u32_array(const struct device_node *np,
                      const char *propname,
                      u32 *out_values,
                      size_t sz);
extern int of_property_read_u64(const struct device_node *np,
                const char *propname, u64 *out_value);

extern int of_property_read_string(struct device_node *np,
                   const char *propname,
                   const char **out_string);

通常,在设备树里描述一个设备就相当于在内核源码里描述一个struct platform_device. 然后可与platform_driver相匹配,
在platform_driver里的probe函数里获取设备在设备树里的描述信息. 但在此linux-3.10版本里,设备树里的设备信息是用链表存储起来,
可以直接调用上面的函数获取设备树里的信息,并不一定需要platform_driver与设备匹配才可以. 当然也可以在platform_driver的probe函数里,
通过pdev->dev.of_node访问到设备树里的匹配上的设备节点.

在linux-3.10/arch/arm64/boot/dts/.sun50iw1p1-soc.dtb.dts 设备树里描述两个设备:

 jkdev { /* 设备 */
  compatible = "jk,mydev";
  autorepeat = <1>; 

  btn1 {  /* 设备子节点 */
      label = "btn1";   /* 设备子节点的属性 */ 
      code  = <0x11>;
  };    
  btn2 {
      label = "btn2";
      code  = <0x22>;
  };
 };

 jkdev2 {
   compatible = "jk,mydev2";
   device_type = "jktype";
   what = "hello";
 };

修改完成后,在android源码目录下执行”pack”生成镜像重烧即可。
使用新镜像启动后, 可在板上系统/sys/bus/platform/devices/目录下看到jkdev*的子目录.

只获取出上面两个设备的驱动代码test.c:


#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include<linux/of_address.h>
#include<linux/of_irq.h>
#include<linux/of_gpio.h>

static int __init test_init(void) 
{
    struct device_node *nd;
    int n;
    const char *str;
///////设备jdev/////
    nd = of_find_node_by_name(NULL, "jkdev");
    if (!nd)
        printk("no found\n");
    else
        printk("found it\n");

    n = of_get_child_count(nd);
    printk("child node count = %d\n", n);

    of_property_read_u32(nd, "autorepeat", &n);
    printk("autorepeat = %d\n", n);

//子节点btn1//
    nd = of_find_node_by_path("/jkdev/btn1");
    if (!nd)
        printk("btn1 node no found\n");
    if (nd)
    {
        if (0 == of_property_read_string(nd, "label", &str))
            printk("label = %s\n", str);
        if (0 == of_property_read_u32(nd, "code", &n))
            printk("code = %x\n", n);
    }
//子节点btn2//
    nd = of_find_node_by_path("/jkdev/btn2");
    if (!nd)
        printk("btn2 node no found\n");
    if (nd)
    {
        if (0 == of_property_read_string(nd, "label", &str))
            printk("label = %s\n", str);
        if (0 == of_property_read_u32(nd, "code", &n))
            printk("code = %x\n", n);
    }

/////////////////////////////////////////

//// jdev2 ////////////////通过device_type获取设备
    nd = of_find_node_by_type(NULL, "jktype");
    if (nd && (0 == of_property_read_string(nd, "what", &str)))
        printk("what = %s\n", str); 

    return 0;
}

static void __exit test_exit(void)
{
    printk("exit ...\n");
}


module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

编译驱动模块在板上加载后的输出信息:

root@tulip-p1:/sys/bus/platform/devices # insmod /data/test.ko                 
[11612.757753] found it
[11612.760475] child node count = 2
[11612.763998] autorepeat = 1
[11612.767058] label = btn1
[11612.771038] code = 11
[11612.773601] label = btn2
[11612.776361] code = 22
[11612.778892] what = hello
rockchip-gmac驱动根据设备树bus-id指定网卡名 多网卡情况下,系统上映射的网卡和物理网卡有时无法一一对应,要达到一一对应,可以参考以下方式。 阅读详情

相关推荐

Radxa Cubie A7A开发板:全志A733 SoC与边缘AI实战解析

单板计算机(SBC)作为嵌入式开发的核心硬件平台,其异构计算架构和接口扩展能力直接影响边缘计算场景的应用效能。全志A733 SoC采用创新的2+6+1多核设计,通过Cortex-A76高性能核心与A55能效核心的协同,在6-8W低功耗下实现突发负载处理与持续运算的平衡。该方案特别适合边缘AI推理、多媒体处理等场景,实测可同时解码4路1080p视频流且CPU占用低于30%。Radxa Cubie A7A开发板在此基础上集成LPDDR5内存、UFS 2.1存储及PCIe Gen3扩展,配合WiFi 6和双屏输出

weixin_30527423的博客 700

全志A64 设备树里的gpio应用开发

通过A64手册可以看出共有两个普通gpio控制器: gpio控制器是由厂商负责驱动好的,在设备树里关于gpio控制器的描述: pio: pinctrl@01c20800 { compatible = &quot;allwinner,sun50i-pinctrl&quot;; reg = &amp;lt;0x0 0x01c20800 0x0 0x400&amp;gt;; interrupts ...

jklinux的博客 7015

将开发板设计拆解为10个部分,教你DIY属于年轻人的第一块全志Linux开发板

开发板板载16M nor flash,主控芯片采用F1C200S,内置64M DRAM。同时附带USB Host接口以及USB type-c口,以及CH340串口转USB芯片,用于开发调试使用。

DOT小文哥的博客 1964

全志 A64 linux 通过设备树写LED驱动(附参考代码) ...

开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB详细参数 https://m.tb.cn/h.3wMaSKm开发板交流群 641395230 全志A64设备树结构体 #include <linux/of.h> //设备树里的每个设备及每个设备子节点都用此结构体描述 struct device_node { ...

weixin_34268843的博客 1009

全志A33开发板EMMC烧录实战:从固件选择到问题排查

本文提供了全志A33开发板EMMC烧录的完整实战指南。从固件选择、工具准备、硬件连接到详细的操作步骤,手把手教你如何将系统镜像成功烧录至EMMC。文章重点解析了进入FEL模式的关键操作,并针对烧录失败、无法启动等常见问题提供了详尽的排查方案,旨在帮助开发者快速上手,避免踩坑。

gpt4scribbler的博客 631

全志平台Linux GPIO开发实战:从设备树到内核驱动与用户空间操作

GPIO(通用输入输出)是嵌入式Linux开发的基础接口,其核心原理是通过引脚复用与电气属性配置实现对外设的控制。在全志(Allwinner)平台上,GPIO管理涉及pinctrl与gpio子系统、设备树配置及用户空间接口,技术价值在于提升代码可移植性与系统稳定性。典型应用场景包括LED控制、按键输入、中断处理等。本文围绕全志平台,系统讲解GPIO开发的整体设计思路、设备树配置细节、sysfs与gpiod操作方式,以及内核驱动中的GPIO与中断处理,并附常见问题速查与避坑经验。

weixin_34216614的博客 290

全志of_get_named_gpio_flags参数不同

struct gpio_config config; 1043 1044 rst_pin = of_get_named_gpio_flags(np, "reset-gpio", 0, (enum of_gpio_flags *)&config); 1045 if (!gpio_is_valid(rst_pin)) { 1046 printk("can rst_pin: %d is invalid\n", rst_pin); return -ENODEV; ...

2316

全志A133工业ARM主板:从芯片选型到系统开发的嵌入式实战指南

在嵌入式系统开发领域,ARM架构处理器凭借其高性能与低功耗的平衡,已成为工业控制、物联网网关和智能终端的主流选择。其核心原理在于通过精简指令集和高效的微架构设计,在提供充足算力的同时优化能耗比,这对于需要7x24小时稳定运行的工业场景至关重要。该技术的价值在于能够替代传统的x86工控机,为恶劣环境下的设备提供可靠、可扩展且成本可控的智能“大脑”。典型的应用场景包括智慧零售终端、工厂自动化设备和边缘计算节点,这些场景往往需要应对宽温、震动等挑战,并驱动双屏显示、连接丰富外设。本文以全志A133工业ARM主板为

weixin_30527323的博客 410

在全志的山寨平板上跑起linux

不是 chroot 也不是x86平板 没有利用安卓的任何一个部分 主线内核+主线uboot 搬运自简书 它的编辑器太难用。。。。。 现在退市的平板、机顶盒soc虽然难以胜任大部分日常使用的要求,但是完全可以胜任一些小项目,如语音助手或者智能镜子,监控的一些小demo的搭建,主要想看下现在主线对全志设备的支持怎样了嘿嘿????。 结论:主线内核对soc的支持还是的确可以了,但是对于某些硬件的驱动还是不行,lima的3d驱动也仅仅停在可用的状态(很容易发生内存溢出,armbian正常运行需要调整内核参数给显示处

HandsomeHacker的博客 1万+

全志A64平台下基于Linux驱动的PN512 SPI读取Mifare卡的全面教程

全志A64是一款基于ARM Cortex-A53架构的四核处理器,具有高性能和低功耗的特点。A64处理器集成了丰富的外设接口,包括SPI、I2C、UART等,非常适合用于嵌入式系统开发。我们将利用这些接口来实现与PN512的通信。PN512是NXP公司推出的一款NFC前端芯片,支持多种NFC协议,包括ISO/IEC 14443A/B、FeliCa和NFCIP-1。PN512芯片广泛应用于智能卡读取器、非接触支付终端等设备中。

m0_57781768的博客 247

全志A13 Android 4.1+ GPIO控制方案揭秘

全志A13处理器以其出色的性能和能效比,在嵌入式设备和移动领域得到了广泛的应用。它是基于ARM架构设计的单核处理器,广泛应用于平板电脑、智能设备等领域。然而,随着应用的深入,开发者在使用全志A13时可能面临原生GPIO接口的移除问题,这会直接影响到开发者对硬件资源的控制能力。Linux内核驱动是连接硬件和操作系统核心的桥梁。它负责管理硬件设备,确保应用程序可以通过统一的接口与硬件进行通信。驱动程序的稳定性和效率直接影响整个系统的性能和可靠性。

weixin_32306683的博客 844

基于全志A64(Cortex-A53 ARM64)Linux设备panic 处理

摘要:本文详细分析了全志A64(ARM64)平台的调试环境搭建与问题排查方法,涵盖从Bootloader到内核启动、用户空间应用的全过程。首先介绍了硬件配置和工具链准备,随后分六个阶段深入剖析典型问题:U-Boot的DRAM初始化失败、内核设备树匹配错误、根文件系统挂载问题、init进程启动失败、后台进程崩溃及内存泄漏。针对每个阶段,文章提供了寄存器分析、代码插桩、GDB调试等具体解决方案,并结合ARM64特有架构(如异常级别、64位寄存器、4级页表)进行优化。通过分层调试体系(硬件层、Bootloader

zhilin_tang的专栏 760

全志A64 IO驱动

为达到能快速使用的目的。文档对 CTP 与 sensor 的自动加载原理,使用方法步骤, 如何添加一个新的模组等做了详细的讲解

【全志V3s】SPI NAND Flash 驱动开发

SLC工艺2KB*65536页10万次擦写次数焊好以后用CH341A读了一下。

似水流年 1万+

全志芯片刷机工具【支持EMMC和UFS带教程】

全志芯片刷机工具(支持EMMC和UFS带教程 资源说明: 是 Allwinner 官方的刷新实用程序,允许用户在其 Allwinner 设备上刷新固件。该工具通过 支持 emmc 和 ufs 设备。 支持: EMMC:A10、A13、A20、A31、A33、R16、A50、A64 UFS:A64、A83T、A100、A113、H6、H616、H8、H816 带中文详细图文教程 会基础操作的友友下载 无基础常识的请谨慎

calibre QRC提取寄生参数

typical将上面的文件QCI_flow里面的文件 在Cp 到当前 ,其实应该是某几个文件,但是我给忘记了 就全cp过来了 ,无影响,不过也希望大佬指正。

2202_75711937的博客 1517

全志H616芯片外设开发与嵌入式应用指南

ARM Cortex-A53架构作为嵌入式系统的核心处理器方案,通过64位指令集在性能与功耗间实现平衡。其外设接口开发涉及GPIO、I2C、SPI等通信协议,这些基础接口技术是连接传感器、存储设备的关键。在智能家居和工业控制等物联网场景中,合理运用UART调试与PWM控制能显著提升设备交互能力。全志H616芯片凭借4K视频解码和Mali-G31 GPU特性,特别适合需要多媒体处理的嵌入式开发,其丰富的外设资源为智能硬件提供了灵活的扩展方案。通过Linux系统构建和交叉编译工具链,开发者可以快速实现从基础GP

weixin_42536058的博客 304

【OpenAirInterface知识-3】OAI端到端部署之5G基站部署

在上一篇文章中已经完成了5G核心网的部署,本篇文章将介绍OAI 5G基站的部署过程。

起名字难上难的博客 3421
上一篇: 全志Android系统编译及镜像生成过程分析
下一篇: 全志A64 设备树里的gpio应用开发
jklinux
博客等级 码龄10年 1060粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值