sysfs 에 파일 추가 -- 장치 비 기본 속성 추가
sysfs 는 가상 파일 시스템 으로 사용자 공간 에 커 널 의 데이터 구조, 데이터 구조의 속성, 그리고 그들의 직접적인 관 계 를 내 보 내 고 사용자 공간 에 인 터 페 이 스 를 제공 합 니 다.
수중 에 있 는 항목 은 하나의 ID 로 모든 usb 장 치 를 표시 해 야 하 며, 수시로 ID 를 읽 고 수정 해 야 한다.이전 방안 은 ID 를 읽 어야 할 때마다 libus 라 이브 러 리 를 사용 하여 usb 칩 ft 232 의 eeprom 에서 읽 었 습 니 다. cpu 부하 가 무 거울 때 usb 장치 ID 를 읽 는 것 이 힘 들 고 느 려 보 였 습 니 다.드라이버 를 수정 하여 sysfs 파일 시스템 으로 id 를 내 보 내 면 이 값 은 커 널 제어 로 접근 합 니 다. 읽 을 때마다 sysfs 파일 을 읽 고 ID 를 쓰 는 것 도 이 파일 로 출력 하면 됩 니 다.대량의 중복 작업 을 방지 하고 사용자 공간 사용 이 편리 하 다.장점 은 효율 적 이 고 빠 르 며 편리 하 다 는 것 이다.단점 은 구동 을 수정 해 야 한 다 는 것 이다.
쉽게 말 하면 장치 속성 과 show, store 의 동작 을 정의 합 니 다 (속성 만 읽 고 store 가 필요 하지 않 습 니 다).장 치 를 탐지 할 때 sysfs 대응 디 렉 터 리 에 장치 속성 파일 을 만 들 고 끊 을 때 파일 을 삭제 합 니 다.
다음은 장치 의 sysfs 디 렉 터 리 에 장치 폴 더 에 새로운 속성 을 추가 하 는 간단 한 예 입 니 다.
include / linux. h / device. h 에 기본 속성 이 아 닌 인터페이스 가 있 습 니 다.
/* driverfs interface for exporting device attributes */
struct device_attribute {
struct attribute attr;
ssize_t (*show)(struct device * dev, char * buf);
ssize_t (*store)(struct device * dev, const char * buf, size_t count);
};
/* */
#define DEVICE_ATTR(_name,_mode,_show,_store) \
struct device_attribute dev_attr_##_name = __ATTR(_name,_mode,_show,_store)
/* / */
extern int device_create_file(struct device *device, struct device_attribute * entry);
extern void device_remove_file(struct device * dev, struct device_attribute * attr);
드라이브 파일 에서 새 속성 을 정의 합 니 다.
static unsigned char moteid[6] = "-1";
ssize_t show_moteid(struct device * dev, char * buf)
{
strcpy(buf, moteid);
return strlen(buf);
}
ssize_t store_moteid(struct device * dev, const char * buf, size_t count)
{
int id;
if(count > 4)
count = 4;
sscanf(buf, "%d", &id);
printk("buf: %s; write id: %d
", buf, id);
strncpy(moteid, buf, 4);
//if(id < 1024 && id > 0)
//moteid_write(container_of(dev, struct usb_device, dev), id);
return strlen(moteid);
}
DEVICE_ATTR(moteid,S_IRUGO | S_IWUSR,show_moteid,store_moteid);
//device_create_file(&serial->dev->dev, &dev_attr_moteid); /* */
//device_remove_file(&serial->dev->dev, &dev_attr_moteid); /* */
다음은 저의 usb 탐지 함수 입 니 다. 제 가 안에 넣 겠 습 니 다.
/* Startup for the FT232BM chip */
/* Called from usbserial:serial_probe */
static int ftdi_FT232BM_startup (struct usb_serial *serial)
{ /* ftdi_FT232BM_startup */
struct ftdi_private *priv;
int err;
device_create_file(&serial->dev->dev, &dev_attr_moteid); /* sysfs !!!*/
moteid_read(serial->dev);
printk("ftdi_FT232BM_startup:
");
err = ftdi_common_startup(serial);
if (err){
return (err);
}
priv = usb_get_serial_port_data(serial->port[0]);
priv->chip_type = FT232BM;
priv->baud_base = 48000000 / 2; /* Would be / 16, but FT232BM supports multiple of 0.125 divisor fractions! */
printk("%s:[%s]: %s end:
",__FILE__, __LINE__, __FUNCTION__);
return (0);
} /* ftdi_FT232BM_startup */
다음은 제 차단 장치 의 함수 입 니 다:
/* ftdi_shutdown is called from usbserial:usb_serial_disconnect
* it is called when the usb device is disconnected
*
* usbserial:usb_serial_disconnect
* calls __serial_close for each open of the port
* shutdown is called then (ie ftdi_shutdown)
*/
static void ftdi_shutdown (struct usb_serial *serial)
{ /* ftdi_shutdown */
printk("%s:%s ftdi_shutdown begin: %s
",__FILE__, __LINE__, __FUNCTION__);
device_remove_file(&serial->dev->dev, &dev_attr_moteid);
struct usb_serial_port *port = serial->port[0];
struct ftdi_private *priv = usb_get_serial_port_data(port);
/* all open ports are closed at this point
* (by usbserial.c:__serial_close, which calls ftdi_close)
*/
if (priv) {
usb_set_serial_port_data(port, NULL);
kfree(priv);
}
printk("%s:%s ftdi_shutdown end: %s
",__FILE__, __LINE__, __FUNCTION__);
} /* ftdi_shutdown */
사용자 공간의 검증, 대응 하 는 usb 장 치 를 삽입 한 후:
/sys/devices/platform/ep93xxusb0/usb1/1-3 # ls
1-3:1.0 bNumInterfaces manufacturer
bConfigurationValue bcdDevice maxchild
bDeviceClass bmAttributes moteid( !!!)
bDeviceProtocol detach_state product
bDeviceSubClass devnum serial
bMaxPower idProduct speed
bNumConfigurations idVendor version
사용 자 는 이 파일 을 읽 고 쓸 수 있 습 니 다. 물론 입 니 다. 제 실현 은 moteid [] 에 있 는 것 이 아니 라 eeprom 에 쓰 는 것 입 니 다. 처음 읽 으 면 eeprom 에서 읽 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.