我们以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 <[email protected]>");
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 <[email protected]>");
MODULE_DESCRIPTION("testting");
// MODULE_ALIAS("ipt_limit");
// MODULE_ALIAS("ip6t_limit");
module_init(startin);
module_exit(startout);
标签:module,void,MODULE,compatible,t113,linux,include,节点,设备 From: https://www.cnblogs.com/recodemo/p/17537385.html