a673914838

a673914838

0个粉丝

3

问答

0

专栏

0

资料

a673914838  发布于  2016-11-28 16:33:39
采纳率 0%
3个问答
2417

定时器不准(开音频和接入视频影响很大)

 
因为使用一个IO做红外输出,需要用到定时器,正常不接输入视频和开音频定时器是正常的,一旦接入视频输入或者开音频后波形就不对了

        setup_irq(36, &ir_timer3_irq);//for time
        IR_time_clocksource_init(1);

        static struct irqaction ir_timer3_irq = {
        .name           = "irtime",
        .flags          =    IRQF_SHARED | IRQF_TIMER,
        .handler        = ir_timer3_interrupt,
        };

        static cycle_t ir_get_cycles(struct clocksource *cs)
        {
        return ~readl(CFG_TIMER2_VABASE + REG_TIMER_VALUE);
        }

static struct clocksource irtime_clocksource = {
        .name           = "timer3",
        .rating         = 200,
        .read           = ir_get_cycles,
        .mask           = CLOCKSOURCE_MASK(32),
        .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
};

static irqreturn_t ir_timer3_interrupt(int irq, void *dev_id)
{
unsigned int i;

        if ((readl(CFG_TIMER2_VABASE+REG_TIMER1_RIS)) & 0x1) {
                writel(~0, CFG_TIMER2_VABASE + REG_TIMER1_INTCLR);
                //timer0_clockevent.event_handler(&timer0_clockevent);
//        struct timeval tv_now;

        if(testxx==0)
        {
                GPIO9_6_LOW();
                testxx=1;
        }
         else
        {
                GPIO9_6_HIGH();
                testxx=0;
        }


        }

        return IRQ_HANDLED;
}


我来回答
回答4个
时间排序
认可量排序

a673914838

0个粉丝

3

问答

0

专栏

0

资料

a673914838 2016-11-28 16:38:36
认可0
static int __init  IR_time_clocksource_init(int mode)
{
        //set no restart ,single trigle

        unsigned long rate =timer1_clk_khz  ;
        printk("timer3 clk=%x\n",rate);
        writel(0, CFG_TIMER2_VABASE + REG_TIMER1_CONTROL);
        writel(0x8, CFG_TIMER2_VABASE + REG_TIMER1_RELOAD);
        writel(0xffffffff, CFG_TIMER2_VABASE + REG_TIMER1_VALUE);
        if(0==mode)
        writel(CFG_TIMER_ONE_CONTROL, CFG_TIMER2_VABASE + REG_TIMER1_CONTROL);
        else
        writel(CFG_TIMER_CONTROL, CFG_TIMER2_VABASE + REG_TIMER1_CONTROL);

        /* caculate the mult/shift by clock rate to gain more accratury */
        if (clocksource_register_hz(&irtime_clocksource, rate))
                panic("register clocksouce :%s error\n",
                                irtime_clocksource.name);

        /* force check the mult/shift of clocksource */
        //init_fixed_sched_clock(&cd, ir_update_sched_clock, 32, rate,
                        //irsend_clocksource.mult, irsend_clocksource.shift);

        return 0;
}

a673914838

0个粉丝

3

问答

0

专栏

0

资料

a673914838 2016-11-28 17:56:28
认可0
有用海思输出红外的吗?能分享一下怎么实现的

henman

0个粉丝

7

问答

0

专栏

0

资料

henman 2016-12-01 13:50:40
认可0
是内核驱动么?我用定时器做过云台驱动,也就是周期性的高低电平,感觉还好吧。不过我的中断处理和你的写法不一样。我也是参考一些别人的驱动随便写的,效果达到了就算了。

        //init timer
        {
                void *__iomem ptr = NULL;

                ptr = (void *__iomem) IO_ADDRESS(TIMER_REG_INTCLR);
                *(volatile unsigned int *)ptr = 0x01;

                //步骤1.写TIMERx_LOAD寄存器,为Timer载入计数初值。
                ptr = (void *__iomem) IO_ADDRESS(TIMER_REG_LOAD);
                *(volatile unsigned int *)ptr = 1*MS2TICK;

                //步骤2.当需要Timer工作在周期计数模式下、且计数周期与载入Timer的计数初值不同时,写TIMERx_BGLOAD寄存器,设置Timer的计数周期。
                ptr = (void *__iomem) IO_ADDRESS(TIMER_REG_BGLOAD);
                *(volatile unsigned int *)ptr = 4*MS2TICK; //运转的速度,时间越长,转动速度越慢。

                //步骤3.配置系统控制寄存器SC_CTRL,设置Timer的时钟使能信号的参考时钟。
                ptr = (void *__iomem) IO_ADDRESS(SC_CTRL);
                *(volatile unsigned int *)ptr &= ~(1 << 20); //0:由3MHz时钟进行计数;

                //步骤4.配置TIMERx_CONTROL寄存器,设置Timer的计数模式、计数器长度、预分频因子及中断屏蔽,同时启动Timer计数。
                ptr = (void *__iomem) IO_ADDRESS(TIMER_REG_CONTROL);
                //[0]  0 :周期计数模式或自由运行模式;
                //[1]  1 :32bit计数器。
                //[3:2]00:不经过预分频,时钟频率除以1;
                //[4]  0
                //[5]  1 :不屏蔽该中断。
                //[6]  1 :周期模式。
                //[7]  0 :Timer禁止。
                *(volatile unsigned int *)ptr = 0x62;

                //init timer irq
                s32Ret = request_irq(TIMER_IRQ_NUM, timer_irq_handler, IRQF_SHARED, "PtzTimer", &timer_irq_handler);
                if(s32Ret != 0)
                {
                        printk(KERN_ERR PRINTK_MODULE_NAME ":%s:%d, request_irq failed!\n", __FUNCTION__, __LINE__);
                        return -1;
                }
        }



static irqreturn_t timer_irq_handler(int irq, void* dev_id)
{
}


a673914838

0个粉丝

3

问答

0

专栏

0

资料

a673914838 2016-11-30 09:12:39
认可0
秒沉!!!
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区