framebuffer.c


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <sys/mman.h>

int fd;
struct fb_var_screeninfo  fbvar;
int width;
int height;
int bpp;
int byte_total;
unsigned short *vbase;

int main( void ) {
  if(access( "/dev/fb0",F_OK)) {
    printf("error");
  }

  fd = open("/dev/fb0", O_RDWR);

  if(fd < 0 ) {
printf("error"); }

  if( ioctl( fd, FBIOGET_VSCREENINFO, &fbvar ) < 0 ) { printf("error"); }

  width   = fbvar.xres;
  height  = fbvar.yres;
  bpp     = fbvar.bits_per_pixel;
  byte_total = width*height*(bpp/8);
  //IOCTL을 통해 읽어온값 확인하기

  vbase = (unsigned short * ) mmap(0, byte_total, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0 );
  //주소값 찍어보기

  printf("wdith : %d height : %d bpp : %d byte_total : %d\n", width, height, bpp, byte_total);

  printf("vbase : 0x%x\n", vbase);
}
 


컴파일
arm-linux-gcc framebuffer.c


ARM보드 상에서 실행

# rx a.out
# chmod 777 a.out
# ./a.out

Posted by 리트모스
:

1. 기본명령어

무선랜 활성화를 위한 모듈 추가(이미 추가 되었다고 반응)

# insmod /lib/modules/gspi.ko
insmod: cannot insert '/lib/modules/gspi.ko': File exists

활성화된 모듈확인
# lsmod
gspi8xxx 229556 1 - Live 0xbf003000
gspi 7828 1 gspi8xxx, Live 0xbf000000

무선랜 검색
# wlanconfig eth0 setuserscan                                         
Driver build with Wireless Extension 19
------------------------------------------------------------------------------
# | ch  | ss  |       bssid       |   cap    |   SSID
------------------------------------------------------------------------------ 
00| 006 | 079 | 00:1b:2f:b6:1a:bc | 0001-I   | ap0159                          
01| 006 | 043 | 00:18:39:a3:42:90 | 0001-I   | EDU_606                         
02| 009 | 081 | 00:18:39:a1:8f:6a | 0001-I   | EDU_601                         
03| 011 | 085 | 00:11:50:f0:da:7a | 0411-IP  | belkin54g                    

아이피 정보조회(윈도우즈 : IPCONFIG)
# ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 00:1A:6B:9D:4D:09
          inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1         
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
          Interrupt:48

드라이버 확장
# wlanconfig eth0 reassociate 00:18:39:a3:42:90 00:1A:6B:9D:4D:09 EDU_606

Driver build with Wireless Extension 19

이더넷 정보확인
# cat /proc/net/wlan/info
driver_name = "wlan"
driver_version = gspi8686-8.70.1.p2-26331-(FP4)
InterfaceName="eth0"
Mode="Managed"
State="Connected"
MACAddress="00:1a:6b:9d:4d:09"
MCCount="1"
ESSID="EDU_606"
Channel="6"
region_code = "10"
MCAddr[0]="01:00:5e:00:00:01"
num_tx_bytes_transmited = "0"
num_rx_bytes_recieved = "532"
num_tx_packets_transmited = "0"
num_rx_packets_received = "9"
num_tx_packets_dropped = "0"
num_rx_packets_dropped = "0"
num_tx_errors= "0"
num_rx_errors= "0"

이더넷 노드 활성화(Ethernet node 활성화)
# ifconfig eth0 192.168.6.11 up

라우터 조회
# route
Kernel IP routing table                                                        
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface  
192.168.6.0     *               255.255.255.0   U     0      0        0 eth0

디폴트 라우트값 추가
# route add default gw 192.168.6.1 eth0

라우트값 삭제
# route del default gw 192.168.6.1 eth0

라우터 조회
# route                                                                        
Kernel IP routing table                                                        
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.6.0     *               255.255.255.0   U     0      0        0 eth0
default         192.168.6.1     0.0.0.0         UG    0      0        0 eth0


2. 무선랜 활성화 정리
# ifconfig eth0 down

# ifconfig eth0 192.168.1.111 up

# route add default gw 192.168.1.1 eth0

# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     0      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

# ping 209.85.171.104
PING 209.85.171.104 (209.85.171.104): 56 data bytes
64 bytes from 209.85.171.104: seq=0 ttl=240 time=151.384 ms
64 bytes from 209.85.171.104: seq=1 ttl=240 time=130.196 ms
Posted by 리트모스
:


커널 모듈(Kernel Module) 이란?

시스템 부팅 후에 동적으로 loading 할 수 있는 커널 구성요소. 커널을 다시 컴파일 하거나 시스템 리부팅 할 필요 없이 커널의 일부분을 교체하는 것이 가능하며, 디바이스 드라이버, 파일 시스템, 네트워크 프로토콜 등이 모듈로 제공된다.

컴파일한 커널 버전 정보가 들어가야 하고, 현재 실행되고 있는 커널 버전과 일치해야 한다. <linux/module.h>에 정의되어 있으며, 모듈 정보는 전체 모듈에서 하나만 존재해야 한다.


일반 응용 프로그램과의 차이점

main() 함수가 없으며 커널에 로딩 및 제거 될 때 불러지는 함수가 존재 한다.
Loading 시 - int init_module(void) 함수 호출
Unloading 시 - void cleanup_module() 함수 호출


커널에 적재할 파일작성

hello.c 작성


/* hello.c */

#include <linux/module.h> /* 모든 모듈에 필요 */
#include <linux/kernel.h>   /* printk() 등에 필요 */

int hello_init(void) { // 모듈이 로딩될 때 호출
 printk (“Hello world\n”);
 return 0;
}

void hello_exit(void) { // 제거 될 때 호출
 printk (“Goodbye world”);
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE(“GPL”);

Makefile 작성


#Makefile

obj-m   := hello.o
 
KDIR    :=$(커널 소스가 설치된 절대 경로)
PWD     :=$(shell pwd)
 
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
       
clean:
        rm -rf *.ko
        rm -rf *.mod.*
        rm -rf .*.cmd
        rm -rf *.o



커널에 모듈 적재 및 확인(insmod, lsmod, rmmod)

생성된 모듈을 로딩

# rx hello.ko


시리얼 통신(x모뎀)을 통해 타겟으로 컴파일한 ko 파일 전송을 하도록 한다.


# insmod hello.ko


커널에 적재된 모듈 목록 보기

# lsmod


모듈 제거

# rmmod hello 


모듈 적재와 제거 시에 원래 의도했던 메시지들이 출력되는 지 확인


참조 PPT(국민대학교 임베디드 랩, KESL)



Posted by 리트모스
: