Pickit3의 소스코드가 있었는데 USB 장치를 검색하는 부분에서 저 부분을 더 큰 255로 변경해주니 해결. USB 장치가 늘어난 요즘의 컴퓨팅 환경에서는 더 많은 USB장치가 있어서 시스템에서 인식은 하지만 Pickit3 GUI 프로그램에서는 낮게 제한이 걸려있어서 인식을 못했던 것을 고쳤다.

pickit3_usb_fix.zip
0.15MB

 

Posted by 파르셀수스
TAG PicKit3, USB

댓글을 달아 주세요

 HID장치를 간단하게 시리얼 통신처럼 이용할 수 있는 방법은 CDC ACM 방법이 운영체제가 막아서 생기는 문제는 해결할 수 있다. 이 방법이 꼭 장점이 강한 것은 아니지만, 간단한 테스트를 위한 하드웨어에서의 응용은 나쁘지 않을거라고 생각된다.


 기본적으로 HID의 사용되는 프로그래밍 방법은 같고 단지 주의할 점만 존재한다. 호스트 컴퓨터에서 장치로 USB통해 정보는 받는 부분에 control전송과 인터럽트 전송을 모두 거치는 usbFunctionWriteOut을 쓰는데, 이것은 별로 문제가 되지 않는다. 단지 가끔 NULL데이터를 보내므로 펌웨어에서 체크를 하면 된다. 그리고 데이터의 길이가 버퍼의 길이와 맞추는 작업도 필요하다. 이것은 각각의 구현에 따른 변경이 다르므로 다른 게시물에 업로드한 소스를 확인하면 대충 이해하기 쉽다.


 가장 크게 주의할 점은 바로 HID 레포트 정보의 선언으로 장치에서 호스트 컴퓨터로 보내는 크기는 8바이트가 되어야 한다. 그렇지 않으면 데이터가 전혀 전송이 되지 않는다. 호스트 컴퓨터에서 장치로 전송되는 크기는 크게 문제가 없지만 64이하로 만들어주는 것이 좋다.


PROGMEM const char usbHidReportDescriptor[] = {
  0x06, 0xa0, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
  0x09, 0x01,       // USAGE (Vendor Usage 1)
  0xa1, 0x01,       // COLLECTION (Application)

  // Input Report
  0x09, 0x02,       // Usage ID - vendor defined
  0x15, 0x00,       // Logical Minimum (0)
  0x26, 0xFF, 0x00, // Logical Maximum (255)
  0x75, 0x08,       // Report Size (8 bits)
  0x95, 0x08,       // Report Count (8 fields), must be 8
  0x81, 0x02,       // Input (Data, Variable, Absolute)

  // Output report
  0x09, 0x03,       // Usage ID - vendor defined
  0x15, 0x00,       // Logical Minimum (0)
  0x26, 0xFF, 0x00, // Logical Maximum (255)
  0x75, 0x08,       // Report Size (8 bits)
  0x95, 0x16,       // Report Count (16 fields)
  0x91, 0x02,       // Output (Data, Variable, Absolute)

  0xc0              // END_COLLECTION
};


 기본적인 레포트의 선언은 위와 같은데, 항상 명칭은 호스트 컴퓨터를 중심으로 표현된다. Input는 장치에서 컴퓨터로 보내는 것으로 Report Size와 Report Count는 반드시 8바이트가 되어야 한다. 하드웨어 지원이 된다면 이런 제한이 없다고 하는데 하드웨어 USB 지원이 안되는 AVR은 저속 장치로 인식되는 탓에 어쩔 수 없다.


 Output 레포트의 크기는 변화를 줘도 아무런 문제가 없다.


 레포트 선언은 이렇게 간단하고, v-usb의 선언에서 데이터 전송을 위한 부분을 처리하도록 작성하는데 몇개의 함수만 만들어주면 간단히 끝난다.


usbMsgLen_t usbFunctionSetup(uchar data[8])
{
    return 0;
}

uchar usbFunctionRead(uchar *data, uchar len)
{
    return 0;
}

