Microsoft Word - MPC850 SPI Driver.doc

Similar documents
untitled

K&R2 Reference Manual 번역본

PowerPoint 프레젠테이션

슬라이드 1

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Microsoft Word doc

Chapter #01 Subject

슬라이드 1

Embeddedsystem(8).PDF

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

10.

교육지원 IT시스템 선진화

KEY 디바이스 드라이버

SRC PLUS 제어기 MANUAL


API 매뉴얼

DE1-SoC Board

Microsoft PowerPoint - lab14.pptx

T100MD+

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

PRO1_09E [읽기 전용]


CD-RW_Advanced.PDF

MPLAB C18 C

Microsoft PowerPoint - IOControl [호환 모드]

PowerPoint 프레젠테이션

Microsoft PowerPoint APUE(File InO).pptx

/chroot/lib/ /chroot/etc/

Microsoft Word - FunctionCall

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

API 매뉴얼

[8051] 강의자료.PDF

hd1300_k_v1r2_Final_.PDF

10주차.key

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

휠세미나3 ver0.4

제1장 Unix란 무엇인가?

Mango220 Android How to compile and Transfer image to Target

1217 WebTrafMon II

(SW3704) Gingerbread Source Build & Working Guide

MAX+plus II Getting Started - 무작정따라하기

Chap06(Interprocess Communication).PDF

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

UI TASK & KEY EVENT

CANTUS Evaluation Board Ap. Note

Microsoft PowerPoint - polling.pptx

Microsoft PowerPoint - lab15.pptx

chap7.key

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

IoT FND8 7-SEGMENT api

제12장 파일 입출력

슬라이드 1

6주차.key

bn2019_2

목차 1. 개요 USB 드라이버 설치 (FTDI DRIVER) FTDI DRIVER 실행파일 USB 드라이버 확인방법 DEVICE-PROGRAMMER 설치 DEVICE-PROGRAMMER

슬라이드 제목 없음

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<32B1B3BDC32E687770>

untitled

Mango-AM335x LCD Type 커널 Module Parameter에서 변경하기

강의10

C++-¿Ïº®Çؼ³10Àå

Something that can be seen, touched or otherwise sensed

목차 1. 제품 소개 특징 개요 Function table 기능 소개 Copy Compare Copy & Compare Erase

PowerPoint 프레젠테이션

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

목차 제 1 장 inexio Touch Driver소개 소개 및 주요 기능 제품사양... 4 제 2 장 설치 및 실행 설치 시 주의사항 설치 권고 사양 프로그램 설치 하드웨

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

untitled

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft PowerPoint APUE(File InO)

Microsoft PowerPoint - chap2

Microsoft PowerPoint APUE(File InO).ppt

ABC 11장

PowerPoint 프레젠테이션

歯9장.PDF

다음 사항을 꼭 확인하세요! 도움말 안내 - 본 도움말에는 iodd2511 조작방법 및 활용법이 적혀 있습니다. - 본 제품 사용 전에 안전을 위한 주의사항 을 반드시 숙지하십시오. - 문제가 발생하면 문제해결 을 참조하십시오. 중요한 Data 는 항상 백업 하십시오.

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint 프레젠테이션

lecture4(6.범용IO).hwp

Adding a New Dev file

Microsoft Word doc

Microsoft Word - KPMC-400,401 SW 사용 설명서

untitled

사용시 기본적인 주의사항 경고 : 전기 기구를 사용할 때는 다음의 기본적인 주의 사항을 반드시 유의하여야 합니다..제품을 사용하기 전에 반드시 사용법을 정독하십시오. 2.물과 가까운 곳, 욕실이나 부엌 그리고 수영장 같은 곳에서 제품을 사용하지 마십시오. 3.이 제품은

1. GigE Camera Interface를 위한 최소 PC 사양 CPU : Intel Core 2 Duo, 2.4GHz이상 RAM : 2GB 이상 LANcard : Intel PRO/1000xT 이상 VGA : PCI x 16, VRAM DDR2 RAM 256MB

vi 사용법

Remote UI Guide

BMP 파일 처리

untitled

untitled

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

chap10.PDF

Transcription:

