查看: 4605|回复: 5

pcDuino Linux驱动开发五 -- 最简单的PWM驱动

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2014-8-20 13:24:23 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 tjcfeng 于 2014-8-20 14:50 编辑

      其实比较来说,PWM比中断还要简单,只不过一般刚接触的板子首先实现的都是基本的IO,所以把PWM安排在了中断之后。为了不使帖子看起来内容太少,这个程序将两路PWM 放在了一起,不过也是多了几个寄存器的设置而已。

      另外要吐槽一下A10,PWM少就不说什么了,居然计数寄存器只有8位。是的,只有8位,最大到255而已,这个也太弱了吧。
    AAA.png

    还有预分频,也只有这么几个
    BBB.png

    看到0101...0111那几个了吗?经过尝试后,发现其实是起作用的,是/720、/840、/960,后面的1101...1111是84K、96K、108K,权当一点补偿吧。

    下面上程序,跟GPIO的一样,还是精简得不能再精简了。接线方式没来得及拍照,后面补上。
    1. #include <linux/init.h>
    2. #include <linux/module.h>
    3. #include <linux/fs.h>
    4. #include <linux/cdev.h>
    5. #include <linux/device.h>
    6. #include <linux/wait.h>
    7. #include <linux/delay.h>
    8. #include <asm/io.h>
    9. #include <asm/uaccess.h>

    10. #include "../A10.h"

    11. /**********************************************************************/
    12.         #define PWM_CH0                2

    13.         volatile static unsigned long* REG_PB_CFG0;
    14.         volatile static unsigned long* REG_PI_CFG0;
    15.         volatile static unsigned long* REG_PWM_CTRL_REG;
    16.         volatile static unsigned long* REG_PWM_CH0_PERIOD;
    17.         volatile static unsigned long* REG_PWM_CH1_PERIOD;
    18.         
    19.         static int Inited = 0;

    20. static int PWM_open(struct inode* n, struct file* f)
    21. {
    22.         int Result = 0;

    23.         Inited++;
    24.         if (Inited > 1)
    25.         {
    26.                 return 0;
    27.         }

    28.         REG_PB_CFG0 = (volatile unsigned long*) ioremap(PB_CFG0, 4);
    29.         REG_PI_CFG0 = (volatile unsigned long*) ioremap(PI_CFG0, 4);
    30.         REG_PWM_CTRL_REG = (volatile unsigned long*) ioremap(PWM_CTRL_REG, 4);
    31.         REG_PWM_CH0_PERIOD= (volatile unsigned long*) ioremap(PWM_CH0_PERIOD, 4);
    32.         REG_PWM_CH1_PERIOD= (volatile unsigned long*) ioremap(PWM_CH1_PERIOD, 4);
    33.         
    34.         
    35.         *REG_PB_CFG0 &= ~(0x7 << 8) ;
    36.         *REG_PB_CFG0 |= (0x2 << 8) ; //PWM0
    37.         
    38.         *REG_PI_CFG0 &= ~(0x7 << 12) ;
    39.         *REG_PI_CFG0 |= (0x2 << 12) ; //PWM1

    40.         *REG_PWM_CH0_PERIOD = (249 << 16) + 5;
    41.         *REG_PWM_CTRL_REG |= (0xF << 0);
    42.         *REG_PWM_CTRL_REG |= (0x0 << 8) + (0x0 << 7) + (0x1 << 6) + (0x0 << 5);
    43.         *REG_PWM_CTRL_REG |= (0x1 << 4);
    44.         
    45.         *REG_PWM_CH1_PERIOD = (249 << 16) + 5;
    46.         *REG_PWM_CTRL_REG |= (0x8 << 15);
    47.         *REG_PWM_CTRL_REG |= (0x0 << 23) + (0x0 << 22) + (0x1 << 21) + (0x1 << 20);
    48.         *REG_PWM_CTRL_REG |= (0x1 << 19);

    49.         printk("Open Finished!\n");
    50.         return Result;
    51. }

    52. static ssize_t PWM_write(struct file* f, const char __user* buf, size_t len, loff_t* l)
    53. {
    54.         //printk("Write Finished!\n");
    55.         return 0;
    56. }

    57. static ssize_t PWM_read(struct file* f, char __user* buf, size_t len, loff_t* l)
    58. {
    59.         //printk("Read Finished!\n");
    60.         return 0;
    61. }

    62. static int PWM_close(struct inode* n, struct file* f)
    63. {
    64.         Inited--;
    65.         if (Inited > 0)
    66.         {
    67.                 return 0;
    68.         }

    69.         *REG_PWM_CTRL_REG = 0;
    70.         *REG_PWM_CH0_PERIOD = 0;
    71.         *REG_PWM_CH1_PERIOD = 0;
    72.         
    73.         iounmap(REG_PB_CFG0);
    74.         iounmap(REG_PI_CFG0);
    75.         iounmap(REG_PWM_CTRL_REG);
    76.         iounmap(REG_PWM_CH0_PERIOD);
    77.         iounmap(REG_PWM_CH1_PERIOD);

    78.         printk("Close Finished!\n");
    79.         return 0;
    80. }

    81. /**********************************************************************/
    82.         #define DEV_NAME        "PWM"
    83.         #define DEV_COUNT        1

    84.         static struct class* pClass;
    85.         int major;
    86.         
    87.         static struct file_operations fops =
    88.         {
    89.                 .owner = THIS_MODULE,
    90.                 .open = PWM_open,
    91.                 .write = PWM_write,
    92.                 .read = PWM_read,
    93.                 .release = PWM_close,
    94.         };

    95. static int __init PWM_init(void)
    96. {
    97.         major = register_chrdev(0, DEV_NAME, &fops);
    98.         pClass = class_create(THIS_MODULE, DEV_NAME);
    99.         if (pClass == NULL)
    100.         {
    101.                 unregister_chrdev(major, DEV_NAME);
    102.                 return -1;
    103.         }
    104.         device_create(pClass, NULL, MKDEV(major, 0),  NULL, DEV_NAME);
    105.         
    106.         PWM_open(NULL, NULL);
    107.         //printk("Init Finished!\n");

    108.         return 0;
    109. }

    110. static void __exit PWM_exit(void)
    111. {
    112.         PWM_close(NULL, NULL);
    113.         
    114.         unregister_chrdev(major, DEV_NAME);
    115.         if (pClass)
    116.         {
    117.                 device_destroy(pClass, MKDEV(major, 0));
    118.                 class_destroy(pClass);
    119.         }
    120.         //printk("Exit Finished!\n");
    121. }

    122. MODULE_LICENSE("GPL");
    123. MODULE_AUTHOR("LiuYang");
    124. module_init(PWM_init);
    125. module_exit(PWM_exit);
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-8-5 08:38
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2014-8-21 09:01:31 | 显示全部楼层
    支持连载,支持原创!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

     楼主| 发表于 2014-8-21 10:43:42 | 显示全部楼层
    jameswang 发表于 2014-8-21 09:01
    支持连载,支持原创!

    感谢。一点学习笔记,水平有限,有错误的地方请指正。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-8-15 09:28
  • 签到天数: 222 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2014-8-21 22:22:40 | 显示全部楼层
    多谢 楼主分享
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2015-8-5 08:38
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2014-8-21 22:24:00 | 显示全部楼层
    看好贴,留脚印
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2014-5-20 10:01
  • 签到天数: 41 天

    连续签到: 1 天

    [LV.5]常住居民I

    发表于 2014-8-21 22:24:31 | 显示全部楼层
    支持,必须顶!!!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-22 20:39 , Processed in 0.158416 second(s), 26 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.