发 帖  
[问答]

omapl138的ARM端linux操作系统下能操作uPP接口么?

2311
2018-6-21 00:35:33   1 评论 分享淘帖 邀请回答 举报
1 条评论
  • 2019-4-1 17:01

    我近期也在学习linux操作系统下,在ARM端使用upp(编写一个upp功能模块),能触发接收中断,但是数据全是零,能否将你的源码发我学习下,谢谢。下面是我的初始化函数:
    static int __init omapl138_upp_init(VOID)
    {
        volatile unsigned long *p_Temp = NULL;
        UINT32 Delay_U32 = 2000U;

        printk("Load upp module function!\n");
        printk("Current Version is V%d.0\n",UPP_VERSION);
        printk("Author:Ben Date:2019-04-01\n");
       
        //register_chrdev(GPIO_LED_MAJOR,"omapl138gpio",&leds_drv_file_operation);
        major = register_chrdev(0,"omapl138upp",&upp_drv_file_operation);/*Alloc Major Num auto*/
       
        io_mem = request_region(SOC_SYSCFG_0_REGS, 0x100, "io");
        if (io_mem == NULL)
        {
          printk("failed to get memory region\n");
        }


        /*Set upp gpio mux*/
        p_Temp = ioremap(SOC_SYSCFG_0_REGS, 0x100);
        if(NULL == p_Temp)
        {   
            release_resource(io_mem);
            kfree(io_mem);
            printk("ioremap1 fail\n");
            return -1;
        }
       
        *(p_Temp + 13) &= 0x0000FFFF;
        *(p_Temp + 13) |= 0x44440000;/*GPIO6[8]~GPIO6[11]*/

        *(p_Temp + 14) &= 0x000000FF;
        *(p_Temp + 14) |= 0x44444400;/*UPP_D10~UPP_D15*/

        *(p_Temp + 15) = 0x44444444;
        *(p_Temp + 16) = 0x44444444;
        *(p_Temp + 17) = 0x44444444;

        *(p_Temp + 18) &= 0xFF000000;
        *(p_Temp + 18) |= 0x00444444;
        iounmap(p_Temp);

        /* 使能upp时钟 */
        //davinci_psc_config(DAVINCI_GPSC_ARMDOMAIN, 1,
        //                19, 1);
        /* 映射io寄存器 */
        p_Reg =  ioremap(UPP_BASE_REGS, 0x100);
        if(NULL == p_Reg)
        {   
            printk("ioremap2 fail\n");
            return -1;
        }   

        p_Reg->Ctrl_U32 &= ~UPP_UPPCR_EN;
        while((p_Reg->Ctrl_U32 & UPP_UPPCR_DB) != 0U)
        {
        }
        p_Reg->Ctrl_U32 |= UPP_UPPCR_SWRST;

        while(Delay_U32 > 0U)
        {
            Delay_U32 --;
        }

        p_Reg->Ctrl_U32 &= ~UPP_UPPCR_SWRST;
        p_Reg->Ctrl_U32 |= UPP_UPPCR_SOFT | UPP_UPPCR_RTEMU;

        p_Reg->CHCtrl_U32 = 0x02020007U;
        p_Reg->DLB_U32 &= ~0x1000U;
        //p_Reg->DLB_U32 |= 0x1000U;
        p_Reg->ICfg_U32 = 0x00180F18U;
        p_Reg->IVR_U32 = 0x00000000U;
        p_Reg->ThCfg_U32 = 0x000000U;
        p_Reg->IntEnClr_U32 = 0x0001F1FU;
        p_Reg->IntEnSet_U32 = 0x0001000U;   
        p_Reg->Ctrl_U32 |= UPP_UPPCR_EN;

        bsp_upp_InitRecv();

        upp_class = class_create(THIS_MODULE,"upp class");
        if(!upp_class)
        {
             if(IS_ERR(upp_class))
             {
                return PTR_ERR(upp_class);
             }
        }   

        upp_dev = device_create(upp_class,NULL,MKDEV(major,0),NULL,"upp");
        if(!upp_dev)
        {
             if(IS_ERR(upp_dev))
             {
                return PTR_ERR(upp_dev);
             }
        }

        return 0;
    }

2个回答
2018-6-21 00:51:21 评论

举报

2019-4-1 16:57:22 评论

举报

只有小组成员才能发言,加入小组>>

2895个成员聚集在这个小组

加入小组

创建小组步骤

快速回复 返回顶部 返回列表
关注微信公众号

电子发烧友网

电子发烧友论坛

社区合作
刘勇
联系电话:15994832713
邮箱地址:liuyong@huaqiu.com
社区管理
elecfans短短
微信:elecfans_666
邮箱:users@huaqiu.com
关闭

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

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