4260|5

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

谁来救救我的PWM程序啊!! [复制链接]

各位eeworldD的大侠们。小弟初学嵌入式。用s3c2410的定时器0产生PWM信号。但是当我结束应用程序后,驱动产生的PWM波还在。这是怎么回事啊?望各位大侠不吝赐教。
我的驱动程序如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. #define pwm_device_MAJOR 50
  14. #define DEVICE_NAME "pwm_device"
  15. #define FREQ 50
  16. #define PWM_CLOSE 0
  17. #define PWM_OPEN 1
  18. static int pwm_device_close(struct inode *inode,struct file *file);
  19. static int pwm_device_open(struct inode *inode,struct file *file);
  20. static int pwm_device_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg);
  21. static int __init pwm_device_init(void);
  22. static void __exit pwm_device_cleanup(void);


  23. static struct file_operations pwm_device_fops=
  24. {
  25.         owner:                THIS_MODULE,
  26.         open:                pwm_device_open,
  27.         release:        pwm_device_close,
  28.         ioctl:                pwm_device_ioctl,
  29. };
  30. static void set_pwm_duty(unsigned long duty)
  31. {
  32.         unsigned long tcon;
  33.         unsigned long tcnt;
  34.         unsigned long tcmp;
  35.         unsigned long tcfg0;
  36.         unsigned long tcfg1;

  37.         struct clk *clk_p;
  38.         unsigned long pclk;

  39.         s3c2410_gpio_cfgpin(S3C2410_GPB0,S3C2410_GPB0_TOUT0);

  40.         tcfg0 = __raw_readl(S3C2410_TCFG0);
  41.         tcfg1 = __raw_readl(S3C2410_TCFG1);
  42.         tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
  43.         tcfg0 |= (256 - 1);
  44.         tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
  45.         tcfg1 |= S3C2410_TCFG1_MUX0_DIV16;
  46.        
  47.         __raw_writel(tcfg0, S3C2410_TCFG0);
  48.         __raw_writel(tcfg1, S3C2410_TCFG1);
  49.   
  50.         clk_p = clk_get(NULL, "pclk");
  51.         pclk  = clk_get_rate(clk_p);
  52.         tcnt  = (pclk/256/16)/FREQ;
  53.         tcmp  = (tcnt*duty)/100;       
  54.         __raw_writel(tcnt, S3C2410_TCNTB(0));
  55.         __raw_writel(tcmp, S3C2410_TCMPB(0));
  56.                
  57.         tcon = __raw_readl(S3C2410_TCON);                       
  58.         tcon &= ~0x1f;
  59.         tcon |= 0xb;
  60.         __raw_writel(tcon, S3C2410_TCON);
  61.        
  62.         tcon &= ~2;       
  63.         __raw_writel(tcon, S3C2410_TCON);
  64. }
  65. static int __init pwm_device_init(void)
  66. {
  67.         int result;
  68.         result=register_chrdev(pwm_device_MAJOR,DEVICE_NAME,&pwm_device_fops);
  69.         if (result<0)
  70.         {
  71.                 printk(KERN_INFO "[FAILED:Cannot register pwm_device Device!]\n");
  72.                 return -EIO;
  73.         }
  74.         else
  75.                 printk("Initializing pwm_device Device\t----->\t");
  76.                 printk("[OK]\n");
  77.                 return 0;
  78. }

  79. static int pwm_device_open(struct inode *inode,struct file *file)
  80. {
  81.         printk(KERN_CRIT "DEMO:pwm_device Device Open!\n");
  82.         return 0;
  83. }
  84. static int pwm_device_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
  85. {
  86.         switch(cmd)
  87.         {
  88.         case PWM_CLOSE:
  89.                 break;
  90.         case PWM_OPEN:
  91.                 if (arg == 0)
  92.                         return -EINVAL;
  93.                 set_pwm_duty(arg);
  94.                 break;
  95.         default:
  96.                 break;       
  97.         }
  98.         return 0;
  99. }

  100. static int pwm_device_close(struct inode *inode,struct file *file)
  101. {
  102.         printk(KERN_CRIT "DEMO:pwm_device Device close!\n");
  103.         return 0;
  104. }

  105. static void __exit pwm_device_cleanup(void)
  106. {
  107.         unregister_chrdev(pwm_device_MAJOR,DEVICE_NAME);
  108.         printk("DEMO:pwm_device Device Is Cleanup!\n");
  109. }

  110. module_init(pwm_device_init);
  111. modele_exit(pwm_device_cleanup);

  112. MODULE_LICENSE("GPL");
复制代码

应用程序如下:
  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include

  7. #define DEVICE "/dev/pwm_device"

  8. int main()
  9. {
  10.         int fd;
  11.         int on_off;
  12.         int duty;
  13.         fd=open(DEVICE,O_RDWR);
  14.         if(fd<0)
  15.         {
  16.                 printf("open device error!\n");
  17.                 exit(-1);
  18.         }
  19.         printf("请输入控制信号.0为关闭PWM输出,1为打开PWM输出功能!\n");
  20.         scanf("%d",&on_off);
  21.         printf("您的输入是:%d\n",on_off);
  22.         printf("请输入小于100的占空比值!\n");
  23.         scanf("%d",&duty);
  24.         printf("您的输入是:%d\n",duty);
  25.         ioctl(fd,on_off,duty);
  26.         while(1);
  27.         close(fd);
  28.         return 0;
  29. }
复制代码

结束应用程序后,控制台有显示:DEMO:pwm_device Device close!但是PWM依旧产生。不知道这样是否正常。请大侠们帮帮我吧。小弟在此先谢过了!

最新回复

unregister_chrdev(pwm_device_MAJOR,DEVICE_NAME); 这个函数不能实现将驱动移除吗?  详情 回复 发表于 2010-2-25 00:02
点赞 关注

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
pwm_device_ioctl和pwm_device_close都没有实现关闭PWM。

这里是wince区,你可以去Linux区
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
pwm_device_ioctl和pwm_device_close都没关PWM的代码,
static void __exit pwm_device_cleanup(void)是关PWM的代码吗?这个函数是什么时候执行的?卸载驱动的时候?
建议在pwm_device_ioctl或pwm_device_close里处理一下。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 2 楼 veabol 的回复:
pwm_device_ioctl和pwm_device_close都没关PWM的代码,
static void __exit pwm_device_cleanup(void)是关PWM的代码吗?这个函数是什么时候执行的?卸载驱动的时候?
建议在pwm_device_ioctl或pwm_device_close里处理一下。


卸载驱动的时候调用__exit pwm_device_cleanup
 
 
 

回复

53

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 1 楼 oneonce 的回复:
pwm_device_ioctl和pwm_device_close都没有实现关闭PWM。

这里是wince区,你可以去Linux区

可是我找不到专门的嵌入式linux区啊!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(中级)

6
 
unregister_chrdev(pwm_device_MAJOR,DEVICE_NAME);
这个函数不能实现将驱动移除吗?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表