原创 linux多串口驱动问题★★★★★

2011-6-14 21:25 2420 9 9 分类: MCU/ 嵌入式
 
小弟最近开始学习些一个1托4的多串口驱动,看了一下serial_core.c和8250.c文件,但是感觉东西很多,不知道从何入手,有没有大虾指点一下,想要完成这个驱动是怎样的一个流程?小弟感激不尽
--------------------------
如果是16C554之类的芯片,8250写的很好了,你不需要写。根据你的芯片修改片选、中断等等资源就好了。
---------------------------
谢谢vxworks大虾的回复,我板子上的芯片是SC16C654,我也想直接在8250.c文件上修改。但小弟对硬件方面的东西不太了解,我看芯片手册上都是通过A0~A2,CS片选来完成不同的通道选择的,这是不是就是说在一个时刻只能够读一路串口的数据?,如果再想读下一个串口的话需要程序上的切换?
小弟还想知道,一般串口驱动调试的方法和流程是什么呢?
我看了一下内核中的代码感觉是通过char----->tty----->serial_core--->8250是这样的一个封装过程,但是具体的也感觉很复杂,是否有一些不需要的东西?我只要实现RS232串口的读写,谢谢各位兄弟们了! 呵呵
---------------------------
自己顶一下,昨天又看了点硬件的内容和8250.c文件的代码,发现其中有很多硬件检测方面的内容,我应该不用再修改吧?
---------------------------
主要改初始化的部分,根据硬件资源改的,驱动基本不用动
---------------------------
哦,谢谢,我今天已经着手修改了,主要弄了中断和I/O地址空间不同的映射,今天看原理图发现测试板子上有一路的Bank接再了nGCS0上,我们用S3C2440A中的4KBbootrom来做启动rom,这样会不会对地址造成影响呢?还是我在bootloader启动引导内核后,MMU重新映射这段地址空间我就可以使用了吧?
今天看代码还遇到个问题,在用ioremap的时候两个参数分别是phy_address和size,size是说映射多大的空间,我现在想知道这个size是根据什么来确定的呢?比如在映射一个寄存器和映射一个uart的port的大小应该怎么确定?还有最后一个问题,在串口驱动中rsa代表什么意思?
---------------------------
应该配置多串口,修改头文件 。
无须修改*.c的代码。
---------------------------
驱动程序的代码编写完了。由于硬件上没有接max232芯片只是引出了几个导线,我自己写了个测试程序希望通过将同一个DB9的TxD和RxD直接相连来证明我的测试程序的正确性(用的另外一个开发板,串口可用的),但是发现程序在read函数阻塞,用示波器扫了一下,发现在TxD上没有波形,请问各位侠是什么原因呢?测试代码如下:
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #include <termios.h>
12
13 int main(int argc, char **argv)
14 {
15 int fd;
16 char buffer[1024];
17 int length = 1024;
18 int nByte = 0;
19 char buf[] = "abcdefghij";
20 struct termios Opt; //configurate the termios structure
21
22 /*
23 * struct termio {
24 * unsigned short c_iflag; //input mode flag
25 * unsigned short c_oflag; //out 38
39 /*
40 * set and configuration the serial port
41 */
42 tcgetattr(fd, &Opt);
43 cfsetispeed(&Opt, B115200);
44 cfsetospeed(&Opt, B115200);
45 tcsetattr(fd, TCSANOW, &Opt);
46
47 /*
48 * set the stop bit and crc bit(8N1)
49 */
50 Opt.c_cflag &= ~PARENB;
51 Opt.c_cflag &= ~CSTOPB;
52 Opt.c_cflag &= ~CSIZE;
53 Opt.c_cflag |= CS8;
54 tcsetattr(fd, TCSANOW, &Opt);
55
56 /*
57 * set serial port raw mode
58 */
59
60 Opt.c_iflag &= ~(ICANON | ECHOE | ISIG); /*input*/
61 Opt.c_oflag &= ~OPOST; /*output*/
62 tcsetattr(fd, TCSANOW, &Opt);
63
64 while (1) {
65 nByte = write(fd, buf, 10);
66 if (nByte != 10)
67 perror("write the buf to /dev/ttsA/0 is error! ");
68 nByte = read(fd, buffer, 10);
69 if (nByte != 10)
70 perror("read error! ");
71 printf("receive the buffer from fd = %s ", buffer);
72 }
73 close(fd);
74 return 0;
75 }
put mode flag
26 * unsigned short c_cflag; //control mode flag
27 * unsigned short c_lflag; //local mode flag
28 * unsigned short c_line; //line rules
29 * unsigned char c_cc[NCC]; //control character
30 * }
31 */
32
33 fd = open("/dev/ttsA/0", O_RDWR);
34 if (-1 == fd) {
35 perror("open /dev/ttsA/0 failed! ");
36 return -1;
37 }
这个板子上的驱动肯定是好的,谢谢各位大虾了。
 
在昨天终于把这个多串口的程序调好了,不是软件上的问题,测到最后是硬件工程师将复位电路的两个电阻焊成了电容,无语......修改过来,OK了 呵呵
-------------------------------
 

文章评论0条评论)

登录后参与讨论
我要评论
0
9
关闭 站长推荐上一条 /2 下一条