Android中RIL层详细分析解析 联系客服

发布时间 : 星期四 文章Android中RIL层详细分析解析更新完毕开始阅读124fdd7c657d27284b73f242336c1eb91b37334a

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

mainloop的作用:主要任务是建立起与硬件的通信,然后通过at_open()->readloop()->line()方法阻塞等待是否又数据过来,并向硬件主动上报或响应(OK)。

发命令的是由initializeCallback()发过来的ATE0Q0V1等

1.打开rild socket(init.rc传过来的)是用于等待read()后java层传来的数据(再去调nitializeCallback发at命令) 2.就是调用RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);函数,用来向modem发生AT命令 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- static void *

mainLoop(void *param)

{

LOGD(\LOGI(\ int fd; int ret;

static struct timeval TIMEVAL_DELAYINIT = {0,0};//延时函数 AT_DUMP(\ at_set_on_reader_closed(onATReaderClosed); at_set_on_timeout(onATTimeout); for (;;) { fd = -1; while (fd < 0) { if (s_port > 0) {

fd = socket_loopback_client(s_port, SOCK_STREAM); } else if (s_device_socket) {

if (!strcmp(s_device_path, \ /* Qemu-specific control socket */ //1:

LOGD(\

fd = socket_local_client( \ANDROID_SOCKET_NAMESPACE_RESERVED, SOCK_STREAM ); if (fd >= 0 ) { char answer[2];

if ( write(fd, \ read(fd, answer, 2) != 2 || memcmp(answer, \ {

close(fd); fd = -1; } } } else

//1:

LOGD(\ fd =

socket_local_client( s_device_path, ANDROID_SOCKET_NAMESPACE_FILESYSTEM, SOCK_STREAM );

} else if (s_device_path != NULL) {

fd = open (s_device_path, O_RDWR); if ( fd >= 0 ) {

/* disable echo on serial ports */ struct termios ios; tcgetattr( fd, &ios );

ios.c_lflag = 0; /* disable ECHO, ICANON, etc... */ tcsetattr( fd, TCSANOW, &ios ); LOGI(\ }else{

LOGI(\ } }

if (fd < 0) {

perror (\ sleep(10); /* never returns */ } }

s_closed = 0; //2:

LOGD(\

ret = at_open(fd, onUnsolicited); if (ret < 0) {

LOGE (\ return 0; }

TIMEVAL_DELAYINIT.tv_sec = 15; LOGD(\

LOGD (\ //3:

LOGD(\ &TIMEVAL_0);---\

RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);//打印AT> ATE0Q0V1 // Give initializeCallback a chance to dispatched, since // we don't presently have a cancellation mechanism sleep(1); waitForClose();

LOGI(\

} }

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

at_open()的作用:1.可以添加自己想要的modem

2.函数建立起这一设备文件上的reader等待循环

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- /**

* Starts AT handler on stream \ * returns 0 on success, -1 on error */

int at_open(int fd, ATUnsolHandler h)

{ int ret; pthread_t tid; pthread_attr_t attr;

LOGD(\ s_fd = fd;

s_unsolHandler = h; s_readerClosed = 0; s_responsePrefix = NULL; s_smsPDU = NULL; sp_response = NULL; /* Android power control ioctl */ #ifdef HAVE_ANDROID_OS

#ifdef OMAP_CSMI_POWER_CONTROL

ret = ioctl(fd, OMAP_CSMI_TTY_ENABLE_ACK); if(ret == 0) { int ack_count; int read_count; int old_flags; char sync_buf[256];

old_flags = fcntl(fd, F_GETFL, 0);

fcntl(fd, F_SETFL, old_flags | O_NONBLOCK); do {

ioctl(fd, OMAP_CSMI_TTY_READ_UNACKED, &ack_count); read_count = 0; do {

ret = read(fd, sync_buf, sizeof(sync_buf)); if(ret > 0)

read_count += ret;

} while(ret > 0 || (ret < 0 && errno == EINTR)); ioctl(fd, OMAP_CSMI_TTY_ACK, &ack_count);

} while(ack_count > 0 || read_count > 0); fcntl(fd, F_SETFL, old_flags); s_readCount = 0; s_ackPowerIoctl = 1; } else

s_ackPowerIoctl = 0;

#else // OMAP_CSMI_POWER_CONTROL s_ackPowerIoctl = 0;

#endif // OMAP_CSMI_POWER_CONTROL #endif /*HAVE_ANDROID_OS*/ pthread_attr_init (&attr);

pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); #ifdef HUAWEI_EM770W //新增的modem,在创建一个线程去实现它的功能 int fd2 = -1; while(fd2 < 0) {

fd2 = open (\ if (fd2 < 0) {

perror (\ sleep(10); } }

if(fd2 > 0) { urc_fd = fd2; struct termios ios; tcgetattr( fd2, &ios ); ios.c_lflag = 0;

tcsetattr( fd2, TCSANOW, &ios ); }

ret = pthread_create(&s_tid_reader_urc, &attr, urc_readerLoop, &attr); if (ret < 0) {

perror (\ return -1; } #else

LOGD(\ ret = pthread_create(&s_tid_reader, &attr,readerLoop, &attr); if (ret < 0) {

perror (\ return -1; } #endif return 0; }