본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-20100906-임종현

by 알 수 없는 사용자 2010. 9. 7.
728x90
반응형

inittab

   

inittab을 설정하기위해서 위와같이 입력하면 다음창이뜬다.

   

   

   

   

   

   

다음은 vi편집기로 열었을때 이다.

   

inttab파일의 런레벨을 설정하여 사용할수 있다.

   

위 파일의 각 필드는 콜론(:)으로 구분한다. 

첫번째 필드는 임의의 식별자로 어떤 것이든 상관없으며 파일 내에서 다른 것과 총돌하지 않으면 된다. 

둘째 필드는 명령이 실행될 실행 레벨이다.

셋째 필드는 init이 그 항목을 어떻게 처리할 것인지 지시한다.

넷째 필드는 init이 실제 실행할 명령이다.

id : 2 : initdefault     -> 디폴티 run level 2로 설정

si : : sysinit : /etc/init.d/rcS     -> 시스템을 부팅할 때 init에게 /etc/init.d/rcS을 실행 하도록 한다. 이 파일은 기본 시스템 초기화를 처리해주는 명령을 담은 간단한 셸 스크립트다. 예를 들면, 스와핑 긴능을 켜고 파일시스템을 점검하고, 마운트하며, 시스템 시간을 CMOS 시간에 맞춘다.

10 : 0 : wait : /etc/init.d/rc 0

11 : 1 : wait : /etc/init.d/rc 1

12 : 2 : wait : /etc/init.d/rc 2

13 : 3 : wait : /etc/init.d/rc 3

14 : 4 : wait : /etc/init.d/rc 4

15 : 5 : wait : /etc/init.d/rc 5

16 : 6 : wait : /etc/init.d/rc 6

-> 실행 레벨 0부터 6까지, 어디로 들어가든 /etc/init.d/rc 스크립트에 적절한 실행 레벨 인수를 사용하여 실행한다. rc는 다목적 시동 스크립트로서, 각 실행 레벨에 알맞은 스크립트를 실행시켜 준다. 여기서 action 필드는 wait다. init에게 주어진 command를 실행하고, 종료할 때까지 기다린 후 다음 작업으로 넘어가라는 지시다.

-> 각 실행 레벨의 스크립트는 (데비안의 경우) /etc/rcN.d에 있다. 여기서 N은 시작할 실행 레벨 번호다. 따라서 실행 레벨 2라면 /etc/rc2.d의 스크립트를 사용한다. 이 디렉토리들의 내용을 살펴 보면 Snnxxxx나 Knnxxxx 형태의 파일을 볼 수 있는데 K로 시작하는 서비스를 죽이는 스크립트이며, S로 시작하는 스크립트는 서비스를 시작할 때 사용하는 스크립트다. 이름에 들어 있는 nn은 서로의 실행 순서를 맞추려는 것으로 낮은 번호의 스크립트는 높은 번호의 스크립트보다 먼저 실행된다.

-> 같은 서비스를 서로 다른 실행 레벨에서 시작하고 중지하기 때문에 같은 스크립트를 여러 곳에 복사하는 것보다 심볼릭 링크를 사용하고 있다. 따라서 각각의 S, K 파일은 모든 서비스의 시동/셧다운 스크립트를 포함한 중앙 디렉토리를 가리키는 심볼릭 링크일 뿐이다. 데비안의 경우 이 중앙 디렉토리는 /etc/init.d 이다. 그러므로 특정 서비스를 시동 시키거나 중지시키고 싶을 때는 /etc/init.d에 위치한 스크립트를 이용하면 쉽게 할 수 있다.

/etc/init.d/networking stop  : 네트워크 서비스 중단

/etc/init.d/networking start  : 네트워크 서비스 시작

또 다른 중요 시스템 설정 스크립트는 /etc/init.d/rc.local이 있다. 이 스크립트는 다른 시스템 초기화 스크립트를 실행한 뒤에 실행된다. (보통 각각의 /etc/rcN.d에 S99rc.local이라는 심볼릭 링크를 만들어 둔다. 99라는 숫자는 s 스크립트가 가질 수 있는 가장 큰 숫자이므로 가장 나중에 실행된다) 부팅 중 다른 특별한 시스템 명령을 실행하길 원하거나 어디에서 실행시켜야 할지 모를 때는 rc.local 파일을 편집하여 사용하면 된다.

ca : 12345 : ctrlaltdel : /sbin/shutdown -t1 -a -r now

