rk3399下pwm驱动

2023-05-16

现在记录一下rk3399下pwm的驱动编写,下面是内核pwm的API,从开源论坛复制(firefly的开源论坛里面的Wiki教程)

(1)、在要使用 PWM 控制的设备驱动文件中包含以下头文件:

#include <linux/pwm.h>
该头文件主要包含 PWM 的函数接口。

(2)、申请 PWM使用

struct pwm_device *pwm_request(int pwm_id, const char *label);
函数申请 PWM。 例如:

struct pwm_device * pwm1 = NULL;pwm0 = pwm_request(1, “firefly-pwm”);
(3)、配置 PWM使用

int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
配置 PWM 的占空比, 例如:

pwm_config(pwm0, 500000, 1000000);
(4)、使能PWM 函数

int pwm_enable(struct pwm_device *pwm);
用于使能 PWM,例如:

pwm_enable(pwm0);
(5)控制 PWM 输出主要使用以下接口函数:

struct pwm_device *pwm_request(int pwm_id, const char *label);
功能:用于申请 pwm
void pwm_free(struct pwm_device *pwm);
功能:用于释放所申请的 pwm
int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns);
功能:用于配置 pwm 的占空比
int pwm_enable(struct pwm_device *pwm);
功能:使能 pwm
void pwm_disable(struct pwm_device *pwm);
功能:禁止 pwm

编写该驱动程序的几个流程:

1.在设备树下添加相应内容,内容如下:

pwm_demo{
                status = "okay";
                compatible = "pwm_test";
                buzzer-gpio = <&gpio4 18 GPIO_ACTIVE_LOW>;
        };

经测试,gpio一项完全可以不要,compatible为匹配条件,另外在/kernel/arch/arm64/boot/dts/rockchip目录下使用grep "pwm" * -nR命令,搜索结果如下:(关键的内容)