void usbFunctionWriteOut(uchar *data, uchar len)
{
uchar i,c;
    if(len>0) {
        if( (*data==0x0d) || (*data==0x0a) )
            return;
        if(len>HIDSERIAL_INBUFFER_SIZE) len=HIDSERIAL_INBUFFER_SIZE;
        i=0;
        while(i<len) {
            c=data[i];
            inBuffer[i]=c;
            i++;
            if(c==0) break;
        }
        received=1;
        recv_len=i;
    }
}


 usbFunctionSetup은 컴퓨터에 장치의 정보들을 설정하고 주고 받거나 컨트롤 전송을 위해 쓰이는데, 이 구현에서는 따로 크게 코딩할 부분이 없다.


 usbFunctionRead는 장치로 데이터를 보내는 방법을 위한 것으로 마찬가지로 컨트롤 전송을 위한 것으로 인터럽트 전송을 하는 이 방법에서는 쓸모가 없다.


 usbFunctionWriteOut은 호스트 컴퓨터에서 장치로 보내는 데이터를 처리할 때 쓰이는데, 이곳에서 장치의 버퍼에 데이터를 저장하면 된다. 설명에는 컨트롤 전송도 이 함수를 통해 데이터를 받을 수 있다고 되어 있다. 데이터가 다 전송되었다는 것을 확인할 방법을 구현하는게 좋다.


int main(void)
{
    odDebugInit();
    hardwareInit();
    usbInit();

    sei();
    for(;;){    /* main event loop */
        wdt_reset();
        usbPoll();

        if( usbInterruptIsReady() && (received != 0) )
          Translate_buffer(inBuffer);

...

    if(iwptr>0) {
        rx_buf[iwptr]=0;
        usbSetInterrupt(rx_buf,8);
        if(iwptr>8) {
            while(!usbInterruptIsReady()) {
                wdt_reset();
                usbPoll();
            }
            usbSetInterrupt(rx_buf+8,8);
        }
        iwptr=0;
    }

    }
...

    return 0;
}


 이렇게 간단히 선언하고 위와 같이 usbPoll()과 usbInterruptIsReady() 함수로 계속 상태를 확인하고 데이터의 전송에는 usbSetInterrupt(data, 8)과 같이 사용하면 된다. 8로 고정된 이유는 이미 설명했다. 만약 데이터가 길다면 usbPoll()과 usbInterruptIsReady()로 상태를 체크한 후에 usbSetInterrupt(...,8)로 다시 보내주면 된다. 8바이트씩 보내는 것이라 계속 보내준다면 크게 길이의 제한은 없다고 생각된다.


그리고 usbconfig.h의 내용들은 대충 이렇다.

...

#define USB_CFG_HAVE_INTRIN_ENDPOINT    1

#define USB_CFG_HAVE_INTROUT_ENDPOINT   1 

#define USB_CFG_IMPLEMENT_FN_WRITEOUT   1

...

#define USB_CFG_INTERFACE_CLASS     3       /* HID class */
#define USB_CFG_INTERFACE_SUBCLASS  0     
#define USB_CFG_INTERFACE_PROTOCOL  0    

...

#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH    34

...



 특별한 것은 없는 방법론이기 때문에 그냥 따라하면 끝이다. 탐구를 하고 싶다면 삽질을 해봐도 좋을 일이다. =_=;



cdcio.2009-07-15-serhid-4313.zip


추가적인 비트 쓰기/읽기 기능의 추가.

portb.7 portb.1 [  읽기 msb, 첫번째는 데이터, 두번째는 클럭.

portb.0 portb.3 ]  읽기 lsb,

ff portb.1 portb.0 > 쓰기 lsb

ff portb.2. portb1 / 쓰기 msb ( 터미널 오류로 다른 문자를 사용 )



cdcio.2009-07-15-serhid-addfuncs1.zip


'하드웨어' 카테고리의 다른 글

12F675를 이용한 ADC를 가져오기.  (0) 2014.11.21
간단한 승압 회로.  (0) 2014.10.29
AVR Serial/HID의 간단한 설명.  (0) 2014.10.22
AVR Serial HID 구현.  (0) 2014.10.21
USB CDC는 막힌 듯?  (0) 2014.10.20
USBTiny 실험.  (0) 2014.10.17
Posted by 파르셀수스
TAG AVR, SER/HID, USB

댓글을 달아 주세요

AVR Serial HID 구현.

하드웨어 2014. 10. 21. 23:28 |

AVR의 소프트웨어 CDC는 운영체제에서 저속이기 때문에 장치의 연결을 끊는 것으로 확인. 그래서 cdc-io를 포기하려 했으나 YAT란 터미널 프로그램에 Serial HID라는 기능이 존재. 구현을 아무리 찾아봐도 없고 결국 삽질을 해가며 직접 구현.


 입으로 설명하기엔 너무 많이 모르기 때문에 곤란하고 완성된 소스를 첨부. 이 소스에는 V-USB에서 인터럽트 OUT이 가능한 수정이 담겨있다. 이 수정이 약간 틀려서 교정을 봤다.

 예제 4번만 수정되어 있고 출처는 http://lackawanna.hackhut.com/2011/10/06/using-v-usb-and-the-hid-class-part-iiiiii/


