天嵌 ARM开发社区

 找回密码
 注册
查看: 2874|回复: 7

pwm的驱动

[复制链接]
nono1860 发表于 2010-5-12 02:46:07 | 显示全部楼层 |阅读模式
亚瑟王你好,我在编写pwm的驱动时,要使tout2智慧,以下是程序代码,但是每次在跑一半的时候arm都会自动重新启动,后来我一行一行检查发现在  tcfg0 |= (50 - 1)<<8;把
<<8去掉,就不会重开机了,但是tout2的tcfg0就不能得到想要的分频,不知我的tcfg0有无设错呢?(核心2.6.30)
          s3c2410_gpio_cfgpin(S3C2410_GPB2, S3C2410_GPB2_TOUT2);
      
        tcfg0 &= ~S3C2410_TCFG_PRESCALER1_MASK;
        tcfg0 |= (50 - 1)<<8;
         
        tcfg1 &= ~S3C2410_TCFG1_MUX2_MASK;
        tcfg1 |= S3C2410_TCFG1_MUX2_DIV2;
       __raw_writel(tcfg0, S3C2410_TCFG0);
       __raw_writel(tcfg1, S3C2410_TCFG1);
 楼主| nono1860 发表于 2010-5-12 18:02:27 | 显示全部楼层
我想写个可以控制频率的脉波,我用udelay或者自己用tout2的定时器去作延迟(利用TCNTO),我的程序代码驱动码如下:
For(i=0;i<1000000;i++)几个脉波
{
s3c2410_gpio_setpin(S3C2410_GPB5,1);
udelay(1);
s3c2410_gpio_setpin(S3C2410_GPB5,0);
udelay(1);
}
但是执行几秒钟,arm就会自己重新启动,请问阿瑟王大哥,是不是s3c2410_gpio_setpin不能快速执行这样的程序呢?
因为tout0 、tout1已经被用走了,我必须用类似的方法在写出脉波,请麻烦帮忙我 谢谢
 楼主| nono1860 发表于 2010-5-12 19:04:22 | 显示全部楼层
设备档编译会出现warning: initialization from incompatible pointer type 这行错误 ,请问有差吗?

[root@localhost ko]# make
#make -C  M=/apps1/LED/leds/ko
cd /opt/EmbedSky/linux-2.6.30.4; make SUBDIRS=/apps1/LED/leds/ko modules
make[1]: Entering directory `/opt/EmbedSky/linux-2.6.30.4'
  CC [M]  /apps1/LED/leds/ko/gpio.o
/apps1/LED/leds/ko/gpio.c:144: warning: initialization from incompatible pointer type
  Building modules, stage 2.
  MODPOST 1 modules
  LD [M]  /apps1/LED/leds/ko/gpio.ko
make[1]: Leaving directory `/opt/EmbedSky/linux-2.6.30.4'
cp -ap *.ko /tftpboot
亚瑟王 发表于 2010-5-13 17:06:24 | 显示全部楼层
你用定时器0 做这样的实验试试。
 楼主| nono1860 发表于 2010-5-14 13:42:50 | 显示全部楼层
