2.1 LS2K0300驱动舵机(修订1)

1、配置设备树

修改此文件loongson_2k0300_pai_99_wifi.dts

(1)为什么上述pwms是3个参数,而网上有的是4个参数

因为在dtsi文件里pwm3也就是第4个PWM的属性有这一句#pwm-cells = <2>; 表示PWM3,通道0,有2个参数,此时PWM默认的属性是0--对应的就是极性正常。

(2)为什么要极性反转

因为PWM,应该是高电平持续的时间,所以此时需要设置极性为1--对应的就是极性反转

因而需要设置    pwm_set_polarity(servo.pwm, PWM_POLARITY_INVERSED); // 极性反转

2、驱动模块

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>

#include <linux/pwm.h>

#define SERVO_MISCMINOR     255
#define SERVO_MISCNAME      "servo"

struct Servo_dev{
    struct device *dev;
    struct pwm_device *pwm;
};

struct Servo_dev servo;

static int pwm_init(struct Servo_dev *servo)
{
    servo->pwm = pwm_get(servo->dev, NULL);
    if(IS_ERR(servo->pwm)) {
        printk("get pwm error\r\n");
        goto fail_pwm;
    }
    return 0;

fail_pwm:
    return -ENAVAIL;
}

static const struct file_operations servo_fops = {
    .owner = THIS_MODULE,
};

static struct miscdevice servo_miscdev = {
    .minor = SERVO_MISCMINOR,
    .name = SERVO_MISCNAME,
    .fops = &servo_fops,
};


static int servo_probe(struct platform_device *pdev)
{   
    int ret;
    printk("find servo\r\n");

    ret = misc_register(&servo_miscdev);
    if(ret) {
        ret = -EINVAL;
        printk("misc register error\r\n");
        goto fail_misc;
    }

    servo.dev = &pdev->dev;
    
    ret = pwm_init(&servo);
    if(ret < 0) {
        printk("pwm init error\t\n");
    }

    //pwm_config(servo.pwm, 500000, 20000000);//--0.5ms
    pwm_config(servo.pwm, 1500000, 20000000);//--1.5ms


    pwm_set_polarity(servo.pwm, PWM_POLARITY_INVERSED); // 反转极性
    pwm_enable(servo.pwm);

    return 0;


fail_misc:
    return ret;
}

static int servo_remove(struct platform_device *pdev)
{
    printk("remove servo\r\n");

    misc_deregister(&servo_miscdev);
    pwm_disable(servo.pwm);
    pwm_put(servo.pwm);
    printk("pwm put finish\r\n");

    return 0;
}

static const struct of_device_id servo_of_match[] ={
    {.compatible = "loongson,ls2k0300_servo"},
    {},
};

static struct platform_driver servo_driver = {
    .probe = servo_probe,
    .remove = servo_remove,
    .driver = {
        .name = "servo_pwm",
        .of_match_table = servo_of_match,
    },
};

module_platform_driver(servo_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("WwuSama");

3、为啥这样做?

(1)之前博客有特别使用MISC+platform进行点灯,只需要替换LED部分就行了,然后还需要添加添加 PWM获取、占空比配置、使能->舵机转动,关闭使能,这4步。

(2)配置设备树后,必须要重新生成vmlinuz,将vmlinuz放置到、boot目录下sync同步数据,并reboot重启(之前博客都有)

4、连线方式

*****注意线要连稳定****

### 关于 LS2K0300 和 VL53L0X 的驱动及适配 #### 1. LS2K0300 芯片概述 LS2K0300 是一款基于 RISC-V 架构的处理器芯片,广泛应用于嵌入式设备开发中。其支持多种外设接口,能够轻松实现与其他传感器模块的连接[^1]。 #### 2. VL53L0X 传感器简介 VL53L0X 是 STMicroelectronics 推出的一款高性能飞行时间 (ToF) 测距传感器,能够在短距离范围内提供精确的距离测量功能。该传感器通过 I&sup2;C 协议与主控芯片通信,并具有低功耗特性[^2]。 #### 3. 驱动下载途径 对于 LS2K0300 平台上的 VL53L0X 支持,可以参考以下资源获取相关驱动程序: - **官方文档**: 访问 ST 官方网站,查阅 VL53L0X 数据手册以及应用笔记,其中包含了详细的硬件设计指南和软件初始化流程说明[^3]。 - **开源项目库**: GitHub 上存在多个针对不同 MCU/SoC 平台编写的 VL53L0X 驱动代码仓库。例如 `pololu/vl53l0x-arduino` 提供了一个通用框架,稍作修改即可移植到 K210/Kendryte SDK 中使用[^4]。 #### 4. 适配教程要点 以下是将 VL53L0X 成功集成至 LS2K0300 系统中的几个关键技术点: ##### a. 初始化配置 确保正确设置 I&sup2;C 总线参数(如 SDA/SCL 引脚映射及时钟频率),以便顺利读写寄存器数据。通常情况下,默认地址为 `0x29` ,但在某些特殊应用场景下可能需要更改此值[^5]。 ```c #include "i2c.h" void init_i2c() { i2c_init(I2C_PORT, I2C_FREQ); // Initialize I2C peripheral } ``` ##### b. 寄存器操作封装函数 为了提高可维护性和跨平台兼容性,建议编写一组抽象层 API 来处理具体细节层面的操作请求。 ```c uint8_t read_register(uint8_t reg_addr); void write_register(uint8_t reg_addr, uint8_t value); // Example usage: write_register(VL53L0X_REG_SYSRANGE_START, 0x01); // Start ranging measurement ``` ##### c. 错误检测机制 考虑到实际运行环境可能存在干扰因素影响正常工作状态,在每次交互之前都应该加入必要的校验逻辑来保障稳定性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值