求助呀:设置不了不特率的问题
我用的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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
我不太清楚你的驱动是怎么实现的,一般来说波特率的设置是通过ioctl来实现的
我是直接在open里面来设置的。那今天我再试试用ioctl来设置
A:跟一下S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址,看看是不是你的波特率寄存器地址
B:有可能是不可写的地址
C:加上几个mb(),内存屏障
就是这个样子~~
B:有可能是不可写的地址
C:加上几个mb(),内存屏障
.kaka 老兄,很有道理啊!高人!
怎么看某个地址是不是可写呢?
B:有可能是不可写的地址
C:加上几个mb(),内存屏障
我是新手,B.C两项不是太懂,可以指点一下吗
请问版主我怎么知道该寄存器被内核设定为不可写呢?
可能是我的表述有问题,我的意思是:既然你往一个寄存器写了一个值,然后再读出来,发现和写入的值不一样,所以我猜测可能是你操作的寄存器可能不是一个可写的寄存器,或者该寄存器可写但是写完之后马上被修改了(比如io口的data寄存器等等很多)等等,还有很多情况~~
所以首先要怀疑的是你操作的S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址 物理地址是否是你要修改的地址~
其次怀疑是不是值被放到cache中,因为不知道__raw_writel(val, 2410_VA_UART1+S3C2410_UBRDIV));
你是怎么写的~所以加上一个mb();将cache中的值写到内存中去~
就是这个样子~
多些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兄帮我分析下啊
测试出S3C2410_VA_UART1+S3C2410_UBRDIV的物理地址应该是正确的,而且这是linux2.6内核中为2410定义好了的宏,应该是没有问题的,但就是写不进去