Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+292 -802
+14
Documentation/ABI/testing/sysfs-kernel-uids
··· 1 + What: /sys/kernel/uids/<uid>/cpu_shares 2 + Date: December 2007 3 + Contact: Dhaval Giani <dhaval@linux.vnet.ibm.com> 4 + Srivatsa Vaddagiri <vatsa@linux.vnet.ibm.com> 5 + Description: 6 + The /sys/kernel/uids/<uid>/cpu_shares tunable is used 7 + to set the cpu bandwidth a user is allowed. This is a 8 + propotional value. What that means is that if there 9 + are two users logged in, each with an equal number of 10 + shares, then they will get equal CPU bandwidth. Another 11 + example would be, if User A has shares = 1024 and user 12 + B has shares = 2048, User B will get twice the CPU 13 + bandwidth user A will. For more details refer 14 + Documentation/sched-design-CFS.txt
+4 -4
Documentation/ja_JP/HOWTO
··· 11 11 fork. So if you have any comments or updates for this file, please try 12 12 to update the original English file first. 13 13 14 - Last Updated: 2007/09/23 14 + Last Updated: 2007/11/16 15 15 ================================== 16 16 これは、 17 - linux-2.6.23/Documentation/HOWTO 17 + linux-2.6.24/Documentation/HOWTO 18 18 の和訳です。 19 19 20 20 翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ > 21 - 翻訳日: 2007/09/19 21 + 翻訳日: 2007/11/10 22 22 翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com> 23 23 校正者: 松倉さん <nbh--mats at nifty dot com> 24 24 小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp> ··· 110 110 新しいドキュメントファイルも追加することを勧めます。 111 111 カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの 112 112 変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報 113 - をマニュアルページのメンテナ mtk-manpages@gmx.net に送ることを勧めま 113 + をマニュアルページのメンテナ mtk.manpages@gmail.com に送ることを勧めま 114 114 す。 115 115 116 116 以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
+73 -71
Documentation/ko_KR/HOWTO
··· 1 1 NOTE: 2 2 This is a version of Documentation/HOWTO translated into korean 3 - This document is maintained by minchan Kim < minchan.kim@gmail.com> 3 + This document is maintained by minchan Kim <minchan.kim@gmail.com> 4 4 If you find any difference between this document and the original file or 5 5 a problem with the translation, please contact the maintainer of this file. 6 6 ··· 14 14 Documentation/HOWTO 15 15 의 한글 번역입니다. 16 16 17 - 역자: 김민찬 <minchan.kim@gmail.com > 17 + 역자: 김민찬 <minchan.kim@gmail.com> 18 18 감수: 이제이미 <jamee.lee@samsung.com> 19 19 ================================== 20 20 ··· 23 23 24 24 이 문서는 커널 개발에 있어 가장 중요한 문서이다. 이 문서는 25 25 리눅스 커널 개발자가 되는 법과 리눅스 커널 개발 커뮤니티와 일하는 26 - 법을 담고있다. 커널 프로그래밍의기술적인 측면과 관련된 내용들은 27 - 포함하지 않으려고 하였지만 올바으로 여러분을 안내하는 데 도움이 26 + 법을 담고있다. 커널 프로그래밍의 기술적인 측면과 관련된 내용들은 27 + 포함하지 않으려고 하였지만 올바른 길로 여러분을 안내하는 데는 도움이 28 28 될 것이다. 29 29 30 - 이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인트너에게 30 + 이 문서에서 오래된 것을 발견하면 문서의 아래쪽에 나열된 메인테이너에게 31 31 패치를 보내달라. 32 32 33 33 ··· 36 36 37 37 자, 여러분은 리눅스 커널 개발자가 되는 법을 배우고 싶은가? 아니면 38 38 상사로부터"이 장치를 위한 리눅스 드라이버를 작성하시오"라는 말을 39 - 들었는가? 이 문서는 여러분이 겪게 될 과정과 커뮤니티와 일하는 법을 40 - 조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주는 41 - 것이다. 39 + 들었는가? 이 문서의 목적은 여러분이 겪게 될 과정과 커뮤니티와 협력하는 40 + 법을 조언하여 여러분의 목적을 달성하기 위해 필요한 것 모두를 알려주기 41 + 위함이다. 42 42 43 - 커널은 대부분은 C로 작성되었어고 몇몇 아키텍쳐의 의존적인 부분은 44 - 어셈블리로 작성되었다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다. 43 + 커널은 대부분은 C로 작성되어 있고 몇몇 아키텍쳐의 의존적인 부분은 44 + 어셈블리로 작성되어 있다. 커널 개발을 위해 C를 잘 이해하고 있어야 한다. 45 45 여러분이 특정 아키텍쳐의 low-level 개발을 할 것이 아니라면 46 46 어셈블리(특정 아키텍쳐)는 잘 알아야 할 필요는 없다. 47 47 다음의 참고서적들은 기본에 충실한 C 교육이나 수년간의 경험에 견주지는 ··· 59 59 어떤 참고문서도 있지 않다. 정보를 얻기 위해서는 gcc info (`info gcc`)페이지를 60 60 살펴보라. 61 61 62 - 여러분은 기존의 개발 커뮤니티와 일하는 법을 배우려고 하고 있다는 것을 63 - 기억하라. 코딩, 스타일, 절차에 관한 훌륭한 표준을 가진 사람들이 모인 62 + 여러분은 기존의 개발 커뮤니티와 협력하는 법을 배우려고 하고 있다는 것을 63 + 기억하라. 코딩, 스타일, 함수에 관한 훌륭한 표준을 가진 사람들이 모인 64 64 다양한 그룹이 있다. 이 표준들은 오랜동안 크고 지역적으로 분산된 팀들에 65 - 의해 가장 좋은 방법으로 일하기위하여 찾은 것을 기초로 만들어져왔다. 66 - 그 표준들은 문서화가 잘 되어 있기 때문에 가능한한 미리 많은 표준들에 65 + 의해 가장 좋은 방법으로 일하기 위하여 찾은 것을 기초로 만들어져 왔다. 66 + 그 표준들은 문서화가 잘 되어있기 때문에 가능한한 미리 많은 표준들에 67 67 관하여 배우려고 시도하라. 다른 사람들은 여러분이나 여러분의 회사가 68 68 일하는 방식에 적응하는 것을 원하지는 않는다. 69 69 ··· 73 73 74 74 리눅스 커널 소스 코드는 GPL로 배포(release)되었다. 소스트리의 메인 75 75 디렉토리에 있는 라이센스에 관하여 상세하게 쓰여 있는 COPYING이라는 76 - 파일을 봐라.여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면 76 + 파일을 봐라. 여러분이 라이센스에 관한 더 깊은 문제를 가지고 있다면 77 77 리눅스 커널 메일링 리스트에 묻지말고 변호사와 연락하라. 메일링 78 78 리스트들에 있는 사람들은 변호사가 아니기 때문에 법적 문제에 관하여 79 79 그들의 말에 의지해서는 안된다. ··· 85 85 문서 86 86 ---- 87 87 88 - 리눅스 커널 소스 트리는 커널 커뮤니티와 일하는 법을 배우기 위한 많은 89 - 귀중한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때, 88 + 리눅스 커널 소스 트리는 커널 커뮤니티와 협력하는 법을 배우기위해 훌륭한 89 + 다양한 문서들을 가지고 있다. 새로운 기능들이 커널에 들어가게 될 때, 90 90 그 기능을 어떻게 사용하는지에 관한 설명을 위하여 새로운 문서 파일을 91 91 추가하는 것을 권장한다. 커널이 유저스페이스로 노출하는 인터페이스를 92 92 변경하게 되면 변경을 설명하는 메뉴얼 페이지들에 대한 패치나 정보를 93 - mtk-manpages@gmx.net의 메인트너에게 보낼 것을 권장한다. 93 + mtk.manpages@gmail.com의 메인테이너에게 보낼 것을 권장한다. 94 94 95 95 다음은 커널 소스 트리에 있는 읽어야 할 파일들의 리스트이다. 96 96 README ··· 105 105 Documentation/CodingStyle 106 106 이 문서는 리눅스 커널 코딩 스타일과 그렇게 한 몇몇 이유를 설명한다. 107 107 모든 새로운 코드는 이 문서에 가이드라인들을 따라야 한다. 대부분의 108 - 메인트너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이 108 + 메인테이너들은 이 규칙을 따르는 패치들만을 받아들일 것이고 많은 사람들이 109 109 그 패치가 올바른 스타일일 경우만 코드를 검토할 것이다. 110 110 111 111 Documentation/SubmittingPatches ··· 115 115 - Email 내용들 116 116 - Email 양식 117 117 - 그것을 누구에게 보낼지 118 - 이러한 규칙들을 따르는 것이 성공을 보장하진 않는다(왜냐하면 모든 119 - 패치들은 내용과 스타일에 관하여 면밀히 검토되기 때문이다). 120 - 그러나 규칙을 따르지 않는다면 거의 성공하지도 못할 것이다. 118 + 이러한 규칙들을 따르는 것이 성공(역자주: 패치가 받아들여 지는 것)을 119 + 보장하진 않는다(왜냐하면 모든 패치들은 내용과 스타일에 관하여 120 + 면밀히 검토되기 때문이다). 그러나 규칙을 따르지 않는다면 거의 121 + 성공하지도 못할 것이다. 121 122 122 123 올바른 패치들을 만드는 법에 관한 훌륭한 다른 문서들이 있다. 123 124 "The Perfect Patch" ··· 127 126 http://linux.yyz.us/patch-format.html 128 127 129 128 Documentation/stable_api_nonsense.txt 130 - 이 문서는 의도적으로 커널이 변하지 않는 API를 갖지 않도록 결정한 129 + 이 문서는 의도적으로 커널이 불변하는 API를 갖지 않도록 결정한 131 130 이유를 설명하며 다음과 같은 것들을 포함한다. 132 131 - 서브시스템 shim-layer(호환성을 위해?) 133 - - 운영 체제들 간의 드라이버 이식성 132 + - 운영체제들간의 드라이버 이식성 134 133 - 커널 소스 트리내에 빠른 변화를 늦추는 것(또는 빠른 변화를 막는 것) 135 134 이 문서는 리눅스 개발 철학을 이해하는데 필수적이며 다른 운영체제에서 136 - 리눅스로 옮겨오는 사람들에게는 매우 중요하다. 135 + 리눅스로 전향하는 사람들에게는 매우 중요하다. 137 136 138 137 139 138 Documentation/SecurityBugs ··· 142 141 도와 달라. 143 142 144 143 Documentation/ManagementStyle 145 - 이 문서는 리눅스 커널 메인트너들이 어떻게 그들의 방법론의 정신을 146 - 어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는 144 + 이 문서는 리눅스 커널 메인테이너들이 그들의 방법론에 녹아 있는 145 + 정신을 어떻게 공유하고 운영하는지를 설명한다. 이것은 커널 개발에 입문하는 147 146 모든 사람들(또는 커널 개발에 작은 호기심이라도 있는 사람들)이 148 - 읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인트너들의 147 + 읽어야 할 중요한 문서이다. 왜냐하면 이 문서는 커널 메인테이너들의 149 148 독특한 행동에 관하여 흔히 있는 오해들과 혼란들을 해소하고 있기 150 149 때문이다. 151 150 ··· 161 160 162 161 Documentation/applying-patches.txt 163 162 패치가 무엇이며 그것을 커널의 다른 개발 브랜치들에 어떻게 164 - 적용하는지에 관하여 자세히 설명 하고 있는 좋은 입문서이다. 163 + 적용하는지에 관하여 자세히 설명하고 있는 좋은 입문서이다. 165 164 166 165 커널은 소스 코드 그 자체에서 자동적으로 만들어질 수 있는 많은 문서들을 167 166 가지고 있다. 이것은 커널 내의 API에 대한 모든 설명, 그리고 락킹을 ··· 193 192 여러분이 어디서 시작해야 할진 모르지만 커널 개발 커뮤니티에 참여할 수 194 193 있는 일들을 찾길 원한다면 리눅스 커널 Janitor 프로젝트를 살펴봐라. 195 194 http://janitor.kernelnewbies.org/ 196 - 그곳은 시작하기에 아주 딱 좋은 곳이다. 그곳은 리눅스 커널 소스 트리내에 195 + 그곳은 시작하기에 훌륭한 장소이다. 그곳은 리눅스 커널 소스 트리내에 197 196 간단히 정리되고 수정될 수 있는 문제들에 관하여 설명한다. 여러분은 이 198 197 프로젝트를 대표하는 개발자들과 일하면서 자신의 패치를 리눅스 커널 트리에 199 198 반영하기 위한 기본적인 것들을 배우게 될것이며 여러분이 아직 아이디어를 ··· 213 212 것은 Linux Cross-Reference project이며 그것은 자기 참조 방식이며 214 213 소스코드를 인덱스된 웹 페이지들의 형태로 보여준다. 최신의 멋진 커널 215 214 코드 저장소는 다음을 통하여 참조할 수 있다. 216 - http://sosdg.org/~coywolf/lxr/ 215 + http://users.sosdg.org/~qiyong/lxr/ 217 216 218 217 219 218 개발 프로세스 ··· 234 233 2.6.x 커널들은 Linux Torvalds가 관리하며 kernel.org의 pub/linux/kernel/v2.6/ 235 234 디렉토리에서 참조될 수 있다.개발 프로세스는 다음과 같다. 236 235 - 새로운 커널이 배포되자마자 2주의 시간이 주어진다. 이 기간동은 237 - 메인트너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은 236 + 메인테이너들은 큰 diff들을 Linus에게 제출할 수 있다. 대개 이 패치들은 238 237 몇 주 동안 -mm 커널내에 이미 있었던 것들이다. 큰 변경들을 제출하는 데 239 238 선호되는 방법은 git(커널의 소스 관리 툴, 더 많은 정보들은 http://git.or.cz/ 240 - 에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내도 239 + 에서 참조할 수 있다)를 사용하는 것이지만 순수한 패치파일의 형식으로 보내는 241 240 것도 무관하다. 242 241 - 2주 후에 -rc1 커널이 배포되며 지금부터는 전체 커널의 안정성에 영향을 243 - 미칠수 있는 새로운 기능들을 포함하지 않는 패치들만을 추가될 수 있다. 242 + 미칠수 있는 새로운 기능들을 포함하지 않는 패치들만이 추가될 수 있다. 244 243 완전히 새로운 드라이버(혹은 파일시스템)는 -rc1 이후에만 받아들여진다는 245 244 것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가 246 245 드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은 247 - 퇴보(regression)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이 246 + 회귀(역자주: 이전에는 존재하지 않았지만 새로운 기능추가나 변경으로 인해 247 + 생겨난 버그)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이 248 248 배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은 249 249 공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다. 250 - - 새로운 -rc는 Linus는 현재 git tree가 테스트 하기에 충분히 안정된 상태에 250 + - 새로운 -rc는 Linus가 현재 git tree가 테스트 하기에 충분히 안정된 상태에 251 251 있다고 판단될 때마다 배포된다. 목표는 새로운 -rc 커널을 매주 배포하는 252 252 것이다. 253 - - 이러한 프로세스는 커널이 "준비"되었다고 여겨질때까지 계속된다. 253 + - 이러한 프로세스는 커널이 "준비(ready)"되었다고 여겨질때까지 계속된다. 254 254 프로세스는 대체로 6주간 지속된다. 255 - - 각 -rc 배포에 있는 알려진 퇴보의 목록들은 다음 URI에 남겨진다. 255 + - 각 -rc 배포에 있는 알려진 회귀의 목록들은 다음 URI에 남겨진다. 256 256 http://kernelnewbies.org/known_regressions 257 257 258 258 커널 배포에 있어서 언급할만한 가치가 있는 리눅스 커널 메일링 리스트의 259 259 Andrew Morton의 글이 있다. 260 - "커널이 언제 배포될지는 아무로 모른다. 왜냐하면 배포는 알려진 260 + "커널이 언제 배포될지는 아무도 모른다. 왜냐하면 배포는 알려진 261 261 버그의 상황에 따라 배포되는 것이지 미리정해 놓은 시간에 따라 262 - 배포되는 것은 아니기 때문이다." 262 + 배포되는 것은 아니기 때문이다." 263 263 264 264 2.6.x.y - 안정 커널 트리 265 265 ------------------------ 266 266 267 267 4 자리 숫자로 이루어진 버젼의 커널들은 -stable 커널들이다. 그것들은 2.6.x 268 - 커널에서 발견된 큰 퇴보들이나 보안 문제들 중 비교적 작고 중요한 수정들을 268 + 커널에서 발견된 큰 회귀들이나 보안 문제들 중 비교적 작고 중요한 수정들을 269 269 포함한다. 270 270 271 271 이것은 가장 최근의 안정적인 커널을 원하는 사용자에게 추천되는 브랜치이며, 272 - 개발/실험적 버젼을 테스트하는 것을 돕는데는 별로 관심이 없다. 272 + 개발/실험적 버젼을 테스트하는 것을 돕고자 하는 사용자들과는 별로 관련이 없다. 273 273 274 - 어떤 2.6.x.y 커널도 사용가능하지 않다면 그때는 가장 높은 숫자의 2.6.x 274 + 어떤 2.6.x.y 커널도 사용할 수 없다면 그때는 가장 높은 숫자의 2.6.x 275 275 커널이 현재의 안정 커널이다. 276 276 277 277 2.6.x.y는 "stable" 팀<stable@kernel.org>에 의해 관리되며 거의 매번 격주로 ··· 296 294 서브시스템 커널 트리와 패치들을 가져와서 리눅스 커널 메일링 리스트로 297 295 온 많은 패치들과 한데 묶는다. 이 트리는 새로운 기능들과 패치들을 위한 298 296 장소를 제공하는 역할을 한다. 하나의 패치가 -mm에 한동안 있으면서 그 가치가 299 - 증명되게 되면 Andrew나 서브시스템 메인트너는 그것을 메인라인에 포함시키기 297 + 증명되게 되면 Andrew나 서브시스템 메인테이너는 그것을 메인라인에 포함시키기 300 298 위하여 Linus에게 보낸다. 301 299 302 300 커널 트리에 포함하고 싶은 모든 새로운 패치들은 Linus에게 보내지기 전에 ··· 329 327 - ACPI development tree, Len Brown <len.brown@intel.com > 330 328 git.kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git 331 329 332 - - Block development tree, Jens Axboe <axboe@suse.de> 330 + - Block development tree, Jens Axboe <jens.axboe@oracle.com> 333 331 git.kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git 334 332 335 333 - DRM development tree, Dave Airlie <airlied@linux.ie> ··· 369 367 kernel bugzilla를 사용하는 자세한 방법은 다음을 참조하라. 370 368 http://test.kernel.org/bugzilla/faq.html 371 369 372 - 메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그일 것 같은 373 - 것을 보고하는는 법에 관한 좋은 템플릿이고 문제를 추적하기 위해서 커널 370 + 메인 커널 소스 디렉토리에 있는 REPORTING-BUGS 파일은 커널 버그라고 생각되는 371 + 것을 보고하는 방법에 관한 좋은 템플릿이며 문제를 추적하기 위해서 커널 374 372 개발자들이 필요로 하는 정보가 무엇들인지를 상세히 설명하고 있다. 375 373 376 374 ··· 385 383 점수를 얻을 수 있는 가장 좋은 방법중의 하나이다. 왜냐하면 많은 사람들은 386 384 다른 사람들의 버그들을 수정하기 위하여 시간을 낭비하지 않기 때문이다. 387 385 388 - 이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernelorg를 386 + 이미 보고된 버그 리포트들을 가지고 작업하기 위해서 http://bugzilla.kernel.org를 389 387 참조하라. 여러분이 앞으로 생겨날 버그 리포트들의 조언자가 되길 원한다면 390 388 bugme-new 메일링 리스트나(새로운 버그 리포트들만이 이곳에서 메일로 전해진다) 391 389 bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메일로 전해진다) ··· 406 404 웹상의 많은 다른 곳에도 메일링 리스트의 아카이브들이 있다. 407 405 이러한 아카이브들을 찾으려면 검색 엔진을 사용하라. 예를 들어: 408 406 http://dir.gmane.org/gmane.linux.kernel 409 - 여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 대한 410 - 것을 아카이브에서 먼저 찾기를 강력히 권장한다. 이미 상세하게 토론된 많은 407 + 여러분이 새로운 문제에 관해 리스트에 올리기 전에 말하고 싶은 주제에 관한 408 + 것을 아카이브에서 먼저 찾아보기를 강력히 권장한다. 이미 상세하게 토론된 많은 411 409 것들이 메일링 리스트의 아카이브에 기록되어 있다. 412 410 413 411 각각의 커널 서브시스템들의 대부분은 자신들의 개발에 관한 노력들로 이루어진 ··· 445 443 무엇보다도 메일링 리스트의 다른 구독자들에게 보여주려 한다는 것을 기억하라. 446 444 447 445 448 - 커뮤니티와 일하는 법 446 + 커뮤니티와 협력하는 법 449 447 -------------------- 450 448 451 449 커널 커뮤니티의 목적은 가능한한 가장 좋은 커널을 제공하는 것이다. 여러분이 ··· 476 474 올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을 477 475 기억하라. 478 476 479 - 여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는 477 + 여러분의 첫 패치에 여러분이 수정해야하는 십여개 정도의 회신이 오는 480 478 경우도 흔하다. 이것은 여러분의 패치가 받아들여지지 않을 것이라는 것을 481 479 의미하는 것이 아니고 개인적으로 여러분에게 감정이 있어서 그러는 것도 482 480 아니다. 간단히 여러분의 패치에 제기된 문제들을 수정하고 그것을 다시 ··· 488 486 커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의 489 487 문제를 피하기 위한 목록이 있다. 490 488 여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 : 491 - - " 이것은 여러 문제들을 해겹합니다." 489 + - "이것은 여러 문제들을 해겹합니다." 492 490 - "이것은 2000 라인의 코드를 제거합니다." 493 491 - "이것은 내가 말하려는 것에 관해 설명하는 패치입니다." 494 492 - "나는 5개의 다른 아키텍쳐에서 그것을 테스트했슴으로..." 495 - - "여기에 일련의 작은 패치들이 있습음로..." 496 - - "이것은 일반적인 머신에서 성능을 향상시키므로..." 493 + - "여기에 일련의 작은 패치들이 있슴음로..." 494 + - "이것은 일반적인 머신에서 성능을 향상시킴으로..." 497 495 498 496 여러분들이 말할 때 피해야 할 좋지 않은 것들 : 499 497 - "우리를 그것을 AIT/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀립없다..." ··· 502 500 - "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다." 503 501 - "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다." 504 502 - "나는 6달동안 이것을 했으니..." 505 - - "여기세 5000라인 짜리 패치가 있으니..." 503 + - "여기에 5000라인 짜리 패치가 있으니..." 506 504 - "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..." 507 505 - "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다." 508 506 ··· 512 510 없다는 것이다. 리눅스 커널의 작업 환경에서는 단지 이메일 주소만 513 511 알수 있기 때문에 여성과 소수 민족들도 모두 받아들여진다. 국제적으로 514 512 일하게 되는 측면은 사람의 이름에 근거하여 성별을 추측할 수 없게 515 - 하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와 513 + 하기때문에 차별을 없애는 데 도움을 준다. Andrea라는 이름을 가진 남자와 516 514 Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅스 커널에서 517 515 작업하며 생각을 표현해왔던 대부분의 여성들은 긍정적인 경험을 가지고 518 516 있다. 519 517 520 518 언어 장벽은 영어에 익숙하지 않은 몇몇 사람들에게 문제가 될 수도 있다. 521 - 언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을 519 + 언어의 훌륭한 구사는 메일링 리스트에서 올바르게 자신의 생각을 522 520 표현하기 위하여 필요하다. 그래서 여러분은 이메일을 보내기 전에 523 521 영어를 올바르게 사용하고 있는지를 체크하는 것이 바람직하다. 524 522 ··· 526 524 여러분의 변경을 나누어라 527 525 ------------------------ 528 526 529 - 리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음을 쉽게 527 + 리눅스 커널 커뮤니티는 한꺼번에 굉장히 큰 코드의 묶음(chunk)을 쉽게 530 528 받아들이지 않는다. 변경은 적절하게 소개되고, 검토되고, 각각의 531 529 부분으로 작게 나누어져야 한다. 이것은 회사에서 하는 것과는 정확히 532 530 반대되는 것이다. 여러분들의 제안은 개발 초기에 일찍이 소개되야 한다. 533 531 그래서 여러분들은 자신이 하고 있는 것에 관하여 피드백을 받을 수 있게 534 532 된다. 커뮤니티가 여러분들이 커뮤니티와 함께 일하고 있다는 것을 535 - 느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로서 533 + 느끼도록 만들고 커뮤니티가 여러분의 기능을 위한 쓰레기 장으로써 536 534 사용되지 않고 있다는 것을 느끼게 하자. 그러나 메일링 리스트에 한번에 537 535 50개의 이메일을 보내지는 말아라. 여러분들의 일련의 패치들은 항상 538 536 더 작아야 한다. ··· 541 539 542 540 1) 작은 패치들은 여러분의 패치들이 적용될 수 있는 확률을 높여준다. 543 541 왜냐하면 다른 사람들은 정확성을 검증하기 위하여 많은 시간과 노력을 544 - 들이기를 원하지 않는다. 5줄의 패치는 메인트너가 거의 몇 초간 힐끗 542 + 들이기를 원하지 않는다. 5줄의 패치는 메인테이너가 거의 몇 초간 힐끗 545 543 보면 적용될 수 있다. 그러나 500 줄의 패치는 정확성을 검토하기 위하여 546 544 몇시간이 걸릴 수도 있다(걸리는 시간은 패치의 크기 혹은 다른 것에 547 545 비례하여 기하급수적으로 늘어난다). ··· 560 558 간결하고 가장 뛰어난 답을 보길 원한다. 훌륭한 학생은 이것을 알고 561 559 마지막으로 답을 얻기 전 중간 과정들을 제출하진 않는다. 562 560 563 - 커널 개발도 마찬가지이다. 메인트너들과 검토하는 사람들은 문제를 561 + 커널 개발도 마찬가지이다. 메인테이너들과 검토하는 사람들은 문제를 564 562 풀어나가는 과정속에 숨겨진 과정을 보길 원하진 않는다. 그들은 565 563 간결하고 멋진 답을 보길 원한다." 566 564 567 - 커뮤니티와 함께 일하며 뛰어난 답을 찾고 여러분들의 완성되지 않은 일들 568 - 사이에 균형을 유지해야 하는 어려움이 있을 수 있다. 그러므로 프로세스의 569 - 초반에 여러분의 일을 향상시키기위한 피드백을 얻는 것 뿐만 아니라 565 + 커뮤니티와 협력하며 뛰어난 답을 찾는 것과 여러분들의 끝마치지 못한 작업들 566 + 사이에 균형을 유지해야 하는 것은 어려울지도 모른다. 그러므로 프로세스의 567 + 초반에 여러분의 작업을 향상시키기위한 피드백을 얻는 것 뿐만 아니라 570 568 여러분들의 변경들을 작은 묶음으로 유지해서 심지어는 여러분의 작업의 571 - 모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 이미 569 + 모든 부분이 지금은 포함될 준비가 되어있지 않지만 작은 부분은 벌써 572 570 받아들여질 수 있도록 유지하는 것이 바람직하다. 573 571 574 - 또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들은 포함하는 572 + 또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들을 포함하는 575 573 패치들은 받아들여지지 않을 것이라는 점을 유념하라. 576 574 577 575 변경을 정당화해라 ··· 579 577 580 578 여러분들의 나누어진 패치들을 리눅스 커뮤니티가 왜 반영해야 하는지를 581 579 알도록 하는 것은 매우 중요하다. 새로운 기능들이 필요하고 유용하다는 582 - 것은 반드시 그에 맞는 이유가 있어야 한다. 580 + 것은 반드시 그에 합당한 이유가 있어야 한다. 583 581 584 582 585 583 변경을 문서화해라 ··· 590 588 것이다. 그리고 항상 그 내용을 보길 원하는 모든 사람들을 위해 보존될 591 589 것이다. 패치는 완벽하게 다음과 같은 내용들을 포함하여 설명해야 한다. 592 590 - 변경이 왜 필요한지 593 - - 패치에 관한 전체 설계 어프로치 591 + - 패치에 관한 전체 설계 접근(approach) 594 592 - 구현 상세들 595 593 - 테스트 결과들 596 594 ··· 602 600 603 601 604 602 이 모든 것을 하는 것은 매우 어려운 일이다. 완벽히 소화하는 데는 적어도 몇년이 605 - 걸릴 수도 있다. 많은 인내와 결의가 필요한 계속되는 개선의 과정이다. 그러나 603 + 걸릴 수도 있다. 많은 인내와 결심이 필요한 계속되는 개선의 과정이다. 그러나 606 604 가능한한 포기하지 말라. 많은 사람들은 이전부터 해왔던 것이고 그 사람들도 607 605 정확하게 여러분들이 지금 서 있는 그 곳부터 시작했었다. 608 606 ··· 622 620 623 621 624 622 625 - 메인트너: Greg Kroah-Hartman <greg@kroah.com> 623 + 메인테이너: Greg Kroah-Hartman <greg@kroah.com>
+195
Documentation/ko_KR/stable_api_nonsense.txt
··· 1 + NOTE: 2 + This is a version of Documentation/stable_api_nonsense.txt translated 3 + into korean 4 + This document is maintained by barrios <minchan.kim@gmail.com> 5 + If you find any difference between this document and the original file or 6 + a problem with the translation, please contact the maintainer of this file. 7 + 8 + Please also note that the purpose of this file is to be easier to 9 + read for non English (read: korean) speakers and is not intended as 10 + a fork. So if you have any comments or updates for this file please 11 + try to update the original English file first. 12 + 13 + ================================== 14 + 이 문서는 15 + Documentation/stable_api_nonsense.txt 16 + 의 한글 번역입니다. 17 + 18 + 역자: 김민찬 <minchan.kim@gmail.com> 19 + 감수: 이제이미 <jamee.lee@samsung.com> 20 + ================================== 21 + 22 + 리눅스 커널 드라이버 인터페이스 23 + (여러분들의 모든 질문에 대한 답 그리고 다른 몇가지) 24 + 25 + Greg Kroah-Hartman <greg@kroah.com> 26 + 27 + 이 문서는 리눅스가 왜 바이너리 커널 인터페이스를 갖지 않는지, 왜 변하지 28 + 않는(stable) 커널 인터페이스를 갖지 않는지를 설명하기 위해 쓰여졌다. 29 + 이 문서는 커널과 유저공간 사이의 인터페이스가 아니라 커널 내부의 30 + 인터페이스들을 설명하고 있다는 것을 유념하라. 커널과 유저공간 사이의 31 + 인터페이스는 응용프로그램이 사용하는 syscall 인터페이스이다. 그 인터페이스는 32 + 오랫동안 거의 변하지 않았고 앞으로도 변하지 않을 것이다. 나는 pre 0.9에서 33 + 만들어졌지만 최신의 2.6 커널 배포에서도 잘 동작하는 프로그램을 가지고 34 + 있다. 이 인터페이스는 사용자와 응용프로그램 개발자들이 변하지 않을 것이라고 35 + 여길수 있는 것이다. 36 + 37 + 38 + 초록 39 + ---- 40 + 여러분은 변하지 않는 커널 인터페이스를 원한다고 생각하지만 실제로는 41 + 그렇지 않으며 심지어는 그것을 알아채지 못한다. 여러분이 원하는 것은 42 + 안정되게 실행되는 드라이버이며 드라이버가 메인 커널 트리에 있을 때 43 + 그런 안정적인 드라이버를 얻을 수 있게 된다. 또한 여러분의 드라이버가 44 + 메인 커널 트리에 있다면 다른 많은 좋은 이점들을 얻게 된다. 그러한 것들이 45 + 리눅스를 강건하고, 안정적이며, 성숙한 운영체제로 만들어 놓음으로써 46 + 여러분들로 하여금 바로 리눅스를 사용하게 만드는 이유이다. 47 + 48 + 49 + 소개 50 + ---- 51 + 52 + 커널 내부의 인터페이스가 바뀌는 것을 걱정하며 커널 드라이버를 작성하고 53 + 싶어하는 사람은 정말 이상한 사람이다. 세상의 대다수의 사람들은 이 인터페이스를 54 + 보지못할 것이며 전혀 걱정하지도 않는다. 55 + 56 + 먼저, 나는 closed 소스, hidden 소스, binary blobs, 소스 wrappers, 또는 GPL로 57 + 배포되었지만 소스 코드를 갖고 있지 않은 커널 드라이버들을 설명하는 어떤 다른 58 + 용어들에 관한 어떤 법적인 문제에 관해서는 언급하지 않을 것이다. 어떤 법적인 59 + 질문들을 가지고 있다면 변호사와 연락하라. 나는 프로그래머이므로 여기서 기술적인 60 + 문제들만을 설명하려고 한다. (법적인 문제를 경시하는 것은 아니다. 그런 문제들은 61 + 엄연히 현실에 있고 여러분들은 항상 그 문제들을 인식하고 있을 필요는 있다.) 62 + 63 + 자, 두가지의 주요 주제가 있다. 바이너리 커널 인터페이스들과 변하지 않는 64 + 커널 소스 인터페이들. 그것들은 서로 의존성을 가지고 있지만 바이너리 65 + 문제를 먼저 풀고 넘어갈 것이다. 66 + 67 + 68 + 69 + 바이너리 커널 인터페이스 70 + ------------------------ 71 + 우리가 변하지 않는 커널 소스 인터페이스를 가지고 있다고 가정하자. 그러면 72 + 바이너리 인터페이스 또한 자연적으로 변하지 않을까? 틀렸다. 리눅스 커널에 73 + 관한 다음 사실들을 생각해보라. 74 + - 여러분들이 사용하는 C 컴파일러의 버젼에 따라 다른 커널 자료 구조들은 75 + 다른 alignmnet들을 갖게 될것이고 다른 방법으로(함수들을 inline으로 76 + 했느냐, 아니냐) 다른 함수들을 포함하는 것도 가능한다. 중요한 것은 77 + 개별적인 함수 구성이 아니라 자료 구조 패딩이 달라진다는 점이다. 78 + - 여러분이 선택한 커널 빌드 옵션에 따라서 커널은 다양한 것들을 가정할 79 + 수 있다. 80 + - 다른 구조체들은 다른 필드들을 포함할 수 있다. 81 + - 몇몇 함수들은 전혀 구현되지 않을 수도 있다(즉, 몇몇 lock들은 82 + non-SMP 빌드에서는 사라져 버릴수도 있다). 83 + - 커널내에 메모리는 build optoin들에 따라 다른 방법으로 align될수 84 + 있다. 85 + - 리눅스는 많은 다양한 프로세서 아키텍쳐에서 실행된다. 한 아키텍쳐의 86 + 바이너리 드라이버를 다른 아키텍쳐에서 정상적으로 실행시킬 방법은 87 + 없다. 88 + 89 + 커널을 빌드했던 C 컴파일러와 정확하게 같은 것을 사용하고 정확하게 같은 90 + 커널 구성(configuration)을 사용하여 여러분들의 모듈을 빌드하면 간단히 91 + 많은 문제들을 해결할 수 있다. 이렇게 하는 것은 여러분들이 하나의 리눅스 92 + 배포판의 하나의 배포 버젼을 위한 모듈만을 제공한다면 별일 아닐 것이다. 93 + 그러나 각기 다른 리눅스 배포판마다 한번씩 빌드하는 수를 각 리눅스 배포판마다 94 + 제공하는 다른 릴리즈의 수와 곱하게 되면 이번에는 각 릴리즈들의 다른 빌드 95 + 옵션의 악몽과 마주하게 것이다. 또한 각 리눅스 배포판들은 다른 하드웨어 96 + 종류에(다른 프로세서 타입과 다른 옵션들) 맞춰져 있는 많은 다른 커널들을 97 + 배포한다. 그러므로 한번의 배포에서조차 여러분들의 모듈은 여러 버젼을 98 + 만들 필요가 있다. 99 + 100 + 나를 믿어라. 여러분들은 이러한 종류의 배포를 지원하려고 시도한다면 시간이 101 + 지나면 미칠지경이 될 것이다. 난 이러한 것을 오래전에 아주 어렵게 배웠다... 102 + 103 + 104 + 105 + 변하지않는 커널 소스 인터페이스들 106 + --------------------------------- 107 + 108 + 리눅스 커널 드라이버를 계속해서 메인 커널 트리에 반영하지 않고 109 + 유지보수하려고 하는 사름들과 이 문제를 논의하게 되면 훨씬 더 110 + "논란의 여지가 많은" 주제가 될 것이다. 111 + 112 + 리눅스 커널 개발은 끊임없이 빠른 속도로 이루어지고 있으며 결코 113 + 느슨해진 적이 없다. 커널 개발자들이 현재 인터페이스들에서 버그를 114 + 발견하거나 무엇인가 할수 있는 더 좋은 방법을 찾게 되었다고 하자. 115 + 그들이 발견한 것을 실행한다면 아마도 더 잘 동작하도록 현재 인터페이스들을 116 + 수정하게 될 것이다. 그들이 그런 일을 하게되면 함수 이름들은 변하게 되고, 117 + 구조체들은 늘어나거나 줄어들게 되고, 함수 파라미터들은 재작업될 것이다. 118 + 이러한 일이 발생되면 커널 내에 이 인터페이스를 사용했던 인스턴스들이 동시에 119 + 수정될 것이며 이러한 과정은 모든 것이 계속해서 올바르게 동작할 것이라는 120 + 것을 보장한다. 121 + 122 + 이러한 것의 한 예로써, 커널 내부의 USB 인터페이스들은 이 서브시스템이 123 + 생긴 이후로 적어도 3번의 다른 재작업을 겪었다. 이 재작업들은 많은 다른 124 + 문제들을 풀었다. 125 + - 데이터 스트림들의 동기적인 모델에서 비동기적인 모델로의 변화. 이것은 126 + 많은 드라이버들의 복잡성을 줄이고 처리량을 향상시켜 현재는 거의 모든 127 + USB 장치들의 거의 최대 속도로 실행되고 있다. 128 + - USB 드라이버가 USB 코어로부터 데이터 패킷들을 할당받로록 한 변경으로 129 + 인해서 지금의 모든 드라이버들은 많은 문서화된 데드락을 수정하기 위하여 130 + USB 코어에게 더 많은 정보를 제공해야만 한다. 131 + 132 + 이것은 오랫동안 자신의 오래된 USB 인터페이스들을 유지해야 하는 closed 운영체제들과는 133 + 완전히 반대되는 것이다. closed된 운영체제들은 새로운 개발자들에게 우연히 낡은 134 + 인터페이스를 사용하게 할 기회를 주게되며, 적절하지 못한 방법으로 처리하게 되어 135 + 운영체제의 안정성을 해치는 문제를 야기하게 된다. 136 + 137 + 이 두가지의 예들 모두, 모든 개발자들은 꼭 이루어져야 하는 중요한 변화들이라고 138 + 동의를 하였고 비교적 적은 고통으로 변경되어졌다. 리눅스가 변하지 않는 소스 139 + 인터페이스를 고집한다면, 새로운 인터페이스가 만들어지게 되며 반면 기존의 오래된 140 + 것들, 그리고 깨진 것들은 계속해서 유지되어야 하며 이러한 일들은 USB 개발자들에게 141 + 또 다른 일거리를 주게 된다. 모든 리눅스 USB 개발자들에게 자신의 그들의 업무를 142 + 마친 후 시간을 투자하여 아무 득도 없는 무료 봉사를 해달라고 하는 것은 가능성이 143 + 희박한 일이다. 144 + 145 + 보안 문제 역시 리눅스에게는 매우 중요하다. 보안 문제가 발견되면 그것은 146 + 매우 짧은 시간 안에 수정된다. 보안 문제는 그 문제를 해결하기 위하여 147 + 여러번 내부 커널 인터페이스들을 재작업하게 만들었다. 이러한 문제가 148 + 발생하였을 때 그 인터페이스들을 사용하는 모든 드라이버들도 동시에 149 + 수정되어 보안 문제가 앞으로 갑작스럽게 생기지는 않을 것이라는 것을 150 + 보장한다. 내부 인터페이스들의 변경이 허락되지 않으면 이러한 종류의 보안 151 + 문제를 수정하고 그것이 다시 발생하지 않을 것이라고 보장하는 것은 가능하지 152 + 않을 것이다. 153 + 154 + 커널 인터페이스들은 계속해서 정리되고 있다. 현재 인터페이스를 사용하는 155 + 사람이 한명도 없다면 그것은 삭제된다. 이것은 커널이 가능한한 가장 작게 156 + 유지되며 존재하는 모든 가능성이 있는 인터페이스들이 테스트된다는 것을 157 + 보장한다(사용되지 않는 인터페이스들은 유효성 검증을 하기가 거의 불가능하다). 158 + 159 + 160 + 무엇을 해야 하나 161 + --------------- 162 + 자, 여러분이 메인 커널 트리에 있지 않은 리눅스 커널 드라이버를 가지고 163 + 있다면 여러분은 즉, 개발자는 무엇을 해야 하나? 모든 배포판마다 다른 164 + 커널 버젼을 위한 바이너리 드라이버를 배포하는 것은 악몽이며 계속해서 165 + 변하고 있는 커널 인터페이스들의 맞처 유지보수하려고 시도하는 것은 힘든 166 + 일이다. 167 + 168 + 간단하다. 여러분의 커널 드라이버를 메인 커널 트리에 반영하라(우리는 여기서 169 + GPL을 따르는 배포 드라이버에 관해 얘기하고 있다는 것을 상기하라. 여러분의 170 + 코드가 이러한 분류에 해당되지 않는다면 행운을 빈다. 여러분 스스로 어떻게든 171 + 해야만 한다). 여러분의 드라이버가 트리에 있게되면 커널 인터페이스가 172 + 변경되더라도 가장 먼저 커널에 변경을 가했던 사람에 의해서 수정될 것이다. 173 + 이것은 여러분의 드라이버가 여러분의 별다른 노력없이 항상 빌드가 가능하며 174 + 동작하는 것을 보장한다. 175 + 176 + 메인 커널 트리에 여러분의 드라이버를 반영하면 얻게 되는 장점들은 다음과 같다. 177 + - 관리의 드는 비용(원래 개발자의)은 줄어줄면서 드라이버의 질은 향상될 것이다. 178 + - 다른 개발자들이 여러분의 드라이버에 기능들을 추가 할 것이다. 179 + - 다른 사람들은 여러분의 드라이버에 버그를 발견하고 수정할 것이다. 180 + - 다른 사람들은 여러분의 드라이버의 개선점을 찾을 줄 것이다. 181 + - 외부 인터페이스 변경으로 인해 여러분의 드라이버의 수정이 필요하다면 다른 182 + 사람들이 드라이버를 업데이트할 것이다. 183 + - 여러분의 드라이버는 별다른 노력 없이 모든 리눅스 배포판에 자동적으로 184 + 추가될 것이다. 185 + 186 + 리눅스는 다른 운영 체제보다 "쉽게 쓸수 있는(out of the box)" 많은 다른 장치들을 187 + 지원하고 어떤 다른 운영 체제보다 다양한 아키텍쳐위에서 이러한 장치들을 지원하기 때문에 188 + 이러한 증명된 개발 모델은 틀림없이 바로 가고 있는 것이다. 189 + 190 + 191 + 192 + ------ 193 + 194 + 이 문서의 초안을 검토해주고 코멘트 해준 Randy Dunlap, Andrew Morton, David Brownell, 195 + Hanna Linder, Robert Love, 그리고 Nishanth Aravamudan에게 감사한다.
-93
Documentation/tipar.txt
··· 1 - 2 - Parallel link cable for Texas Instruments handhelds 3 - =================================================== 4 - 5 - 6 - Author: Romain Lievin 7 - Homepage: http://lpg.ticalc.org/prj_tidev/index.html 8 - 9 - 10 - INTRODUCTION: 11 - 12 - This is a driver for the very common home-made parallel link cable, a cable 13 - designed for connecting TI8x/9x graphing calculators (handhelds) to a computer 14 - or workstation (Alpha, Sparc). Given that driver is built on parport, the 15 - parallel port abstraction layer, this driver is architecture-independent. 16 - 17 - It can also be used with another device plugged on the same port (such as a 18 - ZIP drive). I have a 100MB ZIP and both of them work fine! 19 - 20 - If you need more information, please visit the 'TI drivers' homepage at the URL 21 - above. 22 - 23 - WHAT YOU NEED: 24 - 25 - A TI calculator and a program capable of communicating with your calculator. 26 - 27 - TiLP will work for sure (since I am its developer!). yal92 may be able to use 28 - it by changing tidev for tipar (may require some hacking...). 29 - 30 - HOW TO USE IT: 31 - 32 - You must have first compiled parport support (CONFIG_PARPORT_DEV): either 33 - compiled in your kernel, either as a module. 34 - 35 - Next, (as root): 36 - 37 - modprobe parport 38 - modprobe tipar 39 - 40 - If it is not already there (it usually is), create the device: 41 - 42 - mknod /dev/tipar0 c 115 0 43 - mknod /dev/tipar1 c 115 1 44 - mknod /dev/tipar2 c 115 2 45 - 46 - You will have to set permissions on this device to allow you to read/write 47 - from it: 48 - 49 - chmod 666 /dev/tipar[0..2] 50 - 51 - Now you are ready to run a linking program such as TiLP. Be sure to configure 52 - it properly (RTFM). 53 - 54 - MODULE PARAMETERS: 55 - 56 - You can set these with: modprobe tipar NAME=VALUE 57 - There is currently no way to set these on a per-cable basis. 58 - 59 - NAME: timeout 60 - TYPE: integer 61 - DEFAULT: 15 62 - DESC: Timeout value in tenth of seconds. If no data is available once this 63 - time has expired then the driver will return with a timeout error. 64 - 65 - NAME: delay 66 - TYPE: integer 67 - DEFAULT: 10 68 - DESC: Inter-bit delay in micro-seconds. A lower value gives an higher data 69 - rate but makes transmission less reliable. 70 - 71 - These parameters can be changed at run time by any program via ioctl(2) calls 72 - as listed in ./include/linux/ticable.h. 73 - 74 - Rather than write 50 pages describing the ioctl() and so on, it is 75 - perhaps more useful you look at ticables library (dev_link.c) that demonstrates 76 - how to use them, and demonstrates the features of the driver. This is 77 - probably a lot more useful to people interested in writing applications 78 - that will be using this driver. 79 - 80 - QUIRKS/BUGS: 81 - 82 - None. 83 - 84 - HOW TO CONTACT US: 85 - 86 - You can email me at roms@lpg.ticalc.org. Please prefix the subject line 87 - with "TIPAR: " so that I am certain to notice your message. 88 - You can also mail JB at jb@jblache.org. He packaged these drivers for Debian. 89 - 90 - CREDITS: 91 - 92 - The code is based on tidev.c & parport.c. 93 - The driver has been developed independently of Texas Instruments.
-5
MAINTAINERS
··· 3699 3699 L: linux-kernel@vger.kernel.org 3700 3700 S: Maintained 3701 3701 3702 - TI PARALLEL LINK CABLE DRIVER 3703 - P: Romain Lievin 3704 - M: roms@lpg.ticalc.org 3705 - S: Maintained 3706 - 3707 3702 TIPC NETWORK LAYER 3708 3703 P: Per Liden 3709 3704 M: per.liden@ericsson.com
-22
drivers/char/Kconfig
··· 543 543 544 544 If unsure, say N. 545 545 546 - config TIPAR 547 - tristate "Texas Instruments parallel link cable support" 548 - depends on PARPORT 549 - ---help--- 550 - If you own a Texas Instruments graphing calculator and use a 551 - parallel link cable, then you might be interested in this driver. 552 - 553 - If you enable this driver, you will be able to communicate with 554 - your calculator through a set of device nodes under /dev. The 555 - main advantage of this driver is that you don't have to be root 556 - to use this precise link cable (depending on the permissions on 557 - the device nodes, though). 558 - 559 - To compile this driver as a module, choose M here: the 560 - module will be called tipar. 561 - 562 - If you don't know what a parallel link cable is or what a Texas 563 - Instruments graphing calculator is, then you probably don't need this 564 - driver. 565 - 566 - If unsure, say N. 567 - 568 546 config HVC_DRIVER 569 547 bool 570 548 help
-557
drivers/char/tipar.c
··· 1 - /* Hey EMACS -*- linux-c -*- 2 - * 3 - * tipar - low level driver for handling a parallel link cable designed 4 - * for Texas Instruments graphing calculators (http://lpg.ticalc.org). 5 - * A part of the TiLP project. 6 - * 7 - * Copyright (C) 2000-2002, Romain Lievin <roms@lpg.ticalc.org> 8 - * under the terms of the GNU General Public License. 9 - * 10 - * Various fixes & clean-up from the Linux Kernel Mailing List 11 - * (Alan Cox, Richard B. Johnson, Christoph Hellwig). 12 - */ 13 - 14 - /* This driver should, in theory, work with any parallel port that has an 15 - * appropriate low-level driver; all I/O is done through the parport 16 - * abstraction layer. 17 - * 18 - * If this driver is built into the kernel, you can configure it using the 19 - * kernel command-line. For example: 20 - * 21 - * tipar=timeout,delay (set timeout and delay) 22 - * 23 - * If the driver is loaded as a module, similar functionality is available 24 - * using module parameters. The equivalent of the above commands would be: 25 - * 26 - * # insmod tipar timeout=15 delay=10 27 - */ 28 - 29 - /* COMPATIBILITY WITH OLD KERNELS 30 - * 31 - * Usually, parallel cables were bound to ports at 32 - * particular I/O addresses, as follows: 33 - * 34 - * tipar0 0x378 35 - * tipar1 0x278 36 - * tipar2 0x3bc 37 - * 38 - * 39 - * This driver, by default, binds tipar devices according to parport and 40 - * the minor number. 41 - * 42 - */ 43 - #undef DEBUG /* change to #define to get debugging 44 - * output - for pr_debug() */ 45 - #include <linux/module.h> 46 - #include <linux/types.h> 47 - #include <linux/errno.h> 48 - #include <linux/kernel.h> 49 - #include <linux/sched.h> 50 - #include <linux/delay.h> 51 - #include <linux/fcntl.h> 52 - #include <linux/fs.h> 53 - #include <linux/init.h> 54 - #include <asm/uaccess.h> 55 - #include <linux/ioport.h> 56 - #include <asm/io.h> 57 - #include <linux/bitops.h> 58 - #include <linux/parport.h> /* Our code depend on parport */ 59 - #include <linux/device.h> 60 - 61 - /* 62 - * TI definitions 63 - */ 64 - #include <linux/ticable.h> 65 - 66 - /* 67 - * Version Information 68 - */ 69 - #define DRIVER_VERSION "1.19" 70 - #define DRIVER_AUTHOR "Romain Lievin <roms@lpg.ticalc.org>" 71 - #define DRIVER_DESC "Device driver for TI/PC parallel link cables" 72 - #define DRIVER_LICENSE "GPL" 73 - 74 - #define VERSION(ver,rel,seq) (((ver)<<16) | ((rel)<<8) | (seq)) 75 - 76 - /* ----- global variables --------------------------------------------- */ 77 - 78 - struct tipar_struct { 79 - struct pardevice *dev; /* Parport device entry */ 80 - }; 81 - 82 - #define PP_NO 3 83 - static struct tipar_struct table[PP_NO]; 84 - 85 - static int delay = IO_DELAY; /* inter-bit delay in microseconds */ 86 - static int timeout = TIMAXTIME; /* timeout in tenth of seconds */ 87 - 88 - static unsigned int tp_count; /* tipar count */ 89 - static unsigned long opened; /* opened devices */ 90 - 91 - static struct class *tipar_class; 92 - 93 - /* --- macros for parport access -------------------------------------- */ 94 - 95 - #define r_dtr(x) (parport_read_data(table[(x)].dev->port)) 96 - #define r_str(x) (parport_read_status(table[(x)].dev->port)) 97 - #define w_ctr(x,y) (parport_write_control(table[(x)].dev->port, (y))) 98 - #define w_dtr(x,y) (parport_write_data(table[(x)].dev->port, (y))) 99 - 100 - /* --- setting states on the D-bus with the right timing: ------------- */ 101 - 102 - static inline void 103 - outbyte(int value, int minor) 104 - { 105 - w_dtr(minor, value); 106 - } 107 - 108 - static inline int 109 - inbyte(int minor) 110 - { 111 - return (r_str(minor)); 112 - } 113 - 114 - static inline void 115 - init_ti_parallel(int minor) 116 - { 117 - outbyte(3, minor); 118 - } 119 - 120 - /* ----- global defines ----------------------------------------------- */ 121 - 122 - #define START(x) { x = jiffies + (HZ * timeout) / 10; } 123 - #define WAIT(x) { \ 124 - if (time_before((x), jiffies)) return -1; \ 125 - if (need_resched()) schedule(); } 126 - 127 - /* ----- D-bus bit-banging functions ---------------------------------- */ 128 - 129 - /* D-bus protocol (45kbit/s max): 130 - 1 0 0 131 - _______ ______|______ __________|________ __________ 132 - Red : ________ | ____ | ____ 133 - _ ____________|________ ______|__________ _____ 134 - White: ________ | ______ | _______ 135 - */ 136 - 137 - /* Try to transmit a byte on the specified port (-1 if error). */ 138 - static int 139 - put_ti_parallel(int minor, unsigned char data) 140 - { 141 - unsigned int bit; 142 - unsigned long max; 143 - 144 - for (bit = 0; bit < 8; bit++) { 145 - if (data & 1) { 146 - outbyte(2, minor); 147 - START(max); 148 - do { 149 - WAIT(max); 150 - } while (inbyte(minor) & 0x10); 151 - 152 - outbyte(3, minor); 153 - START(max); 154 - do { 155 - WAIT(max); 156 - } while (!(inbyte(minor) & 0x10)); 157 - } else { 158 - outbyte(1, minor); 159 - START(max); 160 - do { 161 - WAIT(max); 162 - } while (inbyte(minor) & 0x20); 163 - 164 - outbyte(3, minor); 165 - START(max); 166 - do { 167 - WAIT(max); 168 - } while (!(inbyte(minor) & 0x20)); 169 - } 170 - 171 - data >>= 1; 172 - udelay(delay); 173 - 174 - if (need_resched()) 175 - schedule(); 176 - } 177 - 178 - return 0; 179 - } 180 - 181 - /* Receive a byte on the specified port or -1 if error. */ 182 - static int 183 - get_ti_parallel(int minor) 184 - { 185 - unsigned int bit; 186 - unsigned char v, data = 0; 187 - unsigned long max; 188 - 189 - for (bit = 0; bit < 8; bit++) { 190 - START(max); 191 - do { 192 - WAIT(max); 193 - } while ((v = inbyte(minor) & 0x30) == 0x30); 194 - 195 - if (v == 0x10) { 196 - data = (data >> 1) | 0x80; 197 - outbyte(1, minor); 198 - START(max); 199 - do { 200 - WAIT(max); 201 - } while (!(inbyte(minor) & 0x20)); 202 - outbyte(3, minor); 203 - } else { 204 - data = data >> 1; 205 - outbyte(2, minor); 206 - START(max); 207 - do { 208 - WAIT(max); 209 - } while (!(inbyte(minor) & 0x10)); 210 - outbyte(3, minor); 211 - } 212 - 213 - udelay(delay); 214 - if (need_resched()) 215 - schedule(); 216 - } 217 - 218 - return (int) data; 219 - } 220 - 221 - /* Try to detect a parallel link cable on the specified port */ 222 - static int 223 - probe_ti_parallel(int minor) 224 - { 225 - int i; 226 - int seq[] = { 0x00, 0x20, 0x10, 0x30 }; 227 - int data; 228 - 229 - for (i = 3; i >= 0; i--) { 230 - outbyte(3, minor); 231 - outbyte(i, minor); 232 - udelay(delay); 233 - data = inbyte(minor) & 0x30; 234 - pr_debug("tipar: Probing -> %i: 0x%02x 0x%02x\n", i, 235 - data, seq[i]); 236 - if (data != seq[i]) { 237 - outbyte(3, minor); 238 - return -1; 239 - } 240 - } 241 - 242 - outbyte(3, minor); 243 - return 0; 244 - } 245 - 246 - /* ----- kernel module functions--------------------------------------- */ 247 - 248 - static int 249 - tipar_open(struct inode *inode, struct file *file) 250 - { 251 - unsigned int minor = iminor(inode) - TIPAR_MINOR; 252 - 253 - if (tp_count == 0 || minor > tp_count - 1) 254 - return -ENXIO; 255 - 256 - if (test_and_set_bit(minor, &opened)) 257 - return -EBUSY; 258 - 259 - if (!table[minor].dev) { 260 - printk(KERN_ERR "%s: NULL device for minor %u\n", 261 - __FUNCTION__, minor); 262 - return -ENXIO; 263 - } 264 - parport_claim_or_block(table[minor].dev); 265 - init_ti_parallel(minor); 266 - parport_release(table[minor].dev); 267 - 268 - return nonseekable_open(inode, file); 269 - } 270 - 271 - static int 272 - tipar_close(struct inode *inode, struct file *file) 273 - { 274 - unsigned int minor = iminor(inode) - TIPAR_MINOR; 275 - 276 - if (minor > tp_count - 1) 277 - return -ENXIO; 278 - 279 - clear_bit(minor, &opened); 280 - 281 - return 0; 282 - } 283 - 284 - static ssize_t 285 - tipar_write (struct file *file, const char __user *buf, size_t count, 286 - loff_t * ppos) 287 - { 288 - unsigned int minor = iminor(file->f_path.dentry->d_inode) - TIPAR_MINOR; 289 - ssize_t n; 290 - 291 - parport_claim_or_block(table[minor].dev); 292 - 293 - for (n = 0; n < count; n++) { 294 - unsigned char b; 295 - 296 - if (get_user(b, buf + n)) { 297 - n = -EFAULT; 298 - goto out; 299 - } 300 - 301 - if (put_ti_parallel(minor, b) == -1) { 302 - init_ti_parallel(minor); 303 - n = -ETIMEDOUT; 304 - goto out; 305 - } 306 - } 307 - out: 308 - parport_release(table[minor].dev); 309 - return n; 310 - } 311 - 312 - static ssize_t 313 - tipar_read(struct file *file, char __user *buf, size_t count, loff_t * ppos) 314 - { 315 - int b = 0; 316 - unsigned int minor = iminor(file->f_path.dentry->d_inode) - TIPAR_MINOR; 317 - ssize_t retval = 0; 318 - ssize_t n = 0; 319 - 320 - if (count == 0) 321 - return 0; 322 - 323 - parport_claim_or_block(table[minor].dev); 324 - 325 - while (n < count) { 326 - b = get_ti_parallel(minor); 327 - if (b == -1) { 328 - init_ti_parallel(minor); 329 - retval = -ETIMEDOUT; 330 - goto out; 331 - } else { 332 - if (put_user(b, buf + n)) { 333 - retval = -EFAULT; 334 - break; 335 - } else 336 - retval = ++n; 337 - } 338 - 339 - /* Non-blocking mode : try again ! */ 340 - if (file->f_flags & O_NONBLOCK) { 341 - retval = -EAGAIN; 342 - goto out; 343 - } 344 - 345 - /* Signal pending, try again ! */ 346 - if (signal_pending(current)) { 347 - retval = -ERESTARTSYS; 348 - goto out; 349 - } 350 - 351 - if (need_resched()) 352 - schedule(); 353 - } 354 - 355 - out: 356 - parport_release(table[minor].dev); 357 - return retval; 358 - } 359 - 360 - static int 361 - tipar_ioctl(struct inode *inode, struct file *file, 362 - unsigned int cmd, unsigned long arg) 363 - { 364 - int retval = 0; 365 - 366 - switch (cmd) { 367 - case IOCTL_TIPAR_DELAY: 368 - delay = (int)arg; //get_user(delay, &arg); 369 - break; 370 - case IOCTL_TIPAR_TIMEOUT: 371 - if (arg != 0) 372 - timeout = (int)arg; 373 - else 374 - retval = -EINVAL; 375 - break; 376 - default: 377 - retval = -ENOTTY; 378 - break; 379 - } 380 - 381 - return retval; 382 - } 383 - 384 - /* ----- kernel module registering ------------------------------------ */ 385 - 386 - static const struct file_operations tipar_fops = { 387 - .owner = THIS_MODULE, 388 - .llseek = no_llseek, 389 - .read = tipar_read, 390 - .write = tipar_write, 391 - .ioctl = tipar_ioctl, 392 - .open = tipar_open, 393 - .release = tipar_close, 394 - }; 395 - 396 - /* --- initialisation code ------------------------------------- */ 397 - 398 - #ifndef MODULE 399 - /* You must set these - there is no sane way to probe for this cable. 400 - * You can use 'tipar=timeout,delay' to set these now. */ 401 - static int __init 402 - tipar_setup(char *str) 403 - { 404 - int ints[3]; 405 - 406 - str = get_options(str, ARRAY_SIZE(ints), ints); 407 - 408 - if (ints[0] > 0) { 409 - if (ints[1] != 0) 410 - timeout = ints[1]; 411 - else 412 - printk(KERN_WARNING "tipar: bad timeout value (0), " 413 - "using default value instead"); 414 - if (ints[0] > 1) { 415 - delay = ints[2]; 416 - } 417 - } 418 - 419 - return 1; 420 - } 421 - #endif 422 - 423 - /* 424 - * Register our module into parport. 425 - * Pass also 2 callbacks functions to parport: a pre-emptive function and an 426 - * interrupt handler function (unused). 427 - * Display a message such "tipar0: using parport0 (polling)". 428 - */ 429 - static int 430 - tipar_register(int nr, struct parport *port) 431 - { 432 - int err = 0; 433 - 434 - /* Register our module into parport */ 435 - table[nr].dev = parport_register_device(port, "tipar", 436 - NULL, NULL, NULL, 0, 437 - (void *) &table[nr]); 438 - 439 - if (table[nr].dev == NULL) { 440 - err = 1; 441 - goto out; 442 - } 443 - 444 - device_create(tipar_class, port->dev, MKDEV(TIPAR_MAJOR, 445 - TIPAR_MINOR + nr), "par%d", nr); 446 - 447 - /* Display informations */ 448 - pr_info("tipar%d: using %s (%s)\n", nr, port->name, (port->irq == 449 - PARPORT_IRQ_NONE) ? "polling" : "interrupt-driven"); 450 - 451 - if (probe_ti_parallel(nr) != -1) 452 - pr_info("tipar%d: link cable found\n", nr); 453 - else 454 - pr_info("tipar%d: link cable not found\n", nr); 455 - 456 - err = 0; 457 - 458 - out: 459 - return err; 460 - } 461 - 462 - static void 463 - tipar_attach(struct parport *port) 464 - { 465 - if (tp_count == PP_NO) { 466 - pr_info("tipar: ignoring parallel port (max. %d)\n", PP_NO); 467 - return; 468 - } 469 - 470 - if (!tipar_register(tp_count, port)) 471 - tp_count++; 472 - } 473 - 474 - static void 475 - tipar_detach(struct parport *port) 476 - { 477 - /* Nothing to do */ 478 - } 479 - 480 - static struct parport_driver tipar_driver = { 481 - .name = "tipar", 482 - .attach = tipar_attach, 483 - .detach = tipar_detach, 484 - }; 485 - 486 - static int __init 487 - tipar_init_module(void) 488 - { 489 - int err = 0; 490 - 491 - pr_info("tipar: parallel link cable driver, version %s\n", 492 - DRIVER_VERSION); 493 - 494 - if (register_chrdev(TIPAR_MAJOR, "tipar", &tipar_fops)) { 495 - printk(KERN_ERR "tipar: unable to get major %d\n", TIPAR_MAJOR); 496 - err = -EIO; 497 - goto out; 498 - } 499 - 500 - tipar_class = class_create(THIS_MODULE, "ticables"); 501 - if (IS_ERR(tipar_class)) { 502 - err = PTR_ERR(tipar_class); 503 - goto out_chrdev; 504 - } 505 - if (parport_register_driver(&tipar_driver)) { 506 - printk(KERN_ERR "tipar: unable to register with parport\n"); 507 - err = -EIO; 508 - goto out_class; 509 - } 510 - 511 - err = 0; 512 - goto out; 513 - 514 - out_class: 515 - class_destroy(tipar_class); 516 - 517 - out_chrdev: 518 - unregister_chrdev(TIPAR_MAJOR, "tipar"); 519 - out: 520 - return err; 521 - } 522 - 523 - static void __exit 524 - tipar_cleanup_module(void) 525 - { 526 - unsigned int i; 527 - 528 - /* Unregistering module */ 529 - parport_unregister_driver(&tipar_driver); 530 - 531 - unregister_chrdev(TIPAR_MAJOR, "tipar"); 532 - 533 - for (i = 0; i < PP_NO; i++) { 534 - if (table[i].dev == NULL) 535 - continue; 536 - parport_unregister_device(table[i].dev); 537 - device_destroy(tipar_class, MKDEV(TIPAR_MAJOR, i)); 538 - } 539 - class_destroy(tipar_class); 540 - 541 - pr_info("tipar: module unloaded\n"); 542 - } 543 - 544 - /* --------------------------------------------------------------------- */ 545 - 546 - __setup("tipar=", tipar_setup); 547 - module_init(tipar_init_module); 548 - module_exit(tipar_cleanup_module); 549 - 550 - MODULE_AUTHOR(DRIVER_AUTHOR); 551 - MODULE_DESCRIPTION(DRIVER_DESC); 552 - MODULE_LICENSE(DRIVER_LICENSE); 553 - 554 - module_param(timeout, int, 0); 555 - MODULE_PARM_DESC(timeout, "Timeout (default=1.5 seconds)"); 556 - module_param(delay, int, 0); 557 - MODULE_PARM_DESC(delay, "Inter-bit delay (default=10 microseconds)");
-44
include/linux/ticable.h
··· 1 - /* Hey EMACS -*- linux-c -*- 2 - * 3 - * tipar/tiser/tiusb - low level driver for handling link cables 4 - * designed for Texas Instruments graphing calculators. 5 - * 6 - * Copyright (C) 2000-2002, Romain Lievin <roms@lpg.ticalc.org> 7 - * 8 - * Redistribution of this file is permitted under the terms of the GNU 9 - * Public License (GPL) 10 - */ 11 - 12 - #ifndef _TICABLE_H 13 - #define _TICABLE_H 1 14 - 15 - /* Internal default constants for the kernel module */ 16 - #define TIMAXTIME 15 /* 1.5 seconds */ 17 - #define IO_DELAY 10 /* 10 micro-seconds */ 18 - 19 - /* Major & minor number for character devices */ 20 - #define TIPAR_MAJOR 115 /* 0 to 7 */ 21 - #define TIPAR_MINOR 0 22 - 23 - #define TISER_MAJOR 115 /* 8 to 15 */ 24 - #define TISER_MINOR 8 25 - 26 - #define TIUSB_MAJOR 115 /* 16 to 31 */ 27 - #define TIUSB_MINOR 16 28 - 29 - /* 30 - * Request values for the 'ioctl' function. 31 - */ 32 - #define IOCTL_TIPAR_DELAY _IOW('p', 0xa8, int) /* set delay */ 33 - #define IOCTL_TIPAR_TIMEOUT _IOW('p', 0xa9, int) /* set timeout */ 34 - 35 - #define IOCTL_TISER_DELAY _IOW('p', 0xa0, int) /* set delay */ 36 - #define IOCTL_TISER_TIMEOUT _IOW('p', 0xa1, int) /* set timeout */ 37 - 38 - #define IOCTL_TIUSB_TIMEOUT _IOW('N', 0x20, int) /* set timeout */ 39 - #define IOCTL_TIUSB_RESET_DEVICE _IOW('N', 0x21, int) /* reset device */ 40 - #define IOCTL_TIUSB_RESET_PIPES _IOW('N', 0x22, int) /* reset both pipes*/ 41 - #define IOCTL_TIUSB_GET_MAXPS _IOR('N', 0x23, int) /* max packet size */ 42 - #define IOCTL_TIUSB_GET_DEVID _IOR('N', 0x24, int) /* get device type */ 43 - 44 - #endif /* TICABLE_H */
+6 -6
lib/kobject.c
··· 234 234 235 235 236 236 /** 237 - * kobject_set_name - Set the name of an object 238 - * @kobj: object. 239 - * @fmt: format string used to build the name 237 + * kobject_set_name - Set the name of a kobject 238 + * @kobj: kobject to name 239 + * @fmt: format string used to build the name 240 240 * 241 - * If strlen(name) >= KOBJ_NAME_LEN, then use a dynamically allocated 242 - * string that @kobj->k_name points to. Otherwise, use the static 243 - * @kobj->name array. 241 + * This sets the name of the kobject. If you have already added the 242 + * kobject to the system, you must call kobject_rename() in order to 243 + * change the name of the kobject. 244 244 */ 245 245 int kobject_set_name(struct kobject * kobj, const char * fmt, ...) 246 246 {