Binary file g3399-development-board.dtb matches
g3399-development-board.dts:234:&pwm3 {
g3399-development-board.dts:237:	compatible = "rockchip,remotectl-pwm";
g3399-development-board.dts:238:	remote_pwm_id = <3>;
rk3399.dtsi:1234:	pwm0: pwm@ff420000 {
rk3399.dtsi:1235:		compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
rk3399.dtsi:1237:		#pwm-cells = <3>;
rk3399.dtsi:1239:		pinctrl-0 = <&pwm0_pin>;
rk3399.dtsi:1241:		clock-names = "pwm";
rk3399.dtsi:1245:	pwm1: pwm@ff420010 {
rk3399.dtsi:1246:		compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
rk3399.dtsi:1248:		#pwm-cells = <3>;
rk3399.dtsi:1250:		pinctrl-0 = <&pwm1_pin>;
rk3399.dtsi:1252:		clock-names = "pwm";
rk3399.dtsi:1256:	pwm2: pwm@ff420020 {
rk3399.dtsi:1257:		compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
rk3399.dtsi:1259:		#pwm-cells = <3>;
rk3399.dtsi:1261:		pinctrl-0 = <&pwm2_pin>;
rk3399.dtsi:1263:		clock-names = "pwm";
rk3399.dtsi:1267:	pwm3: pwm@ff420030 {
rk3399.dtsi:1268:		compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
rk3399.dtsi:1270:		#pwm-cells = <3>;
rk3399.dtsi:1272:		pinctrl-0 = <&pwm3a_pin>;
rk3399.dtsi:1274:		clock-names = "pwm";
rk3399.dtsi:1790:	vop1_pwm: voppwm@ff8f01a0 {
rk3399.dtsi:1791:		compatible = "rockchip,vop-pwm";
rk3399.dtsi:1793:		#pwm-cells = <3>;
rk3399.dtsi:1795:		pinctrl-0 = <&vop1_pwm_pin>;
rk3399.dtsi:1797:		clock-names = "pwm";
rk3399.dtsi:1859:	vop0_pwm: voppwm@ff9001a0 {
rk3399.dtsi:1860:		compatible = "rockchip,vop-pwm";
rk3399.dtsi:1862:		#pwm-cells = <3>;
rk3399.dtsi:1864:		pinctrl-0 = <&vop0_pwm_pin>;
rk3399.dtsi:1866:		clock-names = "pwm";
rk3399.dtsi:2673:		pwm0 {
rk3399.dtsi:2674:			pwm0_pin: pwm0-pin {
rk3399.dtsi:2679:			vop0_pwm_pin: vop0-pwm-pin {
rk3399.dtsi:2685:		pwm1 {
rk3399.dtsi:2686:			pwm1_pin: pwm1-pin {
rk3399.dtsi:2691:			vop1_pwm_pin: vop1-pwm-pin {
rk3399.dtsi:2697:		pwm2 {
rk3399.dtsi:2698:			pwm2_pin: pwm2-pin {
rk3399.dtsi:2704:		pwm3a {
rk3399.dtsi:2705:			pwm3a_pin: pwm3a-pin {
rk3399.dtsi:2711:		pwm3b {
rk3399.dtsi:2712:			pwm3b_pin: pwm3b-pin {

然后打开rk3399.dtsi,内容如下:(sudo vim rk3399.dtsi)然后搜索,在终端输入 :/pwm

pwm0: pwm@ff420000 {
                compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
                reg = <0x0 0xff420000 0x0 0x10>;
                #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm0_pin>;
                clocks = <&pmucru PCLK_RKPWM_PMU>;
                clock-names = "pwm";
                status = "disabled";
        };

        pwm1: pwm@ff420010 {
                compatible = "rockchip,rk3399-pwm", "rockchip,rk3288-pwm";
                reg = <0x0 0xff420010 0x0 0x10>;
                #pwm-cells = <3>;
                pinctrl-names = "default";
                pinctrl-0 = <&pwm1_pin>;
                clocks = <&pmucru PCLK_RKPWM_PMU>;
                clock-names = "pwm";
                status = "disabled";
        };
.......................
此处省略n行代码

可以看到:status = "disabled";

这里我使用的pwm1 所以pwm1下面的status = "disabled";改为status = "okay";同时保证其他的驱动程序没有使用到该pwm通道

现在是添加自己的内容了,我在该目录下的g3399-baseboard.dtsi文件中添加如下内容:

pwm_demo{
                status = "okay";
                compatible = "pwm_test";
                buzzer-gpio = <&gpio4 18 GPIO_ACTIVE_LOW>;
        };

另外建议使用一下方式去打开pwm,这种方式就不用添加上面的信息以及进行上面的操作,多注意设备树里边的&pwm1这样的地方,如果被其他驱动占用,要么整段注释掉,重新写,要么注释掉其他驱动的代码,紧接着在下面写自己的代码 ,如下:

&pwm1 {
        status = "okay";
        compatible = "pwm_1";

};

拿pwm3为例,描述怎么修改,如下,曾今踩过的坑,就是以为把下面的status = "okay" 改为status = "disable"就ok了,没领悟到真谛,还是没对设备树进行系统的了解,status = "disable",实际上是关闭pwm3

&pwm3 {
       /* status = "okay";
        interrupts = <GIC_SPI 61 IRQ_TYPE_LEVEL_HIGH 0>;
        compatible = "rockchip,remotectl-pwm";
        remote_pwm_id = <3>;
        handle_cpu_id = <0>;

        ir_key0 {
                rockchip,usercode = <0xff40>;
                rockchip,key_table =
                        <0xb2   KEY_POWER>,
                        <0xe5   KEY_HOME>,
                        <0xbd   KEY_BACK>,
                        <0xba   KEY_MENU>,
                        <0xf4   KEY_UP>,
                        <0xf1   KEY_DOWN>,
                        <0xef   KEY_LEFT>,
                        <0xee   KEY_RIGHT>,
                        <0xf2   KEY_ENTER>,
                        <0xf0   KEY_REPLY>,
                        <0xea   KEY_VOLUMEUP>,
                        <0xe3   KEY_VOLUMEDOWN>,
                        <0xbc   KEY_MUTE>,
                        <0xfe   KEY_1>,
                        <0xfd   KEY_2>,
                        <0xfc   KEY_3>,
                        <0xfb   KEY_4>,
                        <0xfa   KEY_5>,
                        <0xf9   KEY_6>,
                        <0xf8   KEY_7>,
                        <0xf7   KEY_8>,
                        <0xb6   KEY_9>,
                        <0xff   KEY_0>,
                        <0xed   KEY_BACKSPACE>,

                        <0xaf   KEY_POWER>,
                        <0x8b   KEY_VOLUMEUP>,
                        <0xb9   KEY_VOLUMEDOWN>;
        };*/
        //上面是红外接收的驱动使用信息
        status = "okay";//打开pwm3
        compatible = "pwm_3";//匹配条件
        pwm_id = <3>;//id
        
};

另外wiki上面提供的查看pwm注册情况的命令, cat /sys/kernel/debug/pwm 可以查看注册情况,如果相应的pwm通道没打开,则不会显示,如下,没有打开pwm3,下面这里边的信息有周期以及占空比的相关信息,以及打开的通道的注册情况

platform/ff420020.pwm, 1 PWM device
pwm-0   (vdd-log             ): requested enabled period: 24997 ns duty: 8243 ns polarity: inverse
platform/ff420010.pwm, 1 PWM device
pwm-0   ((null)              ): period: 0 ns duty: 0 ns polarity: inverse
platform/ff420000.pwm, 1 PWM device
pwm-0   (backlight           ): requested enabled period: 24997 ns duty: 10003 ns polarity: normal

 另外,遇到错误代码-517的情况,请参考pwm3错误代码-517

现在第一步就结束了

2.编写设备驱动及Makefile:

#include<linux/pwm.h>
#include <linux/moduleparam.h>
#include <linux/stat.h>

#include <linux/kernel.h>
#include <linux/gpio.h>

#include <linux/init.h>
#include <linux/module.h> 
#include <linux/delay.h>
#include <linux/of.h>
#include <linux/of_gpio.h>
#include <linux/of_platform.h>


#include <linux/version.h>

#include <linux/init.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/pm.h>
#include <linux/sysctl.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#define GPIO_LOW 0
#define GPIO_HIGH 1
struct pwm_device *pwm = NULL;
int major;
int gpio;
static struct class *cls;
static ulong arg1;
static int arg2=0;
module_param(arg1,ulong,S_IRUSR);
module_param(arg2,int,S_IRUSR);
static int pwm_open(struct inode *inode, struct file *file)
{
	printk(KERN_EMERG "%s-%d: enter\n",__FUNCTION__,__LINE__);
	
	return 0;	
}
static struct file_operations pwm_fops = {
    .owner  =   THIS_MODULE,   
    .open   =   pwm_open,        
};
static int pwm_probe(struct platform_device *pdev)
{
	int ret;
	enum of_gpio_flags flag;
	struct device_node *led_node = pdev->dev.of_node;
	
	major = register_chrdev(0, "pwm_test", &pwm_fops);
	cls = class_create(THIS_MODULE, "pwm_test");
	device_create(cls, NULL, MKDEV(major, 0), NULL, "pwm_buzzer"); 
	
	gpio = of_get_named_gpio_flags(led_node,"buzzer-gpio", 0,&flag);
	if (!gpio_is_valid(gpio)){
		printk(KERN_INFO "hello: invalid gpio : %d\n",gpio);
		return -1;
	} 
    ret = gpio_request(gpio, "buzzer");
	if (ret) {
		gpio_free(gpio);
		return -EIO;
	}

	gpio_direction_output(gpio, GPIO_HIGH);
	
	gpio_set_value(gpio,arg2);
	pwm = pwm_request(1,"pwm");
	if(IS_ERR(pwm)){
		dev_err(&pdev->dev,"unable to request pwm\n");
		printk("pwm err %ld\n",PTR_ERR(pwm));
	}
	pwm_config(pwm,arg1,100000);
	pwm_enable(pwm);
	printk(KERN_INFO "pwm sucess\n");
	return 0;
}

static struct of_device_id pwm_of_match[] = {
        { .compatible = "pwm_test"},
        {}
};
static int pwm_remove(struct platform_device *pdev)
{
	gpio_free(gpio);
	device_destroy(cls, MKDEV(major, 0));
	class_destroy(cls);
	unregister_chrdev(major, "pwm_test");
	pwm_free(pwm);
	return 0;
}
static struct platform_driver pwm_driver={
        .driver = {
                .name           ="pwm",
                .owner          =THIS_MODULE,
                .of_match_table = pwm_of_match,
        },
        .probe  = pwm_probe,
        .remove = pwm_remove,
};
static int __init pwm_init(void)
{
    printk(KERN_INFO "Enter %s\n", __FUNCTION__);
    return platform_driver_register(&pwm_driver);
    return 0;
}
static void __exit pwm_exit(void)
{
	platform_driver_unregister(&pwm_driver);
    printk(KERN_INFO "Exit pwm_driver\n");
}
module_init(pwm_init);
module_exit(pwm_exit);
MODULE_LICENSE("GPL");
#!/bin/bash

obj-m += pwm.o

KDIR := /rk3399/source/g3399-v7-1-2-20180529/kernel


PWD ?= $(shell pwd)
all:
        make -C $(KDIR) M=$(PWD) modules

clean:
        rm -rf *.o *.ko

到此,结束。

使用ls /dev 命令可以看到自己生成的设备结点,另附上本驱动加载命令: insmod pwm.ko arg1=80000 arg2=0

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rk3399下pwm驱动 的相关文章

  • 蓝桥杯之单片机学习(十)——PWM脉宽调制信号的发生与控制

    文章目录 一 训练任务1 1 具体要求 二 代码展示三 一些介绍 一 训练任务 在CT107D单片机综合训练平台上 xff0c 利用PWM脉宽信号实现独立按键S7对L1指示灯亮度变化的控制 1 1 具体要求 PWM脉宽信号的频率为100Hz
  • Simulink 使用C语言发PWM波 (一)

    1 在matlab中安装C语言模块mingw 2 在simulink中引用S Function模块 和S Function Examples模块 3 使用S Function Examples模块创建C文件 双击S Function Exa
  • 【STM32Cube HAL】输入捕获(六)——PWM测量

    对于PWM的捕获 xff0c 我这里一共使用两种方法实现 xff1a 第一种是PWM输入模式 xff0c 采用一个定时器的两个通道 xff08 通道一和通道二 xff09 xff0c 配置从模式为复位模式 xff0c 没有进行溢出处理 xf
  • STM32F103VCT6 高级定时器的PWM输出

    要求得到下列波形 xff0c 死区时间1us CH1和CH1之间的相位差事3us 频率50HZ 1 xff0c To get TIM1 counter clock at 72MHz the prescaler is computer as
  • 首个单芯片超小封装I2C转PWM解决方案

    ZW10I8X系列 高性能工业级16位高精度I2C转PWM接口SOC芯片 接口标准 符合飞利浦的I2C标准规范 xff0c 目前支持的速度为小于100kbit 建议使用50k 1个使能脚 xff08 ZW10I8xE后缀带E的 xff09
  • PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf
  • 【STM32CubeMX】使用STM32F103C8T6输出PWM波形实现呼吸灯

    STM32CubeMX 使用STM32F103C8T6输出PWM波形实现呼吸灯 一 关于PWM二 Cube MX创建工程三 修改代码四 效果展示五 总结六 参考与代码下载 一 关于PWM 1 关于PWM 含义 PWM xff08 Pulse
  • stm32通用定时器输出PWM控制舵机

    stm32的通用定时器有TIM2 TIM3 TIM4 TIM5 xff0c 每个定时器都有独立的四个通道可以作为 xff1a 输入捕获 输出比较 PWM输出 单脉冲模式输出等 stm32除了基本定时器 xff0c 其他定时器都能输出PWM
  • 基于STC89C52的智能小车——PWM调速篇

    虽然我的小车因为电池电压太低慢的要死 xff0c 不过PWM还是要学的 PWM简单来说就是通过调整占空比 xff08 一个时间段 t 内电机运行的时间占总时间的比例 xff09 来调整小车速度 当然为了小车运行稳定 t 必须很小 xff0c
  • 怎么把PWM信号转为模拟量

    有一个测量位置变化的位置传感器 xff0c 用万用表电压档测量传感器的输出信号 xff0c 结果显示的是模拟量信号 xff0c 即位置和信号输出大小呈线性关系 但是 xff0c 用示波器 xff08 Picoscope 4227 xff09
  • 电机控制基础——定时器基础知识与PWM输出原理

    单片机开发中 电机的控制与定时器有着密不可分的关系 无论是直流电机 步进电机还是舵机 都会用到定时器 比如最常用的有刷直流电机 会使用定时器产生PWM波来调节转速 通过定时器的正交编码器接口来测量转速等 本篇先介绍定时器的基础知识 然后对照
  • PWM 互补两个引脚输出相同的PWM波形 CH1 和CH1N

    将互补CH1N 输出pwm与CH1输出相同的波形 TIM OCInitStructure TIM OCPolarity TIM OCPolarity Low 输出极性 TIM输出比较极性高 TIM OCInitStructure TIM O
  • EDK2编译记录

    EDK2 EDK2 PLATFORM EDK2 NON OSI 以上三个仓库 EDK2是主仓库 EDK2 PLATFORM是和EDK2版本对应的板子和CPU相关的仓库 比如树莓派的就在这个里面 EDK2 NON OSI是有一些license
  • RV1126 isp开发文档记录

    Rockchip IQ Tools Guide ISP2x v1 3 pdf 主要介绍 RKISP2 x Tuner 以下简称 Tuner 提供了一套便于用户调试 ISP 参数的工具 用户可以在 Tuner 中对所有 ISP 模块开展标定
  • STM32的PWM控制4个舵机

    本人虽然接触STM32快半年了 但是最近才开始系统的学习STM32 建议一边学 一边做东西 能够更快的提升自己 我用的定时器是TIM3 所以我会把我出现的问题 分享给大家 希望大佬多多指教 因为我先进行部分映射 但是控制某个舵机的PB4引脚
  • 什么是死区时间

    死区时间是PWM输出时 为了使H桥或半H桥的上下管不会因为开关的关断延迟问题发生同时导通而设置的一个保护时段 通常也指pwm响应时间 由于IGBT 绝缘栅极型功率管 等功率器件都存在一定的结电容 所以会造成器件导通关断的延迟现象 一般在设计
  • stm32f103 TIM2定时器4路PWM输出实验

    这里以TIM2为例 pwm c include pwm h uint16 t TIM2 CCR1 Val uint16 t TIM2 CCR2 Val uint16 t TIM2 CCR3 Val uint16 t TIM2 CCR4 Va
  • rk3399 Android9.0 ota升级失败

    rk3399 Android9 0 ota升级失败 问题 在rk3399 Android9 0 项目中需要 ota 功能 user版本编译完ota升级包后 在同版本整包升级时遇到如下问题 抓到的logcat内容如下 1044 2343 D
  • STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考 stm32 定时器输出PWM原理及工作原理 控制舵机 作者 点灯小哥 发布时间 2021 03 09 23 17 52 网址 https blog csdn net weixin 46016743 article details 11
  • FriendlyDesktop系统烧写,SOM-RK3399/NanoPC T4烧录系统

    SOM RK3399 SOM RK3399 V2 NanoPC T4的系统是通用的 由于Type C烧写有蛮大的概率会识别不成功 实测 所以建议使用SD卡脱机烧写 友善之臂提供了几种系统支持 android7 8 10 FriendlyCo

随机推荐

  • 2021校招_海康威视

    2021届海康威视面试 一面 xff1a 1 https与http协议的区别 2 Spring的启动过程 3 Springboot相比较Spring的优点 4 Linux修改文件权限命令 5 项目中所用到的技术 6 Restful风格 7
  • 2021校招_满帮(运满满)

    一面 xff08 电话面 xff09 xff1a 25min 1 询问HashMap相关结构以及原理 2 红黑树的基本结构 xff0c 以及什么时候会LL xff08 左转 xff09 3 Spring如何解决循环依赖的 4 Redis缓存
  • 2021校招_思科

    思科给我发的太晚了 xff0c 十一月份才给我消息 思科一面凉凉 主要是针对你的简历 问到我的主要内容包括 xff1a 数据库设计 xff0c 是否使用到设计模式 xff0c 以及遇到问题如何解决 包括ngnix xff0c redis h
  • 音视频开发之音频基础知识

    音视频开发之音频基础知识 转自https blog jianchihu net av develop audio basis html 什么是声音 介质振动在听觉系统中产生的反应 是一种波 因为是一种波 xff0c 所以我们可以用频率 振幅
  • 机器学习中神经网络,支持向量机以及贝叶斯分类器总结

    第五章神经网络 5 1神经元模型 神经网络中最基本的成分是神经元模型 xff0c 即 简单单元 在 M P神经元模型 中 xff0c 神经元接受收到来自n个其他神经元传递过来的输入信号 xff0c 这些输入信号经过带权重的连接进行传递 xf
  • 机器学习中的降维与度量学习(reduce dimension and metric learning)

    降维与度量学习 k近邻学习 k近邻 k Nearest Neighbor 简称kNN 学习是一种监督学习方法 其工作机制为 xff1a 在样本中 xff0c 根据距离度量找出训练集中临近的k个样本 xff0c 基于这k个样本进行预测 一般
  • Warning: Invalid argument “/map“ passed to canTransform argument target_frame in tf2 frame_ids···

    Warning Invalid argument map passed to canTransform argument target frame in tf2 frame ids cannot start with a like at l
  • CAN为什么会发送失败

    CAN总线调试过程中出现报文发送失败 xff0c 很多工程师都对此只知其一不知其二 xff0c 这里就CAN报文发送失败的问题我们来做一次探讨 在了解CAN报文为什么会发送失败之前我们先看看一条正确的CAN报文到底应该是怎么样的 xff0c
  • git分支和tag

    分支管理 查看当前分支 git branch创建分支 git branch git branch index one切换分支 git checkout lt 分支名称 xff0c 主分支是master gt git checkout ind
  • TT无人机扩展模块库分析(default.ino)补篇2

    这个简单 请对照 因为源码在这里出现了和手柄相关的源码 设置tof传感器的超时时间 xff08 500 xff09 什么单位 xff1f 没有搜索到 xff0c 我用SI了 搜索到了 有很多函数 定位位置 在这里 找到了 xff0c 为什么
  • TCP建立连接的过程

    TCP是面向连接的 可靠的 基于字节流的传输层协议 xff0c 是TCP IP协议中最重要的协议之一了 我们都知道TCP通过三次握手建立连接 xff0c 那么每一次握手的作用 为什么要三次握手 如果某次握手丢包会发生什么呢 xff1f 文章
  • CANanlystII 基于linux的二次开发实践

    1 USBCAN分析仪国内现状 这是目前国内市场上的USBCAN分析仪现状 2 创芯科技产品 创芯科技的这个红色盒子是我比较下来综合性价比最高的 同时支持windows和linux的设备只要320元左右 你既可以用可视化界面发送 接收报文
  • AXI DMA总结、内核axidmatest.c测试程序分析、SG mode

    AXI DMA 概述 xff1a XILINX提供的AXI DMA支持Scatter Gather mode和Direct Register mode 数据位宽支持32 64 128 256 512 1024bits xff0c strea
  • ZYNQ 平台 AD9361实现网络通信的一种方案+网卡驱动分析及实现

    声明 xff1a 文中若有不合理的地方 xff0c 欢迎讨论学习及指正 xff0c 本文仅仅涉及软件部分的代码 xff0c 不阐述逻辑代码的实现 功能 xff1a 通过AD9361芯片实现无线组网 xff0c 能实现视频 文件 音频等传输
  • MTD分析

    概述 xff1a 本文对mtd的整个结构进行了分析 xff0c 分析得并非很深入 xff0c 但可以了解大体框架和目录结构 xff0c 另外本文会对源码文件进行分析 xff0c 大致描述其作用 xff0c 针对本文的内容中 xff0c 如有
  • CAN总线详解(转)

    1 简介 CAN是控制器局域网络 Controller Area Network CAN 的简称 xff0c 是一种能够实现分布式实时控制的串行通信网络 优点 xff1a 传输速度最高到1Mbps xff0c 通信距离最远到10km xff
  • Linux Socket CAN——驱动开发(转)

    Linux Socket CAN驱动开发 一 CAN总线协议 CAN是Controller Area Network 控制器局域网 的缩写 CAN通信协议在1986年由德国电气商博世公司所开发 xff0c 主要面向汽车的通信系统 现已是IS
  • Joint state with name: “base_l_wheel_joint” was received but not found in URDF

    ROS melodic下运行出现 WARN xff1a Joint state with name base l wheel joint was received but not found in URDF 原因是在robot描述文件URD
  • 已解决 vmware 虚拟机安装后没有虚拟网卡问题

    我用的方法是重装vmware xff0c 使用的是win10的系统 之前安装网ubuntu以后 xff0c 发现主机并没有虚拟网卡 xff0c 也百度了各种方法 xff0c 然而并没有什么用 xff0c 也问了很多人 xff0c 他们也提供
  • rk3399下pwm驱动

    现在记录一下rk3399下pwm的驱动编写 xff0c 下面是内核pwm的API xff0c 从开源论坛复制 xff08 firefly的开源论坛里面的Wiki教程 xff09 1 在要使用 PWM 控制的设备驱动文件中包含以下头文件 xf