[新唐博主]

NUC972 linux 内核nuc970-sc 驱动程序bug

[复制链接]
1271|11
手机看帖
扫描二维码
随时随地手机跟帖
dubilu|  楼主 | 2019-9-4 11:01 | 显示全部楼层 |阅读模式
drivers/misc/nuc970-sc.c文件

static int sc_open(struct inode *inode, struct file *filp)
{

        int ret, intf;

        for(intf = 0; intf < SC_INTF; intf++)
                if(MINOR(inode->i_rdev) == sc[intf].minor) {
                        break;
                }
        mutex_lock(&sc[intf].lock);
        if(sc->open == 1) {
                mutex_unlock(&sc[intf].lock);
                return -EBUSY;
        }
        filp->private_data = (void *)&sc[intf];

        if(intf == 0) {
                sc[intf].clk = clk_get(NULL, "smc0");
                sc[intf].eclk = clk_get(NULL, "smc0_eclk");
        } else {
                sc[intf].clk = clk_get(NULL, "smc1");
                sc[intf].eclk = clk_get(NULL, "smc1_eclk");
        }


        if (IS_ERR(sc[intf].clk)) {
                printk("failed to get sc clock\n");
                ret = PTR_ERR(sc[intf].clk);
                goto out2;
        }
        if (IS_ERR(sc[intf].eclk)) {
                printk("failed to get sc eclock\n");
                ret = PTR_ERR(sc[intf].eclk);
                goto out2;
        }
        clk_prepare(sc[intf].clk);
        clk_enable(sc[intf].clk);
        clk_prepare(sc[intf].eclk);
        clk_enable(sc[intf].eclk);
        clk_set_rate(sc[intf].eclk, 4000000);        // Set SC clock to 4MHz

        if(sc[intf].pwrinv) {
                __raw_writel(__raw_readl(sc[intf].base + REG_SC_PINCTL) | SC_PINCTL_PWRINV, sc[intf].base + REG_SC_PINCTL);
        }
        if(sc[intf].cdlvl == 0) {
                __raw_writel(__raw_readl(sc[intf].base + REG_SC_CTL) | SC_CTL_CDLV, sc[intf].base + REG_SC_CTL);
        }

        // enable SC engine
        __raw_writel(__raw_readl(sc[intf].base + REG_SC_CTL) | SC_CTL_SCEN, sc[intf].base + REG_SC_CTL);
        if (request_irq(sc[intf].irq, nuc970_sc_interrupt,
                                                0x0, "nuc970-sc", (void *)&sc[intf])) {
                printk("register irq failed %d\n", sc[intf].irq);
                ret = -EAGAIN;
                goto out1;
        }
        sc[intf].open = 1;
        mutex_unlock(&sc[intf].lock);
        return 0;


out1:

        free_irq(sc[intf].irq, (void *)&sc[intf]);
out2:
        mutex_unlock(&sc[intf].lock);
        return ret;

}
if(sc->open == 1) //会导致SC0 open时 SC1 open 错误,修改为 if(sc[intf].open == 1) 即可



使用特权

评论回复
antusheng| | 2019-9-4 20:59 | 显示全部楼层
果然有道理。

使用特权

评论回复
643757107| | 2019-9-4 22:55 | 显示全部楼层
果然是高人

使用特权

评论回复
21mengnan| | 2019-9-4 23:06 | 显示全部楼层
看了一下代码,还真是。

使用特权

评论回复
734774645| | 2019-9-4 23:07 | 显示全部楼层
楼主对内核了解的深入啊

使用特权

评论回复
734774645| | 2019-9-4 23:08 | 显示全部楼层
包括串行通信接口模块SC_INTF

使用特权

评论回复
dongnanxibei| | 2019-9-4 23:09 | 显示全部楼层
这个驱动是Linux提供的还是新唐提供的,其他厂家的是怎么做大

使用特权

评论回复
heisexingqisi| | 2019-9-4 23:43 | 显示全部楼层
不错,牛。

使用特权

评论回复
heisexingqisi| | 2019-9-4 23:50 | 显示全部楼层
这要对源码很了解啊。

使用特权

评论回复
sklar| | 2019-9-7 12:10 | 显示全部楼层
厉害哦

使用特权

评论回复
fangdichan| | 2019-10-3 21:50 | 显示全部楼层
厉害,我看一下我的代码有没有这个问题

使用特权

评论回复
coshi| | 2019-10-13 11:57 | 显示全部楼层
非常感谢楼主分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