当前位置:首页 > Android中RIL层详细分析解析
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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; }
共分享92篇相关文档