avr-all_examples-serhid.zip


 USB HID의 레포트를 만드는게 어렵다면 그냥 복사해서 사용하면 된다. 설정시 압축파일에 들어있는 usbconfig의 내용도 중요하다. YAT로 입력받은 문자를 16진수로 변환해서 다시 보여주는 예제. YAT를 실행에는 관리자 권한이 필요하다. 그냥 띄우면 HID가 장치가 목록에 안보인다.


 중요한 것은 cdc-io를 이 기능에 맞게 다시 변환하는 것. 그리고 2313A의 용량 증설판인 ATtiny4313을 사용해서 기능을 확장. 4096워드를 사용하니 정말 편하다. 백번 정도 굽고 지우고를 반복했는데 고장이 안났다. 그리고 한번은 전원을 거꾸로 연결했는데 열이 펄펄 =_=; 다시 제대로 연결하니 생생했다. PIC는 바로 고장나던데;


 그렇게 CDC-IO의 2313용의 펌웨어 소스에 많은 수정을 가해서 비트 단위나 몇몇 기능의 확장을 꾀했다.

 둘다 GPL이라 =ㅅ=;



cdcio.2009-07-15-serhid-portfix.zip

 (4313의 구현에서 포트 이름의 레지스터 부분이 잘못되어서 수정.)

 결과물은 이렇다.



 명령의 입력은 "<16진 데이터> <공백> <레지스터명 혹은 16진수> <공백> <명령>" 이런 식이다.

 ?는 값을 알아보고(비트 가능), =는 값을 대입하고(비트 가능), &는 AND연산, ^는 XOR 연산, |는 OR연산. 논리 연산은 비트를 구현하지 않았다. @만 입력하면 "cdc-io"문자열이 표시된다.


 또하나의 삽질 끝. 노하우 하나 획득.



'하드웨어' 카테고리의 다른 글

간단한 승압 회로.  (0) 2014.10.29
AVR Serial/HID의 간단한 설명.  (0) 2014.10.22
AVR Serial HID 구현.  (0) 2014.10.21
USB CDC는 막힌 듯?  (0) 2014.10.20
USBTiny 실험.  (0) 2014.10.17
avr-gcc 4.9.2  (0) 2014.10.14
Posted by 파르셀수스
TAG AVR, SER/HID, USB

댓글을 달아 주세요

출처 : http://www.pendrivelinux.com/yumi-multiboot-usb-creator/


 윈도우즈에서 실행가능한 멀티부트 USB를 만드는 툴이다. 많은 리눅스 라이브 CD나 XP를 제외한 윈도우즈 비스타/7/8을 지원한다. XP는 몇몇 수정할 부분이 있는데 수정이 필요해서 마소의 파일을 포함하지 않는 합법적인 방법으로 차후에 지원을 할 예정. 그리고 윈도우즈 부트 USB는 인스톨 후 첫번째 부트에서 에러가 나므로 설치 후 첫첫번 리부팅에서 USB를 뽑아줘야 한다.


 


USB 드라이브명과 운영체제의 종류를 선택하고 ISO 파일을 선택해주고 "Create" 버튼을 누르면 작업이 시작된다. 만약 이전에 한번 USB부팅 작업을 해놓았다면 이전의 USB부팅 운영체제는 유지된다. 간단한 포맷을 하는 옵션도 USB가 인식되면 확장되어 나타나 선택할 수 있다.


 작업이 끝나면 또다른 운영체제를 더 설치할 것이라고 묻는데 더이상 추가하지 않으려면 No를 선택하면 작업은 종료된다.


 그렇게 만들어진 USB를 다시 부팅해서 실험해보면 작업은 완벽하게 끝난다. 부팅시에 기본으로 하드디스크로 먼저 부팅하는 메뉴가 먼저 나오고 아래로 다른 운영체제의 이미지로 부팅할 수 있게 메뉴들이 나오므로 선택하면 하위 메뉴로 들어가서 실행되는 형태를 가진다. 한글은 지원되지 않고 오직 영문의 메뉴만 사용이 가능하다.


 Parted Magic 가장 최신 버전을 시험삼아 테스트를 해보았는데 성공적으로 만들어졌다. 부팅도 깔끔하게 문제가 없었다. 그리고 실행파일만 필요로 하며 별도의 설치가 필요가 없다.


 CD영역을 사용하지 못하는 USB에서 운영체제 설치디스크를 만든다면 한번 사용해볼만한 괜찮은 툴이다.



