2017-05-03 9 views
1

pca9570 i2c GPO 확장기 용 드라이버를 작성하고 있습니다. (이것은 그 값의 I2C 어드레스에 간단한 1 바이트 쓰기 설정 네 개의 출력 비트를 가지고있다.) I 현재 GPIO를 설정하려고커널 모듈의 GPIO가 항상 출력되도록 강제로

다음과 같이 어떻게이 모듈

struct gpio_chip *gc = &chip->gpio_chip; 

gc->set = pca9570_gpio_set_value; 
gc->get = pca9570_gpio_get_value; 
gc->direction_output = pca9570_gpio_direction_output; 
gc->direction_input = pca9570_gpio_direction_input; 

gc->can_sleep = true; 

gc->base = gpio_start; 
gc->ngpio = PCA9570_GPIO_COUNT; 
gc->label = chip->client->name; 
gc->owner = THIS_MODULE; 

gc->dev = &chip->client->dev; 

을 커널에게 데이터 만 출력 할 수 있다고 알려주십시오. 즉, 사용자 공간 [email protected]:/sys/class/gpio/gpio508# cat direction의 결과가 이 아닌 out이되도록하고 싶습니다.

이 드라이버는 초기화시 출력 방향을 설정하기 위해 클라이언트 측 gpio 호출을 추가해야하며 사용자가이를 입력으로 설정하려고 할 때마다 반쯤 생각합니다. 이것을 올바른 방법일까요?

복사 할 수있는 "출력 전용"gpio 드라이버가 있습니까?

+0

*? "이 그것을 할 수있는 올바른 방법이다"* - 호 리소스 제어 (예 :'gpio_request()')를 적절히 사용하는 코드가 정상적으로 작동한다면 드라이버가 GPIO 핀을 소유하게되고 방향을 변경하려고 시도하는 드라이버는 없을 것입니다. – sawdust

+0

@sawdust, 나는'gpio_request()'가 꽤 오래된 API이기 때문에'gpiod_get()'을 의미한다고 생각한다. 관리자는 후자를 사용하는 것을 꺼린다. – 0andriy

+0

데이터 시트 http://www.nxp.com/documents/data_sheet/PCA9570.pdf에 따르면 확장기는 입력 및 출력을 지원합니다. 따라서 운전자에게 아무 것도 강요 할 필요가 없습니다. 이것은 발신자의 바쁘다는 것이지 귀하의 것이 아닙니다. – 0andriy

답변

2

데이터 시트에 따라 http://www.nxp.com/documents/data_sheet/PCA9570.pdfPCA9570은 저전압 프로세서 및 핸드 헬드 배터리 기반 모바일 응용 프로그램에서 4 비트 범용 병렬 출력 (GPO) 확장을 제공하는 CMOS 장치입니다.

코드에 명시된 바와 같이 리눅스 커널 드라이버가 ->get_direction()->direction_input() 콜백을 구현하지 않아야 이러한 요구 사항을 만족하려면 :

  if (chip->get_direction) { 
      ... 
      } else if (!chip->direction_input) { 
        /* 
        * If the chip lacks the .direction_input callback 
        * we logically assume all lines are outputs. 
        */ 
        set_bit(FLAG_IS_OUT, &desc->flags); 
+0

많은 감사, 나는 내일 이것을 시험 할 것이다. – fadedbee

+0

P. 섹션 7.1의 데이터 시트는 i2c 주소가 0x48임을 나타내며 실제로는 0x24입니다. 데이터 시트 *에 표시된 7 비트 이진 값은 * 0x24입니다. – fadedbee

+0

당신의 대답은 대부분 효과적입니다. gpio를 export 한 후에, 0과 1을 'value'로 echo 할 수 있고 모듈의'gc-> set' 메소드에 도착합니다. 그러나 사용자 공간에서 gpio를 읽을 수 있습니다 (항상 '0'을 반환합니다). – fadedbee