MPC850 SPI Driver 네트워크보드에서구현한 SPI Device Driver 제작및이용방법입니다. 문서작성 : 이재훈 (kingseft.lee@samsung.com) 이용한 SPI EEPROM - X5043/X5045 512 x 8 bit SPI EEPROM (4Kbits = 512bytes) - 제조사 : XICOR (www.xicor.com) - SPI 로억세스제어함 - 구성회로도는아래와같다. - SPI 의 Instruction Set은다음과같다. Instrcution Name Instruction Format Operation WREN 00000110 Enable Write Operations WRDI 00000100 Disable Write Operation RDSR 00000101 Read Status Register WRSR 00000001 Write Status Register READ 0000A011 Read Data from EEPROM WRITE 0000A010 Write Data to EEPROM - SPI Status Register 의 0번째비트인 WIP(Write In Progress) 를검출하여서이것이 0 이면 Write in Progress 동작이멈추었다. 즉, Write 동작이종료되었다는것을판단해야한다. - SPI Status Register를읽은방법은 CS 를 Low로하여디바이스를선택하고, 8 bit RSDR Instruction 을적어주면 Status Register의값이 SO을통해나오게된다. - 아래의그림은 Read Status Register를읽는동작이다.

[SPI Status Register 를읽는동작 ] SPI EEPROM Memory Read/Write 1. Chip select 를 Low 로하여디바이스선택 2. 8 bit READ Instruction을써준다. 3. 8 bit Address를써준다. 4. 8 bit Data를써준다. 주의할것은 512 바이트이므로 0x00 0x1ff 까지이므로어드레스표현이 2바이트를차지한다. 그러므로 0x00 0xFF 까지는어드레스를써주는곳에그냥써주면되고, 0x100 0x1ff 까지는두바이트이므로상위 1바이트값은 2번의 Read Instruction 부분에서 Bit 3 에적어준다. 나머지어드레스는그대로어드레스를써주는곳에적는다. The address is automatically incremented to the next higher address after each byte of data is shifted out. When the highest address is reached, the address counter rolls over to address $000 allowing the read cycle to be continued indefinitely. The read operation is terminated by taking CS high. [Read data from EEPROM]

Write Memory Data to EEPROM 1. Chip Selct Low 2. WREN Instruction 써준다. 3. WRITE Instruction을써준다. 여기에서써줄주소가 0x100을넘는다면 3번째비트에 1을써주어야한다 4. 8 bit 어드레스를써준다. 5. 데이터를써준다. 6. Chip Select를 High로올린다. [Write Data to SPI EEPROM] SPI EEPROM 사용시의주의점 - 16 byte page write mode 를이용한다. - the WRITE operation o requires at least 16 clocks. CS must go low and remain low for the duration of the operation. The host may continue to write up to 16 bytes of data. The only restrinction is that the 16 bytes must reside within the same page. SPI Device driver file 디렉토리 arch/ppc/8xx_io/spi.c spi.c spi device driver source micropatch.c SCC2를 ethernet으로사용할경우반드시패치시켜주어야함. SPI 이용을위하여수정된부분 - arch/ppc/8xx_io/config.in - arch/ppc/8xx_io/makefile - arch/ppc/8xx_io/spi.c

- arch/ppc/8xx_io/micropatch.c - arch/ppc/8xx_io/spi.h /8xx_io/spi.h - arch/ppc/8xx_io/enet.c - drivers/char/mem.c SPI 초기화 Port B 레지스터설정 PBPAR (port B signal assignment register ), PBDIR (port B data direction register ) 를이용하여초기화한다. Signal function Signal PBPAR[DDn] = 0 PBPAR[DDn] = 1 PBDIR[DRn] = 0 PBDIR[DRn] = 1 default PB31 Port B 31 SPISEL --- Vdd PB30 Port B 30 TXD3 SPICLK SPICLK = GND PB29 Port B 29 RXD3 SPIMOSI SPIMOSI = Vdd PB28 Port B 28 BRG3 SPIMISO SPIMISO = SPIMOSI PB16 Port B 16 LIST4 --- --- SPI 드라이버에서사용하는레지스터세팅 cp->cp_pbpar &= ~0x00008000 ; // Port B 16 used cp->cp_pbpar = 0x0000000E ; // cp->cp_pbdat = 0x00008000 ; // C/S active low cp->cp_pbdir = 0x0000800E ; // cp->cp_pbodr &= ~(0x0000800E) ; // 본디바이스드라이버에서는 SPISEL을사용하지않고, PB16 을 C/S 신호로사용한다. SPI 레지스터설정 MPC850 user s manual: Ch31. Serial Peripheral Interface 참조 내부함수목록 void cpm_spi_init(void) : 디바이스드라이버초기화루틴 static int cpm_spi_open(struct inode *, struct file *) : open handler static int cpm_spi_close(struct inode *, struct file *) : close handler static ssize_t cpm_spi_write(struct file *, char *, size_t, loff_t *) : file write handler static ssize_t cpm_spi_read(struct file *, char *, size_t, loff_t *) : file read handler static int cpm_spi_ioctl(struct inode *, struct file *, u_int, u_char *) : ioctl handler

