求助呀:设置不了不特率的问题

发布于 2022-09-23 13:14:43 字数 652 浏览 11 评论 0

我用的s3c2410,linux2.6,
我在驱动模块中的open函数中设置波特率设置不了

unsigned long val
val = __raw_readl(S3C2410_VA_UART1+S3C2410_UBRDIV);
        printk(KERN_INFO"UBRDIV of UART1 = %d\n", val);       //打印出来val值是0
        val = 27;
        __raw_writel(val, (S3C2410_VA_UART1+S3C2410_UBRDIV)); //写入波特率
        val = __raw_readl(S3C2410_VA_UART1+S3C2410_UBRDIV);   // 再读
        printk(KERN_INFO"UBRDIV of UART1 = %d\n", val);    //怎么val还是0呢,波特率没有设置成功啊?请帮小弟分析下啊

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

谁许谁一生繁华 2022-09-30 13:14:43

我不太清楚你的驱动是怎么实现的,一般来说波特率的设置是通过ioctl来实现的

夏天碎花小短裙 2022-09-30 13:14:43

我是直接在open里面来设置的。那今天我再试试用ioctl来设置

黯然#的苍凉 2022-09-30 13:14:43

A:跟一下S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址,看看是不是你的波特率寄存器地址
B:有可能是不可写的地址
C:加上几个mb(),内存屏障

就是这个样子~~

谜兔 2022-09-30 13:14:43

B:有可能是不可写的地址
C:加上几个mb(),内存屏障

.kaka 老兄,很有道理啊!高人!
怎么看某个地址是不是可写呢?

渔村楼浪 2022-09-30 13:14:43

B:有可能是不可写的地址
C:加上几个mb(),内存屏障

我是新手,B.C两项不是太懂,可以指点一下吗

苍暮颜 2022-09-30 13:14:43

请问版主我怎么知道该寄存器被内核设定为不可写呢?

银河中√捞星星 2022-09-30 13:14:43


可能是我的表述有问题,我的意思是:既然你往一个寄存器写了一个值,然后再读出来,发现和写入的值不一样,所以我猜测可能是你操作的寄存器可能不是一个可写的寄存器,或者该寄存器可写但是写完之后马上被修改了(比如io口的data寄存器等等很多)等等,还有很多情况~~
所以首先要怀疑的是你操作的S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址 物理地址是否是你要修改的地址~
其次怀疑是不是值被放到cache中,因为不知道
__raw_writel(val, 2410_VA_UART1+S3C2410_UBRDIV));
你是怎么写的~所以加上一个mb();将cache中的值写到内存中去~

就是这个样子~

柠栀 2022-09-30 13:14:43

多些kaka兄的指教,我加了几个mb(),又改了下程序,还是同样的情况:
val = __raw_readl(S3C2410_VA_UART1+S3C2410_UBRDIV);
        printk(KERN_INFO"UART0 addr:%u\n", S3C2410_VA_UART0+S3C2410_UBRDIV);
        printk(KERN_INFO"UART1 addr:%u\n", S3C2410_VA_UART1+S3C2410_UBRDIV);
       
        printk(KERN_INFO"UBRDIV of UART1 = %lu\n", val);
        val = 27;
        mb();
        __raw_writel(val, (S3C2410_VA_UART1+S3C2410_UBRDIV));
        mb();
        val = __raw_readl(S3C2410_VA_UART1+S3C2410_UBRDIV);
        mb();
        printk(KERN_INFO"UBRDIV of UART1 = %lu\n", val);

输出的结果显示对UART1的波特率设置寄存器的写入还是没有成功,
lUART0 addr:4034920488           // UART0_UBRDIV 的地址            
UART1 addr:4034936872             // UART1_UBRDIV 的地址        
UBRDIV of UART1 = 0                   //寄存器设置前的值                    
UBRDIV of UART1 = 0                   //设置27后读出来还是0,

请kaka兄帮我分析下啊

亽野灬性zι浪 2022-09-30 13:14:43

测试出S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址应该是正确的,而且这是linux2.6内核中为2410定义好了的宏,应该是没有问题的,但就是写不进去

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文