阿瑟大哥你好,我今天用TOUT0也是一样,ARM会重开机,我的修改部分程序代码如下,是不是不能在驱动文件里面写控制程序阿,不然我写脉冲的程序代码有错误吗?有写到让arm重新启动的妈?小弟愚笨望请阿瑟帮忙~不管用定时器用dealy还是用他内核里的udelay都会重开机!!!
static int tq2440_gpio_ioctl(
        struct inode *inode,
        struct file *file,
        unsigned int cmd,
        unsigned long arg)
{   
                unsigned long tcfg1;
                unsigned long tcfg0;
                unsigned int i;
                unsigned long tcon;

        switch(cmd)
        {
        case  pwm_delay:
               
        {       

        s3c2410_gpio_cfgpin(S3C2410_GPB0, S3C2410_GPB0_TOUT0);

        tcon = __raw_readl(S3C2410_TCON);
        tcfg1 = __raw_readl(S3C2410_TCFG1);
        tcfg0 = __raw_readl(S3C2410_TCFG0);

       
        tcfg0 &= ~S3C2410_TCFG_PRESCALER0_MASK;
        tcfg0 |= (0x00);
        tcfg1 &= ~S3C2410_TCFG1_MUX0_MASK;
        tcfg1 |= S3C2410_TCFG1_MUX0_DIV16;
        __raw_writel(tcfg1, S3C2410_TCFG1);
        __raw_writel(tcfg0, S3C2410_TCFG0);
       
        for(i=0;i<10000;i++)
                        {
                               
                        s3c2410_gpio_setpin(S3C2410_GPB5, 0);
                        s3c2410_pwm_delay();                               
                        s3c2410_gpio_setpin(S3C2410_GPB5, 1);
                        s3c2410_pwm_delay();                       

                                                }
                        return 0;}
                default:
                        return -EINVAL;
       
}}
void s3c2410_pwm_delay()
{       
       

       
        unsigned long tcnt;
        unsigned long tcon;
        unsigned int tcnto;
        unsigned long tcntb;
        unsigned long tcmpb;
      

                tcntb  = 3125;
                tcmpb = tcntb>>1;

                __raw_writel(tcntb, S3C2410_TCNTB(0));
                __raw_writel(tcmpb, S3C2410_TCMPB(0));
                       
                tcon &= ~0x1f;
                tcon |= 0xb;               
                __raw_writel(tcon, S3C2410_TCON);

                tcon &= ~2;
                __raw_writel(tcon, S3C2410_TCON);
                tcnto=__raw_readl(S3C2410_TCNTO(0));
                while(__raw_readl(S3C2410_TCNTO(0))>=1562);
                while(__raw_readl(S3C2410_TCNTO(0))<1562);
}
他编译会出现这些警告,请问有无关联?并祝顺心
/apps1/LED/leds/ko/gpio.c:79: warning: function declaration isn't a prototype
/apps1/LED/leds/ko/gpio.c:189: warning: function declaration isn't a prototype
/apps1/LED/leds/ko/gpio.c: In function 's3c2410_pwm_delay':
/apps1/LED/leds/ko/gpio.c:193: warning: unused variable 'tcnt'
/apps1/LED/leds/ko/gpio.c:206: warning: 'tcon' is used uninitialized in this function
亚瑟王 发表于 2010-5-14 17:33:07 | 显示全部楼层
你是说每次开机后固定一段时间就重启了,还是说开机后,只要不允许你的程序就不会重启,运行了你的程序就会重启?
 楼主| nono1860 发表于 2010-5-15 02:39:54 | 显示全部楼层
只要运行上面的驱动CODE就会重开机,我有一行行去检查,
把程序批注看看会不会重开机,后来发现在循环的CODE如下,会导致我的ARM重开机,(ARM保证没问题,因为我有在别台ARM执行过也是重开机也是贵公司的arm),纳闷之余我又把for循环的次数减少,可执行完成,执行完后,但是arm过几秒他又重开机了,看了傻眼,就一整个不知道该怎下手了,请阿瑟大哥帮忙

for(i=0;i<10000;i++)
                        {
                        s3c2410_gpio_setpin(S3C2410_GPB5, 0);
                        s3c2410_pwm_delay();                                
                        s3c2410_gpio_setpin(S3C2410_GPB5, 1);
                        s3c2410_pwm_delay();                        
                                               }
                        return 0;}

还有使用延迟的函数udelay在循环跑,跑一段时间也会重机,请阿瑟大哥帮忙,感激不尽
亚瑟王 发表于 2010-5-18 11:10:00 | 显示全部楼层
你用天嵌科技提供的pwm的驱动试一下呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-20 02:56 , Processed in 1.020547 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表