4. FOREWORD
I am honoured to be writing the forward for Ajarn Wiroon Sriborriruxâs new book. I
have admired Ajarn Wiroon for a long time as one of the leaders and mentors in the
embedded systems community in Thailand. He is well known and widely respected in
terms of his generousity in sharing his deep technical knowledge, as a teacher, a profes-
sional consultant, an advisor to startup companies and as a colleague. It is very ïŽtting
for him to be writing this book as a way to continue to share his knowledge with our
community in order to keep advancing Thailand forward in the technology ïŽeld.
The topic of this book, âEmbedded Android Developmentâ, is incredibly timely,
given the newest developments in terms of the Internet of Things (IOT), cyberphysical
trend and the move to a âpost-PC eraâ, or what we can call the âembedded systems
eraâ or âdevice eraâ.
Stage 1 of the âembedded systems eraâ (2000-2015) was about connectivity. We
saw the rise of Ubiquitous Computing or Universal Communicator led by mobile phone
and smart phones. By putting a very powerful personal computing and communication
device into the hands of a major part of the worldâs population, this stage built up an
important infrastructure for the IOT.
From 2010-2020, we are seeing Stage 2 of this era, with IOT being the keyword of
this decade. We will see a rising need to make things âsmartâ. The challenge is not just
in the technology, but rather in creating innovation or value creation that utilises infor-
mation or knowledge gathered from connected devices. CISCO predicted that the value
created by the use of IOT is expected to reach $14 trillion by 2020 which is only a few
years from now. This means tremendous opportunity for the development community.
Within this context, Embedded Android has become very popular in all types of
devices requiring user interface such as measurement instruments, kiosk, access control,
payment, health monitor, wearable devices, and cars. We are now currently only at the
beginning of IOT innovation race, and I believe that weâll be seeing a lot of exciting in-
novations utilising Embedded Android in the next few years.
5. I am conïŽdent that this book should be very useful for key courses such as Unix
Systems Programming or Embedded Systems Development. This book should also serve
as a very good reference for students working on senior project related to advance em-
bedded systems and device development. These days, students learn a lot of theory
but have little practical skills, which makes it difïŽcult for them to meet workforce re-
quirements. It is refreshing to see a book with a practical knowledge focus that en-
hances development skills. It ïŽlls a key gap in this ïŽeld, and particularly in Thailand.
Assistant Professor Apinetr Unakul
President of Thai Embedded Systems Association (TESA)
15. āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāđāļŠāļāļāļāđāļē 5 Factorials āđāļāļĒāđāļāļĢāļĩāļĒāļāđāļāļĩāļĒāļāļĢāļđāļāđāļāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāđāļ§āļĒāļ āļēāļĐāļē BCPL
āđāļĨāļ°āļ āļēāļĐāļēāļāļĩ
āđāļāļĢāđāļāļĢāļĄāļāđāļ§āļĒāļ āļēāļĐāļē BCPL:
GET "LIBHDR"
LET START() = VALOF $(
FOR I = 1 TO 5 DO
WRITEF("%N! = %I4*N", I, FACT(I))
RESULTIS 0
)$
AND FACT(N) = N = 0 -> 1, N * FACT(N - 1)
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļ āļēāļĐāļēāļāļĩāļāļēāļāļāļąāļ§āļāļĒāđāļēāļāļŦāļāļąāļāļŠāļ·āļāļāļĩāđ Ken Thompson āđāļāđāļāļāļđāđāđāļāļĩāļĒāļ
/* The following function will print a non-negative number, n, to
the base b, where 2<=b<=10, This routine uses the fact that
in the ASCII character set, the digits 0 to 9 have sequential
code values. */
printn(n,b) {
extrn putchar;
auto a;
if(a=n/b) /* assignment, not test for equality */
printn(a, b); /* recursive */
putchar(n%b + '0');
}
āđāļāđāđāļāļ·āđāļāļāļāļēāļāļāļąāļ§āļ āļēāļĐāļēāļāļĩāđāļāļāļāļąāđāļ āđāļāđāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļĄāļĩāđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļāļĄāļđāļĨāđāļĨāļ°āļĢāļđāļāđāļāļāļāļēāļĢāļāļ§āļāļāļļāļĄāļ āļēāļĒāđāļāļĒāļąāļāļĄāļĩ
āļāđāļāļāļģāļāļąāļāļāļĒāļđāđāļāļāļŠāļĄāļāļ§āļĢ āļāļģāđāļŦāđāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļāļĒāđāļāđāļ āļēāļĐāļēāļāļĩāļĒāļąāļāđāļĄāđāļāđāļāļĒāļāļĢāļ°āļŠāļāļāļ§āļēāļĄ
āļŠāļģāđāļĢāđāļāđāļāđāļēāļāļĩāđāļāļ§āļĢ āļāļąāļāļāļąāđāļāļāļēāļ Dennis Ritchie āļāļķāļāđāļāđāļāļąāļāļāļēāđāļĨāļ°āļāļĢāļąāļāļāļĢāļļāļāļ āļēāļĐāļēāļāļĩāđāļŦāđāļĄāļĩāļāļļāļāļŠāļĄāļāļąāļāļīāļāļĩāđāđāļŦāļĄāļēāļ°
āļŠāļĄāđāļāļāļēāļĢāđāļāļĩāļĒāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĄāļēāļāļĒāļīāđāļāļāļķāđāļ āđāļĨāļ°āđāļāļāļĩāđāļŠāļļāļāļāđāđāļāđāļāļĨāļēāļĒāļĄāļēāđāļāđāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļąāļ§āđāļŦāļĄāđāļāļ·āđāļāļ§āđāļē
āļ āļēāļĐāļēāļāļĩ (C Language) āļāđāļāļĄāļēāļāļēāļ Thompson āđāļĨāļ° Ritchie āđāļāđāļĢāđāļ§āļĄāļāļąāļāļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX
āļāļēāļāļ āļēāļĐāļēāļāļĩāđāļŦāļĄāđāļāļąāđāļāļŦāļĄāļ āļāļģāđāļŦāđāļ āļēāļĐāļēāļāļĩāļāļĨāļēāļĒāļĄāļēāđāļāđāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļĩāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāđāļāļŦāļĄāļđāđāļāļąāļāđāļāļĩāļĒāļ
āđāļāļĢāđāļāļĢāļĄāļāļĒāđāļēāļāļĄāļēāļāđāļāļ·āđāļāļāļāļēāļāđāļāđāļāļ āļēāļĐāļēāļāđāļāļāļāļĢāļ°āļŠāļāļāđāļāļĩāđāđāļŦāļĄāļēāļ°āļāļąāļāļāļēāļĢāđāļāđāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļāļāđāļēāļāđāđāļĨāļ°
āļŦāļĨāļēāļāļŦāļĨāļēāļĒ āļāļąāđāļāļĒāļąāļāđāļāđāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāđāļāđāļēāļĒāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļāđāļāļĢāđāļāļĢāļĄāđāļāđāļēāļĄāļē
āđāļāđāļāļēāļāļāļĢāļ°āļĒāļļāļāļāđāļāļąāļāđāļāļĢāđāļāļĢāļĄāđāļŦāļĄāđāđāļāđ āļāđāļāļĄāļēāđāļāļāļĩ āļ.āļĻ. 1974 Ritchie āđāļĨāļ° Thompson āđāļāđāļāļĩāļāļīāļĄāļāđāļāļĨ
āļāļēāļāļāļēāļĢāļ§āļīāļāļąāļĒāđāļĨāļ°āļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāļąāļ§āđāļŦāļĄāđāļāļĩāđ āļāļāđāļāđāļāļāļĨāđāļŦāđāļāļąāđāļāļŠāļāļāđāļāđāļĢāļąāļāļĢāļēāļāļ§āļąāļĨ ACM Turing
Award āđāļāļāļĩ āļ.āļĻ. 1984
15
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
16. āļāļēāļāļāļĨāļāļēāļāļāļąāļāļāļĨāđāļēāļ§āļāļēāļāļāļĢāļīāļĐāļąāļ AT&T āļāļđāđāđāļāđāļāđāļāđāļēāļāļāļāļŦāđāļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ Bell āđāļĨāļ°āđāļāđāļāļāļđāđāļāļ·āļāļĨāļīāļāļŠāļīāļāļāļīāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļī
āļāļēāļĢ UNIX āđāļāđāļāļāļļāļāļēāļāđāļŦāđāļĄāļŦāļēāļ§āļīāļāļĒāļēāļĨāļąāļĒāļāđāļēāļāđ āđāļāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļāļĒāđāļŠāļĩāļĒāļāđāļēāļāļĢāļĢāļĄāđāļāļĩāļĒāļĄāđāļāļĩāļĒāļāđāļĨāđāļ
āļāđāļāļĒ āđāļāļ·āđāļāļŦāļ§āļąāļāđāļŦāđāđāļāđāļāļāļĩāđāļāļīāļĒāļĄāļĄāļēāļāļĒāļīāđāļāļāļķāđāļ āđāļāļāļāļ°āļāļąāđāļāļāđāļ§āļĒāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļ°āļĄāļēāļāļąāļāđāļāļĢāļ·āđāļāļ PDP-11 āļāļķāđāļāļĒāļąāļ
āļāļģāļāļēāļāđāļĄāđāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļāļĩāļāļāđāļĨāļ°āļĒāļąāļāđāļāđāļāļēāļāļĒāļēāļāļāļĒāļđāđ āļāļķāļāļāļģāđāļŦāđāđāļāļīāļāļāļēāļĢāļ§āļīāļāļąāļĒāđāļĨāļ°āļāļąāļāļāļēāļāļĢāļąāļāļāļĢāļļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļī
āļāļēāļĢ UNIX āļāļąāļāļāļĒāđāļēāļāļāļ§āđāļēāļāļāļ§āļēāļ āļāļāļāļĢāļ°āļāļąāđāļāđāļāļāļĩāđāļŠāļļāļāļāđāđāļāđāđāļāļīāļāļāļąāļ§āđāļŦāļĄāđāļāļķāđāļāļāļĩāđāļāļ·āđāļāļ§āđāļē āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ BSD UNIX
(Berkeley Software Distribution UNIX) āļāļķāđāļāļāļđāļāļāļąāļāļāļēāđāļāļĒ University of California (UC Berkeley)
āļāļāļāļĨāļēāļĒāđāļāđāļāļāļąāļ§āļŦāļāļķāđāļ āļāļĩāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāđāļĨāļ°āļĄāļĩāļāļēāļĢāđāļāđāļāļēāļāļāļąāļāļāļĒāđāļēāļāđāļāļĢāđāļŦāļĨāļēāļĒāđāļāļŠāļāļēāļāļąāļāļāļēāļĢāļĻāļķāļāļĐāļē āļāđāļāļĄāļē
āļŦāļāđāļ§āļĒāļāļēāļāļāļĢāļ°āļāļĢāļ§āļāļāļĨāļēāđāļŦāļĄāļāļāļāļŠāļŦāļĢāļąāļāļŊ (Defense Advanced Research Projects Agency - DARPA)
āļāđāđāļāđāđāļŦāđāļāļļāļāļāļąāļāļāļēāļ UC Berkeley āđāļāļ·āđāļāļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāđāļāđāļŦāđāļāļĨāļēāļĒāđāļāđāļ Version 4 BSD
āđāļāļ·āđāļāļĢāļāļāļĢāļąāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāļāļāđāļāļĢāļ·āļāļāđāļēāļĒ DARPA āļāļĩāđāđāļāđāļĄāļēāļāļĢāļēāļāļēāļāđāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāļ·āđāļāļ§āđāļē TCP/IP āļāđāļāļĄāļēāđāļāļāļĩ āļ.āļĻ.
1993 āļāļēāļ UC Berkley āļāđāđāļāđāļāļāļāļāļąāļ§ BSD āļĢāļļāđāļ 4.4 āļāļĩāđāļĢāļāļāļĢāļąāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāđāļāļāđāļāļĢāđāļāļāļāļĨ X.25 āđāļāđāđāļāđāļāļāļĩāđāļāđāļē
āđāļŠāļĩāļĒāļāļēāļĒāļāļĩāđāđāļāļāļĩāđāļŠāļļāļ UC Berkeley āļāđāđāļāđāļŦāļĒāļļāļāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļāđāļ§āļĨāļēāļāđāļāļĄāļē
āļŦāļĨāļąāļāļāļēāļāļāļąāđāļāđāļĄāđāļāļēāļāļāļąāļāļāļēāļāļēāļĢāļāļāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāđāđāļĢāļīāđāļĄāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļŠāļđāļāļāļķāđāļ āđāļāļāļāļ°āļāļĩāđāļĢāļēāļāļē
āļŪāļēāļĢāđāļāđāļ§āļĢāđāļāđāđāļĢāļīāđāļĄāļāļđāļāļĨāļ āđāļāļāļĩāđāļŠāļļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāļĩāđāđāļāļĒāļāļĒāļđāđāđāļāļĢāļ°āļāļąāļāļĄāļīāļāļīāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļģāļĄāļē
āđāļāđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļŠāđāļ§āļāļāļļāļāļāļĨ (Personal Computer) āļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē âXENIXâ āđāļĄāđāđāļāļĒāļļāļāđāļĢāļāļāļāļāđāļāļĢāļ·āđāļāļ
XENIX āļĒāļąāļāļĄāļĩāđāļāļĩāļĒāļāļŦāļāđāļēāļāļāļāļĩāđāđāļŠāļāļāđāļāđāđāļāļĩāļĒāļāļāļąāļ§āļŦāļāļąāļāļŠāļ·āļ (Text Mode) āļāļāļāļĢāļ°āļāļąāđāļāļāđāļ§āļāļāļĨāļēāļāļāļĻāļ§āļĢāļĢāļĐ 1980
āļāđāđāļāđāļĄāļĩāļāļēāļĢāļāļąāļāļāļē X-Window āļāļķāđāļāļĄāļēāļāļģāđāļŦāđāļāļēāļĢāđāļāđāļāļēāļ UNIX āļāđāđāļĢāļīāđāļĄāļĄāļĩ GUI (Graphic User Interface) āđāļāļīāļ
āļāļķāđāļ
āļāļĢāļīāļĐāļąāļ AT&T āļĒāļąāļāļāļāļāļĨāļąāļāļāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāļāļāļĢāļ°āļāļąāđāļāļāļķāļāļĢāļļāđāļ System V Release
4 (SVR4) āļāļēāļ AT&T āđāļāđāļāļĒāļēāļĒāļēāļĄāļĢāļ§āļĄāļāđāļāļāļģāļŦāļāļāđāļĨāļ°āļĄāļēāļāļĢāļēāļāļēāļāļāđāļēāļāđ āļāļāļ BSD UNIX āđāļĨāļ° XENIX
16
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
āļĢāļđāļāļāļĩāđ 1.3 āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ Unix āđāļāļ§āļēāļĢāļŠāļēāļĢ The Bell System Technical Journal
copies of the 1978 and 1984 special Unix issues of the Bell System Technical Journal (Link)
17. āđāļāđāļēāđāļāļāđāļ§āļĒāļāļąāļ āļāļķāđāļāļāļąāđāļāļŠāļāļāļŠāļēāļĄāļēāļĢāļāļāļđāļāļāļģāđāļāđāļāđāļāļēāļāđāļāđāļāļ SVR4 āđāļāđāļāđāļ§āļĒāđāļŦāļāļļāļāļēāļĢāļāđāļāļĢāļąāđāļāļāļĩāđāļāļģāđāļŦāđāļāļĨāļļāđāļĄāļāļąāļāļāļąāļāļāļē
āđāļĨāļ°āļāļĢāļīāļĐāļąāļāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāđāļĢāļīāđāļĄāļ§āļīāļāļāļāļąāļāļ§āļĨāļ§āđāļēāļāļ°āđāļāļīāļāļāļēāļĢāļāļđāļāļāļēāļāđāļāļāļēāļĢāļāļģāļŦāļāļāļĄāļēāļāļĢāļēāļāļēāļāļāļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ
UNIX āļāļēāļāļāļĢāļīāļĐāļąāļ AT&T āļŦāļĢāļ·āļāđāļĄāđ āļāļąāđāļāļŦāļĄāļāļāļķāļāđāļāđāļĢāļ§āļĄāļāļąāļ§āļāļąāļāļāļąāļāļāļąāđāļāļāļāļāđāļāļĢ Open Software Foundation
(OSF) āļāļķāđāļāđāļāļ·āđāļāļĢāđāļ§āļĄāļ§āļīāļāļąāļĒāđāļĨāļ°āļĢāđāļ§āļĄāļāļģāļŦāļāļāļĄāļēāļāļĢāļēāļāļēāļāļāđāļēāļāđāļāļāļāļĢāļ°āļāļ UNIX āđāļāđāļ§āļĨāļēāļāđāļāļĄāļē
āļāļāļāļāļēāļ UC Berkeley āđāļĨāđāļ§ āļāđāļĒāļąāļāļĄāļĩāļāļĢāļīāļĐāļąāļāļĢāļēāļĒāļāļ·āđāļāđāļāļĩāđāļāļąāļāļāļēāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļĢāļ°āļāļąāļāļŠāļđāļāđāļāļ·āđāļāđāļāđāđāļāļāđāļēāļ
āļāļļāļĢāļāļīāļ āđāļāđāļ āļāļĢāļīāļĐāļąāļāļāļąāļāđāļĄāđāļāļĢāļāļīāļŠāđāļāđāļĄ (SunOS āđāļĨāļ° Solaris) āļāļĢāļīāļĐāļąāļ DEC (āđāļāļĢāļ·āđāļāļ Ultrix āļāļāđāļāļĨāļĩāđāļĒāļāļāļ·āđāļāđāļāđāļ
OSF/1) āļāļĢāļīāļĐāļąāļāđāļĄāđāļāļĢāļāļāļāļāđ (āđāļāļĢāļ·āđāļāļ XENIX) āļāļĢāļīāļĐāļąāļāđāļāļāļĩāđāļāđāļĄ (āđāļāļĢāļ·āđāļāļ AIX) āļāļķāđāļāļŠāđāļ§āļāđāļŦāļāđāļāļ°āļĒāļķāļāđāļāļ§āļĢāļ°āļāļ
āļāļāļīāļāļąāļāļīāļāļēāļĢāļāļāļ BSD āļŦāļĢāļ·āļāđāļĄāđāļāđ System V āļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āļāļąāđāļ āļāļąāļāļāļļāļāļąāļāđāļāđāļāļĨāļēāļĒāđāļāđāļ
āđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļēāļĢāļāđāļēāļāļāļāļ°āđāļāļĩāļĒāļ (Registered Trademark) āļāļāļāļŦāļāđāļ§āļĒāļāļēāļāļāļĩāđāļāļ·āđāļ The Open Group āļāļķāđāļ
āđāļāđāļāļŦāļāđāļ§āļĒāļāļēāļāļāļĩāđāļāļģāļŦāļāļāđāļĨāļ°āļĢāļąāļāļĢāļāļāļĄāļēāļāļĢāļāļēāļāļāļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļ§āđ 2 āđāļāļāļāļ·āļ
âĒ āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĩāđāđāļāđāļĄāļēāļāļĢāļāļēāļ UNIX āļāļķāđāļāđāļāđāļĄāļēāļāļĢāļāļēāļāļāļāļ The Open Group āđāļāļāļēāļĢāļāļąāļāļāļēāļāļķāđāļāļĄāļē
āđāļāđāļ Digital UNIX, SCO UNIX, IBM's OpenEdition MVS
âĒ āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĨāđāļēāļĒ UNIX (UNIX Compatible) āđāļāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĩāđāļĄāļĩāļĨāļąāļāļĐāļāļ°āļāļĨāđāļēāļĒāļĢāļ°āļāļ
āļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļāđāļĒāļąāļāđāļĄāđāđāļāđāļāļāļāļ°āđāļāļĩāļĒāļāļĢāļąāļāļĢāļāļāđāļāđāļāļāļēāļāļāļēāļĢ āđāļāđāļ Sun Solaris, IBM AIX, Linux
āđāļāļĢāļāļāļēāļĢ GNU (GNU Project) āđāļāđāļāļđāļāļĢāļīāđāļĢāļīāđāļĄāļāļēāļāļāļąāļāļ§āļīāļāļąāļĒāļāļēāļ M.I.T āļāļ·āđāļ Richard Stallman āđāļāļ·āđāļāļāļāļēāļ
āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ UNIX āđāļĄāđāđāļāđāļāļĢāļĩāļāļĩāļāļāđāļāđāļāđāļĨāđāļ§ āđāļāļĒāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāļŦāļĨāļąāļāļāļāļāđāļāļĢāļāļāļēāļĢāļāļĩāđāļāļ·āļāļāļēāļĢāļāļĒāļēāļĒāļēāļĄāđāļĢāļīāđāļĄāļāđāļ
āļŠāļĢāđāļēāļ C compiler (gcc), make (GNU make), Emacs, C library (glibc), āđāļĨāļ° coreutils (āđāļāđāļāļāļģāļŠāļąāđāļ
ls, cp āđāļāđāļāļāđāļ) āđāļŦāļĄāđāļāļąāđāļāļŦāļĄāļāđāļāļ·āđāļāđāļŦāđāļāļļāļāļāļāļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāļāđāđāļāđāļāļĢāļĩ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāđāļāļĢāļāļāļēāļĢāļāļĩāđāļāđāļĒāļąāļāļāļāļāļēāļāļāļąāļ§
āđāļāļāļāļĨāļēāļāļŠāļģāļāļąāļāļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļēāđāļāļāļĢāđāđāļāļĨ (Kernel) āļāļāļāļĢāļ°āļāļąāđāļāļāļĩ āļ.āļĻ. 1991 āļāļąāļāļĻāļķāļāļĐāļē
17
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
āļĢāļđāļāļāļĩāđ 1.4 TimeLine āļāļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļī UNIX/LINUX
21. āļāđāļāļāļĄāļĩāļāļāļ§āļāļāļēāļĢāđāļāđāļāđāļĢāļāđāļēāļ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāđāļēāļāļđāđāđāļāđāļāđāļāļāļāļēāļĢāļāļĢāļēāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĩāđāđāļŦāļĨāļ·āļāļŦāļĢāļ·āļāļāļ·āđāļāļāļĩāđāļāļāļ
āļŪāļēāļĢāđāļāļāļīāļŠāļāđāļāļĩāđāđāļŦāļĨāļ·āļāļāļĒāļđāđ āļāļđāđāđāļāđāđāļāļĩāļĒāļāļāļīāļĄāļāđāļāļģāļŠāļąāđāļ free/df āļāļąāļ§ shell āļāđāļāļ°āļāļģāļŦāļāđāļēāđāļāļ·āđāļāļĄāļāđāļāđāļĨāļ°āđāļāđāļēāđāļāļāļąāļāļāļēāļĢāđāļ
āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļŦāļĢāļ·āļāļŪāļēāļĢāđāļāļāļīāļŠāļāđāđāļŦāđāļāļĢāļ§āļāļŠāļāļāļāļąāļ§āđāļāļāļ§āđāļēāļāļāļ°āļāļĩāđāļĄāļĩāļāļēāļĢāđāļāđāļāļēāļāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāđāļāđāļēāđāļŦāļĢāđāđāļĨāđāļ§āđāļĨāļ°āđāļŦāļĨāļ·āļ
āļāļ·āđāļāļāļĩāđāđāļŦāđāđāļāđāļāļēāļāđāļāđāļāļĩāļāđāļāđāļēāđāļŦāļĢāđ āļāļķāđāļāļāļāļ§āļāļāļēāļĢāļāļąāļāļāļĩāđāđāļāđāļāļĨāđāļēāļ§āļāđāļēāļāļāđāļāđāļāđāļāļāļēāļĢāļāļīāļāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāđāļāļĢāļ°āļāļąāļāļĨāđāļēāļāļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē
āļĢāļ°āļāļąāļāđāļāļāļĢāđāđāļāļĨ āļāļķāđāļāļāļ·āļāđāļāđāļ§āđāļēāđāļāđāļāđāļāļāļāļĨāļēāļāļŠāļģāļāļąāļāđāļāļāļēāļĢāļāļ§āļāļāļļāļĄāļāļēāļĢāļāļģāļāļēāļāļĢāļ°āļāļāļāļąāđāļāļŦāļĄāļāļ āļēāļĒāđāļāđāļāļĢāļ·āđāļāļ
āļāļāļĄāļāļīāļ§āđāļāļāļĢāđ āđāļāļĒāļāļ°āļāļĨāđāļēāļ§āļāļķāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļāļāļĢāđāđāļāļĨāđāļāļāļāļāļąāļāđāđāļ
āļāļāļāļāļēāļāļāļąāđāļ shell āļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļĢāļāļāļĢāļąāļāļāļēāļĢāđāļāļĩāļĒāļāļāļļāļāļāļģāļŠāļąāđāļāļĄāļēāļāļāļ§āđāļēāļŦāļāļķāđāļāļāļģāļŠāļąāđāļāļāļĢāđāļāļĄāļāļąāļ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļĢāļąāļ
āļāļļāļāļāļģāļŠāļąāđāļāļĨāđāļ§āļāļŦāļāđāļēāđāļŦāđāļāļģāļāļēāļāļāļēāļĄāđāļāļ·āđāļāļāđāļāļāđāļēāļāđāļāļĩāđāđāļāđāļāļģāļŦāļāļāđāļ§āđāđāļāļĨāļąāļāļĐāļāļ°āļŠāļāļĢāļīāļāļāđ (Script) āļāļĩāđāļāļđāļāđāļāđāļāļĨāļāđāļāđāļāļĨāđ
āđāļāđ āļāļģāđāļŦāđāđāļāļīāđāļĄāļāļ§āļēāļĄāļŠāļ°āļāļ§āļāđāļĨāļ°āļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļāļāļēāļĢāđāļāđāļāļēāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ āđāļāļĒāđāļāļāļēāļ°āļāļđāđāđāļāđāļāļĩāđāļĄāļĩ
āļāļąāļāļĐāļ°āļāļĒāļđāđāļĢāļ°āļāļąāļāļŦāļāļķāđāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāļŠāļāļĢāļīāļāļāđāļŦāļĢāļ·āļāļāļĩāđāđāļĢāļĩāļĒāļāļāļąāļāļ§āđāļēāđāļāļĨāļĨāđāļŠāļāļĢāļīāļāļāđ (Shell script) āļāļąāđāļ āđāļĨāļ°āļāļāļāļāļēāļ
āļāļąāđāļāļĨāļđāļāđāļĨāđāļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļ°āļĄāļēāļāļāđāļāļĒāđāļāļĩāļĒāļāđāļāļāđāļĒāļąāļāļāļķāđāļāļāļĒāļđāđāļāļąāļāļĒāļĩāđāļŦāđāļāļŦāļĢāļ·āļāļĢāļļāđāļāđāļāļĢāđāļāļĢāļĄ shell āļāļąāđāļāļāđāļ§āļĒ āđāļāļāļąāļāļāļļāļāļąāļ
shell āļāļĩāđāļĄāļĩāļāļīāļāļāļīāļāļĨāđāļĨāļ°āđāļāđāļāļāļĩāđāļāļīāļĒāļĄāļĄāļēāļāļāļĩāđāļŠāļļāļāļāļąāļ§āļŦāļāļķāđāļāļāļ·āļ Bourne shell (āļāļąāļāļāļļāļāļąāļāļāļĨāļēāļĒāđāļāđāļ Bourne Again
shell) āđāļĨāļ° C shell
āļŦāļāđāļēāļāļāļĢāļąāļāļāđāļēāļŠāļąāđāļ
Shell
āļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļēāļŠāļąāđāļ
āļĢāļąāļāļāđāļēāļŠāļąāđāļāļāđāļēāļāļāđāļēāļŠāļąāđāļ
āļĢāļđāļāļāļĩāđ 1.5 āļāļāļ§āļāļāļēāļĢāļāļģāļāļēāļāļāļāļ Shell
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļāļīāļāļāļāļ shell āļāļĩāđāļāļģāļĨāļąāļāđāļāđāļāļēāļāļāļĒāļđāđāđāļāļĢāļ°āļāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļ echo āđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļĢāļļāđāļāļāļāļ
shell āļāđāļ§āļĒ --version
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
21
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
22. āļŦāļēāļāļāđāļāļāļāļēāļĢāļāļĢāļēāļāļāļķāļāļĢāļēāļĒāļāļēāļĢāļāļļāļāļāļģāļŠāļąāđāļāļāļĩāđāļāļđāļāļāļąāļāļāļĒāļđāđāļ āļēāļĒāđāļ shell āđāļāļĒāđāļāđāļāļģāļŠāļąāđāļāļāļąāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ bash -c help
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
These shell commands are defined internally. Type `help' to see this list.
Type `help name' to find out more about the function `name'.
Use `info bash' to find out more about the shell in general.
Use `man -k' or `info' to find out more about commands not in this list.
A star (*) next to a name means that the command is disabled.
job_spec [&] history [-c] [-d offset] [n] or hist>
(( expression )) if COMMANDS; then COMMANDS; [ elif C>
. filename [arguments] jobs [-lnprs] [jobspec ...] or jobs >
: kill [-s sigspec | -n signum | -sigs>
[ arg... ] let arg [arg ...]
[[ expression ]] local [option] name[=value] ...
alias [-p] [name[=value] ... ] logout [n]
bg [job_spec ...] mapfile [-n count] [-O origin] [-s c>
bind [-lpvsPVS] [-m keymap] [-f filen> popd [-n] [+N | -N]
break [n] printf [-v var] format [arguments]
builtin [shell-builtin [arg ...]] pushd [-n] [+N | -N | dir]
caller [expr] pwd [-LP]
case WORD in [PATTERN [| PATTERN]...)> read [-ers] [-a array] [-d delim] [->
cd [-L|-P] [dir] readarray [-n count] [-O origin] [-s>
command [-pVv] command [arg ...] readonly [-af] [name[=value] ...] or>
compgen [-abcdefgjksuv] [-o option] > return [n]
complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in WORDS ... ;] do COMM>
compopt [-o|+o option] [-DE] [name ..> set [--abefhkmnptuvxBCHP] [-o option>
continue [n] shift [n]
coproc [NAME] command [redirections] shopt [-pqsu] [-o] [optname ...]
declare [-aAfFilrtux] [-p] [name[=val> source filename [arguments]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ...] test [expr]
echo [-neE] [arg ...] time [-p] pipeline
enable [-a] [-dnps] [-f filename] [na> times
eval [arg ...] trap [-lp] [[arg] signal_spec ...]
exec [-cl] [-a name] [command [argume> true
exit [n] type [-afptP] name [name ...]
export [-fn] [name[=value] ...] or ex> typeset [-aAfFilrtux] [-p] name[=val>
false ulimit [-SHacdefilmnpqrstuvx] [limit>
fc [-e ename] [-lnr] [first] [last] o> umask [-p] [-S] [mode]
fg [job_spec] unalias [-a] name [name ...]
for NAME [in WORDS ... ] ; do COMMAND> unset [-f] [-v] [name ...]
for (( exp1; exp2; exp3 )); do COMMAN> until COMMANDS; do COMMANDS; done
function name { COMMANDS ; } or name > variables - Names and meanings of so>
getopts optstring name [arg] wait [id]
hash [-lr] [-p pathname] [-dt] [name > while COMMANDS; do COMMANDS; done
help [-dms] [pattern ...] { COMMANDS ; }
āļŠāļēāļĄāļēāļĢāļāļāļĢāļēāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļāđāļĨāļ°āļāļģāļŠāļąāđāļāļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļ shell āđāļāļĒāļāļīāļĄāļāđ help <āļāļ·āđāļāļāļģāļŠāļąāđāļ> āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ
$ help times
times: times
Display process times.
Prints the accumulated user and system times for the shell and all of its
child processes.
Exit Status:
Always succeeds.
22
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
23. Echo
Echo āđāļāđāļāļāļģāļŠāļąāđāļāļāļĩāđāđāļāđāđāļāļāļēāļĢāđāļŠāļāļāļāđāļāļāļ§āļēāļĄāđāļāđāļāļĩāđāļāđāļāļāļāļēāļĢāđāļŦāđāļāļđāļāļāļĢāļēāļāļāļāļāļŦāļāđāļēāļāđāļēāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
āļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļāļāļąāļāļāļĩāđ
$ echo Welcome to Embedded System
Welcome to Embedded System!
$ echo Welcome to Embedded System
Welcome to Embedded System!
$ echo 'Welcome to Embedded System'
Welcome to Embedded System!
āļāļēāļāļāļąāļ§āļāļĒāđāļēāļāļāļ°āđāļŦāđāļāļ§āđāļēāļāļģāļŠāļąāđāļ echo āļāļ°āđāļĄāđāļŠāļāđāļāļāđāļāļāļ§āđāļēāļāļ§āđāļēāļāļ°āļĄāļĩāļāļĩāđāļāđāļāļāļ§āđāļēāļ āļāļēāļĢāđāļŠāļāļāļāļĨāļāļ°āļāļđāļāļāļąāļāļāđāļāļ
āļ§āđāļēāļāđāļŦāļĨāļ·āļāđāļāļĩāļĒāļ 1 āļāđāļāļāļ§āđāļēāļāđāļŠāļĄāļ āđāļāđāļāđāļēāļāđāļāļāļāļēāļĢāđāļŦāđāđāļŠāļāļāļāļĨāļĨāļąāļāļāđāļāļēāļĄāļĢāļ°āļĒāļ°āļŦāđāļēāļāļāļĩāđāļāđāļāļāļāļēāļĢāļāļ°āļāđāļāļāđāļāđ
āđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒ āļāļąāļāļāļĢāļ°āļāļēāļĻ (â -Apostrophe) āļŦāļĢāļ·āļāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļģāļāļđāļ (â - Quotation Mark) āļāļĢāļāļ
āļāđāļāļāļ§āļēāļĄāļāļąāđāļ āđāļāļ·āđāļāļāļāļēāļāđāļ Bash shell āļāļąāđāļāļāļ°āđāļāđ white space (āđāļāļĒāļāļēāļĢāļāļāļāļļāđāļĄ space bar) āđāļāļāļēāļĢāđāļĒāļ
āļāđāļāļāļ§āļēāļĄāļāļāļāđāļāđāļ token āļŦāļĢāļ·āļāđāļĢāļĩāļĒāļāļ§āđāļē āļāļēāļĢāļēāļĄāļīāđāļāļāļĢāđāđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāđāļŠāļāļāļāļĨ āđāļāđāļāđāļēāļĄāļĩāļāļēāļĢāđāļŠāđāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļĢāļāļ
āļāđāļāļāļ§āļēāļĄāđāļāđāļ âBurapha Universityâ āļāđāļāļāļ§āļēāļĄāļāļąāđāļāļāļ°āļāļđāļāđāļāđāļāđāļ§āđāđāļ token āđāļāļĩāļĒāļāļāļąāļ§āđāļāļĩāļĒāļ§
āļāļēāļĢāđāļāđāļāļēāļāļāļģāļŠāļąāđāļ echo āļāļ°āļĄāļĩāļāļąāļ§āđāļĨāļ·āļāļ (Option) āļŦāļĨāļēāļĒāđāļāļ (āļāļķāđāļāļŠāļēāļĄāļēāļĢāļāļāļđāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļģāļŠāļąāđāļāđāļāđāđāļāļĒ
āļāļīāļĄāļāđ man echo) āļĒāļāļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāļēāļĢāđāļāđāļāļąāļ§āđāļĨāļ·āļāļ -n āļāđāļāļāđāļēāļĒāļāļģāļŠāļąāđāļ echo āļāļ°āļŦāļĄāļēāļĒāļāļķāļāļāļēāļĢāđāļĄāđāļāļķāđāļāļāļĢāļĢāļāļąāļ
āđāļŦāļĄāđ (New Line)
$ echo -n "My name is Android"
My name is Android$
āđāļāđāļāđāļēāļāđāļāļāļāļēāļĢāļāļķāđāļāļāļĢāļĢāļāļąāļāđāļŦāļĄāđāļāļēāļĄāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐ n (new line) āļāđāļāļāļĢāļ°āļāļļāļāļąāļ§āđāļĨāļ·āļāļ -e āļŦāļĨāļąāļāļāļģāļŠāļąāđāļ echo
$ echo -e "My name is nAndroid"
My name is
Android
āļāļāļāļāļēāļāļāļąāļāļāļĢāļ° n āđāļĨāđāļ§āļĒāļąāļāļĄāļĩāļāļąāļāļāļĢāļ°āđāļāļāļēāļĢāļāļ§āļāļāļļāļĄāļāļēāļĢāđāļŠāļāļāļāļĨāļāđāļāļāļ§āļēāļĄāļāļąāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāđāļāļāļēāļĢāļēāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
āļāļēāļĢāļēāļ 1.1 āđāļŠāļāļāļāļēāļĢāđāļāđāļāļēāļāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐ
ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļ
a Alert (bell)
b Backspace
23
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
24. ESCAPE SEQUENCE āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļ
c āļŦāļĒāļļāļāļāļēāļĢāļāļķāđāļāļāļĢāļĢāļāļąāļāđāļŦāļĄāđ (āļĨāļąāļāļĐāļāļ°āđāļāļĩāļĒāļ§āļāļąāļāļāļēāļĢāđāļāđāļāļēāļ -n)
f Form feed
n New line
r Carriage return
t Horizontal tab
āđāļāļāļēāļĢāđāļāđāļāļēāļ Bash shell āļāļąāđāļāļĒāļąāļāļĄāļĩāļāļąāļāļāļĢāļ°āđāļāļāļēāļ°āļĄāļēāļāļĄāļēāļĒāļāļĩāđāđāļĄāđāļŠāļēāļĄāļēāļĢāļāļāļģāļĄāļēāđāļāđāđāļŠāļāļāđāļāđāļāļāļąāļ§āļāđāļāļāļ§āļēāļĄāđāļāđ
āđāļāļ·āđāļāļāļāļēāļāļāļđāļāđāļāđāđāļāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāļāļīāļāļāļļāļāļāļāļāļāļģāļŠāļąāđāļ āđāļāđāļ '|', '&', ';', '(', ')', '<', '>' āđāļāđāļāđāļēāļāđāļāļāļāļēāļĢ
āđāļŠāļāļāļāļąāļāļāļĢāļ°āđāļŦāļĨāđāļēāļāļĩāđāđāļŦāđāļāļĢāļēāļāļāļāļĒāļđāđāđāļāļāđāļāļāļ§āļēāļĄāļāļ°āļāđāļāļāđāļāļīāļĄāļŠāļąāļāļĨāļąāļāļĐāļāđ āļāļģāļŦāļāđāļēāļāļąāļāļāļĢāļ°āđāļŠāļĄāļ āļŦāļĢāļ·āļāđāļāđ
āđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒāļāļąāļāļāļĢāļ°āļāļēāļĻāļāļĢāļāļāļāļąāđāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩāļāļąāļāļāļĢāļ°āļāļŠāļĄāļāļĒāļđāđāļāđāđāļāđ
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļŠāļąāļāļĨāļąāļāļĐāļāđ āļāļģāļŦāļāđāļēāļāļąāļāļāļĢāļ°āļāļĩāđāļāđāļāļāļāļēāļĢāđāļŠāļāļāđāļāđāļāļāđāļāļāļ§āļēāļĄ
$ echo I love Linux & Android
[1] 30136
I love Linux
Android: command not found
[1]+ Done echo I love Linux
[1]+ Done echo I love Linux
$ echo I love Linux & Android
I love Linux & Android
$ echo 'I love Linux & Android'
I love Linux & Android
Command Sequences
āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāđāļāļāļāļģāļŠāļąāđāļāļĄāļēāļāļāļ§āđāļēāļŦāļāļķāđāļāļāļģāļŠāļąāđāļāđāļāļāļĢāđāļāļĄāļāļąāļāđāļāļĒāđāļāđāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāļāļ§āļāļāļļāļĄ (Control Opera-
tors) āđāļāđāđāļāđ â||â, â&&â, â&â, â;â, â;;â, â|â, â(â, â)â āđāļāđāļāļāđāļ āļāļķāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļāļļāļāļāļģāļŠāļąāđāļāļāļĒāđāļēāļāļāđāļēāļĒāļāļĩāđāļŠāļļāļāđāļāļāļĢāļāļĩāļāļĩāđāļĄāļĩ
āļĄāļēāļāļāļ§āđāļē 1 āļāļģāļŠāļąāđāļāđāļāđāļāļāđāļāđāļ āļāļ°āđāļāđāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒ â;â āļāļąāļāļ āļēāļ (semicolon) shell āļāļ°āļĢāļąāļāļāļģāļŠāļąāđāļāđāļĨāļ°āļāļģāđāļāļīāļ
āļāļēāļĢāļāļĩāļĨāļ°āļāļģāļŠāļąāđāļāļāļēāļĄāļĨāļģāļāļąāļ āđāļāļāļĢāļāļĩāļāļĩāđāļāļ°āļĄāļĩāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļāļĨāļĨāļąāļāļāđāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāđāļĨāļ°āļāļģāļŠāļąāđāļāļ§āđāļēāļŠāļģāđāļĢāđāļāļŦāļĢāļ·āļāļĨāđāļĄ
āđāļŦāļĨāļ§āļāļąāđāļ āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļ°āļĄāļĩāļāļēāļĢāļāļ·āļāļāđāļēāļāļĨāļąāļāļāļ·āļāļāđāļēāļāļ·āļāļāđāļēāļāļĨāļąāļāļĄāļēāđāļĨāļāļĻāļđāļāļĒāđāļāļ°āļŦāļĄāļēāļĒāļāļķāļāļāļģāļŠāļąāđāļāļāļģāđāļāļīāļ
āļāļēāļĢāļŠāļģāđāļĢāđāļ āđāļāđāļāđāļēāđāļāđāļāļāļąāļ§āđāļĨāļāļāļ·āđāļāđāļāļ°āļāļ·āļāļ§āđāļēāļāļģāļŠāļąāđāļāļāļąāđāļāļāļģāļāļēāļāļĨāđāļĄāđāļŦāļĨāļ§ āļāļąāļāļāļąāđāļāļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļģāļŦāļāļāđāļŠāđāļāļāļēāļāļāļēāļĢ
āļāļģāļāļēāļāļāļēāļĄāđāļāļ·āđāļāļāđāļāļāļĩāđāļāļāļāļĄāļēāđāļāļĒāđāļāđāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ AND â&&â āđāļĨāļ° OR â||â āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ
$ ls
android ccache Downloads kernel output.txt Templates workspace
aosp Desktop error.log Music Pictures test.txt
24
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
25. bin Documents git one.txt Public Videos
$ ls test.txt && echo "OK... File exists"
test.txt
OK... File exists
$ ls mail.txt && echo "OK... File exists"
ls: cannot access mail.txt: No such file or directory
āļāļēāļāļāļģāļŠāļąāđāļāļāđāļēāļāļāđāļ āđāļāļĨāđ test.txt āļĄāļĩāļāļĒāļđāđāđāļāđāļāđāļĢāļāļāļāļĢāļĩāļāļķāļāļāļģāđāļŦāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļ·āļāļāđāļēāļāļĨāļąāļāļĄāļēāđāļāđāļāļĻāļđāļāļĒāđ
āļāļģāļŠāļąāđāļāļāļąāļāđāļāļāļķāļāļāļģāļāļēāļāļāđāļāđāļāđ āđāļāđāđāļāļāļāļ°āļāļĩāđāđāļāļĨāđ mail.txt āđāļĄāđāđāļāđāļāļĒāļđāđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ āđāļŠāļāļāļāļķāļāļāļēāļĢāļāļģāļāļēāļāļĨāđāļĄāđāļŦāļĨāļ§
āļāļģāđāļŦāđāđāļĄāđāļĄāļĩāļāļēāļĢāļāļģāļāļģāļŠāļąāđāļāļāļąāļ§āļāļąāļāđāļ āđāļāđāļŦāļēāļāđāļāđāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ â||â āļāļģāļŠāļąāđāļāļāļąāļāļĄāļēāļāļ°āļāļđāļāļāļģāļāļēāļāđāļāļāļĢāļāļĩāļāļĩāđāļāļģāļŠāļąāđāļāđāļĢāļāļĄāļĩ
āļāļēāļĢāļāļ·āļāļāđāļēāļāļĨāļąāļāļĄāļēāđāļĄāđāđāļāđāļēāļāļąāļāļĻāļđāļāļĒāđ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
$ ls test.txt || echo "OK... File exists"
test.txt
$ ls mail.txt || echo "No File exists"
ls: cannot access mail.txt: No such file or directory
ON File exists
āđāļāđāļŦāļēāļāļāđāļāļāļāļēāļĢāļāļģāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ && āđāļĨāļ° || āļĄāļēāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļāļ·āđāļāļāđāļāđāļŦāļĄāļ·āļāļāļāļļāļāļāļģāļŠāļąāđāļ if
(āđāļāļ·āđāļāļāđāļ) ..(āļāļĢāļīāļ).. else ..(āđāļāđāļ).. āļŦāļĢāļ·āļ if (āđāļāļ·āđāļāļāđāļ) ? ..(āļāļĢāļīāļ).. : ..(āđāļāđāļ).. āđāļāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļąāđāļ§āđāļ āļāļ°āļĄāļĩāļĢāļđāļ
āđāļāļāļāļēāļĢāđāļāļĩāļĒāļāļāļąāļāļāļĩāđ
$ ls test.txt && echo "OK...File exists" || echo "Oh Bad... File not
found"
test.txt
OK...File exists
$ ls mail.txt && echo "OK...File exists" || echo "Oh Bad... File not
found"
ls: cannot access mail.txt: No such file or directory
Oh Bad... File not found
Standard I/O
āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļ§āļāļāļēāļĢāļāļģāļāļēāļāļāļāļ Shell āđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ āļāļ°āļĄāļĩāļāļ·āđāļāļāļēāļāļŠāļģāļāļąāļāļāļ·āļ āļ§āļīāļāļĩāļāļēāļĢ
āđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļĢāļĄāđāļĨāļ°āļŠāļīāđāļāđāļ§āļāļĨāđāļāļĄāļāļāļāļāļąāļ§āđāļāļĢāđāļāļĢāļĄāđāļāļāļ āļēāļĒāđāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨ (Terminal) āļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļē I/
O āļāļķāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđāđāļāđāļāļāļēāļĢāđāļŠāļāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļāļāļāļļāļāļāļĢāļāđ I/O āļĄāļēāļāļĢāļēāļāļēāļāļāļ·āđāļāļāļēāļāļāļāļāļĢāļ°āļāļāļāļĩāđāļĄāļĩāļāļĒāļđāđ 3 āļāļāļīāļ
āđāļāđāđāļāđ
25
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
28. āļŠāļēāļĄāļēāļĢāļāļāļĢāļāļāļāđāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāđāļŦāđāđāļāđāļāđāļāđāļ§āđāđāļāđāļāļĨāđāļāļ·āđāļ error.log āļāđāļ§āļĒāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ â2>â
$ cat one.txt two.txt 2> error.log
This is the data inside
āđāļāļāļĢāļāļĩāļāļĩāđāđāļĄāđāļāđāļāļāļāļēāļĢāđāļāđāļāļāđāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļ āļŠāļēāļĄāļēāļĢāļāļāļģāđāļāđāđāļāļĒāļŠāđāļāđāļāđāļŦāđāđāļāļĨāđāļāļ·āđāļ /dev/null
$ cat one.txt two.txt 2> /dev/null
This is the data inside
āļāļąāļāļāļķāļāļāđāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāđāļāļīāđāļĄāļāđāļāđāļāđāļēāđāļāđāļāđāļāļĨāđ error.log āļāđāļ§āļĒāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ â2>>â
$ cat one.txt two.txt three.txt 2>> error.log
This is the data inside
$ cat error.log
cat: two.txt: No such file or directory
cat: two.txt: No such file or directory
cat: three.txt: No such file or directory
āļāļąāļ§āđāļāļĢāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāļāļāļāļĢāļ°āļāļ
āļāļąāļ§āđāļāļĢāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ (Environment variables) āđāļāđāļāļāļąāļ§āđāļāļĢāļāļĩāđāļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāļĄāļēāļāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļī
āļāļēāļĢāļĨāļĩāļāļļāļāļāđ āđāļāļ·āđāļāļāļāļēāļāđāļāđāļāļāļąāļ§āđāļāļĢāļāļĨāļēāļāļāļĩāđ shell āļŦāļĢāļ·āļ āđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāļāđāļēāļāđāļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļāđ āļāļēāļāļī
āđāļāđāļ āļāļąāļ§āđāļāļĢāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāļāļāļ shell āļŦāļĢāļ·āļāļāļąāļ§āđāļāļĢāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāļāļāļāđāļāđāļĢāļāļāļāļĢāļĩāļāļĢāļ°āļāļģāļāļąāļ§āļāļāļāļāļđāđāđāļāđ (Home Di-
rectory) āđāļĨāļ°āļĒāļąāļāļĄāļĩāļāļąāļ§āđāļāļĢāļāđāļēāļāđ āļāļĩāļāļĄāļēāļāļĄāļēāļĒāļāļĩāđ shell āđāļāđāļĄāļĩāļāļēāļĢāļāļąāđāļāļāđāļēāđāļ§āđāđāļāļāļāļ°āļāļĩāđ shell āđāļĢāļīāđāļĄāļāļģāļāļēāļ āļāļąāļ§āļāļĒāđāļēāļ
āđāļāđāļ bash shell āļāļ°āļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāļĨāđāđāļĢāļīāđāļĄāļāđāļāļāļĒāļđāđ 2 āđāļāļĨāđāđāļāđāđāļāđ āđāļāļĨāđ .proïŽle āđāļĨāļ°āđāļāļĨāđ .bashrc
$ cat .profile <---- āđāļāļāļĢāļāļĩ Ubuntu āđāļ§āļāļĢāđāļāļąāļ 13.04 āļāļķāđāļāđāļ
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
export USE_CCACHE=0
export CCACHE_DIR=~/ccache
export JAVA_HOME=/usr/lib/jvm/jdk
export ANT_HOME=~/android/ant
export ANDROID_SDK_HOME=~/android/sdk
export ANDROID_NDK_HOME=~/android/ndk
export AOSP_HOME=~/aosp
export
PATH=$HOME/bin:$JAVA_HOME/bin:$ANT_HOME/bin:$ANDROID_SDK_HOME/tools:$ANDROID_
SDK_HOME/platform-tools:$ANDROID_NDK_HOME:$PATH
$ cat .bashrc
# .bashrc
# User specific aliases and functions
HISTSIZE=1000
28
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
29. HISTFILESIZE=2000
# some more ls aliases
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
āđāļĄāļ·āđāļāļāļđāđāđāļāđāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļ Login āđāļāļĒāļāļēāļĢāđāļāđāļāļēāļāļāđāļēāļāļŦāļāđāļēāļāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨāļāļķāđāļāļāļīāļĒāļĄāđāļĢāļĩāļĒāļāļŠāļąāđāļāđāļ§āđāļē tty (Teletype-
writer) āđāļĄāļ·āđāļāļŦāļāđāļēāļāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļ āļāļąāļ§āđāļāļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāđāļāļ°āļāļđāļāđāļĢāļĩāļĒāļāļāļķāđāļāļĄāļēāđāļāļ·āđāļāđāļŠāļāļ
āļāđāļāļāļ§āļēāļĄāđāļŦāđāļāļđāđāđāļāđāļāļĢāļāļāļāļ·āđāļāļāļđāđāđāļāđ (username) āđāļĨāļ°āļĢāļŦāļąāļŠāļāđāļēāļ (password) āđāļĄāļ·āđāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāđāļāđāļŠāļģāđāļĢāđāļāļāđāļāļ°āļāļģāļāļēāļĢ
āđāļĢāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄ shell āđāļāļ·āđāļāļāđāļēāļāļāđāļēāļāļ·āđāļāļāļēāļāļāļĩāđāļāļąāđāļāđāļ§āđāļŠāļģāļŦāļĢāļąāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄāļāļāļāļĢāļ°āļāļ (system environ-
ments) āļāļąāļāļāļąāđāļāļāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
āļŠāļĢāđāļēāļ tty āđāļŦāļĄāđāđāļŦāđāļāļąāļāļāļđāđāđāļāđ
āļāđāļēāļāļāļēāļĢāļāļąāđāļāļāđāļēāļĢāļ°āļāļāļŦāļĨāļąāļāđāļ /etc/
proïŽle āļŦāļĢāļ·āļ /etc/bashrc
āđāļāļĢāđāļāļĢāļĄ agetty āđāļŠāļāļāļŦāļāđāļē login āļāļ tty
āđāļāļĢāđāļāļĢāļĄ agetty āđāļĢāļĩāļĒāļāļāđāļēāļŠāļąāđāļ /bin/login
āđāļāļĢāđāļāļĢāļĄ login āđāļĢāļīāđāļĄāļāđāļēāļāļēāļāļāļ shell
āļāđāļēāļāļāļēāļĢāļāļąāđāļāļāđāļēāļĢāļ°āļāļāļāļāļāļāļđāđāđāļāđāđāļ
~/.bashrc
āđāļŠāļāļāļāđāļāļāļ§āļēāļĄ login āļāļĩāđāļāđāļēāļŦāļāļāļāļĒāļđāđāđāļ
āđāļāļĨāđ /etc/motd
Terminal
Login Shell
āļāļđāđāđāļāđ
āļĢāļđāļāļāļĩāđ 1.7 āļāļąāđāļāļāļāļāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāđāļēāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨ
āļāļāļāļāļēāļāļāļąāđāļāļĢāļ°āļāļāļāļ°āļĄāļĩāļāļēāļĢāļāļąāđāļāļāđāļēāļāļąāļ§āđāļāļĢāļĢāļ°āļāļāļāļ·āđāļāļāļēāļ āļāļķāđāļāđāļāđāļāļāļąāļ§āđāļāļĢāļŠāļģāļāļąāļāļāļĩāđāļāļ°āļāļāđāļāļāļāđāļāļĒāđāļāđāđāļāđ
29
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
30. āļāļēāļĢāļēāļ 1.4 āđāļŠāļāļāļāļąāļ§āđāļāļĢāļĢāļ°āļāļāļāļ·āđāļāļāļēāļ
āļāļ·āđāļ āļāļģāļāļāļīāļāļēāļĒ
USER āđāļĢāļĩāļĒāļāļāļ·āđāļāļāļđāđāđāļāđāļāļēāļāļāļĩāđāđāļāđāđāļāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļ
UID āđāļĢāļĩāļĒāļāļĢāļŦāļąāļŠāļāļđāđāđāļāđāļāļēāļāļāļĩāđāđāļāđāđāļāļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļ
HOME āđāļĢāļĩāļĒāļ Home Directory
PWD āđāļĢāļĩāļĒāļ Directory āļāļĩāđāļāļģāļĨāļąāļāđāļāđāļāļēāļ
SHELL āđāļĢāļĩāļĒāļāļāļ·āđāļ shell āļāļĩāđāļāļģāļĨāļąāļāđāļāđāļāļēāļ
$ āđāļĢāļĩāļĒāļ process id āļāļĩāđāļāļģāļĨāļąāļāđāļāđāļāļēāļ
PPID āđāļĢāļĩāļĒāļ process id āļāļĩāđāđāļāđāļĢāļąāļāļāļēāļĢāļŠāļ·āļāļāļāļāļĄāļē
? The exit code of the last command
āļĒāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļ echo āđāļāļ·āđāļāđāļŠāļāļāļāđāļēāļ āļēāļĒāđāļāļāļąāļ§āđāļāļĢāļĢāļ°āļāļ
$ echo $SHELL
/bin/bash
$ echo -e " My Home directory is $HOMEn My username is $USERn My
current directory is $PWD"
My Home directory is /home/student
My username is student
My current directory is /home/student
$ echo $PPID
1927
$ ps -aux | grep 1927
student 1927 0.0 0.5 192052 11236 ? Sl 08:15 0:33 gnome-terminal
env āđāļĨāļ° export
āļāļģāļŠāļąāđāļ export āđāļāđāļāļāļģāļŠāļąāđāļāļāļĩāđāļāļđāđāđāļāđāļāļēāļāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļāļąāļ§āđāļāļĢāļĢāļ°āļāļāđāļāļīāđāļĄāđāļāļīāļĄāđāļāđāđāļāļ āđāļāļĒāļāļēāļĢāļĢāļ°āļāļļāđāļāđāļēāđāļāđāļ
āđāļāļĨāđ .bashrc āļŦāļĢāļ·āļāļāļīāļĄāļāđāļāļģāļŠāļąāđāļāļāļēāļĢāļāļąāđāļāļāđāļēāđāļāđāđāļāļĒāļāļĢāļāđāļ terminal āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
$ export my_project_codes=/home/student/embedded/sourcecode/
$ echo $my_project_codes
/home/student/embedded/sourcecode/
āļŦāļēāļāļāļđāđāđāļāđāļāđāļāļāļāļēāļĢāļāļđāļāđāļēāļāļąāļ§āđāļāļĢāļĢāļ°āļāļāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāđāļāļēāļāļāļĒāļđāđ āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļ env āļŦāļĢāļ·āļ export -p āļāļąāļāļāļĩāđ
$ env
ORBIT_SOCKETDIR=/tmp/orbit-student
SSH_AGENT_PID=1383
TERM=xterm
30
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
33. āđāļĢāļĩāļĒāļāđāļāđāļŠāļąāđāļāđ āđāļāđāļ alias ls=`ls -al --color=auto`) āļāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļ type āđāļāļ·āđāļāļāļĢāļ§āļāļŠāļāļāđāļāđ
āļāļąāļāļāļĩāđ
$ type ls cat date ifconfig uname whoami ps find grep echo set
ls is aliased to `ls -al --color=auto'
cat is hashed (/bin/cat)
date is /bin/date
ifconfig is /sbin/ifconfig
uname is /bin/uname
whoami is /usr/bin/whoami
ps is hashed (/bin/ps)
find is /usr/bin/find
grep is aliased to `grep --color=auto'
echo is a shell builtin
set is a shell builtin
āļŠāļąāļāđāļāļāļ§āđāļēāđāļāđāļĢāļāļāļāļĢāļĩāļŠāđāļ§āļāđāļŦāļāđāļāļĩāđāļāļĒāļđāđāđāļ PATH āļāļ°āļĨāļāļāđāļēāļĒāļāđāļ§āļĒ bin āļāđāļ§āļĒāđāļŦāļāļļāļāļĨāļāļēāļĢāļ§āļēāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļāļāļĢāļ°āļāļ
āđāļāļĨāđāļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ āđāļŦāđāđāļāđāļāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ /bin āđāļĨāļ° /usr/bin
āļāļģāļŠāļąāđāļāļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļāļāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§
āļāļģāļŠāļąāđāļāļāļĢāļ§āļāļŠāļāļāļāļĢāļąāļāļĒāļēāļāļĢāļĢāļ°āļāļ
āļāļēāļĢāđāļāđāļāļēāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļ āļēāļĒāđāļāđāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļĩāđāļĄāļĩāļāļĢāļąāļāļĒāļēāļāļĢāļāļģāļāļąāļ āđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļ
āļāļ§āļēāļĄāđāļĢāđāļ§āļāļāļāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļ āļāļāļēāļāļāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āļŦāļĢāļ·āļāļāļāļēāļāļāļ·āđāļāļāļĩāđāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨ āļāļąāļāļāļąāļāļāļē
āļāļģāđāļāđāļāļāļ°āļāđāļāļāļĻāļķāļāļĐāļēāđāļāļĩāđāļĒāļ§āļāļąāļāļ§āļīāļāļĩāļāļēāļĢāļāļīāļāļāļēāļĄāļāļēāļĢāđāļāđāļāļĢāļąāļāļĒāļēāļāļĢāļāļāļāļĢāļ°āļāļāļ āļēāļĒāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§ āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļ
āļāļĢāļ°āđāļĄāļīāļāđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāļāļĩāđāļāļēāļāļāļ°āđāļāļīāļāļāļķāđāļāđāļāļāļĢāļāļĩāļāļĩāđāļāļĢāļąāļāļĒāļēāļāļĢāļāļđāļāđāļāđāļĄāļēāļāđāļāļīāļāđāļāđāļāļ·āđāļāļāļģāđāļŦāđāļĢāļ°āļāļ
āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļĨāļ°āļĄāļĩāļāļ§āļēāļĄāđāļŠāļāļĩāļĒāļĢāļ āļēāļāļŠāļđāļāļŠāļļāļ
top
āđāļāđāļāļāļģāļŠāļąāđāļāđāļĢāļāđāļāļĩāđāļāļđāđāļāļđāđāļĨāļŦāļĢāļ·āļāļāļąāļāļāļąāļāļāļēāļĢāļ°āļāļāļāļģāđāļāđāļāļāđāļāļāļāļģāļāļ§āļēāļĄāļĢāļđāđāļāļąāļ āđāļāļĢāļēāļ°āđāļāđāļāļāļģāļŠāļąāđāļāļāļĩāđāđāļāđāđāļŠāļāļ
āļŠāļāļēāļāļ°āļāļēāļĢāđāļāđāļāļēāļāļāļĢāļąāļāļĒāļēāļāļĢāļāļāļāļĢāļ°āļāļ āļĢāļ§āļĄāļāļąāđāļāđāļŠāļāļāļĢāļēāļĒāļāļēāļĢāđāļāļĢāđāļāļŠāļāļĩāđāļāļđāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāļāļĒāļđāđ āđāļāļĒāđāļĢāļĩāļĒāļāļāļēāļĄāļāļēāļĢ
āļāļĢāļāļāļāļĢāļāļāļāļĢāļąāļāļĒāļēāļāļĢ āļāļķāđāļāđāļāļ·āđāļāļĄāđāļĒāļāļāļąāļ virtual ïŽlesystem (VFS) āđāļāļĨāđ /proc/loadavg āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļ
āļĨāđāļēāļ
33
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
45. address sizes : 40 bits physical, 48 bits virtual
power management:
āļāļģāļŠāļąāđāļāđāļāļĩāđāļĒāļ§āļāļąāļāļāļēāļĢāđāļāļīāļāļāđāļēāļāļāđāļāļĄāļđāļĨāļ āļēāļĒāđāļāđāļāļĨāđ
Cat, less, od, āđāļĨāļ° split
āļāļģāļŠāļąāđāļ cat āļāļ·āļāļāļģāļŠāļąāđāļāļāļĩāđāđāļāđāđāļŠāļāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļĒāļđāđāđāļāđāļāļĨāđāļāļāļāļĄāļēāđāļŠāļāļāļāļĢāļąāđāļāđāļāļĩāļĒāļ§āļāļĢāđāļāļĄāļāļąāļāļāļąāđāļāļŦāļĄāļ āđāļāļāļēāļāļāļĢāļąāđāļāļāđ
āđāļāđāđāļāļāļēāļĢāļĢāļ§āļĄāđāļāļĨāđāļŦāļĨāļēāļĒāđāļāļĨāđāđāļāđāļēāļāđāļ§āļĒāļāļąāļāļĄāļēāđāļāđāļāđāļāļĨāđāđāļāļĩāļĒāļ§ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāđāļēāđāļāļĨāđāļāļĩāđāļāđāļāļāļāļēāļĢāđāļāļīāļāļāđāļēāļāļāđāļāļĄāļđāļĨāļĄāļĩ
āļāļ§āļēāļĄāļĒāļēāļ§āļĄāļēāļ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļĨāđāļāļĩāđāđāļāđāļ log āļāļāļāļĢāļ°āļāļ āļāđāļēāđāļāđāļāļģāļŠāļąāđāļ cat āđāļāļ·āđāļāđāļāļīāļāđāļāļĨāđ log āļĒāđāļāļĄāđāļĄāđāđāļāđāļāļāļĨāļāļĩāļāļąāļ
āļāļđāđāļāđāļēāļāđāļāļāđāļāļĢāļēāļ°āļāļ°āđāļŠāļāļāļāđāļāļĄāļđāļĨāļāļāļāļĄāļēāļāļĒāđāļēāļāļĢāļ§āļāđāļĢāđāļ§āđāļāļīāļāļāļ§āđāļēāļāļ°āļāļąāļāđāļāļāļ§āļēāļĄāļāļąāļāđāļāđ āļāļąāļāļāļąāđāļāļāļģāļŠāļąāđāļ less āļāļķāļāđāļāđāļ
āļāļģāļŠāļąāđāļāļĒāļāļāļāļīāļĒāļĄāļāļĩāļāļāļģāļŠāļąāđāļāļŦāļāļķāđāļāļāļĩāđāļāļđāđāļāļđāđāļĨāļĢāļ°āļāļāļŦāļĢāļ·āļāļāļąāļāļāļąāļāļāļēāļāļ°āļāļīāļĒāļĄāļāļģāļĄāļēāđāļāđ āđāļāļ·āđāļāļāļāļēāļāļĄāļąāļāļāļ°āļāđāļ§āļĒāđāļŦāđāļāļēāļĢāđāļŠāļāļ
āļāđāļāļĄāļđāļĨāļāļāļāđāļāļĨāđāļāļĩāđāļĄāļĩāļāļāļēāļāđāļŦāļāđāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļĨāļ·āđāļāļāļŦāļāđāļēāļāļāļāļķāđāļāļĨāļāđāļāđāļŦāļĢāļ·āļāđāļĄāđāļāļĢāļ°āļāļąāđāļāļāđāļāļŦāļēāļāļģāđāļāđāļĨāļąāļāļĐāļāļ°āļāļĨāđāļēāļĒāļāļąāļ
āļāļēāļĢāđāļāđ text editor āđāļāļāļēāļĢāđāļĨāļ·āđāļāļāļŦāļāđāļēāļāļāļāļāļāļāļģāļŠāļąāđāļ less āļāļąāđāļāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāđāļāđāļāļąāđāļāļĨāļđāļāļĻāļĢāļāļķāđāļāļĨāļāļŦāļĢāļ·āļāļāļēāļĢāđāļāđāļāļļāđāļĄ
PageUp PageDown āđāļāļāļēāļĢāļāļ§āļāļāļļāļĄ āļŠāļģāļŦāļĢāļąāļāđāļāļāļēāļĢāļāđāļāļŦāļēāļāļąāđāļāļāļ°āļāđāļāļŦāļēāđāļāđāđāļāļĒāļāļēāļĢāļāļīāļĄāļāđāđāļāļĢāļ·āđāļāļāļŦāļĄāļēāļĒ /
āđāļĨāđāļ§āļāļēāļĄāļāđāļ§āļĒāļāđāļāļāļ§āļēāļĄāļāļĩāđāļāđāļāļāļāļēāļĢāļāđāļāļŦāļē āļāļģāļŠāļąāđāļ less āļāļ°āļāļģāļŦāļāđāļēāļāļĩāđāđāļŠāļāļāļāļģāļāļĩāđāļāļđāđāļāļđāđāļĨāļĢāļ°āļāļāļāđāļāļāļāļēāļĢāļāđāļāļŦāļēāļāļāļ
āļĄāļē āļāđāļēāļŦāļēāļāđāļāļāļĢāļāļĩāļāļĩāđāļāđāļāļāļāļēāļĢāļāđāļāļŦāļēāļāļģāļāļąāļāđāļ āļāļģāļŠāļąāđāļ less āđāļāđāđāļāļāļāđāļāļāđāļŦāđāļĄāļĩāļāļēāļĢāļāļāđāļāđāļāļāļīāļĄāļāđ n āđāļāļ·āđāļāđāļĨāļ·āđāļāļāđāļ
āļĒāļąāļāļāļģāļāļąāļāđāļ
āļāļāļāļāļēāļāļāļģāļŠāļąāđāļ less āļāļ°āļĄāļĩāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļāđāļāļŦāļēāđāļĨāđāļ§āļāļąāđāļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļāļāļāļģāļŠāļąāđāļ less āļĒāļąāļ
āļŠāļēāļĄāļēāļĢāļāđāļŠāļāļāļāđāļāļĄāļđāļĨāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļĩāđāļāļĢāļĢāļāļąāļāļŠāļļāļāļāđāļēāļĒāđāļāđ āđāļāļĒāļāļēāļĢāļāļāļāļļāđāļĄ F āđāļāđāļāļāļĢāļāļĩāļāļāļāđāļāļĨāđ log āļāļĩāđāļāļ°
āļĄāļĩāļāđāļāļĄāļđāļĨāđāļāđāļēāļĄāļēāļāļĨāļāļāđāļ§āļĨāļē less āļŠāļēāļĄāļēāļĢāļāđāļŠāļāļāļāđāļāļĄāļđāļĨāđāļŦāļĨāđāļēāļāļąāđāļāđāļāđāļāļąāļāļāļĩāđāļāļĒāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāđāļāļīāļāđāļāļĨāđāđāļŦāļĄāđ āđāļĄāđāđāļāļĨāđ
log āļāļ°āļāļđāļāļāļĩāļāļāļąāļāđāļāđāļ .gz āļāđāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāđāļāļīāļāđāļāđāļāđāļ§āļĒāļāļģāļŠāļąāđāļ less āđāļāđāļāļąāļāļāļĩ āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļāļāļąāļāđāļŠāļāļāļāđāļēāļāļĨāđāļēāļ
$ cat Departments.txt <---- āđāļāļīāļāđāļāļĨāđāļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§
1 Electrical
2 Computer
3 Telecommunication
$ cat >Universities.txt <---- āđāļāļīāļāđāļāļĨāđāđāļŦāļĄāđ āđāļĨāļ°āļāđāļāļāļāđāļāļĄāļđāļĨāļĨāļāđāļāļĨāđāļāļąāļāļāļĩ
Burapha University
Prince of Songkhla University
Thammasat University
āļāļ Ctrl+D <---- āļāļāļāļļāđāļĄ Ctrl+D āđāļāļ·āđāļāļŠāļīāđāļāļŠāļļāļāļāļēāļĢāđāļŠāđāļāđāļāļĄāļđāļĨ
$ cat Departments.txt Universities.txt > All.txt
$ cat All.txt
1 Electrical
2 Computer
3 Telecommunication
Burapha University
Prince of Songkhla University
Thammasat University
45
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
46. $ less /var/log/syslog
āļĢāļđāļāļāļĩāđ 1.10 āđāļŠāļāļāļāļĨāļĨāļąāļāļāđāļāļēāļĢāđāļāļīāļāđāļāļĨāđ /var/log/syslog āļāđāļ§āļĒāļāļģāļŠāļąāđāļ less
āļāļēāļāļāļģāļŠāļąāđāļāļāđāļēāļāļāđāļāļāļ°āđāļāđāļāļāļēāļĢāđāļāļīāļāđāļāļĨāđāļāļāļīāļāļāđāļāļāļ§āļēāļĄ (text ïŽle) āļāļąāđāļ§āđāļ āđāļĨāđāļ§āđāļŠāļāļāļāļĨāđāļāđāļāļāđāļāļāļ§āļēāļĄāļāļāļāļī
āđāļāđāđāļāļāļēāļāļāļĢāļāļĩāļāļĩāđāļāļąāļāļāļąāļāļāļēāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāđāļāļāļāļēāļĢāļĄāļāļāļāđāļāļāļ§āļēāļĄāļ āļēāļĒāđāļāđāļāļĨāđāđāļāļĨāļąāļāļĐāļāļ°āļāļ·āđāļ āđāļāđāļ āđāļāļĨāļ
āđāļāđāļāđāļĨāļāļāļēāļāđāļāļ āļāļēāļāļŠāļīāļ āļŦāļĢāļ·āļ āļāļēāļāļŠāļīāļāļŦāļ āļāļģāļŠāļąāđāļāļāļĩāđāļāļīāļĒāļĄāđāļāđāļāļąāļāļāļąāđāļ§āđāļāļāļ·āļ od (Octal Dump) āļāļķāđāļāļĄāļĩāļāļąāļ§āđāļĨāļ·āļāļ
-A āļāļĩāđāđāļ§āđāļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļļāļĢāļēāļāļāļĩāđāļāđāļāļāļāļēāļĢ (Radix) āđāļĨāļ° -t āļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļļāļĢāļđāļāđāļāļāļāļēāļĢāđāļŠāļāļāļ§āđāļēāļāļ°āđāļāđāļāđāļĨāļāļāļēāļāļāđāļēāļāđ
āđāļāđāļ āđāļĨāļāļāļēāļāđāļāļ āđāļĨāļāļāļēāļāļŠāļīāļ āđāļĨāļāļāļēāļāļŠāļīāļāļŦāļ āļŦāļĢāļ·āļ āļĢāļŦāļąāļŠāđāļāļŠāļāļĩāđ āļāđāļ§āļĒ āļāđāļē o, d, x, c āļāļēāļĄāļĨāļģāļāļąāļ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
āļāđāļēāļāļĨāđāļēāļ
$ od Departments.txt
0000000 020061 066105 061545 071164 061551 066141 031012 041440
0000020 066557 072560 062564 005162 020063 062524 062554 067543
0000040 066555 067165 061551 072141 067551 005156
0000054
$ od -t x Departments.txt
0000000 6c452031 72746365 6c616369 4320320a
0000020 75706d6f 0a726574 65542033 6f63656c
0000040 6e756d6d 74616369 0a6e6f69
0000054
$ od -A d -t c Departments.txt
0000000 1 E l e c t r i c a l n 2 C
0000016 o m p u t e r n 3 T e l e c o
0000032 m m u n i c a t i o n n
0000044
46
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
56. Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down
Sep 11 21:47:04 EE-Burapha kernel: [ 3227.275574] e1000: eth0 NIC Link is Up 1000
Mbps Full Duplex, Flow Control: None
...
$ grep "Link is Down$" messages.1
Sep 11 21:44:29 EE-Burapha kernel: [ 3077.192891] e1000: eth0 NIC Link is Down
Sep 11 21:46:58 EE-Burapha kernel: [ 3222.009399] e1000: eth0 NIC Link is Down
Sep 11 21:47:07 EE-Burapha kernel: [ 3230.682704] e1000: eth0 NIC Link is Down
Sep 11 21:53:34 EE-Burapha kernel: [ 3310.165309] e1000: eth0 NIC Link is Down
Sep 11 21:54:02 EE-Burapha kernel: [ 3338.102673] e1000: eth0 NIC Link is Down
...
āļāļēāļĢāļāđāļāļŦāļēāļāļģāļāļĩāđāļĄāļĩāļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐāļāļĒāļđāđāļāđāļ§āļĒāļāļąāđāļ āļāļ°āļāđāļāļāđāļāđāļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢ āļāļģāļŦāļāđāļēāļāļąāļ§āļāļąāļāļāļĢāļ°āļāļīāđāļĻāļĐāđāļŠāļĄāļ āļāļąāļ
āļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
$ grep "255.255.255.255" syslog.1
Sep 18 11:36:12 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 3
Sep 18 11:36:13 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
Sep 18 19:54:11 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 3
Sep 18 19:54:12 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
Sep 20 04:50:05 EE-Burapha dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67
interval 5
Sep 20 04:50:06 EE-Burapha dhclient: DHCPREQUEST of 172.16.56.134 on eth0 to
255.255.255.255 port 67
āļāļēāļĢāļēāļ 1.10 āļāļąāļ§āļāļģāđāļāļīāļāļāļēāļĢāđāļāļīāđāļĄāđāļāļīāļĄāļŠāļģāļŦāļĢāļąāļāļāļģāļŠāļąāđāļ grep
OPERATOR DESCRIPTION
[:digit:] āđāļāļāļēāļ°āļāļąāļ§āđāļĨāļāļāļąāđāļāđāļāđ 0 āļāļķāļ 9
[:alnum:] āļāļąāđāļāļāļąāļ§āļāļąāļāļĐāļĢ A āļāļķāļ Z āļŦāļĢāļ·āļ a āļāļķāļ z āđāļĨāļ°āļāļąāļ§āđāļĨāļāļāļąāđāļāđāļāđ 0 āļāļķāļ 9
[:alpha:] āļāļąāļ§āļāļąāļāļĐāļĢ A āļāļķāļ Z āļŦāļĢāļ·āļ a āļāļķāļ z
[:blank:] āđāļāļāļēāļ°āļāđāļāļāļ§āđāļēāļ (Space) āđāļĨāļ°āđāļāđāļ (TAB) āđāļāđāļēāļāļąāđāļ
āļāļēāļāļāļēāļĢāļēāļāļāđāļēāļāļāđāļ āđāļāđāļāļāļēāļĢāļĢāļ°āļāļļāļāļąāļ§āļāļąāļāļāļĢāļ°āđāļāđāļāđāļĨāļ°āļāļĢāļ°āđāļ āļāđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļāđāļāļŦāļēāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāļĄāļēāļāļāļķāđāļ āļāļąāļ
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļāļāļąāļāļāļĩāđ
$ grep "anacron[[[:digit:]]+]" /var/log/syslog.1
Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.daily' terminated
Sep 18 08:50:17 EE-Burapha anacron[27155]: Job `cron.weekly' started
Sep 18 08:50:17 EE-Burapha anacron[27530]: Updated timestamp for job
`cron.weekly' to 2013-09-18
Sep 18 08:50:18 EE-Burapha anacron[27155]: Job `cron.weekly' terminated
...
56
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
75. āļ§āļīāļāļĩāļāļēāļĢāļāļąāđāļāļāđāļēāļĄāļĩāļāļĒāļđāđāļŦāļĨāļēāļĒāđāļāļāđāļāđāļāđāļāđāļāļģāļŠāļąāđāļ make conïŽg, make menuconïŽg, make xconïŽg āđāļĨāļ°
make oldconïŽg āļāļķāđāļāđāļāđāļĨāļ°āļāļģāļŠāļąāđāļāļĄāļĩāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļĩāđāđāļāļāļāđāļēāļāļāļąāļāđāļāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļāļāđāļ
āđāļāļāļĩāđ
âĒ make config āļāļ·āļāļāļģāļŠāļąāđāļāļāļ·āđāļāļāļēāļ āļāļĩāđāļĢāļāļāļĢāļąāļāļĢāļļāđāļāđāļāļāļĢāđāđāļāļĨāđāļāđāļāļąāđāļāđāļāđāļĨāļĩāļāļļāļāļāđāļĢāļļāđāļāđāļĢāļāđ āļāļĩāđāđāļāđāđāļāļāļēāļĢāđāļĨāļ·āļāļāļāļēāļĢ
āļāļąāđāļāļāđāļē option āļāđāļēāļāđ āđāļāļĒāļāļđāđāđāļāđāļāļ°āļāđāļāļāļāļāļāļāļģāļāļēāļĄāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāđāļēāļāđāļāļĨāļąāļāļĐāļāļ° (y/n)
âĒ make menuconfig āļāļģāļŠāļąāđāļāļāļĩāđāđāļĢāļīāđāļĄāļĄāļĩāđāļŦāđāđāļāđāļāļąāđāļāđāļāđāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļĢāļļāđāļ 1.3 āđāļĨāļ°āļĢāļļāđāļ 2.0 āđāļāđāļāļāđāļāđāļ āļāļķāđāļ
āđāļāđāļāļāļģāļŠāļąāđāļāļāļĩāđāļāļīāļĒāļĄ āđāļāļ·āđāļāļāļāļēāļāđāļāđāļāļēāļāļāđāļēāļĒ āļĄāļĩāļāļēāļĢāđāļŠāļāļāļāļĨāļāļĨāđāļēāļĒāļŦāļāđāļēāļāđāļēāļāđāļāļĢāļđāļāđāļāļ Text mode āđāļĨāļ°āļĄāļĩ
āļāļēāļĢāļāļąāļāļāļĨāļļāđāļĄāļāļēāļĢāļāļąāđāļāļāđāļēāļāļāļāđāļāđāļāļāļĢāļ°āđāļ āļāđ
75
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
76. âĒ make xconfig āļāļģāļŠāļąāđāļāļāļĩāđāđāļĢāļīāđāļĄāļĄāļĩāđāļŦāđāđāļāđāļāļąāđāļāđāļāđāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļĢāļļāđāļ 1.3 āđāļĨāļ°āļĢāļļāđāļ 2.0 āđāļāđāļāļāđāļāđāļāđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļ
āļāļģāļŠāļąāđāļ make menuconïŽg āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāđāļāđāļāđāļēāļĒāđāļāļ·āđāļāļāļāļēāļāļĄāļĩāļāļēāļĢāđāļŠāļāļāļāļĨāđāļĄāļāļđāđāļāļĢāļđāļāđāļāļ Graphic
mode āļāļ x-window āđāļāđāļāļ°āļāđāļāļāļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāđāļĨāļāļĢāļēāļĢāļĩāļāļāļ qt āđāļāļīāđāļĄāđāļāļīāļĄāđāļāđāļēāđāļāđāļāļĢāļ°āļāļāđāļŠāļĩāļĒāļāđāļāļ
âĒ make oldconfig āļāļģāļŠāļąāđāļāļāļĩāđāļāļ°āļāđāļēāļāļāļīāļāļāļēāļāđāļāļĨāđ .conïŽg āļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§ āļŦāļĢāļ·āļāļāļģāļĄāļēāļāļēāļāđāļāļĨāđāļāļĩāđāļāļąāļāļāļķāļāļāļēāļĢ
āļāļąāđāļāļāđāļē default āļāļāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāļāļĩāđāļāđāļāļāļāļēāļĢāđāļāđāļ āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ ARM āļāļĩāđāļĄāļĩāđāļŦāđāđāļĨāļ·āļāļ System-on-
Chip (SoC) āļāļēāļāļŦāļĨāļēāļĒāđāļāđāļēāļĒāļāļĩāđāļāļđāļāļāļĢāļĢāļāļļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ <linux>/arch/x86/configs/
āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāđāļāļāļāļēāļĢāđāļāđāļāļąāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ x86 āļĢāļļāđāļ i386 āļāļāļāļāļĢāļīāļĐāļąāļ Intel āļāđāļāļ°āđāļāđāļāļģāļŠāļąāđāļ make
i386_defconfig
āļŠāļēāļĄāļēāļĢāļāļāđāļāļŦāļēāđāļāļĨāđ defconïŽg āļāļĩāđāļĨāļĩāļāļļāļāļāđāđāļāđāđāļāļĢāļĩāļĒāļĄāđāļ§āđāđāļŦāđāđāļāļ·āđāļāđāļāđāđāļāđāļāđāļāļĨāđ .conïŽg āļāđāļāđāļāļāļŠāļģāļŦāļĢāļąāļāđāļāđāļĨāļ°
āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ āļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
# find ./arch -name "*_defconfig" -type f
./arch/x86/configs/x86_64_defconfig
./arch/x86/configs/i386_defconfig
./arch/x86/configs/goldfish_defconfig
./arch/xtensa/configs/iss_defconfig
./arch/xtensa/configs/s6105_defconfig
./arch/xtensa/configs/common_defconfig
./arch/cris/configs/etrax-100lx_defconfig
...
# cd linux-3.9.3
# make menuconfig
āđāļĄāļ·āđāļāđāļāđāļāļąāđāļāļāđāļēāļāđāļēāļāđāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§āļāļ°āđāļāđāđāļāļĨāđāļāļ·āđāļ â.conïŽgâ āļāļāļāļĄāļēāļāļķāđāļāļāļĢāļĢāļāļļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļ§āđāļē
āļāļ°āļĄāļĩāļāļēāļĢāđāļāđāļŦāļĢāļ·āļāđāļĄāđāđāļāđāļāļąāļāļāđāļāļąāļāđāļāļāđāļēāļ āđāļāļ·āđāļāđāļŦāđāđāļāđāļēāļāļąāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāļāļąāđāļāđ
76
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
77. Â
Â
Â
Â
Â
Â
Â
Â
Â
Â
āļāļąāđāļāļāļāļāļāļĩāđ 3 - āļāļēāļĢāļāļāļĄāđāļāļĨāđ Linux Kernel
āđāļāļāļąāļāļāļļāļāļąāļāļāļĩāđāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļŠāđāļ§āļāđāļŦāļāđāļāļ°āđāļāđāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļ (CPU) āđāļāļāļŦāļĨāļēāļĒāđāļāļ āļāļĩāđāļāļīāļĒāļĄ
āđāļĢāļĩāļĒāļāļāļąāļāļ§āđāļē Multi-core CPU āļāļąāļāļāļąāđāļāđāļāļ·āđāļāđāļŦāđāļāļēāļĢāļāļāļĄāđāļāļĨāđāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāđāļāđāļāđāļāđāļāđāļāļĒāđāļēāļāļĄāļĩāļāļĢāļ°āļŠāļīāļāļāļīāļ āļēāļāđāļĨāļ°
āđāļāđāđāļ§āļĨāļēāļāļĩāđāđāļŦāļĄāļēāļ°āļŠāļĄāļāļēāļĄāļāļĢāļąāļāļĒāļēāļāļĢāļāļāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ āļāļđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāđāļāļīāđāļĄāļāļąāļ§āđāļĨāļ·āļāļ -j āļāļēāļĄāļāđāļ§āļĒāļāļģāļāļ§āļāđāļāļ
āļāļđāļāļŠāļāļ (cores x 2) āđāļāđāļ make -j8 āđāļāļĒāļāļĩāđāļāļąāļ§āđāļĨāļ 8 āļŦāļĄāļēāļĒāļāļķāļāļāļģāļāļ§āļāđāļāļāļāļāļāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļ
āļāļĩāđāļāļĒāļđāđāđāļāđāļāļĢāļ·āđāļāļāļāļąāđāļ (4-core) āļāļđāļāļŠāļāļ āļāļķāđāļāļĄāļĩ 3 āļāļąāđāļāļāļāļāļĒāđāļāļĒāļāļąāļāļāļĩāđ
# make -j8
āđāļāđāļāļāļēāļĢāļŠāļĢāđāļēāļ Kernel Image āđāļāļēāđāļ§āđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļđāļāđāļāđāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļķāđāļāļāļ°āđāļāđāđāļāļĨāđāļĄāļēāđāļāđāļ bzImage
(āļŠāļģāļŦāļĢāļąāļ x86) āļŦāļĢāļ·āļ zImage (āļŠāļģāļŦāļĢāļąāļ ARM) āļāļķāđāļāļāļ°āđāļāđāļāļāļĒāļđāđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ arch/<āļāļ·āđāļāļŠāļāļēāļāļąāļāļāļĢāļĢāļĄ>/
boot/*Image
# make modules
77
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
78. āļāļ·āļāļāļēāļĢāļŠāļĢāđāļēāļ Kernel modules āļāļĩāđāļāđāļāļāļāļēāļĢāļāļ°āđāļŦāļĨāļ device drivers āļāđāļēāļāđ āđāļĨāļ°āđāļĄāļāļđāļĨāļŠāļģāļāļąāļāļāļāļāļĢāļ°āļāļ
āļāđāļēāļāđ āļāļķāđāļāļāļ°āļĄāļĩāļāļēāļĄāļŠāļāļļāļĨāđāļāļĨāđāđāļāđāļ .ko
# make modules_install
āđāļāđāļāļāļģāļŠāļąāđāļāđāļāļāļēāļĢāļāļīāļāļāļąāđāļ Kernel modules āļāļĩāđāļāļđāļāļāļāļĄāđāļāļĨāđāļāļāļāļĄāļē (.ko) āđāļāļ·āđāļāđāļāđāļāđāļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ
/lib/modules/3.9.3/
āļāļąāđāļāļāļāļāļāļĩāđ 4 - āļāļēāļĢāļāļīāļāļāļąāđāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļāļąāļ§āđāļŦāļĄāđ
āļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđāļāļ°āđāļāđāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāļāļĩāđāļāļ°āđāļāđāđāļāļāļēāļĢāļāļđāļāđāļāļĢāļ·āđāļāļāđāļāļ·āđāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļĩāđāđāļāđāļĨāļĩ
āļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļĢāļļāđāļāđāļŦāļĄāđāļāļĩāđāđāļāđāļĄāļēāļāļēāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāļāđāļāļāļŦāļāđāļēāļāļĩāđ āļāļķāđāļāđāļāļĨāđāđāļŦāļĨāđāļēāļāļĩāđāļāļ°āļāļđāļāđāļāđāļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ /boot
āļŦāļĨāļąāļāļāļēāļāđāļāđāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļ
# make install
āļĢāļēāļĒāļāļ·āđāļāđāļāļĨāđāļāđāļēāļāđāļāļĩāđāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļāļ āļēāļĒāđāļāđāļāđāļĢāļāļāļāļĢāļĩ
/boot āļĄāļĩāļāļąāļāļāļĩāđ
arch/arm/kernel/head.o
arch/arm/kernel/init-atask.o
init
usr/built-in.o
arch/arm/kernel
arch/arm/mm
arch/arm/common
arch/arm/mach-ixp4xx
arch/arm/nwfpe
kernel
mm
fs
ipc
security
lib/lib.a
arch/arm/lib
lib
drivers
net
vmlinux
78
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
âĒ vmlinuz-3.9.3 (actual kernel)
âĒ System.map-3.9.3 (symbols exported
by the kernel)
âĒ initrd.img-3.9.3 (initrd image is
temporary RFS used during boot
process)
âĒ config-3.9.3 (kernel configuration
file)
âĒ vmlinuz-3.9.3 (actual kernel)
āļĢāļđāļāļāļĩāđ 2.9 āļĢāļđāļāđāļŠāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļ āļēāļĒāđāļāđāļāļĨāđ vmlinux
79. āļāļēāļĢāļēāļ 2.2 āđāļŠāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļāļĨāđāđāļāļāļēāļĢāļĩāļ āļēāļĒāđāļāđāļāļĨāđ vmlinux
COMPONENT DESCRIPTION
arch/arm/kernel/head.o Kernel architecture-specific startup code.
init_task.o Initial thread and task structs required by
kernel.
init/built-in.o Main kernel-initialization code.
usr/built-in.o Built-in initramfs image.
arch/arm/kernel/built-in.o Architecture-specific kernel code.
arch/arm/mm/built-in.o Architecture-specific memory-management
code.
arch/arm/common/built-in.o Architecture-specific generic code. Varies by
architecture.
arch/arm/mach-ixp4xx/built-
in.o
Machine-specific code, usually initialization.
arch/arm/nwfpe/built-in.o Architecture-specific floating point-
emulation code.
kernel/built-in.o Common components of the kernel itself.
mm/built-in.o Common components of memory-
management code.
ipc/built-in.o Interprocess communications, such as SysV
IPC.
security/built-in.o Linux security components.
lib/lib.a Archive of miscellaneous helper functions.
arch/arm/lib/lib.a Architecture-specific common facilities. Var-
ies by architecture.
lib/built-in.o Common kernel helper functions.
drivers/built-in.o All the built-in drivers not loadable modules.
sound/built-in.o Sound drivers.
net/built-in.o Linux networking.
.tmp_kallsyms2.o Symbol table.
79
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
89. linux-headers-2.6.32-42-server - Linux kernel headers for version 2.6.32 on
x86_64
āđāļĨāđāļ§āļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāļąāļāļāļĩāđ
$ sudo apt-get install linux-headers-$(uname -r) linux-source-2.6.37
$ cd /usr/src/
$ ls
linux-headers-2.6.32-42-server.tar.bz2 linux-source-2.6.32.tar.bz2
$ tar -xjvf linux-headers-2.6.32-42-server.tar.bz2 linux-
source-2.6.32.tar.bz2
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļĢāļĄ Kernel Module âHello worldâ
āđāļĢāļīāđāļĄāļāđāļāļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄ kernel module āļāļĒāđāļēāļāļāđāļēāļĒ āđāļāļĒāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāļāļ·āđāļ hello-driver.c āđāļĨāđāļ§
āđāļāđāļāļĨāļāđāļāđāļāđāļĢāļāļāļāļĢāļĩ ~/kernel_module/
$ mkdir ~/kernel_module
$ vim hello-driver.c
/*
* hello-driver.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
static int __init module_start(void)
{
printk(KERN_INFO "Hello world ! module is loadedn");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
static void __exit module_unload(void)
{
printk(KERN_INFO "Goodbye world ! module is removedn");
}
module_init(module_start);
module_exit(module_unload);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE - Burapha University"); /* Who wrote this module? */
MODULE_DESCRIPTION("hello world test driver"); /* What does this module do */
89
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
90. āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđ MakeïŽle āļŠāļģāļŦāļĢāļąāļāđāļāđāļāļģāļŦāļāļāļāđāļēāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļŦāđāļāļąāļāđāļāļĢāđāļāļĢāļĄ hello-driver.c
$ vim Makefile
obj-Ââm
Â
 =
 hello-Ââdriver.o
all:
Â
 make
 -ÂâC
 /lib/modules/$(shell
 uname
 -Ââr)/build
 M=$(PWD)
 modules
Â
clean:
Â
 make
 -ÂâC
 /lib/modules/$(shell
 uname
 -Ââr)/build
 M=$(PWD)
 clean
āđāļāđāļāļģāļŠāļąāđāļ make āđāļāļāļēāļāļ°āļŠāļīāļāļāļīāđ root āđāļāļ·āđāļāļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļĄāļāļđāļĨ
$sudo su
# make
make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module
modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server'
CC [M] /home/student/kernel_module/hello-driver.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/student/kernel_module/hello-driver.mod.o
LD [M] /home/student/kernel_module/hello-driver.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server'
# ls
hello-driver.c hello-driver.mod.c hello-driver.o modules.order
hello-driver.ko hello-driver.mod.o Makefile Module.symvers
āļāļāļŠāļāļāđāļŦāļĨāļāļāļąāļ§āđāļĄāļāļđāļĨāļāđāļ§āļĒāļāļģāļŠāļąāđāļ insmod āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāļāļĨāļĨāļąāļāļāđāļāļēāļĢāļāļģāļāļēāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļ dmesg
(debug kernel message) āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
# insmod hello-driver.ko
# dmesg | tail -n1
[68587.257467] Hello world ! module is loaded
āļāļāļāđāļĄāļāļđāļĨāļāļāļāļāļēāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļāđāļ§āļĒāļāļģāļŠāļąāđāļ rrmod
# rmmod hello-driver.ko
# dmesg | tail -n1
[68621.602044] Goodbye world ! module is removed
90
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
91. āđāļāļĢāļāļŠāļĢāđāļēāļāļ āļēāļāļĢāļ§āļĄāļāļāļ Linux kernel module
āļāļēāļāļĢāļđāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļĨāđāļāđāļēāļāļĨāđāļēāļāđāļāđāļāđāļāđāđāļāđāļ 5 āļŠāđāļ§āļ āđāļāļĒāļŠāđāļ§āļāļāļĩāđāđāļāđāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄāļŦāļĨāļąāļāļāļ°āļāļĒāļđāđāđāļāļāļąāļāļāđāļāļąāđāļ
init āđāļĨāļ° exit āđāļĨāļ°āļāļ°āļāļģāļāļēāļāļāđāļāđāļāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļŦāļĨāļāļŦāļĢāļ·āļāļāļāļ LKM āļ āļēāļĒāđāļāļĨāļĩāļāļļāļāļāđāđāļāļāļĢāđāđāļāļĨ
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE - Burapha University");
MODULE_DESCRIPTION("hello world test driver");
void my_procedure(void)
{
printk(KERN_INFO "Here is procedure...n");
}
static int __init module_start(void)
{
printk(KERN_INFO "Hello world ! module is loadedn");
my_procedure();
return 0;
}
static void __exit module_unload(void)
{
printk(KERN_INFO "Goodbye world ! module is removedn");
}
module_init(module_start);
module_exit(module_unload);
Module
macros
Module
Constructor/
Destructor
Exit
macros
C
Headers
Procedure
module
āļĢāļđāļāļāļĩāđ 2.14 āđāļāļĢāļāļŠāļĢāđāļēāļāđāļāļāđāļāđāļĄāļāļāļ Linux Kernel Module
āļāļēāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāđāļēāļāļāđāļāļŠāđāļ§āļāļāļāļŠāļļāļāļāļ·āļāļŠāđāļ§āļāđāļĢāļĩāļĒāļāđāļāđāđāļĨāļāļĢāļēāļĢāļĩ (C Headers) āđāļāļĒāļāļ°āļāđāļēāļāļāļīāļāđāļĨāļāļĢāļēāļĢāļĩāļŦāļĨāļąāļāđāļāļĒāđāļēāļ
āļāđāļāļĒāļŠāļāļāļāļąāļ§āļāļ·āļ linux/module.h
 āđāļĨāļ° linux/kernel.h
 āļŠāđāļ§āļāļāļąāļāļĄāļēāļāļ·āļāđāļāļĢāđāļāļĢāļĄāļĒāđāļāļĒ
(Procedure Program) āļāļķāđāļāđāļāđāļāļŠāđāļ§āļāļāļąāļāļāđāļāļąāļāļĒāđāļāļĒāļāļĩāđāļāļ°āļāļđāļāđāļĢāļĩāļĒāļāļāļēāļāđāļāļĢāđāļāļĢāļĄāļŦāļĨāļąāļ āđāļĨāļ°āļŠāđāļ§āļāļŠāļļāļāļāđāļēāļĒāļāļ·āļāļŠāđāļ§āļ
āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļĄāļāļđāļĨ (modules description) āļāļĩāđāđāļāđāļāļāļīāļāļēāļĒāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļĄāļāļđāļĨāļāļĩāđāļāļāļāđāļāļāļāļķāđāļāļāļ°āļāļđāļ
āđāļŠāļāļāļāļāļāļĄāļēāđāļĄāļ·āđāļāļĄāļĩāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļģāļŠāļąāđāļ modinfo āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EE
 -Ââ
 Burapha
 University");
Â
Â
 /*
 Who
 wrote
 this
 module?
 */
MODULE_DESCRIPTION("hello
 world
 test
 driver");
 /*
 What
 does
 this
 module
 do
 */
$ modinfo hello-driver.ko
filename: hello-driver.ko
description: hello world test driver
author: EE - Burapha University
license: GPL
srcversion: E36F5E4D3F232F0A1C18AEF
depends:
vermagic: 2.6.32-42-server SMP mod_unload modversions
91
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
92. āļāļ·āđāļāļāļēāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāđāļ§āļāļĢāđāļŠāļģāļŦāļĢāļąāļ CHARACTER DEVICE
āļāļ·āđāļāļāļēāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāđāļ§āļāļĢāđāļāļ°āđāļāļĩāđāļĒāļ§āļāļąāļāđāļāļĨāđāļ āļēāļĒāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļēāļĄāļāļļāļāļĨāļąāļāļĐāļāļ°
āđāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāļāļāļāļŪāļēāļĢāđāļāđāļ§āļĢāđāļāļąāđāļāđ āļāļķāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāđāļāđāļāļĨāđāļāļāļīāļāļāļĩāđāđāļāđāļāļāļļāļāļāļĢāļāđ (device) āļāļāļ
āđāļāđāļ 2 āļāļĢāļ°āđāļ āļ āđāļāđāđāļāđ
1. Character device āļāļķāđāļāđāļāđāļāļāļēāļĢāļŠāđāļāļāđāđāļāļĄāļļāļđāļĨāđāļāļāļŠāļāļĢāļĩāļĄ (stream) āļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāđāļāđāļāļĩāļĨāļ°āđāļāļĩāļĒāļ 1 āđāļāļĢ
āđāļāļŠāđāļŠāļĄāļ·āļāļāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāđāļ§āļāļĢāđāļāļāļāļīāļāļąāđāļ§āđāļ
2. Block device āđāļāđāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāđāđāļāļāļāļąāļāļ (block) āđāļāđāļāļĢāļāļĩāļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļāļāđāļāļāļāļēāļĢ
āđāļāļĨāļ·āđāļāļāļĒāđāļēāļĒāļāđāļāļĄāļđāļĨāļāļāļēāļāđāļŦāļāđāļĢāļ°āļŦāļ§āđāļēāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļŦāļĢāļ·āļāļĢāļ°āļŦāļ§āđāļēāļāļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨ āđāļāđāļ āļŪāļēāļĢāđāļāļāļīāļŠ āđāļāđāļāļāđāļ
Application
Virtual Filesystem
Hardware
Device Driver
User-space
Kernel-space
/dev/ttyUSB0
Device ïŽle
major:116
minor:7
major:116
minor:7
...
...
Read/Write
āļĢāļđāļāļāļĩāđ 2.15 āđāļŠāļāļāļāļēāļĢāļāđāļēāļāļāļīāļāļāđāļē major āđāļĨāļ° minor
āļāļēāļāļĢāļđāļāļāđāļēāļāļāļāđāļāđāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļāđāļāļāļāļēāļĢāđāļāđāļēāļāļķāļāđāļāļĨāđ /dev/ttyUSB0 āļāļĩāđāļāļđāļāđāļāļ·āđāļāļĄāļāđāļāļāļĒāļđāđ
āļāļąāļāļāļāļĢāđāļ USB āļāļĩāđāļĄāļĩāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļĢāļđāļāđāļāļāļāļāļļāļāļĢāļĄ āļāļķāđāļāļāļ°āļŠāļąāļāđāļāļāļ§āđāļēāļāļąāļ§āđāļāļĢāđāļāļĢāļĄāļāļ°āļāđāļāļāļāļģāļāļēāļĢāļāđāļēāļāļāļīāļ
āļŦāļĄāļēāļĒāđāļĨāļ (major āđāļĨāļ° minor) āđāļāļ·āđāļāļĢāļ°āļāļļāļāļĢāļ°āđāļ āļāļŪāļēāļĢāđāļāđāļ§āļĢāđāļŦāļĨāļąāļāđāļĨāļ°āļāļąāļ§āļĒāđāļāļĒāļĨāļāđāļāļāļĩāđāđāļāļĢāđāļāļĢāļĄāļāđāļāļāļāļēāļĢāļāļ°
āļāļīāļāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāļāđāļāļĄāļđāļĨāļāđāļ§āļĒ
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄ chardev.c āļāļ°āđāļŠāļāļāļāļģāļāļ§āļāļāļĢāļąāđāļāļāļĩāđāļĄāļĩāļāļēāļĢāļāđāļēāļāļāđāļāļĄāļđāļĨāļāļēāļāđāļāļĨāđ device āļāļ·āđāļ /dev/
chardev āļāļĩāđāļāļđāļāļŠāļĢāđāļēāļāļāļķāđāļāļĄāļē
/*
* chardev.c: Creates a read-only char device that says how many times
* you've read from the dev file
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* for put_user */
92
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
93. /*
* Prototypes - this would normally go in a .h file
*/
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
#define SUCCESS 0
#define DEVICE_NAME "chardev" /* Dev name as it appears in /proc/devices */
#define BUF_LEN 80 /* Max length of the message from the device */
/*
* Global variables are declared as static, so are global within the file.
*/
static int Major; /* Major number assigned to our device driver */
static int Device_Open = 0; /* Is device open?
* Used to prevent multiple access to device */
static char msg[BUF_LEN]; /* The msg the device will give when asked */
static char *msg_Ptr;
static char msg_data[BUF_LEN] ="NONE n" ; /*initial msg for write mode */
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
/*
* This function is called when the module is loaded
*/
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk(KERN_ALERT "Registering char device failed with %dn", Major);
return Major;
}
printk(KERN_INFO "I was assigned major number %d. To talk ton", Major);
printk(KERN_INFO "the driver, create a dev file withn");
printk(KERN_INFO "'mknod /dev/%s c %d 0'.n", DEVICE_NAME, Major);
printk(KERN_INFO "Try various minor numbers. Try to cat and echo ton");
printk(KERN_INFO "the device file.n");
printk(KERN_INFO "Remove the device file and module when done.n");
return SUCCESS;
93
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
94. }
/*
* This function is called when the module is unloaded
*/
void cleanup_module(void)
{
/*
* Unregister the device
*/
unregister_chrdev(Major, DEVICE_NAME);
printk(KERN_ALERT "Error in unregister_chrdev:n");
}
/*
* Methods
*/
/*
* Called when a process tries to open the device file, like
* "cat /dev/mycharfile"
*/
static int device_open(struct inode *inode, struct file *file)
{
static int counter = 0;
if (Device_Open)
return -EBUSY;
Device_Open++;
sprintf(msg, "I already told you %d times . Data in device is %s n", coun-
ter++,msg_data);
msg_Ptr = msg;
try_module_get(THIS_MODULE);
return SUCCESS;
}
/*
* Called when a process closes the device file.
*/
static int device_release(struct inode *inode, struct file *file)
{
Device_Open--; /* We're now ready for our next caller */
/*
* Decrement the usage count, or else once you opened the file, you'll
* never get get rid of the module.
*/
module_put(THIS_MODULE);
return 0;
}
94
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
95. /*
* Called when a process, which already opened the dev file, attempts to
* read from it.
*/
static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */
char *buffer, /* buffer to fill with data */
size_t length, /* length of the buffer */
loff_t * offset)
{
/*
* Number of bytes actually written to the buffer
*/
int bytes_read = 0;
/*
* If we're at the end of the message,
* return 0 signifying end of file
*/
if (*msg_Ptr == 0)
return 0;
/*
* Actually put the data into the buffer
*/
while (length && *msg_Ptr) {
/*
* The buffer is in the user data segment, not the kernel
* segment so "*" assignment won't work. We have to use
* put_user which copies data from the kernel data segment to
* the user data segment.
*/
put_user(*(msg_Ptr++), buffer++);
length--;
bytes_read++;
}
/*
* Most read functions return the number of bytes put into the buffer
*/
return bytes_read;
}
/*
* Called when a process writes to dev file: echo "hi" > /dev/hello
*/
static ssize_t device_write(struct file *filp, const char *buff, size_t length,
loff_t * off){
int bytes_write ;
for (bytes_write = 0; bytes_write < length && bytes_write < BUF_LEN;
bytes_write++){
get_user(msg_data[bytes_write], buff + bytes_write);
}
95
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
96. return bytes_write ;
}
āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđ MakeïŽle āļŠāļģāļŦāļĢāļąāļāļāđāļ§āļĒāđāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄ chardev.c
# cat Makefile
obj-m = chardev.o
all:
! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
! make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
āļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāđāļŦāđāđāļāđāđāļāļĨāđ chardev.ko āļāļāļāļĄāļēāļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
# make
make -C /lib/modules/2.6.32-42-server/build M=/home/student/kernel_module
modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-42-server'
CC [M] /home/student/kernel_module/chardev.o
Building modules, stage 2.
MODPOST 1 modules
CC /home/student/kernel_module/chardev.mod.o
LD [M] /home/student/kernel_module/chardev.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-42-server'
# ls
chardev.c chardev.mod.o hello-driver.ko hello-driver.o
modules.order
chardev.ko chardev.o hello-driver.mod.c Makefile
Module.symvers
chardev.mod.c hello-driver.c hello-driver.mod.o Makefile_hello
āļŠāļļāļāļāđāļēāļĒāļāļģāļāļēāļĢāļāļāļŠāļāļāđāļŦāļĨāļāđāļĄāļāļđāļĨāđāļāđāļēāļŠāļđāđāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļāđāļ§āļĒāļāļģāļŠāļąāđāļ insmod āđāļĨāļ°āļāļĢāļ§āļāļŠāļāļāļāļĨāļĨāļąāļāļāđāļāđāļ§āļĒāļāļģāļŠāļąāđāļ
dmesg āļāļąāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
# insmod chardev.ko
# dmesg| tail -n6
[70707.121856] I was assigned major number 250. To talk to
[70707.121858] the driver, create a dev file with
[70707.121860] 'mknod /dev/chardev c 250 0'.
[70707.121861] Try various minor numbers. Try to cat and echo to
[70707.121862] the device file.
[70707.121863] Remove the device file and module when done.
96
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
97. āļāļģāļāļēāļĢāļāļāļŠāļāļāļāļīāļāļāđāļāđāļāļĢāđāđāļ§āļāļĢāļāļąāļ§āļāļĩāđāļāļĩāļāļāļĢāļąāđāļ āđāļāļĒāđāļĢāļīāđāļĄāļāđāļāđāļŦāđāļŠāļĢāđāļēāļāđāļāļĨāđāđāļāļāđāļāļĨāđāđāļāļīāļĄ (/dev/chardev)
āđāļāļ·āđāļāļāļāļēāļāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāđāļ§āļāļĢāđ chardev.ko āđāļāđāļŠāļĢāđāļēāļāđāļĨāļ°āļĨāļāļāļāļāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ āļāđāļ§āļĒāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāļāļļāļāļāļĢāļāđ
āļāļąāļ§āđāļŦāļĄāđāļāļ·āđāļ /dev/my_chardev āđāļāđāļĒāļąāļāļāļāđāļŦāđāđāļāđāļŦāļĄāļēāļĒāđāļĨāļ major āđāļĨāļ° minor āđāļāļīāļĄ (major:250 āđāļĨāļ°
minor:0) āļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļ
# mknod /dev/my_chardev c 250 0
# ls -al /dev/my_chardev
crw-r--r-- 1 root root 250, 0 2013-09-23 22:22 /dev/my_chardev
āđāļāđāļāļģāļŠāļąāđāļ cat āđāļāļ·āđāļāđāļŠāļāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāđāļĄāļēāļāļēāļ /dev/my_chardev
# cat /dev/my_chardev
I already told you 0 times . Data in device is NONE
āļāļēāļāļāļĨāļĨāļąāļāļāđāļāļ°āļŠāļąāļāđāļāļāđāļŦāđāļāļ§āđāļēāļĒāļąāļāđāļĄāđāļĄāļĩāļāđāļāļĄāļđāļĨāļāļĒāļđāđāđāļ device āđāļĨāļĒ āļāļąāļāļāļąāđāļāđāļŦāđāļĨāļāļāļāļāļŠāļāļāļŠāđāļāļāđāļāļāļ§āļēāļĄāđāļāļĒāļąāļāđāļāļĨāđ /
dev/my_chardev āļāđāļ§āļĒāļāļģāļŠāļąāđāļ echo āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
# echo "Hi...My device" > /dev/my_chardev
# cat /dev/my_chardev
I already told you 2 times . Data in device is Hi...My device
āļāļēāļĢāđāļāļīāđāļĄ LINUX MODULE āđāļŦāļĄāđāđāļāđāļēāđāļāļĒāļąāļ LINUX SOURCE TREE
āđāļĄāļ·āđāļāļāļąāļāļāļąāļāļāļēāđāļāđāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāļ§āļāļĢāđāļŦāļĢāļ·āļ LKM āđāļŠāļĢāđāļāđāļĢāļĩāļĒāļāļĢāđāļāļĒāđāļĨāđāļ§ āđāļāđāļāđāļāļāļāļēāļĢāļĢāļ§āļĄāđāļāđāļ
āđāļāļĢāđāļāļĢāļĄāļāļāļāļāļāđāļāđāļēāđāļāļāļĒāļđāđāđāļāđāļāļĢāļāļŠāļĢāđāļēāļāļŦāļĨāļąāļāđāļāļĩāļĒāļ§āļāļąāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāđāļāļ·āđāļāđāļŦāđāļāļđāđāđāļāđāļŦāļĢāļ·āļāļāļąāļāļāļąāļāļāļēāļāļāļāļ·āđāļāđ
āļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāļēāļāļāļģāļŠāļąāđāļ make menuconïŽg āđāļāļ·āđāļāđāļĨāļ·āļāļāđāļāđāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāļ§āļāļĢāđāļāļāļāđāļĢāļēāđāļāđāļŠāļ°āļāļ§āļ
āļāļķāđāļ
āļāļģāđāļāđāđāļāļĒāļāļēāļĢāļāļģāđāļāļĢāđāļāļĢāļĄ LKM āļāļĩāđāđāļāđāļāļąāļāļāļēāļāļķāđāļāļĄāļēāļāļĩāđāđāļāđāļāđāļāđāļ§āđāļ āļēāļĒāđāļāđāđāļāđāļĢāļāļāļāļĢāļĩ drivers/misc āļāļāļ
āļāļāļĢāđāļŠāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāđāļāļāļĩāđāļāļĩāđāļāļāļĒāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĨāđ hello-driver.c
$ cp ~/kernel_module/hello-driver.c /usr/src/linux-source-$(uname -r)
āļāļąāđāļāļāļāļāļāļąāļāđāļ āđāļŦāđāđāļāļīāļāđāļāļĨāđ drivers/misc/KconïŽg āđāļāļ·āđāļāđāļāļīāđāļĄāđāļĄāļāļđāđāļāđāļēāđāļāđāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
āļāļĩāđ
config HELLO_WORLD_MODULE
    tristate "hello world module"
    depends on X86 <----- āļŠāļēāļĄāļēāļĢāļāļĢāļ°āļāļļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāļāļĩāđāđāļĄāļāļđāļĨāļāļąāļ§āļāļĩāđāļāļģāļāļēāļāđāļāđāđāļāļīāđāļĄ āđāļāđāļ ARM
    default m if X86 <----- āļŠāļēāļĄāļēāļĢāļāļĢāļ°āļāļļāđāļŦāđāđāļāđāļ m āļŦāļĢāļ·āļ y āđāļāđ āđāļĨāļ°āđāļāļīāđāļĄāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāđāļāđ
    help
97
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
98. Â Â Â Â Â Â hello world module.
āđāļāđāđāļāđāļāļĨāđ drivers/misc/MakeïŽle āđāļāļĒāļāļēāļĢāđāļāļīāđāļĄāļāļĢāļĢāļāļąāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ āđāļāļ·āđāļāđāļŦāđāļĄāļĩāļāļēāļĢāļāļāļĄāđāļāļĨāđ LKM āđāļāļīāđāļĄāđāļāļīāļĄ
obj-Ââ$(CONFIG_HELLO_WORLD_MODULE)+=
 hello-Ââdriver.o
āđāļĨāļ°āđāļŦāđāļāļģāļāļēāļĢāđāļĢāļīāđāļĄāļāđāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļāļ·āđāļāļŠāļĢāđāļēāļāļĨāļĩāļāļļāļāļāđāļāļāļĢāđāđāļāļĨāļāļąāļ§āđāļŦāļĄāđāđāļāļĒāļāļēāļĢāđāļāđāļēāļŠāļđāđāđāļĄāļāļđāļāļēāļĢāļāļąāđāļāļāđāļēāļāđāļ§āļĒāļāļģāļŠāļąāđāļ
make menuconïŽg āđāļĨāđāļ§āđāļāđāļēāđāļāđāļāđāļĄāļāļđ Device Drivers āđāļĨāļ·āļāļāđāļĄāļāļđāļĨāļāļĩāđāļāđāļāļāļāļēāļĢāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāđāļēāļ
āļĨāđāļēāļāļāļĩāđ
98
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
105. âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ x86 and x86-64 āļŠāļģāļŦāļĢāļąāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļąāđāļ§āđāļ
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ ARM āļāļ°āļāļđāļāļāļģāđāļāđāļāđāđāļāļŦāļĨāļēāļāļŦāļĨāļēāļĒāļāļēāļāļāļĢāļ°āļĒāļļāļāļāđāđāļĄāđāļ§āđāļēāļāļ°āđāļāđāļāļāļļāļāļāļĢāļāđāđāļāļĢāļ·āđāļāļāđāļāđāđāļāļāđāļē
āļāļļāļāļāļĢāļāđāđāļāļĢāļĻāļąāļāļāđ (Mobile Internet Device) āļāļļāļāļāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļāļĄāļąāļĨāļāļīāļĄāļĩāđāļāļĩāļĒ (Set-top-Box, DVD
Player) āļŦāļĢāļ·āļ āļāļļāļāļāļĢāļāđāļāļ§āļāļāļļāļĄāđāļāļāļļāļāļŠāļēāļŦāļāļĢāļĢāļĄāļāļēāļĢāļāļĨāļīāļ āđāļāđāļāļāđāļ
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ PowerPC āļāļ°āļāļđāļāļāļģāđāļāđāļāđāļĄāļēāļāļāļĒāļđāđāđāļāļāļļāļāļāļĢāļāđāļāļēāļāļāđāļēāļāđāļāļĢāļāļĄāļāļēāļāļĄ āļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ
āđāļāļĒāđāļāļāļēāļ°āļāļĩāđāļāđāļāļāļāļģāļāļēāļāđāļāļāđāļ§āļĨāļēāļāļĢāļīāļ (real-time)
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ MIPS āļĒāļąāļāļāļāļĄāļĩāđāļāđāļāļĒāļđāđāļŦāļĨāļēāļāļŦāļĨāļēāļĒāđāļāļāļļāļāļāļĢāļāđāļāļēāļāļāđāļēāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ SuperH āļāļđāļāļāļąāļāļāļēāđāļāļĒāļāļĢāļīāļĐāļąāļ Hitachi (1990s) āđāļāļŠāļĄāļąāļĒāļāđāļāļāļāļ°āļāļāđāļŦāđāļāļāđāļāļĒāđāļ
āļāļļāļāļāļĢāļāđāļāļēāļāļāđāļēāļāļĄāļąāļĨāļāļīāļĄāļĩāđāļāļĩāļĒ āđāļāđāļ āļāļļāļāļāļĢāļāđ Set-top-box āļāļāļāļĢāļ°āļāļąāđāļāđāļāļāļąāļāļāļļāļāļąāļāļāļĩāđāļāļēāļāļāļĢāļīāļĐāļąāļ Renesus
āļāđāļĒāļąāļāļāļāļāļģāļĄāļēāđāļāđāđāļāļĢāļ°āļāļāļāļģāļāļēāļ āļāļļāļāļāļĢāļāđāļāļēāļāļāđāļēāļāđāļāļĢāļ·āļāļāđāļēāļĒ āđāļāļĢāļ·āđāļāļāļāļīāļĄāļāđ āđāļĨāļ°āļāļĨāđāļāļāļāđāļēāļĒāļĢāļđāļ
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ BlackïŽn āļāļđāļāļāļąāļāļāļēāđāļĨāļ°āļāļģāļāļĨāļēāļāđāļāļĒāļāļĢāļīāļĐāļąāļ Analog Devices āļāļķāđāļāļāļ°āļāļđāļāđāļāđāļāđāļāđāļāļāļēāļ
āļāđāļēāļāļāļĢāļ°āļĄāļ§āļĨāļŠāļąāļāļāļēāļāļāļīāļāļīāļāļāļĨ (Signal Processing) āļāļĩāđāđāļāđāļāļāļģāđāļŦāđāļāļąāļ§ BlackïŽn CPU āđāļāļāļĄāļĩāļĢāļēāļāļēāļāļđāļ
âĒāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ Motorola 68000 āļāļ°āđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāđāļāļāđāļ§āļāļāļĩ 1980s - 1990s āđāļāļāļļāļāļāļĢāļāđ
āļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļŠāđāļ§āļāļāļļāļāļāļĨ āđāļāđāļ Apple Macintosh, Commodore Amiga, Atari ST āļāļķāđāļāļāļ°āđāļāđāļāļāļđāđāđāļāđāļ
āļŠāļģāļāļąāļāļāļąāļāļāļĢāļīāļĐāļąāļ Intel
āļāļēāļĢāļēāļ 3.1 āļāļēāļĢāļĢāļāļāļĢāļąāļāļĄāļēāļāļĢāļēāļāļēāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļāļāđāļāđāļĨāļ°āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ
O P T I O N X 8 6 A R M P P C M I P S S H M 6 8 K
Parallel Port support X X X
IEEE 1394 support X X X X
IrDA support X X X X
USB support X X X X
Bluetooth support X X X
āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļĨāļ°āļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨ
āļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļ·āđāļāļāļēāļāļāļĩāđāļĄāļĩāļāļāļēāļāđāļĨāđāļāļāļĩāđāļŠāļļāļāļāļ°āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāđāļāđāļ āļēāļĒāđāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ
āļāļāļēāļāđāļāļĩāļĒāļ 8 MB āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāđāļēāļāļ°āļāđāļāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļāļĩāđāļāļĢāļ°āļāļąāļāļŦāļāļķāđāļāļāļĩāđāđāļĄāđāļāđāļēāļĄāļēāļāđāļāļīāļ
āđāļāļāđāļāļ§āļĢāļāļ°āļāđāļāļāļĄāļĩāļāļāļēāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļŦāđāļāļĒāļđāđāļāļĩāđāļāļĢāļ°āļĄāļēāļ 32 MB āļŠāđāļ§āļāļāļāļēāļāļāļāļāļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨ (Storage)
āļāļąāđāļāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļāļēāļāđāļĨāđāļāļŠāļļāļāļāļĒāļđāđāļāļĩāđāļāļāļēāļ 4 MB āđāļāļāļĢāļāļĩāļāļĩāđāļāđāļāļāļāļēāļĢāđāļāđāļāļŦāļĢāļ·āļāļŠāļģāļĢāļāļāļāđāļāļĄāļđāļĨāđāļāļīāđāļĄāļāļķāđāļ āļāđāļāļēāļāļāļ°
āđāļāļīāđāļĄāļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨāļāļĢāļ°āđāļ āļāđāļāļĨāļ (Flash storage) āđāļāđāļ NAND/NOR Flash āļŦāļĢāļ·āļ āļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨāļāļĢāļ°āđāļ āļ
āļāļĨāđāļāļ (Block storage) āđāļāđāļ SD/MMC card āđāļĨāļ° eMMC āđāļāđāļāļāđāļ
105
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
131. #define SECTOR_SIZE 512
#define MBR_SIZE SECTOR_SIZE
#define MBR_DISK_SIGNATURE_OFFSET 440
#define MBR_DISK_SIGNATURE_SIZE 4
#define PARTITION_TABLE_OFFSET 446
#define PARTITION_ENTRY_SIZE 16 // sizeof(PartEntry)
#define PARTITION_TABLE_SIZE 64 // sizeof(PartTable)
#define MBR_SIGNATURE_OFFSET 510
#define MBR_SIGNATURE_SIZE 2
#define MBR_SIGNATURE 0xAA55
#define BR_SIZE SECTOR_SIZE
#define BR_SIGNATURE_OFFSET 510
#define BR_SIGNATURE_SIZE 2
#define BR_SIGNATURE 0xAA55
Â
typedef struct {
    unsigned char boot_type; // 0x00 - Inactive; 0x80 - Active (Bootable)
    unsigned char start_head;
    unsigned char start_sec:6;
    unsigned char start_cyl_hi:2;
    unsigned char start_cyl;
    unsigned char part_type;
    unsigned char end_head;
    unsigned char end_sec:6;
    unsigned char end_cyl_hi:2;
    unsigned char end_cyl;
    unsigned long abs_start_sec;
    unsigned long sec_in_part;
} PartEntry;
Â
typedef struct {
    unsigned char boot_code[MBR_DISK_SIGNATURE_OFFSET];
    unsigned long disk_signature;
    unsigned short pad;
    unsigned char pt[PARTITION_TABLE_SIZE];
    unsigned short signature;
} MBR;
Â
void print_computed(unsigned long sector) {
    unsigned long heads, cyls, tracks, sectors;
Â
    sectors = sector % 63 + 1 /* As indexed from 1 */;
    tracks = sector / 63;
    cyls = tracks / 255 + 1 /* As indexed from 1 */;
    heads = tracks % 255;
    printf("(%3d/%5d/%1d)", heads, cyls, sectors);
}
Â
int main(int argc, char *argv[]) {
    char *dev_file = "/dev/sda";
    int fd, i, rd_val;
    MBR m;
131
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
132. Â Â Â Â PartEntry *p = (PartEntry *)(m.pt);
    if (argc == 2) {
        dev_file = argv[1];
    }
    if ((fd = open(dev_file, O_RDONLY)) == -1) {
        fprintf(stderr, "Failed opening %s: ", dev_file);
        perror("");
        return 1;
    }
    if ((rd_val = read(fd, &m, sizeof(m))) != sizeof(m)) {
        fprintf(stderr, "Failed reading %s: ", dev_file);
        perror("");
        close(fd);
        return 2;
    }
    close(fd);
    printf("nDOS type Partition Table of %s:n", dev_file);
    printf(" B Start (H/C/S)  End (H/C/S) Type StartSec   TotSecn");
    for (i = 0; i < 4; i++) {
        printf("%d:%d (%3d/%4d/%2d) (%3d/%4d/%2d) %02X %10d %9dn",
            i + 1, !!(p[i].boot_type & 0x80),
            p[i].start_head,
            1 + ((p[i].start_cyl_hi << 8) | p[i].start_cyl),
            p[i].start_sec,
            p[i].end_head,
            1 + ((p[i].end_cyl_hi << 8) | p[i].end_cyl),
            p[i].end_sec,
            p[i].part_type,
            p[i].abs_start_sec, p[i].sec_in_part);
    }
    printf("nRe-computed Partition Table of %s:n", dev_file);
    printf(" B Start (H/C/S)  End (H/C/S) Type StartSec   TotSecn");
    for (i = 0; i < 4; i++) {
        printf("%d:%d ", i + 1, !!(p[i].boot_type & 0x80));
        print_computed(p[i].abs_start_sec);
        printf(" ");
        print_computed(p[i].abs_start_sec + p[i].sec_in_part - 1);
        printf(" %02X %10d %9dn", p[i].part_type,
            p[i].abs_start_sec, p[i].sec_in_part);
    }
    printf("n");
    return 0;
}
āļāļāļāļāļēāļāļāļąāđāļāļāļģāļŠāļąāđāļ fdisk āļāļĩāđāđāļāđāļāļđāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļāļēāļĢāđāļāļīāļāļąāđāļāđāļĨāđāļ§ āļĒāļąāļāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļāļāļ·āđāļāđāđāļāđāļ āļāļģāļŠāļąāđāļ parted
āļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļŦāļĢāļ·āļāļāļĢāļąāļāļāļāļēāļāļāļāļāļāļēāļĢāđāļāļīāļāļąāđāļāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāļĢāļ°āļāļāđāļāļĨāđāļāļąāđāļāļ§āđāļēāđāļāđāļāļāļāļīāļāđāļ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļ
āļāļēāļĢāđāļāđāļāļēāļāļāđāļēāļāļĨāđāļēāļ
$ parted -l
Model: VMware, VMware Virtual S (scsi)
132
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
133. Disk /dev/sda: 107GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 107GB 107GB primary ext4 boot
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type File system Flags
1 1049kB 17.2GB 17.2GB primary linux-swap(v1)
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
/dev/sda1 / ext4 errors=remount-ro 0 1
/dev/sdb1 none swap sw 0 0
/dev/fd0 /media/floppy0 auto rw,user,noauto,exec,utf8 0 0
āļŠāļģāļŦāļĢāļąāļāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļąāđāļāđāļĄāđāđāļāļĩāļĒāļāđāļāđāđāļāļāļĢāđāđāļāļĨāļāļ°āđāļāđāļāļŠāđāļ§āļāļŠāļģāļāļąāļāļŠāđāļ§āļāļŦāļāļķāđāļāļāļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ
āļĨāļĩāļāļļāļāļāđāđāļĨāđāļ§ āļĒāļąāļāļĄāļĩāļāļĩāļāļŠāđāļ§āļāļŦāļāļķāđāļāļāļĩāđāđāļāđāļāļŠāđāļ§āļāļŠāļģāļāļąāļāđāļĄāđāļāđāļāļĒāļāļ§āđāļēāļāļąāļāļāļ·āļ Root ïŽle system (RFS) āļāļķāđāļāļāļĢāļĢāļāļļāļāļļāļ
āđāļāļĢāđāļāļĢāļĄāļāļ·āđāļāļāļēāļāđāļĨāļāļĢāļēāļĢāļĩāđāļĨāļ°āđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāļāđāļēāļāđāļāļĩāđāļāļ°āļāļģāđāļŦāđāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļāđāļāđ
āļāļĒāđāļēāļāļĄāļĩāļĢāļ°āļāļāđāļĨāļ°āļāļēāļĄāđāļāļ·āđāļāļāđāļāļāļēāļĢāļāļģāļāļēāļāļāļĩāđāđāļāđāļāļđāļāļāļģāļŦāļāļāđāļ§āđ āđāļāļĒ RFS āļāļąāđāļāļāļ°āļāļđāļāļāļąāļāļāļķāļāđāļāđāļāđāļ§āđāđāļāļāļļāļāļāļĢāļāđāļāļąāļ
āđāļāđāļāļāđāļāļĄāļđāļĨ āļāļķāđāļāđāļĄāļ·āđāļāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļđāļāļāđāļēāļĒāđāļāđāļĨāļ°āđāļĢāļīāđāļĄāļāļđāļāļāļąāļ§āđāļāļāļāļķāđāļāļāļąāļ§ bootloader āļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļ ROM āļāđāļāļ°
āđāļĢāļīāđāļĄāļāļģāļāļēāļāđāļĨāļ°āđāļŦāļĨāļāđāļāļĨāđ Kernel image āļāļķāđāļāļŠāļđāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ (RAM) āļŦāļĨāļąāļāļāļēāļāļāļąāđāļ Kernel āļāļ°āļāļģāļāļēāļĢ
āđāļŦāļĨāļ RFS āļāļĩāđāļāļđāļāđāļāđāļāļāļĒāļđāđāļāļāļāļēāļĢāđāļāļīāļāļąāđāļāļāļāļāļāļąāļ§āļāļļāļāļāļĢāļāđāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāļŦāļĢāļ·āļāļ āļēāļĒāđāļāļāļēāļĢāđāļāļīāļāļąāđāļāļāļĩāđāļāļĒāļđāđāļāļāđāļāļĢāļ·āđāļāļ
āļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļ āļēāļĒāđāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ āđāļāļ·āđāļāđāļĢāļīāđāļĄāļāļąāđāļāļāļāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļĒāđāļēāļāđāļāđāļĄāļĢāļđāļāđāļāļ āļāļķāđāļāļāļąāļ§
āļāļļāļāļāļĢāļāđāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāļāļ°āļĄāļĩāļĢāļđāļāđāļāļāļĢāļ°āļāļāđāļāļĨāđāļāļĒāļđāđāļŦāļĨāļąāļāđ 2 āđāļāļāļāļ·āļ āđāļāļ Block āđāļĨāļ° āđāļāļ Flash
āđāļāļ Block āļāļ°āļŠāļēāļĄāļēāļĢāļāļāđāļēāļāđāļĨāļ°āđāļāļĩāļĒāļāđāļāļīāđāļĄāđāļāļīāļĄāļĨāļāđāļāđāļāđāđāļāļĒāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāļāļģāļāļēāļĢāļĨāļāļāđāļāļāļāļĩāđāļāļ°āļāļģāļāļēāļĢ
āđāļāļĩāļĒāļāļāđāļģ āļāļąāļ§āļāļĒāđāļēāļāļāļāļāļāļļāļāļāļĢāļāđāļāļĩāđāđāļāđāļāđāļāļ Block āđāļāđāđāļāđ āļŪāļēāļĢāđāļāļāļīāļŠ āđāļāđāļāļāļīāļŠāļāđāđāļāļāļāđāļāļ (ïŽoppy disk) āđāļĨāļ°
āļāļīāļŠāļāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ (RAM disk) āđāļāđāļāļāđāļ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāđāļĒāļąāļāļĄāļĩāļāļļāļāļāļĢāļāđāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāđāļāļ Flash āļāļĩāđāđāļāđāļ§āļīāļāļĩ
āļāļēāļĢāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāđāļāļ Block āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ Compact Flash, Smart Media, Memory Stick,
Multimedia Card , Flash Drive, MMC/SD card āđāļāđāļŠāļģāļŦāļĢāļąāļāļāļļāļāļāļĢāļāđāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāđāļāļ Flash āđāļāđāļ
NOR ïŽash āļŦāļĢāļ·āļ NAND ïŽash āļāļ°āļāđāļāļāļāļģāļāļēāļĢāļĨāļāļāđāļāļĄāļđāļĨāđāļāļīāļĄāļāđāļāļāļāļĩāđāļāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļāļąāļ§āđāļŦāļĄāđāđāļāļīāđāļĄāđāļāđāļēāđāļ āđāļāļĒāļāļąāļ§
NOR ïŽash āļāļąāđāļāļāļ°āļāļāļāđāļāļāļēāļĢāļĨāļāđāļĨāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāđāļāđāļāļĢāļ°āļĄāļēāļ 10,000 āļāļĢāļąāđāļ āļāļķāđāļāļāļ§āļēāļĄāđāļĢāđāļ§āđāļāļāļēāļĢāļāđāļēāļāļāđāļāļĄāļđāļĨ
133
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
135. āđāļĄāļ·āđāļāļĢāļ°āļāļāļāļĨāļąāļāļĄāļēāļāļģāļāļēāļāļāļĩāļāļāļĢāļąāđāļāļĢāļ°āļāļāđāļāļĨāđāđāļāļ Journal āļāļĩāđāļāļ°āļāļģāļāļēāļĢāļāļĢāļ§āļāļŠāļāļ journal āļāļĩāđāļāļĒāļđāđāđāļāđāļāļĨāđāļāđāļāļ
āļāļĩāđāļĢāļ° āļāļāļāļīāļāļāļģāļāļēāļāļāđāļāļāļŦāļāđāļēāļāļĩāđāļ§āđāļēāļĄāļĩāļŦāļĢāļ·āļāđāļĄāđ āļāđāļēāļĄāļĩāļāđāļāļ°āļāļģāļāļēāļĢāļāļđāđāļĢāļ°āļāļāđāļāļĨāđāļāļĩāđāđāļŠāļĩāļĒāļŦāļēāļĒāđāļŦāļĨāđāļēāļāļąāđāļāļāļĨāļąāļāļāļ·āļāļĄāļēāļāđāļ§āļĒ
āļāļąāđāļāļāļāļāļāļąāļ āđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
āļĢāļĩāļŠāļāļēāļĢāđāļ
āđāļāļĢāļ·āđāļāļ
Journal
āļ§āđāļēāļāļŦāļĢāļ·āļāđāļĄāđ?
āļĨāļ°āļāļīāđāļāļŠāđāļ§āļ
journal entries
āļāļĩāđāđāļĄāđāļŠāļĄāļāļđāļĢāļāđ
āđāļĢāļĩāļĒāļāđāļāđ journal
Filesystem
OK
No
Yes
āļĢāļđāļāļāļĩāđ 3.21 āļāļąāđāļāļāļāļāļāļēāļĢāļāđāļēāļāļāđāļāļĄāļđāļĨāļāļēāļ journal āđāļāļāļāļ°āļāļđāļāđāļāļĢāļ·āđāļāļ
āļāļķāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļāļąāļāļāļļāļāļąāļāđāļāđāđāļāļĨāļĩāđāļĒāļāļĄāļēāđāļāđāļĢāļ°āļāļāđāļāļĨāđāđāļāļ ext3 āđāļĨāļ° ext4 āļāļķāđāļāđāļāđāļāđāļāļ journal
āļāļąāđāļāļŦāļĄāļāđāļĨāđāļ§ āļāļķāđāļāļāļąāļāļāļēāļāđāļāļĒāļāļāļĄāļēāļāļāļēāļ ext2 āđāļāļĒāđāļāļīāđāļĄāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļāļāļĢāļ°āļāļāđāļāļĨāđāđāļāļ journal āđāļĨāļ°
āļāļĢāļąāļāļāļĢāļļāļāđāļŦāđāļĢāļāļāļĢāļąāļāļāļāļēāļāļāļ§āļēāļĄāļāļļāļāđāļāļĄāļđāļĨāļāļĩāđāļŠāļđāļāļāļķāđāļāļāļāļāļāļļāļāļāļĢāļāđāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨ āđāļĄāļ·āđāļāļāļđāđāđāļāđāļāđāļāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāđāļĨāļ°
āļāđāļāļĄāđāļāļĄāļĢāļ°āļāļāđāļāļĨāđāļāđāļ§āļĒāļāļąāļ§āđāļāļāļāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļ e2fsck āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
$ sudo e2fsck /dev/sda1
e2fsck 1.41.11 (14-Mar-2010)
/dev/sda1 is mounted.
WARNING!!! The filesystem is mounted. If you continue you ***WILL*** cause
***SEVERE*** filesystem damage.
Do you really want to continue (y/n)?
āļŦāļĨāļąāļāļāļēāļāđāļāļīāļāļāļąāļ§āļĢāļ°āļāļāđāļāļĨāđ ext3 āđāļĨāļ° ext4 āļāļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļąāđāļāđāļāđāļāļĩ āļ.āļĻ. 2008 āļāļēāļĒ
Theodore Ts'o āļāļķāđāļāđāļāđāļāļāļąāļāļāļąāļāļāļēāļŦāļĨāļąāļāļāļāļāļĢāļ°āļāļāđāļāļĨāđ ext2 ext3 āđāļĨāļ° ext4 āđāļāđāđāļŦāđāļāļ§āļēāļĄāđāļŦāđāļāļ§āđāļēāđāļāļāļāļēāļāļ
āļāļąāļāđāļāļĨāđāļāļĩāđāļāļēāļāļāļ°āļĄāļĩāļĢāļ°āļāļāđāļāļĨāđāļāļąāļ§āđāļŦāļĄāđāđāļāđāļēāļĄāļēāļāļāđāļāļāļāļ·āđāļāļ§āđāļē Btrfs (B-tree ïŽlesystem) āļāļĩāđāļāļđāļāļāļąāļāļāļēāđāļāļĒāļāļĢāļīāļĐāļąāļ
Oracle āđāļāļ·āđāļāļāļāļēāļāļāļąāđāļ ext3 āđāļĨāļ° ext4 āđāļāļīāļāļāļķāđāļāļāļēāļāļāļ·āđāļāļāļēāļāđāļāļāđāļāđāļĨāļĒāļĩāđāļāđāļēāļāļķāđāļāļāļēāļāļāļ°āđāļĄāđāđāļŦāļĄāļēāļ°āļāļąāļāļāļēāļĢ
āđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāļāļāđāļāļāđāļāđāļĨāļĒāļĩāļāļēāļĢāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāđāļāļāļāļēāļāļāļāļĩāđāļāđāļāļāļāļēāļĢāļāļ§āļēāļĄāđāļŠāļāļĩāļĒāļĢāļ āļēāļ (reliability) āļāļ§āļēāļĄ
āļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāļāļĒāļēāļĒāļāļąāļ§ (scalability) āđāļĨāļ°āļāđāļēāļĒāļāđāļāļāļēāļĢāļāļđāđāļĨāļāļąāļāļāļēāļĢ
135
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
136. āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļŠāļĢāđāļēāļāļĢāļ°āļāļāđāļāļĨāđāļāļāļīāļ ext2, ext3, ext4 āđāļāļĒāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļ mkfs.ext<āļŦāļĄāļēāļĒāđāļĨāļ> āđāļāļ·āđāļāļŠāļĢāđāļēāļ
empty ïŽlesystem
$ mkfs.ext2 /dev/hda3
$ mkfs.ext3 /dev/sda2
$ mkfs.ext4 /dev/sda3
āđāļāļāļĢāļāļĩāļāļĩāđāļāđāļāļāļāļēāļĢāļŠāļĢāđāļēāļāļĢāļ°āļāļāđāļāļĨāđāļŠāļģāļŦāļĢāļąāļāđāļāļĨāđ image āđāļāļīāļĄāļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāđāļ§
$ mkfs.ext2 disk.img
āđāļāļāļĢāļāļĩāļāļĩāđāļāđāļāļāļāļēāļĢāļāļģāļŦāļāļāļāļāļēāļāļĢāļ°āļāļāđāļāļĨāđāđāļāļĢāļđāļāđāļāļāđāļāļĨāđ image āļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļĄāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
# dd if=/dev/zero of=rootfs.image bs=1MB count=1024
1024+0 records in
1024+0 records out
1024000000 bytes (1.0 GB) copied, 15.3415 s, 66.7 MB/s
# mkfs.ext3 rootfs.image
mke2fs 1.41.11 (14-Mar-2010)
rootfs.image is not a block special device.
Proceed anyway? (y,n) y
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
62592 inodes, 250000 blocks
12500 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=260046848
8 block groups
32768 blocks per group, 32768 fragments per group
7824 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mkdir /mnt/rootfs
# mount rootfs.image /mnt/rootfs/ -o loop
# rsync -a ~/busybox/_install/ /mnt/rootfs/
# chown -R root:root /mnt/rootfs/
# sync
# umount /mnt/rootfs
136
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
137. āļāđāļāļĄāļđāļĨāļāļĩāđāđāļāļīāđāļĄāđāļāđāļēāđāļāđāļ /mnt/rootfs/ āļāđāļāļ°āļāļđāļāđāļāđāļāļāļĒāļđāđāđāļ rootfs.image āđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļ
āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļāļĩāđāļāļĒāļēāļāļāļ°āļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩāļāđāļēāļāđāđāļāļ·āđāļāļāļĢāļ°āļāļāļāđāļāđāļ rootfs āļāļķāđāļāļĄāļēāđāļāļ āļāļāļāļāļēāļāļāļ°āļāđāļāļāļĄāļĩ
āļāļ§āļēāļĄāđāļāđāļēāđāļāđāļāđāļāļĢāļāļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩāļāļāļ rootfs āđāļāđāļāļāļĒāđāļēāļāļāļĩāđāļĨāđāļ§āļāļ°āļāđāļāļāđāļāđāļēāđāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāļāļāļīāļ device
āļāļ·āđāļāļāļēāļāļŠāļģāļāļąāļāđāļāđ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļŠāļĢāđāļēāļ rootfs āļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ mkdir ~/rootfs
$ cd ~/rootfs
$ mkdir bin dev etc lib proc sbin tmp usr var
$ chmod 1777 tmp
$ mkdir usr/{bin,lib,sbin}
$ mkdir var/{lib,lock,log,run,tmp}
$ chmod 1777 var/tmp
# cd dev/
# mknod -m 600 mem c 1 1 // Physical memory access
# mknod -m 666 null c 1 3 // Null device
# mknod -m 666 zero c 1 5 // Null byte source
# mknod -m 644 random c 1 8 // Nondeterministic rnd nbr
# mknod -m 600 tty0 c 4 0 // Current virtual console
# mknod -m 600 tty1 c 4 1 // First virtual console
# mknod -m 600 ttyS0 c 4 64 // First UART serial port
# mknod -m 666 tty c 5 0 // Current TTY device
# mknod -m 600 console c 5 1 // System console
$ ln -s /proc/self/fd fd
$ ln -s /proc/self/fd/0 stdin
$ ln -s /proc/self/fd/1 stdout
$ ln -s /proc/self/fd/2 stderr
Embedded Linux File System
āđāļāļāđāļāđāļĨāļĒāļĩāļāļģāļāļ§āļāđāļĄāđāļāđāļāļĒāļāļĩāđāļĄāļĩāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļ ïŽle system āđāļāļ·āđāļāļĢāļāļāļĢāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļĒ
āđāļāļāļēāļ°āļāļĒāđāļēāļāļĒāļīāđāļāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāđāļĢāļ°āļāļāđāļāļĨāđāđāļāļ Flash āļāļķāđāļāđāļŦāļĄāļēāļ°āļāļąāļāļāļēāļĢāļāļģāđāļāđāļāđāđāļāđāļāļāđāļāđāļĨāļĒāļĩāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§
āļāļēāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāđāļŠāļāļāļāļķāļāļāļēāļĢāđāļāđāļāļļāļāļāļĢāļāđāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāļāļāļīāļ NOR Flash āđāļāļāļāļ°āļāļĩāđāđāļāļŠāđāļ§āļāļāļāļ device
driver āļāļ°āļāļđāļāļāļđāđāļĨāļāļąāļāļāļēāļĢāļāđāļēāļāļāļąāļ§ MTD Drivers
137
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
138. Root File System
JFFS2 CRAMFS RAMFS
MTD
Drivers
NOR Flash RAM
User-space
Kernel-space
Hardware
āļĢāļđāļāļāļĩāđ 3.22 āļāļēāļĢāļāļąāļāļāļēāļĢāļāļļāļāļāļĢāļāđāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāļāđāļēāļ MTD driver
āļāļąāļāļāļąāļāļāļēāļāļēāļāļāđāļēāļāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļąāđāļāđāļāđāļĢāļ°āļāļąāļāļāļ·āđāļāļāļēāļāļāļ°āđāļāļāļāļąāļāđāļāļĨāđāļāļĩāđāļāļ·āđāļāļ§āđāļē initrd (initial
RAM disk) āļāļķāđāļāđāļāđāļāļĢāļ°āļāļāđāļāļĨāđāļāļĩāđāļāļđāļāļāļĩāļāļāļąāļ (compressed ïŽlesystem) āđāļāļĒāđāļāļāđāļ§āļāđāļĢāļīāđāļĄāļāđāļāļāļāļāļāļąāļ§āļĢāļ°āļāļāđāļāļĨāđ
initrd āļāļĩāđāđāļāđāļāļđāļāļāļąāļāļāļēāļāļķāđāļāļāđāļ§āļĒāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāđāļāļ·āđāļāđāļāđāļāļāļąāļ§āļāļēāļĢāđāļāļāļēāļĢāļāļģāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļāļĒāđāļāđāļŦāđ
āļŠāļēāļĄāļēāļĢāļāļāļđāļāļāļģāđāļāļāļĢāļĢāļāļļāļĨāļāđāļāđāļāđāļāļāļīāļŠāļāđāđāļāļāļāđāļāļ (ïŽoppy disk) āđāļāđāđāļĨāļ°āļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļĢāļāļđāļāđāļĨāļ°āļāļīāļāļāļąāđāļ
āļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāļāļąāļ§āđāļāđāļĄāļĨāļāđāļāļŪāļēāļĢāđāļāļāļīāļŠāļāđāđāļāđāļāļĩāļāļāđāļ§āļĒ āļāļķāđāļāļŦāļĨāļąāļāļāļēāļāļĨāļĩāļāļļāļāļāđāđāļāļāļĢāđāđāļāļĨāļĢāļļāđāļ 2.6 āđāļāđāļāļđāļāļāļĨāđāļāļĒ
āļāļāļāļĄāļē āļāļąāļ§āļĢāļ°āļāļāđāļāļĨāđ initrd āļāđāđāļāđāļāļđāļāđāļĢāļĩāļĒāļāđāļāļāļ·āđāļāđāļŦāļĄāđāļ§āđāļē âinitramfsâ (Initial RAM FileSystem)
āļāļķāđāļāđāļāļāļąāļāļāļļāļāļąāļāļāļ°āļāļāđāļŦāđāļāđāļāļĨāļąāļāļĐāļāļ°āđāļāđāļ Live CD (āđāļāđāļ Knoppix āđāļāđāļāļāđāļ) āļāļāļāļķāļāļāļēāļĢāļāļģ Live USB
āļāļąāļāļĄāļēāļāļāļķāđāļ āļāļķāđāļ Live CD āļŦāļĢāļ·āļ Live USB āļāļąāđāļāđāļāļĒāļĄāļĩāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļāļĒāđāļāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļđāļāđāļŦāļĨāļāļāļķāđāļāļĄāļē
āļāļĒāļđāđāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ (DDRAM) āđāļāđāļāļąāļāļāļĩ āđāļāļĒāđāļĄāđāļāļģāđāļāđāļāļāđāļāļāļĄāļĩāļŪāļēāļĢāđāļāļāļīāļŠāļāđāļāļĒāļđāđāļ āļēāļĒāđāļ
āđāļāļĢāļ·āđāļāļāđāļāđāļāļĒāđāļēāļāđāļāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ āđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāļđāđāđāļāđāļāđāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļąāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ
āļĨāļāđāļāļŪāļēāļĢāđāļāļāļīāļŠāļāđāļāđāļēāļāđāļĄāļāļđāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļđāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāđāļāđāđāļāđāļāļāļąāļ
138
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
140. āļĢāļ°āļāļāđāļāļĨāđāļāļāļīāļ ramfs
ramfs āđāļāđāļāļđāļāļāļąāļāļāļēāļāļķāđāļāđāļāļĒ Linus Torvalds āđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļ āļāļķāđāļāļāļ°āļāļģāļāļēāļĢāđāļŦāļĨāļāđāļāļĨāđāļāļąāđāļāļŦāļĄāļāļāļķāđāļāđāļ§āđāđāļ
āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļĢāļ·āđāļāļ (RAM) āđāļāđāļāļ°āđāļāđāļāļĢāļ°āļāļāđāļāļĨāđāļāļĩāđāļāļđāļāđāļāđāļāļĒāļđāđāļāļāļāļļāļāļāļĢāļāđāļāļāļīāļ ïŽash āđāļāđāļāļŦāļĨāļąāļ āļāļķāļāļāļģāđāļŦāđ
āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļŦāļĢāļ·āļāđāļāļīāđāļĄāđāļāļīāļĄāđāļāđāđāļāđāļāļ°āđāļĄāđāđāļŦāļĄāļ·āļāļāļāļąāļāļĢāļ°āļāļāđāļāļĨāđāļāļāļīāļ initrd āļŦāļĢāļ·āļ
initramfs āļāļĩāđāļāļđāļāļāļģāļŦāļāļāļāļāļēāļāļāļēāļĒāļāļąāļ§āđāļĨāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļāđ
āļĢāļ°āļāļāđāļāļĨāđāļāļāļīāļ jffs2
jffs2 āđāļāđāļāļĢāļ°āļāļāđāļāļĨāđāļĒāļāļāļāļīāļĒāļĄāļāļąāļ§āļŦāļāļķāđāļāļāļķāđāļāļŠāļēāļĄāļēāļĢāļāđāļāļĩāļĒāļ/āļāđāļēāļ āđāļĨāļ°āļāļđāļāļāļĩāļāļāļąāļāđāļāļĢāļđāļāđāļāļ journalling
ïŽash ïŽlesystem āđāļāļĒāļāļąāļ§ jffs2 āļāļĩāđāđāļāđāļāļđāļāļāļģāđāļāđāļāđāđāļāļāļļāļāļāļĢāļāđāļāļāļīāļ Flash memory āļĄāļēāļāļāļ§āđāļēāļāļ°āđāļāđāļāļāļāļīāļ
RAM āđāļāļĢāļēāļ°āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāđāļāđāđāļāđāļāđāļāļĩāļĒāļ§āļāļąāļāļĢāļ°āļāļāđāļāļĨāđāļāļāļīāļ ramfs āđāļāđāļāļ°āļĄāļĩāļāđāļāļāļĩāļāļĩāđāļŠāļģāļāļąāļ
āļāļĩāļāļāļĒāđāļēāļāļāļ·āļāļĢāļ°āļāļāđāļāļĨāđ jffs2 āļāļąāđāļāļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāđāļĨāļ°āļāļđāđāļāļ·āļāļāđāļāļĄāļđāļĨāđāļāļāļāļ°āđāļāļīāļāļāļ§āļēāļĄāļāļīāļāļāļĨāļēāļāļ āļēāļĒāđāļāļĢāļ°āļāļ
āđāļāļĨāđāđāļāđāđāļŦāļĄāļ·āļāļ ext2/ext3
āļāļēāļĢāļēāļ 3.3 āđāļŠāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļļāļāļŠāļĄāļāļąāļāļīāļāļāļāđāļāđāļĨāļ°āļĢāļ°āļāļāđāļāļĨāđ
FILE SYSTEM WRITE PERSISTENT
POWER DOWN RE-
LIABILITY
COMPRES-
SION
LIVES IN
RAM
CRAMFS No No N/A Yes No
JFFS2 Yes Yes Yes Yes No
RAMFS Yes Yes Yes No Yes
YAFFS2 Yes Yes Yes No No
Ext2 over NFTL Yes Yes No No No
Ext3 over NFTS Yes Yes Yes No No
Ext2 over RAM disk Yes No No No Yes
MEMORY TECHNOLOGY DEVICES (MTD)
MTD āđāļāđāļāļāļīāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļāļ ïŽash āļāļĩāđāļĄāļĩāļāļ·āđāļāļāļēāļāļāļēāļ NAND/NOR ïŽash āļāļĩāđāļāļđāļāļāļģāđāļāđāļāđāđāļāļāļēāļĢāđāļāđāļ
āļāđāļāļĄāļđāļĨāļāļĩāđāđāļĄāđāļāđāļāļĒāļāļđāļāđāļāļĨāļĩāđāļĒāļāđāļāļĨāļāļāđāļāļĒ (non-volatile data) āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāđāļāļĨāđ boot image āđāļĨāļ°āđāļāđāļāļāđāļē
conïŽg āļāđāļēāļāđāļ āļēāļĒāđāļ bootloader
āļāļķāļāđāļĄāđāļ§āđāļēāļāļļāļāļāļĢāļāđ MTD āđāļāđāļāļāļāļīāļ ïŽash āđāļāđāļĢāļ°āļāļāđāļāļĨāđāļāļ°āđāļĄāđāđāļŦāļĄāļ·āļāļāļāļąāļāļāļļāļāļāļĢāļāđāļāļāļīāļ ïŽash āđāļāđāļ USB
sticks, MMC/SD cards āđāļāļĢāļēāļ°āļāļļāļāļāļĢāļāđ MTD āļāļ°āđāļāđāļāļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļđāļāđāļāđāļāđāļāđāļāļāļēāļĢāđāļāļīāļāļąāđāļāđāļāđ
āđāļŦāļĄāļ·āļāļāļŪāļēāļĢāđāļāļāļīāļŠāļāđ āđāļāđāļāđāļĄāļĩāļāļēāļĢāļāļģāļāļēāļāļāļĩāđāđāļāļāļāđāļēāļāļāļēāļāļŪāļēāļĢāđāļāļāļīāļŠāļāđāđāļĨāļ°āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ (RAM) āđāļāļŦāļĨāļēāļĒāđāļāđāļēāļāļāļķāđāļ
āļāļļāļāļāļĩāđāđāļāļāļāđāļēāļāļāļąāļāđāļāļāļāļĩāđāļŠāļļāļāļāļ·āļāđāļāļāđāļāļāļĢāđāļāļāļāļŪāļēāļĢāđāļāļāļīāļŠāļāļ°āļŠāļēāļĄāļēāļĢāļāļāļđāļāđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāđāļāđāļāļąāļāļāļĩ āđāļāđāđāļāļāļāļ°āļāļĩāđāđāļāļāđāļāļāļĢāđ
āļāļāļāļāļļāļāļāļĢāļāđ MTD āļāļąāđāļāļāļ°āļāđāļāļāļāļđāļāļĨāļāļāđāļāļāļāļĩāđāļāļ°āļāļđāļāđāļāļĩāļĒāļāļĨāļāđāļ (āļāļĩāđāļāļīāļĒāļĄāđāļĢāļĩāļĒāļāļāļąāļāļ§āđāļē erase-block)
140
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
141. āļāļāļāļāļēāļāļāļąāđāļāļāļģāļāļ§āļāļāļēāļĢāđāļāļĩāļĒāļāļāļāļāļāļļāļāļāļĢāļāđ MTD āļāđāļāļģāļāļąāļāļāļģāļāļ§āļāļāļĢāļąāđāļāđāļāļĩāļĒāļ 1,000 āļāļķāļ 10,000 āļāļĢāļąāđāļ
āđāļāđāļēāļāļąāđāļ āđāļāđāđāļāļāļąāļāļāļļāļāļąāļāļāļļāļāļāļĢāļāđ MTD āļāđāļĒāļąāļāļāļđāļāļāļģāļĄāļēāđāļāđāļŦāļĨāļąāļāđāļŠāļģāļŦāļĢāļąāļāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āđāļāļ·āđāļāđāļāđāļ
bootloaders āđāļĨāļ° Kernel image
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāđāļēāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļāļēāļĢāđāļāļīāļāļąāđāļāļāļāļāļāļļāļāļāļĢāļāđ MTD āđāļāļĒāļāđāļēāļāļāđāļēāļāđāļāļĨāđ /proc/mtd
$ cat /proc/mtd
dev: size   erasesize name
mtd0: 000a0000 00020000 "misc"
mtd1: 00420000 00020000 "recovery"
mtd2: 002c0000 00020000 "boot"
mtd3: 0fa00000 00020000 "system"
mtd4: 02800000 00020000 "cache"
mtd5: 0af20000 00020000 "userdata"
āļĢāļđāļāđāļŠāļāļāļāļēāļĢāđāļāđāļāđāļāļāđāļāļāļĢāđāļāļāļāđāļāđāļĨāļ°āļāļēāļĢāđāļāļīāļāļąāđāļāļ āļēāļĒāđāļāļāļļāļāļāļĢāļāđ MTD
Partition
Partition
Partition
Partition
sector
sector
sector
sector
āļĢāļđāļāļāļĩāđ 3.24 āđāļŠāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļ sector āļ āļēāļĒāđāļāļāļēāļĢāđāļāļīāļāļąāļ
āļāļēāļāļāļĩāđāđāļāđāļāļāļīāļāļēāļĒāļāļāļ§āļāļāļēāļĢāđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļĨāļāđāļāļāļļāļāļāļĢāļāđ MTD āļāđāļēāļāļāđāļāļ§āđāļēāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāļĨāļāļāđāļāļāļāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨ
āđāļŦāļĄāđāļĨāļāđāļ āļŠāļēāļĄāļēāļĢāļāļāļđāļāļąāđāļāļāļāļāļāļēāļĢāļāļģāļāļēāļāđāļāđāļāļēāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
old data
new data 1 new data 2
old data
new data 1
erased
sector
old data
new data 2
temp buf
āļĢāļđāļāļāļĩāđ 3.25 āđāļŠāļāļāļāļāļ§āļāļāļēāļĢāđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļĨāļāļāļļāļāļāļĢāļāđ MTD
141
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
142. āļāļēāļāļĢāļđāļāļāđāļēāļāļāļāđāļŠāļāļāļāļāļ§āļāļāļēāļĢāđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļĨāļāđāļāđāļāļāļļāļāļāļĢāļāđ MTD āļŠāļąāļāđāļāļāļāļēāļāļāđāļēāļāļāđāļēāļĒāļāļ°āļāļāļ§āđāļēāļŦāļĨāļąāļāļāļēāļ
āļāļēāļĢāļĨāļāļāļĢāļąāđāļāļĨāđāļēāļŠāļļāļāļāđāđāļĢāļīāđāļĄāļāļēāļĢāđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāđāļŦāļĄāđāļāļąāļ§āđāļĢāļ (new data 1) āļĨāļāđāļāļāļģāđāļŦāļāđāļ offset āļāļĩāđāļĻāļđāļāļĒāđ āđāļĄāļ·āđāļāļāļđāđāđāļāđ
āļāđāļāļāļāļēāļĢāļāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāđāļŦāļĄāđāļāļąāļ§āļāļąāļāļĄāļē (new data 2) āļĨāļāđāļāļāļģāđāļŦāļāđāļāđāļāļīāļĄāļāļāļāļāđāļāļĄāļđāļĨāļāļąāļ§āđāļĢāļ āļāļąāļ§āļāļļāļāļāļĢāļāđ MTD
āļāļ°āļāđāļāļāļāļąāļāļĨāļāļāļāđāļāļĄāļđāļĨāđāļāđāļēāļāļĩāđāļāļĒāļđāđāļāđāļēāļāļĨāđāļēāļāļŠāļļāļāđāļāļāļąāļāđāļ§āđāđāļāļāļąāļāđāļāļāļĢāđāļāļąāđāļ§āļāļĢāļēāļ§āļāđāļāļ (temp buf) āđāļĨāđāļ§āļāļķāļāļŠāļēāļĄāļēāļĢāļ
āļāļģāđāļāļīāļāļāļēāļĢāļĨāļāđāļāļāđāļāļāļĢāđāļāļąāđāļāļāļąāđāļāļŦāļĄāļāđāļāđ āđāļĨāđāļ§āļāļķāļāļāđāļāļĒāļāļģāļāđāļāļĄāļđāļĨāđāļāđāļē (temp buf) āđāļĨāļ°āļāđāļāļĄāļđāļĨāļāļąāļ§āđāļŦāļĄāđ (new
data 2) āļĄāļēāđāļāđāļāļāļēāļĄāļĨāļģāļāļąāļ
āļāļķāđāļāļāļąāđāļāļāļāļāđāļŦāļĨāđāļēāļāļĩāđāļāļ°āļāļđāļāļāļģāđāļāļīāļāļāļēāļĢāđāļāļāļąāđāļāļāļāļ ïŽash translation layer (FTL) āđāļāļ·āđāļāļĨāļāļāļ§āļēāļĄāļĒāļļāđāļāļĒāļēāļāđāļ
āļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļāļāđāļđāđāļāđ āļāļķāđāļāđāļāļāļāļīāļāļāļĩāđāđāļāđāļāļđāļāļāļģāđāļāđāļāđāđāļāļāļļāļāļāļĢāļāđ MTD āđāļāđāļ JFFS2 āđāļĨāļ° YAFFS āđāļāļĒ
āļāļąāđāļ JFFS2 āđāļĨāļ° YAFFS ïŽle systems āļāļąāđāļāļāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāđāļāđāļ loopback device āđāļĨāļ°āđāļĄāđāļŠāļēāļĄāļēāļĢāļāļāļđāļ
āļāļģāļāļēāļĢ mount āļāļąāļ§āļĢāļ°āļāļāđāļāļĨāđāđāļāđ (āļāđāļ§āļĒāļāļģāļŠāļąāđāļ -o loop) āđāļŦāļĄāļ·āļāļāļāļąāļ linux ïŽlesystem āļāļąāđāļ§āđāļ āđāļāļ·āđāļāļāļāļēāļāđāļĄāđ
āđāļāđāđāļāđāļāļāļļāļāļāļĢāļāđāļāļĩāđāđāļāđāļāđāļāļ block āļāļąāļāļāļĩāđāļāļāļīāļāļēāļĒāđāļāļāđāļēāļāļāđāļ āļāļąāļāļāļąāđāļāļ§āļīāļāļĩāļāļēāļĢāļāļĩāđāļāļ°āđāļŦāđāļŠāļēāļĄāļēāļĢāļāļāļļāļāļāļĢāļāđ MTF
āļŠāļēāļĄāļēāļĢāļāļāļđāļ mount āļāļąāļ§āļĢāļ°āļāļāđāļāļĨāđāļāļāļāļāļąāđāļāļŠāļāļāļāļąāļ§āđāļāđ āļāļ°āļāđāļāļāļāļģāļāļēāļĢāđāļŦāļĨāļ MTD Driver āļāļ·āđāļāļ§āđāļē mtdram
module āđāļŠāļĩāļĒāļāđāļāļ āđāļāļĒāđāļāļĢāđāļāļĢāļĄāđāļāļĢāđāļ§āļāļĢāđāļāļĩāđāļāļ°āļāļģāļāļēāļĢāļāļģāļĨāļāļāļāļļāļāļāļĢāļāđ MTD āļāļķāđāļāļĄāļēāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļ
āļāļĩāđ
# modprobe mtdram total_size=65536 erase_size=128
āļŠāļēāļĄāļēāļĢāļāļāļĢāļ§āļāļŠāļāļāļāļļāļāļāļĢāļāđ MTD āļāļĩāđāļāļđāļāļāļģāļĨāļāļāļāļķāđāļāļāđāļ§āļĒāļāļģāļŠāļąāđāļ
# cat /proc/mtd
dev: size erasesize name
mtd0: 04000000 00020000 "mtdram test device"
āđāļāđāļāļģāļŠāļąāđāļ dd āđāļāļ·āđāļāļŠāļĢāđāļēāļ jffs2 ïŽle system āđāļĨāļ°āļāļąāđāļāļāļ·āđāļāļāļļāļāļāļĢāļāđāđāļŦāļĄāđāļāļ·āđāļ mtdblock0
# dd if=rootfs.jffs2 of=/dev/mtdblock0
mount āļāļąāļ§ jffs2 ïŽlesystem āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
# mount -t jffs2 /dev/mtd0 ~/rootfs
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāđāļāđāļēāļāļķāļāļāļļāļāļāļĢāļāđ MTD
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāđāļŠāļāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļ·āđāļāļāļēāļāļāļāļāļāļļāļāļāļĢāļāđ MTD
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
142
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
143. #include <mtd/mtd-user.h>
Â
int main()
{
    mtd_info_t mtd_info;
    int fd = open("/dev/mtd5", O_RDWR);
ioctl(fd, MEMGETINFO, &mtd_info);
Â
    printf("MTD type: %un", mtd_info.type);
    printf("MTD total size : %u bytesn", mtd_info.size);
    printf("MTD erase size : %u bytesn", mtd_info.erasesize);
Â
    return 0;
}
āļāļąāļ§āļāļĒāđāļēāļāļāļļāļāļāļģāļŠāļąāđāļāđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļāđāļēāļāđāļĨāļ°āđāļāļĩāļĒāļāļāđāļāļĄāļđāļĨāļĨāļāđāļāļāļļāļāļāļĢāļāđ MTD
unsigned char buf[64];
unsigned char data[7] = { âBâ, âUâ, âRâ, âAâ , âPâ , âHâ , âAâ };
/* read something from last sector */
lseek(fd, -mtd_info.erasesize, SEEK_END);
read(fd, buf, sizeof(buf));
/* write something to last sector */
lseek(fd, -mtd_info.erasesize, SEEK_END);
write(fd, data, sizeof(data));
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāđāļāļ·āđāļāđāļŦāđāļāļīāļāļāđāļāļāļąāļāļāļļāļāļāļĢāļāđ MTD āļāđāļēāļāđāļāļĨāđ device āļāļ·āđāļ /dev/mtd0
#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <mtd/mtd-user.h>
int main() {
mtd_info_t mtd_info; // the MTD structure
erase_info_t ei; // the erase block structure
int i;
unsigned char data[20] = { 0xDE, 0xAD, 0xBE, 0xEF, // our data to write
0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE, 0xEF, 0xDE, 0xAD, 0xBE,
0xEF, 0xDE, 0xAD, 0xBE, 0xEF };
unsigned char read_buf[20] = { 0x00 }; // empty array for reading
int fd = open("/dev/mtd0", O_RDWR); // open the mtd device for reading and
// writing. Note you want mtd0 not mtdblock0
// also you probably need to open permissions
// to the dev (sudo chmod 777 /dev/mtd0)
ioctl(fd, MEMGETINFO, &mtd_info); // get the device info
143
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
144. // dump it for a sanity check, should match what's in /proc/mtd
printf("MTD Type: %xnMTD total size: %x bytesnMTD erase size: %x bytesn",
mtd_info.type, mtd_info.size, mtd_info.erasesize);
ei.length = mtd_info.erasesize; //set the erase block size
for (ei.start = 0; ei.start < mtd_info.size; ei.start += ei.length) {
ioctl(fd, MEMUNLOCK, &ei);
// printf("Eraseing Block %#xn", ei.start); // show the blocks erasing
// warning, this prints a lot!
ioctl(fd, MEMERASE, &ei);
}
lseek(fd, 0, SEEK_SET); // go to the first block
read(fd, read_buf, sizeof(read_buf)); // read 20 bytes
// sanity check, should be all 0xFF if erase worked
for (i = 0; i < 20; i++)
printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]);
lseek(fd, 0, SEEK_SET); // go back to first block's start
write(fd, data, sizeof(data)); // write our message
lseek(fd, 0, SEEK_SET); // go back to first block's start
read(fd, read_buf, sizeof(read_buf)); // read the data
// sanity check, now you see the message we wrote!
for (i = 0; i < 20; i++)
printf("buf[%d] = 0x%02xn", i, (unsigned int) read_buf[i]);
close(fd);
return 0;
}
āļāļąāđāļāļāļāļāļāļēāļĢāđāļŦāļĨāļāļĢāļ°āļāļāđāļāļĨāđāđāļāļ·āđāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļīāļāļąāļāļīāļāļēāļĢ EMBEDDED LINUX
āđāļāļ·āđāļāļāļģāđāļŦāđāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļģāļāļēāļāļāļķāđāļāļĄāļēāđāļāđāļāļąāđāļ āļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāđāļāļĢāļĩāļĒāļĄāđāļāļĨāđāļŦāļĨāļąāļāđāđāļāđāđāļāđāđāļāļĨāđ Kernel
Image (initrd, vmlinux, bzImage, zImage āđāļāđāļāļāđāļ) āđāļĨāļ°āđāļāļĨāđ Root ïŽle system (ext2/3/4,
cramfs, jffs2, hfffs āđāļāđāļāļāđāļ) āđāļĨāđāļ§āļāļģāđāļāļ§āļēāļāđāļ§āđāđāļāļāļēāļĢāđāļāļīāļāļąāđāļāļāļāļāļāļļāļāļāļĢāļāđāļāļąāļāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§
āļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāđāļāđ āļāļąāļāļāļģāđāļŦāļāđāļāļāļēāļĢāđāļāļīāļāļąāđāļāđāļŦāļĨāđāļēāļāļĩāđ
âĒāļāļēāļĢāđāļāļīāļāļąāđāļāļāļāļŪāļēāļĢāđāļāļāļīāļŠāļāđ āļŦāļĢāļ·āļ USB Storage
âĢ root=/dev/sdXY āļāļĩāđāļāļķāđāļ X āđāļāļāļāđāļ§āļĒāļāļ·āđāļāļāļļāļāļāļĢāļāđ āđāļĨāļ° Y āđāļāļāļāđāļ§āļĒāļŦāļĄāļēāļĒāđāļĨāļāļāļēāļĢāđāļāļīāļāļąāđāļ āđāļāđāļ
root=/dev/sdb2 (āļāļēāļĢāđāļāļīāļāļąāđāļāļāļĩāđ 2 āļāļāļāļāļīāļŠāļāđāļāļĩāđ 2)
âĒāļāļēāļĢāđāļāļīāļāļąāđāļāļāļ MMC/SD Card
âĢ root=/dev/mmcblkXpY āļāļĩāđāļāļķāđāļ X āđāļāļāļāđāļ§āļĒāļŦāļĄāļēāļĒāđāļĨāļāļāļļāļāļāļĢāļāđ āđāļĨāļ° Y āđāļāļāļāđāļ§āļĒāļŦāļĄāļēāļĒāđāļĨāļāļāļēāļĢāđ
āļāļīāļāļąāđāļ āđāļāđāļ root=/dev/mmcblk0p2 (āļāļēāļĢāđāļāļīāļāļąāđāļāļāļĩāđ 2 āļāļāļāļāļīāļŠāļāđāđāļĢāļ)
144
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
151. āđāļāļĒāļāļĩāđ:
âĒ< id > āļāļ°āļāļđāļāđāļāđāđāļāļĒ BusyBox init āđāļāļ·āđāļāļĢāļ°āļāļļ console āļāļĩāđāđāļāļīāļāļāļķāđāļāļĄāļē (controlling tty) āļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļ
āļŠāļāļĩāđāđāļāđāļĢāļ°āļāļļāđāļ§āđāđāļāđāļāļĒāđāļēāļāđāļĢāļāđāļāļēāļĄāļāđāļē BusyBox āļāļĢāļ§āļāļāļāļ§āđāļēāļĄāļĩāļāļēāļĢāđāļāđ serial console āļāļĒāļđāđāđāļĨāđāļ§āļāđāļēāļāļĩāđāļāđāļāļ°āļāļđāļ
āđāļāļīāļāđāļāļĒāđāļ
âĒ< runlevels > āļāđāļēāļāļĩāđāļāļ°āđāļĄāđāļĄāļĩāļāļēāļĢāđāļāđāđāļ BusyBox āđāļāļĒāđāļāļāļēāļ°āđāļāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āđāļāļ·āđāļāļāļāļēāļāđāļĄāđāļāļēāļĢ
āđāļĒāļāļĢāļ°āļāļąāļāļāļāļāļāļđāđāđāļāđ āđāļāđāļāļ°āđāļāđāđāļāļāļēāļ°āđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāđāļēāļāļąāđāļ
âĒ< action > āļāļĢāļ°āļāļāļāļāđāļ§āļĒ sysinit, respawn, askïŽrst, wait, once, restart, ctrlaltdel, āđāļĨāļ°
shutdown āđāļāļĒāļĄāļĩāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļąāļāļāļĩāđ
âĢ sysinit āļāļģāļŦāļāļāđāļŦāđāđāļĢāļĩāļĒāļāđāļāļĢāđāļāļŠāđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļĩāđāļĢāļ°āļāļāļāļģāļĨāļąāļāļāļ°āđāļĢāļīāđāļĄāļāļđāļāļāļđāļāļāļķāđāļ
âĢ respawn āļāļģāļŦāļāļāđāļŦāđāđāļĢāļĩāļĒāļāđāļāļĢāđāļāļŠāđāļŦāļĄāđāļāļĩāļāļāļĢāļąāđāļāļāļąāļāđāļāļĄāļąāļāļī āđāļĄāļ·āđāļāđāļāļāđāļāļēāļĄāļāļĩāđāđāļāļĢāđāļāļŠāļāļąāđāļāļāļđāļāļāļīāļāļĨāļ
âĢ askïŽrst āļĄāļĩāļāļēāļĢāļāļģāļāļēāļāļāļĨāđāļēāļĒāļāļąāļ respawn āđāļāđāļāđāļāļāļāļ°āđāļĢāļīāđāļĄāđāļĢāļĩāļĒāļāđāļāļĢāđāļāļŠāļāļĩāđāļāļģāļŦāļāļāđāļ§āđ āļāļ°āļĄāļĩāļāļēāļĢāđāļŠāļāļ
āļāđāļāļāļ§āļēāļĄāļāļąāļāļāļĩāđ "Please press Enter to activate this console." āđāļāļ·āđāļāļĢāļ
āđāļŦāđāļāļđāđāđāļāđāļāļāļāļļāđāļĄ Enter āđāļĨāđāļ§āļāļķāļāļāļģāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāļĢāđāļāļŠāļĨāļģāļāļąāļāļāļąāļāđāļ
âĢ ctrlaltdel āļāļģāļŦāļāļāđāļŦāđāđāļĢāļĩāļĒāļāđāļāļĢāđāļāļŠ āđāļĄāļ·āđāļ init āđāļāđāļĢāļąāļāļŠāļąāļāļāļēāļ SIGINT āļāļĩāđāļĄāļĩāļāļēāļĢāļāļāļāļļāđāļĄ CTRL-ALT-
DEL āļāļĢāđāļāļĄāļāļąāļ
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĨāđ inittab
# Boot-time system configuration/initialization script.
# This is run first except when booting in single-user mode.
#
::sysinit:/etc/init.d/rcS
# Put a getty on the serial line (for a terminal)
::respawn:/sbin/getty -L ttyS 115200 vt100
# Stuff to do when restarting the init process
::restart:/sbin/init
# Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
151
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
162. $ sudo vim /etc/exports
/home/student/nfsroot *(rw,sync,no_root_squash,no_subtree_check)
āđāļĢāļīāđāļĄāđāļĢāļĩāļĒāļāļāļĢāļīāļāļēāļĢ NFS Server āđāļŦāļĄāđāļāļĩāļāļāļĢāļąāđāļ
$ sudo /etc/init.d/nfs-kernel-server restart
āļāļīāļāļāļąāđāļāđāļāļĢāļ·āđāļāļāļĄāļ·āļ buildroot āļāļķāđāļāđāļāđāļ cross-compiling toolchain
$ wget http://buildroot.uclibc.org/downloads/buildroot-2013.05.tar.gz
$ tar -xzvf buildroot-2013.05.tar.gz
$ cd buildroot-2013.05/
āļāļąāđāļāļāđāļēāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļāļāļąāļāļāļąāļ§āđāļāļ·āđāļāđāļŦāđāļĢāļāļāļĢāļąāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄāđāļĨāļ°āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļ·āđāļāđ
āļāļąāļāļāļĩāđ
$ make menuconfig
āđāļāļĒāđāļŦāđāļāļąāđāļāļāđāļēāļāļąāļāļāļĩāđ:
Target Architecture ==> ARM (little endian)
Target Architecture Variant ==> arm926t
Target ABI ==> EABI
System ConïŽguration ==> serial port to run getty on (ttyAMA0)
Package Selection ==> Busybox
FileSystem Images ==> cpio the root ïŽlesystem āđāļĨāļ° tar the root ïŽlesystem
Kernel ==>āļĢāļ°āļāļļāļāļ·āđāļ defconïŽg āđāļāđāļ âversatileâ
Kernel ==> Kernel binary format to zImage
162
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
173. #!/bin/sh
sudo chown root.users /dev/net/tun
sudo chmod g+rw /dev/net/tun
sudo brctl addbr br0
sudo ifconfig eth0 0.0.0.0 promisc
sudo brctl addif br0 eth0
sudo dhclient br0
sudo tunctl -t tap1 -u `whoami`
$ chmod 755 network.sh
āļŠāļĢāđāļēāļāđāļāļĨāđ qemu-ifup āđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ /etc/
$ vim qemu-ifup
#!/bin/sh
echo "Executing /etc/qemu-ifup"
echo "Bringing up $1 for bridged mode..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "Adding $1 to br0..."
sudo /sbin/brctl addif br0 $1
sleep 2
$ chmod 755 qemu-ifup
āļŠāļĢāđāļēāļāđāļāļĨāđ u-boot.bin
$ cd ~/eeburapha/qemu/mini2440/mini2440
$ mkdir uboot
$ cd uboot
$ git clone git://repo.or.cz/u-boot-openmoko/mini2440.git
$ cd mini2440
$ make mini2440_config
$ make all
dd if=u-boot.bin of=u-boot-nand2k.bin bs=2K conv=sync
119+1 records in
120+0 records out
245760 bytes (246 kB) copied, 0.000734641 s, 335 MB/s
dd if=u-boot.bin of=u-boot-nand16k.bin bs=16K conv=sync
14+1 records in
15+0 records out
245760 bytes (246 kB) copied, 0.000435712 s, 564 MB/s
āđāļĨāđāļ§āđāļŦāđāļāļģāļāļēāļĢāļāļąāļāļĨāļāļāđāļāļĨāđ u-boot.bin āļāļĨāļąāļāđāļāļĒāļąāļāđāļāđāļĢāļāļāļāļĢāļĩ
~/eeburapha/qemu/mini2440/mini2440
āļŠāļĢāđāļēāļāđāļāļĨāđ sd image
$ cd eeburapha/qemu/mini2440/
173
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
174. $ qemu-img create sd.img 256M
Formatting 'sd.img', fmt=raw size=268435456
$ sudo modprobe nbd
$ sudo modprobe dm-mod
$ qemu-nbd -p 24561 sd.img &
$ sudo nbd-client localhost 24561 /dev/nbd0
Negotiation: ..size = 256MB
bs=1024, sz=268435456 bytes
$ sudo fdisk -u=cylinders /dev/nbd0
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF
disklabel
Building a new DOS disklabel with disk identifier 0xe5f5bdf3.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by
w(rite)
WARNING: cylinders as display units are deprecated. Use command 'u' to
change units to sectors.
Command (m for help): o
Building a new DOS disklabel with disk identifier 0x1999a406.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.
Warning: invalid flag 0x0000 of partition table 4 will be corrected by
w(rite)
WARNING: cylinders as display units are deprecated. Use command 'u' to
change units to sectors.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First cylinder (1-32, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-32, default 32): +50MB
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): b
Changed system type of partition 1 to b (W95 FAT32)
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (1-4, default 2): 2
First cylinder (7-32, default 7):
Using default value 7
174
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
175. Last cylinder, +cylinders or +size{K,M,G} (7-32, default 32):
Using default value 32
Command (m for help): p
Disk /dev/nbd0: 268 MB, 268435456 bytes
255 heads, 63 sectors/track, 32 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x1999a406
Device Boot Start End Blocks Id System
/dev/nbd0p1 1 7 55203 b W95 FAT32
/dev/nbd0p2 7 32 200813 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: If you have created or modified any DOS 6.x
partitions, please see the fdisk manual page for additional
information.
Syncing disks.
$ sudo kpartx -a /dev/nbd0
$ sudo mkfs.vfat /dev/mapper/nbd0p1
$ sudo mkfs.ext3 /dev/mapper/nbd0p2
$ mkdir disk
$ sudo mount /dev/mapper/nbd0p2 ./disk
$ mkdir -p disk/boot
$ sudo mount /dev/mapper/nbd0p1 ./disk/boot
$ wget
http://mini2440.googlecode.com/files/emdebian-grip-090306-armel-lenny-
installed.tar.bz2
$ (cd disk; sudo tar jxf
../emdebian-grip-090306-armel-lenny-installed.tar.bz2)
$ sudo umount disk/boot disk
$ sudo nbd-client -d /deb/nbd0
āđāļĨāđāļ§āđāļŦāđāļāļģāļāļēāļĢāļāļąāļāļĨāļāļāđāļāļĨāđ sd.img āđāļāļ§āļēāļāđāļ§āđāļāļĩāđ ~/eeburapha/qemu/mini2440/mini2440 āđāļĨāļ°āđāļĢāļīāđāļĄ
āļāļēāļĢāļĢāļąāļ mini2440 āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
$ cd ~/eeburapha/qemu/mini2440/mini2440
$ ./network.sh
Set 'tap1' persistent and owned by uid 1000
$ ./ mini2440_start.sh
*** Warning - bad CRC or NAND, using default environment
175
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
176. USB:Â Â S3C2410 USB Deviced
ERROR: usbd_device_event_irq(), 613: (3401ea64,1) NULL device or device->bus
ERROR: usbd_device_event_irq(), 613: (3401ea64,2) NULL device or device->bus
ERROR: usbd_device_event_irq(), 613: (3401ea64,3) NULL device or device->bus
In:Â Â Â serial
Out:Â Â serial
Err:Â Â serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot:Â 0
MINI2440 #
āļāļģāļāļēāļĢāļāļāļĢāđāđāļĄāļ nand
# nand scrub"
NAND scrub: device 0 whole chip
Warning: scrub option will erase all factory set bad blocks!
There is no reliable way to recover them.
Use this command only for testing purposes if you
are sure of what you are doing!
Really scrub this NAND flash? <y/N>
Erasing at 0x3ffc000 -- 100% complete.
Bad block table not found for chip 0
Bad block table not found for chip 0
OK
āļŠāļĢāđāļēāļ bad block table
# nand createbbt
Create BBT and erase everything ? <y/N>
Skipping bad block at 0x03ff0000
Skipping bad block at 0x03ff4000
Skipping bad block at 0x03ff8000
Skipping bad block at 0x03ffc000
Creating BBT. Please wait ...Bad block table not found for chip 0
Bad block table not found for chip 0
Bad block table written to 0x03ffc000, version 0x01
Bad block table written to 0x03ff8000, version 0x01
āļŠāļĢāđāļēāļāļāļĩāđāđāļāđāļāļāđāļāļĄāļđāļĨāļāļąāļ§āđāļāļĢāļĢāļ°āļāļ (env)
# dynenv set 40000
device 0 offset 0x40000, size 0x3fc0000
45 4e 56 30 - 00 00 04 00
āļāļąāđāļāļāļāļāļŠāļļāļāļāđāļēāļĒāļāļģāļāļēāļĢ reset āļāļ°āđāļāđ emulator āļāļĩāđāļāļĢāđāļāļĄāđāļāđāļāļēāļāđāļāļĒāļŠāļēāļĄāļēāļĢāļāļāļąāļāļĨāļāļāļāđāļāļĄāļđāļĨāđāļŠāđ sd.img āđāļāđ
# reset
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=57
QEMU mini2440_reset: loaded default u-boot from NAND
176
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
177. QEMU mini2440_reset: loaded override u-boot (size 3c000)
S3C: CLK=240 HCLK=240 PCLK=240 UCLK=48
S3C: CLK=304 HCLK=304 PCLK=304 UCLK=48
S3C: CLK=304 HCLK=101 PCLK=50 UCLK=48
S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48
S3C: CLK=304 HCLK=76 PCLK=38 UCLK=48
S3C: CLK=405 HCLK=101 PCLK=50 UCLK=48
U-Boot 1.3.2-moko12 (Jun 26 2009 - 18:16:16)
I2C: ready
DRAM: 64 MB
Flash: 2 MB
NAND: 64 MiB
Found Environment offset in OOB..
USB: S3C2410 USB Deviced
In: serial
Out: serial
Err: serial
MAC: 08:08:11:18:12:27
Hit any key to stop autoboot: 0
MINI2440 #
177
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
188. āļāļēāļŠāļąāļāļāļēāļāļāļĩāđāđāļāđāđāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļŠāđāļ§āļāđāļŦāļāđāļāļ°āļĄāļĩ 2 āļāļēāļŦāļĨāļąāļāļāļ·āļāļāļēāļĢāļąāļāļāđāļāļĄāļđāļĨ (RxD) āđāļĨāļ° āļāļēāļŠāđāļāļāđāļāļĄāļđāļĨ (TxD)
āđāļāļĒāļĄāļēāļāļĢāļāļēāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāļ°āļāđāļāļāļāļĢāļāļāļąāļāļāļąāđāļāļāļąāļ§āļĢāļąāļāđāļĨāļ°āļāļąāļ§āļŠāđāļ āđāļāđāļāļāļāļāđāļĢāļ (baudrate) 9600 āļāļīāļāļāđāļāļ§āļīāļāļēāļāļĩ
āļāļģāļāļ§āļāļāļīāļāđāļĢāļīāđāļĄ āļāļīāļāļŦāļĒāļļāļ āļāļīāļāļāļēāļĢāļīāļāļĩāđ āđāļĨāļ°āļāļģāļāļ§āļāļāļīāļāļāđāļāļĄāļđāļĨ
āļāļēāļĢāļēāļ 4.1 āđāļāļĨāđāļāļāļīāļ character āļāđāļēāļāđāļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāđāļĢāļāļāļāļĢāļĩ /dev
āļāļļāļāļāļĢāļāđ āļāļ·āđāļāđāļāļĨāđ MAJOR MINOR
Parallel port 0 /dev/lp0 āļŦāļĢāļ·āļ /dev/par0 6 0
Parallel port 1 /dev/lp1 āļŦāļĢāļ·āļ /dev/par1 6 1
1st
Serial port /dev/ttyS0 4 64
2nd
Serial port /dev/ttyS1 4 65
IDE tape drive /dev/ht0 37 0
1st
SCSI tape drive /dev/st0 9 0
2nd
SCSI tape drive /dev/st1 9 1
System Console /dev/console 5 1
1st
Virtual Terminal /dev/tty1 4 1
2nd
Virtual Terminal /dev/tty2 4 2
Process current terminal /dev/tty 5 0
Sound card /dev/audio 14 4
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāļāļīāļāļāđāļāļāđāļēāļāļāļāļĢāđāļāļāļāļļāļāļĢāļĄ (/dev/ttySx āļŦāļĢāļ·āļ /dev/ttyUSBx) āļ āļēāļĒ
āđāļāđāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ
// serial_thread.c
#include <stdio.h> /* Standard input/output definitions */
#include <string.h> /* String function definitions */
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <pthread.h> /* Create pthread to run reading prog in background */
struct serial_data {
int fd, nbytes, portsite; /* device file */
char *bufptr; /* set pointer of buffer */
char buffer[255], data[255]; /* target buffer to get from pointer */
};
struct serial_data ffuart;
void *ffuart_thread() {
ffuart.portsite = 1;
188
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
189. ffuart.fd = open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NDELAY);
if (ffuart.fd == -1) {
/* Could not open the port. */
perror("open_port: Unable to open /dev/ttyS1 - ");
} else {
struct termios options;
fcntl(ffuart.fd, F_SETFL, 0);
tcgetattr(ffuart.fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag |= PARENB;
options.c_cflag &= ~PARODD;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_oflag &= ~OPOST;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 10;
tcsetattr(ffuart.fd, TCSANOW, &options);
printf("Port is scanning. ^^n");
ffuart.bufptr = ffuart.buffer; /* set buffer to get from pointer */
printf("Hey! You Reading yet.n");
printf("Now working in ST Port.n");
while (1) {
printf("ReadingFFn");
ffuart.nbytes = read(ffuart.fd, ffuart.buffer, 255);
if (ffuart.nbytes != 0) {
ffuart.buffer[8] = '0';
printf("From %d side : %sn", ffuart.portsite,
ffuart.buffer);
}
}
}
close(ffuart.fd);
}
int main() {
pthread_t ff_tid;
int rc;
printf("FF_Thread creating!!n");
rc = pthread_create(&ff_tid, NULL, ffuart_thread, (void *) NULL);
if (rc) {
printf("ERROR; return code from pthread_create() is %drn", rc);
exit(-1);
}
printf("FF_Thread created!!t[Complete!!]n");
pthread_join(ff_tid, NULL);
printf("Created all!!t[Complete!!]n");
pthread_exit(NULL);
}
189
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
190. āļāļąāļ§āļāļĒāđāļēāļāđāļāļĨāđ MakeïŽle āļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ serial_thread.c āļāļĩāđāļāļģāļāļēāļāđāļāđāļāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ ARM
#
# Makefile! : Serial communication Sample Program
#
CROSS_COMPILE=arm-linux-uclibc-
CC=$(CROSS_COMPILE)gcc
SOURCES=serial_thread.c
OBJECTS=$(SOURCES:.c=.o)
CFLAGS=-Os
LDFLAGS=-Os -lm -static
LIBRARIES=pthread
EXECUTABLE=serial_thread
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
! $(CC) $(LDFLAGS) $(OBJECTS) -o $@ -l$(LIBRARIES)
.c.o:
! $(CC) $(CFLAGS) $< -o $@
clean:
! rm -rf $(OBJECTS) $(EXECUTABLE)
āļāļąāļ§āļāļĒāđāļēāļāļāļąāļāđāļāļāļ·āļāļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļēāļāļāļāļĢāđāļāļāļāļļāļāļĢāļĄāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ 2 āđāļāļĢāļ·āđāļāļ
// serial_chat.c
#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 //POSIX compliant source
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
void signal_handler_IO (int status); //definition of signal handler
int wait_flag=TRUE; //TRUE while no signal received
char devicename[80];
long Baud_Rate = 38400; // default Baud Rate (110 through 38400)
long BAUD; // derived baud rate from command line
long DATABITS;
long STOPBITS;
190
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
191. long PARITYON;
long PARITY;
int Data_Bits = 8; // Number of data bits
int Stop_Bits = 1; // Number of stop bits
int Parity = 0; // Parity as follows:
// 00 = NONE, 01 = Odd, 02 = Even, 03 = Mark, 04 = Space
int Format = 4;
FILE *input;
FILE *output;
int status;
main(int Parm_Count, char *Parms[])
{
char version[80] = " POSIX compliant Communications test program version
1.00 4-25-1999rn";
char version1[80] = " Copyright(C) Mark Zehner/Peter Baumann 1999rn";
char version2[80] = " This code is based on a DOS based test program by Mark Zeh-
ner and a Serialrn";
char version3[80] = " Programming POSIX howto by Peter Baumann, integrated by
Mark Zehnerrn";
char version4[80] = " This program allows you to send characters out the speci-
fied port by typingrn";
char version5[80] = " on the keyboard. Characters typed will be echoed to the
console, and rn";
char version6[80] = " characters received will be echoed to the console.rn";
char version7[80] = " The setup parameters for the device name, receive data for-
mat, baud ratern";
char version8[80] = " and other serial port parameters must be entered on the
command line rn";
char version9[80] = " To see how to do this, just type the name of this program.
rn";
char version10[80] = " This program is free software; you can redistribute it
and/or modify itrn";
char version11[80] = " under the terms of the GNU General Public License as pub-
lished by the rn";
char version12[80] = " Free Software Foundation, version 2.rn";
char version13[80] = " This program comes with ABSOLUTELY NO WARRANTY.rn";
char instr[100] ="rnOn the command you must include six items in the following
order, they are:rn";
char instr1[80] =" 1. The device name Ex: ttyS0 for com1, ttyS1 for com2,
etcrn";
char instr2[80] =" 2. Baud Rate Ex: 38400 rn";
char instr3[80] =" 3. Number of Data Bits Ex: 8 rn";
char instr4[80] =" 4. Number of Stop Bits Ex: 0 or 1rn";
char instr5[80] =" 5. Parity Ex: 0=none, 1=odd, 2=evenrn";
char instr6[80] =" 6. Format of data received: 1=hex, 2=dec, 3=hex/asc,
4=dec/asc, 5=ascrn";
char instr7[80] =" Example command line: serial_chat ttyS0 38400 8 0 0 4 rn";
char Param_strings[7][80];
char message[90];
int fd, tty, c, res, i, error;
191
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
192. char In1, Key;
//place for old and new port settings for serial port
struct termios oldtio, newtio;
//place tor old and new port settings for keyboard teletype
struct termios oldkey, newkey;
struct sigaction saio; //definition of signal action
char buf[255]; //buffer for where data is put
input = fopen("/dev/tty", "r"); //open the terminal keyboard
output = fopen("/dev/tty", "w"); //open the terminal screen
if (!input || !output)
{
fprintf(stderr, "Unable to open /dev/ttyn");
exit(1);
}
error=0;
fputs(version,output); //display the program introduction
fputs(version1,output);
fputs(version2,output);
fputs(version3,output);
fputs(version4,output);
fputs(version5,output);
fputs(version6,output);
fputs(version7,output);
fputs(version8,output);
fputs(version9,output);
fputs(version10,output);
fputs(version11,output);
fputs(version12,output);
fputs(version13,output);
//read the parameters from the command line
if (Parm_Count==7)
//if there are the right number of parameters on the command line
{
for (i=1; i<Parm_Count; i++) // for all wild search parameters
{
strcpy(Param_strings[i-1],Parms[i]);
}
i=sscanf(Param_strings[0],"%s",devicename);
if (i != 1) error=1;
i=sscanf(Param_strings[1],"%li",&Baud_Rate);
if (i != 1) error=1;
i=sscanf(Param_strings[2],"%i",&Data_Bits);
if (i != 1) error=1;
i=sscanf(Param_strings[3],"%i",&Stop_Bits);
if (i != 1) error=1;
i=sscanf(Param_strings[4],"%i",&Parity);
if (i != 1) error=1;
i=sscanf(Param_strings[5],"%i",&Format);
if (i != 1) error=1;
192
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
193. sprintf(message,"Device=%s, Baud=%lirn",devicename, Baud_Rate);
//output the received setup parameters
fputs(message,output);
sprintf(message,"Data Bits=%i Stop Bits=%i Parity=%i Format=%irn",D-
ata_Bits, Stop_Bits, Parity, Format);
fputs(message,output);
} //end of if param_count==7
if ((Parm_Count==7) && (error==0)) //if the command line entrys were correct
{ //run the program
tty = open("/dev/tty", O_RDWR | O_NOCTTY | O_NONBLOCK);
//set the user console port up
tcgetattr(tty,&oldkey);
// save current port settings
//so commands are interpreted right for this program
// set new port settings for non-canonical input processing //must be NOCTTY
newkey.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newkey.c_iflag = IGNPAR;
newkey.c_oflag = 0;
newkey.c_lflag = 0; //ICANON;
newkey.c_cc[VMIN]=1;
newkey.c_cc[VTIME]=0;
tcflush(tty, TCIFLUSH);
tcsetattr(tty,TCSANOW,&newkey);
switch (Baud_Rate)
{
case 38400:
default:
BAUD = B38400;
break;
case 19200:
BAUD = B19200;
break;
case 9600:
BAUD = B9600;
break;
case 4800:
BAUD = B4800;
break;
case 2400:
BAUD = B2400;
break;
case 1800:
BAUD = B1800;
break;
case 1200:
BAUD = B1200;
break;
case 600:
BAUD = B600;
break;
case 300:
193
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
194. BAUD = B300;
break;
case 200:
BAUD = B200;
break;
case 150:
BAUD = B150;
break;
case 134:
BAUD = B134;
break;
case 110:
BAUD = B110;
break;
case 75:
BAUD = B75;
break;
case 50:
BAUD = B50;
break;
} //end of switch baud_rate
switch (Data_Bits)
{
case 8:
default:
DATABITS = CS8;
break;
case 7:
DATABITS = CS7;
break;
case 6:
DATABITS = CS6;
break;
case 5:
DATABITS = CS5;
break;
} //end of switch data_bits
switch (Stop_Bits)
{
case 1:
default:
STOPBITS = 0;
break;
case 2:
STOPBITS = CSTOPB;
break;
} //end of switch stop bits
switch (Parity)
{
case 0:
default: //none
PARITYON = 0;
194
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
195. PARITY = 0;
break;
case 1: //odd
PARITYON = PARENB;
PARITY = PARODD;
break;
case 2: //even
PARITYON = PARENB;
PARITY = 0;
break;
} //end of switch parity
//open the device(com port) to be non-blocking (read will return immediately)
fd = open(devicename, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd < 0)
{
perror(devicename);
exit(-1);
}
//install the serial handler before making the device asynchronous
saio.sa_handler = signal_handler_IO;
sigemptyset(&saio.sa_mask); //saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
// allow the process to receive SIGIO
fcntl(fd, F_SETOWN, getpid());
// Make the file descriptor asynchronous (the manual page says only
// O_APPEND and O_NONBLOCK, will work with F_SETFL...)
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); // save current port settings
// set new port settings for canonical input processing
newtio.c_cflag = BAUD | CRTSCTS | DATABITS | STOPBITS | PARITYON | PARITY |
CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
newtio.c_lflag = 0; //ICANON;
newtio.c_cc[VMIN]=1;
newtio.c_cc[VTIME]=0;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
// loop while waiting for input. normally we would do something useful here
while (STOP==FALSE)
{
status = fread(&Key,1,1,input);
if (status==1) //if a key was hit
{
switch (Key)
195
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
196. { /* branch to appropriate key handler */
case 0x1b: /* Esc */
STOP=TRUE;
break;
default:
fputc((int) Key,output);
// sprintf(message,"%x ",Key); //debug
// fputs(message,output);
write(fd,&Key,1); //write 1 byte to the port
break;
} //end of switch key
} //end if a key was hit
// after receiving SIGIO, wait_flag = FALSE, input is available and can be read
if (wait_flag==FALSE) //if input is available
{
res = read(fd,buf,255);
if (res>0)
{
for (i=0; i<res; i++) //for all chars in string
{
In1 = buf[i];
switch (Format)
{
case 1: //hex
sprintf(message,"%x ",In1);
fputs(message,output);
break;
case 2: //decimal
sprintf(message,"%d ",In1);
fputs(message,output);
break;
case 3: //hex and asc
if ((In1<32) || (In1>125))
{
sprintf(message,"%x",In1);
fputs(message,output);
}
else fputc ((int) In1, output);
break;
case 4: //decimal and asc
default:
if ((In1<32) || (In1>125))
{
sprintf(message,"%d",In1);
fputs(message,output);
}
else fputc ((int) In1, output);
break;
case 5: //asc
fputc ((int) In1, output);
break;
} //end of switch format
196
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
197. } //end of for all chars in string
} //end if res>0
// buf[res]=0;
// printf(":%s:%dn", buf, res);
// if (res==1) STOP=TRUE; /* stop loop if only a CR was input */
wait_flag = TRUE; /* wait for new input */
} //end if wait flag == FALSE
} //while stop==FALSE
// restore old port settings
tcsetattr(fd,TCSANOW,&oldtio);
tcsetattr(tty,TCSANOW,&oldkey);
close(tty);
close(fd); //close the com port
} //end if command line entrys were correct
else //give instructions on how to use the command line
{
fputs(instr,output);
fputs(instr1,output);
fputs(instr2,output);
fputs(instr3,output);
fputs(instr4,output);
fputs(instr5,output);
fputs(instr6,output);
fputs(instr7,output);
}
fclose(input);
fclose(output);
} //end of main
/***************************************************************************
* signal handler. sets wait_flag to FALSE, to indicate above loop that *
* characters have been received. *
***************************************************************************/
void signal_handler_IO (int status)
{
// printf("received SIGIO signal.n");
wait_flag = FALSE;
}
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĨāđ MakeïŽle āļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ serial_thread.c āļāļĩāđāļāļģāļāļēāļāļāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ x86 āđāļāļĒāļāļđāļāļāļąāđāļāļāđāļē
āļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļŦāđāđāļāđāđāļāļĢāđāļāļĢāļĄāļāļģāļŠāļąāđāļ gcc
#
# Makefile! : Serial chat sample Program
#
# CROSS_COMPILE=arm-linux-uclibc-
CC=$(CROSS_COMPILE)gcc
197
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
199. āļāļēāļĢāļēāļ 4.2 āļ§āļīāļāļĩāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāđāļāđāļāļāļāđāļēāļāđāļāļāļ IPC
M E T H O D D E S C R I P T I O N
File āļāļąāļāļāļķāļāđāļāđāļāđāļ§āđāđāļāļāļīāļŠāļāđ āđāļāļĒāļāļĩāđāđāļāļĢāđāļāļĢāļĄāļāļ·āđāļāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāđāļāđ
Signal
āđāļāđāļāļāļēāļĢāļŠāđāļāļŠāļąāļāļāļēāļāļāļāļāļĢāļ°āļāļāđāļāļĢāļ°āļāļąāļāļĨāđāļēāļāđāļāļāļąāļāļāļąāļāļŦāļ§āļ°āļāļāļāđāļāļĢāđāļāļŠ āđāļāļ·āđāļ
āļāļāļāđāļŦāđāđāļāļĢāđāļāļŠāļāļģāļāļēāļĄāļ§āļąāļāļāļļāļāļĢāļ°āļŠāļāļāđāļāļāļāļŠāļąāļāļāļēāļāļāļąāđāļāđ āļŦāļĢāļ·āļāļāļēāļāļāļ°āđāļāđ
āđāļāđāļāļāļēāļĢāļŠāđāļāļŠāļąāļāļāļēāļāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāđāļ§āļĒāļāļąāļ
Socket
āļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļĒāļąāļāđāļāļĢāļ·āļāļāđāļēāļĒāđāļāđāļāđāļ§āļīāļĢāđāļāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĢāļ·āđāļāļāđāļāļĩāļĒāļ§āļāļąāļāļŦāļĢāļ·āļāđāļāļĒāļąāļ
āļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļāļĢāļ·āđāļāļāļāļ·āđāļ
Pipe āļŠāļāļĢāļĩāļĄāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāļāļīāļāļāļēāļāđāļāļĩāļĒāļ§ āļŦāļĢāļ·āļ half duplex
Message queue āļŠāļāļĢāļĩāļĄāļāđāļāļĄāļđāļĨāļāļĩāđāđāļĄāđāļĢāļ°āļāļļāļāļĨāđāļēāļĒāļāļąāļāđāļāļāđ āđāļāđāđāļāđāļāđāļĨāļ°āđāļĢāļĩāļĒāļāļāđāļāļĄāļđāļĨāļāļēāļāđāļāđāļāđāļāđāļāļ
Named pipe āļāļģāđāļāļīāļāļāļēāļĢāļāđāļēāļāđāļāļĨāđāļāļāļĢāļ°āļāļāđāļāļĨāđāđāļāļāļĄāļēāļāļĢāļāļēāļ input āđāļĨāļ° output
Semaphore
āđāļāļĢāļŠāļĢāđāļēāļāļĄāļēāļāļĢāļāļēāļāļāļĩāđāļāļĢāļ°āļŠāļēāļ thread āļŦāļĢāļ·āļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĩāđāļāļĢāļ°āļāļģāļāļąāļ
āļāļĢāļąāļāļĒāļēāļāļĢāļāļĩāđāđāļāđāļĢāđāļ§āļĄāļāļąāļ
Shared memory
āđāļāđāļāļ§āļīāļāļĩāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāđāļ§āđāđāļāļŠāđāļ§āļāļāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāļāļĩāđāđāļāļĢāđāđāļŦāđāļāļąāļāđāļāļĢāđāļāļŠāļāļ·āđāļāđ
āđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāļāđāļāļĄāļđāļĨāļāļąāđāļāđāļāđ
Message passing (shared
nothing)
āđāļŦāļĄāļ·āļāļāļāļąāļ message queue
Memory-mapped ïŽle
āđāļĄāļāđāļāļĨāđāđāļāļĒāļąāļ RAM āđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāđāļāđāđāļāđāļāđāđāļāļĒāļāļēāļĢāđāļāļĨāļĩāđāļĒāļāļāļĩāđāļāļĒāļđāđāļŦāļāđāļ§āļĒāļāļ§āļēāļĄ
āļāļģāđāļāļĒāļāļĢāļ
Pipe
āđāļāļāđ (Pipe) āđāļāđāļāļāļĢāļ°āļāļ§āļāļāļēāļĢāļāļĩāđāđāļāđāđāļāļāļēāļĢāļāļīāļāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠāļāļĩāđāļāđāļēāļĒāļāļĩāđāļŠāļļāļāļāļ·āļāļāļēāļĢāļāļģāļāļĨāļĨāļąāļāļāđāļāļĩāđāđāļāđāļāļēāļ
āđāļāļĢāđāļāļĢāļĄāļŦāļāļķāđāļāđāļāđāļāđāļāļāļīāļāļāļļāļāļāļāļāļāļĩāļāđāļāļĢāđāļāļĢāļĄāļŦāļāļķāđāļ āđāļāļĒāđāļāļāđāļāļ°āđāļāđāļāļāļąāļ§āļāļĨāļēāļāđāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāđāļāļŠ
āļāļķāđāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāļāļ°āđāļāđāļāđāļāļāļāļīāļĻāļāļēāļāđāļāļĩāļĒāļ§ (unidirectional)
pfd[1]
āđāļāļĩāļĒāļāļïāļāļĄāļđāļĨāđāļāļĒāļąāļāļāļĨāļēāļĒāļāļēāļ
pfd[0]
āļïāļēāļāļïāļāļĄāļđāļĨāļāļģāđāļŦāļïāļāļāļĨāļēāļĒāļāļēāļ
Pipe
āļĢāļđāļāļāļĩāđ 4.4 āđāļŠāļāļāļāļēāļĢāļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļāļāļīāļĻāļāļēāļāđāļāļĩāļĒāļ§āļāđāļ§āļĒ Pipe
199
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
210. {
pthread_create( &thread_id[i], NULL, thread_function, NULL );
}
for(j=0; j < NTHREADS; j++)
{
pthread_join( thread_id[j], NULL);
}
// Now that all threads are complete I can print the final result.
// Without the join I could be printing a value before all the threads
// have been completed.
printf("Final counter value: %dn", counter);
}
void *thread_function(void *dummyPtr) {
printf("Thread number %ldn", pthread_self());
pthread_mutex_lock(&mutex1);
counter++;
pthread_mutex_unlock(&mutex1);
}
āļāļāļĄāđāļāļĨāđ āđāļĨāļ°āļāļāļŠāļāļāļĢāļąāļāđāļāļĢāđāļāļĢāļĄ
$ gcc -o simple_mutex simple_mutex.c âlpthread
$ ./simple_mutex
Thread number 139638417069824
Thread number 139638425462528
Thread number 139638442247936
Thread number 139638433855232
Thread number 139638408677120
Thread number 139638400284416
Thread number 139638391891712
Thread number 139638383499008
Thread number 139638375106304
Thread number 139638366713600
Final counter value: 10
āļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļŠāļ·āđāļāļŠāļēāļĢāļāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ
āļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļŠāđāļ§āļāđāļŦāļāđāļāļ°āļĄāļĩāļāļāļĢāđāļāļŠāļģāļŦāļĢāļąāļāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒ (Ethernet Port) āđāļāđāļāļāļ·āđāļ
āļāļēāļ āļĢāļ§āļĄāļāļąāđāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđāđāļāļāļāļąāļāļāļąāļ§āđāļāļāļāđāđāļāđāļāļąāļāđāļāļĢāļĩāļĒāļĄāđāļĨāļāļĢāļēāļĢāļĩāđāļĨāļ°āļāļļāļāđāļāļĢāđāļāļĢāļĄāļāļģāļŠāļąāđāļāļāļēāļāļāđāļēāļ
āļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒāđāļāđāļāļāļ·āđāļāļāļēāļāļāļĒāļđāđāļ āļēāļĒāđāļāđāļ§āđāđāļŦāđāđāļĨāđāļ§āđāļāđāļāļāļąāļ āļāļąāļāļāļąāđāļāļāļąāļāļāļąāļāļāļēāļŠāļēāļĄāļēāļĢāļāļāļģāđāļŦāđāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§
āļāļīāļāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāļāļāļĢāđāļāļāļ·āđāļāđ āļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļ·āđāļāđ āļŦāļĢāļ·āļāđāļāļĢāļ·āđāļāļāđāļĄāđāļāđāļēāļĒāļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļāļĢāļ°āļāļāđāļāļĢāļ·āļāļāđāļēāļĒāđāļāļĩāļĒāļ§āļāļąāļāđāļāđ
āđāļāļĒāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāđāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļķāļāļāđāļāļĄāļđāļĨāļāļĩāđāļĄāļĩāļāļāļēāļāđāļŦāļāđāļāļēāļāđāļ§āđāđāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđāļāļ·āđāļāđāļŦāļĢāļ·āļ
210
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
221. āļāļāļĄāđāļāļĨāđāļĨāļāļĢāđāļāļ°āđāļāļīāđāļĄāļāđāļāļĄāļđāļĨāļāļēāļāļāļĒāđāļēāļāļāļĩāđāļāļģāđāļāđāļāļāđāļāļāļēāļĢāļāļģāļāļēāļāļāļāļ gdb āļĨāļāđāļāđāļāļāļāļāđāļāļāđāļāļĨāđ (.o) āđāļĨāļ°
āđāļāļĢāđāļāļĢāļĄāļāļĩāđāđāļāđāļāļēāļāļāļēāļĢāļāļāļĄāđāļāļĨāđ (executable ïŽle) āļāļķāđāļ gdb āļāļ°āđāļāđāļāđāļāļĄāļđāļĨāđāļŦāļĨāđāļēāļāļąāđāļāđāļāļ·āđāļāļāļģāļāļ§āļāļŦāļēāļāļĢāļĢāļāļąāļ
āļāļāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāđāļŠāļāļāļāđāļāļĄāļđāļĨāļāđāļēāļāđāļāļāļāļĄāļē āļāļģāļŠāļąāđāļāļāļ·āđāļāļāļēāļāļāļāļ gdb āļāļĩāđāļāļīāļĒāļĄāđāļāđāļāļąāļāđāļāđāđāļāđ
āļāļēāļĢāļēāļ 4.4 āļāļąāļ§āļāļĒāđāļēāļāļāļģāļŠāļąāđāļāļāļēāļĢāļāļĩāļāļąāļāđāļāļĢāđāļāļĢāļĄāļāđāļ§āļĒāđāļāļĢāđāļāļĢāļĄ gdb
āļāļģāļŠāļąāđāļāđāļāđāļĄ āļāļģāļŠāļąāđāļāļĒāđāļ āļāļģāļāļāļīāļāļēāļĒ
run r āđāļĢāļīāđāļĄāđāļāļĢāđāļāļĢāļĄ
kill k āļŦāļĒāļļāļāđāļāļĢāđāļāļĢāļĄ
quit q āļāļāļāļāļēāļ GDB
continue c āļāļģāļāļēāļāļāđāļāđāļāļĒāļŦāļĒāļļāļāļāļĩāđ breakpoint āļāļąāļāđāļ
disassemble disass
āđāļŠāļāļ assembly code āļāļāļ function āļāļĩāđ EIP
āļāļĒāļđāđ
disassemble ADDR disass ADDR
āđāļŠāļāļ assembly code āļāļĩāđ address ADDR (āđāļāđ
āļāļ·āđāļ function āđāļāđ)
disassemble ADDR1 ADDR2 disass ADDR1 ADDR2
āđāļŠāļāļ assembly code āļāļĩāđ address ADDR1
āļāļķāļ ADDR2
info breakpoints i b āđāļŠāļāļ breakpoint āļāļąāđāļāļŦāļĄāļ
info registers i r āđāļŠāļāļāļāđāļēāļāļāļ CPU registers āļāļąāđāļāļŦāļĄāļ
info frame i f āđāļŠāļāļāļāđāļāļĄāļđāļĨāđāļāļĩāđāļĒāļ§āļāļąāļ stack frame āļāļąāļāļāļļāļāļąāļ
backtrace bt āđāļŠāļāļ call stack
break *ADDR b *ADDR
set breakpoint āļāļĩāđ address ADDR (āļāđāļēāđāļāđāļāļ·āđāļ
function āđāļĄāđāļāđāļāļāļĄāļĩ *)
enable [NUM] en [NUM] enable breakpoint āļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđ NUM
disable [NUM] dis [NUM] disable breakpoint āļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđ NUM
delete [NUM] d [NUM] delete breakpoint āļŦāļĄāļēāļĒāđāļĨāļāļāļĩāđ NUM
delete d delete breakpoint āļāļąāđāļāļŦāļĄāļ
nexti [num] ni [num] āļāļģāļāļēāļāļāļģāļŠāļąāđāļāļāļąāļāđāļ āđāļĄāđāđāļāđāļēāđāļāđāļ call
stepi [num] si [num] āļāļģāļāļēāļāļāļģāļŠāļąāđāļāļāļąāļāđāļ āđāļāđāļēāđāļāđāļ call
x/NFU ADDR
āđāļŠāļāļāļāđāļēāļāļāļ address ADDR āđāļāļĒ
N āļāļ·āļāļāļģāļāļ§āļāļāļĩāđāļāļ°āđāļŠāļāļāļāļĨ
F āļāļ·āļāļĢāļđāļāđāļāļāļāļĩāđāļāļ°āđāļŠāļāļāļāļĨ (āļāļđāļāļēāļĢāļēāļāļāļąāļāđāļ)
U āļāļ·āļāļāļģāļāļ§āļ byte āļĄāļĩ b (byte), h (2 bytes),
w (4 bytes), g (8 bytes)
display/F ADDR disp/F ADDR
āđāļŠāļāļāļāđāļēāļāļāļ address ADDR āļāļļāļāļāļĢāļąāđāļāļāļĩāđāļāļķāļāļŦāļĒāļļāļ
āļāļģāļāļēāļāļāļąāđāļ§āļāļĢāļēāļ§
display disp āđāļŠāļāļāļāđāļēāļāļĩāđāļāļĒāļđāđāđāļ display list āļāļąāđāļāļŦāļĄāļ
221
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
222. āļāļģāļŠāļąāđāļāđāļāđāļĄ āļāļģāļŠāļąāđāļāļĒāđāļ āļāļģāļāļāļīāļāļēāļĒ
undisplay [NUM] und [NUM] āļĨāļ display āļāļĩāđāđāļāđāļāđāļ§āđāļāļĩāđ NUM
set ADDR=VAL set āļāđāļē VAL āđāļāļāļĩāđ address ADDR
āļāļąāļ§āļāļĒāđāļēāļāļāļąāļāđāļāđāļāđāļāļāļēāļĢāļāļāļŠāļāļāļāļēāļĢāļāļĩāļāļąāļāđāļāļĢāđāļāļĢāļĄ factorial āđāļāļĒāđāļĢāļīāđāļĄāļāđāļāđāļŦāđāļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļąāļāļāļĩāđ
$ vim factorial.c
# include <stdio.h>
int main()
{
int i=0, num=0, j=1;
printf ("Enter the number: ");
scanf ("%d", &num );
for (i=1; i<num; i++)
j=j*i;
printf("The factorial of %d is %dn",num,j);
}
āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄ factorial āđāļāļĒāđāļŠāđāļāļąāļ§āđāļĨāļ·āļāļ -g āļāļąāļāđāļŠāļāļāđāļāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ gcc -g factorial.c
$ ./a.out
Enter the number: 10
The factorial of 10 is 362880
āđāļĢāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄ gdb āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
$ gdb ./a.out
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11~ppa1) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/student/unix/a.out...done.
āļāļāļŠāļāļāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļāđāļāļ·āđāļāļāļąāđāļāļāļģāđāļŦāļāđāļ breakpoint āđāļĨāļ° clear breakpoint āļāļķāđāļāļĄāļĩāļĢāļđāļāđāļāļāļāļēāļĢāđāļāđāļāļēāļāđāļāđ 2
āđāļāļāļāļ·āļāđāļāļāļāļĩāđ 1 āļŦāļĒāļļāļāđāļāļāļģāđāļŦāļāđāļāļāļĢāļĢāļāļąāļāļāļĩāđāļĢāļ°āļāļļ
break [file_name]:line_number
222
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
223. clear [file_name]:line_number
āđāļāļāļāļĩāđ 2 āļāļ·āļāļŦāļĒāļļāļāđāļāļāļģāđāļŦāļāđāļāļāļ·āđāļāļāļąāļāļāđāļāļąāļāļāļĩāđāļĢāļ°āļāļļ
break [file_name]:func_name
clear [file_name]:func_name
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļģāļŠāļąāđāļāļāļĩāļāļąāļāđāļāļĢāđāļāļĢāļĄ
(gdb) break 3
Breakpoint 2 at 0x40059c: file factorial.c, line 3.
(gdb) break 7
Breakpoint 2 at 0x4005c3: file factorial.c, line 7.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040059c in main at factorial.c:3
2 breakpoint keep y 0x00000000004005c3 in main at factorial.c:10
(gdb) run
Starting program: /home/student/unix/a.out
Breakpoint 2, main () at factorial.c:7
7! ! scanf ("%d", &num );
āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļ print [variables] āđāļāļ·āđāļāđāļŠāļāļāļāđāļēāļ āļēāļĒāđāļāļāļąāļ§āđāļāļĢāļāļāļ°āļāļĩāđāđāļāļĢāđāļāļĢāļĄāļāļģāļĨāļąāļāļāļģāļāļēāļāļāļĒāļđāđāđāļāđ
(gdb) print j
$1 = 1
(gdb) s
Enter the number: 3
9! ! for (i=1; i<num; i++)
(gdb) s
10! ! ! j=j*i;
(gdb) s
9! ! for (i=1; i<num; i++)
(gdb) s
10! ! ! j=j*i;
(gdb) print j
$2 = 1
(gdb) print i
$3 = 2
223
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
224. (gdb) break 10 if j==2
Note: breakpoint 1 also set at pc 0x4005e5.
Breakpoint 3 at 0x4005e5: file factorial.c, line 10.
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10
2 breakpoint keep y 0x000000000040059c in main at factorial.c:3
3 breakpoint keep y 0x00000000004005e5 in main at factorial.c:10
! stop only if j==2
(gdb) watch j==3
Hardware watchpoint 2: j == 3
(gdb) disass main
Dump of assembler code for function main:
0x0000000000400594 <+0>:!push %rbp
0x0000000000400595 <+1>:!mov %rsp,%rbp
0x0000000000400598 <+4>:!sub $0x10,%rsp
0x000000000040059c <+8>:!movl$0x0,-0x4(%rbp)
0x00000000004005a3 <+15>:! movl$0x0,-0x8(%rbp)
0x00000000004005aa <+22>:! movl$0x1,-0xc(%rbp)
0x00000000004005b1 <+29>:! mov $0x40070c,%eax
0x00000000004005b6 <+34>:! mov %rax,%rdi
0x00000000004005b9 <+37>:! mov $0x0,%eax
0x00000000004005be <+42>:! callq 0x400478 <printf@plt>
0x00000000004005c3 <+47>:! mov $0x40071f,%eax
0x00000000004005c8 <+52>:! lea -0x8(%rbp),%rdx
0x00000000004005cc <+56>:! mov %rdx,%rsi
0x00000000004005cf <+59>:! mov %rax,%rdi
0x00000000004005d2 <+62>:! mov $0x0,%eax
0x00000000004005d7 <+67>:! callq 0x400498 <__isoc99_scanf@plt>
0x00000000004005dc <+72>:! movl$0x1,-0x4(%rbp)
0x00000000004005e3 <+79>:! jmp 0x4005f3 <main+95>
=> 0x00000000004005e5 <+81>:" mov -0xc(%rbp),%eax
0x00000000004005e8 <+84>:! imul -0x4(%rbp),%eax
0x00000000004005ec <+88>:! mov %eax,-0xc(%rbp)
0x00000000004005ef <+91>:! addl$0x1,-0x4(%rbp)
...
0x0000000000400608 <+116>:! mov %rax,%rdi
0x000000000040060b <+119>:! mov $0x0,%eax
0x0000000000400610 <+124>:! callq 0x400478 <printf@plt>
0x0000000000400615 <+129>:! leaveq
0x0000000000400616 <+130>:! retq
End of assembler dump.
224
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
241. āđāļāđāļāļĨāđ main.cpp āļāļ°āļĄāļĩāļāļēāļĢāđāļāļĩāļĒāļāļĨāļāđāļāđāļāļāļąāļāļāđāļāļąāļ run() āđāļĨāļ°āļāļ°āļĄāļĩāļāļēāļĢāļŦāļĒāļļāļāđāļāļāļąāđāļ§āļāļāļ°āļāļĢāļ°āļĄāļēāļ 200 āļĄāļīāļĨāļĨāļī
āļ§āļīāļāļēāļāļĩ āļŦāļĨāļąāļāļāļēāļāļāļąāđāļāļāđāļāļ°āđāļŠāļāļāļāđāļāļāļ§āļēāļĄāļāļāļāļāļēāļāļŦāļāđāļēāļāļ āļāļąāļāđāļāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ vim main.cpp
// main.cpp
#include <QtCore/QCoreApplication>
#include <QTimer>
#include "writer.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Writer w1("One");
Writer w2("Two");
Writer w3("Three");
w1.start();
w2.start();
w3.start();
w1.wait();
w2.wait();
w3.wait();
QTimer::singleShot(12000, &a, SLOT(quit()));
return a.exec();
}
āļŠāļĢāđāļēāļāđāļāļĨāđāđāļāļĢāđāļāļ (.pro) āđāļĨāļ°āđāļāļĨāđ MakeïŽle āđāļāļ·āđāļāļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄ āļāļąāļāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ qmake -project
$ qmake
$ make
$ ./thread
Two Three One Two Three One Two Three One Three Two One Two One Three Two One
Three Three Two One Three One Two Two Three One Two Three One Two Three One
Two One Three Two One Three Two One Three Two One Three One Three Two One
Three Two One Three Two One Three Two One Three Two
2. āđāļāļ High Level āļāđāļ§āļĒ QConcurrent
QtConcurrent āđāļāđāļāļāļąāļ§ API āđāļāļĢāļ°āļāļąāļāļŠāļđāļ āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļ multi-threading āļāļ Qt
āļāļĩāđ āļāļ°āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāđāļāđāļāđāļēāļĒāļĒāļīāđāļāļāļķāđāļāđāļāļĒāļāļĩāđāđāļĄāđāļāđāļāļāļĨāļāļĨāļķāļāđāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļāļāđāļāļĢāļāđāļĨāļ°āļāļēāļĢāļāļąāļāļāļēāļĢāļāļģāļāļ§āļāđāļāļĢāļ
āļāđāļēāļāđ āđāļāļĒ QtConcurrent āđāļāđāļĢāļ§āļĄāđāļāļēāļāļąāļāļāđāļāļąāļāđāļ§āđāļŦāļĨāļēāļĒāļĢāļđāļāđāļāļāđāļāļ·āđāļāđāļŦāđāđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļģāđāļāļāļĢāļ°āļĒāļļāļāļāđāđāļāđ
241
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
242. āļāļąāļāļāļēāļāđāļāļāđāļĄāđāļāļĢāļāļāļąāļāļŦāļ§āļ°āļāļąāļ (asynchronous task) āđāļāļĒāđāļāļāļēāļ°āđāļāđāļāļĢāđāļāļĢāļĄāđāļāļāļāļĢāļēāļāļāļīāļāļāļīāļāļāđāļāļāļąāļāļāļđāđāđāļāđ
(GUI applications)
QtConcurrent::run() āļāļ°āļāļģāļāļēāļĢāđāļĢāļĩāļĒāļāļāļąāļāļāđāļāļąāļāļāļķāđāļāļĄāļēāļ āļēāļĒāđāļ thread āļāļĩāđāļŠāļĢāđāļēāļāļāļķāđāļāļĄāļēāđāļŦāļĄāđ
extern void aFunction();
extern void bFunction();
QFuture<void> future1 = QtConcurrent::run(aFunction);
QFuture<void> future2 = QtConcurrent::run(bFunction);
āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļĨāļēāļŠ QFuture āđāļĨāļ° QFutureWatcher āđāļāļāļēāļĢāļāļĢāļ§āļāļŠāļāļāļŠāļāļēāļāļ°āļāļāļāļāļąāļāļāđāļāļąāļāļāļĩāđāļāļđāļāđāļĢāļĩāļĒāļāđāļāđāļēāđāļ
āđāļāđāļāļĢāļāđāļāđāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
#include <QCoreApplication>
#include <qtconcurrentrun.h>
#include <QThread>
#ifndef QT_NO_CONCURRENT
void myRunFunction(QString name) {
for (int i = 0; i <= 5; i++) {
qDebug() << name << " " << i << "from" << QThread::currentThread();
}
}
int main(int argc, char *argv[]) {
QCoreApplication a(argc, argv);
QFuture<void> t1 = QtConcurrent::run(myRunFunction, QString("A"));
QFuture<void> t2 = QtConcurrent::run(myRunFunction, QString("B"));
QFuture<void> t3 = QtConcurrent::run(myRunFunction, QString("C"));
t1.waitForFinished();
t2.waitForFinished();
t3.waitForFinished();
return a.exec();
}
#else
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString text("Qt Concurrent is not yet supported on this platform");
QLabel *label = new QLabel(text);
label->setWordWrap(true);
label->show();
242
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
243. qDebug() << text;
app.exec();
}
#endif
āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđāđāļāļĢāđāļāļ (.pro) āđāļĨāđāļ§āđāļāļīāđāļĄāđāļĨāļāļĢāļēāļĢāļĩ concurrent āđāļāđāļēāđāļāđāļāđāļāļĨāđāđāļāļĢāđāļāđāļ āļāļąāļāļāļģāļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ qmake -project
$ echo âCONFIG += concurrentâ >> qtconcurrent.pro
āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđ MakeïŽle āđāļĨāļ°āļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄ āđāļāļ·āđāļāļāļāļŠāļāļāļāļēāļĢāļāļģāļāļēāļāļāļāļ multi-threading āļāļąāļāļāļģ
āļŠāļąāđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
$ qmake
$ make
$ ls
main.cpp main.o Makefile qtconcurrent qtconcurrent.pro
$ ./qtconcurrent
"B" 0 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 1 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 2 from QThread(0x128d1c0, name = "Thread (pooled)")
"A" 0 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 1 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 2 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 3 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 4 from QThread(0x128cb10, name = "Thread (pooled)")
"A" 5 from QThread(0x128cb10, name = "Thread (pooled)")
"B" 3 from QThread(0x128d1c0, name = "Thread (pooled)")
"B" 4 from QThread(0x128d1c0, name = "Thread (pooled)")
"C" 0 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 1 from QThread(0x128cb10, name = "Thread (pooled)")
"B" 5 from QThread(0x128d1c0, name = "Thread (pooled)")
"C" 2 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 3 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 4 from QThread(0x128cb10, name = "Thread (pooled)")
"C" 5 from QThread(0x128cb10, name = "Thread (pooled)")
243
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
260. āļāļāļāļāļēāļāļāļąāđāļāđāļāļĢāļ°āļŦāļ§āđāļēāļāđāļĢāļĩāļĒāļ envsetup.sh āļāđāļāļ°āļĄāļĩāļāļēāļĢāļĢāļąāļāļāļģāļŠāļąāđāļ source vendorsetup.sh,
vendor/*/vendorsetup.sh, vendor/*/*/vendorsetup.sh āđāļĨāļ°Â device/*/*/
vendorsetup.sh āđāļāļ·āđāļāļāļāļļāļāļēāļāđāļŦāđāđāļāļīāđāļĄāļĢāļēāļĒāļāļ·āđāļāļāļĨāļīāļāļ āļąāļāļāđāļāļĩāđāļāļąāļāļāļąāļāļāļēāļāļģāļŦāļāļāļāļķāđāļāđāļāļāļāļĩāļāļāđāļ§āļĒ āļāļąāļ§āļāļĒāđāļēāļ
āđāļāđāļ Samsung Maguro product āļāļĩāđāļāļĒāļđāđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ device/samsung/maguro
#
#
 Copyright
 (C)
 2011
 The
 Android
 Open
 Source
 Project
#
#
 Licensed
 under
 the
 Apache
 License,
 Version
 2.0
 (the
 "License");
#
 you
 may
 not
 use
 this
 file
 except
 in
 compliance
 with
 the
 License.
#
 You
 may
 obtain
 a
 copy
 of
 the
 License
 at
#
#
Â
Â
Â
Â
Â
 http://www.apache.org/licenses/LICENSE-Ââ2.0
#
#
 Unless
 required
 by
 applicable
 law
 or
 agreed
 to
 in
 writing,
 software
#
 distributed
 under
 the
 License
 is
 distributed
 on
 an
 "AS
 IS"
 BASIS,
#
 WITHOUT
 WARRANTIES
 OR
 CONDITIONS
 OF
 ANY
 KIND,
 either
 express
 or
 implied.
#
 See
 the
 License
 for
 the
 specific
 language
 governing
 permissions
 and
#
 limitations
 under
 the
 License.
#
Â
add_lunch_combo
 full_maguro-Ââuserdebug
āļāļāļŠāļāļāđāļĢāļĩāļĒāļāļāļģāļŠāļąāđāļ shell script āļāļĩāđāļāļđāļāļāļąāđāļāļāđāļēāļāļēāļāđāļāļĨāđ envsetup.sh
$ hmm
Invoke ". build/envsetup.sh" from your shell to add the following functions to your
environment:
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
Look at the source to view more functions. The complete list is:
addcompletions add_lunch_combo cgrep check_product check_variant choosecombo choose-
product choosetype choosevariant cproj croot findmakefile gdbclient
get_abs_build_var getbugreports get_build_var getprebuilt gettop godir hmm is-
viewserverstarted jgrep key_back key_home key_menu lunch _lunch m mm mmm pid print-
config print_lunch_menu resgrep runhat runtest set_java_home setpaths set_se-
quence_number set_stuff_for_environment settitle smoketest startviewserver
stopviewserver systemstack tapas tracedmdump
āļāļąāđāļāļāļāļāļāļąāļāđāļāđāļāđāļāļāļēāļĢāđāļĨāļ·āļāļāļāļāļĢāđāļ target (āļāļķāđāļāđāļāļāļĩāđāļāļĩāđāļāļ°āđāļĨāļ·āļāļāļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ x86) āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
$ lunch
You're building on Linux
Lunch menu... pick a combo:
260
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
277. {
printk(KERN_INFO "Hello world! 1n");
return 0;
}
void cleanup_module(void)
{
printk(KERN_ALERT "Cleaning up module 1n");
}
āļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļĢāļĄ hello1.c
// hello1.c
// Defining __KERNEL__ and MODULE allows us to access kernel-level code not usually
available to userspace programs.
#undef __KERNEL__
#define __KERNEL__
#undef MODULE
#define MODULE
// Linux Kernel/LKM headers: module.h is needed by all modules and kernel.h is
needed for KERN_INFO.
#include <linux/module.h> // included for all kernel modules
#include <linux/kernel.h> // included for KERN_INFO
#include <linux/init.h> // included for __init and __exit macros
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Wiroon Sriborrirux EE-Burapha, 2013");
MODULE_DESCRIPTION("Demo module");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello world! 2n");
return 0; // Non-zero return means that the module couldn't be loaded.
}
static void __exit hello_cleanup(void)
{
printk(KERN_INFO "Cleaning up module 2n");
}
module_init(hello_init);
module_exit(hello_cleanup);
āļāļģāļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđ MakeïŽle āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļŠāļĢāđāļēāļāļāļķāđāļ āļāļąāļāļāļĩāđ
$ vim Makefile
VERSION = 3
PATCHLEVEL = 4
277
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
278. SUBLEVEL = 0
EXTRAVERSION=
obj-m += hello.o hello1.o
all:
make -C /home/student/aosp/goldfish/ M=$(PWD) modules
clean:
make -C /home/student/aosp/goldfish/ M=$(PWD) clean
āļāđāļāļāļāļ°āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĄāļāļđāļĨ hello āļāļģāđāļāđāļāļāļ°āļāđāļāļāļāļāļĄāđāļāļĨāđ Kernel āđāļāļ·āđāļāđāļŦāđāļāļĢāđāļāļĄāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļāđāļāļēāļāđāļĄāļāļđāļĨ
āļāđāļ§āļĒāļāļģāļŠāļąāđāļ
$ cd ~/aosp/goldfish/
$ make ARCH=x86
CROSS_COMPILE=~/aosp/prebuilts/gcc/linux-x86/x86/i686-android-linux-4.
4.3/bin/i686-android-linux- modules_prepare
make[1]: Nothing to be done for `all'.
make[1]: Nothing to be done for `relocs'.
CHK include/linux/version.h
CHK include/generated/utsrelease.h
CC kernel/bounds.s
GEN include/generated/bounds.h
CC arch/x86/kernel/asm-offsets.s
GEN include/generated/asm-offsets.h
CALL scripts/checksyscalls.sh
CC scripts/mod/empty.o
MKELF scripts/mod/elfconfig.h
HOSTCC scripts/mod/file2alias.o
HOSTCC scripts/mod/modpost.o
HOSTCC scripts/mod/sumversion.o
HOSTLD scripts/mod/modpost
āđāļĢāļīāđāļĄāļāļēāļĢāļāļāļĄāđāļāļĨāđ kernel module āļāļĩāđāđāļāđāļŠāļĢāđāļēāļāđāļ§āđ (hello.c)
$ cd ~/aosp/goldfish/my_modules/
$ make
make -C /home/student/aosp/goldfish/ M=/home/student/aosp/goldfish-
/custom_modules modules
make[1]: Entering directory `/home/student/aosp/goldfish'
CC [M] /home/student/aosp/goldfish/custom_modules/hello.o
CC [M] /home/student/aosp/goldfish/custom_modules/hello1.o
Building modules, stage 2.
MODPOST 2 modules
CC /home/student/aosp/goldfish/custom_modules/hello.mod.o
LD [M] /home/student/aosp/goldfish/custom_modules/hello.ko
CC /home/student/aosp/goldfish/custom_modules/hello1.mod.o
LD [M] /home/student/aosp/goldfish/custom_modules/hello1.ko
make[1]: Leaving directory `/home/student/aosp/goldfish'
$ ls
278
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
292. # service call statusbar 2
Result: Parcel(00000000 '....')
292
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
293. āļāļģāļŠāļąāđāļ dumpsys āļāļ·āļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļĩāđāđāļāđāļŠāļģāļŦāļĢāļąāļāđāļĢāļĩāļĒāļāļāļđāļāđāļāļĄāļđāļĨāļ āļēāļĒāđāļāļŠāļāļēāļāļ°āļāđāļēāļāđ āļāļāļāļāļąāļ§āđāļŦāđāļāļĢāļīāļāļēāļĢāļāļāļāļĢāļ°āļāļ
(system service) āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļŦāļāđāļ§āļĒāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĨāļēāļ āļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģ āđāļāļāđāļāļāļĢāļĩāđ āļāļąāļ§āđāļāđāļāļāđāļāļĄāļđāļĨ āđāļāđāļāļāđāļ
$ adb shell dumpsys | grep "DUMP OF SERVICE"
Output Command
DUMP OF SERVICE SurfaceFlinger:
DUMP OF SERVICE accessibility:
DUMP OF SERVICE account:
DUMP OF SERVICE activity:
DUMP OF SERVICE alarm:
DUMP OF SERVICE appwidget:
DUMP OF SERVICE audio:
DUMP OF SERVICE backup:
DUMP OF SERVICE battery:
DUMP OF SERVICE batteryinfo:
DUMP OF SERVICE clipboard:
DUMP OF SERVICE commontime_management:
DUMP OF SERVICE connectivity:
DUMP OF SERVICE content:
DUMP OF SERVICE country_detector:
DUMP OF SERVICE cpuinfo:
DUMP OF SERVICE dbinfo:
DUMP OF SERVICE device_policy:
DUMP OF SERVICE devicestoragemonitor:
DUMP OF SERVICE diskstats:
DUMP OF SERVICE drm.drmManager:
DUMP OF SERVICE dropbox:
DUMP OF SERVICE entropy:
DUMP OF SERVICE gfxinfo:
DUMP OF SERVICE hardware:
DUMP OF SERVICE input:
DUMP OF SERVICE input_method:
DUMP OF SERVICE iphonesubinfo:
DUMP OF SERVICE isms:
DUMP OF SERVICE location:
DUMP OF SERVICE lock_settings:
DUMP OF SERVICE media.audio_flinger:
DUMP OF SERVICE media.audio_policy:
DUMP OF SERVICE media.camera:
DUMP OF SERVICE media.player:
DUMP OF SERVICE meminfo:
DUMP OF SERVICE mount:
DUMP OF SERVICE netpolicy:
DUMP OF SERVICE netstats:
DUMP OF SERVICE network_management:
DUMP OF SERVICE notification:
DUMP OF SERVICE package:
DUMP OF SERVICE permission:
DUMP OF SERVICE phone:
DUMP OF SERVICE power:
DUMP OF SERVICE samplingprofiler:
DUMP OF SERVICE scheduling_policy:
DUMP OF SERVICE search:
DUMP OF SERVICE sensorservice:
DUMP OF SERVICE serial:
DUMP OF SERVICE servicediscovery:
DUMP OF SERVICE simphonebook:
DUMP OF SERVICE statusbar:
DUMP OF SERVICE telephony.registry:
DUMP OF SERVICE textservices:
293
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
294. DUMP OF SERVICE throttle:
DUMP OF SERVICE uimode:
DUMP OF SERVICE updatelock:
DUMP OF SERVICE usagestats:
DUMP OF SERVICE usb:
DUMP OF SERVICE vibrator:
DUMP OF SERVICE wallpaper:
DUMP OF SERVICE wifi:
DUMP OF SERVICE wifip2p:
DUMP OF SERVICE window:
$ adb shell dumpsys battery
Current Battery Service state:
AC powered: true
USB powered: false
status: 2
health: 2
present: true
level: 50
scale: 100
voltage:0
temperature: 0
technology: Li-ion
$ adb shell dumpsys wifi
Wi-Fi is disabled
Stay-awake conditions: 1
Internal state:
current HSM state: DriverUnloadedState
mLinkProperties LinkAddresses: [] Routes: [] DnsAddresses: []
mWifiInfo SSID: <none>, BSSID: <none>, MAC: <none>, Supplicant state: UNINITIALIZED,
RSSI: -9999, Link speed: -1, Net ID: -1, Metered hint: false
mDhcāļāļēfoInternal addr: null/0 mRoutes: dns: null,null dhcpServer: null leaseDura-
tion: 0
mNetworkInfo NetworkInfo: type: WIFI[], state: UNKNOWN/IDLE, reason: (unspecified),
extra: (none), roaming: false, failover: false, isAvailable: false
mLastSignalLevel -1
mLastBssid null
mLastNetworkId -1
mReconnectCount 0
mIsScanMode false
Supplicant status
null
mLastPriority -1
Configured networks
Latest scan results:
Locks acquired: 0 full, 0 full high perf, 0 scan
Locks released: 0 full, 0 full high perf, 0 scan
Locks held:
Scan count since last plugged in
WifiWatchdogStateMachine dump
WatchdogStatus: State:
android.net.wifi.WifiWatchdogStateMachine$NotConnectedState@b444f100mWifiInfo:
[null]
mLinkProperties: [null]
mCurrentSignalLevel: [0]
mArpCheckIntervalMs: [120000]
mRssiFetchIntervalMs: [1000]
mWalledGardenIntervalMs: [1800000]
294
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
295. mNumArppings: [5]
mMinArpResponses: [1]
mArppingTimeoutMs: [100]
mPoorNetworkDetectionEnabled: [true]
mWalledGardenTestEnabled: [true]
mWalledGardenUrl: [http://clients3.google.com/generate_204]
WifiStateMachine dump
WifiStateMachine:
total messages=3
msg[0]: time=09-21 16:03:00.308 state=DefaultState orgState=DriverUnloadedState
what=69632(0x11000)
msg[1]: time=09-21 16:03:00.389 state=DefaultState orgState=DriverUnloadedState
what=131085(0x2000d)
msg[2]: time=09-21 16:03:00.408 state=DefaultState orgState=DriverUnloadedState
what=131147(0x2004b)
curState=DriverUnloadedState
$ adb shell dumpsys cpuinfo
Load: 3.24 / 1.4 / 0.51
CPU usage from 533936ms to 513149ms ago:
23% 2477/system_server: 22% user + 0.7% kernel / faults: 625 minor
4.8% 2445/surfaceflinger: 4.6% user + 0.1% kernel / faults: 592 minor
1.5% 2634/android.process.acore: 1.4% user + 0% kernel / faults: 252 minor
1.9% 2782/android.process.media: 1.7% user + 0.1% kernel / faults: 125 minor
1.7% 2619/com.android.launcher: 1.4% user + 0.2% kernel / faults: 145 minor
1.5% 2570/com.android.inputmethod.latin: 1.3% user + 0.1% kernel / faults: 141 mi-
nor
1.4% 2708/com.android.deskclock: 1.3% user + 0% kernel / faults: 150 minor
1.3% 2765/com.android.email: 1.3% user + 0% kernel / faults: 106 minor
1.3% 2851/com.android.providers.calendar: 1.3% user + 0% kernel / faults: 148 mi-
nor
1.3% 2552/com.android.systemui: 1.2% user + 0% kernel / faults: 60 minor
0.9% 2731/com.android.contacts: 0.8% user + 0% kernel / faults: 160 minor
1% 2589/com.android.phone: 0.8% user + 0.1% kernel / faults: 55 minor
0.7% 2681/zygote: 0.6% user + 0% kernel / faults: 160 minor
0.9% 2805/com.android.exchange: 0.9% user + 0% kernel / faults: 120 minor
0.5% 2659/com.android.smspush: 0.4% user + 0% kernel / faults: 165 minor
0.8% 2878/com.android.calendar: 0.8% user + 0% kernel / faults: 99 minor
0.5% 806/adbd: 0% user + 0.5% kernel / faults: 11 minor
0.1% 2428/mediaserver: 0% user + 0% kernel / faults: 27 minor
0% 4/events/0: 0% user + 0% kernel
0% 783/servicemanager: 0% user + 0% kernel
+0% 2900/sh: 0% user + 0% kernel
+0% 2902/dumpsys: 0% user + 0% kernel
48% TOTAL: 45% user + 3.3% kernel
$ adb shell dumpsys meminfo
Applications Memory Usage (kB):
Uptime: 9118113 Realtime: 9118113
Total PSS by process:
22980 kB: system (pid 2477)
19899 kB: com.android.settings (pid 2681)
19648 kB: com.android.launcher (pid 2619)
12665 kB: com.android.systemui (pid 2552)
8792 kB: com.android.phone (pid 2589)
7504 kB: com.android.contacts (pid 2731)
7085 kB: com.android.inputmethod.latin (pid 2570)
6619 kB: android.process.acore (pid 2634)
5815 kB: com.android.email (pid 2765)
5402 kB: android.process.media (pid 2782)
295
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
299. 10 KB/s (547 bytes in 0.050s)
$ adb shell
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar
-version
DalvikVM version 1.6.0
Copyright (C) 2007 The Android Open Source Project
This software is built from source code licensed under the Apache Licen-
se,Version 2.0 (the "License"). You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
See the associated NOTICE file for this software for further details.
Dalvik VM init failed (check log file)
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar
-classpath /data/CmdLine.jar org.apache.Hello
Hello World!
am (Activity Manager)
āļāļģāļŠāļąāđāļ am āļāļ°āļŠāļēāļĄāļēāļĢāļāđāļāđāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļāļāļāļīāļ§āļīāļāļĩāđ (activities) āđāļāđāļ āđāļĢāļĩāļĒāļāđāļŦāđāļāļģāļāļēāļ āļŠāļąāđāļāļŦāļĒāļļāļāļāļēāļĢāļāļģāļāļēāļ
āđāļĨāļ°āđāļāđāļēāļāļđāļŠāļāļēāļāļ°āļāļēāļĢāļāļģāļāļēāļ āđāļāđāļāļāđāļ
# am
usage: am [subcommand] [options]
usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]
[--R COUNT] [-S] [--opengl-trace] <INTENT>
am startservice <INTENT>
am force-stop <PACKAGE>
am kill <PACKAGE>
am kill-all
am broadcast <INTENT>
....
[--activity-single-top] [--activity-clear-task]
[--activity-task-on-home]
[--receiver-registered-only] [--receiver-replace-pending]
[--selector]
[<URI> | <PACKAGE> | <COMPONENT>]
# am start com.android.deskclock .Clock
Starting: Intent { act=android.intent.action.MAIN
cat=[android.intent.category.LAUNCHER] pkg=com.android.deskclock }
Warning: Activity not started, its current task has been brought to the front
299
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
300. # am start -a android.intent.action.MAIN -n
com.android.browser/.BrowserActivity
Starting: Intent { action=android.intent.action.MAIN
comp={com.android.browser/com.android.browser.BrowserActivity} }
Warning: Activity not started, its current task has been brought to the front
# am start -a android.intent.action.MAIN -n
com.android.settings/.Settings
Starting: Intent { action=android.intent.action.MAIN
comp={com.android.settings/com.android.settings.Settings} }
āļāļģāļŠāļąāđāļāđāļāļāļēāļĢāļāļąāļāļāļēāļĢāđāļāđāļāđāļāđāļ (package manager)
# pm list package
package:android
package:com.android.backupconfirm
package:com.android.bluetooth
package:com.android.browser
package:com.android.calculator2
....
package:com.android.wallpaper.holospiral
package:com.android.wallpaper.livepicker
package:com.example.myapp
package:com.svox.pico
package:jp.co.omronsoft.openwnn
300
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
301. āđāļĄāļ·āđāļāļāđāļāļāļāļēāļĢāļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄ (.apk) āđāļāļīāđāļĄ āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļģāļŠāļąāđāļ pm install āđāļāđāļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
# pm install /sdcard/com.twitter.android-1.apk
āļāļĢāļ§āļāļŠāļāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāđāļāđāļāļīāļāļāļąāđāļāđāļāļāđāļāļāļŦāļāđāļēāļāļĩāđ
# pm list packages | grep twitter
āđāļŠāļāļāđāļāđāļĢāļāļāļāļĢāļĩ āļāļĩāđāđāļāđāļāđāļāļĢāđāļāļĢāļĄāļāļĩāđāđāļāđāļāļīāļāļāļąāđāļāđāļ
# pm path com.twitter.android
āļāļģāļŠāļąāđāļ svc (service control) āđāļāđāļŠāļģāļŦāļĢāļąāļāļāļđāļŠāļāļēāļāļ°āļāļēāļĢāļāļģāļāļēāļāđāļĨāļ°āļāļ§āļāļāļļāļĄāļāļēāļĢāļāļģāļāļēāļāļāļāļāļāļĢāļīāļāļēāļĢāļ āļēāļĒāđāļ
# svc help
Available commands:
help Show information about the subcommands
power Control the power manager
data Control mobile data connectivity
wifi Control the Wi-Fi manager
usb Control Usb state
# svc power
Control the power manager
usage: svc power stayon [true|false|usb|ac]
Set the 'keep awake while plugged in' setting.
# svc data
Control mobile data connectivity
usage: svc data [enable|disable]
Turn mobile data on or off.
svc data prefer
Set mobile as the preferred data network
# svc wifi
Control the Wi-Fi manager
usage: svc wifi [enable|disable]
Turn Wi-Fi on or off.
svc wifi prefer
Set Wi-Fi as the preferred data network
# svc usb
Control Usb state
usage: svc usb setFunction [function]
Set the current usb function.
svc usb getFunction
Gets the list of currently enabled functions
301
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
311. āļāļēāļĢāļĒāđāļēāļĒāđāļāđāļāđāļāļĢāđāļāļĢāļĄāđāļāļīāļĄ ECLIPSE IDE āļĄāļēāļŠāļđāđ ANDROID STUDIO
āđāļāļ·āđāļāļāļāļēāļāļāļąāļāļāļąāļāļāļēāđāļāļĒāļļāļāđāļĢāļāđāļāļ°āļĄāļĩāļāļ§āļēāļĄāļāļļāđāļāđāļāļĒāļāļąāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāđāļ§āļĒāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļąāļāļāļē Eclipse
IDE āļāļąāļāļāļąāđāļāđāļĄāļ·āđāļāļāđāļāļāļāļēāļĢāļĒāđāļēāļĒāđāļāđāļāđāļāļĢāđāļāđāļāđāļāļīāļĄāļāļĩāđāđāļāļĒāļāļąāļāļāļēāļāļĒāļđāđāļāļ Eclipse IDE āļĄāļēāļŠāļđāđ Android Studio IDE
āļāļ°āļĄāļĩāļāļąāđāļāļāļāļāļāļēāļĢāļĒāđāļēāļĒāđāļāđāļāđāļāļĢāđāļāđāļāļāļąāļāļāļĩāđ
āļāļąāđāļāļāļāļāļāļĩāđ 1: Export āđāļāļĢāđāļāļĢāļĄāđāļāļīāļĄāļāļēāļ Eclipse IDE
1. āļāļģāļāļēāļĢāđāļāļīāļāđāļāļĢāđāļāļāđāļĨāļ°āļāļąāļāđāļāļ ADT Plugin (āđāļ§āļāļĢāđāļāļąāļ 22.0 āļŦāļĢāļ·āļāļŠāļđāļāļāļ§āđāļē)
2. āđāļĨāļ·āļāļāđāļĄāļāļđ File > Export
3. āđāļāļĢāđāļāļĢāļĄāļāļ°āđāļŠāļāļāļŦāļāđāļēāļāđāļēāļāļāļķāđāļāļĄāļē āđāļŦāđāđāļĨāļ·āļāļ Generate Gradle build ïŽles āļ āļēāļĒāđāļ Android āļāļēāļāļāļąāđāļ
āļāļāļāļļāđāļĄ Finish
āļĢāļđāļāļāļĩāđ 6.11 āđāļŠāļāļāļŦāļāđāļēāļāđāļēāļāļāļēāļĢāļŠāļĢāđāļēāļ Gradle build ïŽles
āļāļąāđāļāļāļāļāļāļĩāđ 2: Import āđāļāļĢāđāļāļĢāļĄāđāļāđāļēāļŠāļđāđ Android Studio
1. āđāļāļīāļāđāļāļĢāđāļāļĢāļĄ Android Studio āđāļĨāļ·āļāļāđāļĄāļāļđ File > Import Project
2. āļāļēāļāļāļąāđāļāđāļĨāļ·āļāļāđāļāļĒāļąāļāļāļĩāđāļāļĒāļđāđāđāļāļĢāđāļāļ āđāļĨāļ·āļāļ build.gradle āļāļēāļāļāļąāđāļāļāļāļāļļāđāļĄ Finish
3. āđāļŦāđāđāļĨāļ·āļāļāļāļēāļĄ Dialog āļāļĩāđāđāļŠāļāļāļāļēāļāļāļąāđāļāļāļ OK
311
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
312. APACHE ANT āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāđāļāļāļāļĢāļāļĒāļāđ
Apache Ant āļāļ·āļāđāļāļĢāļ·āđāļāļāļĄāļ·āļāļŠāļģāļŦāļĢāļąāļāđāļāđāđāļāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĨāļ°āļŠāļĢāđāļēāļāđāļāļĢāđāļāļĢāļĄ JAVA āđāļāļĒāļāļąāļāļāļąāļāļāļē
āđāļāļĢāđāļāļĢāļĄāļŠāļēāļĄāļēāļĢāļāļŠāļĢāđāļēāļāļŠāļāļĢāļīāļāļāđ (Script) āđāļāļĢāļđāļāđāļāļ XML āļāļĩāđāļĄāļĩāļāļēāļĢāļĢāļ°āļāļļ packages āļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļāđāļāļ·āđāļāļŠāļąāđāļāđāļŦāđ
āđāļāļĢāđāļāļĢāļĄ ant āļāļģāļāļēāļĢāļāļāļĄāđāļāļĨāđāđāļĨāļ°āļŠāļĢāđāļēāļāļāļāļāļĄāļēāđāļāđāļāđāļāļĢāđāļāļĢāļĄ .APK (Android Package) āđāļāđāđāļŦāļĄāļ·āļāļāļāļąāļ
āļāļēāļĢāļŠāļĢāđāļēāļāđāļāļĨāđ MakeïŽle āđāļĨāļ°āđāļāđāļāļģāļŠāļąāđāļ âmakeâ āđāļāļĢāļ°āļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ
āđāļĄāļ·āđāļāđāļāđāļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄ Ant (http://ant.apache.org) āļŠāļēāļĄāļēāļĢāļāļāļāļŠāļāļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļāļ·āđāļ
āļāļēāļ (srcantTest.java) āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļ
package ant;
class Test {Â Â
public static void main(String args[]) Â
{Â Â Â Â
System.out.println("Hello World from ANT"); Â Â
}
}
āļŠāļāļĢāļīāļāļāđāđāļāļĨāđ srcantbuild.xml
<project basedir="." default="make">Â
<property name="root" value="../.." />
 <property name="classes" value="${root}/classes" />Â
 <property name="srcroot" value="${root}/src" />
 <path id="project.class.path">
  <pathelement location="${classes}" />  Â
   </path>
 <target name="make">Â
  <javac debug="true" srcdir="${srcroot}" includes="ant/**/*.java"
destdir="${classes}">
  </javac>
 </target>
 <target name="run" depends="make" description="Run Test">Â
  <java classname="ant.Test" classpathref="project.class.path" fork="true">
  </java>
 </target>Â
 <target name="clean" description="clean all classes">
  <delete dir="${classes}/ant"/>
 </target>
</project>
<?xml version="1.0" encoding="UTF-8"?>
āļāļāļĄāđāļāļĨāđāđāļĨāļ°āļŠāļĢāđāļēāļāđāļāļĢāđāļāļĢāļĄāļāļāļāļĄāļēāđāļāđāļ .APK
C:...srcant>ant make
Buildfile: build.xml
make:
312
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
313. BUILD SUCCESSFUL
Total time: 0 seconds
C:...srcant>ant run
Buildfile: build.xml
make:
run:
    [java] test ANT
BUILD SUCCESSFUL
Total time: 0 seconds
C:...srcant>ant clean
Buildfile: build.xml
clean:
  [delete] Deleting directory C:...classesant
BUILD SUCCESSFUL
Total time: 0 seconds
āđāļāļĨāđāđāļāļĢāđāļāļĢāļĄ (.APK) āļāļ°āļāļđāļāļŠāļĢāđāļēāļāđāļāđāļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩ bin āļāļđāđāđāđāļāđāļŠāļēāļĄāļēāļĢāļāļāļģāđāļāļĨāđ .APK āđāļāļāļīāļāļāļąāđāļāļĨāļāđāļ An-
droid Emulator āļŦāļĢāļ·āļāļāļļāļāļāļĢāļāđāđāļāļāļāļĢāļāļĒāļāđ āđāļāļĒāđāļāđāļāļģāļŠāļąāđāļ adb install <āļāļ·āđāļāđāļāļĢāđāļāļĢāļĄ>.apk
ANDROID ACTIVITY
āļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāđāļāļāļāļĢāļāļĒāļāđ : āđāļāļāļāļīāļ§āļīāļāļĩāđ (Activity)
āđāļāļāļāļīāļ§āļīāļāļĩāđ (Activity) āļĄāļĩāļāļ§āļēāļĄāļŠāļģāļāļąāļāļĄāļēāļāļŠāļģāļŦāļĢāļąāļāđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđ āđāļāļĢāļēāļ°āđāļāđāļāļŠāđāļ§āļāļāļĩāđāđāļāđāļāļīāļāļāđāļāļāļąāļāļāļđāđāđāļāđ
āļāđāļēāļ UI āļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
UI Activity
Service
Operating
System
āļŠāđāļ broadcast
Intent
āļāļēāļĢ Intent
āđāļāļĒāļāļĢāļ
āļĢāļđāļāļāļĩāđ 6.12 āđāļŠāļāļāļāļĨāđāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļĢāđāļāļĢāļĄāļ āļēāļĒāđāļāđāļāļāļāļĢāļāļĒāļāđ
āđāļāđāļĨāļ° activity āļāļ°āđāļāļāļŦāļāļķāđāļāļŦāļāđāļēāļāđāļēāļāļāļĩāđāļāļ°āđāļŠāļāļāļāļķāđāļāļāļāļŦāļāđāļēāļāļāđāļāļāļāļ°āļāļąāđāļāļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
313
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
317. āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļāļāļīāļ§āļīāļāļĩāđ
āļāļēāļāđāļāđāļāļāļąāļ§āļāļĒāđāļēāļāļāļąāļāļāđāļāđāļāļāļĩāđāļāļ°āđāļāđāļāļāļēāļĢāļāļāļīāļāļēāļĒāļŦāļĨāļąāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāđāļāļāļāļīāļ§āļīāļāļĩāđāđāļŦāđāđāļāđāļēāđāļāđāļāđāļāđāļēāļĒāļāļķāđāļ āđāļāļĒāļāļ°
āļĄāļĩāļāļēāļĢāļāļģāļāļēāļāļāļēāļĄ Lifecycle āļāļĩāđāđāļāđāļāļāļīāļāļēāļĒāđāļĨāđāļ§āļāđāļēāļāļāđāļ
public class ActivityA extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_a);
Log.d("Embedded Debugâ, onCreate - Called when the Activity is first createdâ);
}
@Override
protected void onStart() {
Log.d("Embedded Debugâ, onStart - Called when the Activity is becoming
visible to the Userâ);
super.onStart();
}
@Override
protected void onRestart() {
Log.d("Embedded Debugâ, onRestart - Called after your activity has been
stopped, prior to it being started againâ);
super.onRestart();
}
@Override
protected void onResume() {
Log.d("Embedded Debugâ, onResume - Called when the Activity will start in-
teracting with the Userâ);
super.onResume();
}
@Override
protected void onPause() {
Log.d("Embedded Debugâ, onPause - Called when the system is about to start
resuming a previous activityâ);
super.onPause();
}
@Override
protected void onStop() {
Log.d("Embedded Debugâ, onStop - Called when the Activity is no longer visi-
ble to the User because another activity has been resumed and is covering this
oneâ);
super.onStop();
}
@Override
protected void onDestroy() {
317
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
318. Log.d("Embedded Debugâ, onDestroy - the final call you receive before your
activity is destroyedâ);
super.onDestroy();
}
public void startActivityB(View v) {
Intent intent = new Intent(ActivityA.this, ActivityB.class);
startActivity(intent);
}
public void startActivityC(View v) {
Intent intent = new Intent(ActivityA.this, ActivityC.class);
startActivity(intent);
}
public void finishActivityA(View v) {
ActivityA.this.finish();
}
}
āđāļāļĨāđ AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dark_blue"
android:padding="8dip"
>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
>
<Button
android:id="@+id/btn_start_b"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_start_b_label"
android:onClick="startActivityB"
/>
<Button
android:id="@+id/btn_start_c"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:text="@string/btn_start_c_label"
318
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
336. MyBroadCast mybroadcast = new MyBroadCast();
registerReceiver(myboradcast,intentfilter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
// MyBroadCast..java
package com.example.demoeebuubroadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyBroadCast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)) {
int state = intent.getIntExtra("state", -1);
switch (state) {
case 0:
Toast.makeText(context, "Headset is unplugged", Toast.LENGTH_LONG).show();
break;
case 1:
Toast.makeText(context, "Headset is plugged", Toast.LENGTH_LONG).show();
break;
default:
Toast.makeText(context, "Unknow", Toast.LENGTH_LONG).show();
}
}
}
}
āļāļēāļĢāđāļŠāļāļāļāļĨ (āļāđāļēāļāļāđāļēāļĒāđāļĄāđāđāļāđāļāđāļāļŦāļđāļāļąāļ āļāđāļēāļāļāļ§āļēāļāđāļāļŦāļđāļāļąāļ)
336
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
352. JVM SIGNATURE JAVA TYPE
Z boolean
B byte
C char
S short
I int
J long
F float
D double
V void
Lclass āļāļ·āđāļāļāļĨāļēāļŠ
[type āļāļāļīāļāļāļąāļ§āđāļāļĢ
(arg-type)ret-type āļāļāļīāļāļāļąāļ§āđāļāļĢāļāļāļāļāļēāļāļīāļ§āđāļĄāđāļāļāđ āđāļĨāļ°āļāļēāļĢāļāļ·āļāļāđāļēāļāļĨāļąāļ
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāđāļāļēāļ
āļāļąāļāļāđāļāļąāļ SIGNATURE
void fun1() fun1()V
int fun2(int n, long l) fun2(IJ)I
long fun3(int n, String s, int[] arr) fun3(ILjava/lang/String;[I)J
boolean fun4(int[] arr) fun4([I)Z
double fun5(String s, int n) fun5(Ljava/lang/String;I)D
void fun6(int n, String[] arr, char c) fun6(I[Ljava/lang/String;C)V
long fun7(int n, String s, int[] arr) fun7(ILjava/lang/String;[I)J
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļŠāļĢāđāļēāļāđāļĨāļ°āđāļĢāļĩāļĒāļāđāļāđ JNI METHODS
āļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄ native (C/C++) āđāļāļĒāļāļĩāđāļĄāļĩāļāļēāļĢāļŠāļĢāđāļēāļāļāļąāļāļāđāļāļąāļāđāļĨāđāļ§āļāļģāļāļēāļĢāļĨāļāļāļ°āđāļāļĩāļĒāļāđāļāļĒāļąāļ Dalvik
VM āļāđāļ§āļĒāļāļąāļāļāđāļāļąāļ RegisterNatives āļāļāļ JNI āđāļāļ·āđāļāđāļŦāđāđāļāļĢāđāļāļĢāļĄāļāļĢāļ°āļĒāļļāļāļāđāļ āļēāļĐāļēāļāļēāļ§āļē āļāļāđāļāļāļāļĢāļāļĒāļāđ
āļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļāđ āļĄāļĩāļāļąāđāļāļāļāļāļāļēāļĢāļāļąāļāļāļēāļāļąāļāļāļĩāđ
352
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
367. āļĢāļđāļāļāļĩāđ 7.1 āđāļŠāļāļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāđāļēāļāđāļāļąāļāļāļāļĢāđāļ Raspberry Pi
āļāļāļĢāđāļ Raspberry Pi āļŠāļēāļĄāļēāļĢāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļļāļāļāļĢāļāđāļāđāļēāļāđāļāđāļŦāļĨāļēāļĒāļŦāļĨāļēāļāļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļāļ āļāļķāđāļ
āđāļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļĩāđāđāļĄāđāļāđāļāļāļāļēāļĢāđāļāļĢāļ·āđāļāļ Host āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāđāļāđāļāļ°
āļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļāđāļ§āļĒāđāļāļĢāđāļāļĢāļĄ Arduino IDE āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāđāļāļĢāđāļāļĢāļĄāļ āļēāļĐāļē C āđāļāļ·āđāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄ
āđāļāļīāļĢāđāļĄāđāļ§āļĢāđ (ïŽrmware) āļŠāļģāļŦāļĢāļąāļāđāļĄāđāļāļĢāļāļāļāđāļāļĢāđāļĨāļāļĢāđ ATMEL āļāļĩāđāđāđāļāđāđāļāļāļāļĢāđāļ Arduino āļŦāļĢāļ·āļāđāļāļĢāđāļāļĢāļĄāļ āļēāļĐāļē
āļāļ·āđāļāđ āđāļāđāļ āļ āļēāļĐāļēPython āļāđāļ§āļĒāđāļāļĢāđāļāļĢāļĄ Python IDE āļ āļēāļĐāļēāđāļāļīāļĢāđāļĨ (Perl) āļ āļēāļĐāļēāđāļāļŠāļīāļ (Basic) āļŦāļĢāļ·āļ āļ āļēāļĐāļē
C++ āđāļāđāļāļāđāļ
āļāļāļĢāđāļ Raspberry Pi āļĒāļąāļāļĢāļāļāļĢāļąāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļāļĩāđāđāļāđāļāļāļĩāđāļāļīāļĒāļĄāļāļĒāļđāđāđāļāļāļąāļāļāļļāļāļąāļ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļĢāļ°āļāļ
āļāļāļīāļāļąāļāļīāļāļēāļĢ Debian GNU/Linux, Fedora, FreeBSD, NetBSD, Plan 9, Raspbian OS, RISC OS āđāļĨāļ°
Slackware Linux āļāļāļāļāļēāļāļāļąāđāļāļāļāļĢāđāļāļāļĩāđāļāđāļĒāļąāļāđāļŦāļĄāļēāļ°āļāļąāļāļāļēāļĢāļāļģāđāļāļāļĢāļ°āļĒāļļāļāļāđāļāļģāđāļāđāļāđāļāļĢāļ·āđāļāļ Media server
āļŦāļĢāļ·āļ Set-top-box āļŠāļģāļŦāļĢāļąāļāļāļēāļāļāļēāļāļāđāļēāļāļĄāļąāļĨāļāļīāļĄāļĩāđāļāļĩāļĒ āļāļąāļāļāļąāļ§āļāļĒāđāļēāļāđāļāļĢāđāļāļ OpenELEC (Open Embedded
367
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
368. Linux Entertainment Center) āļāļĩāđāļĄāļĩāļāļēāļĢāļāļģāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāļĨāļĩāļāļļāļāļāđ āļĄāļēāļāļĢāļąāļāđāļāđāļāđāļŠāđāđāļāļĢāđāļāļĢāļĄ XBMC
media center āđāļĨāđāļ§āļāļģāļĄāļēāļāļīāļāļāļąāđāļāđāļāļāļāļĢāđāļ Raspberry Pi
āļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļāļēāļāļāļāļĢāđāļ RaspBerry Pi
āđāļāļāđāļēāļāļāļēāļĢāļĻāļķāļāļĐāļē āļāļāļĢāđāļ Raspberry Pi āļŠāļēāļĄāļēāļĢāļāđāļāđāđāļāđāļāļāļāļĢāđāļāļŠāļĢāđāļēāļāđāļĢāļāļāļąāļāļāļēāļĨāđāļāđāļŦāđāļāļąāļāđāļāđāļ āļŦāļĢāļ·āļ
āļāļąāļāļĻāļķāļāļĐāļē āļāļĩāđāļĄāļĩāļāļ§āļēāļĄāļŠāļāđāļāđāļāļāļēāļĢāļāļģāđāļāļŠāļĢāđāļēāļāđāļāđāļāļāļāļāđāļĨāđāļ āļŦāļĢāļ·āļāđāļāđāđāļāļāļēāļĢāļāļ§āļāļāļļāļĄāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāđāļēāļāđāļāđ
āļĢāļđāļāļāļĩāđ 7.2 āļāļēāļĢāļāļģ Raspberry Pi āđāļāđāļāđāđāļāļāļēāļĢāļŠāļāļāļ āļēāļĒāđāļāđāļĢāļāđāļĢāļĩāļĒāļ
āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđāđāļāļāļēāļāļāđāļēāļāļāļļāļāļŠāļēāļŦāļāļĢāļĢāļĄ āļāļāļĢāđāļ Raspberry Pi āđāļāļāļāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāđāļĄāđāļāđāļāļĒāļāļēāļāđāļŦāļĨāđāļē
āļāļąāļāļāļąāļāļāļē āđāļāļ·āđāļāļāļāļēāļāļĄāļĩāļāļ§āļēāļĄāļĒāļ·āļāļŦāļĒāļļāđāļāđāļāļāļēāļĢāđāļĨāļ·āļāļāđāļāđāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāļĩāđāļāļ°āļāļģāļĄāļēāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļĨāļāļ āļēāļĒāđāļ
āļāļāļĢāđāļāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļīāļāļāļąāđāļāđāļĨāļāļĢāļēāļĢāļĩāļāļīāđāļĻāļĐāđāļāļīāđāļĄāđāļāļīāļĄāļĨāļāđāļāđāļāđ āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ āļāļāļĢāđāļ Data Acquisition (DAQ),
Mini Super Computer āļāļąāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
āļĢāļđāļāļāļĩāđ 7.3 āļāļēāļĢāļāļģ Raspberry Pi āđāļāļāļĢāļ°āļĒāļļāļāļāđāđāļāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļāļēāļ
368
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
369. āđāļāļ§āļāļēāļāļāļēāļĢāļāļąāļāļāļēāļāļāļāļāļĢāđāļ Raspberry Pi
āļāļąāđāļāđāļāđāđāļāļāļāļĩāļāļāļāļāļķāļāļāļąāļāļāļļāļāļąāļāļĄāļĩāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļŠāļģāļŦāļĢāļąāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāđāļĨāļ°āđāļāđāļāļāļāļĢāđāļāļāļĢāļ°āļĒāļļāļāļāđ
(Evaluation Kit) āļāļāļāļĄāļēāļāļģāļāļ§āļāļĄāļēāļāļĄāļēāļĒ āļāļķāđāļāļŠāđāļ§āļāđāļŦāļāđāļāļ°āļāđāļāļāļĄāļĩāļāļēāļĢāđāļāļĢāļĩāļĒāļĄāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ (Host) āđāļ§āđ
āļāļĩāļāđāļāļĢāļ·āđāļāļāļŠāļģāļŦāļĢāļąāļāļāļīāļāļāļąāđāļ āđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļąāļāļāļē cross-compiling toolchains āđāļĨāļ°āļāļļāļāđāļāļĢāđāļāļĢāļĄāļŠāļģāļŦāļĢāļąāļāđāļāđāđāļ
āļāļēāļĢāļāļąāļāļāļēāļ āļēāļĐāļēāđāļāļĢāđāļāļĢāļĄāļāđāļēāļāđ āļāļāļāļāļēāļāļāļąāđāļāļāļ°āļāđāļāļāđāļāļĢāļĩāļĒāļĄāļŠāļēāļĒāđāļāđāļāļīāļĨāđāļāļāļŠāļēāļĒāļāļāļļāļāļĢāļĄ (Serial cable)
āđāļāļ·āđāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāđāļēāļāļāļāļĢāđāļāļāļāļāđāļāļĨ (console) āđāļāļ·āđāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ
āļ āļēāļĒāđāļāļāļāļĢāđāļāļāđāļēāļāļŦāļāđāļēāļāļāđāļāļāļĢāđāļĄāļīāļāļąāļĨāđāļĨāļ°āļŠāļēāļĄāļēāļĢāļāļāļīāļĄāļāđāļāļļāļāļāļģāļŠāļąāđāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāđāļēāļāđ āļŦāļĢāļ·āļāđāļāļ·āđāļāļāļĩāļāļąāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄ
āđāļāđ
āđāļāđāļāđāļ§āļĒāļ§āļīāļāļĩāļāļēāļĢāļāļąāļāļāļĩāđāļāļĨāđāļēāļ§āļĄāļēāļāđāļēāļāļāđāļāļāđāļĒāļąāļāļŠāļĢāđāļēāļāļāļ§āļēāļĄāļĒāļļāđāļāļĒāļēāļāđāļĄāđāļāđāļāļĒāđāļŦāđāļāļąāļāļāļąāļāļāļąāļāļāļēāļĄāļ·āļāđāļŦāļĄāđāļāļąāđāļāļŦāļĨāļēāļĒ āđāļāđ
āđāļĄāļ·āđāļāļĄāļēāļāļķāļāļĒāļļāļāļāļēāļĢāļĄāļēāļāļāļāļāļāļĢāđāļ Raspberry Pi āļāļģāđāļŦāđāļāļąāļāļāļąāļāļāļēāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāđāļĨāļ°āļāļģāļāļēāļĢāļāļāļĄ
āđāļāļĨāđāđāļāļĢāđāļāļĢāļĄāļāļĒāļđāđāļāļāļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāđāļāđāļāļąāļāļāļĩ āđāļāļĒāđāļāļĩāļĒāļāļāļģāļāļāļĢāđāļ Raspberry Pi āļĄāļēāļāđāļāļāļąāļāļāļāļĄāļāļāļīāđāļāļāļĢāđ
āļāļĩāļĒāđāļāļāļĢāđāļ āđāļĨāļ°āđāļĄāļēāļŠāđ āđāļāđāļēāļāļąāđāļ āļāļāļāļāļēāļāļāļąāđāļāļāļąāļāļāļąāļāļāļēāļāđāļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļāļģāļāļēāļĢ remote āļŦāļāđāļēāļāļ (Remote
Desktop) āļāđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ (Host) āđāļāļĒāđāļāđāđāļāļĢāđāļāļĢāļĄ VNC (āļŦāļĢāļ·āļ ssh āđāļāļāļĢāļāļĩ text mode)
āđāļāđāļēāđāļāļĒāļąāļāļāļāļĢāđāļ Raspberry Pi āđāļāđāđāļāđāļāļāļąāļ āļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ
āđāļāļĢāļ·āđāļāļ Host
Ethernet Hub
āļāļāļĢāđāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§ (Target)
āļŠāļēāļĒ RS-232
āļŠāļēāļĒ LAN
ARM, PowerPC, MIPS
(Linux OS)
x86, x86_64
(Desktp OS)
āļŠāļēāļĒ LAN
āļĢāļđāļāļāļĩāđ 7.4 āļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļļāļāļāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āđāļāļāļāļąāđāļ§āđāļ
Ethernet Hub
āļāļāļĢāđāļ RaspBerry Pi (Target)
āļŠāļēāļĒ LAN
āļŠāļēāļĒ LAN
Remote Desktop (vnc)
Remote Login (ssh)
āđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ
āļŠāļēāļĒ RS-232
HDMI
āļĢāļđāļāļāļĩāđ 7.5 āļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļļāļāļāļĢāļāđāļŠāļģāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļēāļĢāļ°āļāļāļŠāļĄāļāļāļāļĨāļāļąāļāļāļąāļ§āļāļāļ Raspberry Pi
369
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
370. āļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļīāļāļąāļāļīāļāļēāļĢāļ āļēāļĒāđāļ Raspberry Pi āļāđāļēāļāđāļāļĢāđāļāļĢāļĄ Secure Shell (ssh)
āļāļēāļĢāļāļīāļāļāļąāđāļāđāļĨāļ°āđāļāļīāļāļāļēāļĢāđāļāđāļāļēāļ ssh (secure shell) āđāļāđāļāļāļēāļĢāļŠāļĢāđāļēāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ command line
āļĢāļ°āļĒāļ°āđāļāļĨ āļāđāļēāļāļāļēāļāđāļāļĢāđāļāļāļāļĨ ssh āļĢāļ°āļŦāļ§āđāļēāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ āđāļĨāļ°āļāļāļĢāđāļ Raspberry Pi āļ§āļīāļāļĩāļāļēāļĢāļāļīāļāļāļąāđāļāļĄāļĩ
āļāļąāļāļāļĩāđ
$ sudo raspi-config
āļĢāļđāļāļāļĩāđ 7.6 āđāļŠāļāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāļāļ Raspberry Pi āļāđāļēāļāļāļģāļŠāļąāđāļ raspi-conïŽg
āđāļĨāđāļ§āđāļĨāļ·āļāļāđāļĄāļāļđ SSH āđāļĨāđāļ§āļāļąāđāļāļāđāļēāđāļŦāđāđāļāđāļ ENABLE āļāļąāļāđāļ
āļāļāļŠāļāļāđāļāļīāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļĒāļ°āđāļāļĨāļāļēāļāđāļāļĢāļ·āđāļāļāļāļ·āđāļāļāđāļēāļ ssh client āđāļāļĒāļąāļāļāļāļĢāđāļ Raspberry Pi (IP Ad-
dress: 10.20.4.222 āļāđāļ§āļĒāļāļ·āđāļāļāļđāđāđāļāđ pi)
(āļāļēāļāđāļāļĢāļ·āđāļāļ Mac)$ ssh 10.20.4.222 -l pi
370
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
371. āđāļāļīāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļĒāļ°āđāļāļĨāļāļēāļāđāļāļĢāļ·āđāļāļāļāļ·āđāļāļāđāļēāļ ssh client āđāļāļĒāļąāļāļāļāļĢāđāļ Raspberry Pi āļāđāļ§āļĒāđāļāļĢāđāļāļĢāļĄ Putty
āļāļāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ Windows
āļĢāļđāļāļāļĩāđ 7.7 āļŦāļāđāļēāļāļēāđāļāļĢāđāļāļĢāļĄ PuTTY āđāļāļŠāđāļ§āļāļŦāļāđāļēāđāļŠāļāļāļāļēāļĢāļāļąāđāļāļāđāļēāļāđāļēāļāđ
āļāļģāļāļēāļĢāđāļŠāđāđāļāļāļĩāđāļāļāđāļāļĨāļŠāļāļāļāļāļāļĢāđāļ Raspberry PI āđāļĨāđāļ§āđāļĨāļ·āļāļ Open āļāļēāļāļāļąāđāļāļāļ°āđāļāđāļēāđāļāļāļĩāđāļŦāļāđāļē
terminal āđāļŦāđāļāļģāļāļēāļĢ login : pi āđāļĨāļ° password : raspberry āļāđāļāļāļēāļāļāļąāđāļāļāđāļāļ°āđāļāđāļēāļŠāļđāđāļŦāļāđāļē terminal āļāļāļ
Raspbian āđāļāļĒāļŠāļĄāļāļđāļĢāļāđ
āļĢāļđāļāļāļĩāđ 7.8 āļŦāļāđāļēāļāđāļēāļāđāļāļĢāđāļāļĢāļĄ Terminal āđāļāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļĨāđāļāļāļāļīāļāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļ
371
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
372. āļāļēāļĢāđāļāđāļēāļŠāļđāđāļĢāļ°āļāļāļāļīāļāļąāļāļīāļāļēāļĢāļ āļēāļĒāđāļ Raspberry Pi āļāđāļēāļāđāļāļĢāđāļāļĢāļĄ VNC (Remote Desktop)
āđāļĢāļīāđāļĄāļāđāļāļāđāļ§āļĒāļāļēāļĢāļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄ VNC server āļāļ·āđāļāļ§āđāļē tightvncserver āļĨāļāđāļāđāļēāđāļāđāļāļāļāļĢāđāļ Raspberry
Pi āļāđāļ§āļĒāļāļģāļŠāļąāđāļāļāļąāļāļāļĩāđ
$ sudo apt-get install tightvncserver
āļāļģāļāļēāļĢāđāļāļīāļāļāļĢāļīāļāļēāļĢāđāļāļĢāđāļāļĢāļĄ VNC server āļāļĢāđāļāļĄāļĢāļ°āļāļļāļāļāļēāļāļāļāļāļŦāļāđāļēāļāļ Raspberry Pi
$ vncserver :1 -geometry 1024x786 -depth 16 -pixelformat rgb565
āļŠāļģāļŦāļĢāļąāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ āđāļŦāđāļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄ VNC viewer (āļĢāļāļāļĢāļąāļāļŦāļĨāļēāļĒāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢ) āđāļĨāđāļ§
āļĢāļ°āļāļļ IP āļāļāļāđāļāļĢāļ·āđāļāļ Raspberry Pi āļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļāļāļĩāđ
āļĢāļđāļāļāļĩāđ 7.9 āđāļŠāļāļāļāļēāļĢ Remote Desktop āđāļāđāļēāđāļāļĒāļąāļāļāļāļĢāđāļ Raspberry Pi
372
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
373. GPIOs āļ āļēāļĒāđāļāļāļāļĢāđāļ Raspberry PI
GPIO āđāļāđāļāļŦāļāļķāđāļāđāļāļāļļāļāļŠāļĄāļāļąāļāļīāļāļīāđāļĻāļĐāļāļĩāđāļāļāļĢāđāļ Raspberry Pi āđāļāļīāļāđāļŦāđāļāļąāļāļāļąāļāļāļēāļŠāļēāļĄāļēāļĢāļāđāļāđāļāļēāļāđāļāđ āđāļĄāđāļ§āđāļē
āļāļļāļāļŠāļĄāļāļąāļāļīāļāļēāļāļāļĒāđāļēāļāļĄāļĩāđāļĄāđāļāļĢāļāđāļŦāļĄāļ·āļāļāļāļāļĢāđāļāđāļĄāđāļāļĢāļāļāļāđāļāļĢāļĨāđāļĨāļāļĢāđāļāļąāđāļ§āđāļāđāļāđāļāđāđāļāļĩāļĒāļāļāļāļāļĩāđāļāļ°āļŠāļĢāđāļēāļāđāļāļĢāđāļāļĢāļĄ
āļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļĄāļēāļāļĄāļēāļĒ āđāļāļĢāļēāļ°āļāļąāļ§āļāļāļĢāđāļ Raspberry Pi āđāļāļāļāļąāđāļāļāđāļ§āļĒāļāļļāļāļŠāļĄāļāļąāļāļīāļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāđāļāļ
āļāļāļĢāđāļāđāļŦāļĄāļ·āļāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ Host āđāļĄāļ·āđāļāļāļ§āļāļāļąāļāļāļēāļĢāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļēāļāļķāļ GPIOs āļāđāļēāļāđāđāļāđāļāđāļēāļĒ āļāđāļĒāļīāđāļāļāļģāđāļŦāđ
āļāļąāļāļāļąāļāļāļēāļĄāļ·āļāđāļŦāļĄāđāļāļāļāļķāļāļĢāļ°āļāļąāļāļāļĨāļēāļāļŠāļ°āļāļ§āļāđāļĨāļ°āļāđāļēāļĒāļāđāļāļāļēāļĢāļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄāļŦāļĢāļ·āļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāđāļāļāļĒāđāļēāļāļāļĩ
āļāļķāļāļāļģāđāļŦāđāļāļāļĢāđāļ Raspberry Pi āđāļāđāļāļāļĩāļāļŦāļāļķāđāļāļāļāļĢāđāļāļāļĩāđāđāļāđāļĢāļąāļāļāļ§āļēāļĄāļāļīāļĒāļĄāđāļāđāļāļāļĒāđāļēāļāļŠāļđāļ
āļĢāļđāļāļāļĩāđ 7.10 āļāļģāđāļŦāļāđāļ GPIO āļāļāļāļāļĢāđāļ Raspberry Pi
āđāļāļĒāļāļąāđāļ§āđāļ GPIO (General purpose I/O) āļāļāļāļāļāļĢāđāļ Raspberry Pi āļāļ°āļāļĒāļđāđāļāļĢāļāļŠāđāļ§āļāļāļē (āļāļē) P1 āļāļķāđāļāļĄāļĩ
āļāļģāļāļ§āļāļāļāļāļāļē 2x13 āļŦāļĢāļ·āļ 26 āļāļē āđāļāļĒāļāļēāļāļąāđāļāļŦāļĄāļāđāļĄāđāđāļāđāļĄāļĩāđāļāđ GPIO āđāļāļĩāļĒāļāļāļĒāđāļēāļāđāļāļĩāļĒāļ§ āđāļāđāļāļĢāļ°āļāļāļāđāļāļāđāļ§āļĒ
SPI, I2C, serial UART, āđāļāđāļĨāļĩāđāļĒāļ 3.3 V, āđāļāđāļĨāļĩāđāļĒāļ 5 V āđāļĨāļ° GND
āļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļ GPIO āļāļāļāļāļāļĢāđāļ Raspberry Pi
-P1 āļĄāļĩāļāļģāļāļ§āļ 26 āļāļē āļĄāļĩāļĢāļ°āļĒāļ°āļŦāđāļēāļāļĢāļ°āļŦāļ§āđāļēāļāļāļē 2.54 āļĄāļĄ. (100 mil)
-āđāļāļēāļāļļāļāļāđāļāļāļāđāļāđāļĨāļ°āļāļē āļāļ°āļāļĒāļđāđāđāļāļāđāļ§āļ 0-3.3V āđāļĨāļ°āļāļīāļāļāļļāļāđāļĄāđāļāļ§āļĢāļĄāļēāļāļāļ§āđāļē 3.3 V āļāđāļē
āļĄāļĩāļāļīāļāļāļļāļāļāļĩāđāđāļāđāļ 5 V āļāļ§āļĢāļāđāļēāļāļ§āļāļāļĢāļāļĢāļąāļāđāļĢāļāļāļąāļāđāļŦāđāđāļāđāļ 3.3V āļāđāļāļāļāļĩāđāđāļāđāļēāļĄāļēāļāļĩāđāļāļēāļāļīāļāļāļļāļ
-āđāļāđāļĨāļĩāđāļĒāļ 3.3 V āļŠāļēāļĄāļēāļĢāļāļāđāļēāļĒāļāļĢāļ°āđāļŠāđāļāđāđāļĄāđāđāļāļīāļ 50 mA
-āđāļāđāļĨāļĩāđāļĒāļ 5V āļŠāļēāļĄāļēāļĢāļāļāđāļēāļĒāļāļĢāļ°āđāļŠāđāļāđāđāļĄāđāđāļāļīāļ 100 mA
-āļĄāļĩāļāļīāļāļīāļāļāļĨ āļāļīāļāļāļļāļ/āđāļāļēāļāļļāļ 8 āļāļē
-āļĄāļĩ I2C 2 āļāļē
-āļĄāļĩ SPI 5 āļāļē
373
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
379. āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļĢāļ°āļĒāļļāļāļāđāļāļāļĢāđāļ Raspberry Pi āđāļŦāđāđāļāđāļ Web Server
āļāļāļāļāļēāļāđāļāļĩāļĒāļāđāļāđāļāđāļāļĢāđāļāļĢāļĄāļŦāļĢāļ·āļāđāļāđāļāļģāļŠāļąāđāļāđāļāļ·āđāļāđāļāđāļēāļāļķāļ GPIO āļāļāļāļāļāļĢāđāļ Raspberry Pi āđāļĨāđāļ§ āļāļąāļāļāļąāļāļāļē
āļĒāļąāļāļŠāļēāļĄāļēāļĢāļāļŠāļąāđāļāļāļēāļ GPIO āļāđāļēāļāļŦāļāđāļēāļāļĢāļēāļ§āđāļāļāļĢāđ (Web Browser) āļāļķāđāļāļāļ°āļŠāļ°āļāļ§āļāļāđāļāļāļđāđāđāļāđāļāļēāļāđāļāļ·āđāļāļāļāļēāļāļŠāļēāļĄāļēāļĢāļ
āļŠāļąāđāļāļāļēāļāļŦāļĢāļ·āļāđāļāđāļēāļāļīāļāļāļēāļĄāļāļđāļŠāļāļēāļāļ°āļāļāļāļāļļāļāļāļĢāļāđāļāļĩāđāļāđāļāļāļąāļ GPIO āļāļāļāļāļāļĢāđāļ Raspberry Pi āļāļēāļāļĢāļ°āļĒāļ°āđāļāļĨāđāļāđ
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļģāđāļāļāļĢāļ°āļĒāļļāļāļāđāđāļāđāļ āļāļēāļĢāļāļģāļāļāļĢāđāļ Raspberry Pi āđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļļāļāļāļĢāļāđāđāļāļāđāļēāļ āļēāļĒāđāļāļāđāļēāļ āđāļĨāđāļ§
āļŠāļēāļĄāļēāļĢāļāļŠāļąāđāļāļāļēāļāđāļāļĢāļ·āđāļāļāđāļāđāđāļāļāđāļēāļŦāļĢāļ·āļāļāļđāļŠāļāļēāļāļ°āđāļāļĢāļ·āđāļāļāđāļāđāđāļāļāđāļēāļāđāļēāļāļāļĢāļēāļ§āđāļāļāļĢāđāļāļēāļāļāļĩāđāļāļģāļāļēāļ āđāļāđāļāļāđāļ
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāļāļīāļāļāļąāđāļ Web server āļĨāļāļāļāļĢāđāļ Raspberry Pi
āļāļīāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄāļāļąāļāļāļēāļĢāđāļāđāļāđāļāđāļ (pip) āđāļĨāļ° āđāļāļĢāđāļāļĢāļĄ Flask āļāļķāđāļāđāļāđāļ web application frame-
work āļāļāļēāļāđāļĨāđāļāļāļĩāđāļāļđāļāļāļąāļāļāļēāļāđāļ§āļĒāļ āļēāļĐāļē Python āļĢāļ§āļĄāļāļąāļ Werkzeug WSGI toolkit āđāļĨāļ° Jinja2 engine
$ sudo apt-get install python-pip
$ sudo pip install Flask
āļāļēāļāļāļąāđāļāļāļāļĨāļāļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄ Hello world
$ mkdir hello
$ cd hello/
$ nano hello.py
from flask import Flask
app = Flask(__name__)
@app.route(â/â)
def hello():
return âHello world!â
if __name__ == â__main__â:
app.run(â0.0.0.0â)
$ python hello.py
* Running on http://0.0.0.0:5000/
āļāļēāļāļāļąāđāļāđāļāļīāļāļŦāļāđāļēāļāļĢāļēāļ§āđāļāļāļĢāđāļāļāđāļāļĢāļ·āđāļāļāļāļāļĄāļāļīāļ§āđāļāļāļĢāđ āđāļĨāđāļ§āļāļīāļĄāļāđ raspberrypi:5000 āļāđāļāļ URL
āļĢāļđāļāļāļĩāđ 7.14 āļāļĨāļĨāļąāļāļāđāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāļĨāđ hello.py āļāđāļēāļāļŦāļāđāļēāļāļĢāļēāļ§āđāļāļāļĢāđ āļāļĩāđāļāļāļĢāđāļāļŦāļĄāļēāļĒāđāļĨāļ 5000
379
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
380. āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļīāđāļĄāđāļāļĨāđ HTML āđāļĨāļ° CSS āđāļāđāļēāđāļāđāļāđāļāļĢāđāļāļĢāļĄ hello.py
āļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩāļāļ·āđāļ âtemplates/â āļāļĒāļđāđāļ āļēāļĒāđāļāđāļāđāļĢāļāļāļāļĢāļĩ hello/ āđāļāļ·āđāļāđāļāđāļāđāļāļĨāđ HTML āļāļ·āđāļāļ§āđāļē
home.html āđāļāļ·āđāļāļāļāļēāļāļāļąāļāļāđāļāļąāļ home() āļāļąāđāļāļāļ°āļāđāļāļŦāļēāđāļāļĨāđ home.html āļāļĩāđāļāļĒāļđāđāļ āļēāļĒāđāļāđāļāđāļĢāļāļāļāļĢāļĩ tem-
plates/ āļāļāļāļāļēāļāļāļąāđāļāļāđāļēāļāđāļāļāļāļēāļĢāđāļāđ CSS āļāđāļāđāļāļāļŠāļĢāđāļēāļāđāļāđāļĢāļāļāļāļĢāļĩāđāļāļīāđāļĄāđāļāļīāļĄāļāļ·āđāļāļ§āđāļē static/css/ āđāļ§āđāļ āļēāļĒāđāļ
āđāļāđāļĢāļāļāļāļĢāļĩ hello/ āđāļāļ·āđāļāđāļāđāļāđāļāļĨāđ CSS
$ cd hello/
$ mkdir templates
$ mkdir static
$ mkdir static/css
$ cd static/css
$ nano main.css
body {
  margin: 0;
  padding: 0;
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
  color: #444;
}
/*
 * Create dark grey header with a white logo
 */
header {
  background-color: #2B2B2B;
  height: 35px;
  width: 100%;
  opacity: .9;
  margin-bottom: 10px;
}
header h1.logo {
  margin: 0;
  font-size: 1.7em;
  color: #fff;
  text-transform: uppercase;
  float: left;
}
header h1.logo:hover {
  color: #fff;
  text-decoration: none;
}
/*
 * Center the body content
 */Â
.container {
  width: 940px;
  margin: 0 auto;
}
380
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
381. div.jumbo {
  padding: 10px 0 30px 0;
  background-color: #eeeeee;
  -webkit-border-radius: 6px;
     -moz-border-radius: 6px;
          border-radius: 6px;
}
h2 {
  font-size: 3em;
  margin-top: 40px;
  text-align: center;
  letter-spacing: -2px;
}
h3 {
  font-size: 1.7em;
  font-weight: 100;
  margin-top: 30px;
  text-align: center;
  letter-spacing: -1px;
  color: #999;
}
āļŠāļĢāđāļēāļāđāļāļĨāđ layout.html āđāļāļ·āđāļāļāļģāļŦāļāļāļĢāļđāļāđāļāļāļāļēāļĢāđāļŠāļāļāļāļāļāļŦāļāđāļēāđāļ§āđāļ
$ nano layout.html
<!DOCTYPE html>
<html>
  <head>
    <title>Flask</title>  Â
    <strong><link rel="stylesheet" href="{{ url_for('static',
filename='css/main.css') }}"></strong>
  </head>
  <body>
    <header>
      <div class="container">
        <h1 class="logo">Flask App</h1>
      </div>
     </header>
   Â
    <div class="container">
      {% block content %}
      {% endblock %}
    </div>
  </body>
</html>
āđāļāđāđāļāđāļāļĨāđ home.html āđāļāļ·āđāļāđāļĢāļĩāļĒāļāđāļāđāļĢāļđāļāđāļāļāđāļāđāļāļĨāđ layout.html
381
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
382. $ nano home.html
{% extends "layout.html" %}
{% block content %}
  <div class="jumbo">
    <h2>Welcome to the Embedded System<h2>
    <h3>This is the home page for the Home Automation<h3>
  </div>
{% endblock %}
āļāļąāđāļāļāļāļāļŠāļļāļāļāđāļēāļĒ āļāļģāļāļēāļĢāļāļāļāļŠāļāļāđāļāļīāļāļŦāļāđāļēāļāļĢāļēāļ§āđāļāļāļĢāđāļāļĩāđāļāļģāđāļŦāļāđāļ localhost:5000 āļāļĩāļāļāļĢāļąāđāļ
āļĢāļđāļāļāļĩāđ 7.15 āļāļĨāļĨāļąāļāļāđāļāļēāļĢāđāļāđāļēāļŦāļāđāļēāļāļĢāļēāļ§āđāļāļāļĢāđ āļāļĩāđāļĄāļĩāļāļēāļĢāļāļģāļŦāļāļ CSS Style āđāļ§āđ
āđāļāļĢāļ·āđāļāļāļĄāļ·āļāļāļąāļāļāļēāļāļ·āđāļāļāļēāļāļŠāļģāļŦāļĢāļąāļ Android āđāļĨāļ° Arduino
Accessory Development Kit (ADK) āļāļ·āļāļāļēāļĢāļāļąāļāļāļēāļāđāļāļĒāļāļāļāļāļāļŪāļēāļĢāđāđāļ§āļĢāđāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļēāļĄāļ·āļ
āļŠāļĄāļąāļāļĢāđāļĨāđāļ āļāļĩāđāđāļāđāđāļāđāļāļāļļāļāđāļĢāļīāđāļĄāļāđāļāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāļĢāļđāđāđāļāļāļēāļĢāļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāļŠāļĢāđāļēāļāļŠāļĢāļĢāļāđāļāđāļēāļāđ āđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļ
āļāļļāļāļāļĢāļāđāđāļŠāļĢāļīāļĄāļŠāļģāļŦāļĢāļąāļāđāļāļĢāļ·āđāļāļāđāļāļĢāļĻāļąāļāļāđāđāļĨāļ°āđāļāđāļāđāļĨāđāļāļāļĩāđāļĄāļĩāļĢāļ°āļāļāļāļāļīāļāļąāļāļīāļāļēāļĢāđāļāļāļāļĢāļāļĒāļāđāđāļāđ āļāļąāļāđāļāđāļāļāļļāļāđāļĢāļīāđāļĄāļāđāļ
āļŠāļģāļāļąāļāđāļāļ§āļāļāļēāļĢāļāļļāļāļāļĢāļāđāļāļāļīāļāļāļāļāļēāļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļ°āđāļāļīāļāļāļēāļĢāļŠāļĢāđāļēāļāļŠāļĢāļĢāļāđāļŠāļīāđāļāđāļŦāļĄāđāļĄāļēāļāļĒāļīāđāļāļāļķāđāļ
āļāļķāđāļāļ āļēāļĒāđāļāļāļēāļ Google I/O 2011 āļāļēāļāļāļĢāļīāļĐāļąāļāļāļđāđāļāļīāļĨāļāđāđāļāđāđāļāļīāļāļāļąāļ§ ADK āļĢāļļāđāļāđāļĢāļ āđāļĨāļ°āļāđāļāļĄāļēāļāļĢāļīāļĐāļąāļāđāļ
āļāļĩāđāļāļļāđāļāļāļ·āđāļ RT Corporation āđāļāđāļāļąāļāļāļēāļāļāļĢāđāļ RT-ADK āļāļķāđāļāļāļ·āļāļ§āđāļēāđāļāđāļāļāļāļĢāđāļ Arduino
(http://www.arduino.cc) āļāļĩāđāļāļđāļāļāļĨāļīāļāļāļāļāļĄāļē āđāļāļĒāļ āļēāļĒāđāļāđāļāđāđāļĄāđāļāļĢāļāļāļāđāļāļĢāļĨāđāļĨāļāļĢāđ ATMega 2560 āļāļĢāđāļāļĄ
āļāļąāļāļāļļāļāđāļāđāļāđāļāļāļĢāđāļāđāļēāļāđ āđāļāļ·āđāļāļĢāļāļāļĢāļąāļāđāļāļāđāļāđāļĨāļĒāļĩāļāļĩāđāđāļāļĒāđāļāļāļēāļ° āļāļāļāļāļēāļāļāļąāđāļāļāļļāļāđāļāđāļāļāļāļ Arduino āļāļ·āļāđāļāđāļāļđāļ
āļāļāļāđāļāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļāļāļĒāļēāļĒāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļąāļāļāļāļĢāđāļāđāļĄāļāļđāļĨāļāļ·āđāļāđ āļāļĩāđāđāļĢāļĩāļĒāļāļ§āđāļēāļāļāļĢāđāļ Shield āđāļāđāļāļāļāļĢāđāļ Ethernet
Shield āļāļāļĢāđāļ WIFI Shield āļāļāļĢāđāļ Bluetooth Shield āđāļāđāļāļāđāļ
382
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
383. āļĢāļđāļāļāļĩāđ 7.16 āļŠāļēāļĄāļēāļĢāļāđāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāđāļēāļ ADK āđāļĨāļ°āļāļāļĢāđāļ RT-ADK āļĢāļļāđāļāđāļĢāļ
āļĢāļđāļāđāļāļāđāļāļāļēāļĢāļāļīāļāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāļāļ°āđāļāđāļāđāļāļ Android Open Accessory (AOA Protocol) āđāļāļ·āđāļāļāļģāļāļēāļĢ
āļāļīāļāļāđāļāļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāđāļāđāļāļąāļāļāļļāļāļāļĢāļāđāđāļāļāļāļĢāļāļĒāļāđ (Android Devices) āļāđāļēāļāļŠāļēāļĒāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ USB
Android Open Accessory
Android Open Accessory āđāļāđāļāļđāļāļāļąāļāļāļēāļāļķāđāļāļĄāļēāđāļāļ·āđāļāđāļŦāđāļāļļāļāļāļĢāļāđāđāļāļāļāļĢāļāļĒāļāđāļŠāļēāļĄāļēāļĢāļāđāļāļ·āđāļāļĄāļāđāļāļāļąāļ
āļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāđāļēāļāļāļēāļ USB āđāļāļĒāļąāļ USB Host āļāļāļāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļ āđāļāđāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāļ°āđāļĄāđ
āļŠāļēāļĄāļēāļĢāļāđāļāđāļāļĨāļąāļāļāļēāļāđāļāļāđāļēāļāļēāļāļāļļāļāļāļĢāļāđāđāļāļāļāļĢāļāļĒāļāđāđāļāđ āļāļąāļāļāļąāđāļāļāļļāļāļāļĢāļāđāļ āļēāļĒāļāļāļāļāļ°āļāđāļāļāļĄāļĩāđāļŦāļĨāđāļāļāđāļēāļĒāļāļĨāļąāļāļāļēāļ
āđāļāļāđāļēāļāļāļāļāļąāļ§āđāļāļāđāļĨāļ°āļāđāļāļāļĄāļĩāļĢāļ°āļāļąāļāļāļĢāļ°āđāļŠāđāļĄāđāļāđāļāļĒāļāļ§āđāļē 500mA āļāļĩāđāļāļ§āļēāļĄāļāđāļēāļāļĻāļąāļāļĒāđāđāļāļāđāļē 5V āđāļāļ·āđāļāđāļŦāđāļŠāļēāļĄāļēāļĢāļ
āļŠāļ·āđāļāļŠāļēāļĢāļāļąāļāļāļļāļāļāļĢāļāđāđāļāļāļāļĢāļāļĒāļāđāđāļāđ āļŠāļģāļŦāļĢāļąāļāļāļāļĢāđāļ Arduino āļāļąāđāļāļāļąāļāļāļąāļāļāļēāļŠāļēāļĄāļēāļĢāļāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļĒāđāļāđ
āđāļāļĢāđāļāļĢāļĄ Arduino IDE (www.arduino.cc) āļŦāļĢāļ·āļāđāļāļĢāđāļāļĢāļĄ ADK2012 IDE (āļāļĢāļīāļĐāļąāļāļāļđāđāļāļīāļĨ)
āđāļāļĢāđāļāļĢāļĄ ADK2012 IDE
āļŦāļĨāļąāļāļāļēāļāļāļēāļ§āļāđāđāļŦāļĨāļāđāļāļĢāđāļāļĢāļĄ ADK2012 IDE āļāļēāļ Android ADK āđāļĨāđāļ§āļāļģāļāļēāļĢāļāļīāļāļāļąāđāļāļĨāļāđāļāļĢāļ·āđāļāļ
āļāļāļĄāļāļīāļ§āđāļāļāļĢāđāđāļĢāļĩāļĒāļāļĢāđāļāļĒ āļŦāļāđāļēāļāļēāļāļāļāđāļāļĢāđāļāļĢāļĄāļāļ°āļāļĨāđāļēāļĒ Arduino IDE āđāļāđāļāļ°āļĄāļĩāļŠāđāļ§āļāļāļāļāđāļĨāļāļēāļĢāļĩāļāļēāļāļāđāļēāļ Us-
bAccessory āļāļĩāđāļāļđāđāļāļīāļĨāđāļāđāļāļąāļāļāļēāđāļāļīāđāļĄāđāļāļīāļĄāđāļāđāļēāļĄāļēāļāļąāļāđāļŠāļāļāđāļāļĢāļđāļāļāđāļēāļāļĨāđāļēāļ āđāļāļāļĢāļāļĩāļāļĩāđāļāļąāļāļāļąāļāļāļēāļāđāļāļāļāļēāļĢāļĨāļāđāļĨāļāļĢāļēāļĢāļĩ
āđāļāļīāđāļĄāđāļāļīāļĄāļāđāļāļģāđāļāđāđāļāļĒāļāļēāļĢāđāļāļāđāļāļĨāđāđāļĨāļāļĢāļēāļĢāļĩāđāļĨāđāļ§āļāļąāļāļĨāļāļāđāļāđāļ§āđāđāļāđāļāđāļĢāļāļāļāļĢāļĩāļāļ·āđāļāļ§āđāļē libraries
383
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
384. āļĢāļđāļāļāļĩāđ 7.17 āļŦāļāđāļēāļāļēāđāļāļĢāđāļāļĢāļĄ ADK2012 IDE
āļāļąāļāļāļļāļāļąāļāđāļāđāļĄāļĩāļāļēāļĢāļāļąāļāļāļēāļāļāļĢāđāļ Arduino āļāļāļāļĄāļēāļāđāļ§āļĒāļāļąāļāļŦāļĨāļēāļĒāļĢāļļāđāļāļāļąāļāđāļŠāļāļāđāļāļāļēāļĢāļēāļāļāđāļēāļāļĨāđāļēāļ āļāļąāļāļāļąāđāļāļāļąāļ
āļāļąāļāļāļēāļāļ§āļĢāļāļģāļāļ§āļēāļĄāđāļāđāļēāđāļāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļāļāļāļāļāļĢāđāļāđāļāđāļĨāļ°āļĢāļļāđāļāđāļĨāļ°āļāļąāļāļāļēāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāļāļķāļāđāļāļē
āļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāļĄāļēāđāļāđāļāļēāļāđāļāđāļāļĒāđāļēāļāđāļāđāļĄāļāļĩāđāđāļāļ·āđāļāđāļŦāđāđāļŦāļĄāļēāļ°āļŠāļĄāļāļąāļāļāļēāļāļāļĢāļ°āļĒāļļāļāļāđ
āļāļēāļĢāļēāļ 7.1 āđāļŠāļāļāļĢāļļāđāļāļāđāđāļēāļāđāļāļāļ Arduino
āļĢāļļāđāļāļāļāļĢāđāļ ArduinoāļĢāļļāđāļāļāļāļĢāđāļ Arduino
Arduino Uno Arduino BT w/ ATmega328
Arduino Duemilanove w/ ATmega328 Arduino BT w/ ATmega168
Arduino Diecimila or Duemilanove w/ ATmega 168 LilyPad Arduino USB
Arduino Nano w/ ATmega328 LilyPad Arduino w/ ATmega328
Arduino Nano w/ ATmega168 LilyPad Arduino w/ ATmega168
Arduino Mega 2560 or Mega ADK Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega328
Arduino Mega (ATmega1280) Arduino Pro or Pro Mini (5V, 16MHz) w/ ATmega168
Arduino Leonardo Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega328
Arduino Esplora Arduino Pro or Pro Mini (3.3V, 8MHz) w/ ATmega168
Arduino Micro Arduino NG or older w/ ATmega168
Arduino Mini w/ ATmega328 Arduino NG or older w/ ATmega8
384
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
386. āđāļāļĢāđāļāļĢāļĄāļāļ°āđāļāđāļēāļŠāļđāđāļāļąāļāļāđāļāļąāļāļĨāļđāļ loop() āđāļāļāļąāđāļāļāļāļāļāļĩāđāđāļāļĢāđāļāļĢāļĄāļāļ°āļ§āļāļāļģāļāļēāļāļāļĒāļđāđāļ āļēāļĒāđāļāļāļąāļāļāđāļāļąāļ loop()
āļāļĩāđāđāļāđāļĢāļ·āđāļāļĒāđāļāļāļāļ§āđāļēāļāļ°āļĄāļĩāļāļģāļŠāļąāđāļāđāļŦāđāļĢāļĩāđāļāļāļāļēāļĢāļāļģāļāļēāļāļāļāļāļāļāļĢāđāļāđāļŦāļĄāđāļāļĩāļāļāļĢāļąāđāļ (Arduino Reset)
āļĢāļđāļāļāļĩāđ 7.19 āđāļŠāļāļāļāļąāđāļāļāļāļāļāļēāļĢāļāļģāļāļēāļāļ āļēāļĒāđāļāđāļāļĢāđāļāļĢāļĄ Arduino
āļāļąāļ§āļāļĒāđāļēāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļāļĢāļ°āļŦāļ§āđāļēāļ Android āļāļąāļ Arduino āļāđāļēāļ ADK
āļāļĨāļēāļŠāļŠāļģāļāļąāļāļ āļēāļĒāđāļ ADK2012 IDE āļŠāļģāļŦāļĢāļąāļāđāļāđāđāļāļāļēāļĢāļŠāļ·āđāļāļŠāļēāļĢāļāđāļēāļ ADK āļĢāļ°āļŦāļ§āđāļēāļāđāļāļāļāļĢāļāļĒāļāđāđāļĨāļ° Ar-
duino āļāļąāđāļāđāļāđāđāļāđāļāļĨāļēāļŠ AndroidAccessory āļāļķāđāļāļĄāļĩāļĢāļēāļĒāļĨāļ°āđāļāļĩāļĒāļāļ āļēāļĒāđāļāļāļąāļāļāļĩāđ
class AndroidAccessory {
private:
  const char *manufacturer;
  const char *model;
  const char *description;
  const char *version;
  const char *uri;
  const char *serial;
...
  int getProtocol(byte addr);
  void sendString(byte addr, int index, const char *str);
  bool switchDevice(byte addr);
  bool findEndpoints(byte addr, EP_RECORD *inEp, EP_RECORD *outEp);
  bool configureAndroid(void);
public:
  AndroidAccessory(const char *manufacturer,
           const char *model,
           const char *description,
           const char *version,
           const char *uri,
           const char *serial);
  void powerOn(void);
386
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
387. Â Â bool isConnected(void);
  int read(void *buff, int len, unsigned int nakLimit = USB_NAK_LIMIT);
  int write(void *buff, int len);
};
āļāļąāļāļāđāļāļąāļāļŦāļĨāļąāļāļāļĩāđāļāļ°āđāļĢāļĩāļĒāļāđāļāđāļ āļēāļĒāđāļāļāļąāļāļāđāļāļąāļ setup() āđāļāļ·āđāļāđāļāđāđāļāļāļēāļĢāđāļāļīāļ Android Accessory āļāļ·āļ pow-
erOn(), read() āđāļĨāļ° write() āđāļāļĒāļāļĩāđāļāļąāļ§āđāļāļĢ buff āļāļąāđāļāļāļ°āđāļāđāđāļāļāļēāļĢāđāļāđāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāđāļāļāļāļēāļĢāļāļ°āļŠāđāļāļāļāļāļŦāļĢāļ·āļāļĢāļąāļāđāļāđāļē
āļĄāļēāļāļēāļāļāļąāđāļāđāļāļĢāđāļāļĢāļĄāđāļāļāļāļĢāļāļĒāļāđāļāđāļēāļāļāļēāļ USB āļāļēāļĄāļāļāļēāļāļāļ§āļēāļĄāļĒāļēāļ§āļāļāļāļāđāļāļĄāļđāļĨ (len) āđāļāļāļĢāļāļĩāļāļĩāđāđāļāđāļāļāļēāļĢāļĢāļąāļ
āļŠāđāļāļāđāļāļĄāļđāļĨāđāļāļāđāļāđāļĄāļāļ§āļēāļĄāđāļĢāđāļ§ (Full Speed USB) āđāļāļāļąāļāļāđāļāļąāļ read() āļāļąāđāļāļŠāđāļ§āļāļāļāļāļāđāļē NAK āļāļ°āđāļāđāļāļāļēāļĢāļāļāļ
āļāđāļēāļŠāļāļēāļāļ°āļ§āđāļēāļāļļāļāļāļĢāļāđāļāļĩāđāļāļ°āļŠāđāļāļāđāļāļĄāļđāļĨāđāļŦāđāļāļąāđāļāļĒāļąāļāđāļĄāđāļāļĢāđāļāļĄāļāļĩāđāļāļ°āļŠāđāļāļāļĨāļąāļāļŦāļĢāļ·āļāļĒāļąāļāđāļĄāđāļĄāļĩāļāđāļāļĄāļđāļĨāļāļĩāđāļāļ°āļŠāđāļāđāļŦāđāđāļāđāļ§āļĨāļēāļāļĩāđ
āļāļāļāļāļēāļāļāļąāđāļāļāđāļĒāļąāļāļāļđāļāđāļāđāđāļāļāļēāļĢāđāļāđāļāđāļāļ·āļāļāļĢāļ°āļŦāļ§āđāļēāļāļāđāļēāļĒāđāļāļāļāđāļāļĄāļđāļĨāđāļāļĒāļąāļāđāļāļĢāļ·āđāļāļāļĢāļąāļāļ§āđāļēāđāļĄāđāļĄāļĩāļāđāļāļĄāļđāļĨāļāļĩāđāļāļ°āļŠāđāļāđāļŦāđāđāļĨāđāļ§
āļāļąāļ§āļāļĒāđāļēāļāļāđāļēāļāļĨāđāļēāļāđāļāđāļāļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāđāļāļ·āđāļāļāļģāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ ADK āđāļĨāđāļ§āļĢāļąāļāļāđāļāļĄāļđāļĨāļāļĩāđāļāļđāļāļŠāđāļāļĄāļēāļāļēāļāđāļāļāļāļĢāļāļĒāļāđ
#include <AndroidAccessory.h>
AndroidAccessory acc("Google, Inc.",
"DemoKit",
"DemoKit Arduino Board",
"1.0",
"http://www.android.com",
"0000000012345678");
void Setup(){
acc.powerOn(); // āļŠāļąāđāļāđāļāļīāļāđāļāđāļāļēāļ Android Accessory
}
void loop(){
if (acc.isConnected()) {
// āļāđāļēāļāļāđāļēāļāļĩāđāļāļđāļāļŠāđāļāļāļāļāļĄāļēāļāļēāļ Android
int len = acc.read(msg, sizeof(msg), 1);
}
}
āļāļēāļĢāđāļāļĩāļĒāļāđāļāļĢāđāļāļĢāļĄāļŠāđāļ§āļāđāļāļāļāļĢāļāļĒāļāđ
āđāļāļāļąāđāļāļāļāļāđāļāļāļāļĢāļāļĒāļāđāļāļ°āđāļāđāļāļĨāļēāļŠāļŦāļĨāļąāļāđāļāđāđāļāđāļāļĨāļēāļŠ UsbManager āđāļĨāļ°āļāļĨāļēāļŠ UsbAccessory āļāļĩāđāļāļđāđāļāļīāļĨ
āđāļāđāļāļąāļāđāļāļĢāļĩāļĒāļĄāđāļ§āđāđāļŦāđāđāļāļ·āđāļāļāļāđāļāđāļĨāđāļ§ āđāļāļĒāļāļąāđāļāļāļāļāđāļĢāļāļāļąāļāļāļąāļāļāļēāļāļ°āļāđāļāļāļŠāļĢāđāļēāļāđāļāļĢāđāļāļāļāļāļāđāļāļāļāļĢāļāļĒāļāđāļāļķāđāļāļĄāļēāđāļĨāđāļ§
āļāļģāļāļēāļĢāļĢāļ°āļāļļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđ UsbAccessory āđāļāđāļēāđāļāđāļāđāļāļĨāđ AndroidManifest.xml āļāļąāļāđāļŠāļāļāļāđāļēāļāļĨāđāļēāļ
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<uses-library android:name="com.android.future.usb.accessory" />
...
387
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē
388. ...
...
</application>
āđāļāđāļāļŠāđāļ§āļāļŦāļāļķāđāļāļ āļēāļĒāđāļāđāļāļĢāđāļāļĢāļĄāđāļāļāļāļĢāļāļĒāļāđāđāļāļ·āđāļāļāļāđāļāļīāļāđāļĨāļ°āđāļāđāļēāļāļķāļāļāļēāļĢāļĢāļąāļāļŠāđāļāļāđāļāļĄāļđāļĨāļāđāļēāļ USB
// āđāļāđāļāļāļēāļĢāļāđāļēāļŦāļāļ Intent āđāļāļ·āđāļāļāļāđāļāļŠāđāļēāļŦāļĢāļąāļāļāļēāļĢāļāļąāļāļāļĩāđāļ§āđāļāļāđāļāļĢāļāļĩāļāļĩāđāļĄāļĩāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ ADK
private PendingIntent mPermissionIntent;
private static final String ACTION_USB_PERMISSION =
"com.android.example.USB_PERMISSION";
private UsbManager mUsbManager;
private UsbAccessory mAccessory;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mUsbManager = UsbManager.getInstance(this);
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(
ACTION_USB_PERMISSION), 0);
// āļāđāļēāļŦāļāļ filter
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
filter.addAction(UsbManager.ACTION_USB_ACCESSORY_DETACHED);
// register āđāļŦāđāļŠāļēāļĄāļēāļĢāļāļĢāļąāļ intent āđāļāđ
registerReceiver(mUsbReceiver, filter);
setContentView(R.layout.main);
textView = (TextView) findViewById(R.id.textView);
}
/** Called when the activity is resumed from its paused state and
immediately after onCreate(). */
@Override
public void onResume() {
super.onResume();
if (mInputStream != null && mOutputStream != null) {
return; }
UsbAccessory[] accessories = mUsbManager.getAccessoryList();
UsbAccessory accessory = (accessories == null ? null : accessories[0]);
if (accessory != null) {
// āļāļĢāļ§āļāļŠāļāļāļŠāļīāļāļāļīāđāđāļāļāļēāļĢāđāļĢāļĩāļĒāļāđāļāđāļāļēāļ Accessory
if (mUsbManager.hasPermission(accessory)) {
openAccessory(accessory); // āļŠāļąāđāļāđāļāļīāļāļāļēāļĢāđāļāđāļāļēāļ accessory
} else {
synchronized (mUsbReceiver) {
if (!mPermissionRequestPending) {
mUsbManager.requestPermission(accessory, mPermissionIntent);
mPermissionRequestPending = true;
}
}
}
} else {
388
Embedded Android Development āļŠāļđāđāđāļŠāđāļāļāļēāļāļāļąāļāļāļąāļāļāļē