-> 이 항목은 콘솔에서 Ctrl-Alt-Del 을 눌렀을 때 실행된다. 이 키조합을 누르면 보통 시스템은 재부팅하는 인터럽트가 발생한다. 리눅스에서는 이 인터럽트를 받아 init에게 보내고 init은 ctrlaltdel의 action 필드에 있는 항목을 실행한다. 여기서는 /sbin/shutdown -t1 -a -r now로 안전한 시스템 재부팅을 진행시킨다.

1: 2345 : respawn : /sbin/getty 38400 tty1

2: 23 : respawn : /sbin/getty 38400 tty2

3: 23 : respawn : /sbin/getty 38400 tty3

4: 23 : respawn : /sbin/getty 38400 tty4

5: 23 : respawn : /sbin/getty 38400 tty5

6: 23 : respawn : /sbin/getty 38400 tty6

-> 마지막으로 inittab 파일에는 처음 나오는 6개의 가상 콘솔을 /sbin/getty에서 실행하는 항목이 있다. 이 프로그램은 터미널의 로그인을 받아준다. 이 프로그램이 없다면 터미널은 그야말로 죽은 상태나 다름없으며 키보드나 마우스에 반응하지 않는다. getty 명령은 터미널 장치를 열고 터미널 드라이버에 다양한 매개변수를 설정하고 /bin/login을 실행하여 로그인 세션을 연다.

-> getty는 '보율(baud rate)'과 '장치'라는 두 개의 인수를 받는다. 리눅스 가상 콘솔의 포트명은 /dev/tty1, /dev/tty2등이다. 가상 콘솔의 보율은 일반적으로 38400이다.

-> getty 항목의 action 필드는 respawn인데 이는 해당 명령이 죽으면 init이 다시 명령을 실행한다는 뜻으며, 사용자가 로그아웃 할 때마다 getty 프로세스가 죽으며 이에 따라 getty 프로세스를 다시 실행시켜 로그인을 준비한다.

   

프린트 포트-

   

  

  

  

  

  

  

1.

[] No 항목은 DB25 커넥터의 핀 번호이고, 36핀 항목은 프린터 케이블에
달린 센트로닉스 36핀 커넥터의 핀 번호이다.
예를 들면 DB25 커넥터의 15번 핀은 센트로닉스 커넥터의 32번 핀에
연결 되었다는 뜻.
[] 논리 항목에 "R" 표시된 핀은 레지스터의 비트와 커넥터 핀의 신호가 반대로
되는데, 예를들어 1번 핀은 레지스터 비트가 "1"일때 커넥터핀은 "0"이 된다.
[] 신호방향은 핀의 신호가 PC에서 나가는 신호면 "OUT", 들어오는 신호면
"IN"으로 표시한다.
[] 데이터,상태, 제어 항목은 각각 어느 핀이 어느 레지스터의 어느 비트에
연결되어 있는가를 나타낸다. 예를 들면:
2번 핀은 DATA 레지스터의 0번 비트에 연결되어 있다; 그래서 PC에서
DATA 레지스터의 BIT 0를 1로 하면 2번 핀에 전압이 나타나고, 0으로 하면
꺼진다. (출력 핀에 나타나는 전압은 약 5볼트이다:TTL레벨)
표에 나와있지 않은 비트들은 사용되지 않는 비트들로 보통 1로 세트되어 있다.
[] 각 레지스터의 주소는 프린터 포트마다 다르다.
LPT1의 베이스 포트 주소는 PC의 BIOS 영역 40:08에, LPT2의 주소는 40:0A에
1워드(2바이트)로 저장되어 있어 이곳을 읽으면 베이스주소를 알수있다.
단, 베이스 주소가 0이거나 3FFh 이상이면 프린터포트가 설치되어있지 않은 것이다.
[] 데이터(DATA) 레지스터의 주소는 베이스 포트 주소와 같고,
상태(Status) 레지스터의 주소는 베이스 주소에 1을 더한 주소이며,
제어(Control) 레지스터의 주소는 베이스 주소에 2를 더한 주소이다.

LPT 번호

BIOS영역의

주소위치

레지스터 주소

  

  

  

  

데이터

상태

제어

LPT1:

40h:08h

(40h:08h)

(40h:08h) + 1

(40h:08h) + 2

LPT2:

40h:0Ah

(40h:0Ah)

(40h:0Ah) + 1

(40h:0Ah) + 2

LPT3:

40h:0Ch

(40h:0Ch)

(40h:0Ch) + 1

(40h:0Ch) + 2

   

2.

