sysfs 에 파일 추가 -- 장치 비 기본 속성 추가

5530 단어

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 에서 읽 습 니 다!
 

좋은 웹페이지 즐겨찾기