Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6: HOWTO: update misspelling and word incorrected add stable_api_nonsense.txt in korean HOWTO: change addresses of maintainer and lxr url for Korean HOWTO Add Documentation for FAIR_USER_SCHED sysfs files HOWTO: Change man-page maintainer address for Japanese HOWTO tipar: remove obsolete module kobject: fix the documentation of how kobject_set_name works
This commit is contained in:
Коммит
87d5df6bde
|
@ -0,0 +1,14 @@
|
|||
What: /sys/kernel/uids/<uid>/cpu_shares
|
||||
Date: December 2007
|
||||
Contact: Dhaval Giani <dhaval@linux.vnet.ibm.com>
|
||||
Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com>
|
||||
Description:
|
||||
The /sys/kernel/uids/<uid>/cpu_shares tunable is used
|
||||
to set the cpu bandwidth a user is allowed. This is a
|
||||
propotional value. What that means is that if there
|
||||
are two users logged in, each with an equal number of
|
||||
shares, then they will get equal CPU bandwidth. Another
|
||||
example would be, if User A has shares = 1024 and user
|
||||
B has shares = 2048, User B will get twice the CPU
|
||||
bandwidth user A will. For more details refer
|
||||
Documentation/sched-design-CFS.txt
|
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
|||
fork. So if you have any comments or updates for this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2007/09/23
|
||||
Last Updated: 2007/11/16
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.23/Documentation/HOWTO
|
||||
linux-2.6.24/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2007/09/19
|
||||
翻訳日: 2007/11/10
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
|
@ -110,7 +110,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
|||
新しいドキュメントファイルも追加することを勧めます。
|
||||
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
||||
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
||||
をマニュアルページのメンテナ mtk-manpages@gmx.net に送ることを勧めま
|
||||
をマニュアルページのメンテナ mtk.manpages@gmail.com に送ることを勧めま
|
||||
す。
|
||||
|
||||
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
NOTE:
|
||||
This is a version of Documentation/HOWTO translated into korean
|
||||
This document is maintained by minchan Kim < minchan.kim@gmail.com>
|
||||
This document is maintained by minchan Kim <minchan.kim@gmail.com>
|
||||
If you find any difference between this document and the original file or
|
||||
a problem with the translation, please contact the maintainer of this file.
|
||||
|
||||
|
@ -14,7 +14,7 @@ try to update the original English file first.
|
|||
Documentation/HOWTO
|
||||
의 한글 번역입니다.
|
||||
|
||||
역자: 김민찬 <minchan.kim@gmail.com >
|
||||
역자: 김민찬 <minchan.kim@gmail.com>
|
||||
감수: 이제이미 <jamee.lee@samsung.com>
|
||||
==================================
|
||||
|
||||
|
@ -23,11 +23,11 @@ Documentation/HOWTO
|
|||
|
||||
이 문서는 커널 개발에 있어 가장 중요한 문서이다. 이 문서는
|
||||
리눅스 커널 개발자가 되는 법과 리눅스 커널 개발 커뮤니티와 일하는
|
||||
법을 담고있다. 커널 프로그래밍의기술적인 측면과 관련된 내용들은
|
||||
포함하지 않으려고 하였지만 올바으로 여러분을 안내하는 데 도움이
|
||||
법을 담고있다. 커널 프로그래밍의 기술적인 측면과 관련된 내용들은
|
||||
포함하지 않으려고 하였지만 올바른 길로 여러분을 안내하는 데는 도움이
|
||||
될 것이다.
|
||||
|
||||
이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인트너에게
|
||||
이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인테이너에게
|
||||
패치를 보내달라.
|
||||
|
||||
|
||||
|
@ -36,12 +36,12 @@ Documentation/HOWTO
|
|||
|
||||
자, 여러분은 리눅스 커널 개발자가 되는 법을 배우고 싶은가? 아니면
|
||||
상사로부터"이 장치를 위한 리눅스 드라이버를 작성하시오"라는 말을
|
||||
들었는가? 이 문서는 여러분이 겪게 될 과정과 커뮤니티와 일하는 법을
|
||||
조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주는
|
||||
것이다.
|
||||
들었는가? 이 문서의 목적은 여러분이 겪게 될 과정과 커뮤니티와 협력하는
|
||||
법을 조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주기
|
||||
위함이다.
|
||||
|
||||
커널은 대부분은 C로 작성되었어고 몇몇 아키텍쳐의 의존적인 부분은
|
||||
어셈블리로 작성되었다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다.
|
||||
커널은 대부분은 C로 작성되어 있고 몇몇 아키텍쳐의 의존적인 부분은
|
||||
어셈블리로 작성되어 있다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다.
|
||||
여러분이 특정 아키텍쳐의 low-level 개발을 할 것이 아니라면
|
||||
어셈블리(특정 아키텍쳐)는 잘 알아야 할 필요는 없다.
|
||||
다음의 참고서적들은 기본에 충실한 C 교육이나 수년간의 경험에 견주지는
|
||||
|
@ -59,11 +59,11 @@ Documentation/HOWTO
|
|||
어떤 참고문서도 있지 않다. 정보를 얻기 위해서는 gcc info (`info gcc`)페이지를
|
||||
살펴보라.
|
||||
|
||||
여러분은 기존의 개발 커뮤니티와 일하는 법을 배우려고 하고 있다는 것을
|
||||
기억하라. 코딩, 스타일, 절차에 관한 훌륭한 표준을 가진 사람들이 모인
|
||||
여러분은 기존의 개발 커뮤니티와 협력하는 법을 배우려고 하고 있다는 것을
|
||||
기억하라. 코딩, 스타일, 함수에 관한 훌륭한 표준을 가진 사람들이 모인
|
||||
다양한 그룹이 있다. 이 표준들은 오랜동안 크고 지역적으로 분산된 팀들에
|
||||
의해 가장 좋은 방법으로 일하기위하여 찾은 것을 기초로 만들어져왔다.
|
||||
그 표준들은 문서화가 잘 되어 있기 때문에 가능한한 미리 많은 표준들에
|
||||
의해 가장 좋은 방법으로 일하기 위하여 찾은 것을 기초로 만들어져 왔다.
|
||||
그 표준들은 문서화가 잘 되어있기 때문에 가능한한 미리 많은 표준들에
|
||||
관하여 배우려고 시도하라. 다른 사람들은 여러분이나 여러분의 회사가
|
||||
일하는 방식에 적응하는 것을 원하지는 않는다.
|
||||
|
||||
|
@ -73,7 +73,7 @@ Documentation/HOWTO
|
|||
|
||||
리눅스 커널 소스 코드는 GPL로 배포(release)되었다. 소스트리의 메인
|
||||
디렉토리에 있는 라이센스에 관하여 상세하게 쓰여 있는 COPYING이라는
|
||||
파일을 봐라.여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면
|
||||
파일을 봐라. 여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면
|
||||
리눅스 커널 메일링 리스트에 묻지말고 변호사와 연락하라. 메일링
|
||||
리스트들에 있는 사람들은 변호사가 아니기 때문에 법적 문제에 관하여
|
||||
그들의 말에 의지해서는 안된다.
|
||||
|
@ -85,12 +85,12 @@ GPL에 관한 잦은 질문들과 답변들은 다음을 참조하라.
|
|||
문서
|
||||
----
|
||||
|
||||
리눅스 커널 소스 트리는 커널 커뮤니티와 일하는 법을 배우기 위한 많은
|
||||
귀중한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때,
|
||||
리눅스 커널 소스 트리는 커널 커뮤니티와 협력하는 법을 배우기위해 훌륭한
|
||||
다양한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때,
|
||||
그 기능을 어떻게 사용하는지에 관한 설명을 위하여 새로운 문서 파일을
|
||||
추가하는 것을 권장한다. 커널이 유저스페이스로 노출하는 인터페이스를
|
||||
변경하게 되면 변경을 설명하는 메뉴얼 페이지들에 대한 패치나 정보를
|
||||
mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
||||
mtk.manpages@gmail.com의 메인테이너에게 보낼 것을 권장한다.
|
||||
|
||||
다음은 커널 소스 트리에 있는 읽어야 할 파일들의 리스트이다.
|
||||
README
|
||||
|
@ -105,7 +105,7 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
|||
Documentation/CodingStyle
|
||||
이 문서는 리눅스 커널 코딩 스타일과 그렇게 한 몇몇 이유를 설명한다.
|
||||
모든 새로운 코드는 이 문서에 가이드라인들을 따라야 한다. 대부분의
|
||||
메인트너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이
|
||||
메인테이너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이
|
||||
그 패치가 올바른 스타일일 경우만 코드를 검토할 것이다.
|
||||
|
||||
Documentation/SubmittingPatches
|
||||
|
@ -115,9 +115,10 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
|||
- Email 내용들
|
||||
- Email 양식
|
||||
- 그것을 누구에게 보낼지
|
||||
이러한 규칙들을 따르는 것이 성공을 보장하진 않는다(왜냐하면 모든
|
||||
패치들은 내용과 스타일에 관하여 면밀히 검토되기 때문이다).
|
||||
그러나 규칙을 따르지 않는다면 거의 성공하지도 못할 것이다.
|
||||
이러한 규칙들을 따르는 것이 성공(역자주: 패치가 받아들여 지는 것)을
|
||||
보장하진 않는다(왜냐하면 모든 패치들은 내용과 스타일에 관하여
|
||||
면밀히 검토되기 때문이다). 그러나 규칙을 따르지 않는다면 거의
|
||||
성공하지도 못할 것이다.
|
||||
|
||||
올바른 패치들을 만드는 법에 관한 훌륭한 다른 문서들이 있다.
|
||||
"The Perfect Patch"
|
||||
|
@ -126,13 +127,13 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
|||
http://linux.yyz.us/patch-format.html
|
||||
|
||||
Documentation/stable_api_nonsense.txt
|
||||
이 문서는 의도적으로 커널이 변하지 않는 API를 갖지 않도록 결정한
|
||||
이 문서는 의도적으로 커널이 불변하는 API를 갖지 않도록 결정한
|
||||
이유를 설명하며 다음과 같은 것들을 포함한다.
|
||||
- 서브시스템 shim-layer(호환성을 위해?)
|
||||
- 운영 체제들 간의 드라이버 이식성
|
||||
- 운영체제들간의 드라이버 이식성
|
||||
- 커널 소스 트리내에 빠른 변화를 늦추는 것(또는 빠른 변화를 막는 것)
|
||||
이 문서는 리눅스 개발 철학을 이해하는데 필수적이며 다른 운영체제에서
|
||||
리눅스로 옮겨오는 사람들에게는 매우 중요하다.
|
||||
리눅스로 전향하는 사람들에게는 매우 중요하다.
|
||||
|
||||
|
||||
Documentation/SecurityBugs
|
||||
|
@ -141,10 +142,10 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
|||
도와 달라.
|
||||
|
||||
Documentation/ManagementStyle
|
||||
이 문서는 리눅스 커널 메인트너들이 어떻게 그들의 방법론의 정신을
|
||||
어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는
|
||||
이 문서는 리눅스 커널 메인테이너들이 그들의 방법론에 녹아 있는
|
||||
정신을 어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는
|
||||
모든 사람들(또는 커널 개발에 작은 호기심이라도 있는 사람들)이
|
||||
읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인트너들의
|
||||
읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인테이너들의
|
||||
독특한 행동에 관하여 흔히 있는 오해들과 혼란들을 해소하고 있기
|
||||
때문이다.
|
||||
|
||||
|
@ -160,7 +161,7 @@ mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다.
|
|||
|
||||
Documentation/applying-patches.txt
|
||||
패치가 무엇이며 그것을 커널의 다른 개발 브랜치들에 어떻게
|
||||
적용하는지에 관하여 자세히 설명 하고 있는 좋은 입문서이다.
|
||||
적용하는지에 관하여 자세히 설명하고 있는 좋은 입문서이다.
|
||||
|
||||
커널은 소스 코드 그 자체에서 자동적으로 만들어질 수 있는 많은 문서들을
|
||||
가지고 있다. 이것은 커널 내의 API에 대한 모든 설명, 그리고 락킹을
|
||||
|
@ -192,7 +193,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
|||
여러분이 어디서 시작해야 할진 모르지만 커널 개발 커뮤니티에 참여할 수
|
||||
있는 일들을 찾길 원한다면 리눅스 커널 Janitor 프로젝트를 살펴봐라.
|
||||
http://janitor.kernelnewbies.org/
|
||||
그곳은 시작하기에 아주 딱 좋은 곳이다. 그곳은 리눅스 커널 소스 트리내에
|
||||
그곳은 시작하기에 훌륭한 장소이다. 그곳은 리눅스 커널 소스 트리내에
|
||||
간단히 정리되고 수정될 수 있는 문제들에 관하여 설명한다. 여러분은 이
|
||||
프로젝트를 대표하는 개발자들과 일하면서 자신의 패치를 리눅스 커널 트리에
|
||||
반영하기 위한 기본적인 것들을 배우게 될것이며 여러분이 아직 아이디어를
|
||||
|
@ -212,7 +213,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
|||
것은 Linux Cross-Reference project이며 그것은 자기 참조 방식이며
|
||||
소스코드를 인덱스된 웹 페이지들의 형태로 보여준다. 최신의 멋진 커널
|
||||
코드 저장소는 다음을 통하여 참조할 수 있다.
|
||||
http://sosdg.org/~coywolf/lxr/
|
||||
http://users.sosdg.org/~qiyong/lxr/
|
||||
|
||||
|
||||
개발 프로세스
|
||||
|
@ -233,44 +234,45 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
|
|||
2.6.x 커널들은 Linux Torvalds가 관리하며 kernel.org의 pub/linux/kernel/v2.6/
|
||||
디렉토리에서 참조될 수 있다.개발 프로세스는 다음과 같다.
|
||||
- 새로운 커널이 배포되자마자 2주의 시간이 주어진다. 이 기간동은
|
||||
메인트너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은
|
||||
메인테이너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은
|
||||
몇 주 동안 -mm 커널내에 이미 있었던 것들이다. 큰 변경들을 제출하는 데
|
||||
선호되는 방법은 git(커널의 소스 관리 툴, 더 많은 정보들은 http://git.or.cz/
|
||||
에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내도
|
||||
에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내는
|
||||
것도 무관하다.
|
||||
- 2주 후에 -rc1 커널이 배포되며 지금부터는 전체 커널의 안정성에 영향을
|
||||
미칠수 있는 새로운 기능들을 포함하지 않는 패치들만을 추가될 수 있다.
|
||||
미칠수 있는 새로운 기능들을 포함하지 않는 패치들만이 추가될 수 있다.
|
||||
완전히 새로운 드라이버(혹은 파일시스템)는 -rc1 이후에만 받아들여진다는
|
||||
것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가
|
||||
드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은
|
||||
퇴보(regression)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
|
||||
회귀(역자주: 이전에는 존재하지 않았지만 새로운 기능추가나 변경으로 인해
|
||||
생겨난 버그)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
|
||||
배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은
|
||||
공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다.
|
||||
- 새로운 -rc는 Linus는 현재 git tree가 테스트 하기에 충분히 안정된 상태에
|
||||
- 새로운 -rc는 Linus가 현재 git tree가 테스트 하기에 충분히 안정된 상태에
|
||||
있다고 판단될 때마다 배포된다. 목표는 새로운 -rc 커널을 매주 배포하는
|
||||
것이다.
|
||||
- 이러한 프로세스는 커널이 "준비"되었다고 여겨질때까지 계속된다.
|
||||
- 이러한 프로세스는 커널이 "준비(ready)"되었다고 여겨질때까지 계속된다.
|
||||
프로세스는 대체로 6주간 지속된다.
|
||||
- 각 -rc 배포에 있는 알려진 퇴보의 목록들은 다음 URI에 남겨진다.
|
||||
- 각 -rc 배포에 있는 알려진 회귀의 목록들은 다음 URI에 남겨진다.
|
||||
http://kernelnewbies.org/known_regressions
|
||||
|
||||
커널 배포에 있어서 언급할만한 가치가 있는 리눅스 커널 메일링 리스트의
|
||||
Andrew Morton의 글이 있다.
|
||||
"커널이 언제 배포될지는 아무로 모른다. 왜냐하면 배포는 알려진
|
||||
"커널이 언제 배포될지는 아무도 모른다. 왜냐하면 배포는 알려진
|
||||
버그의 상황에 따라 배포되는 것이지 미리정해 놓은 시간에 따라
|
||||
배포되는 것은 아니기 때문이다."
|
||||
배포되는 것은 아니기 때문이다."
|
||||
|
||||
2.6.x.y - 안정 커널 트리
|
||||
------------------------
|
||||
|
||||
4 자리 숫자로 이루어진 버젼의 커널들은 -stable 커널들이다. 그것들은 2.6.x
|
||||
커널에서 발견된 큰 퇴보들이나 보안 문제들 중 비교적 작고 중요한 수정들을
|
||||
커널에서 발견된 큰 회귀들이나 보안 문제들 중 비교적 작고 중요한 수정들을
|
||||
포함한다.
|
||||
|
||||
이것은 가장 최근의 안정적인 커널을 원하는 사용자에게 추천되는 브랜치이며,
|
||||
개발/실험적 버젼을 테스트하는 것을 돕는데는 별로 관심이 없다.
|
||||
개발/실험적 버젼을 테스트하는 것을 돕고자 하는 사용자들과는 별로 관련이 없다.
|
||||
|
||||
어떤 2.6.x.y 커널도 사용가능하지 않다면 그때는 가장 높은 숫자의 2.6.x
|
||||
어떤 2.6.x.y 커널도 사용할 수 없다면 그때는 가장 높은 숫자의 2.6.x
|
||||
커널이 현재의 안정 커널이다.
|
||||
|
||||
2.6.x.y는 "stable" 팀<stable@kernel.org>에 의해 관리되며 거의 매번 격주로
|
||||
|
@ -294,7 +296,7 @@ Andrew Morton에 의해 배포된 실험적인 커널 패치들이다. Andrew는
|
|||
서브시스템 커널 트리와 패치들을 가져와서 리눅스 커널 메일링 리스트로
|
||||
온 많은 패치들과 한데 묶는다. 이 트리는 새로운 기능들과 패치들을 위한
|
||||
장소를 제공하는 역할을 한다. 하나의 패치가 -mm에 한동안 있으면서 그 가치가
|
||||
증명되게 되면 Andrew나 서브시스템 메인트너는 그것을 메인라인에 포함시키기
|
||||
증명되게 되면 Andrew나 서브시스템 메인테이너는 그것을 메인라인에 포함시키기
|
||||
위하여 Linus에게 보낸다.
|
||||
|
||||
커널 트리에 포함하고 싶은 모든 새로운 패치들은 Linus에게 보내지기 전에
|
||||
|
@ -327,7 +329,7 @@ Andrew Morton에 의해 배포된 실험적인 커널 패치들이다. Andrew는
|
|||
- ACPI development tree, Len Brown <len.brown@intel.com >
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git
|
||||
|
||||
- Block development tree, Jens Axboe <axboe@suse.de>
|
||||
- Block development tree, Jens Axboe <jens.axboe@oracle.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git
|
||||
|
||||
- DRM development tree, Dave Airlie <airlied@linux.ie>
|
||||
|
@ -367,8 +369,8 @@ bugzilla.kernel.org는 리눅스 커널 개발자들이 커널의 버그를 추
|
|||
kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라.
|
||||
http://test.kernel.org/bugzilla/faq.html
|
||||
|
||||
메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그일 것 같은
|
||||
것을 보고하는는 법에 관한 좋은 템플릿이고 문제를 추적하기 위해서 커널
|
||||
메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그라고 생각되는
|
||||
것을 보고하는 방법에 관한 좋은 템플릿이며 문제를 추적하기 위해서 커널
|
||||
개발자들이 필요로 하는 정보가 무엇들인지를 상세히 설명하고 있다.
|
||||
|
||||
|
||||
|
@ -383,7 +385,7 @@ kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라.
|
|||
점수를 얻을 수 있는 가장 좋은 방법중의 하나이다. 왜냐하면 많은 사람들은
|
||||
다른 사람들의 버그들을 수정하기 위하여 시간을 낭비하지 않기 때문이다.
|
||||
|
||||
이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernelorg를
|
||||
이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernel.org를
|
||||
참조하라. 여러분이 앞으로 생겨날 버그 리포트들의 조언자가 되길 원한다면
|
||||
bugme-new 메일링 리스트나(새로운 버그 리포트들만이 이곳에서 메일로 전해진다)
|
||||
bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메일로 전해진다)
|
||||
|
@ -404,8 +406,8 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
웹상의 많은 다른 곳에도 메일링 리스트의 아카이브들이 있다.
|
||||
이러한 아카이브들을 찾으려면 검색 엔진을 사용하라. 예를 들어:
|
||||
http://dir.gmane.org/gmane.linux.kernel
|
||||
여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 대한
|
||||
것을 아카이브에서 먼저 찾기를 강력히 권장한다. 이미 상세하게 토론된 많은
|
||||
여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 관한
|
||||
것을 아카이브에서 먼저 찾아보기를 강력히 권장한다. 이미 상세하게 토론된 많은
|
||||
것들이 메일링 리스트의 아카이브에 기록되어 있다.
|
||||
|
||||
각각의 커널 서브시스템들의 대부분은 자신들의 개발에 관한 노력들로 이루어진
|
||||
|
@ -443,7 +445,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
무엇보다도 메일링 리스트의 다른 구독자들에게 보여주려 한다는 것을 기억하라.
|
||||
|
||||
|
||||
커뮤니티와 일하는 법
|
||||
커뮤니티와 협력하는 법
|
||||
--------------------
|
||||
|
||||
커널 커뮤니티의 목적은 가능한한 가장 좋은 커널을 제공하는 것이다. 여러분이
|
||||
|
@ -474,7 +476,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을
|
||||
기억하라.
|
||||
|
||||
여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는
|
||||
여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는
|
||||
경우도 흔하다. 이것은 여러분의 패치가 받아들여지지 않을 것이라는 것을
|
||||
의미하는 것이 아니고 개인적으로 여러분에게 감정이 있어서 그러는 것도
|
||||
아니다. 간단히 여러분의 패치에 제기된 문제들을 수정하고 그것을 다시
|
||||
|
@ -486,12 +488,12 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의
|
||||
문제를 피하기 위한 목록이 있다.
|
||||
여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 :
|
||||
- " 이것은 여러 문제들을 해겹합니다."
|
||||
- "이것은 여러 문제들을 해겹합니다."
|
||||
- "이것은 2000 라인의 코드를 제거합니다."
|
||||
- "이것은 내가 말하려는 것에 관해 설명하는 패치입니다."
|
||||
- "나는 5개의 다른 아키텍쳐에서 그것을 테스트했슴으로..."
|
||||
- "여기에 일련의 작은 패치들이 있습음로..."
|
||||
- "이것은 일반적인 머신에서 성능을 향상시키므로..."
|
||||
- "여기에 일련의 작은 패치들이 있슴음로..."
|
||||
- "이것은 일반적인 머신에서 성능을 향상시킴으로..."
|
||||
|
||||
여러분들이 말할 때 피해야 할 좋지 않은 것들 :
|
||||
- "우리를 그것을 AIT/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀립없다..."
|
||||
|
@ -500,7 +502,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
- "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다."
|
||||
- "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다."
|
||||
- "나는 6달동안 이것을 했으니..."
|
||||
- "여기세 5000라인 짜리 패치가 있으니..."
|
||||
- "여기에 5000라인 짜리 패치가 있으니..."
|
||||
- "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..."
|
||||
- "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다."
|
||||
|
||||
|
@ -510,13 +512,13 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
|
|||
없다는 것이다. 리눅스 커널의 작업 환경에서는 단지 이메일 주소만
|
||||
알수 있기 때문에 여성과 소수 민족들도 모두 받아들여진다. 국제적으로
|
||||
일하게 되는 측면은 사람의 이름에 근거하여 성별을 추측할 수 없게
|
||||
하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와
|
||||
하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와
|
||||
Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅스 커널에서
|
||||
작업하며 생각을 표현해왔던 대부분의 여성들은 긍정적인 경험을 가지고
|
||||
있다.
|
||||
|
||||
언어 장벽은 영어에 익숙하지 않은 몇몇 사람들에게 문제가 될 수도 있다.
|
||||
언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을
|
||||
언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을
|
||||
표현하기 위하여 필요하다. 그래서 여러분은 이메일을 보내기 전에
|
||||
영어를 올바르게 사용하고 있는지를 체크하는 것이 바람직하다.
|
||||
|
||||
|
@ -524,13 +526,13 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
여러분의 변경을 나누어라
|
||||
------------------------
|
||||
|
||||
리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음을 쉽게
|
||||
리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음(chunk)을 쉽게
|
||||
받아들이지 않는다. 변경은 적절하게 소개되고, 검토되고, 각각의
|
||||
부분으로 작게 나누어져야 한다. 이것은 회사에서 하는 것과는 정확히
|
||||
반대되는 것이다. 여러분들의 제안은 개발 초기에 일찍이 소개되야 한다.
|
||||
그래서 여러분들은 자신이 하고 있는 것에 관하여 피드백을 받을 수 있게
|
||||
된다. 커뮤니티가 여러분들이 커뮤니티와 함께 일하고 있다는 것을
|
||||
느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로서
|
||||
느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로써
|
||||
사용되지 않고 있다는 것을 느끼게 하자. 그러나 메일링 리스트에 한번에
|
||||
50개의 이메일을 보내지는 말아라. 여러분들의 일련의 패치들은 항상
|
||||
더 작아야 한다.
|
||||
|
@ -539,7 +541,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
|
||||
1) 작은 패치들은 여러분의 패치들이 적용될 수 있는 확률을 높여준다.
|
||||
왜냐하면 다른 사람들은 정확성을 검증하기 위하여 많은 시간과 노력을
|
||||
들이기를 원하지 않는다. 5줄의 패치는 메인트너가 거의 몇 초간 힐끗
|
||||
들이기를 원하지 않는다. 5줄의 패치는 메인테이너가 거의 몇 초간 힐끗
|
||||
보면 적용될 수 있다. 그러나 500 줄의 패치는 정확성을 검토하기 위하여
|
||||
몇시간이 걸릴 수도 있다(걸리는 시간은 패치의 크기 혹은 다른 것에
|
||||
비례하여 기하급수적으로 늘어난다).
|
||||
|
@ -558,18 +560,18 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
간결하고 가장 뛰어난 답을 보길 원한다. 훌륭한 학생은 이것을 알고
|
||||
마지막으로 답을 얻기 전 중간 과정들을 제출하진 않는다.
|
||||
|
||||
커널 개발도 마찬가지이다. 메인트너들과 검토하는 사람들은 문제를
|
||||
커널 개발도 마찬가지이다. 메인테이너들과 검토하는 사람들은 문제를
|
||||
풀어나가는 과정속에 숨겨진 과정을 보길 원하진 않는다. 그들은
|
||||
간결하고 멋진 답을 보길 원한다."
|
||||
|
||||
커뮤니티와 함께 일하며 뛰어난 답을 찾고 여러분들의 완성되지 않은 일들
|
||||
사이에 균형을 유지해야 하는 어려움이 있을 수 있다. 그러므로 프로세스의
|
||||
초반에 여러분의 일을 향상시키기위한 피드백을 얻는 것 뿐만 아니라
|
||||
커뮤니티와 협력하며 뛰어난 답을 찾는 것과 여러분들의 끝마치지 못한 작업들
|
||||
사이에 균형을 유지해야 하는 것은 어려울지도 모른다. 그러므로 프로세스의
|
||||
초반에 여러분의 작업을 향상시키기위한 피드백을 얻는 것 뿐만 아니라
|
||||
여러분들의 변경들을 작은 묶음으로 유지해서 심지어는 여러분의 작업의
|
||||
모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 이미
|
||||
모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 벌써
|
||||
받아들여질 수 있도록 유지하는 것이 바람직하다.
|
||||
|
||||
또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들은 포함하는
|
||||
또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들을 포함하는
|
||||
패치들은 받아들여지지 않을 것이라는 점을 유념하라.
|
||||
|
||||
변경을 정당화해라
|
||||
|
@ -577,7 +579,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
|
||||
여러분들의 나누어진 패치들을 리눅스 커뮤니티가 왜 반영해야 하는지를
|
||||
알도록 하는 것은 매우 중요하다. 새로운 기능들이 필요하고 유용하다는
|
||||
것은 반드시 그에 맞는 이유가 있어야 한다.
|
||||
것은 반드시 그에 합당한 이유가 있어야 한다.
|
||||
|
||||
|
||||
변경을 문서화해라
|
||||
|
@ -588,7 +590,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
것이다. 그리고 항상 그 내용을 보길 원하는 모든 사람들을 위해 보존될
|
||||
것이다. 패치는 완벽하게 다음과 같은 내용들을 포함하여 설명해야 한다.
|
||||
- 변경이 왜 필요한지
|
||||
- 패치에 관한 전체 설계 어프로치
|
||||
- 패치에 관한 전체 설계 접근(approach)
|
||||
- 구현 상세들
|
||||
- 테스트 결과들
|
||||
|
||||
|
@ -600,7 +602,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
|
|||
|
||||
|
||||
이 모든 것을 하는 것은 매우 어려운 일이다. 완벽히 소화하는 데는 적어도 몇년이
|
||||
걸릴 수도 있다. 많은 인내와 결의가 필요한 계속되는 개선의 과정이다. 그러나
|
||||
걸릴 수도 있다. 많은 인내와 결심이 필요한 계속되는 개선의 과정이다. 그러나
|
||||
가능한한 포기하지 말라. 많은 사람들은 이전부터 해왔던 것이고 그 사람들도
|
||||
정확하게 여러분들이 지금 서 있는 그 곳부터 시작했었다.
|
||||
|
||||
|
@ -620,4 +622,4 @@ David A. Wheeler, Junio Hamano, Michael Kerrisk, and Alex Shepard에게도 감
|
|||
|
||||
|
||||
|
||||
메인트너: Greg Kroah-Hartman <greg@kroah.com>
|
||||
메인테이너: Greg Kroah-Hartman <greg@kroah.com>
|
||||
|
|
|
@ -0,0 +1,195 @@
|
|||
NOTE:
|
||||
This is a version of Documentation/stable_api_nonsense.txt translated
|
||||
into korean
|
||||
This document is maintained by barrios <minchan.kim@gmail.com>
|
||||
If you find any difference between this document and the original file or
|
||||
a problem with the translation, please contact the maintainer of this file.
|
||||
|
||||
Please also note that the purpose of this file is to be easier to
|
||||
read for non English (read: korean) speakers and is not intended as
|
||||
a fork. So if you have any comments or updates for this file please
|
||||
try to update the original English file first.
|
||||
|
||||
==================================
|
||||
이 문서는
|
||||
Documentation/stable_api_nonsense.txt
|
||||
의 한글 번역입니다.
|
||||
|
||||
역자: 김민찬 <minchan.kim@gmail.com>
|
||||
감수: 이제이미 <jamee.lee@samsung.com>
|
||||
==================================
|
||||
|
||||
리눅스 커널 드라이버 인터페이스
|
||||
(여러분들의 모든 질문에 대한 답 그리고 다른 몇가지)
|
||||
|
||||
Greg Kroah-Hartman <greg@kroah.com>
|
||||
|
||||
이 문서는 리눅스가 왜 바이너리 커널 인터페이스를 갖지 않는지, 왜 변하지
|
||||
않는(stable) 커널 인터페이스를 갖지 않는지를 설명하기 위해 쓰여졌다.
|
||||
이 문서는 커널과 유저공간 사이의 인터페이스가 아니라 커널 내부의
|
||||
인터페이스들을 설명하고 있다는 것을 유념하라. 커널과 유저공간 사이의
|
||||
인터페이스는 응용프로그램이 사용하는 syscall 인터페이스이다. 그 인터페이스는
|
||||
오랫동안 거의 변하지 않았고 앞으로도 변하지 않을 것이다. 나는 pre 0.9에서
|
||||
만들어졌지만 최신의 2.6 커널 배포에서도 잘 동작하는 프로그램을 가지고
|
||||
있다. 이 인터페이스는 사용자와 응용프로그램 개발자들이 변하지 않을 것이라고
|
||||
여길수 있는 것이다.
|
||||
|
||||
|
||||
초록
|
||||
----
|
||||
여러분은 변하지 않는 커널 인터페이스를 원한다고 생각하지만 실제로는
|
||||
그렇지 않으며 심지어는 그것을 알아채지 못한다. 여러분이 원하는 것은
|
||||
안정되게 실행되는 드라이버이며 드라이버가 메인 커널 트리에 있을 때
|
||||
그런 안정적인 드라이버를 얻을 수 있게 된다. 또한 여러분의 드라이버가
|
||||
메인 커널 트리에 있다면 다른 많은 좋은 이점들을 얻게 된다. 그러한 것들이
|
||||
리눅스를 강건하고, 안정적이며, 성숙한 운영체제로 만들어 놓음으로써
|
||||
여러분들로 하여금 바로 리눅스를 사용하게 만드는 이유이다.
|
||||
|
||||
|
||||
소개
|
||||
----
|
||||
|
||||
커널 내부의 인터페이스가 바뀌는 것을 걱정하며 커널 드라이버를 작성하고
|
||||
싶어하는 사람은 정말 이상한 사람이다. 세상의 대다수의 사람들은 이 인터페이스를
|
||||
보지못할 것이며 전혀 걱정하지도 않는다.
|
||||
|
||||
먼저, 나는 closed 소스, hidden 소스, binary blobs, 소스 wrappers, 또는 GPL로
|
||||
배포되었지만 소스 코드를 갖고 있지 않은 커널 드라이버들을 설명하는 어떤 다른
|
||||
용어들에 관한 어떤 법적인 문제에 관해서는 언급하지 않을 것이다. 어떤 법적인
|
||||
질문들을 가지고 있다면 변호사와 연락하라. 나는 프로그래머이므로 여기서 기술적인
|
||||
문제들만을 설명하려고 한다. (법적인 문제를 경시하는 것은 아니다. 그런 문제들은
|
||||
엄연히 현실에 있고 여러분들은 항상 그 문제들을 인식하고 있을 필요는 있다.)
|
||||
|
||||
자, 두가지의 주요 주제가 있다. 바이너리 커널 인터페이스들과 변하지 않는
|
||||
커널 소스 인터페이들. 그것들은 서로 의존성을 가지고 있지만 바이너리
|
||||
문제를 먼저 풀고 넘어갈 것이다.
|
||||
|
||||
|
||||
|
||||
바이너리 커널 인터페이스
|
||||
------------------------
|
||||
우리가 변하지 않는 커널 소스 인터페이스를 가지고 있다고 가정하자. 그러면
|
||||
바이너리 인터페이스 또한 자연적으로 변하지 않을까? 틀렸다. 리눅스 커널에
|
||||
관한 다음 사실들을 생각해보라.
|
||||
- 여러분들이 사용하는 C 컴파일러의 버젼에 따라 다른 커널 자료 구조들은
|
||||
다른 alignmnet들을 갖게 될것이고 다른 방법으로(함수들을 inline으로
|
||||
했느냐, 아니냐) 다른 함수들을 포함하는 것도 가능한다. 중요한 것은
|
||||
개별적인 함수 구성이 아니라 자료 구조 패딩이 달라진다는 점이다.
|
||||
- 여러분이 선택한 커널 빌드 옵션에 따라서 커널은 다양한 것들을 가정할
|
||||
수 있다.
|
||||
- 다른 구조체들은 다른 필드들을 포함할 수 있다.
|
||||
- 몇몇 함수들은 전혀 구현되지 않을 수도 있다(즉, 몇몇 lock들은
|
||||
non-SMP 빌드에서는 사라져 버릴수도 있다).
|
||||
- 커널내에 메모리는 build optoin들에 따라 다른 방법으로 align될수
|
||||
있다.
|
||||
- 리눅스는 많은 다양한 프로세서 아키텍쳐에서 실행된다. 한 아키텍쳐의
|
||||
바이너리 드라이버를 다른 아키텍쳐에서 정상적으로 실행시킬 방법은
|
||||
없다.
|
||||
|
||||
커널을 빌드했던 C 컴파일러와 정확하게 같은 것을 사용하고 정확하게 같은
|
||||
커널 구성(configuration)을 사용하여 여러분들의 모듈을 빌드하면 간단히
|
||||
많은 문제들을 해결할 수 있다. 이렇게 하는 것은 여러분들이 하나의 리눅스
|
||||
배포판의 하나의 배포 버젼을 위한 모듈만을 제공한다면 별일 아닐 것이다.
|
||||
그러나 각기 다른 리눅스 배포판마다 한번씩 빌드하는 수를 각 리눅스 배포판마다
|
||||
제공하는 다른 릴리즈의 수와 곱하게 되면 이번에는 각 릴리즈들의 다른 빌드
|
||||
옵션의 악몽과 마주하게 것이다. 또한 각 리눅스 배포판들은 다른 하드웨어
|
||||
종류에(다른 프로세서 타입과 다른 옵션들) 맞춰져 있는 많은 다른 커널들을
|
||||
배포한다. 그러므로 한번의 배포에서조차 여러분들의 모듈은 여러 버젼을
|
||||
만들 필요가 있다.
|
||||
|
||||
나를 믿어라. 여러분들은 이러한 종류의 배포를 지원하려고 시도한다면 시간이
|
||||
지나면 미칠지경이 될 것이다. 난 이러한 것을 오래전에 아주 어렵게 배웠다...
|
||||
|
||||
|
||||
|
||||
변하지않는 커널 소스 인터페이스들
|
||||
---------------------------------
|
||||
|
||||
리눅스 커널 드라이버를 계속해서 메인 커널 트리에 반영하지 않고
|
||||
유지보수하려고 하는 사름들과 이 문제를 논의하게 되면 훨씬 더
|
||||
"논란의 여지가 많은" 주제가 될 것이다.
|
||||
|
||||
리눅스 커널 개발은 끊임없이 빠른 속도로 이루어지고 있으며 결코
|
||||
느슨해진 적이 없다. 커널 개발자들이 현재 인터페이스들에서 버그를
|
||||
발견하거나 무엇인가 할수 있는 더 좋은 방법을 찾게 되었다고 하자.
|
||||
그들이 발견한 것을 실행한다면 아마도 더 잘 동작하도록 현재 인터페이스들을
|
||||
수정하게 될 것이다. 그들이 그런 일을 하게되면 함수 이름들은 변하게 되고,
|
||||
구조체들은 늘어나거나 줄어들게 되고, 함수 파라미터들은 재작업될 것이다.
|
||||
이러한 일이 발생되면 커널 내에 이 인터페이스를 사용했던 인스턴스들이 동시에
|
||||
수정될 것이며 이러한 과정은 모든 것이 계속해서 올바르게 동작할 것이라는
|
||||
것을 보장한다.
|
||||
|
||||
이러한 것의 한 예로써, 커널 내부의 USB 인터페이스들은 이 서브시스템이
|
||||
생긴 이후로 적어도 3번의 다른 재작업을 겪었다. 이 재작업들은 많은 다른
|
||||
문제들을 풀었다.
|
||||
- 데이터 스트림들의 동기적인 모델에서 비동기적인 모델로의 변화. 이것은
|
||||
많은 드라이버들의 복잡성을 줄이고 처리량을 향상시켜 현재는 거의 모든
|
||||
USB 장치들의 거의 최대 속도로 실행되고 있다.
|
||||
- USB 드라이버가 USB 코어로부터 데이터 패킷들을 할당받로록 한 변경으로
|
||||
인해서 지금의 모든 드라이버들은 많은 문서화된 데드락을 수정하기 위하여
|
||||
USB 코어에게 더 많은 정보를 제공해야만 한다.
|
||||
|
||||
이것은 오랫동안 자신의 오래된 USB 인터페이스들을 유지해야 하는 closed 운영체제들과는
|
||||
완전히 반대되는 것이다. closed된 운영체제들은 새로운 개발자들에게 우연히 낡은
|
||||
인터페이스를 사용하게 할 기회를 주게되며, 적절하지 못한 방법으로 처리하게 되어
|
||||
운영체제의 안정성을 해치는 문제를 야기하게 된다.
|
||||
|
||||
이 두가지의 예들 모두, 모든 개발자들은 꼭 이루어져야 하는 중요한 변화들이라고
|
||||
동의를 하였고 비교적 적은 고통으로 변경되어졌다. 리눅스가 변하지 않는 소스
|
||||
인터페이스를 고집한다면, 새로운 인터페이스가 만들어지게 되며 반면 기존의 오래된
|
||||
것들, 그리고 깨진 것들은 계속해서 유지되어야 하며 이러한 일들은 USB 개발자들에게
|
||||
또 다른 일거리를 주게 된다. 모든 리눅스 USB 개발자들에게 자신의 그들의 업무를
|
||||
마친 후 시간을 투자하여 아무 득도 없는 무료 봉사를 해달라고 하는 것은 가능성이
|
||||
희박한 일이다.
|
||||
|
||||
보안 문제 역시 리눅스에게는 매우 중요하다. 보안 문제가 발견되면 그것은
|
||||
매우 짧은 시간 안에 수정된다. 보안 문제는 그 문제를 해결하기 위하여
|
||||
여러번 내부 커널 인터페이스들을 재작업하게 만들었다. 이러한 문제가
|
||||
발생하였을 때 그 인터페이스들을 사용하는 모든 드라이버들도 동시에
|
||||
수정되어 보안 문제가 앞으로 갑작스럽게 생기지는 않을 것이라는 것을
|
||||
보장한다. 내부 인터페이스들의 변경이 허락되지 않으면 이러한 종류의 보안
|
||||
문제를 수정하고 그것이 다시 발생하지 않을 것이라고 보장하는 것은 가능하지
|
||||
않을 것이다.
|
||||
|
||||
커널 인터페이스들은 계속해서 정리되고 있다. 현재 인터페이스를 사용하는
|
||||
사람이 한명도 없다면 그것은 삭제된다. 이것은 커널이 가능한한 가장 작게
|
||||
유지되며 존재하는 모든 가능성이 있는 인터페이스들이 테스트된다는 것을
|
||||
보장한다(사용되지 않는 인터페이스들은 유효성 검증을 하기가 거의 불가능하다).
|
||||
|
||||
|
||||
무엇을 해야 하나
|
||||
---------------
|
||||
자, 여러분이 메인 커널 트리에 있지 않은 리눅스 커널 드라이버를 가지고
|
||||
있다면 여러분은 즉, 개발자는 무엇을 해야 하나? 모든 배포판마다 다른
|
||||
커널 버젼을 위한 바이너리 드라이버를 배포하는 것은 악몽이며 계속해서
|
||||
변하고 있는 커널 인터페이스들의 맞처 유지보수하려고 시도하는 것은 힘든
|
||||
일이다.
|
||||
|
||||
간단하다. 여러분의 커널 드라이버를 메인 커널 트리에 반영하라(우리는 여기서
|
||||
GPL을 따르는 배포 드라이버에 관해 얘기하고 있다는 것을 상기하라. 여러분의
|
||||
코드가 이러한 분류에 해당되지 않는다면 행운을 빈다. 여러분 스스로 어떻게든
|
||||
해야만 한다). 여러분의 드라이버가 트리에 있게되면 커널 인터페이스가
|
||||
변경되더라도 가장 먼저 커널에 변경을 가했던 사람에 의해서 수정될 것이다.
|
||||
이것은 여러분의 드라이버가 여러분의 별다른 노력없이 항상 빌드가 가능하며
|
||||
동작하는 것을 보장한다.
|
||||
|
||||
메인 커널 트리에 여러분의 드라이버를 반영하면 얻게 되는 장점들은 다음과 같다.
|
||||
- 관리의 드는 비용(원래 개발자의)은 줄어줄면서 드라이버의 질은 향상될 것이다.
|
||||
- 다른 개발자들이 여러분의 드라이버에 기능들을 추가 할 것이다.
|
||||
- 다른 사람들은 여러분의 드라이버에 버그를 발견하고 수정할 것이다.
|
||||
- 다른 사람들은 여러분의 드라이버의 개선점을 찾을 줄 것이다.
|
||||
- 외부 인터페이스 변경으로 인해 여러분의 드라이버의 수정이 필요하다면 다른
|
||||
사람들이 드라이버를 업데이트할 것이다.
|
||||
- 여러분의 드라이버는 별다른 노력 없이 모든 리눅스 배포판에 자동적으로
|
||||
추가될 것이다.
|
||||
|
||||
리눅스는 다른 운영 체제보다 "쉽게 쓸수 있는(out of the box)" 많은 다른 장치들을
|
||||
지원하고 어떤 다른 운영 체제보다 다양한 아키텍쳐위에서 이러한 장치들을 지원하기 때문에
|
||||
이러한 증명된 개발 모델은 틀림없이 바로 가고 있는 것이다.
|
||||
|
||||
|
||||
|
||||
------
|
||||
|
||||
이 문서의 초안을 검토해주고 코멘트 해준 Randy Dunlap, Andrew Morton, David Brownell,
|
||||
Hanna Linder, Robert Love, 그리고 Nishanth Aravamudan에게 감사한다.
|
|
@ -1,93 +0,0 @@
|
|||
|
||||
Parallel link cable for Texas Instruments handhelds
|
||||
===================================================
|
||||
|
||||
|
||||
Author: Romain Lievin
|
||||
Homepage: http://lpg.ticalc.org/prj_tidev/index.html
|
||||
|
||||
|
||||
INTRODUCTION:
|
||||
|
||||
This is a driver for the very common home-made parallel link cable, a cable
|
||||
designed for connecting TI8x/9x graphing calculators (handhelds) to a computer
|
||||
or workstation (Alpha, Sparc). Given that driver is built on parport, the
|
||||
parallel port abstraction layer, this driver is architecture-independent.
|
||||
|
||||
It can also be used with another device plugged on the same port (such as a
|
||||
ZIP drive). I have a 100MB ZIP and both of them work fine!
|
||||
|
||||
If you need more information, please visit the 'TI drivers' homepage at the URL
|
||||
above.
|
||||
|
||||
WHAT YOU NEED:
|
||||
|
||||
A TI calculator and a program capable of communicating with your calculator.
|
||||
|
||||
TiLP will work for sure (since I am its developer!). yal92 may be able to use
|
||||
it by changing tidev for tipar (may require some hacking...).
|
||||
|
||||
HOW TO USE IT:
|
||||
|
||||
You must have first compiled parport support (CONFIG_PARPORT_DEV): either
|
||||
compiled in your kernel, either as a module.
|
||||
|
||||
Next, (as root):
|
||||
|
||||
modprobe parport
|
||||
modprobe tipar
|
||||
|
||||
If it is not already there (it usually is), create the device:
|
||||
|
||||
mknod /dev/tipar0 c 115 0
|
||||
mknod /dev/tipar1 c 115 1
|
||||
mknod /dev/tipar2 c 115 2
|
||||
|
||||
You will have to set permissions on this device to allow you to read/write
|
||||
from it:
|
||||
|
||||
chmod 666 /dev/tipar[0..2]
|
||||
|
||||
Now you are ready to run a linking program such as TiLP. Be sure to configure
|
||||
it properly (RTFM).
|
||||
|
||||
MODULE PARAMETERS:
|
||||
|
||||
You can set these with: modprobe tipar NAME=VALUE
|
||||
There is currently no way to set these on a per-cable basis.
|
||||
|
||||
NAME: timeout
|
||||
TYPE: integer
|
||||
DEFAULT: 15
|
||||
DESC: Timeout value in tenth of seconds. If no data is available once this
|
||||
time has expired then the driver will return with a timeout error.
|
||||
|
||||
NAME: delay
|
||||
TYPE: integer
|
||||
DEFAULT: 10
|
||||
DESC: Inter-bit delay in micro-seconds. A lower value gives an higher data
|
||||
rate but makes transmission less reliable.
|
||||
|
||||
These parameters can be changed at run time by any program via ioctl(2) calls
|
||||
as listed in ./include/linux/ticable.h.
|
||||
|
||||
Rather than write 50 pages describing the ioctl() and so on, it is
|
||||
perhaps more useful you look at ticables library (dev_link.c) that demonstrates
|
||||
how to use them, and demonstrates the features of the driver. This is
|
||||
probably a lot more useful to people interested in writing applications
|
||||
that will be using this driver.
|
||||
|
||||
QUIRKS/BUGS:
|
||||
|
||||
None.
|
||||
|
||||
HOW TO CONTACT US:
|
||||
|
||||
You can email me at roms@lpg.ticalc.org. Please prefix the subject line
|
||||
with "TIPAR: " so that I am certain to notice your message.
|
||||
You can also mail JB at jb@jblache.org. He packaged these drivers for Debian.
|
||||
|
||||
CREDITS:
|
||||
|
||||
The code is based on tidev.c & parport.c.
|
||||
The driver has been developed independently of Texas Instruments.
|
|
@ -3699,11 +3699,6 @@ M: nagar@watson.ibm.com
|
|||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
TI PARALLEL LINK CABLE DRIVER
|
||||
P: Romain Lievin
|
||||
M: roms@lpg.ticalc.org
|
||||
S: Maintained
|
||||
|
||||
TIPC NETWORK LAYER
|
||||
P: Per Liden
|
||||
M: per.liden@ericsson.com
|
||||
|
|
|
@ -543,28 +543,6 @@ config PPDEV
|
|||
|
||||
If unsure, say N.
|
||||
|
||||
config TIPAR
|
||||
tristate "Texas Instruments parallel link cable support"
|
||||
depends on PARPORT
|
||||
---help---
|
||||
If you own a Texas Instruments graphing calculator and use a
|
||||
parallel link cable, then you might be interested in this driver.
|
||||
|
||||
If you enable this driver, you will be able to communicate with
|
||||
your calculator through a set of device nodes under /dev. The
|
||||
main advantage of this driver is that you don't have to be root
|
||||
to use this precise link cable (depending on the permissions on
|
||||
the device nodes, though).
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called tipar.
|
||||
|
||||
If you don't know what a parallel link cable is or what a Texas
|
||||
Instruments graphing calculator is, then you probably don't need this
|
||||
driver.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
config HVC_DRIVER
|
||||
bool
|
||||
help
|
||||
|
|
|
@ -1,557 +0,0 @@
|
|||
/* Hey EMACS -*- linux-c -*-
|
||||
*
|
||||
* tipar - low level driver for handling a parallel link cable designed
|
||||
* for Texas Instruments graphing calculators (http://lpg.ticalc.org).
|
||||
* A part of the TiLP project.
|
||||
*
|
||||
* Copyright (C) 2000-2002, Romain Lievin <roms@lpg.ticalc.org>
|
||||
* under the terms of the GNU General Public License.
|
||||
*
|
||||
* Various fixes & clean-up from the Linux Kernel Mailing List
|
||||
* (Alan Cox, Richard B. Johnson, Christoph Hellwig).
|
||||
*/
|
||||
|
||||
/* This driver should, in theory, work with any parallel port that has an
|
||||
* appropriate low-level driver; all I/O is done through the parport
|
||||
* abstraction layer.
|
||||
*
|
||||
* If this driver is built into the kernel, you can configure it using the
|
||||
* kernel command-line. For example:
|
||||
*
|
||||
* tipar=timeout,delay (set timeout and delay)
|
||||
*
|
||||
* If the driver is loaded as a module, similar functionality is available
|
||||
* using module parameters. The equivalent of the above commands would be:
|
||||
*
|
||||
* # insmod tipar timeout=15 delay=10
|
||||
*/
|
||||
|
||||
/* COMPATIBILITY WITH OLD KERNELS
|
||||
*
|
||||
* Usually, parallel cables were bound to ports at
|
||||
* particular I/O addresses, as follows:
|
||||
*
|
||||
* tipar0 0x378
|
||||
* tipar1 0x278
|
||||
* tipar2 0x3bc
|
||||
*
|
||||
*
|
||||
* This driver, by default, binds tipar devices according to parport and
|
||||
* the minor number.
|
||||
*
|
||||
*/
|
||||
#undef DEBUG /* change to #define to get debugging
|
||||
* output - for pr_debug() */
|
||||
#include <linux/module.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/fcntl.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/parport.h> /* Our code depend on parport */
|
||||
#include <linux/device.h>
|
||||
|
||||
/*
|
||||
* TI definitions
|
||||
*/
|
||||
#include <linux/ticable.h>
|
||||
|
||||
/*
|
||||
* Version Information
|
||||
*/
|
||||
#define DRIVER_VERSION "1.19"
|
||||
#define DRIVER_AUTHOR "Romain Lievin <roms@lpg.ticalc.org>"
|
||||
#define DRIVER_DESC "Device driver for TI/PC parallel link cables"
|
||||
#define DRIVER_LICENSE "GPL"
|
||||
|
||||
#define VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq))
|
||||
|
||||
/* ----- global variables --------------------------------------------- */
|
||||
|
||||
struct tipar_struct {
|
||||
struct pardevice *dev; /* Parport device entry */
|
||||
};
|
||||
|
||||
#define PP_NO 3
|
||||
static struct tipar_struct table[PP_NO];
|
||||
|
||||
static int delay = IO_DELAY; /* inter-bit delay in microseconds */
|
||||
static int timeout = TIMAXTIME; /* timeout in tenth of seconds */
|
||||
|
||||
static unsigned int tp_count; /* tipar count */
|
||||
static unsigned long opened; /* opened devices */
|
||||
|
||||
static struct class *tipar_class;
|
||||
|
||||
/* --- macros for parport access -------------------------------------- */
|
||||
|
||||
#define r_dtr(x) (parport_read_data(table[(x)].dev->port))
|
||||
#define r_str(x) (parport_read_status(table[(x)].dev->port))
|
||||
#define w_ctr(x,y) (parport_write_control(table[(x)].dev->port, (y)))
|
||||
#define w_dtr(x,y) (parport_write_data(table[(x)].dev->port, (y)))
|
||||
|
||||
/* --- setting states on the D-bus with the right timing: ------------- */
|
||||
|
||||
static inline void
|
||||
outbyte(int value, int minor)
|
||||
{
|
||||
w_dtr(minor, value);
|
||||
}
|
||||
|
||||
static inline int
|
||||
inbyte(int minor)
|
||||
{
|
||||
return (r_str(minor));
|
||||
}
|
||||
|
||||
static inline void
|
||||
init_ti_parallel(int minor)
|
||||
{
|
||||
outbyte(3, minor);
|
||||
}
|
||||
|
||||
/* ----- global defines ----------------------------------------------- */
|
||||
|
||||
#define START(x) { x = jiffies + (HZ * timeout) / 10; }
|
||||
#define WAIT(x) { \
|
||||
if (time_before((x), jiffies)) return -1; \
|
||||
if (need_resched()) schedule(); }
|
||||
|
||||
/* ----- D-bus bit-banging functions ---------------------------------- */
|
||||
|
||||
/* D-bus protocol (45kbit/s max):
|
||||
1 0 0
|
||||
_______ ______|______ __________|________ __________
|
||||
Red : ________ | ____ | ____
|
||||
_ ____________|________ ______|__________ _____
|
||||
White: ________ | ______ | _______
|
||||
*/
|
||||
|
||||
/* Try to transmit a byte on the specified port (-1 if error). */
|
||||
static int
|
||||
put_ti_parallel(int minor, unsigned char data)
|
||||
{
|
||||
unsigned int bit;
|
||||
unsigned long max;
|
||||
|
||||
for (bit = 0; bit < 8; bit++) {
|
||||
if (data & 1) {
|
||||
outbyte(2, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (inbyte(minor) & 0x10);
|
||||
|
||||
outbyte(3, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (!(inbyte(minor) & 0x10));
|
||||
} else {
|
||||
outbyte(1, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (inbyte(minor) & 0x20);
|
||||
|
||||
outbyte(3, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (!(inbyte(minor) & 0x20));
|
||||
}
|
||||
|
||||
data >>= 1;
|
||||
udelay(delay);
|
||||
|
||||
if (need_resched())
|
||||
schedule();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Receive a byte on the specified port or -1 if error. */
|
||||
static int
|
||||
get_ti_parallel(int minor)
|
||||
{
|
||||
unsigned int bit;
|
||||
unsigned char v, data = 0;
|
||||
unsigned long max;
|
||||
|
||||
for (bit = 0; bit < 8; bit++) {
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while ((v = inbyte(minor) & 0x30) == 0x30);
|
||||
|
||||
if (v == 0x10) {
|
||||
data = (data >> 1) | 0x80;
|
||||
outbyte(1, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (!(inbyte(minor) & 0x20));
|
||||
outbyte(3, minor);
|
||||
} else {
|
||||
data = data >> 1;
|
||||
outbyte(2, minor);
|
||||
START(max);
|
||||
do {
|
||||
WAIT(max);
|
||||
} while (!(inbyte(minor) & 0x10));
|
||||
outbyte(3, minor);
|
||||
}
|
||||
|
||||
udelay(delay);
|
||||
if (need_resched())
|
||||
schedule();
|
||||
}
|
||||
|
||||
return (int) data;
|
||||
}
|
||||
|
||||
/* Try to detect a parallel link cable on the specified port */
|
||||
static int
|
||||
probe_ti_parallel(int minor)
|
||||
{
|
||||
int i;
|
||||
int seq[] = { 0x00, 0x20, 0x10, 0x30 };
|
||||
int data;
|
||||
|
||||
for (i = 3; i >= 0; i--) {
|
||||
outbyte(3, minor);
|
||||
outbyte(i, minor);
|
||||
udelay(delay);
|
||||
data = inbyte(minor) & 0x30;
|
||||
pr_debug("tipar: Probing -> %i: 0x%02x 0x%02x\n", i,
|
||||
data, seq[i]);
|
||||
if (data != seq[i]) {
|
||||
outbyte(3, minor);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
outbyte(3, minor);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----- kernel module functions--------------------------------------- */
|
||||
|
||||
static int
|
||||
tipar_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
unsigned int minor = iminor(inode) - TIPAR_MINOR;
|
||||
|
||||
if (tp_count == 0 || minor > tp_count - 1)
|
||||
return -ENXIO;
|
||||
|
||||
if (test_and_set_bit(minor, &opened))
|
||||
return -EBUSY;
|
||||
|
||||
if (!table[minor].dev) {
|
||||
printk(KERN_ERR "%s: NULL device for minor %u\n",
|
||||
__FUNCTION__, minor);
|
||||
return -ENXIO;
|
||||
}
|
||||
parport_claim_or_block(table[minor].dev);
|
||||
init_ti_parallel(minor);
|
||||
parport_release(table[minor].dev);
|
||||
|
||||
return nonseekable_open(inode, file);
|
||||
}
|
||||
|
||||
static int
|
||||
tipar_close(struct inode *inode, struct file *file)
|
||||
{
|
||||
unsigned int minor = iminor(inode) - TIPAR_MINOR;
|
||||
|
||||
if (minor > tp_count - 1)
|
||||
return -ENXIO;
|
||||
|
||||
clear_bit(minor, &opened);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
tipar_write (struct file *file, const char __user *buf, size_t count,
|
||||
loff_t * ppos)
|
||||
{
|
||||
unsigned int minor = iminor(file->f_path.dentry->d_inode) - TIPAR_MINOR;
|
||||
ssize_t n;
|
||||
|
||||
parport_claim_or_block(table[minor].dev);
|
||||
|
||||
for (n = 0; n < count; n++) {
|
||||
unsigned char b;
|
||||
|
||||
if (get_user(b, buf + n)) {
|
||||
n = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (put_ti_parallel(minor, b) == -1) {
|
||||
init_ti_parallel(minor);
|
||||
n = -ETIMEDOUT;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
out:
|
||||
parport_release(table[minor].dev);
|
||||
return n;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
tipar_read(struct file *file, char __user *buf, size_t count, loff_t * ppos)
|
||||
{
|
||||
int b = 0;
|
||||
unsigned int minor = iminor(file->f_path.dentry->d_inode) - TIPAR_MINOR;
|
||||
ssize_t retval = 0;
|
||||
ssize_t n = 0;
|
||||
|
||||
if (count == 0)
|
||||
return 0;
|
||||
|
||||
parport_claim_or_block(table[minor].dev);
|
||||
|
||||
while (n < count) {
|
||||
b = get_ti_parallel(minor);
|
||||
if (b == -1) {
|
||||
init_ti_parallel(minor);
|
||||
retval = -ETIMEDOUT;
|
||||
goto out;
|
||||
} else {
|
||||
if (put_user(b, buf + n)) {
|
||||
retval = -EFAULT;
|
||||
break;
|
||||
} else
|
||||
retval = ++n;
|
||||
}
|
||||
|
||||
/* Non-blocking mode : try again ! */
|
||||
if (file->f_flags & O_NONBLOCK) {
|
||||
retval = -EAGAIN;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Signal pending, try again ! */
|
||||
if (signal_pending(current)) {
|
||||
retval = -ERESTARTSYS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (need_resched())
|
||||
schedule();
|
||||
}
|
||||
|
||||
out:
|
||||
parport_release(table[minor].dev);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int
|
||||
tipar_ioctl(struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
switch (cmd) {
|
||||
case IOCTL_TIPAR_DELAY:
|
||||
delay = (int)arg; //get_user(delay, &arg);
|
||||
break;
|
||||
case IOCTL_TIPAR_TIMEOUT:
|
||||
if (arg != 0)
|
||||
timeout = (int)arg;
|
||||
else
|
||||
retval = -EINVAL;
|
||||
break;
|
||||
default:
|
||||
retval = -ENOTTY;
|
||||
break;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* ----- kernel module registering ------------------------------------ */
|
||||
|
||||
static const struct file_operations tipar_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = no_llseek,
|
||||
.read = tipar_read,
|
||||
.write = tipar_write,
|
||||
.ioctl = tipar_ioctl,
|
||||
.open = tipar_open,
|
||||
.release = tipar_close,
|
||||
};
|
||||
|
||||
/* --- initialisation code ------------------------------------- */
|
||||
|
||||
#ifndef MODULE
|
||||
/* You must set these - there is no sane way to probe for this cable.
|
||||
* You can use 'tipar=timeout,delay' to set these now. */
|
||||
static int __init
|
||||
tipar_setup(char *str)
|
||||
{
|
||||
int ints[3];
|
||||
|
||||
str = get_options(str, ARRAY_SIZE(ints), ints);
|
||||
|
||||
if (ints[0] > 0) {
|
||||
if (ints[1] != 0)
|
||||
timeout = ints[1];
|
||||
else
|
||||
printk(KERN_WARNING "tipar: bad timeout value (0), "
|
||||
"using default value instead");
|
||||
if (ints[0] > 1) {
|
||||
delay = ints[2];
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Register our module into parport.
|
||||
* Pass also 2 callbacks functions to parport: a pre-emptive function and an
|
||||
* interrupt handler function (unused).
|
||||
* Display a message such "tipar0: using parport0 (polling)".
|
||||
*/
|
||||
static int
|
||||
tipar_register(int nr, struct parport *port)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
/* Register our module into parport */
|
||||
table[nr].dev = parport_register_device(port, "tipar",
|
||||
NULL, NULL, NULL, 0,
|
||||
(void *) &table[nr]);
|
||||
|
||||
if (table[nr].dev == NULL) {
|
||||
err = 1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
device_create(tipar_class, port->dev, MKDEV(TIPAR_MAJOR,
|
||||
TIPAR_MINOR + nr), "par%d", nr);
|
||||
|
||||
/* Display informations */
|
||||
pr_info("tipar%d: using %s (%s)\n", nr, port->name, (port->irq ==
|
||||
PARPORT_IRQ_NONE) ? "polling" : "interrupt-driven");
|
||||
|
||||
if (probe_ti_parallel(nr) != -1)
|
||||
pr_info("tipar%d: link cable found\n", nr);
|
||||
else
|
||||
pr_info("tipar%d: link cable not found\n", nr);
|
||||
|
||||
err = 0;
|
||||
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void
|
||||
tipar_attach(struct parport *port)
|
||||
{
|
||||
if (tp_count == PP_NO) {
|
||||
pr_info("tipar: ignoring parallel port (max. %d)\n", PP_NO);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!tipar_register(tp_count, port))
|
||||
tp_count++;
|
||||
}
|
||||
|
||||
static void
|
||||
tipar_detach(struct parport *port)
|
||||
{
|
||||
/* Nothing to do */
|
||||
}
|
||||
|
||||
static struct parport_driver tipar_driver = {
|
||||
.name = "tipar",
|
||||
.attach = tipar_attach,
|
||||
.detach = tipar_detach,
|
||||
};
|
||||
|
||||
static int __init
|
||||
tipar_init_module(void)
|
||||
{
|
||||
int err = 0;
|
||||
|
||||
pr_info("tipar: parallel link cable driver, version %s\n",
|
||||
DRIVER_VERSION);
|
||||
|
||||
if (register_chrdev(TIPAR_MAJOR, "tipar", &tipar_fops)) {
|
||||
printk(KERN_ERR "tipar: unable to get major %d\n", TIPAR_MAJOR);
|
||||
err = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
tipar_class = class_create(THIS_MODULE, "ticables");
|
||||
if (IS_ERR(tipar_class)) {
|
||||
err = PTR_ERR(tipar_class);
|
||||
goto out_chrdev;
|
||||
}
|
||||
if (parport_register_driver(&tipar_driver)) {
|
||||
printk(KERN_ERR "tipar: unable to register with parport\n");
|
||||
err = -EIO;
|
||||
goto out_class;
|
||||
}
|
||||
|
||||
err = 0;
|
||||
goto out;
|
||||
|
||||
out_class:
|
||||
class_destroy(tipar_class);
|
||||
|
||||
out_chrdev:
|
||||
unregister_chrdev(TIPAR_MAJOR, "tipar");
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void __exit
|
||||
tipar_cleanup_module(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Unregistering module */
|
||||
parport_unregister_driver(&tipar_driver);
|
||||
|
||||
unregister_chrdev(TIPAR_MAJOR, "tipar");
|
||||
|
||||
for (i = 0; i < PP_NO; i++) {
|
||||
if (table[i].dev == NULL)
|
||||
continue;
|
||||
parport_unregister_device(table[i].dev);
|
||||
device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, i));
|
||||
}
|
||||
class_destroy(tipar_class);
|
||||
|
||||
pr_info("tipar: module unloaded\n");
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
__setup("tipar=", tipar_setup);
|
||||
module_init(tipar_init_module);
|
||||
module_exit(tipar_cleanup_module);
|
||||
|
||||
MODULE_AUTHOR(DRIVER_AUTHOR);
|
||||
MODULE_DESCRIPTION(DRIVER_DESC);
|
||||
MODULE_LICENSE(DRIVER_LICENSE);
|
||||
|
||||
module_param(timeout, int, 0);
|
||||
MODULE_PARM_DESC(timeout, "Timeout (default=1.5 seconds)");
|
||||
module_param(delay, int, 0);
|
||||
MODULE_PARM_DESC(delay, "Inter-bit delay (default=10 microseconds)");
|
|
@ -1,44 +0,0 @@
|
|||
/* Hey EMACS -*- linux-c -*-
|
||||
*
|
||||
* tipar/tiser/tiusb - low level driver for handling link cables
|
||||
* designed for Texas Instruments graphing calculators.
|
||||
*
|
||||
* Copyright (C) 2000-2002, Romain Lievin <roms@lpg.ticalc.org>
|
||||
*
|
||||
* Redistribution of this file is permitted under the terms of the GNU
|
||||
* Public License (GPL)
|
||||
*/
|
||||
|
||||
#ifndef _TICABLE_H
|
||||
#define _TICABLE_H 1
|
||||
|
||||
/* Internal default constants for the kernel module */
|
||||
#define TIMAXTIME 15 /* 1.5 seconds */
|
||||
#define IO_DELAY 10 /* 10 micro-seconds */
|
||||
|
||||
/* Major & minor number for character devices */
|
||||
#define TIPAR_MAJOR 115 /* 0 to 7 */
|
||||
#define TIPAR_MINOR 0
|
||||
|
||||
#define TISER_MAJOR 115 /* 8 to 15 */
|
||||
#define TISER_MINOR 8
|
||||
|
||||
#define TIUSB_MAJOR 115 /* 16 to 31 */
|
||||
#define TIUSB_MINOR 16
|
||||
|
||||
/*
|
||||
* Request values for the 'ioctl' function.
|
||||
*/
|
||||
#define IOCTL_TIPAR_DELAY _IOW('p', 0xa8, int) /* set delay */
|
||||
#define IOCTL_TIPAR_TIMEOUT _IOW('p', 0xa9, int) /* set timeout */
|
||||
|
||||
#define IOCTL_TISER_DELAY _IOW('p', 0xa0, int) /* set delay */
|
||||
#define IOCTL_TISER_TIMEOUT _IOW('p', 0xa1, int) /* set timeout */
|
||||
|
||||
#define IOCTL_TIUSB_TIMEOUT _IOW('N', 0x20, int) /* set timeout */
|
||||
#define IOCTL_TIUSB_RESET_DEVICE _IOW('N', 0x21, int) /* reset device */
|
||||
#define IOCTL_TIUSB_RESET_PIPES _IOW('N', 0x22, int) /* reset both pipes*/
|
||||
#define IOCTL_TIUSB_GET_MAXPS _IOR('N', 0x23, int) /* max packet size */
|
||||
#define IOCTL_TIUSB_GET_DEVID _IOR('N', 0x24, int) /* get device type */
|
||||
|
||||
#endif /* TICABLE_H */
|
|
@ -234,13 +234,13 @@ int kobject_register(struct kobject * kobj)
|
|||
|
||||
|
||||
/**
|
||||
* kobject_set_name - Set the name of an object
|
||||
* @kobj: object.
|
||||
* @fmt: format string used to build the name
|
||||
* kobject_set_name - Set the name of a kobject
|
||||
* @kobj: kobject to name
|
||||
* @fmt: format string used to build the name
|
||||
*
|
||||
* If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated
|
||||
* string that @kobj->k_name points to. Otherwise, use the static
|
||||
* @kobj->name array.
|
||||
* This sets the name of the kobject. If you have already added the
|
||||
* kobject to the system, you must call kobject_rename() in order to
|
||||
* change the name of the kobject.
|
||||
*/
|
||||
int kobject_set_name(struct kobject * kobj, const char * fmt, ...)
|
||||
{
|
||||
|
|
Загрузка…
Ссылка в новой задаче