t113-c-设备树-驱动调用篇(获取设备节点和属性)

发布时间 2023-07-08 16:57:49作者: 悠闲的小莫

我们以pwm为例

编写程序

1.首先编写出入口函数

// #include "linux/module.h"
// #include "linux/fs.h"
// //#include "linux/stddef.h"
// #include "linux/types.h"
// //#include "crypto/if_alg.h"

#include "treecom.h"


static int __init startin(void)
{



	return 0;
}

static void __exit startout(void)
{



	
}


MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiaomo <2712767798@qq.com>");
MODULE_DESCRIPTION("testting");
// MODULE_ALIAS("ipt_limit");
// MODULE_ALIAS("ip6t_limit");

module_init(startin);
module_exit(startout);

2.导入节点

我们使用以下函数

路径在这里可以看见

我们通过关键字可以知道可以用以下函数来搜寻总的属性,并且可以通过全局搜索来知道最后的一个参数其实可以用NULL来自动判断长度

编写以下代码

3.编写makefile

KEDIR = /home/momo/T113/Tina-Linux/lichee/linux-5.4
CROSS_COMPILESS = /home/momo/T113/Tina-Linux/prebuilt/gcc/linux-x86/arm/toolchain-sunxi-musl/toolchain/bin/arm-openwrt-linux-muslgnueabi-

CURRENT-PATH := $(shell pwd)

obj-m := treecom.o

build: kernel_modules

kernel_modules:
			${MAKE} -C ${KEDIR} M=${CURRENT-PATH} modules
clean:
			${MAKE} -C ${KEDIR} M=${CURRENT-PATH} clean
			rm -rf treecom.order

4.编译,运行

编译时候出了错误,因为inline是函数的用法所以删掉inline即可编译成功

放到板子上运行发现错误由于位进行成功printk不知道在哪出了错误

进行调试后发现原来是找不到路径

修改后成功运行

 

代码

// #include "linux/module.h"
// #include "linux/fs.h"
// //#include "linux/stddef.h"
// #include "linux/types.h"
// //#include "crypto/if_alg.h"

#include "treecom.h"

#if 0
		pwm0: pwm0@2000c10 {
			compatible = "allwinner,sunxi-pwm0";
			pinctrl-names = "active", "sleep";
			reg = <0x0 0x02000c10 0x0 0x4>;
			reg_base = <0x02000c00>;
		};
#endif


static int __init startin(void)
{
	struct device_node *pw_nd=NULL;
	struct property *compatible=NULL;
	pw_nd=of_find_node_by_path("/soc@3000000/pwm0@2000c10"); 								 //获取节点
	if(pw_nd==NULL){
		printk("failed to create node \r\n");
		goto FINEFAIL;
	}
	else{
		printk("create node \r\n");
	}
	compatible=of_find_property(pw_nd,"compatible",	NULL);		//获取属性
	if(compatible==NULL){
		printk("failed to fine compatible \r\n");
		goto FINEFAIL;
	}
	else{
		printk("fine compatible \r\n");
	}
	printk("compatible is %s\r\n",compatible->value);

	return 0;

FINEFAIL:
	return -22;
}

static void __exit startout(void)
{



	
}


MODULE_LICENSE("GPL");
MODULE_AUTHOR("xiaomo <2712767798@qq.com>");
MODULE_DESCRIPTION("testting");
// MODULE_ALIAS("ipt_limit");
// MODULE_ALIAS("ip6t_limit");

module_init(startin);
module_exit(startout);