YUMI-0.0.5.6.zip


'기타' 카테고리의 다른 글

GIMP 2.8  (0) 2012.05.07
Slitaz-sane 라이브 리눅스  (5) 2012.05.02
YUMI - 윈도우즈용 멀티부트 USB 생성기.  (0) 2012.04.27
아마도 실패 =_=;  (0) 2012.02.03
새로운 PIC 프로그래밍 툴 mikroPascal  (0) 2012.01.18
PIC Progammer 제작.  (0) 2012.01.07
Posted by 파르셀수스

댓글을 달아 주세요


 PIC의 비교적 고급 모델(?)인 18F4550을 프로그래밍하는데, 주로 사용하던 ICProg 1.06c버전이 1000h부터 기록을 하지 못하는 문제로 잘 안되서 찾아보니 더 좋은 어플리케이션이 있었다. 자주 업데이트 되며 가장 저렴한 JDM을 지원하는게 장점이다 +_+.

 이 프로그램이면 더이상 업데이트 되지 않는 ICProg나 하드웨어 인터페이스 제약이 있는 WInPIC800과는 안녕이다. 이 프로그램을 찾지 못했다면 삽집의 연속이었을지도 모른다. WinPIC800의 COM 포트의 고정된 어드레스 포트까지 디버거로 건드려가며 했는데 비정규 인터페이스 카드로 설정된 포트는 적용할 수 없었다.

 SI-Prog의 JDM으로는 위의 이미지와 같이 설정화면 중에 Data Out의 Invert 체크박스를 선택하면 정상적으로 프로그래밍할 수 있다.

 삽질 속에 문제들이 해결. 새로운 USB 포트를 이용한 PIC 프로그래머를 만들려고 했던 작업이 끝났다. 동작도 제대로 하는 것도 확인. 점점 키웠던 문제들이 일순간에 해결되니 마음이 다 편안하다.

 PIC 프로그래머를 만드는 것은 여기서 끝. 역시 이미 만들어진 검증된 무엇인가를 사용하는 것은 하드웨어나 소프트웨어나 마찬가지인 것 같다. =_=;

 OpenProg 0.7.x 홈페이지 :  http://openprog.altervista.org/OP_eng.html 
 


 새로이 수정해서 5V의 I2C롬과 PIC를 프로그래밍 할 수 있는 부분까지만 재구성했다. 연결되지 않은 부분들은 확장보드를 위한 포트들로 3.3V PIC를 프로그래밍하려면 별도의 확장보드를 만들어서 사용해야 한다.

 기본 회로는 18F2550으로 만들어졌는데, 뒤져보니 국내 메이져(?) 부품 업체에서는 18F2550 DIP 버전보다는 40핀의 18F4550이 조금 더 싸다. 조금 더 소형화시키려면 18F2550이나 기타 호환되는 28핀 PIC를 이용하면 된다.

 그리고 펌웨어는 18F2550의 펌웨어를 그대로 사용하면 된다. 18F4550은 약간의 핀의 확장으로 기능이 늘었지만 18F2550과 거의 같으며 40핀으로 덩치만 조금 더 크다. 기술문서를 봐도 같이 묶어져서 한 문서 안에서 내용을 담고 있다.

 프로그래밍에 쓰이는 소프트웨어는 별도로 같이 포함하고 있다. 리눅스/윈도우즈 GUI 버전과 Command Line 버전이 있으며 오픈소스이다.

 이제 다음 만들 것을 구상~ +_+!
 

GUI 버전을 실행시킨 화면. 칩을 넣지 않아서 Unknown Device라고 나온다.

 

Posted by 파르셀수스

댓글을 달아 주세요


 새로운 Panda의 USB와 자동실행 방지 백신. 이번엔 패키징해서 배포된다. 버전은 1.0.1.4이며 ntfs를 지원.

 출처 : http://research.pandasecurity.com/archive/Panda-USB-and-AutoRun-Vaccine.aspx


'기타' 카테고리의 다른 글

한글 글꼴 제작을 시도.  (0) 2009.10.09
다음 세대가 먹기 힘든 10가지 음식.  (1) 2009.10.09
Panda USB & Autorun 백신 새버전  (0) 2009.10.08
오호 이런 것두  (0) 2009.09.27
독일의 맥주 축제(Oktoberfest)  (0) 2009.09.24
난독증 테스트라는데.  (0) 2009.09.24
Posted by 파르셀수스

댓글을 달아 주세요