2015-12-05 137 views
0

我正試圖寫入Android外殼中的字符設備。但是mksh會針對整個操作範圍迴應「未知錯誤517」。我試圖用strace來追蹤這個問題,但它沒有幫助。對於AOS 4.4中的所有設備節點,這種情況也會發生,但在4.2中不會發生。Android shell中的「未知錯誤517」是什麼意思?

這是我做的:

# chmod 666 /dev/smd0 
Unable to open /dev/smd0: Unknown error 517 

# cat /dev/smd0 
tmp-mksh: cat: /dev/smd0: Unknown error 517 

該裝置是存在的,我都可以創建它(mknod的),並刪除它,所以它不是一個權限問題,據我所看到的。

# ls /dev/smd0 
crw-rw---- 1 1000  1000  222, 0 Feb 13 2014 /dev/smd0 

所有我在strace的得到的是:

ioctl(10</dev/tty>, SNDCTL_TMR_STOP or TCSETSW, {c_iflags=0x500, c_oflags=0x5, c_cflags=0xbf, c_lflags=0x8a3b, c_line=0, c_cc="\x03\x1c\x7f\x15\x04\x00\x01\x00\x11\x13\x1a\x00\x12\x0f\x17\x16\x00\x00\x00"}) = 0 
ioctl(10</dev/tty>, TIOCSPGRP, [23069]) = 0 
[pid 23069] open("/dev/smd0", O_RDONLY|O_LARGEFILE) = -1 EPROBE_DEFER (Unknown error 517) 
[pid 23069] open("/dev/smd0", O_WRONLY|O_LARGEFILE) = -1 EPROBE_DEFER (Unknown error 517) 
[pid 23069] write(2</dev/pts/5>, "Unable to open /dev/smd0: Unknown error 517\n", 44) = 44 

shf.c文件mksh來源看不提供任何見解無論是。

我還發現,在Linux內核源EPROBE_DEFER標籤,在該文件中:../include/linux/errno.h

#define EPROBE_DEFER 517  /* Driver requests probe retry */ 

任何想法可能會導致這個問題?

回答

2

這只是因爲bionic’s error definitions不知道errno#517(還)。 mksh只是使用操作系統(的C庫) - 在這種情況下,Android的仿生 - 提供。

This part of shf.c當底層操作系統(的C庫)不知道底層操作系統(內核)生成的錯誤時生成Unknown error: %d消息,在這種情況下。

+0

這是一個令人困惑的答案。你說'mksh'只是使用仿生的,但是你指出的仿生源,並沒有提到實際出現的錯誤。那麼這些字符串從哪裏來? – not2qubit

2

正如你已經發現,517是Linux的錯誤EPROBE_DEFER的價值,它只是意味着一個設備驅動程序將告知Linux內核嘗試後探測特定的設備。 Linux內核在需要驅動程序準備使用設備時調用驅動程序的probe()方法。

不幸的是,EPROBE_DEFER沒有告訴你爲什麼需要重試探針,也不知道你可能需要做什麼才能確保它在重試時能夠成功。 Here is a thread抱怨。

+0

是的,這似乎是一個非常蹩腳的錯誤。這種錯誤似乎主要發生在處理GPIO和出於某種原因設備驅動程序未到達GPIO(或USB)的地方。在這種情況下,在基於Qualcomm的Samsung設備上,應將*/dev/smdN *映射到來自[smd.c]的一個*共享內存驅動程序*(https://android.googlesource.com/kernel/msm/+/機器人-MSM-FLO-3.4-奇巧-MR2 /拱/臂/馬赫 - MSM/smd.c)。 – not2qubit

+0

我想在這個問題上增加另一個想法。進一步的研究似乎表明,該設備配置沒有使用*共享內存驅動程序*與基帶進行通信。因此,也許驅動程序根本不存在於內核中,因此與GPIO類似(如上所述)失敗。在樹中有幾個主要/次要設備,但只有*/proc/tty/driver/*列出了ttyHS/ttyHSL/ttyUSB,這似乎意味着其他所有內容不能作爲普通的「tty」訪問。 – not2qubit