SPI memory 조작 Driver 등록 SPI driver를사용하려면다음과같은명령으로 spi special file을만들어둔다. SPI device는 major 번호 91을갖는다. 주의 : 본구현에서는 MTD및 JFFS2를적용하기위하여수정을하였다. MTD : Major 90 SPI : Major 91 I2C : Major 89 # mknod /dev/spi0 c 91 0 # mknod /dev/spi1 c 91 1 혹은 ramdisk 에이미만들어진 spi node 를이용할수도있다. Driver Open SPI memory 를사용하기전에반드시다음과같은함수호출로 SPI device 를열어야한다. /* Example : open */ #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int fd; fd = open( /dev/spi0 /dev/spi0, O_RDWR ); Memory read open() 함수호출로 SPI device를열었으면 read() 함수를사용하여 SPI 메모리의내용을읽어낼수있다. 표준 read() 함수는다음과같은형식을갖는다. #include <unistd.h> ssize_t read( int filedes, void *buff, size_t nbytes ); 특정번지를선택하여읽으려면반드시 lseek() 함수를사용하여읽고싶은주소에위치를맞추 고 read() 함수를호출하면된다.

예제 : /* Example : read */ #include <sys/types.h> #include <unistd.h> unsigned char addr; int size, readcnt; unsigned char buf[32]; size = 2; /* size to read */ lseek( fd, 0, SEEK_SET ); readcnt = read( fd, buf, size ); Memory write open() 함수호출로 SPI device를열었으면 write() 함수를사용하여 SPI 메모리에특정한내용을써넣을수있다. 표준 write() 함수는다음과같은형식을갖는다. #include <unistd.h> ssize_t write ( int filedes, void *buff, size_t nbytes ); 특정번지를선택하여써넣으려면반드시 lseek() 함수를사용하여쓰고싶은주소에위치를맞 추고 write() 함수를호출하면된다. 예제 : /* Example : write #include <sys/types.h> #include <unistd.h> int size, writecnt; unsigned char buf[32]; size = 2; /* size to read */ buf[0] = 1; buf[1] = 2; buf[2] = 3; buf[4] = 4; lseek( fd, 0, SEEK_SET ); writecnt = write( fd, buf, size ); IOCTL function 표준 read() 또는 write() 함수를이용하지않고하나의함수로 read/write를하기위해 ioctl() 함수를사용할수있다. 표준 ioctl() 함수는다음과같은형식을가진다.

#include <sys/ioctl.h> int ioctl( int fd, int request, ); SPI device 를다음과같은형식으로사용할수있다. int ioctl( int fd, int request, struct spicmd_t *arg ); request 0 : read command, 1 : write command arg: typedef struct { unsigned long addr; /* start address to read/write */ unsigned int size; /* size to read/write */ unsigned char *buf; /* buffer pointer */ } spicmd_t; return value: on success returns byte size, on failure returns 1 예제 : memory read /* read example */ spicmd_t spicmd; unsigned char rxbuf[8]; int rxcnt; spicmd.addr = 0x10; spicmd.size = 2; rxcnt = ioctl( fd, 0, &spicmd ); if( rxcnt > 0 ) memcpy( rxbuf, spicmd.buf2, count ); 예제 : memory write /* write example */ spicmd_t spicmd; unsigned char txbuf[] = { 0x10, 0x20, 0x30, 0x40 }; int txcnt; spicmd.addr = 0x10; spicmd.size = sizeof(txbuf); txcnt = ioctl( fd, 1, &cpicmd );