*1 PC에서 프린터 인터럽트를 활성화 시키면, 이 핀을 0으로 할 때 마다
PC 내부의 IRQ 인터럽트 루틴이 실행된다.
** 인터럽트는 하강엣지에서 걸리지만 비트 자체의 논리는 부논리가 아닌 정논리이다.
*2 이 핀의 신호가 0이면 프린터가 리셋된다.
*3 이 접지 핀들은 원래 프린터로 연결될 때 핀 2 - 9 번의 Data 핀들과
하나씩 꼬여서 연결되는 것이다(Twisted fair)
일반적으로 이들중 하나만 접지로 연결해도 상관 없다.
*4 특수기능 BIT는 프린터포트의 외부로 연결된 핀이 없지만 내부에서
특별한 기능을 가진다.
. IRQ enable을 세트시키면 프린터 IRQ가 활성화 된다. 즉 ACK 신호가
들어올 때마다 IRQ 인터럽트 루틴이 실행된다. 그러나 실제 IRQ를
정말 활성화 시키려면 PC 내의 다른 레지스터도 함께 조작해야 한다,
. Extended mode가 되면 프린터포트의 데이터 레지스터에서 8 비트의
데이터를 입력받을 수 있게 된다; 즉 출력 전용이던 데이터 레지스터가
입력 전용이 된다.(단, 프린터포트가 이것을 지원 해야 함)

3.
핀번호는 왼쪽에서 오른쪽으로 매겨지는데, 암컷 커넥터일 경우는
핀 번호가 반대로 오른쪽에서 왼쪽으로 가면서 매겨진다.
즉, 좌우가 바뀌는 것이다.
또한, 핀이 꽂혀있는 플라스틱 면을 잘 보면 각각 핀 번호가 새겨져
있는것이 보인다.

병렬포트 통신.

man page-

open의 메뉴얼을 보여준다.("man 2 open")

   

병렬포트 통신을 위한 저수준 입출력 소스C코드.

IDev에 있는 값을 읽거나 쓰거나 할 수 있다.

   

   

명일 - 저수준 입출력, 리눅스 명령어 , vi사용법

   

   

   

JAVA-

   

이벤트처리의 다양한 예를 모아서 짜 본것이다.

=========================================================

package JFrameXX;

   

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Panel;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

   

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

import javax.swing.JTextField;

   

class JFrameEx extends JFrame implements ActionListener, KeyListener{

   

JButton jb = new JButton("추가");

JButton a = new JButton("끝");

Panel b = new Panel();

   

JTextField tf = new JTextField();

   

public JFrameEx(){

   

jb.setToolTipText("추가버튼입니당");

a.setToolTipText("종료버튼입니당");

   

jb.addActionListener(this);

a.addActionListener(this);

   

tf.addKeyListener(this);

   

b.add(jb, BorderLayout.WEST);

b.add(a, BorderLayout.EAST);

   

   

add(tf, BorderLayout.SOUTH);

add(b, BorderLayout.NORTH);

setBounds(500,500, 500, 500);

   

setVisible(true);

   

setDefaultCloseOperation(EXIT_ON_CLOSE);

}

@Override

public void actionPerformed(ActionEvent e) {

// TODO Auto-generated method stub

if(e.getSource() == jb){

int result = JOptionPane.showConfirmDialog(jb, "추가할래?");

if(result == 0){

jb.setText("추가완료");        

jb.setEnabled(false);

}

}

if(e.getSource() == a){

System.exit(EXIT_ON_CLOSE);

}

}

@Override

public void keyPressed(KeyEvent e1) {

// TODO Auto-generated method stub

}

@Override

public void keyReleased(KeyEvent e1) {

// TODO Auto-generated method stub

   

   

String str[] = {"ㅋㅋㅋㅋ"};

   

if(e1.getSource()==tf){

   

if(tf.getText().equals(str[0])){

jb.setEnabled(true);        

}

}

}

@Override

public void keyTyped(KeyEvent e1) {

if(e1.getSource()==tf){

JTextField tmp = (JTextField)e1.getSource();

setTitle(tmp.getText());

}

}        

}

public class JFrameX {

   

public static void main(String[] args) {

new JFrameEx();

}

   

}

=========================================================

실행결과이다.

일단 추가를 하게되면 추가할지 다시 되물어보는 창이 생성되고

글자를 적게되면 위의 텍스트필드에 문자의 글자를 보여준다.

그리고 Tooltip을 이용하여 버튼에마우스를 가져갔을때 힌트를 보여준다.

추가를 하고나면 버튼창이 비활성화되는데 다시 활성화시키는 치트를 만들어 놓았다.

   


728x90