正点原子linux阿尔法开发板使用—Linux设备树_正点原子阿尔法开发版(2)

从根节点/开始描述设备信息,在/根节点外,有&cpu主要的语句是对cpu这个节点进行追加。

设备树节点名称规范:
在这里插入图片描述

node-name@unit-address

IMX6ULL参考手册:
I2C4起始地址:
在这里插入图片描述
和对应设备树其实地址相同,这个地址是描述I2C外设的起始地址。
在这里插入图片描述
再举一个栗子,看uart:

在这里插入图片描述
对应相同

在这里插入图片描述
&后面的绝对地址都是外设寄存器的起始地址。但是不是绝对的,比如IIC设备。
在这里插入图片描述
这里箭头所指的保存的地址是mag3110设备的地址。

如果遇到特殊节点:
在这里插入图片描述

在这里插入图片描述引用标签的目的是为了方便的访问节点,就不需要搞这么长的名字了。
在这里插入图片描述
比如以后访问iic2这个节点就方便很多了。
在这里插入图片描述

2022.5.22 P19

系统启动之后可以在根文件系统看到设备树节点信息。在/proc/device-tree

在这里插入图片描述
内核启动的时候,会解析设备树,然后在/proc/device-tree呈现出来。

修改并且编译设备树:
在这里插入图片描述
指定编译器编译设备树:
在这里插入图片描述拷贝设备树到nfs下:
在这里插入图片描述

P20 2022.5.22

1、aliases

2、chosen节点,主要将bootargs环境变量值传递给linux作为命令行参数。

在这里插入图片描述
在这里插入图片描述

设备树中的标准属性

1、compatible属性
描述“兼容性”,非常重要的属性。
在这里插入图片描述
gpio_spi:reg由spi4来决定的。address-cells 和size-cells 影响的是子节点reg属性而不是本节点。

		#address-cells = <1>; //表示地址
		#size-cells = <0>; //表示地址大小

表示reg里面只有一个address-cell。
在这里插入图片描述在这里插入图片描述
解释说明:

在这里插入图片描述

2022.5.23 根节点下compatible属性作用

类型是字符串,根节点下的compatible,内核启动的时候会检查是否支持该平台或者机器。不使用设备树的情况下,根据machine id来判断是否支持此机器。
在这里插入图片描述
使用设备树之后,不使用机器ID,而是使用根节点/下的compatible属性。

正是因为 字符串匹配 所以可以启动内核。
在这里插入图片描述
和设备树中的内容可以匹配。
在这里插入图片描述

of函数

1、驱动如何获取设备树中的信息。在驱动中使用of函数获取设备树属性内容。
2、驱动要获取设备树节点内容,首先要找到节点。
在这里插入图片描述
在这里插入图片描述
如何使用of函数获取设备信息。

P6.9左忠凯手撕代码

/\*\*
 \*my first driver
 \* 
\*/
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of\_address.h>
#include <linux/of\_irq.h>



#define LED\_MAJOR 200 //主设备号
#define LED\_NAME "LED" //驱动名称

#define NEWCHRLED\_NAME "newchrled"
#define NEWCHRLED\_COUNT 1 

struct newchrled\_dev {
	
	struct cdev cdev;
	struct class \*class;/\*类:为了自动创建节点\*/
	struct device \*device;/\*设备:为了自动创建节点\*/
	dev\_t devid; //设备号
	int major;   //主设备号
	int minor;   //次设备号
};

struct newchrled\_dev newchrled; //led设备

#if 0 

backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm1 0 5000000>;
		brightness-levels = <0 4 8 16 32 64 128 255>;
		default-brightness-level = <7>;
		status = "okay";
	};

#endif

static int __init dtsof\_init(void)
{

	int ret = 0; //
	/\*1、找到backlight节点,/路径是:/backlight /\*/
	struct device\_node \*bl_nd = NULL;/\*节点\*/
	struct property  \*comppro  = NULL;
	const char \*\*str = NULL;
	
	u32 def_value = 0;
	/\*内核动态申请内存\*/
	u32 \*brival;
	u32 elemsize = 0;
	
	bl_nd =  of\_find\_node\_by\_path("/backlight");
	if (bl_nd == NULL){ /\*失败\*/
		ret = -EINVAL;
		goto fail_findnd;
	}
	
	/\*2、获取属性\*/
	comppro = of\_find\_property(bl_nd,"compatible",NULL);
	if (comppro == NULL){ /\*失败\*/
		ret = -EINVAL;
		goto fail_findpro;
	}else{
		printk("compatible = %s",(char\*)comppro->value);

	}

	ret = of\_property\_read\_string(bl_nd,"status",str);
	if (ret < 0){
		goto fail_rs;
	}
	
	/\*3、获取数字属性值\*/
	ret = of\_property\_read\_u32(bl_nd,"default-brightness-level",&def_value);
	if (ret<0){
		goto fail_read32;
	}else{
		printk("default-brightness-level = %d \r\n",def_value);
	}
	
	/\*4、获取数组类型的属性\*/
	elemsize = of\_property\_count\_elems\_of\_size(bl_nd,"brightness-levels",sizeof(u32));
	if (elemsize<0){
		ret = -ENAVAIL;
		goto fail_readele;
	}else{
		printk("brightness-levels = %d \r\n",ret);
	}

	/\*申请内存\*/
	brival = kmalloc(elemsize \* sizeof(u32),GFP_KERNEL);
	if(!brival){
		ret = -EINVAL;
		goto fail_mem;
	}

	/\*获取数组\*/
	ret = of\_property\_read\_u32\_array(bl_nd,"brightness-levels",brival,elemsize);
	if (ret<0){
		ret = -EINVAL;
		goto fail_read32array;
	} else {
		u8 i = 0;
		for (i = 0; i < elemsize; i++){
			printk("brightness-levels[%d] = %d \r\n",i,\*(brival+i));
		}	
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/b1eb958572614d6a17a5b6276e86151a.png)

![img](https://img-blog.csdnimg.cn/img_convert/b29688ecdb78ad43323c928a5cb66307.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/1164f02efa4866ed8d7ca97277ec5ed2.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/d30b7521368a36a08e94e55172437ec9.png)

![img](https://img-blog.csdnimg.cn/img_convert/c86d2d3e7f2641076bf921e52cfd89bc.png)

![img](https://img-blog.csdnimg.cn/img_convert/5e101f6a89a8b9b3bf53e842fad72f3d.png)

![](https://img-blog.csdnimg.cn/img_convert/c7ffefc5b704cc017d7719cfa3f3499e.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


g-7trjfg3e-1715757198010)]

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值