SPI Device Driver for 삼성테크윈네트워크보드 1. 관련파일 /arch/ppc/8xx_io/spi.c /arch/ppc/8xx_io/micropatch.c /arch/ppc/8xx_io/testspi.c /arch/ppc/8xx_io/makefile spi.c spi device drivers for mpc8xx micropatch.c SCC2를 Ethernet으로사용시에는반드시패치를시켜주어야한다. testspi.c spi test program makefile 위의파일들을같이컴파일하기위해서 makefile 을수정함 2. 수정내역 [/arch/ppc/8xx_io/makefile] # # Makefile for the linux MPC8xx ppc-specific parts of comm processor # # Note! Dependencies are done automagically by 'make dep', which also # removes any old dependencies. DON'T put your own dependencies here # unless it's something special (ie not a.c file). # # Note 2! The CFLAGS definition is now in the main makefile... O_TARGET := 8xx_io.o obj-y := commproc.o uart.o obj-$(config_fec_enet) += fec.o obj-$(config_scc_enet) += enet.o obj-$(config_8xx_lcd) += lcd823.o obj-$(config_ucode_patch) += micropatch.o # kingseft obj-$(config_8xx_usb) obj-$(config_8xx_spi) # end of kingseft += usb.o += spi.o include $(TOPDIR)/Rules.make

[arch/ppc/8xx_io/commproc.c] void m8xx_cpm_reset(uint host_page_addr) { volatile immap_t *imp; volatile cpm8xx_t *commproc; pte_t *pte; imp = (immap_t *)IMAP_ADDR; commproc = (cpm8xx_t *)&imp->im_cpm; #ifdef CONFIG_UCODE_PATCH /* Perform a reset. */ commproc->cp_cpcr = (CPM_CR_RST CPM_CR_FLG); /* Wait for it. */ while (commproc->cp_cpcr & CPM_CR_FLG); #endif cpm_load_patch(imp); [/arch/ppc/8xx_io/config.in] # kingseft comment 'Generic MPC8xx Options' bool 'Copy-Back Data Cache (else Writethrough)' CONFIG_8xx_COPYBACK bool 'CPU6 Silicon Errata (860 Pre Rev. C)' CONFIG_8xx_CPU6 bool 'I2C/SPI Microcode Patch' CONFIG_UCODE_PATCH if [ "$CONFIG_UCODE_PATCH" = "y" ]; then bool 'SPI Function Enable' CONFIG_8xx_SPI fi bool 'USB Function Enable' CONFIG_8xx_USB if [! "$CONFIG_8xx_USB" = "n" ]; then bool 'USB debug Message' CONFIG_USB_FN_DEBUG fi # end of kingseft

[/scripts/ktconfig.tk] CONFIG_UCODE_PATCH 추가부분확인할것 [/include/config/ucode/patch.h] #define CONFIG_UCODE_PATCH 1 [/arch/ppc/8xx_io/enet.c] x_io/enet.c] int init scc_enet_init(void) { struct net_device *dev; struct scc_enet_private *cep; int i, j; unsigned char *eap; unsigned long mem_addr; pte_t *pte; bd_t *bd; volatile cbd_t *bdp; volatile cpm8xx_t *cp; volatile scc_t *sccp; volatile scc_enet_t *ep; volatile immap_t *immap; extern unsigned long _get_immr(void); #ifdef CONFIG_8xx_SPI /* FLOYDLSH */ unsigned char tmpbuf[64]; char *s, *e; int getenv_r(u_char *name, u_char *buf, unsigned len ); //extern ssize_t spi_read( u_long addr, char *, size_t ); #endif /* Set Ethernet station address. * * If we performed a MBX diskless boot, the Ethernet controller * has been initialized and we copy the address out into our * own structure. * * All other types of boards supply the address in the board

* information structure, so we copy that into the controller. */ #ifdef CONFIG_8xx_SPI /* FLOYDLSH */ i = getenv_r("ethaddr", tmpbuf, sizeof(tmpbuf)); if( i > 0 ) { s = tmpbuf; for( i=0; i<6; i++ ) { bd->bi_enetaddr[i] = s? simple_strtoul(s, &e, 16) : 0; if(s) s = (*e)? e+1 : e; } } #endif [scripts/ktconfig.tk] CONFIG_8xx_SPI 추가된부분확인 [drivers/char/mem.c] int init chr_dev_init(void) { #ifdef CONFIG_STATUS_LED statusled_init (); /* Status LED should be working *fast* */ #endif if (devfs_register_chrdev(mem_major,"mem",&memory_fops)) printk("unable to get major %d for memory devs\n", MEM_MAJOR); memory_devfs_register(); rand_initialize(); /* kingseft */ #ifdef CONFIG_8xx_SPI cpm_spi_init(); #endif /* end of kingseft */ [include/config/8xx/spi.h] #define CONFIG_8xx_SPI 1