sysfs方式实现马达驱动

本文详细介绍了如何使用sysfs来实现Android系统的马达驱动,包括马达的控制函数、用户空间的交互以及sysfs文件系统节点的创建。通过ioctl调用驱动进行马达转速和运行时间的控制,同时展示了设备注册和移除的过程。
摘要由CSDN通过智能技术生成

    由于对sysfs的概念不是太清楚,只是知道sysfs是一种类似于/proc的虚拟文件系统,可以在用户空间读写sysfs中的相应文件访问或控制内核空间数据,后拜读各类文章后终于对sysfs及平台设备有了更深层次的理解,但读的再多不如亲手一试。恰巧公司需要为android系统提供一个马达驱动,并且android又恰巧很多驱动的读写方式都是通过sysfs操作的,于是开始行动……

#define VIBRA_MINOR 88

#define STARTUP_VIBRA_DELAY 150

static unsigned int onkey_stat;
static struct timer_list vibra_timer;

static void vibra_stop_vibration(unsigned long data)
{       
    struct micco_vibra *vibra = (void *)data;
    struct vibra_control *control = vibra->vibra_ctl;
    control->level = 0x0;
    micco_write(MICCO_VIBRA_CONTROL, control->level);
}

static int raw_vibrate(int level) //驱动马达,level控制转速
{
    u8 val;
    val = level & 0x00fe;
    DMSG("+/-vibra_ioctl/n");
    micco_write(MICCO_VIBRA_CONTROL, val);
    return 0;

}

static int adv_vibrate(struct vibra_control *ctl) //驱动马达,level控制转速
{
    u8 val;
    val = ctl->level & 0x00fe;
    micco_write(MICCO_VIBRA_CONTROL, val);
    mod_timer(&vibra_timer, jiffies + msecs_to_jiffies(ctl->m_time));

    return 0;
}

static int vibra_ioctl(struct inode *inode, struct file *file,
    unsigned int cmd, unsigned long arg) //用户空间通过ioctl操作马达
{
    int ret;
    unsigned int level;
    u8 val;

    unsigned int onkey_val;
    struct vibra_control ctl;

    switch(cmd) {
    case VIBRA_RAW_VIBTATION:
        ret = copy_from_user(&level, (void *)arg, sizeof(unsigned int));
        ret = raw_vibrate(level);
        break;

    case VIBRA_ADV_VIBTATION:
        ret = copy_from_user(&

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值